commit 80cb2bdbc257a4490feb159b83377012733cc83b Author: daikun1@bosssoft.com.cn Date: Thu Nov 2 16:03:51 2023 +0800 初始化工程 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..3c200cd --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.sql linguist-language=java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e70fb86 --- /dev/null +++ b/.gitignore @@ -0,0 +1,53 @@ +###################################################################### +# Build Tools + +.gradle +/build/ +!gradle/wrapper/gradle-wrapper.jar + +target/ +!.mvn/wrapper/maven-wrapper.jar + +.flattened-pom.xml + +###################################################################### +# IDE + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +nbproject/private/ +build/* +nbbuild/ +dist/ +nbdist/ +.nb-gradle/ + +###################################################################### +# Others +*.log +*.xml.versionsBackup +*.swp + +!*/build/*.java +!*/build/*.html +!*/build/*.xml + +### JRebel ### +rebel.xml + +application-my.yaml + +/win-ui-app/unpackage/ diff --git a/Docker-HOWTO.md b/Docker-HOWTO.md new file mode 100644 index 0000000..9d557c1 --- /dev/null +++ b/Docker-HOWTO.md @@ -0,0 +1,49 @@ +# Docker Build & Up + +目标: 快速部署体验系统,帮助了解系统之间的依赖关系。 +依赖:docker compose v2,删除`name: win-system`,降低`version`版本为`3.3`以下,支持`docker-compose`。 + +## 功能文件列表 + +```text +. +├── Docker-HOWTO.md +├── docker-compose.yml +├── docker.env <-- 提供docker-compose环境变量配置 +├── win-server +│ └── Dockerfile +└── win-ui-admin + ├── .dockerignore + ├── Dockerfile + └── nginx.conf <-- 提供基础配置,gzip压缩、api转发 +``` + +## 构建 jar 包 + +```shell +# 创建maven缓存volume +docker volume create --name win-maven-repo + +docker run -it --rm --name win-maven \ + -v win-maven-repo:/root/.m2 \ + -v $PWD:/usr/src/mymaven \ + -w /usr/src/mymaven \ + maven mvn clean install package '-Dmaven.test.skip=true' +``` + +## 构建启动服务 + +```shell +docker compose --env-file docker.env up -d +``` + +首次运行会自动构建容器。可以通过`docker compose build [service]`来手动构建所有或某个docker镜像 + +`--env-file docker.env`为可选参数,只是展示了通过`.env`文件配置容器启动的环境变量,`docker-compose.yml`本身已经提供足够的默认参数来正常运行系统。 + +## 服务器的宿主机端口映射 + +- admin ui: http://localhost:8080 +- api server: http://localhost:48080 +- mysql: root/123456, port: 3306 +- redis: port: 6379 diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 0000000..e8916c1 --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,60 @@ +#!groovy +pipeline { + + agent any + + parameters { + string(name: 'TAG_NAME', defaultValue: '', description: '') + } + + environment { + // DockerHub 凭证 ID(登录您的 DockerHub) + DOCKER_CREDENTIAL_ID = 'dockerhub-id' + // GitHub 凭证 ID (推送 tag 到 GitHub 仓库) + GITHUB_CREDENTIAL_ID = 'github-id' + // kubeconfig 凭证 ID (访问接入正在运行的 Kubernetes 集群) + KUBECONFIG_CREDENTIAL_ID = 'demo-kubeconfig' + // 镜像的推送 + REGISTRY = 'docker.io' + // DockerHub 账号名 + DOCKERHUB_NAMESPACE = 'docker_username' + // GitHub 账号名 + GITHUB_ACCOUNT = 'https://gitee.com/zhijiantianya/ruoyi-vue-pro' + // 应用名称 + APP_NAME = 'win-server' + // 应用部署路径 + APP_DEPLOY_BASE_DIR = '/media/pi/KINGTON/data/work/projects/' + } + + stages { + stage('检出') { + steps { + git url: "https://gitee.com/will-we/ruoyi-vue-pro.git", + branch: "devops" + } + } + + stage('构建') { + steps { + // TODO 解决多环境链接、密码不同配置临时方案 + sh 'if [ ! -d "' + "${env.HOME}" + '/resources" ];then\n' + + ' echo "配置文件不存在无需修改"\n' + + 'else\n' + + ' cp -rf ' + "${env.HOME}" + '/resources/*.yaml ' + "${env.APP_NAME}" + '/src/main/resources\n' + + ' echo "配置文件替换"\n' + + 'fi' + sh 'mvn clean package -Dmaven.test.skip=true' + } + } + + stage('部署') { + steps { + sh 'cp -f ' + ' bin/deploy.sh ' + "${env.APP_DEPLOY_BASE_DIR}" + "${env.APP_NAME}" + sh 'cp -f ' + "${env.APP_NAME}" + '/target/*.jar ' + "${env.APP_DEPLOY_BASE_DIR}" + "${env.APP_NAME}" +'/build/' + archiveArtifacts "${env.APP_NAME}" + '/target/*.jar' + sh 'chmod +x ' + "${env.APP_DEPLOY_BASE_DIR}" + "${env.APP_NAME}" + '/deploy.sh' + sh 'bash ' + "${env.APP_DEPLOY_BASE_DIR}" + "${env.APP_NAME}" + '/deploy.sh' + } + } + } +} diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..bd9da62 --- /dev/null +++ b/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2021 ruoyi-vue-pro + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..b2cf3c7 --- /dev/null +++ b/README.md @@ -0,0 +1,340 @@ +**严肃声明:现在、未来都不会有商业版本,所有代码全部开源!!** + +**「我喜欢写代码,乐此不疲」** +**「我喜欢做开源,以此为乐」** + +我 🐶 在上海艰苦奋斗,早中晚在 top3 大厂认真搬砖,夜里为开源做贡献。 + +如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。 + +## 🐶 新手必读 + +* 演示地址【Vue3 + element-plus】: +* 演示地址【Vue3 + vben(ant-design-vue)】: +* 演示地址【Vue2 + element-ui】: +* 启动文档: +* 视频教程: + +已支持 Spring Boot 3.X + JDK 17 版本,可见 [master-boot3](https://gitee.com/zhijiantianya/ruoyi-vue-pro/blob/master/README.md) 分支。 + +## 🐯 平台简介 + +**闻荫**,以开发者为中心,打造中国第一流的快速开发平台,全部开源,个人与企业可 100% 免费使用。 + +> 有任何问题,或者想要的功能,可以在 _Issues_ 中提给艿艿。 +> +> 😜 给项目点点 Star 吧,这对我们真的很重要! + +![架构图](/.image/common/ruoyi-vue-pro-architecture.png) + +* 管理后台的电脑端:Vue3 提供 [element-plus](https://gitee.com/wincode/win-ui-admin-vue3)、[vben(ant-design-vue)](https://gitee.com/wincode/win-ui-admin-vben) 两个版本,Vue2 提供 [element-ui](https://gitee.com/zhijiantianya/ruoyi-vue-pro/tree/master/win-ui-admin) 版本 +* 管理后台的移动端:采用 [uni-app](https://github.com/dcloudio/uni-app) 方案,一份代码多终端适配,同时支持 APP、小程序、H5! +* 后端采用 Spring Boot 多模块架构、MySQL + MyBatis Plus、Redis + Redisson +* 数据库可使用 MySQL、Oracle、PostgreSQL、SQL Server、MariaDB、国产达梦 DM、TiDB 等 +* 权限认证使用 Spring Security & Token & Redis,支持多终端、多种用户的认证系统,支持 SSO 单点登录 +* 支持加载动态权限菜单,按钮级别权限控制,本地缓存提升性能 +* 支持 SaaS 多租户,可自定义每个租户的权限,提供透明化的多租户底层封装 +* 工作流使用 Flowable,支持动态表单、在线设计流程、会签 / 或签、多种任务分配方式 +* 高效率开发,使用代码生成器可以一键生成前后端代码 + 单元测试 + Swagger 接口文档 + Validator 参数校验 +* 集成微信小程序、微信公众号、企业微信、钉钉等三方登陆,集成支付宝、微信等支付与退款 +* 集成阿里云、腾讯云等短信渠道,集成 MinIO、阿里云、腾讯云、七牛云等云存储服务 +* 集成报表设计器、大屏设计器,通过拖拽即可生成酷炫的报表与大屏 + +## 🐳 项目关系 + +![架构演进](https://static.iocoder.cn/win-roadmap.png?imageView2/2/format/webp) + +三个项目的功能对比,可见社区共同整理的 [国产开源项目对比](https://www.yuque.com/xiatian-bsgny/lm0ec1/wqf8mn) 表格。 + +### 后端项目 + + +| 项目 | Star | 简介 | +|-----------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------| +| [ruoyi-vue-pro](https://gitee.com/zhijiantianya/ruoyi-vue-pro) | [![Gitee star](https://gitee.com/zhijiantianya/ruoyi-vue-pro/badge/star.svg?theme=white)](https://gitee.com/zhijiantianya/ruoyi-vue-pro) [![GitHub stars](https://img.shields.io/github/stars/YunaiV/ruoyi-vue-pro.svg?style=social&label=Stars)](https://github.com/YunaiV/ruoyi-vue-pro) | 基于 Spring Boot 多模块架构 | +| [win-cloud](https://gitee.com/zhijiantianya/win-cloud) | [![Gitee star](https://gitee.com/zhijiantianya/win-cloud/badge/star.svg?theme=white)](https://gitee.com/zhijiantianya/win-cloud) [![GitHub stars](https://img.shields.io/github/stars/YunaiV/win-cloud.svg?style=social&label=Stars)](https://github.com/YunaiV/win-cloud) | 基于 Spring Cloud 微服务架构 | +| [Spring-Boot-Labs](https://gitee.com/wincode/SpringBoot-Labs) | [![Gitee star](https://gitee.com/wincode/SpringBoot-Labs/badge/star.svg?theme=white)](https://gitee.com/zhijiantianya/win-cloud) [![GitHub stars](https://img.shields.io/github/stars/wincode/SpringBoot-Labs.svg?style=social&label=Stars)](https://github.com/wincode/SpringBoot-Labs) | 系统学习 Spring Boot & Cloud 专栏 | + +### 前端项目 + +| 项目 | Star | 简介 | +|----------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------| +| [win-ui-admin-vue3](https://gitee.com/wincode/win-ui-admin-vue3) | [![Gitee star](https://gitee.com/wincode/win-ui-admin-vue3/badge/star.svg?theme=white)](https://gitee.com/wincode/win-ui-admin-vue3) [![GitHub stars](https://img.shields.io/github/stars/wincode/win-ui-admin-vue3.svg?style=social&label=Stars)](https://github.com/wincode/win-ui-admin-vue3) | 基于 Vue3 + element-plus 实现的管理后台 | +| [win-ui-admin-vben](https://gitee.com/wincode/win-ui-admin-vben) | [![Gitee star](https://gitee.com/wincode/win-ui-admin-vben/badge/star.svg?theme=white)](https://gitee.com/wincode/win-ui-admin-vben) [![GitHub stars](https://img.shields.io/github/stars/wincode/win-ui-admin-vben.svg?style=social&label=Stars)](https://github.com/wincode/win-ui-admin-vben) | 基于 Vue3 + vben(ant-design-vue) 实现的管理后台 | +| [win-ui-admin](https://gitee.com/zhijiantianya/ruoyi-vue-pro/tree/master/win-ui-admin) | [![Gitee star](https://gitee.com/zhijiantianya/ruoyi-vue-pro/badge/star.svg?theme=white)](https://gitee.com/zhijiantianya/ruoyi-vue-pro/tree/master/win-ui-admin) [![GitHub stars](https://img.shields.io/github/stars/YunaiV/ruoyi-vue-pro.svg?style=social&label=Stars)](https://github.com/YunaiV/ruoyi-vue-pro/tree/master/win-ui-admin) | 基于 Vue2 + element-ui 实现的管理后台 | +| [win-ui-admin-uniapp](https://gitee.com/zhijiantianya/ruoyi-vue-pro/tree/master/win-ui-admin-uniapp) | [![Gitee star](https://gitee.com/zhijiantianya/ruoyi-vue-pro/badge/star.svg?theme=white)](https://gitee.com/zhijiantianya/ruoyi-vue-pro/tree/master/win-ui-admin-uniapp) [![GitHub stars](https://img.shields.io/github/stars/YunaiV/ruoyi-vue-pro.svg?style=social&label=Stars)](https://github.com/YunaiV/ruoyi-vue-pro/tree/master/win-ui-admin-uniapp) | 基于 uni-app + uni-ui 实现的管理后台的小程序 | +| [win-ui-go-view](https://gitee.com/wincode/win-ui-go-view) | [![Gitee star](https://gitee.com/wincode/win-ui-go-view/badge/star.svg?theme=white)](https://gitee.com/wincode/win-ui-go-view) [![GitHub stars](https://img.shields.io/github/stars/wincode/win-ui-go-view.svg?style=social&label=Stars)](https://github.com/wincode/win-ui-go-view) | 基于 Vue3 + naive-ui 实现的大屏报表 | +| [win-mall-uniapp](https://gitee.com/wincode/win-mall-uniapp) | [![Gitee star](https://gitee.com/wincode/win-mall-uniapp/badge/star.svg?theme=white)](https://gitee.com/wincode/win-mall-uniapp) [![GitHub stars](https://img.shields.io/github/stars/wincode/win-mall-uniapp.svg?style=social&label=Stars)](https://github.com/wincode/win-mall-uniapp) | 基于 uni-app 实现的商城小程序 | + +## 🐰 分支说明 + +| | JDK 8 完整版 | JDK 8 精简版 | JDK 17 完整版 | +|-------|-----------------------------------------------------------|--------------------------------------------------------------------|-----------------------------------------------------------------------------| +| 分支 | [`master`](https://gitee.com/zhijiantianya/ruoyi-vue-pro) | [`mini`](https://gitee.com/zhijiantianya/ruoyi-vue-pro/tree/mini/) | [`master-boot3`](https://gitee.com/zhijiantianya/ruoyi-vue-pro/tree/master-boot3/) | +| 说明 | 包括所有功能 | 只保留核心功能 | 适配 Spring Boot 3.X | +| 系统功能 | √ | √ | √ | +| 基础设施 | √ | √ | √ | +| 会员中心 | √ | √ | √ | +| 工作流程 | √ | x | √ | +| 数据报表 | √ | x | 适配中 | +| 商城系统 | √ | x | √ | +| 微信公众号 | √ | x | √ | + +## 😎 开源协议 + +**为什么推荐使用本项目?** + +① 本项目采用比 Apache 2.0 更宽松的 [MIT License](https://gitee.com/zhijiantianya/ruoyi-vue-pro/blob/master/LICENSE) 开源协议,个人与企业可 100% 免费使用,不用保留类作者、Copyright 信息。 + +② 代码全部开源,不会像其他项目一样,只开源部分代码,让你无法了解整个项目的架构设计。[国产开源项目对比](https://www.yuque.com/xiatian-bsgny/lm0ec1/wqf8mn) + +![开源项目对比](https://static.iocoder.cn/project-vs.png?imageView2/2/format/webp/w/1280) + +③ 代码整洁、架构整洁,遵循《阿里巴巴 Java 开发手册》规范,代码注释详细,57000 行 Java 代码,22000 行代码注释。 + +## 🤝 项目外包 + +我们也是接外包滴,如果你有项目想要外包,可以微信联系【**Aix9975**】。 + +团队包含专业的项目经理、架构师、前端工程师、后端工程师、测试工程师、运维工程师,可以提供全流程的外包服务。 + +项目可以是商城、SCRM 系统、OA 系统、物流系统、ERP 系统、CMS 系统、HIS 系统、支付系统、IM 聊天、微信公众号、微信小程序等等。 + +## 🐼 内置功能 + +系统内置多种多种业务功能,可以用于快速你的业务系统: + +![功能分层](/.image/common/ruoyi-vue-pro-biz.png) + +* 系统功能 +* 基础设施 +* 工作流程 +* 支付系统 +* 会员中心 +* 数据报表 +* 商城系统 +* 微信公众号 + +> 友情提示:本项目基于 RuoYi-Vue 修改,**重构优化**后端的代码,**美化**前端的界面。 +> +> * 额外新增的功能,我们使用 🚀 标记。 +> * 重新实现的功能,我们使用 ⭐️ 标记。 + +🙂 所有功能,都通过 **单元测试** 保证高质量。 + +### 系统功能 + +| | 功能 | 描述 | +|-----|-------|---------------------------------| +| | 用户管理 | 用户是系统操作者,该功能主要完成系统用户配置 | +| ⭐️ | 在线用户 | 当前系统中活跃用户状态监控,支持手动踢下线 | +| | 角色管理 | 角色菜单权限分配、设置角色按机构进行数据范围权限划分 | +| | 菜单管理 | 配置系统菜单、操作权限、按钮权限标识等,本地缓存提供性能 | +| | 部门管理 | 配置系统组织机构(公司、部门、小组),树结构展现支持数据权限 | +| | 岗位管理 | 配置系统用户所属担任职务 | +| 🚀 | 租户管理 | 配置系统租户,支持 SaaS 场景下的多租户功能 | +| 🚀 | 租户套餐 | 配置租户套餐,自定每个租户的菜单、操作、按钮的权限 | +| | 字典管理 | 对系统中经常使用的一些较为固定的数据进行维护 | +| 🚀 | 短信管理 | 短信渠道、短息模板、短信日志,对接阿里云、腾讯云等主流短信平台 | +| 🚀 | 邮件管理 | 邮箱账号、邮件模版、邮件发送日志,支持所有邮件平台 | +| 🚀 | 站内信 | 系统内的消息通知,提供站内信模版、站内信消息 | +| 🚀 | 操作日志 | 系统正常操作日志记录和查询,集成 Swagger 生成日志内容 | +| ⭐️ | 登录日志 | 系统登录日志记录查询,包含登录异常 | +| 🚀 | 错误码管理 | 系统所有错误码的管理,可在线修改错误提示,无需重启服务 | +| | 通知公告 | 系统通知公告信息发布维护 | +| 🚀 | 敏感词 | 配置系统敏感词,支持标签分组 | +| 🚀 | 应用管理 | 管理 SSO 单点登录的应用,支持多种 OAuth2 授权方式 | +| 🚀 | 地区管理 | 展示省份、城市、区镇等城市信息,支持 IP 对应城市 | + +### 工作流程 + +| | 功能 | 描述 | +|-----|-------|----------------------------------------| +| 🚀 | 流程模型 | 配置工作流的流程模型,支持文件导入与在线设计流程图,提供 7 种任务分配规则 | +| 🚀 | 流程表单 | 拖动表单元素生成相应的工作流表单,覆盖 Element UI 所有的表单组件 | +| 🚀 | 用户分组 | 自定义用户分组,可用于工作流的审批分组 | +| 🚀 | 我的流程 | 查看我发起的工作流程,支持新建、取消流程等操作,高亮流程图、审批时间线 | +| 🚀 | 待办任务 | 查看自己【未】审批的工作任务,支持通过、不通过、转发、委派、退回等操作 | +| 🚀 | 已办任务 | 查看自己【已】审批的工作任务,未来会支持回退操作 | +| 🚀 | OA 请假 | 作为业务自定义接入工作流的使用示例,只需创建请求对应的工作流程,即可进行审批 | + +### 支付系统 + +| | 功能 | 描述 | +|-----|------|---------------------------| +| 🚀 | 应用信息 | 配置商户的应用信息,对接支付宝、微信等多个支付渠道 | +| 🚀 | 支付订单 | 查看用户发起的支付宝、微信等的【支付】订单 | +| 🚀 | 退款订单 | 查看用户发起的支付宝、微信等的【退款】订单 | +| 🚀 | 回调通知 | 查看支付回调业务的【支付】【退款】的通知结果 | +| 🚀 | 接入示例 | 提供接入支付系统的【支付】【退款】的功能实战 | + +### 基础设施 + +| | 功能 | 描述 | +|-----|----------|----------------------------------------------| +| 🚀 | 代码生成 | 前后端代码的生成(Java、Vue、SQL、单元测试),支持 CRUD 下载 | +| 🚀 | 系统接口 | 基于 Swagger 自动生成相关的 RESTful API 接口文档 | +| 🚀 | 数据库文档 | 基于 Screw 自动生成数据库文档,支持导出 Word、HTML、MD 格式 | +| | 表单构建 | 拖动表单元素生成相应的 HTML 代码,支持导出 JSON、Vue 文件 | +| 🚀 | 配置管理 | 对系统动态配置常用参数,支持 SpringBoot 加载 | +| ⭐️ | 定时任务 | 在线(添加、修改、删除)任务调度包含执行结果日志 | +| 🚀 | 文件服务 | 支持将文件存储到 S3(MinIO、阿里云、腾讯云、七牛云)、本地、FTP、数据库等 | +| 🚀 | API 日志 | 包括 RESTful API 访问日志、异常日志两部分,方便排查 API 相关的问题 | +| | MySQL 监控 | 监视当前系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈 | +| | Redis 监控 | 监控 Redis 数据库的使用情况,使用的 Redis Key 管理 | +| 🚀 | 消息队列 | 基于 Redis 实现消息队列,Stream 提供集群消费,Pub/Sub 提供广播消费 | +| 🚀 | Java 监控 | 基于 Spring Boot Admin 实现 Java 应用的监控 | +| 🚀 | 链路追踪 | 接入 SkyWalking 组件,实现链路追踪 | +| 🚀 | 日志中心 | 接入 SkyWalking 组件,实现日志中心 | +| 🚀 | 分布式锁 | 基于 Redis 实现分布式锁,满足并发场景 | +| 🚀 | 幂等组件 | 基于 Redis 实现幂等组件,解决重复请求问题 | +| 🚀 | 服务保障 | 基于 Resilience4j 实现服务的稳定性,包括限流、熔断等功能 | +| 🚀 | 日志服务 | 轻量级日志中心,查看远程服务器的日志 | +| 🚀 | 单元测试 | 基于 JUnit + Mockito 实现单元测试,保证功能的正确性、代码的质量等 | + +### 数据报表 + +| | 功能 | 描述 | +|-----|-------|--------------------| +| 🚀 | 报表设计器 | 支持数据报表、图形报表、打印设计等 | +| 🚀 | 大屏设计器 | 拖拽生成数据大屏,内置几十种图表组件 | + +### 微信公众号 + +| | 功能 | 描述 | +|-----|--------|-------------------------------| +| 🚀 | 账号管理 | 配置接入的微信公众号,可支持多个公众号 | +| 🚀 | 数据统计 | 统计公众号的用户增减、累计用户、消息概况、接口分析等数据 | +| 🚀 | 粉丝管理 | 查看已关注、取关的粉丝列表,可对粉丝进行同步、打标签等操作 | +| 🚀 | 消息管理 | 查看粉丝发送的消息列表,可主动回复粉丝消息 | +| 🚀 | 自动回复 | 自动回复粉丝发送的消息,支持关注回复、消息回复、关键字回复 | +| 🚀 | 标签管理 | 对公众号的标签进行创建、查询、修改、删除等操作 | +| 🚀 | 菜单管理 | 自定义公众号的菜单,也可以从公众号同步菜单 | +| 🚀 | 素材管理 | 管理公众号的图片、语音、视频等素材,支持在线播放语音、视频 | +| 🚀 | 图文草稿箱 | 新增常用的图文素材到草稿箱,可发布到公众号 | +| 🚀 | 图文发表记录 | 查看已发布成功的图文素材,支持删除操作 | + +### 商城系统 + +![功能图](/.image/common/mall-feature.png) + +![功能图](/.image/common/mall-preview.png) + +_前端基于 crmeb uniapp 经过授权重构,优化代码实现,接入闻荫快速开发平台_ + +演示地址: + +### 会员中心 + +| | 功能 | 描述 | +|-----|------|----------------------------------| +| 🚀 | 会员管理 | 会员是 C 端的消费者,该功能用于会员的搜索与管理 | +| 🚀 | 会员标签 | 对会员的标签进行创建、查询、修改、删除等操作 | +| 🚀 | 会员等级 | 对会员的等级、成长值进行管理,可用于订单折扣等会员权益 | +| 🚀 | 会员分组 | 对会员进行分组,用于用户画像、内容推送等运营手段 | +| 🚀 | 积分签到 | 回馈给签到、消费等行为的积分,会员可订单抵现、积分兑换等途径消耗 | + +## 🐨 技术栈 + +### 模块 + +| 项目 | 说明 | +|--------------------------------------------------------------------------|--------------------| +| `win-dependencies` | Maven 依赖版本管理 | +| `win-framework` | Java 框架拓展 | +| `win-server` | 管理后台 + 用户 APP 的服务端 | +| `win-module-system` | 系统功能的 Module 模块 | +| `win-module-member` | 会员中心的 Module 模块 | +| `win-module-infra` | 基础设施的 Module 模块 | +| `win-module-bpm` | 工作流程的 Module 模块 | +| `win-module-pay` | 支付系统的 Module 模块 | +| `win-module-mall` | 商城系统的 Module 模块 | +| `win-module-mp` | 微信公众号的 Module 模块 | +| `win-module-report` | 大屏报表 Module 模块 | + +### 框架 + +| 框架 | 说明 | 版本 | 学习指南 | +|---------------------------------------------------------------------------------------------|------------------|-------------|----------------------------------------------------------------| +| [Spring Boot](https://spring.io/projects/spring-boot) | 应用开发框架 | 2.7.15 | [文档](https://github.com/YunaiV/SpringBoot-Labs) | +| [MySQL](https://www.mysql.com/cn/) | 数据库服务器 | 5.7 / 8.0+ | | +| [Druid](https://github.com/alibaba/druid) | JDBC 连接池、监控组件 | 1.2.19 | [文档](http://www.iocoder.cn/Spring-Boot/datasource-pool/?win) | +| [MyBatis Plus](https://mp.baomidou.com/) | MyBatis 增强工具包 | 3.5.3.1 | [文档](http://www.iocoder.cn/Spring-Boot/MyBatis/?win) | +| [Dynamic Datasource](https://dynamic-datasource.com/) | 动态数据源 | 3.6.1 | [文档](http://www.iocoder.cn/Spring-Boot/datasource-pool/?win) | +| [Redis](https://redis.io/) | key-value 数据库 | 5.0 / 6.0 | | +| [Redisson](https://github.com/redisson/redisson) | Redis 客户端 | 3.18.0 | [文档](http://www.iocoder.cn/Spring-Boot/Redis/?win) | +| [Spring MVC](https://github.com/spring-projects/spring-framework/tree/master/spring-webmvc) | MVC 框架 | 5.3.24 | [文档](http://www.iocoder.cn/SpringMVC/MVC/?win) | +| [Spring Security](https://github.com/spring-projects/spring-security) | Spring 安全框架 | 5.7.6 | [文档](http://www.iocoder.cn/Spring-Boot/Spring-Security/?win) | +| [Hibernate Validator](https://github.com/hibernate/hibernate-validator) | 参数校验组件 | 6.2.5 | [文档](http://www.iocoder.cn/Spring-Boot/Validation/?win) | +| [Flowable](https://github.com/flowable/flowable-engine) | 工作流引擎 | 6.8.0 | [文档](https://doc.iocoder.cn/bpm/) | +| [Quartz](https://github.com/quartz-scheduler) | 任务调度组件 | 2.3.2 | [文档](http://www.iocoder.cn/Spring-Boot/Job/?win) | +| [Springdoc](https://springdoc.org/) | Swagger 文档 | 1.6.15 | [文档](http://www.iocoder.cn/Spring-Boot/Swagger/?win) | +| [Resilience4j](https://github.com/resilience4j/resilience4j) | 服务保障组件 | 1.7.1 | [文档](http://www.iocoder.cn/Spring-Boot/Resilience4j/?win) | +| [SkyWalking](https://skywalking.apache.org/) | 分布式应用追踪系统 | 8.12.0 | [文档](http://www.iocoder.cn/Spring-Boot/SkyWalking/?win) | +| [Spring Boot Admin](https://github.com/codecentric/spring-boot-admin) | Spring Boot 监控平台 | 2.7.10 | [文档](http://www.iocoder.cn/Spring-Boot/Admin/?win) | +| [Jackson](https://github.com/FasterXML/jackson) | JSON 工具库 | 2.13.3 | | +| [MapStruct](https://mapstruct.org/) | Java Bean 转换 | 1.5.5.Final | [文档](http://www.iocoder.cn/Spring-Boot/MapStruct/?win) | +| [Lombok](https://projectlombok.org/) | 消除冗长的 Java 代码 | 1.18.28 | [文档](http://www.iocoder.cn/Spring-Boot/Lombok/?win) | +| [JUnit](https://junit.org/junit5/) | Java 单元测试框架 | 5.8.2 | - | +| [Mockito](https://github.com/mockito/mockito) | Java Mock 框架 | 4.8.0 | - | + +## 🐷 演示图 + +### 系统功能 + +| 模块 | biu | biu | biu | +|----------|-----------------------------|---------------------------|--------------------------| +| 登录 & 首页 | ![登录](/.image/登录.jpg) | ![首页](/.image/首页.jpg) | ![个人中心](/.image/个人中心.jpg) | +| 用户 & 应用 | ![用户管理](/.image/用户管理.jpg) | ![令牌管理](/.image/令牌管理.jpg) | ![应用管理](/.image/应用管理.jpg) | +| 租户 & 套餐 | ![租户管理](/.image/租户管理.jpg) | ![租户套餐](/.image/租户套餐.png) | - | +| 部门 & 岗位 | ![部门管理](/.image/部门管理.jpg) | ![岗位管理](/.image/岗位管理.jpg) | - | +| 菜单 & 角色 | ![菜单管理](/.image/菜单管理.jpg) | ![角色管理](/.image/角色管理.jpg) | - | +| 审计日志 | ![操作日志](/.image/操作日志.jpg) | ![登录日志](/.image/登录日志.jpg) | - | +| 短信 | ![短信渠道](/.image/短信渠道.jpg) | ![短信模板](/.image/短信模板.jpg) | ![短信日志](/.image/短信日志.jpg) | +| 字典 & 敏感词 | ![字典类型](/.image/字典类型.jpg) | ![字典数据](/.image/字典数据.jpg) | ![敏感词](/.image/敏感词.jpg) | +| 错误码 & 通知 | ![错误码管理](/.image/错误码管理.jpg) | ![通知公告](/.image/通知公告.jpg) | - | + +### 工作流程 + +| 模块 | biu | biu | biu | +|---------|---------------------------------|---------------------------------|---------------------------------| +| 流程模型 | ![流程模型-列表](/.image/流程模型-列表.jpg) | ![流程模型-设计](/.image/流程模型-设计.jpg) | ![流程模型-定义](/.image/流程模型-定义.jpg) | +| 表单 & 分组 | ![流程表单](/.image/流程表单.jpg) | ![用户分组](/.image/用户分组.jpg) | - | +| 我的流程 | ![我的流程-列表](/.image/我的流程-列表.jpg) | ![我的流程-发起](/.image/我的流程-发起.jpg) | ![我的流程-详情](/.image/我的流程-详情.jpg) | +| 待办 & 已办 | ![任务列表-审批](/.image/任务列表-审批.jpg) | ![任务列表-待办](/.image/任务列表-待办.jpg) | ![任务列表-已办](/.image/任务列表-已办.jpg) | +| OA 请假 | ![OA请假-列表](/.image/OA请假-列表.jpg) | ![OA请假-发起](/.image/OA请假-发起.jpg) | ![OA请假-详情](/.image/OA请假-详情.jpg) | + +### 基础设施 + +| 模块 | biu | biu | biu | +|---------------|-------------------------------|-----------------------------|---------------------------| +| 代码生成 | ![代码生成](/.image/代码生成.jpg) | ![生成效果](/.image/生成效果.jpg) | - | +| 文档 | ![系统接口](/.image/系统接口.jpg) | ![数据库文档](/.image/数据库文档.jpg) | - | +| 文件 & 配置 | ![文件配置](/.image/文件配置.jpg) | ![文件管理](/.image/文件管理2.jpg) | ![配置管理](/.image/配置管理.jpg) | +| 定时任务 | ![定时任务](/.image/定时任务.jpg) | ![任务日志](/.image/任务日志.jpg) | - | +| API 日志 | ![访问日志](/.image/访问日志.jpg) | ![错误日志](/.image/错误日志.jpg) | - | +| MySQL & Redis | ![MySQL](/.image/MySQL.jpg) | ![Redis](/.image/Redis.jpg) | - | +| 监控平台 | ![Java监控](/.image/Java监控.jpg) | ![链路追踪](/.image/链路追踪.jpg) | ![日志中心](/.image/日志中心.jpg) | + +### 支付系统 + +| 模块 | biu | biu | biu | +|---------|---------------------------|---------------------------------|---------------------------------| +| 商家 & 应用 | ![商户信息](/.image/商户信息.jpg) | ![应用信息-列表](/.image/应用信息-列表.jpg) | ![应用信息-编辑](/.image/应用信息-编辑.jpg) | +| 支付 & 退款 | ![支付订单](/.image/支付订单.jpg) | ![退款订单](/.image/退款订单.jpg) | --- | +### 数据报表 + +| 模块 | biu | biu | biu | +|-------|---------------------------------|---------------------------------|---------------------------------------| +| 报表设计器 | ![数据报表](/.image/报表设计器-数据报表.jpg) | ![图形报表](/.image/报表设计器-图形报表.jpg) | ![报表设计器-打印设计](/.image/报表设计器-打印设计.jpg) | +| 大屏设计器 | ![大屏列表](/.image/大屏设计器-列表.jpg) | ![大屏预览](/.image/大屏设计器-预览.jpg) | ![大屏编辑](/.image/大屏设计器-编辑.jpg) | + +### 移动端(管理后台) + +| biu | biu | biu | +|----------------------------------|----------------------------------|----------------------------------| +| ![](/.image/admin-uniapp/01.png) | ![](/.image/admin-uniapp/02.png) | ![](/.image/admin-uniapp/03.png) | +| ![](/.image/admin-uniapp/04.png) | ![](/.image/admin-uniapp/05.png) | ![](/.image/admin-uniapp/06.png) | +| ![](/.image/admin-uniapp/07.png) | ![](/.image/admin-uniapp/08.png) | ![](/.image/admin-uniapp/09.png) | + +目前已经实现登录、我的、工作台、编辑资料、头像修改、密码修改、常见问题、关于我们等基础功能。 diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..856e116 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,84 @@ +version: "3.4" + +name: win-system + +services: + mysql: + container_name: win-mysql + image: mysql:8 + restart: unless-stopped + tty: true + ports: + - "3306:3306" + environment: + MYSQL_DATABASE: ${MYSQL_DATABASE:-ruoyi-vue-pro} + MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-123456} + volumes: + - mysql:/var/lib/mysql/ + - ./sql/mysql/ruoyi-vue-pro.sql:/docker-entrypoint-initdb.d/ruoyi-vue-pro.sql:ro + + redis: + container_name: win-redis + image: redis:6-alpine + restart: unless-stopped + ports: + - "6379:6379" + volumes: + - redis:/data + + server: + container_name: win-server + build: + context: ./win-server/ + image: win-server + restart: unless-stopped + ports: + - "48080:48080" + environment: + # https://github.com/polovyivan/docker-pass-configs-to-container + SPRING_PROFILES_ACTIVE: local + JAVA_OPTS: + ${JAVA_OPTS:- + -Xms512m + -Xmx512m + -Djava.security.egd=file:/dev/./urandom + } + ARGS: + --spring.datasource.dynamic.datasource.master.url=${MASTER_DATASOURCE_URL:-jdbc:mysql://win-mysql:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true} + --spring.datasource.dynamic.datasource.master.username=${MASTER_DATASOURCE_USERNAME:-root} + --spring.datasource.dynamic.datasource.master.password=${MASTER_DATASOURCE_PASSWORD:-123456} + --spring.datasource.dynamic.datasource.slave.url=${SLAVE_DATASOURCE_URL:-jdbc:mysql://win-mysql:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true} + --spring.datasource.dynamic.datasource.slave.username=${SLAVE_DATASOURCE_USERNAME:-root} + --spring.datasource.dynamic.datasource.slave.password=${SLAVE_DATASOURCE_PASSWORD:-123456} + --spring.redis.host=${REDIS_HOST:-win-redis} + depends_on: + - mysql + - redis + + admin: + container_name: win-admin + build: + context: ./win-ui-admin + args: + NODE_ENV: + ENV=${NODE_ENV:-production} + PUBLIC_PATH=${PUBLIC_PATH:-/} + VUE_APP_TITLE=${VUE_APP_TITLE:-闻荫管理系统} + VUE_APP_BASE_API=${VUE_APP_BASE_API:-/prod-api} + VUE_APP_APP_NAME=${VUE_APP_APP_NAME:-/} + VUE_APP_TENANT_ENABLE=${VUE_APP_TENANT_ENABLE:-true} + VUE_APP_CAPTCHA_ENABLE=${VUE_APP_CAPTCHA_ENABLE:-true} + VUE_APP_DOC_ENABLE=${VUE_APP_DOC_ENABLE:-true} + VUE_APP_BAIDU_CODE=${VUE_APP_BAIDU_CODE:-fadc1bd5db1a1d6f581df60a1807f8ab} + image: win-admin + restart: unless-stopped + ports: + - "8080:80" + depends_on: + - server + +volumes: + mysql: + driver: local + redis: + driver: local diff --git a/docker.env b/docker.env new file mode 100644 index 0000000..68a29f0 --- /dev/null +++ b/docker.env @@ -0,0 +1,25 @@ +## mysql +MYSQL_DATABASE=ruoyi-vue-pro +MYSQL_ROOT_PASSWORD=123456 + +## server +JAVA_OPTS=-Xms512m -Xmx512m -Djava.security.egd=file:/dev/./urandom + +MASTER_DATASOURCE_URL=jdbc:mysql://win-mysql:3306/${MYSQL_DATABASE}?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true +MASTER_DATASOURCE_USERNAME=root +MASTER_DATASOURCE_PASSWORD=${MYSQL_ROOT_PASSWORD} +SLAVE_DATASOURCE_URL=${MASTER_DATASOURCE_URL} +SLAVE_DATASOURCE_USERNAME=${MASTER_DATASOURCE_USERNAME} +SLAVE_DATASOURCE_PASSWORD=${MASTER_DATASOURCE_PASSWORD} +REDIS_HOST=win-redis + +## admin +NODE_ENV=production +PUBLIC_PATH=/ +VUE_APP_TITLE=闻荫管理系统 +VUE_APP_BASE_API=/prod-api +VUE_APP_APP_NAME=/ +VUE_APP_TENANT_ENABLE=true +VUE_APP_CAPTCHA_ENABLE=true +VUE_APP_DOC_ENABLE=true +VUE_APP_BAIDU_CODE=fadc1bd5db1a1d6f581df60a1807f8ab diff --git a/http-client.env.json b/http-client.env.json new file mode 100644 index 0000000..4a4cb52 --- /dev/null +++ b/http-client.env.json @@ -0,0 +1,20 @@ +{ + "local": { + "baseUrl": "http://127.0.0.1:48080/admin-api", + "token": "test1", + "adminTenentId": "1", + + "appApi": "http://127.0.0.1:48080/app-api", + "appToken": "test247", + "appTenentId": "1" + }, + "gateway": { + "baseUrl": "http://127.0.0.1:8888/admin-api", + "token": "test1", + "adminTenentId": "1", + + "appApi": "http://127.0.0.1:8888/app-api", + "appToken": "test1", + "appTenantId": "1" + } +} diff --git a/lombok.config b/lombok.config new file mode 100644 index 0000000..a8e8ce6 --- /dev/null +++ b/lombok.config @@ -0,0 +1,4 @@ +config.stopBubbling = true +lombok.tostring.callsuper=CALL +lombok.equalsandhashcode.callsuper=CALL +lombok.accessors.chain=true diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..a78793b --- /dev/null +++ b/pom.xml @@ -0,0 +1,141 @@ + + + 4.0.0 + com.win + win + ${revision} + pom + + win-dependencies + win-framework + + win-server + + win-module-system + win-module-infra + win-module-bpm + win-module-report + + + ${project.artifactId} + 闻荫项目基础脚手架 + https://github.com/YunaiV/ruoyi-vue-pro + + + 3.0.0 + + 1.8 + ${java.version} + ${java.version} + 3.0.0-M5 + 3.8.1 + 1.5.0 + + 1.18.28 + 2.7.15 + 1.5.5.Final + UTF-8 + + + + + + com.win + win-dependencies + ${revision} + pom + import + + + + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + + + org.springframework.boot + spring-boot-configuration-processor + ${spring.boot.version} + + + org.projectlombok + lombok + ${lombok.version} + + + org.mapstruct + mapstruct-processor + ${mapstruct.version} + + + + + + org.codehaus.mojo + flatten-maven-plugin + + + + + + + + org.codehaus.mojo + flatten-maven-plugin + ${flatten-maven-plugin.version} + + resolveCiFriendliesOnly + true + + + + + flatten + + flatten + process-resources + + + + clean + + flatten.clean + clean + + + + + + + + + + huaweicloud + huawei + https://mirrors.huaweicloud.com/repository/maven/ + + + aliyunmaven + aliyun + https://maven.aliyun.com/repository/public + + + + diff --git a/sql/db2/README.md b/sql/db2/README.md new file mode 100644 index 0000000..5b60d1e --- /dev/null +++ b/sql/db2/README.md @@ -0,0 +1,3 @@ +暂未适配 IBM DB2 数据库,如果你有需要,可以微信联系 wangwenbin-server 一起建设。 + +你需要把表结构与数据导入到 DM 数据库,我来测试与适配代码。 diff --git a/sql/dm/README.md b/sql/dm/README.md new file mode 100644 index 0000000..e8b39a8 --- /dev/null +++ b/sql/dm/README.md @@ -0,0 +1,3 @@ +暂未适配国产 DM 数据库,如果你有需要,可以微信联系 wangwenbin-server 一起建设。 + +你需要把表结构与数据导入到 DM 数据库,我来测试与适配代码。 diff --git a/sql/dm/ruoyi-vue-pro-dm8.sql b/sql/dm/ruoyi-vue-pro-dm8.sql new file mode 100644 index 0000000..c8a217e --- /dev/null +++ b/sql/dm/ruoyi-vue-pro-dm8.sql @@ -0,0 +1,5798 @@ +CREATE TABLE "RUOYI_VUE_PRO"."BPM_FORM" +( + "ID" BIGINT IDENTITY(24,1) NOT NULL, + "NAME" VARCHAR(64) NOT NULL, + "STATUS" TINYINT NOT NULL, + "CONF" VARCHAR(1000) NOT NULL, + "FIELDS" VARCHAR(5000) NOT NULL, + "REMARK" VARCHAR(255) NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL, + "TENANT_ID" BIGINT DEFAULT 0 + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."BPM_OA_LEAVE" +( + "ID" BIGINT IDENTITY(35,1) NOT NULL, + "USER_ID" BIGINT NOT NULL, + "TYPE" TINYINT NOT NULL, + "REASON" VARCHAR(200) NOT NULL, + "START_TIME" TIMESTAMP(0) NOT NULL, + "END_TIME" TIMESTAMP(0) NOT NULL, + "DAY" TINYINT NOT NULL, + "RESULT" TINYINT NOT NULL, + "PROCESS_INSTANCE_ID" VARCHAR(64) NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL, + "TENANT_ID" BIGINT DEFAULT 0 + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."BPM_PROCESS_DEFINITION_EXT" +( + "ID" BIGINT IDENTITY(141,1) NOT NULL, + "PROCESS_DEFINITION_ID" VARCHAR(64) NOT NULL, + "MODEL_ID" VARCHAR(64) NOT NULL, + "DESCRIPTION" VARCHAR(255) NULL, + "FORM_TYPE" TINYINT NOT NULL, + "FORM_ID" BIGINT NULL, + "FORM_CONF" VARCHAR(1000) NULL, + "FORM_FIELDS" VARCHAR(5000) NULL, + "FORM_CUSTOM_CREATE_PATH" VARCHAR(255) NULL, + "FORM_CUSTOM_VIEW_PATH" VARCHAR(255) NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL, + "TENANT_ID" BIGINT DEFAULT 0 + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."BPM_PROCESS_INSTANCE_EXT" +( + "ID" BIGINT IDENTITY(296,1) NOT NULL, + "START_USER_ID" BIGINT NOT NULL, + "NAME" VARCHAR(64) NULL, + "PROCESS_INSTANCE_ID" VARCHAR(64) NOT NULL, + "PROCESS_DEFINITION_ID" VARCHAR(64) NOT NULL, + "CATEGORY" VARCHAR(64) NULL, + "STATUS" TINYINT NOT NULL, + "RESULT" TINYINT NOT NULL, + "END_TIME" TIMESTAMP(0) NULL, + "FORM_VARIABLES" VARCHAR(5000) NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL, + "TENANT_ID" BIGINT DEFAULT 0 + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."BPM_TASK_ASSIGN_RULE" +( + "ID" BIGINT IDENTITY(275,1) NOT NULL, + "MODEL_ID" VARCHAR(64) NOT NULL, + "PROCESS_DEFINITION_ID" VARCHAR(64) NOT NULL, + "TASK_DEFINITION_KEY" VARCHAR(64) NOT NULL, + "TYPE" TINYINT NOT NULL, + "OPTIONS" VARCHAR(1024) NOT NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL, + "TENANT_ID" BIGINT DEFAULT 0 + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."BPM_TASK_EXT" +( + "ID" BIGINT IDENTITY(351,1) NOT NULL, + "ASSIGNEE_USER_ID" BIGINT NULL, + "NAME" VARCHAR(64) NULL, + "TASK_ID" VARCHAR(64) NOT NULL, + "RESULT" TINYINT NOT NULL, + "REASON" VARCHAR(255) NULL, + "END_TIME" TIMESTAMP(0) NULL, + "PROCESS_INSTANCE_ID" VARCHAR(64) NOT NULL, + "PROCESS_DEFINITION_ID" VARCHAR(64) NOT NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL, + "TENANT_ID" BIGINT DEFAULT 0 + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."BPM_USER_GROUP" +( + "ID" BIGINT IDENTITY(113,1) NOT NULL, + "NAME" VARCHAR(30) DEFAULT '' + NOT NULL, + "DESCRIPTION" VARCHAR(255) DEFAULT '' + NOT NULL, + "MEMBER_USER_IDS" VARCHAR(1024) DEFAULT '0' + NOT NULL, + "STATUS" TINYINT NOT NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL, + "TENANT_ID" BIGINT DEFAULT 0 + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."INFRA_API_ACCESS_LOG" +( + "ID" BIGINT IDENTITY(35832,1) NOT NULL, + "TRACE_ID" VARCHAR(64) DEFAULT '' + NOT NULL, + "USER_ID" BIGINT DEFAULT 0 + NOT NULL, + "USER_TYPE" TINYINT DEFAULT 0 + NOT NULL, + "APPLICATION_NAME" VARCHAR(50) NOT NULL, + "REQUEST_METHOD" VARCHAR(16) DEFAULT '' + NOT NULL, + "REQUEST_URL" VARCHAR(255) DEFAULT '' + NOT NULL, + "REQUEST_PARAMS" VARCHAR(8000) DEFAULT '' + NOT NULL, + "USER_IP" VARCHAR(50) NOT NULL, + "USER_AGENT" VARCHAR(512) NOT NULL, + "BEGIN_TIME" TIMESTAMP(0) NOT NULL, + "END_TIME" TIMESTAMP(0) NOT NULL, + "DURATION" INT NOT NULL, + "RESULT_CODE" INT DEFAULT 0 + NOT NULL, + "RESULT_MSG" VARCHAR(512) DEFAULT '' + NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL, + "TENANT_ID" BIGINT DEFAULT 0 + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."INFRA_API_ERROR_LOG" +( + "ID" INT IDENTITY(1110,1) NOT NULL, + "TRACE_ID" VARCHAR(64) NOT NULL, + "USER_ID" INT DEFAULT 0 + NOT NULL, + "USER_TYPE" TINYINT DEFAULT 0 + NOT NULL, + "APPLICATION_NAME" VARCHAR(50) NOT NULL, + "REQUEST_METHOD" VARCHAR(16) NOT NULL, + "REQUEST_URL" VARCHAR(255) NOT NULL, + "REQUEST_PARAMS" VARCHAR(8000) NOT NULL, + "USER_IP" VARCHAR(50) NOT NULL, + "USER_AGENT" VARCHAR(512) NOT NULL, + "EXCEPTION_TIME" TIMESTAMP(0) NOT NULL, + "EXCEPTION_NAME" VARCHAR(128) DEFAULT '' + NOT NULL, + "EXCEPTION_MESSAGE" TEXT NOT NULL, + "EXCEPTION_ROOT_CAUSE_MESSAGE" TEXT NOT NULL, + "EXCEPTION_STACK_TRACE" TEXT NOT NULL, + "EXCEPTION_CLASS_NAME" VARCHAR(512) NOT NULL, + "EXCEPTION_FILE_NAME" VARCHAR(512) NOT NULL, + "EXCEPTION_METHOD_NAME" VARCHAR(512) NOT NULL, + "EXCEPTION_LINE_NUMBER" INT NOT NULL, + "PROCESS_STATUS" TINYINT NOT NULL, + "PROCESS_TIME" TIMESTAMP(0) NULL, + "PROCESS_USER_ID" INT DEFAULT 0 + NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL, + "TENANT_ID" BIGINT DEFAULT 0 + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."INFRA_CODEGEN_COLUMN" +( + "ID" BIGINT IDENTITY(1688,1) NOT NULL, + "TABLE_ID" BIGINT NOT NULL, + "COLUMN_NAME" VARCHAR(200) NOT NULL, + "DATA_TYPE" VARCHAR(100) NOT NULL, + "COLUMN_COMMENT" VARCHAR(500) NOT NULL, + "NULLABLE" BIT NOT NULL, + "PRIMARY_KEY" BIT NOT NULL, + "AUTO_INCREMENT" CHAR(1) NOT NULL, + "ORDINAL_POSITION" INT NOT NULL, + "JAVA_TYPE" VARCHAR(32) NOT NULL, + "JAVA_FIELD" VARCHAR(64) NOT NULL, + "DICT_TYPE" VARCHAR(200) DEFAULT '' + NULL, + "EXAMPLE" VARCHAR(64) NULL, + "CREATE_OPERATION" BIT NOT NULL, + "UPDATE_OPERATION" BIT NOT NULL, + "LIST_OPERATION" BIT NOT NULL, + "LIST_OPERATION_CONDITION" VARCHAR(32) DEFAULT '=' + NOT NULL, + "LIST_OPERATION_RESULT" BIT NOT NULL, + "HTML_TYPE" VARCHAR(32) NOT NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."INFRA_CODEGEN_TABLE" +( + "ID" BIGINT IDENTITY(131,1) NOT NULL, + "DATA_SOURCE_CONFIG_ID" BIGINT NOT NULL, + "SCENE" TINYINT DEFAULT 1 + NOT NULL, + "TABLE_NAME" VARCHAR(200) DEFAULT '' + NOT NULL, + "TABLE_COMMENT" VARCHAR(500) DEFAULT '' + NOT NULL, + "REMARK" VARCHAR(500) NULL, + "MODULE_NAME" VARCHAR(30) NOT NULL, + "BUSINESS_NAME" VARCHAR(30) NOT NULL, + "CLASS_NAME" VARCHAR(100) DEFAULT '' + NOT NULL, + "CLASS_COMMENT" VARCHAR(50) NOT NULL, + "AUTHOR" VARCHAR(50) NOT NULL, + "TEMPLATE_TYPE" TINYINT DEFAULT 1 + NOT NULL, + "FRONT_TYPE" TINYINT NOT NULL, + "PARENT_MENU_ID" BIGINT NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."INFRA_CONFIG" +( + "ID" INT IDENTITY(11,1) NOT NULL, + "CATEGORY" VARCHAR(50) NOT NULL, + "TYPE" TINYINT NOT NULL, + "NAME" VARCHAR(100) DEFAULT '' + NOT NULL, + "CONFIG_KEY" VARCHAR(100) DEFAULT '' + NOT NULL, + "VALUE" VARCHAR(500) DEFAULT '' + NOT NULL, + "VISIBLE" BIT NOT NULL, + "REMARK" VARCHAR(500) NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."INFRA_DATA_SOURCE_CONFIG" +( + "ID" BIGINT IDENTITY(13,1) NOT NULL, + "NAME" VARCHAR(100) DEFAULT '' + NOT NULL, + "URL" VARCHAR(1024) NOT NULL, + "USERNAME" VARCHAR(255) NOT NULL, + "PASSWORD" VARCHAR(255) DEFAULT '' + NOT NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."INFRA_FILE" +( + "ID" BIGINT IDENTITY(912,1) NOT NULL, + "CONFIG_ID" BIGINT NULL, + "NAME" VARCHAR(256) NULL, + "PATH" VARCHAR(512) NOT NULL, + "URL" VARCHAR(1024) NOT NULL, + "TYPE" VARCHAR(128) NULL, + "SIZE" INT NOT NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."INFRA_FILE_CONFIG" +( + "ID" BIGINT IDENTITY(18,1) NOT NULL, + "NAME" VARCHAR(63) NOT NULL, + "STORAGE" TINYINT NOT NULL, + "REMARK" VARCHAR(255) NULL, + "MASTER" BIT NOT NULL, + "CONFIG" VARCHAR(4096) NOT NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."INFRA_FILE_CONTENT" +( + "ID" BIGINT IDENTITY(3,1) NOT NULL, + "CONFIG_ID" BIGINT NOT NULL, + "PATH" VARCHAR(512) NOT NULL, + "CONTENT" BLOB NOT NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."INFRA_JOB" +( + "ID" BIGINT IDENTITY(17,1) NOT NULL, + "NAME" VARCHAR(32) NOT NULL, + "STATUS" TINYINT NOT NULL, + "HANDLER_NAME" VARCHAR(64) NOT NULL, + "HANDLER_PARAM" VARCHAR(255) NULL, + "CRON_EXPRESSION" VARCHAR(32) NOT NULL, + "RETRY_COUNT" INT DEFAULT 0 + NOT NULL, + "RETRY_INTERVAL" INT DEFAULT 0 + NOT NULL, + "MONITOR_TIMEOUT" INT DEFAULT 0 + NOT NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."INFRA_JOB_LOG" +( + "ID" BIGINT IDENTITY(168767,1) NOT NULL, + "JOB_ID" BIGINT NOT NULL, + "HANDLER_NAME" VARCHAR(64) NOT NULL, + "HANDLER_PARAM" VARCHAR(255) NULL, + "EXECUTE_INDEX" TINYINT DEFAULT 1 + NOT NULL, + "BEGIN_TIME" TIMESTAMP(0) NOT NULL, + "END_TIME" TIMESTAMP(0) NULL, + "DURATION" INT NULL, + "STATUS" TINYINT NOT NULL, + "RESULT" VARCHAR(4000) DEFAULT '' + NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."INFRA_TEST_DEMO" +( + "ID" BIGINT IDENTITY(1,1) NOT NULL, + "NAME" VARCHAR(100) DEFAULT '' + NOT NULL, + "STATUS" TINYINT DEFAULT 0 + NOT NULL, + "TYPE" TINYINT NOT NULL, + "CATEGORY" TINYINT NOT NULL, + "REMARK" VARCHAR(500) NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."MEMBER_USER" +( + "ID" BIGINT IDENTITY(247,1) NOT NULL, + "NICKNAME" VARCHAR(30) DEFAULT '' + NOT NULL, + "AVATAR" VARCHAR(255) DEFAULT '' + NOT NULL, + "STATUS" TINYINT NOT NULL, + "MOBILE" VARCHAR(11) NOT NULL, + "PASSWORD" VARCHAR(100) DEFAULT '' + NOT NULL, + "REGISTER_IP" VARCHAR(32) NOT NULL, + "LOGIN_IP" VARCHAR(50) DEFAULT '' + NULL, + "LOGIN_DATE" TIMESTAMP(0) NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL, + "TENANT_ID" BIGINT DEFAULT 0 + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."PAY_APP" +( + "ID" BIGINT IDENTITY(7,1) NOT NULL, + "NAME" VARCHAR(64) NOT NULL, + "STATUS" TINYINT NOT NULL, + "REMARK" VARCHAR(255) NULL, + "PAY_NOTIFY_URL" VARCHAR(1024) NOT NULL, + "REFUND_NOTIFY_URL" VARCHAR(1024) NOT NULL, + "MERCHANT_ID" BIGINT NOT NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL, + "TENANT_ID" BIGINT DEFAULT 0 + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."PAY_CHANNEL" +( + "ID" BIGINT IDENTITY(22,1) NOT NULL, + "CODE" VARCHAR(32) NOT NULL, + "STATUS" TINYINT NOT NULL, + "REMARK" VARCHAR(255) NULL, + "FEE_RATE" NUMBER(22,0) DEFAULT 0 + NOT NULL, + "MERCHANT_ID" BIGINT NOT NULL, + "APP_ID" BIGINT NOT NULL, + "CONFIG" VARCHAR(4096) NOT NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL, + "TENANT_ID" BIGINT DEFAULT 0 + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."PAY_DEMO_ORDER" +( + "ID" BIGINT IDENTITY(72,1) NOT NULL, + "USER_ID" DECIMAL(20,0) NOT NULL, + "SPU_ID" BIGINT NOT NULL, + "SPU_NAME" VARCHAR(255) NOT NULL, + "PRICE" INT NOT NULL, + "PAYED" BIT DEFAULT '0' + NOT NULL, + "PAY_ORDER_ID" BIGINT NULL, + "PAY_CHANNEL_CODE" VARCHAR(16) NULL, + "PAY_TIME" TIMESTAMP(0) NULL, + "PAY_REFUND_ID" BIGINT NULL, + "REFUND_PRICE" INT DEFAULT 0 + NOT NULL, + "REFUND_TIME" TIMESTAMP(0) NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL, + "TENANT_ID" BIGINT DEFAULT 0 + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."PAY_MERCHANT" +( + "ID" BIGINT IDENTITY(6,1) NOT NULL, + "NO" VARCHAR(32) NOT NULL, + "NAME" VARCHAR(64) NOT NULL, + "SHORT_NAME" VARCHAR(64) NOT NULL, + "STATUS" TINYINT NOT NULL, + "REMARK" VARCHAR(255) NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL, + "TENANT_ID" BIGINT DEFAULT 0 + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."PAY_NOTIFY_LOG" +( + "ID" BIGINT IDENTITY(371964,1) NOT NULL, + "TASK_ID" BIGINT NOT NULL, + "NOTIFY_TIMES" TINYINT NOT NULL, + "RESPONSE" VARCHAR(2048) NOT NULL, + "STATUS" TINYINT NOT NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL, + "TENANT_ID" BIGINT DEFAULT 0 + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."PAY_NOTIFY_TASK" +( + "ID" BIGINT IDENTITY(151,1) NOT NULL, + "MERCHANT_ID" BIGINT NOT NULL, + "APP_ID" BIGINT NOT NULL, + "TYPE" TINYINT NOT NULL, + "DATA_ID" BIGINT NOT NULL, + "STATUS" TINYINT NOT NULL, + "MERCHANT_ORDER_ID" VARCHAR(64) NOT NULL, + "NEXT_NOTIFY_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "LAST_EXECUTE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "NOTIFY_TIMES" TINYINT NOT NULL, + "MAX_NOTIFY_TIMES" TINYINT NOT NULL, + "NOTIFY_URL" VARCHAR(1024) NOT NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL, + "TENANT_ID" BIGINT DEFAULT 0 + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."PAY_ORDER" +( + "ID" BIGINT IDENTITY(171,1) NOT NULL, + "MERCHANT_ID" BIGINT NOT NULL, + "APP_ID" BIGINT NOT NULL, + "CHANNEL_ID" BIGINT NULL, + "CHANNEL_CODE" VARCHAR(32) NULL, + "MERCHANT_ORDER_ID" VARCHAR(64) NOT NULL, + "SUBJECT" VARCHAR(32) NOT NULL, + "BODY" VARCHAR(128) NOT NULL, + "NOTIFY_URL" VARCHAR(1024) NOT NULL, + "NOTIFY_STATUS" TINYINT NOT NULL, + "AMOUNT" BIGINT NOT NULL, + "CHANNEL_FEE_RATE" NUMBER(22,0) DEFAULT 0 + NULL, + "CHANNEL_FEE_AMOUNT" BIGINT DEFAULT 0 + NULL, + "STATUS" TINYINT NOT NULL, + "USER_IP" VARCHAR(50) NOT NULL, + "EXPIRE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "SUCCESS_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NULL, + "NOTIFY_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NULL, + "SUCCESS_EXTENSION_ID" BIGINT NULL, + "REFUND_STATUS" TINYINT NOT NULL, + "REFUND_TIMES" TINYINT NOT NULL, + "REFUND_AMOUNT" BIGINT NOT NULL, + "CHANNEL_USER_ID" VARCHAR(255) NULL, + "CHANNEL_ORDER_NO" VARCHAR(64) NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL, + "TENANT_ID" BIGINT DEFAULT 0 + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."PAY_ORDER_EXTENSION" +( + "ID" BIGINT IDENTITY(383,1) NOT NULL, + "NO" VARCHAR(64) NOT NULL, + "ORDER_ID" BIGINT NOT NULL, + "CHANNEL_ID" BIGINT NOT NULL, + "CHANNEL_CODE" VARCHAR(32) NOT NULL, + "USER_IP" VARCHAR(50) NOT NULL, + "STATUS" TINYINT NOT NULL, + "CHANNEL_EXTRAS" VARCHAR(256) NULL, + "CHANNEL_NOTIFY_DATA" VARCHAR(4096) NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL, + "TENANT_ID" BIGINT DEFAULT 0 + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."PAY_REFUND" +( + "ID" BIGINT IDENTITY(26,1) NOT NULL, + "MERCHANT_ID" BIGINT NOT NULL, + "APP_ID" BIGINT NOT NULL, + "CHANNEL_ID" BIGINT NOT NULL, + "CHANNEL_CODE" VARCHAR(32) NOT NULL, + "ORDER_ID" BIGINT NOT NULL, + "TRADE_NO" VARCHAR(64) NOT NULL, + "MERCHANT_ORDER_ID" VARCHAR(64) NOT NULL, + "MERCHANT_REFUND_NO" VARCHAR(64) NOT NULL, + "NOTIFY_URL" VARCHAR(1024) NOT NULL, + "NOTIFY_STATUS" TINYINT NOT NULL, + "STATUS" TINYINT NOT NULL, + "TYPE" TINYINT NOT NULL, + "PAY_AMOUNT" BIGINT NOT NULL, + "REFUND_AMOUNT" BIGINT NOT NULL, + "REASON" VARCHAR(256) NOT NULL, + "USER_IP" VARCHAR(50) NULL, + "CHANNEL_ORDER_NO" VARCHAR(64) NOT NULL, + "CHANNEL_REFUND_NO" VARCHAR(64) NULL, + "CHANNEL_ERROR_CODE" VARCHAR(128) NULL, + "CHANNEL_ERROR_MSG" VARCHAR(256) NULL, + "CHANNEL_EXTRAS" VARCHAR(1024) NULL, + "EXPIRE_TIME" TIMESTAMP(0) NULL, + "SUCCESS_TIME" TIMESTAMP(0) NULL, + "NOTIFY_TIME" TIMESTAMP(0) NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL, + "TENANT_ID" BIGINT DEFAULT 0 + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."QRTZ_BLOB_TRIGGERS" +( + "SCHED_NAME" VARCHAR(120) NOT NULL, + "TRIGGER_NAME" VARCHAR(190) NOT NULL, + "TRIGGER_GROUP" VARCHAR(190) NOT NULL, + "BLOB_DATA" BLOB NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."QRTZ_CALENDARS" +( + "SCHED_NAME" VARCHAR(120) NOT NULL, + "CALENDAR_NAME" VARCHAR(190) NOT NULL, + "CALENDAR" BLOB NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."QRTZ_CRON_TRIGGERS" +( + "SCHED_NAME" VARCHAR(120) NOT NULL, + "TRIGGER_NAME" VARCHAR(190) NOT NULL, + "TRIGGER_GROUP" VARCHAR(190) NOT NULL, + "CRON_EXPRESSION" VARCHAR(120) NOT NULL, + "TIME_ZONE_ID" VARCHAR(80) NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."QRTZ_FIRED_TRIGGERS" +( + "SCHED_NAME" VARCHAR(120) NOT NULL, + "ENTRY_ID" VARCHAR(95) NOT NULL, + "TRIGGER_NAME" VARCHAR(190) NOT NULL, + "TRIGGER_GROUP" VARCHAR(190) NOT NULL, + "INSTANCE_NAME" VARCHAR(190) NOT NULL, + "FIRED_TIME" BIGINT NOT NULL, + "SCHED_TIME" BIGINT NOT NULL, + "PRIORITY" INT NOT NULL, + "STATE" VARCHAR(16) NOT NULL, + "JOB_NAME" VARCHAR(190) NULL, + "JOB_GROUP" VARCHAR(190) NULL, + "IS_NONCONCURRENT" VARCHAR(1) NULL, + "REQUESTS_RECOVERY" VARCHAR(1) NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."QRTZ_JOB_DETAILS" +( + "SCHED_NAME" VARCHAR(120) NOT NULL, + "JOB_NAME" VARCHAR(190) NOT NULL, + "JOB_GROUP" VARCHAR(190) NOT NULL, + "DESCRIPTION" VARCHAR(250) NULL, + "JOB_CLASS_NAME" VARCHAR(250) NOT NULL, + "IS_DURABLE" VARCHAR(1) NOT NULL, + "IS_NONCONCURRENT" VARCHAR(1) NOT NULL, + "IS_UPDATE_DATA" VARCHAR(1) NOT NULL, + "REQUESTS_RECOVERY" VARCHAR(1) NOT NULL, + "JOB_DATA" BLOB NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."QRTZ_LOCKS" +( + "SCHED_NAME" VARCHAR(120) NOT NULL, + "LOCK_NAME" VARCHAR(40) NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."QRTZ_PAUSED_TRIGGER_GRPS" +( + "SCHED_NAME" VARCHAR(120) NOT NULL, + "TRIGGER_GROUP" VARCHAR(190) NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."QRTZ_SCHEDULER_STATE" +( + "SCHED_NAME" VARCHAR(120) NOT NULL, + "INSTANCE_NAME" VARCHAR(190) NOT NULL, + "LAST_CHECKIN_TIME" BIGINT NOT NULL, + "CHECKIN_INTERVAL" BIGINT NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."QRTZ_SIMPLE_TRIGGERS" +( + "SCHED_NAME" VARCHAR(120) NOT NULL, + "TRIGGER_NAME" VARCHAR(190) NOT NULL, + "TRIGGER_GROUP" VARCHAR(190) NOT NULL, + "REPEAT_COUNT" BIGINT NOT NULL, + "REPEAT_INTERVAL" BIGINT NOT NULL, + "TIMES_TRIGGERED" BIGINT NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."QRTZ_SIMPROP_TRIGGERS" +( + "SCHED_NAME" VARCHAR(120) NOT NULL, + "TRIGGER_NAME" VARCHAR(190) NOT NULL, + "TRIGGER_GROUP" VARCHAR(190) NOT NULL, + "STR_PROP_1" VARCHAR(512) NULL, + "STR_PROP_2" VARCHAR(512) NULL, + "STR_PROP_3" VARCHAR(512) NULL, + "INT_PROP_1" INT NULL, + "INT_PROP_2" INT NULL, + "LONG_PROP_1" BIGINT NULL, + "LONG_PROP_2" BIGINT NULL, + "DEC_PROP_1" DEC(13,4) NULL, + "DEC_PROP_2" DEC(13,4) NULL, + "BOOL_PROP_1" VARCHAR(1) NULL, + "BOOL_PROP_2" VARCHAR(1) NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."QRTZ_TRIGGERS" +( + "SCHED_NAME" VARCHAR(120) NOT NULL, + "TRIGGER_NAME" VARCHAR(190) NOT NULL, + "TRIGGER_GROUP" VARCHAR(190) NOT NULL, + "JOB_NAME" VARCHAR(190) NOT NULL, + "JOB_GROUP" VARCHAR(190) NOT NULL, + "DESCRIPTION" VARCHAR(250) NULL, + "NEXT_FIRE_TIME" BIGINT NULL, + "PREV_FIRE_TIME" BIGINT NULL, + "PRIORITY" INT NULL, + "TRIGGER_STATE" VARCHAR(16) NOT NULL, + "TRIGGER_TYPE" VARCHAR(8) NOT NULL, + "START_TIME" BIGINT NOT NULL, + "END_TIME" BIGINT NULL, + "CALENDAR_NAME" VARCHAR(190) NULL, + "MISFIRE_INSTR" SMALLINT NULL, + "JOB_DATA" BLOB NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."SYSTEM_DEPT" +( + "ID" BIGINT IDENTITY(112,1) NOT NULL, + "NAME" VARCHAR(30) DEFAULT '' + NOT NULL, + "PARENT_ID" BIGINT DEFAULT 0 + NOT NULL, + "SORT" INT DEFAULT 0 + NOT NULL, + "LEADER_USER_ID" BIGINT NULL, + "PHONE" VARCHAR(11) NULL, + "EMAIL" VARCHAR(50) NULL, + "STATUS" TINYINT NOT NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL, + "TENANT_ID" BIGINT DEFAULT 0 + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA" +( + "ID" BIGINT IDENTITY(1235,1) NOT NULL, + "SORT" INT DEFAULT 0 + NOT NULL, + "LABEL" VARCHAR(100) DEFAULT '' + NOT NULL, + "VALUE" VARCHAR(100) DEFAULT '' + NOT NULL, + "DICT_TYPE" VARCHAR(100) DEFAULT '' + NOT NULL, + "STATUS" TINYINT DEFAULT 0 + NOT NULL, + "COLOR_TYPE" VARCHAR(100) DEFAULT '' + NULL, + "CSS_CLASS" VARCHAR(100) DEFAULT '' + NULL, + "REMARK" VARCHAR(500) NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE" +( + "ID" BIGINT IDENTITY(169,1) NOT NULL, + "NAME" VARCHAR(100) DEFAULT '' + NOT NULL, + "TYPE" VARCHAR(100) DEFAULT '' + NOT NULL, + "STATUS" TINYINT DEFAULT 0 + NOT NULL, + "REMARK" VARCHAR(500) NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL, + "DELETED_TIME" TIMESTAMP(0) NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."SYSTEM_ERROR_CODE" +( + "ID" BIGINT IDENTITY(5832,1) NOT NULL, + "TYPE" TINYINT DEFAULT 0 + NOT NULL, + "APPLICATION_NAME" VARCHAR(50) NOT NULL, + "CODE" INT DEFAULT 0 + NOT NULL, + "MESSAGE" VARCHAR(512) DEFAULT '' + NOT NULL, + "MEMO" VARCHAR(512) DEFAULT '' + NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."SYSTEM_LOGIN_LOG" +( + "ID" BIGINT IDENTITY(2163,1) NOT NULL, + "LOG_TYPE" BIGINT NOT NULL, + "TRACE_ID" VARCHAR(64) DEFAULT '' + NOT NULL, + "USER_ID" BIGINT DEFAULT 0 + NOT NULL, + "USER_TYPE" TINYINT DEFAULT 0 + NOT NULL, + "USERNAME" VARCHAR(50) DEFAULT '' + NOT NULL, + "RESULT" TINYINT NOT NULL, + "USER_IP" VARCHAR(50) NOT NULL, + "USER_AGENT" VARCHAR(512) NOT NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL, + "TENANT_ID" BIGINT DEFAULT 0 + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."SYSTEM_MAIL_ACCOUNT" +( + "ID" BIGINT IDENTITY(5,1) NOT NULL, + "MAIL" VARCHAR(255) NOT NULL, + "USERNAME" VARCHAR(255) NOT NULL, + "PASSWORD" VARCHAR(255) NOT NULL, + "HOST" VARCHAR(255) NOT NULL, + "PORT" INT NOT NULL, + "SSL_ENABLE" BIT DEFAULT '0' + NOT NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."SYSTEM_MAIL_LOG" +( + "ID" BIGINT IDENTITY(354,1) NOT NULL, + "USER_ID" BIGINT NULL, + "USER_TYPE" TINYINT NULL, + "TO_MAIL" VARCHAR(255) NOT NULL, + "ACCOUNT_ID" BIGINT NOT NULL, + "FROM_MAIL" VARCHAR(255) NOT NULL, + "TEMPLATE_ID" BIGINT NOT NULL, + "TEMPLATE_CODE" VARCHAR(63) NOT NULL, + "TEMPLATE_NICKNAME" VARCHAR(255) NULL, + "TEMPLATE_TITLE" VARCHAR(255) NOT NULL, + "TEMPLATE_CONTENT" VARCHAR(10240) NOT NULL, + "TEMPLATE_PARAMS" VARCHAR(255) NOT NULL, + "SEND_STATUS" TINYINT DEFAULT 0 + NOT NULL, + "SEND_TIME" TIMESTAMP(0) NULL, + "SEND_MESSAGE_ID" VARCHAR(255) NULL, + "SEND_EXCEPTION" VARCHAR(4096) NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."SYSTEM_MAIL_TEMPLATE" +( + "ID" BIGINT IDENTITY(16,1) NOT NULL, + "NAME" VARCHAR(63) NOT NULL, + "CODE" VARCHAR(63) NOT NULL, + "ACCOUNT_ID" BIGINT NOT NULL, + "NICKNAME" VARCHAR(255) NULL, + "TITLE" VARCHAR(255) NOT NULL, + "CONTENT" VARCHAR(10240) NOT NULL, + "PARAMS" VARCHAR(255) NOT NULL, + "STATUS" TINYINT NOT NULL, + "REMARK" VARCHAR(255) NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."SYSTEM_MENU" +( + "ID" BIGINT IDENTITY(2162,1) NOT NULL, + "NAME" VARCHAR(50) NOT NULL, + "PERMISSION" VARCHAR(100) DEFAULT '' + NOT NULL, + "TYPE" TINYINT NOT NULL, + "SORT" INT DEFAULT 0 + NOT NULL, + "PARENT_ID" BIGINT DEFAULT 0 + NOT NULL, + "PATH" VARCHAR(200) DEFAULT '' + NULL, + "ICON" VARCHAR(100) DEFAULT '#' + NULL, + "COMPONENT" VARCHAR(255) NULL, + "COMPONENT_NAME" VARCHAR(255) NULL, + "STATUS" TINYINT DEFAULT 0 + NOT NULL, + "VISIBLE" BIT DEFAULT '1' + NOT NULL, + "KEEP_ALIVE" BIT DEFAULT '1' + NOT NULL, + "ALWAYS_SHOW" BIT DEFAULT '1' + NOT NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."SYSTEM_NOTICE" +( + "ID" BIGINT IDENTITY(5,1) NOT NULL, + "TITLE" VARCHAR(50) NOT NULL, + "CONTENT" TEXT NOT NULL, + "TYPE" TINYINT NOT NULL, + "STATUS" TINYINT DEFAULT 0 + NOT NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL, + "TENANT_ID" BIGINT DEFAULT 0 + NOT NULL +); +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."BPM_FORM" ON; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."BPM_FORM" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."BPM_OA_LEAVE" ON; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."BPM_OA_LEAVE" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."BPM_PROCESS_DEFINITION_EXT" ON; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."BPM_PROCESS_DEFINITION_EXT" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."BPM_PROCESS_INSTANCE_EXT" ON; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."BPM_PROCESS_INSTANCE_EXT" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."BPM_TASK_ASSIGN_RULE" ON; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."BPM_TASK_ASSIGN_RULE" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."BPM_TASK_EXT" ON; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."BPM_TASK_EXT" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."BPM_USER_GROUP" ON; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."BPM_USER_GROUP" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."INFRA_API_ACCESS_LOG" ON; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."INFRA_API_ACCESS_LOG" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."INFRA_API_ERROR_LOG" ON; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."INFRA_API_ERROR_LOG" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."INFRA_CODEGEN_COLUMN" ON; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."INFRA_CODEGEN_COLUMN" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."INFRA_CODEGEN_TABLE" ON; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."INFRA_CODEGEN_TABLE" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."INFRA_CONFIG" ON; +INSERT INTO "RUOYI_VUE_PRO"."INFRA_CONFIG"("ID","CATEGORY","TYPE","NAME","CONFIG_KEY","VALUE","VISIBLE","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2,'biz',1,'用户管理-账号初始密码','sys.user.init-password','123456',0,'初始化密码 123456','admin','2021-01-05 17:03:48','1','2022-03-20 02:25:51',0); +INSERT INTO "RUOYI_VUE_PRO"."INFRA_CONFIG"("ID","CATEGORY","TYPE","NAME","CONFIG_KEY","VALUE","VISIBLE","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(7,'url',2,'MySQL 监控的地址','url.druid','',1,'','1','2023-04-07 13:41:16','1','2023-04-07 14:33:38',0); +INSERT INTO "RUOYI_VUE_PRO"."INFRA_CONFIG"("ID","CATEGORY","TYPE","NAME","CONFIG_KEY","VALUE","VISIBLE","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(8,'url',2,'SkyWalking 监控的地址','url.skywalking','',1,'','1','2023-04-07 13:41:16','1','2023-04-07 14:57:03',0); +INSERT INTO "RUOYI_VUE_PRO"."INFRA_CONFIG"("ID","CATEGORY","TYPE","NAME","CONFIG_KEY","VALUE","VISIBLE","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(9,'url',2,'Spring Boot Admin 监控的地址','url.spring-boot-admin','',1,'','1','2023-04-07 13:41:16','1','2023-04-07 14:52:07',0); +INSERT INTO "RUOYI_VUE_PRO"."INFRA_CONFIG"("ID","CATEGORY","TYPE","NAME","CONFIG_KEY","VALUE","VISIBLE","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(10,'url',2,'Swagger 接口文档的地址','url.swagger','',1,'','1','2023-04-07 13:41:16','1','2023-04-07 14:59:00',0); + +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."INFRA_CONFIG" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."INFRA_DATA_SOURCE_CONFIG" ON; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."INFRA_DATA_SOURCE_CONFIG" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."INFRA_FILE" ON; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."INFRA_FILE" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."INFRA_FILE_CONFIG" ON; +INSERT INTO "RUOYI_VUE_PRO"."INFRA_FILE_CONFIG"("ID","NAME","STORAGE","REMARK","MASTER","CONFIG","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(4,'数据库',1,'我是数据库',1,'{"@class":"com.win.framework.file.core.client.db.DBFileClientConfig","domain":"http://127.0.0.1:48080"}','1','2022-03-15 23:56:24','1','2023-04-08 09:44:47',0); +INSERT INTO "RUOYI_VUE_PRO"."INFRA_FILE_CONFIG"("ID","NAME","STORAGE","REMARK","MASTER","CONFIG","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(5,'本地磁盘',10,'测试下本地存储',0,'{"@class":"com.win.framework.file.core.client.local.LocalFileClientConfig","basePath":"/Users/yunai/file_test","domain":"http://127.0.0.1:48080"}','1','2022-03-15 23:57:00','1','2023-04-08 09:44:47',0); +INSERT INTO "RUOYI_VUE_PRO"."INFRA_FILE_CONFIG"("ID","NAME","STORAGE","REMARK","MASTER","CONFIG","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(11,'S3 - 七牛云',20,null,0,'{"@class":"com.win.framework.file.core.client.s3.S3FileClientConfig","endpoint":"s3-cn-south-1.qiniucs.com","domain":"http://test.win.iocoder.cn","bucket":"ruoyi-vue-pro","accessKey":"b7yvuhBSAGjmtPhMFcn9iMOxUOY_I06cA_p0ZUx8","accessSecret":"kXM1l5ia1RvSX3QaOEcwI3RLz3Y2rmNszWonKZtP"}','1','2022-03-19 18:00:03','1','2023-04-08 09:44:47',0); +INSERT INTO "RUOYI_VUE_PRO"."INFRA_FILE_CONFIG"("ID","NAME","STORAGE","REMARK","MASTER","CONFIG","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(15,'S3 - 七牛云',20,'',0,'{"@class":"com.win.framework.file.core.client.s3.S3FileClientConfig","endpoint":"s3-cn-south-1.qiniucs.com","domain":"http://test.win.iocoder.cn","bucket":"ruoyi-vue-pro","accessKey":"b7yvuhBSAGjmtPhMFcn9iMOxUOY_I06cA_p0ZUx8","accessSecret":"kXM1l5ia1RvSX3QaOEcwI3RLz3Y2rmNszWonKZtP"}','1','2022-06-10 20:50:41','1','2023-04-08 09:44:47',0); +INSERT INTO "RUOYI_VUE_PRO"."INFRA_FILE_CONFIG"("ID","NAME","STORAGE","REMARK","MASTER","CONFIG","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(16,'S3 - 七牛云',20,'',0,'{"@class":"com.win.framework.file.core.client.s3.S3FileClientConfig","endpoint":"s3-cn-south-1.qiniucs.com","domain":"http://test.win.iocoder.cn","bucket":"ruoyi-vue-pro","accessKey":"b7yvuhBSAGjmtPhMFcn9iMOxUOY_I06cA_p0ZUx8","accessSecret":"kXM1l5ia1RvSX3QaOEcwI3RLz3Y2rmNszWonKZtP"}','1','2022-06-11 20:32:08','1','2023-04-08 09:44:47',0); +INSERT INTO "RUOYI_VUE_PRO"."INFRA_FILE_CONFIG"("ID","NAME","STORAGE","REMARK","MASTER","CONFIG","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(17,'S3 - 七牛云',20,'',0,'{"@class":"com.win.framework.file.core.client.s3.S3FileClientConfig","endpoint":"s3-cn-south-1.qiniucs.com","domain":"http://test.win.iocoder.cn","bucket":"ruoyi-vue-pro","accessKey":"b7yvuhBSAGjmtPhMFcn9iMOxUOY_I06cA_p0ZUx8","accessSecret":"kXM1l5ia1RvSX3QaOEcwI3RLz3Y2rmNszWonKZtP"}','1','2022-06-11 20:32:47','1','2023-04-08 09:44:47',0); + +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."INFRA_FILE_CONFIG" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."INFRA_FILE_CONTENT" ON; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."INFRA_FILE_CONTENT" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."INFRA_JOB" ON; +INSERT INTO "RUOYI_VUE_PRO"."INFRA_JOB"("ID","NAME","STATUS","HANDLER_NAME","HANDLER_PARAM","CRON_EXPRESSION","RETRY_COUNT","RETRY_INTERVAL","MONITOR_TIMEOUT","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(5,'支付通知 Job',1,'payNotifyJob',null,'* * * * * ?',0,0,0,'1','2021-10-27 08:34:42','1','2022-11-24 23:01:35',0); +INSERT INTO "RUOYI_VUE_PRO"."INFRA_JOB"("ID","NAME","STATUS","HANDLER_NAME","HANDLER_PARAM","CRON_EXPRESSION","RETRY_COUNT","RETRY_INTERVAL","MONITOR_TIMEOUT","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(16,'Job 示例',1,'demoJob',null,'* * * L * ?',1,1,0,'1','2022-09-24 22:31:41','1','2022-09-24 22:31:42',0); + +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."INFRA_JOB" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."INFRA_JOB_LOG" ON; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."INFRA_JOB_LOG" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."INFRA_TEST_DEMO" ON; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."INFRA_TEST_DEMO" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."MEMBER_USER" ON; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."MEMBER_USER" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."PAY_APP" ON; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."PAY_APP" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."PAY_CHANNEL" ON; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."PAY_CHANNEL" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."PAY_DEMO_ORDER" ON; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."PAY_DEMO_ORDER" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."PAY_MERCHANT" ON; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."PAY_MERCHANT" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."PAY_NOTIFY_LOG" ON; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."PAY_NOTIFY_LOG" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."PAY_NOTIFY_TASK" ON; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."PAY_NOTIFY_TASK" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."PAY_ORDER" ON; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."PAY_ORDER" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."PAY_ORDER_EXTENSION" ON; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."PAY_ORDER_EXTENSION" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."PAY_REFUND" ON; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."PAY_REFUND" OFF; +INSERT INTO "RUOYI_VUE_PRO"."QRTZ_CRON_TRIGGERS"("SCHED_NAME","TRIGGER_NAME","TRIGGER_GROUP","CRON_EXPRESSION","TIME_ZONE_ID") VALUES('schedulerName','payNotifyJob','DEFAULT','* * * * * ?','Asia/Shanghai'); + +INSERT INTO "RUOYI_VUE_PRO"."QRTZ_JOB_DETAILS"("SCHED_NAME","JOB_NAME","JOB_GROUP","DESCRIPTION","JOB_CLASS_NAME","IS_DURABLE","IS_NONCONCURRENT","IS_UPDATE_DATA","REQUESTS_RECOVERY","JOB_DATA") VALUES('schedulerName','payNotifyJob','DEFAULT',null,'com.win.framework.quartz.core.handler.JobHandlerInvoker','0','1','1','0',0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C770800000010000000027400064A4F425F49447372000E6A6176612E6C616E672E4C6F6E673B8BE490CC8F23DF0200014A000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B020000787000000000000000057400104A4F425F48414E444C45525F4E414D4574000C7061794E6F746966794A6F627800); + +INSERT INTO "RUOYI_VUE_PRO"."QRTZ_LOCKS"("SCHED_NAME","LOCK_NAME") VALUES('schedulerName','STATE_ACCESS'); +INSERT INTO "RUOYI_VUE_PRO"."QRTZ_LOCKS"("SCHED_NAME","LOCK_NAME") VALUES('schedulerName','TRIGGER_ACCESS'); + +INSERT INTO "RUOYI_VUE_PRO"."QRTZ_SCHEDULER_STATE"("SCHED_NAME","INSTANCE_NAME","LAST_CHECKIN_TIME","CHECKIN_INTERVAL") VALUES('schedulerName','Yunai1677076619095',1677076631456,15000); + +INSERT INTO "RUOYI_VUE_PRO"."QRTZ_TRIGGERS"("SCHED_NAME","TRIGGER_NAME","TRIGGER_GROUP","JOB_NAME","JOB_GROUP","DESCRIPTION","NEXT_FIRE_TIME","PREV_FIRE_TIME","PRIORITY","TRIGGER_STATE","TRIGGER_TYPE","START_TIME","END_TIME","CALENDAR_NAME","MISFIRE_INSTR","JOB_DATA") VALUES('schedulerName','payNotifyJob','DEFAULT','payNotifyJob','DEFAULT',null,1677076638000,1677076637000,5,'WAITING','CRON',1635294882000,0,null,0,0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C770800000010000000037400114A4F425F48414E444C45525F504152414D707400124A4F425F52455452595F494E54455256414C737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B02000078700000000074000F4A4F425F52455452595F434F554E5471007E000B7800); + +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_DEPT" ON; +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DEPT"("ID","NAME","PARENT_ID","SORT","LEADER_USER_ID","PHONE","EMAIL","STATUS","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(100,'闻荫源码',0,0,1,'15888888888','ry@qq.com',0,'admin','2021-01-05 17:03:47','1','2022-06-19 00:29:10',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DEPT"("ID","NAME","PARENT_ID","SORT","LEADER_USER_ID","PHONE","EMAIL","STATUS","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(101,'深圳总公司',100,1,104,'15888888888','ry@qq.com',0,'admin','2021-01-05 17:03:47','1','2022-05-16 20:25:23',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DEPT"("ID","NAME","PARENT_ID","SORT","LEADER_USER_ID","PHONE","EMAIL","STATUS","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(102,'长沙分公司',100,2,null,'15888888888','ry@qq.com',0,'admin','2021-01-05 17:03:47','','2021-12-15 05:01:40',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DEPT"("ID","NAME","PARENT_ID","SORT","LEADER_USER_ID","PHONE","EMAIL","STATUS","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(103,'研发部门',101,1,104,'15888888888','ry@qq.com',0,'admin','2021-01-05 17:03:47','103','2022-01-14 01:04:14',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DEPT"("ID","NAME","PARENT_ID","SORT","LEADER_USER_ID","PHONE","EMAIL","STATUS","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(104,'市场部门',101,2,null,'15888888888','ry@qq.com',0,'admin','2021-01-05 17:03:47','','2021-12-15 05:01:38',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DEPT"("ID","NAME","PARENT_ID","SORT","LEADER_USER_ID","PHONE","EMAIL","STATUS","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(105,'测试部门',101,3,null,'15888888888','ry@qq.com',0,'admin','2021-01-05 17:03:47','1','2022-05-16 20:25:15',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DEPT"("ID","NAME","PARENT_ID","SORT","LEADER_USER_ID","PHONE","EMAIL","STATUS","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(106,'财务部门',101,4,103,'15888888888','ry@qq.com',0,'admin','2021-01-05 17:03:47','103','2022-01-15 21:32:22',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DEPT"("ID","NAME","PARENT_ID","SORT","LEADER_USER_ID","PHONE","EMAIL","STATUS","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(107,'运维部门',101,5,null,'15888888888','ry@qq.com',0,'admin','2021-01-05 17:03:47','','2021-12-15 05:01:33',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DEPT"("ID","NAME","PARENT_ID","SORT","LEADER_USER_ID","PHONE","EMAIL","STATUS","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(108,'市场部门',102,1,null,'15888888888','ry@qq.com',0,'admin','2021-01-05 17:03:47','1','2022-02-16 08:35:45',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DEPT"("ID","NAME","PARENT_ID","SORT","LEADER_USER_ID","PHONE","EMAIL","STATUS","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(109,'财务部门',102,2,null,'15888888888','ry@qq.com',0,'admin','2021-01-05 17:03:47','','2021-12-15 05:01:29',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DEPT"("ID","NAME","PARENT_ID","SORT","LEADER_USER_ID","PHONE","EMAIL","STATUS","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(110,'新部门',0,1,null,null,null,0,'110','2022-02-23 20:46:30','110','2022-02-23 20:46:30',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DEPT"("ID","NAME","PARENT_ID","SORT","LEADER_USER_ID","PHONE","EMAIL","STATUS","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(111,'顶级部门',0,1,null,null,null,0,'113','2022-03-07 21:44:50','113','2022-03-07 21:44:50',0,122); + +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_DEPT" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA" ON; +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1,1,'男','1','system_user_sex',0,'default','A','性别男','admin','2021-01-05 17:03:48','1','2022-03-29 00:14:39',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2,2,'女','2','system_user_sex',1,'success','','性别女','admin','2021-01-05 17:03:48','1','2022-02-16 01:30:51',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(8,1,'正常','1','infra_job_status',0,'success','','正常状态','admin','2021-01-05 17:03:48','1','2022-02-16 19:33:38',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(9,2,'暂停','2','infra_job_status',0,'danger','','停用状态','admin','2021-01-05 17:03:48','1','2022-02-16 19:33:45',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(12,1,'系统内置','1','infra_config_type',0,'danger','','参数类型 - 系统内置','admin','2021-01-05 17:03:48','1','2022-02-16 19:06:02',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(13,2,'自定义','2','infra_config_type',0,'primary','','参数类型 - 自定义','admin','2021-01-05 17:03:48','1','2022-02-16 19:06:07',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(14,1,'通知','1','system_notice_type',0,'success','','通知','admin','2021-01-05 17:03:48','1','2022-02-16 13:05:57',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(15,2,'公告','2','system_notice_type',0,'info','','公告','admin','2021-01-05 17:03:48','1','2022-02-16 13:06:01',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(16,0,'其它','0','system_operate_type',0,'default','','其它操作','admin','2021-01-05 17:03:48','1','2022-02-16 09:32:46',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(17,1,'查询','1','system_operate_type',0,'info','','查询操作','admin','2021-01-05 17:03:48','1','2022-02-16 09:33:16',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(18,2,'新增','2','system_operate_type',0,'primary','','新增操作','admin','2021-01-05 17:03:48','1','2022-02-16 09:33:13',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(19,3,'修改','3','system_operate_type',0,'warning','','修改操作','admin','2021-01-05 17:03:48','1','2022-02-16 09:33:22',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(20,4,'删除','4','system_operate_type',0,'danger','','删除操作','admin','2021-01-05 17:03:48','1','2022-02-16 09:33:27',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(22,5,'导出','5','system_operate_type',0,'default','','导出操作','admin','2021-01-05 17:03:48','1','2022-02-16 09:33:32',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(23,6,'导入','6','system_operate_type',0,'default','','导入操作','admin','2021-01-05 17:03:48','1','2022-02-16 09:33:35',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(27,1,'开启','0','common_status',0,'primary','','开启状态','admin','2021-01-05 17:03:48','1','2022-02-16 08:00:39',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(28,2,'关闭','1','common_status',0,'info','','关闭状态','admin','2021-01-05 17:03:48','1','2022-02-16 08:00:44',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(29,1,'目录','1','system_menu_type',0,'','','目录','admin','2021-01-05 17:03:48','','2022-02-01 16:43:45',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(30,2,'菜单','2','system_menu_type',0,'','','菜单','admin','2021-01-05 17:03:48','','2022-02-01 16:43:41',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(31,3,'按钮','3','system_menu_type',0,'','','按钮','admin','2021-01-05 17:03:48','','2022-02-01 16:43:39',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(32,1,'内置','1','system_role_type',0,'danger','','内置角色','admin','2021-01-05 17:03:48','1','2022-02-16 13:02:08',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(33,2,'自定义','2','system_role_type',0,'primary','','自定义角色','admin','2021-01-05 17:03:48','1','2022-02-16 13:02:12',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(34,1,'全部数据权限','1','system_data_scope',0,'','','全部数据权限','admin','2021-01-05 17:03:48','','2022-02-01 16:47:17',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(35,2,'指定部门数据权限','2','system_data_scope',0,'','','指定部门数据权限','admin','2021-01-05 17:03:48','','2022-02-01 16:47:18',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(36,3,'本部门数据权限','3','system_data_scope',0,'','','本部门数据权限','admin','2021-01-05 17:03:48','','2022-02-01 16:47:16',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(37,4,'本部门及以下数据权限','4','system_data_scope',0,'','','本部门及以下数据权限','admin','2021-01-05 17:03:48','','2022-02-01 16:47:21',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(38,5,'仅本人数据权限','5','system_data_scope',0,'','','仅本人数据权限','admin','2021-01-05 17:03:48','','2022-02-01 16:47:23',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(39,0,'成功','0','system_login_result',0,'success','','登陆结果 - 成功','','2021-01-18 06:17:36','1','2022-02-16 13:23:49',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(40,10,'账号或密码不正确','10','system_login_result',0,'primary','','登陆结果 - 账号或密码不正确','','2021-01-18 06:17:54','1','2022-02-16 13:24:27',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(41,20,'用户被禁用','20','system_login_result',0,'warning','','登陆结果 - 用户被禁用','','2021-01-18 06:17:54','1','2022-02-16 13:23:57',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(42,30,'验证码不存在','30','system_login_result',0,'info','','登陆结果 - 验证码不存在','','2021-01-18 06:17:54','1','2022-02-16 13:24:07',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(43,31,'验证码不正确','31','system_login_result',0,'info','','登陆结果 - 验证码不正确','','2021-01-18 06:17:54','1','2022-02-16 13:24:11',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(44,100,'未知异常','100','system_login_result',0,'danger','','登陆结果 - 未知异常','','2021-01-18 06:17:54','1','2022-02-16 13:24:23',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(45,1,'是','true','infra_boolean_string',0,'danger','','Boolean 是否类型 - 是','','2021-01-19 03:20:55','1','2022-03-15 23:01:45',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(46,1,'否','false','infra_boolean_string',0,'info','','Boolean 是否类型 - 否','','2021-01-19 03:20:55','1','2022-03-15 23:09:45',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(47,1,'永不超时','1','infra_redis_timeout_type',0,'primary','','Redis 未设置超时的情况','','2021-01-26 00:53:17','1','2022-02-16 19:03:35',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(48,1,'动态超时','2','infra_redis_timeout_type',0,'info','','程序里动态传入超时时间,无法固定','','2021-01-26 00:55:00','1','2022-02-16 19:03:41',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(49,3,'固定超时','3','infra_redis_timeout_type',0,'success','','Redis 设置了过期时间','','2021-01-26 00:55:26','1','2022-02-16 19:03:45',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(50,1,'单表(增删改查)','1','infra_codegen_template_type',0,'','',null,'','2021-02-05 07:09:06','','2022-03-10 16:33:15',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(51,2,'树表(增删改查)','2','infra_codegen_template_type',0,'','',null,'','2021-02-05 07:14:46','','2022-03-10 16:33:19',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(53,0,'初始化中','0','infra_job_status',0,'primary','',null,'','2021-02-07 07:46:49','1','2022-02-16 19:33:29',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(57,0,'运行中','0','infra_job_log_status',0,'primary','','RUNNING','','2021-02-08 10:04:24','1','2022-02-16 19:07:48',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(58,1,'成功','1','infra_job_log_status',0,'success','',null,'','2021-02-08 10:06:57','1','2022-02-16 19:07:52',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(59,2,'失败','2','infra_job_log_status',0,'warning','','失败','','2021-02-08 10:07:38','1','2022-02-16 19:07:56',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(60,1,'会员','1','user_type',0,'primary','',null,'','2021-02-26 00:16:27','1','2022-02-16 10:22:19',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(61,2,'管理员','2','user_type',0,'success','',null,'','2021-02-26 00:16:34','1','2022-02-16 10:22:22',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(62,0,'未处理','0','infra_api_error_log_process_status',0,'primary','',null,'','2021-02-26 07:07:19','1','2022-02-16 20:14:17',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(63,1,'已处理','1','infra_api_error_log_process_status',0,'success','',null,'','2021-02-26 07:07:26','1','2022-02-16 20:14:08',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(64,2,'已忽略','2','infra_api_error_log_process_status',0,'danger','',null,'','2021-02-26 07:07:34','1','2022-02-16 20:14:14',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(66,2,'阿里云','ALIYUN','system_sms_channel_code',0,'primary','',null,'1','2021-04-05 01:05:26','1','2022-02-16 10:09:52',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(67,1,'验证码','1','system_sms_template_type',0,'warning','',null,'1','2021-04-05 21:50:57','1','2022-02-16 12:48:30',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(68,2,'通知','2','system_sms_template_type',0,'primary','',null,'1','2021-04-05 21:51:08','1','2022-02-16 12:48:27',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(69,0,'营销','3','system_sms_template_type',0,'danger','',null,'1','2021-04-05 21:51:15','1','2022-02-16 12:48:22',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(70,0,'初始化','0','system_sms_send_status',0,'primary','',null,'1','2021-04-11 20:18:33','1','2022-02-16 10:26:07',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(71,1,'发送成功','10','system_sms_send_status',0,'success','',null,'1','2021-04-11 20:18:43','1','2022-02-16 10:25:56',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(72,2,'发送失败','20','system_sms_send_status',0,'danger','',null,'1','2021-04-11 20:18:49','1','2022-02-16 10:26:03',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(73,3,'不发送','30','system_sms_send_status',0,'info','',null,'1','2021-04-11 20:19:44','1','2022-02-16 10:26:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(74,0,'等待结果','0','system_sms_receive_status',0,'primary','',null,'1','2021-04-11 20:27:43','1','2022-02-16 10:28:24',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(75,1,'接收成功','10','system_sms_receive_status',0,'success','',null,'1','2021-04-11 20:29:25','1','2022-02-16 10:28:28',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(76,2,'接收失败','20','system_sms_receive_status',0,'danger','',null,'1','2021-04-11 20:29:31','1','2022-02-16 10:28:32',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(77,0,'调试(钉钉)','DEBUG_DING_TALK','system_sms_channel_code',0,'info','',null,'1','2021-04-13 00:20:37','1','2022-02-16 10:10:00',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(78,1,'自动生成','1','system_error_code_type',0,'warning','',null,'1','2021-04-21 00:06:48','1','2022-02-16 13:57:20',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(79,2,'手动编辑','2','system_error_code_type',0,'primary','',null,'1','2021-04-21 00:07:14','1','2022-02-16 13:57:24',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(80,100,'账号登录','100','system_login_type',0,'primary','','账号登录','1','2021-10-06 00:52:02','1','2022-02-16 13:11:34',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(81,101,'社交登录','101','system_login_type',0,'info','','社交登录','1','2021-10-06 00:52:17','1','2022-02-16 13:11:40',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(83,200,'主动登出','200','system_login_type',0,'primary','','主动登出','1','2021-10-06 00:52:58','1','2022-02-16 13:11:49',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(85,202,'强制登出','202','system_login_type',0,'danger','','强制退出','1','2021-10-06 00:53:41','1','2022-02-16 13:11:57',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(86,0,'病假','1','bpm_oa_leave_type',0,'primary','',null,'1','2021-09-21 22:35:28','1','2022-02-16 10:00:41',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(87,1,'事假','2','bpm_oa_leave_type',0,'info','',null,'1','2021-09-21 22:36:11','1','2022-02-16 10:00:49',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(88,2,'婚假','3','bpm_oa_leave_type',0,'warning','',null,'1','2021-09-21 22:36:38','1','2022-02-16 10:00:53',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(98,1,'v2','v2','pay_channel_wechat_version',0,'','','v2版本','1','2021-11-08 17:00:58','1','2021-11-08 17:00:58',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(99,2,'v3','v3','pay_channel_wechat_version',0,'','','v3版本','1','2021-11-08 17:01:07','1','2021-11-08 17:01:07',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(108,1,'RSA2','RSA2','pay_channel_alipay_sign_type',0,'','','RSA2','1','2021-11-18 15:39:29','1','2021-11-18 15:39:29',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(109,1,'公钥模式','1','pay_channel_alipay_mode',0,'','','公钥模式:privateKey + alipayPublicKey','1','2021-11-18 15:45:23','1','2021-11-18 15:45:23',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(110,2,'证书模式','2','pay_channel_alipay_mode',0,'','','证书模式:appCertContent + alipayPublicCertContent + rootCertContent','1','2021-11-18 15:45:40','1','2021-11-18 15:45:40',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(111,1,'线上','https://openapi.alipay.com/gateway.do','pay_channel_alipay_server_type',0,'','','网关地址 - 线上','1','2021-11-18 16:59:32','1','2021-11-21 17:37:29',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(112,2,'沙箱','https://openapi.alipaydev.com/gateway.do','pay_channel_alipay_server_type',0,'','','网关地址 - 沙箱','1','2021-11-18 16:59:48','1','2021-11-21 17:37:39',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(113,1,'微信 JSAPI 支付','wx_pub','pay_channel_code_type',0,'','','微信 JSAPI(公众号) 支付','1','2021-12-03 10:40:24','1','2021-12-04 16:41:00',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(114,2,'微信小程序支付','wx_lite','pay_channel_code_type',0,'','','微信小程序支付','1','2021-12-03 10:41:06','1','2021-12-03 10:41:06',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(115,3,'微信 App 支付','wx_app','pay_channel_code_type',0,'','','微信 App 支付','1','2021-12-03 10:41:20','1','2021-12-03 10:41:20',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(116,4,'支付宝 PC 网站支付','alipay_pc','pay_channel_code_type',0,'','','支付宝 PC 网站支付','1','2021-12-03 10:42:09','1','2021-12-03 10:42:09',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(117,5,'支付宝 Wap 网站支付','alipay_wap','pay_channel_code_type',0,'','','支付宝 Wap 网站支付','1','2021-12-03 10:42:26','1','2021-12-03 10:42:26',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(118,6,'支付宝App 支付','alipay_app','pay_channel_code_type',0,'','','支付宝App 支付','1','2021-12-03 10:42:55','1','2021-12-03 10:42:55',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(119,7,'支付宝扫码支付','alipay_qr','pay_channel_code_type',0,'','','支付宝扫码支付','1','2021-12-03 10:43:10','1','2021-12-03 10:43:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(120,1,'通知成功','10','pay_order_notify_status',0,'success','','通知成功','1','2021-12-03 11:02:41','1','2022-02-16 13:59:13',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(121,2,'通知失败','20','pay_order_notify_status',0,'danger','','通知失败','1','2021-12-03 11:02:59','1','2022-02-16 13:59:17',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(122,3,'未通知','0','pay_order_notify_status',0,'info','','未通知','1','2021-12-03 11:03:10','1','2022-02-16 13:59:23',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(123,1,'支付成功','10','pay_order_status',0,'success','','支付成功','1','2021-12-03 11:18:29','1','2022-02-16 15:24:25',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(124,2,'支付关闭','20','pay_order_status',0,'danger','','支付关闭','1','2021-12-03 11:18:42','1','2022-02-16 15:24:31',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(125,3,'未支付','0','pay_order_status',0,'info','','未支付','1','2021-12-03 11:18:18','1','2022-02-16 15:24:35',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(126,1,'未退款','0','pay_order_refund_status',0,'','','未退款','1','2021-12-03 11:30:35','1','2021-12-03 11:34:05',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(127,2,'部分退款','10','pay_order_refund_status',0,'','','部分退款','1','2021-12-03 11:30:44','1','2021-12-03 11:34:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(128,3,'全部退款','20','pay_order_refund_status',0,'','','全部退款','1','2021-12-03 11:30:52','1','2021-12-03 11:34:14',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1117,1,'退款订单生成','0','pay_refund_order_status',0,'primary','','退款订单生成','1','2021-12-10 16:44:44','1','2022-02-16 14:05:24',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1118,2,'退款成功','1','pay_refund_order_status',0,'success','','退款成功','1','2021-12-10 16:44:59','1','2022-02-16 14:05:28',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1119,3,'退款失败','2','pay_refund_order_status',0,'danger','','退款失败','1','2021-12-10 16:45:10','1','2022-02-16 14:05:34',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1124,8,'退款关闭','99','pay_refund_order_status',0,'info','','退款关闭','1','2021-12-10 16:46:26','1','2022-02-16 14:05:40',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1125,0,'默认','1','bpm_model_category',0,'primary','','流程分类 - 默认','1','2022-01-02 08:41:11','1','2022-02-16 20:01:42',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1126,0,'OA','2','bpm_model_category',0,'success','','流程分类 - OA','1','2022-01-02 08:41:22','1','2022-02-16 20:01:50',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1127,0,'进行中','1','bpm_process_instance_status',0,'primary','','流程实例的状态 - 进行中','1','2022-01-07 23:47:22','1','2022-02-16 20:07:49',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1128,2,'已完成','2','bpm_process_instance_status',0,'success','','流程实例的状态 - 已完成','1','2022-01-07 23:47:49','1','2022-02-16 20:07:54',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1129,1,'处理中','1','bpm_process_instance_result',0,'primary','','流程实例的结果 - 处理中','1','2022-01-07 23:48:32','1','2022-02-16 09:53:26',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1130,2,'通过','2','bpm_process_instance_result',0,'success','','流程实例的结果 - 通过','1','2022-01-07 23:48:45','1','2022-02-16 09:53:31',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1131,3,'不通过','3','bpm_process_instance_result',0,'danger','','流程实例的结果 - 不通过','1','2022-01-07 23:48:55','1','2022-02-16 09:53:38',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1132,4,'已取消','4','bpm_process_instance_result',0,'info','','流程实例的结果 - 撤销','1','2022-01-07 23:49:06','1','2022-02-16 09:53:42',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1133,10,'流程表单','10','bpm_model_form_type',0,'','','流程的表单类型 - 流程表单','103','2022-01-11 23:51:30','103','2022-01-11 23:51:30',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1134,20,'业务表单','20','bpm_model_form_type',0,'','','流程的表单类型 - 业务表单','103','2022-01-11 23:51:47','103','2022-01-11 23:51:47',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1135,10,'角色','10','bpm_task_assign_rule_type',0,'info','','任务分配规则的类型 - 角色','103','2022-01-12 23:21:22','1','2022-02-16 20:06:14',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1136,20,'部门的成员','20','bpm_task_assign_rule_type',0,'primary','','任务分配规则的类型 - 部门的成员','103','2022-01-12 23:21:47','1','2022-02-16 20:05:28',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1137,21,'部门的负责人','21','bpm_task_assign_rule_type',0,'primary','','任务分配规则的类型 - 部门的负责人','103','2022-01-12 23:33:36','1','2022-02-16 20:05:31',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1138,30,'用户','30','bpm_task_assign_rule_type',0,'info','','任务分配规则的类型 - 用户','103','2022-01-12 23:34:02','1','2022-02-16 20:05:50',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1139,40,'用户组','40','bpm_task_assign_rule_type',0,'warning','','任务分配规则的类型 - 用户组','103','2022-01-12 23:34:21','1','2022-02-16 20:05:57',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1140,50,'自定义脚本','50','bpm_task_assign_rule_type',0,'danger','','任务分配规则的类型 - 自定义脚本','103','2022-01-12 23:34:43','1','2022-02-16 20:06:01',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1141,22,'岗位','22','bpm_task_assign_rule_type',0,'success','','任务分配规则的类型 - 岗位','103','2022-01-14 18:41:55','1','2022-02-16 20:05:39',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1142,10,'流程发起人','10','bpm_task_assign_script',0,'','','任务分配自定义脚本 - 流程发起人','103','2022-01-15 00:10:57','103','2022-01-15 21:24:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1143,20,'流程发起人的一级领导','20','bpm_task_assign_script',0,'','','任务分配自定义脚本 - 流程发起人的一级领导','103','2022-01-15 21:24:31','103','2022-01-15 21:24:31',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1144,21,'流程发起人的二级领导','21','bpm_task_assign_script',0,'','','任务分配自定义脚本 - 流程发起人的二级领导','103','2022-01-15 21:24:46','103','2022-01-15 21:24:57',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1145,1,'管理后台','1','infra_codegen_scene',0,'','','代码生成的场景枚举 - 管理后台','1','2022-02-02 13:15:06','1','2022-03-10 16:32:59',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1146,2,'用户 APP','2','infra_codegen_scene',0,'','','代码生成的场景枚举 - 用户 APP','1','2022-02-02 13:15:19','1','2022-03-10 16:33:03',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1147,0,'未退款','0','pay_refund_order_type',0,'info','','退款类型 - 未退款','1','2022-02-16 14:09:01','1','2022-02-16 14:09:01',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1148,10,'部分退款','10','pay_refund_order_type',0,'success','','退款类型 - 部分退款','1','2022-02-16 14:09:25','1','2022-02-16 14:11:38',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1149,20,'全部退款','20','pay_refund_order_type',0,'warning','','退款类型 - 全部退款','1','2022-02-16 14:11:33','1','2022-02-16 14:11:33',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1150,1,'数据库','1','infra_file_storage',0,'default','',null,'1','2022-03-15 00:25:28','1','2022-03-15 00:25:28',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1151,10,'本地磁盘','10','infra_file_storage',0,'default','',null,'1','2022-03-15 00:25:41','1','2022-03-15 00:25:56',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1152,11,'FTP 服务器','11','infra_file_storage',0,'default','',null,'1','2022-03-15 00:26:06','1','2022-03-15 00:26:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1153,12,'SFTP 服务器','12','infra_file_storage',0,'default','',null,'1','2022-03-15 00:26:22','1','2022-03-15 00:26:22',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1154,20,'S3 对象存储','20','infra_file_storage',0,'default','',null,'1','2022-03-15 00:26:31','1','2022-03-15 00:26:45',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1155,103,'短信登录','103','system_login_type',0,'default','',null,'1','2022-05-09 23:57:58','1','2022-05-09 23:58:09',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1156,1,'password','password','system_oauth2_grant_type',0,'default','','密码模式','1','2022-05-12 00:22:05','1','2022-05-11 16:26:01',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1157,2,'authorization_code','authorization_code','system_oauth2_grant_type',0,'primary','','授权码模式','1','2022-05-12 00:22:59','1','2022-05-11 16:26:02',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1158,3,'implicit','implicit','system_oauth2_grant_type',0,'success','','简化模式','1','2022-05-12 00:23:40','1','2022-05-11 16:26:05',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1159,4,'client_credentials','client_credentials','system_oauth2_grant_type',0,'default','','客户端模式','1','2022-05-12 00:23:51','1','2022-05-11 16:26:08',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1160,5,'refresh_token','refresh_token','system_oauth2_grant_type',0,'info','','刷新模式','1','2022-05-12 00:24:02','1','2022-05-11 16:26:11',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1162,1,'销售中','1','product_spu_status',0,'success','','商品 SPU 状态 - 销售中','1','2022-10-24 21:19:47','1','2022-10-24 21:20:38',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1163,0,'仓库中','0','product_spu_status',0,'info','','商品 SPU 状态 - 仓库中','1','2022-10-24 21:20:54','1','2022-10-24 21:21:22',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1164,0,'回收站','-1','product_spu_status',0,'default','','商品 SPU 状态 - 回收站','1','2022-10-24 21:21:11','1','2022-10-24 21:21:11',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1165,1,'满减','1','promotion_discount_type',0,'success','','优惠类型 - 满减','1','2022-11-01 12:46:41','1','2022-11-01 12:50:11',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1166,2,'折扣','2','promotion_discount_type',0,'primary','','优惠类型 - 折扣','1','2022-11-01 12:46:51','1','2022-11-01 12:50:08',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1167,1,'固定日期','1','promotion_coupon_template_validity_type',0,'default','','优惠劵模板的有限期类型 - 固定日期','1','2022-11-02 00:07:34','1','2022-11-04 00:07:49',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1168,2,'领取之后','2','promotion_coupon_template_validity_type',0,'default','','优惠劵模板的有限期类型 - 领取之后','1','2022-11-02 00:07:54','1','2022-11-04 00:07:52',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1169,1,'全部商品参与','1','promotion_product_scope',0,'default','','营销的商品范围 - 全部商品参与','1','2022-11-02 00:28:22','1','2022-11-02 00:28:22',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1170,2,'指定商品参与','2','promotion_product_scope',0,'default','','营销的商品范围 - 指定商品参与','1','2022-11-02 00:28:34','1','2022-11-02 00:28:40',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1171,1,'已领取','1','promotion_coupon_status',0,'primary','','优惠劵的状态 - 已领取','1','2022-11-04 00:15:08','1','2022-11-04 19:16:04',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1172,2,'已使用','2','promotion_coupon_status',0,'success','','优惠劵的状态 - 已使用','1','2022-11-04 00:15:21','1','2022-11-04 19:16:08',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1173,3,'已过期','3','promotion_coupon_status',0,'info','','优惠劵的状态 - 已过期','1','2022-11-04 00:15:43','1','2022-11-04 19:16:12',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1174,1,'直接领取','1','promotion_coupon_take_type',0,'primary','','优惠劵的领取方式 - 直接领取','1','2022-11-04 19:13:00','1','2022-11-04 19:13:25',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1175,2,'指定发放','2','promotion_coupon_take_type',0,'success','','优惠劵的领取方式 - 指定发放','1','2022-11-04 19:13:13','1','2022-11-04 19:14:48',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1176,10,'未开始','10','promotion_activity_status',0,'primary','','促销活动的状态枚举 - 未开始','1','2022-11-04 22:54:49','1','2022-11-04 22:55:53',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1177,20,'进行中','20','promotion_activity_status',0,'success','','促销活动的状态枚举 - 进行中','1','2022-11-04 22:55:06','1','2022-11-04 22:55:20',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1178,30,'已结束','30','promotion_activity_status',0,'info','','促销活动的状态枚举 - 已结束','1','2022-11-04 22:55:41','1','2022-11-04 22:55:41',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1179,40,'已关闭','40','promotion_activity_status',0,'warning','','促销活动的状态枚举 - 已关闭','1','2022-11-04 22:56:10','1','2022-11-04 22:56:18',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1180,10,'满 N 元','10','promotion_condition_type',0,'primary','','营销的条件类型 - 满 N 元','1','2022-11-04 22:59:45','1','2022-11-04 22:59:45',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1181,20,'满 N 件','20','promotion_condition_type',0,'success','','营销的条件类型 - 满 N 件','1','2022-11-04 23:00:02','1','2022-11-04 23:00:02',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1182,10,'申请售后','10','trade_after_sale_status',0,'primary','','交易售后状态 - 申请售后','1','2022-11-19 20:53:33','1','2022-11-19 20:54:42',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1183,20,'商品待退货','20','trade_after_sale_status',0,'primary','','交易售后状态 - 商品待退货','1','2022-11-19 20:54:36','1','2022-11-19 20:58:58',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1184,30,'商家待收货','30','trade_after_sale_status',0,'primary','','交易售后状态 - 商家待收货','1','2022-11-19 20:56:56','1','2022-11-19 20:59:20',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1185,40,'等待退款','40','trade_after_sale_status',0,'primary','','交易售后状态 - 等待退款','1','2022-11-19 20:59:54','1','2022-11-19 21:00:01',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1186,50,'退款成功','50','trade_after_sale_status',0,'default','','交易售后状态 - 退款成功','1','2022-11-19 21:00:33','1','2022-11-19 21:00:33',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1187,61,'买家取消','61','trade_after_sale_status',0,'info','','交易售后状态 - 买家取消','1','2022-11-19 21:01:29','1','2022-11-19 21:01:29',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1188,62,'商家拒绝','62','trade_after_sale_status',0,'info','','交易售后状态 - 商家拒绝','1','2022-11-19 21:02:17','1','2022-11-19 21:02:17',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1189,63,'商家拒收货','63','trade_after_sale_status',0,'info','','交易售后状态 - 商家拒收货','1','2022-11-19 21:02:37','1','2022-11-19 21:03:07',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1190,10,'售中退款','10','trade_after_sale_type',0,'success','','交易售后的类型 - 售中退款','1','2022-11-19 21:05:05','1','2022-11-19 21:38:23',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1191,20,'售后退款','20','trade_after_sale_type',0,'primary','','交易售后的类型 - 售后退款','1','2022-11-19 21:05:32','1','2022-11-19 21:38:32',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1192,10,'仅退款','10','trade_after_sale_way',0,'primary','','交易售后的方式 - 仅退款','1','2022-11-19 21:39:19','1','2022-11-19 21:39:19',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1193,20,'退货退款','20','trade_after_sale_way',0,'success','','交易售后的方式 - 退货退款','1','2022-11-19 21:39:38','1','2022-11-19 21:39:49',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1194,10,'微信小程序','10','terminal',0,'default','','终端 - 微信小程序','1','2022-12-10 10:51:11','1','2022-12-10 10:51:57',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1195,20,'H5 网页','20','terminal',0,'default','','终端 - H5 网页','1','2022-12-10 10:51:30','1','2022-12-10 10:51:59',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1196,11,'微信公众号','11','terminal',0,'default','','终端 - 微信公众号','1','2022-12-10 10:54:16','1','2022-12-10 10:52:01',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1197,31,'苹果 App','31','terminal',0,'default','','终端 - 苹果 App','1','2022-12-10 10:54:42','1','2022-12-10 10:52:18',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1198,32,'安卓 App','32','terminal',0,'default','','终端 - 安卓 App','1','2022-12-10 10:55:02','1','2022-12-10 10:59:17',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1199,0,'普通订单','0','trade_order_type',0,'default','','交易订单的类型 - 普通订单','1','2022-12-10 16:34:14','1','2022-12-10 16:34:14',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1200,1,'秒杀订单','1','trade_order_type',0,'default','','交易订单的类型 - 秒杀订单','1','2022-12-10 16:34:26','1','2022-12-10 16:34:26',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1201,2,'拼团订单','2','trade_order_type',0,'default','','交易订单的类型 - 拼团订单','1','2022-12-10 16:34:36','1','2022-12-10 16:34:36',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1202,3,'砍价订单','3','trade_order_type',0,'default','','交易订单的类型 - 砍价订单','1','2022-12-10 16:34:48','1','2022-12-10 16:34:48',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1203,0,'待支付','0','trade_order_status',0,'default','','交易订单状态 - 待支付','1','2022-12-10 16:49:29','1','2022-12-10 16:49:29',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1204,10,'待发货','10','trade_order_status',0,'primary','','交易订单状态 - 待发货','1','2022-12-10 16:49:53','1','2022-12-10 16:51:17',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1205,20,'已发货','20','trade_order_status',0,'primary','','交易订单状态 - 已发货','1','2022-12-10 16:50:13','1','2022-12-10 16:51:31',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1206,30,'已完成','30','trade_order_status',0,'success','','交易订单状态 - 已完成','1','2022-12-10 16:50:30','1','2022-12-10 16:51:06',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1207,40,'已取消','40','trade_order_status',0,'danger','','交易订单状态 - 已取消','1','2022-12-10 16:50:50','1','2022-12-10 16:51:00',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1208,0,'未售后','0','trade_order_item_after_sale_status',0,'info','','交易订单项的售后状态 - 未售后','1','2022-12-10 20:58:42','1','2022-12-10 20:59:29',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1209,1,'售后中','1','trade_order_item_after_sale_status',0,'primary','','交易订单项的售后状态 - 售后中','1','2022-12-10 20:59:21','1','2022-12-10 20:59:21',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1210,2,'已退款','2','trade_order_item_after_sale_status',0,'success','','交易订单项的售后状态 - 已退款','1','2022-12-10 20:59:46','1','2022-12-10 20:59:46',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1211,1,'完全匹配','1','mp_auto_reply_request_match',0,'primary','','公众号自动回复的请求关键字匹配模式 - 完全匹配','1','2023-01-16 23:30:39','1','2023-01-16 23:31:00',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1212,2,'半匹配','2','mp_auto_reply_request_match',0,'success','','公众号自动回复的请求关键字匹配模式 - 半匹配','1','2023-01-16 23:30:55','1','2023-01-16 23:31:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1213,1,'文本','text','mp_message_type',0,'default','','公众号的消息类型 - 文本','1','2023-01-17 22:17:32','1','2023-01-17 22:17:39',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1214,2,'图片','image','mp_message_type',0,'default','','公众号的消息类型 - 图片','1','2023-01-17 22:17:32','1','2023-01-17 14:19:47',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1215,3,'语音','voice','mp_message_type',0,'default','','公众号的消息类型 - 语音','1','2023-01-17 22:17:32','1','2023-01-17 14:20:08',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1216,4,'视频','video','mp_message_type',0,'default','','公众号的消息类型 - 视频','1','2023-01-17 22:17:32','1','2023-01-17 14:21:08',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1217,5,'小视频','shortvideo','mp_message_type',0,'default','','公众号的消息类型 - 小视频','1','2023-01-17 22:17:32','1','2023-01-17 14:19:59',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1218,6,'图文','news','mp_message_type',0,'default','','公众号的消息类型 - 图文','1','2023-01-17 22:17:32','1','2023-01-17 14:22:54',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1219,7,'音乐','music','mp_message_type',0,'default','','公众号的消息类型 - 音乐','1','2023-01-17 22:17:32','1','2023-01-17 14:22:54',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1220,8,'地理位置','location','mp_message_type',0,'default','','公众号的消息类型 - 地理位置','1','2023-01-17 22:17:32','1','2023-01-17 14:23:51',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1221,9,'链接','link','mp_message_type',0,'default','','公众号的消息类型 - 链接','1','2023-01-17 22:17:32','1','2023-01-17 14:24:49',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1222,10,'事件','event','mp_message_type',0,'default','','公众号的消息类型 - 事件','1','2023-01-17 22:17:32','1','2023-01-17 14:24:49',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1223,0,'初始化','0','system_mail_send_status',0,'primary','','邮件发送状态 - 初始化 +','1','2023-01-26 09:53:49','1','2023-01-26 16:36:14',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1224,10,'发送成功','10','system_mail_send_status',0,'success','','邮件发送状态 - 发送成功','1','2023-01-26 09:54:28','1','2023-01-26 16:36:22',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1225,20,'发送失败','20','system_mail_send_status',0,'danger','','邮件发送状态 - 发送失败','1','2023-01-26 09:54:50','1','2023-01-26 16:36:26',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1226,30,'不发送','30','system_mail_send_status',0,'info','','邮件发送状态 - 不发送','1','2023-01-26 09:55:06','1','2023-01-26 16:36:36',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1227,1,'通知公告','1','system_notify_template_type',0,'primary','','站内信模版的类型 - 通知公告','1','2023-01-28 10:35:59','1','2023-01-28 10:35:59',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1228,2,'系统消息','2','system_notify_template_type',0,'success','','站内信模版的类型 - 系统消息','1','2023-01-28 10:36:20','1','2023-01-28 10:36:25',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1229,0,'模拟支付','mock','pay_channel_code_type',0,'default','',null,'1','2023-02-12 21:50:22','1','2023-02-12 21:50:22',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1230,8,'支付宝条码支付','alipay_bar','pay_channel_code_type',0,'default','',null,'1','2023-02-18 23:32:24','1','2023-02-18 23:32:32',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1231,10,'Vue2 Element UI 标准模版','10','infra_codegen_front_type',0,'','','','1','2023-04-13 00:03:55','1','2023-04-13 00:03:55',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1232,20,'Vue3 Element Plus 标准模版','20','infra_codegen_front_type',0,'','','','1','2023-04-13 00:04:08','1','2023-04-13 00:04:08',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1233,21,'Vue3 Element Plus Schema 模版','21','infra_codegen_front_type',0,'','','','1','2023-04-13 00:04:26','1','2023-04-13 00:04:26',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"("ID","SORT","LABEL","VALUE","DICT_TYPE","STATUS","COLOR_TYPE","CSS_CLASS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1234,30,'Vue3 vben 模版','30','infra_codegen_front_type',0,'','','','1','2023-04-13 00:04:26','1','2023-04-13 00:04:26',0); + +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE" ON; +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(1,'用户性别','system_user_sex',0,null,'admin','2021-01-05 17:03:48','1','2022-05-16 20:29:32',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(6,'参数类型','infra_config_type',0,null,'admin','2021-01-05 17:03:48','','2022-02-01 16:36:54',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(7,'通知类型','system_notice_type',0,null,'admin','2021-01-05 17:03:48','','2022-02-01 16:35:26',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(9,'操作类型','system_operate_type',0,null,'admin','2021-01-05 17:03:48','1','2022-02-16 09:32:21',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(10,'系统状态','common_status',0,null,'admin','2021-01-05 17:03:48','','2022-02-01 16:21:28',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(11,'Boolean 是否类型','infra_boolean_string',0,'boolean 转是否','','2021-01-19 03:20:08','','2022-02-01 16:37:10',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(104,'登陆结果','system_login_result',0,'登陆结果','','2021-01-18 06:17:11','','2022-02-01 16:36:00',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(105,'Redis 超时类型','infra_redis_timeout_type',0,'RedisKeyDefine.TimeoutTypeEnum','','2021-01-26 00:52:50','','2022-02-01 16:50:29',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(106,'代码生成模板类型','infra_codegen_template_type',0,null,'','2021-02-05 07:08:06','1','2022-05-16 20:26:50',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(107,'定时任务状态','infra_job_status',0,null,'','2021-02-07 07:44:16','','2022-02-01 16:51:11',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(108,'定时任务日志状态','infra_job_log_status',0,null,'','2021-02-08 10:03:51','','2022-02-01 16:50:43',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(109,'用户类型','user_type',0,null,'','2021-02-26 00:15:51','','2021-02-26 00:15:51',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(110,'API 异常数据的处理状态','infra_api_error_log_process_status',0,null,'','2021-02-26 07:07:01','','2022-02-01 16:50:53',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(111,'短信渠道编码','system_sms_channel_code',0,null,'1','2021-04-05 01:04:50','1','2022-02-16 02:09:08',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(112,'短信模板的类型','system_sms_template_type',0,null,'1','2021-04-05 21:50:43','1','2022-02-01 16:35:06',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(113,'短信发送状态','system_sms_send_status',0,null,'1','2021-04-11 20:18:03','1','2022-02-01 16:35:09',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(114,'短信接收状态','system_sms_receive_status',0,null,'1','2021-04-11 20:27:14','1','2022-02-01 16:35:14',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(115,'错误码的类型','system_error_code_type',0,null,'1','2021-04-21 00:06:30','1','2022-02-01 16:36:49',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(116,'登陆日志的类型','system_login_type',0,'登陆日志的类型','1','2021-10-06 00:50:46','1','2022-02-01 16:35:56',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(117,'OA 请假类型','bpm_oa_leave_type',0,null,'1','2021-09-21 22:34:33','1','2022-01-22 10:41:37',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(122,'支付渠道微信版本','pay_channel_wechat_version',0,'支付渠道微信版本','1','2021-11-08 17:00:26','1','2021-11-08 17:00:26',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(127,'支付渠道支付宝算法类型','pay_channel_alipay_sign_type',0,'支付渠道支付宝算法类型','1','2021-11-18 15:39:09','1','2021-11-18 15:39:09',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(128,'支付渠道支付宝公钥类型','pay_channel_alipay_mode',0,'支付渠道支付宝公钥类型','1','2021-11-18 15:44:28','1','2021-11-18 15:44:28',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(129,'支付宝网关地址','pay_channel_alipay_server_type',0,'支付宝网关地址','1','2021-11-18 16:58:55','1','2021-11-18 17:01:34',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(130,'支付渠道编码类型','pay_channel_code_type',0,'支付渠道的编码','1','2021-12-03 10:35:08','1','2021-12-03 10:35:08',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(131,'支付订单回调状态','pay_order_notify_status',0,'支付订单回调状态','1','2021-12-03 10:53:29','1','2021-12-03 10:53:29',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(132,'支付订单状态','pay_order_status',0,'支付订单状态','1','2021-12-03 11:17:50','1','2021-12-03 11:17:50',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(133,'支付订单退款状态','pay_order_refund_status',0,'支付订单退款状态','1','2021-12-03 11:27:31','1','2021-12-03 11:27:31',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(134,'退款订单状态','pay_refund_order_status',0,'退款订单状态','1','2021-12-10 16:42:50','1','2021-12-10 16:42:50',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(135,'退款订单类别','pay_refund_order_type',0,'退款订单类别','1','2021-12-10 17:14:53','1','2021-12-10 17:14:53',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(138,'流程分类','bpm_model_category',0,'流程分类','1','2022-01-02 08:40:45','1','2022-01-02 08:40:45',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(139,'流程实例的状态','bpm_process_instance_status',0,'流程实例的状态','1','2022-01-07 23:46:42','1','2022-01-07 23:46:42',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(140,'流程实例的结果','bpm_process_instance_result',0,'流程实例的结果','1','2022-01-07 23:48:10','1','2022-01-07 23:48:10',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(141,'流程的表单类型','bpm_model_form_type',0,'流程的表单类型','103','2022-01-11 23:50:45','103','2022-01-11 23:50:45',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(142,'任务分配规则的类型','bpm_task_assign_rule_type',0,'任务分配规则的类型','103','2022-01-12 23:21:04','103','2022-01-12 15:46:10',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(143,'任务分配自定义脚本','bpm_task_assign_script',0,'任务分配自定义脚本','103','2022-01-15 00:10:35','103','2022-01-15 00:10:35',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(144,'代码生成的场景枚举','infra_codegen_scene',0,'代码生成的场景枚举','1','2022-02-02 13:14:45','1','2022-03-10 16:33:46',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(145,'角色类型','system_role_type',0,'角色类型','1','2022-02-16 13:01:46','1','2022-02-16 13:01:46',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(146,'文件存储器','infra_file_storage',0,'文件存储器','1','2022-03-15 00:24:38','1','2022-03-15 00:24:38',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(147,'OAuth 2.0 授权类型','system_oauth2_grant_type',0,'OAuth 2.0 授权类型(模式)','1','2022-05-12 00:20:52','1','2022-05-11 16:25:49',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(149,'商品 SPU 状态','product_spu_status',0,'商品 SPU 状态','1','2022-10-24 21:19:04','1','2022-10-24 21:19:08',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(150,'优惠类型','promotion_discount_type',0,'优惠类型','1','2022-11-01 12:46:06','1','2022-11-01 12:46:06',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(151,'优惠劵模板的有限期类型','promotion_coupon_template_validity_type',0,'优惠劵模板的有限期类型','1','2022-11-02 00:06:20','1','2022-11-04 00:08:26',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(152,'营销的商品范围','promotion_product_scope',0,'营销的商品范围','1','2022-11-02 00:28:01','1','2022-11-02 00:28:01',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(153,'优惠劵的状态','promotion_coupon_status',0,'优惠劵的状态','1','2022-11-04 00:14:49','1','2022-11-04 00:14:49',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(154,'优惠劵的领取方式','promotion_coupon_take_type',0,'优惠劵的领取方式','1','2022-11-04 19:12:27','1','2022-11-04 19:12:27',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(155,'促销活动的状态','promotion_activity_status',0,'促销活动的状态','1','2022-11-04 22:54:23','1','2022-11-04 22:54:23',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(156,'营销的条件类型','promotion_condition_type',0,'营销的条件类型','1','2022-11-04 22:59:23','1','2022-11-04 22:59:23',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(157,'交易售后状态','trade_after_sale_status',0,'交易售后状态','1','2022-11-19 20:52:56','1','2022-11-19 20:52:56',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(158,'交易售后的类型','trade_after_sale_type',0,'交易售后的类型','1','2022-11-19 21:04:09','1','2022-11-19 21:04:09',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(159,'交易售后的方式','trade_after_sale_way',0,'交易售后的方式','1','2022-11-19 21:39:04','1','2022-11-19 21:39:04',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(160,'终端','terminal',0,'终端','1','2022-12-10 10:50:50','1','2022-12-10 10:53:11',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(161,'交易订单的类型','trade_order_type',0,'交易订单的类型','1','2022-12-10 16:33:54','1','2022-12-10 16:33:54',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(162,'交易订单的状态','trade_order_status',0,'交易订单的状态','1','2022-12-10 16:48:44','1','2022-12-10 16:48:44',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(163,'交易订单项的售后状态','trade_order_item_after_sale_status',0,'交易订单项的售后状态','1','2022-12-10 20:58:08','1','2022-12-10 20:58:08',0,null); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(164,'公众号自动回复的请求关键字匹配模式','mp_auto_reply_request_match',0,'公众号自动回复的请求关键字匹配模式','1','2023-01-16 23:29:56','1','2023-01-16 23:29:56',0,'1970-01-01 00:00:00'); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(165,'公众号的消息类型','mp_message_type',0,'公众号的消息类型','1','2023-01-17 22:17:09','1','2023-01-17 22:17:09',0,'1970-01-01 00:00:00'); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(166,'邮件发送状态','system_mail_send_status',0,'邮件发送状态','1','2023-01-26 09:53:13','1','2023-01-26 09:53:13',0,'1970-01-01 00:00:00'); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(167,'站内信模版的类型','system_notify_template_type',0,'站内信模版的类型','1','2023-01-28 10:35:10','1','2023-01-28 10:35:10',0,'1970-01-01 00:00:00'); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"("ID","NAME","TYPE","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","DELETED_TIME") VALUES(168,'代码生成的前端类型','infra_codegen_front_type',0,'','1','2023-04-12 23:57:52','1','2023-04-12 23:57:52',0,'1970-01-01 00:00:00'); + +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_ERROR_CODE" ON; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_ERROR_CODE" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_LOGIN_LOG" ON; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_LOGIN_LOG" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_MAIL_ACCOUNT" ON; +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MAIL_ACCOUNT"("ID","MAIL","USERNAME","PASSWORD","HOST","PORT","SSL_ENABLE","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1,'7684413@qq.com','7684413@qq.com','123457','127.0.0.1',8080,0,'1','2023-01-25 17:39:52','1','2023-04-12 23:04:49',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MAIL_ACCOUNT"("ID","MAIL","USERNAME","PASSWORD","HOST","PORT","SSL_ENABLE","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2,'ydym_test@163.com','ydym_test@163.com','WBZTEINMIFVRYSOE','smtp.163.com',465,1,'1','2023-01-26 01:26:03','1','2023-04-12 22:39:38',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MAIL_ACCOUNT"("ID","MAIL","USERNAME","PASSWORD","HOST","PORT","SSL_ENABLE","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(3,'76854114@qq.com','3335','11234','yunai1.cn',466,0,'1','2023-01-27 15:06:38','1','2023-01-27 07:08:36',1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MAIL_ACCOUNT"("ID","MAIL","USERNAME","PASSWORD","HOST","PORT","SSL_ENABLE","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(4,'7685413x@qq.com','2','3','4',5,1,'1','2023-04-12 23:05:06','1','2023-04-12 15:05:11',1); + +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_MAIL_ACCOUNT" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_MAIL_LOG" ON; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_MAIL_LOG" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_MAIL_TEMPLATE" ON; +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MAIL_TEMPLATE"("ID","NAME","CODE","ACCOUNT_ID","NICKNAME","TITLE","CONTENT","PARAMS","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(13,'后台用户短信登录','admin-sms-login',1,'奥特曼','你猜我猜','

您的验证码是{code},名字是{name}

','["code","name"]',0,'3','1','2021-10-11 08:10:00','1','2023-01-26 23:22:05',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MAIL_TEMPLATE"("ID","NAME","CODE","ACCOUNT_ID","NICKNAME","TITLE","CONTENT","PARAMS","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(14,'测试模版','test_01',2,'芋艿','一个标题','

你是 {key01} 吗?


是的话,赶紧 {key02} 一下!

','["key01","key02"]',0,null,'1','2023-01-26 01:27:40','1','2023-01-27 10:32:16',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MAIL_TEMPLATE"("ID","NAME","CODE","ACCOUNT_ID","NICKNAME","TITLE","CONTENT","PARAMS","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(15,'3','2',2,'7','4','

45

','[]',1,'80','1','2023-01-27 15:50:35','1','2023-01-27 16:34:49',0); + +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_MAIL_TEMPLATE" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_MENU" ON; +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1,'系统管理','',1,10,0,'/system','system',null,null,0,1,1,1,'admin','2021-01-05 17:03:48','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2,'基础设施','',1,20,0,'/infra','monitor',null,null,0,1,1,1,'admin','2021-01-05 17:03:48','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(5,'OA 示例','',1,40,1185,'oa','people',null,null,0,1,1,1,'admin','2021-09-20 16:26:19','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(100,'用户管理','system:user:list',2,1,1,'user','user','system/user/index','SystemUser',0,1,1,1,'admin','2021-01-05 17:03:48','1','2023-04-08 08:31:59',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(101,'角色管理','',2,2,1,'role','peoples','system/role/index','SystemRole',0,1,1,1,'admin','2021-01-05 17:03:48','1','2023-04-08 08:33:59',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(102,'菜单管理','',2,3,1,'menu','tree-table','system/menu/index','SystemMenu',0,1,1,1,'admin','2021-01-05 17:03:48','1','2023-04-08 08:34:32',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(103,'部门管理','',2,4,1,'dept','tree','system/dept/index','SystemDept',0,1,1,1,'admin','2021-01-05 17:03:48','1','2023-04-08 08:35:32',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(104,'岗位管理','',2,5,1,'post','post','system/post/index','SystemPost',0,1,1,1,'admin','2021-01-05 17:03:48','1','2023-04-08 08:36:21',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(105,'字典管理','',2,6,1,'dict','dict','system/dict/index','SystemDictType',0,1,1,1,'admin','2021-01-05 17:03:48','1','2023-04-08 08:36:45',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(106,'配置管理','',2,6,2,'config','edit','infra/config/index','InfraConfig',0,1,1,1,'admin','2021-01-05 17:03:48','1','2023-04-08 10:31:17',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(107,'通知公告','',2,8,1,'notice','message','system/notice/index','SystemNotice',0,1,1,1,'admin','2021-01-05 17:03:48','1','2023-04-08 08:45:06',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(108,'审计日志','',1,9,1,'log','log','',null,0,1,1,1,'admin','2021-01-05 17:03:48','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(109,'令牌管理','',2,2,1261,'token','online','system/oauth2/token/index','SystemTokenClient',0,1,1,1,'admin','2021-01-05 17:03:48','1','2023-04-08 08:47:41',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(110,'定时任务','',2,12,2,'job','job','infra/job/index','InfraJob',0,1,1,1,'admin','2021-01-05 17:03:48','1','2023-04-08 10:36:49',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(111,'MySQL 监控','',2,9,2,'druid','druid','infra/druid/index','InfraDruid',0,1,1,1,'admin','2021-01-05 17:03:48','1','2023-04-08 09:09:30',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(112,'Java 监控','',2,11,2,'admin-server','server','infra/server/index','InfraAdminServer',0,1,1,1,'admin','2021-01-05 17:03:48','1','2023-04-08 10:34:08',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(113,'Redis 监控','',2,10,2,'redis','redis','infra/redis/index','InfraRedis',0,1,1,1,'admin','2021-01-05 17:03:48','1','2023-04-08 10:33:30',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(114,'表单构建','infra:build:list',2,2,2,'build','build','infra/build/index','InfraBuild',0,1,1,1,'admin','2021-01-05 17:03:48','1','2023-04-08 09:06:12',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(115,'代码生成','infra:codegen:query',2,1,2,'codegen','code','infra/codegen/index','InfraCodegen',0,1,1,1,'admin','2021-01-05 17:03:48','1','2023-04-08 09:02:24',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(116,'系统接口','infra:swagger:list',2,3,2,'swagger','swagger','infra/swagger/index','InfraSwagger',0,1,1,1,'admin','2021-01-05 17:03:48','1','2023-04-08 09:11:28',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(500,'操作日志','',2,1,108,'operate-log','form','system/operatelog/index','SystemOperateLog',0,1,1,1,'admin','2021-01-05 17:03:48','1','2023-04-08 08:47:00',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(501,'登录日志','',2,2,108,'login-log','logininfor','system/loginlog/index','SystemLoginLog',0,1,1,1,'admin','2021-01-05 17:03:48','1','2023-04-08 08:46:18',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1001,'用户查询','system:user:query',3,1,100,'','#','',null,0,1,1,1,'admin','2021-01-05 17:03:48','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1002,'用户新增','system:user:create',3,2,100,'','','',null,0,1,1,1,'admin','2021-01-05 17:03:48','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1003,'用户修改','system:user:update',3,3,100,'','','',null,0,1,1,1,'admin','2021-01-05 17:03:48','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1004,'用户删除','system:user:delete',3,4,100,'','','',null,0,1,1,1,'admin','2021-01-05 17:03:48','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1005,'用户导出','system:user:export',3,5,100,'','#','',null,0,1,1,1,'admin','2021-01-05 17:03:48','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1006,'用户导入','system:user:import',3,6,100,'','#','',null,0,1,1,1,'admin','2021-01-05 17:03:48','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1007,'重置密码','system:user:update-password',3,7,100,'','','',null,0,1,1,1,'admin','2021-01-05 17:03:48','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1008,'角色查询','system:role:query',3,1,101,'','#','',null,0,1,1,1,'admin','2021-01-05 17:03:48','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1009,'角色新增','system:role:create',3,2,101,'','','',null,0,1,1,1,'admin','2021-01-05 17:03:48','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1010,'角色修改','system:role:update',3,3,101,'','','',null,0,1,1,1,'admin','2021-01-05 17:03:48','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1011,'角色删除','system:role:delete',3,4,101,'','','',null,0,1,1,1,'admin','2021-01-05 17:03:48','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1012,'角色导出','system:role:export',3,5,101,'','#','',null,0,1,1,1,'admin','2021-01-05 17:03:48','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1013,'菜单查询','system:menu:query',3,1,102,'','#','',null,0,1,1,1,'admin','2021-01-05 17:03:48','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1014,'菜单新增','system:menu:create',3,2,102,'','#','',null,0,1,1,1,'admin','2021-01-05 17:03:48','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1015,'菜单修改','system:menu:update',3,3,102,'','#','',null,0,1,1,1,'admin','2021-01-05 17:03:48','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1016,'菜单删除','system:menu:delete',3,4,102,'','#','',null,0,1,1,1,'admin','2021-01-05 17:03:48','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1017,'部门查询','system:dept:query',3,1,103,'','#','',null,0,1,1,1,'admin','2021-01-05 17:03:48','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1018,'部门新增','system:dept:create',3,2,103,'','','',null,0,1,1,1,'admin','2021-01-05 17:03:48','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1019,'部门修改','system:dept:update',3,3,103,'','','',null,0,1,1,1,'admin','2021-01-05 17:03:48','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1020,'部门删除','system:dept:delete',3,4,103,'','','',null,0,1,1,1,'admin','2021-01-05 17:03:48','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1021,'岗位查询','system:post:query',3,1,104,'','#','',null,0,1,1,1,'admin','2021-01-05 17:03:48','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1022,'岗位新增','system:post:create',3,2,104,'','','',null,0,1,1,1,'admin','2021-01-05 17:03:48','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1023,'岗位修改','system:post:update',3,3,104,'','','',null,0,1,1,1,'admin','2021-01-05 17:03:48','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1024,'岗位删除','system:post:delete',3,4,104,'','','',null,0,1,1,1,'admin','2021-01-05 17:03:48','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1025,'岗位导出','system:post:export',3,5,104,'','#','',null,0,1,1,1,'admin','2021-01-05 17:03:48','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1026,'字典查询','system:dict:query',3,1,105,'#','#','',null,0,1,1,1,'admin','2021-01-05 17:03:48','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1027,'字典新增','system:dict:create',3,2,105,'','','',null,0,1,1,1,'admin','2021-01-05 17:03:48','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1028,'字典修改','system:dict:update',3,3,105,'','','',null,0,1,1,1,'admin','2021-01-05 17:03:48','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1029,'字典删除','system:dict:delete',3,4,105,'','','',null,0,1,1,1,'admin','2021-01-05 17:03:48','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1030,'字典导出','system:dict:export',3,5,105,'#','#','',null,0,1,1,1,'admin','2021-01-05 17:03:48','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1031,'配置查询','infra:config:query',3,1,106,'','','',null,0,1,1,1,'admin','2021-01-05 17:03:48','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1032,'配置新增','infra:config:create',3,2,106,'','','',null,0,1,1,1,'admin','2021-01-05 17:03:48','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1033,'配置修改','infra:config:update',3,3,106,'','','',null,0,1,1,1,'admin','2021-01-05 17:03:48','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1034,'配置删除','infra:config:delete',3,4,106,'','','',null,0,1,1,1,'admin','2021-01-05 17:03:48','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1035,'配置导出','infra:config:export',3,5,106,'','','',null,0,1,1,1,'admin','2021-01-05 17:03:48','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1036,'公告查询','system:notice:query',3,1,107,'#','#','',null,0,1,1,1,'admin','2021-01-05 17:03:48','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1037,'公告新增','system:notice:create',3,2,107,'','','',null,0,1,1,1,'admin','2021-01-05 17:03:48','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1038,'公告修改','system:notice:update',3,3,107,'','','',null,0,1,1,1,'admin','2021-01-05 17:03:48','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1039,'公告删除','system:notice:delete',3,4,107,'','','',null,0,1,1,1,'admin','2021-01-05 17:03:48','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1040,'操作查询','system:operate-log:query',3,1,500,'','','',null,0,1,1,1,'admin','2021-01-05 17:03:48','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1042,'日志导出','system:operate-log:export',3,2,500,'','','',null,0,1,1,1,'admin','2021-01-05 17:03:48','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1043,'登录查询','system:login-log:query',3,1,501,'#','#','',null,0,1,1,1,'admin','2021-01-05 17:03:48','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1045,'日志导出','system:login-log:export',3,3,501,'#','#','',null,0,1,1,1,'admin','2021-01-05 17:03:48','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1046,'令牌列表','system:oauth2-token:page',3,1,109,'','','',null,0,1,1,1,'admin','2021-01-05 17:03:48','1','2022-05-09 23:54:42',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1048,'令牌删除','system:oauth2-token:delete',3,2,109,'','','',null,0,1,1,1,'admin','2021-01-05 17:03:48','1','2022-05-09 23:54:53',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1050,'任务新增','infra:job:create',3,2,110,'','','',null,0,1,1,1,'admin','2021-01-05 17:03:48','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1051,'任务修改','infra:job:update',3,3,110,'','','',null,0,1,1,1,'admin','2021-01-05 17:03:48','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1052,'任务删除','infra:job:delete',3,4,110,'','','',null,0,1,1,1,'admin','2021-01-05 17:03:48','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1053,'状态修改','infra:job:update',3,5,110,'','','',null,0,1,1,1,'admin','2021-01-05 17:03:48','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1054,'任务导出','infra:job:export',3,7,110,'','','',null,0,1,1,1,'admin','2021-01-05 17:03:48','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1056,'生成修改','infra:codegen:update',3,2,115,'','','',null,0,1,1,1,'admin','2021-01-05 17:03:48','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1057,'生成删除','infra:codegen:delete',3,3,115,'','','',null,0,1,1,1,'admin','2021-01-05 17:03:48','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1058,'导入代码','infra:codegen:create',3,2,115,'','','',null,0,1,1,1,'admin','2021-01-05 17:03:48','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1059,'预览代码','infra:codegen:preview',3,4,115,'','','',null,0,1,1,1,'admin','2021-01-05 17:03:48','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1060,'生成代码','infra:codegen:download',3,5,115,'','','',null,0,1,1,1,'admin','2021-01-05 17:03:48','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1063,'设置角色菜单权限','system:permission:assign-role-menu',3,6,101,'','','',null,0,1,1,1,'','2021-01-06 17:53:44','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1064,'设置角色数据权限','system:permission:assign-role-data-scope',3,7,101,'','','',null,0,1,1,1,'','2021-01-06 17:56:31','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1065,'设置用户角色','system:permission:assign-user-role',3,8,101,'','','',null,0,1,1,1,'','2021-01-07 10:23:28','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1066,'获得 Redis 监控信息','infra:redis:get-monitor-info',3,1,113,'','','',null,0,1,1,1,'','2021-01-26 01:02:31','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1067,'获得 Redis Key 列表','infra:redis:get-key-list',3,2,113,'','','',null,0,1,1,1,'','2021-01-26 01:02:52','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1070,'代码生成示例','infra:test-demo:query',2,1,2,'test-demo','validCode','infra/testDemo/index',null,0,1,1,1,'','2021-02-06 12:42:49','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1071,'测试示例表创建','infra:test-demo:create',3,1,1070,'','','',null,0,1,1,1,'','2021-02-06 12:42:49','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1072,'测试示例表更新','infra:test-demo:update',3,2,1070,'','','',null,0,1,1,1,'','2021-02-06 12:42:49','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1073,'测试示例表删除','infra:test-demo:delete',3,3,1070,'','','',null,0,1,1,1,'','2021-02-06 12:42:49','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1074,'测试示例表导出','infra:test-demo:export',3,4,1070,'','','',null,0,1,1,1,'','2021-02-06 12:42:49','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1075,'任务触发','infra:job:trigger',3,8,110,'','','',null,0,1,1,1,'','2021-02-07 13:03:10','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1076,'数据库文档','',2,4,2,'db-doc','table','infra/dbDoc/index','InfraDBDoc',0,1,1,1,'','2021-02-08 01:41:47','1','2023-04-08 09:13:38',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1077,'监控平台','',2,13,2,'skywalking','eye-open','infra/skywalking/index','InfraSkyWalking',0,1,1,1,'','2021-02-08 20:41:31','1','2023-04-08 10:39:06',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1078,'访问日志','',2,1,1083,'api-access-log','log','infra/apiAccessLog/index','InfraApiAccessLog',0,1,1,1,'','2021-02-26 01:32:59','1','2023-04-08 10:31:34',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1082,'日志导出','infra:api-access-log:export',3,2,1078,'','','',null,0,1,1,1,'','2021-02-26 01:32:59','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1083,'API 日志','',2,8,2,'log','log',null,null,0,1,1,1,'','2021-02-26 02:18:24','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1084,'错误日志','infra:api-error-log:query',2,2,1083,'api-error-log','log','infra/apiErrorLog/index','InfraApiErrorLog',0,1,1,1,'','2021-02-26 07:53:20','1','2023-04-08 10:32:25',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1085,'日志处理','infra:api-error-log:update-status',3,2,1084,'','','',null,0,1,1,1,'','2021-02-26 07:53:20','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1086,'日志导出','infra:api-error-log:export',3,3,1084,'','','',null,0,1,1,1,'','2021-02-26 07:53:20','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1087,'任务查询','infra:job:query',3,1,110,'','','',null,0,1,1,1,'1','2021-03-10 01:26:19','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1088,'日志查询','infra:api-access-log:query',3,1,1078,'','','',null,0,1,1,1,'1','2021-03-10 01:28:04','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1089,'日志查询','infra:api-error-log:query',3,1,1084,'','','',null,0,1,1,1,'1','2021-03-10 01:29:09','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1090,'文件列表','',2,5,1243,'file','upload','infra/file/index','InfraFile',0,1,1,1,'','2021-03-12 20:16:20','1','2023-04-08 09:21:31',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1091,'文件查询','infra:file:query',3,1,1090,'','','',null,0,1,1,1,'','2021-03-12 20:16:20','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1092,'文件删除','infra:file:delete',3,4,1090,'','','',null,0,1,1,1,'','2021-03-12 20:16:20','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1093,'短信管理','',1,11,1,'sms','validCode',null,null,0,1,1,1,'1','2021-04-05 01:10:16','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1094,'短信渠道','',2,0,1093,'sms-channel','phone','system/sms/channel/index','SystemSmsChannel',0,1,1,1,'','2021-04-01 11:07:15','1','2023-04-08 08:50:41',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1095,'短信渠道查询','system:sms-channel:query',3,1,1094,'','','',null,0,1,1,1,'','2021-04-01 11:07:15','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1096,'短信渠道创建','system:sms-channel:create',3,2,1094,'','','',null,0,1,1,1,'','2021-04-01 11:07:15','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1097,'短信渠道更新','system:sms-channel:update',3,3,1094,'','','',null,0,1,1,1,'','2021-04-01 11:07:15','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1098,'短信渠道删除','system:sms-channel:delete',3,4,1094,'','','',null,0,1,1,1,'','2021-04-01 11:07:15','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1100,'短信模板','',2,1,1093,'sms-template','phone','system/sms/template/index','SystemSmsTemplate',0,1,1,1,'','2021-04-01 17:35:17','1','2023-04-08 08:50:50',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1101,'短信模板查询','system:sms-template:query',3,1,1100,'','','',null,0,1,1,1,'','2021-04-01 17:35:17','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1102,'短信模板创建','system:sms-template:create',3,2,1100,'','','',null,0,1,1,1,'','2021-04-01 17:35:17','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1103,'短信模板更新','system:sms-template:update',3,3,1100,'','','',null,0,1,1,1,'','2021-04-01 17:35:17','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1104,'短信模板删除','system:sms-template:delete',3,4,1100,'','','',null,0,1,1,1,'','2021-04-01 17:35:17','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1105,'短信模板导出','system:sms-template:export',3,5,1100,'','','',null,0,1,1,1,'','2021-04-01 17:35:17','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1106,'发送测试短信','system:sms-template:send-sms',3,6,1100,'','','',null,0,1,1,1,'1','2021-04-11 00:26:40','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1107,'短信日志','',2,2,1093,'sms-log','phone','system/sms/log/index','SystemSmsLog',0,1,1,1,'','2021-04-11 08:37:05','1','2023-04-08 08:50:58',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1108,'短信日志查询','system:sms-log:query',3,1,1107,'','','',null,0,1,1,1,'','2021-04-11 08:37:05','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1109,'短信日志导出','system:sms-log:export',3,5,1107,'','','',null,0,1,1,1,'','2021-04-11 08:37:05','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1110,'错误码管理','',2,12,1,'error-code','code','system/errorCode/index','SystemErrorCode',0,1,1,1,'','2021-04-13 21:46:42','1','2023-04-08 09:01:15',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1111,'错误码查询','system:error-code:query',3,1,1110,'','','',null,0,1,1,1,'','2021-04-13 21:46:42','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1112,'错误码创建','system:error-code:create',3,2,1110,'','','',null,0,1,1,1,'','2021-04-13 21:46:42','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1113,'错误码更新','system:error-code:update',3,3,1110,'','','',null,0,1,1,1,'','2021-04-13 21:46:42','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1114,'错误码删除','system:error-code:delete',3,4,1110,'','','',null,0,1,1,1,'','2021-04-13 21:46:42','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1115,'错误码导出','system:error-code:export',3,5,1110,'','','',null,0,1,1,1,'','2021-04-13 21:46:42','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1117,'支付管理','',1,30,0,'/pay','money',null,null,0,1,1,1,'1','2021-12-25 16:43:41','1','2022-12-10 16:33:19',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1118,'请假查询','',2,0,5,'leave','user','bpm/oa/leave/index','BpmOALeave',0,1,1,1,'','2021-09-20 08:51:03','1','2023-04-08 11:30:40',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1119,'请假申请查询','bpm:oa-leave:query',3,1,1118,'','','',null,0,1,1,1,'','2021-09-20 08:51:03','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1120,'请假申请创建','bpm:oa-leave:create',3,2,1118,'','','',null,0,1,1,1,'','2021-09-20 08:51:03','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1126,'应用信息','',2,1,1117,'app','table','pay/app/index','PayMerchant',0,1,1,1,'','2021-11-10 01:13:30','1','2023-04-08 10:43:14',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1127,'支付应用信息查询','pay:app:query',3,1,1126,'','','',null,0,1,1,1,'','2021-11-10 01:13:31','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1128,'支付应用信息创建','pay:app:create',3,2,1126,'','','',null,0,1,1,1,'','2021-11-10 01:13:31','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1129,'支付应用信息更新','pay:app:update',3,3,1126,'','','',null,0,1,1,1,'','2021-11-10 01:13:31','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1130,'支付应用信息删除','pay:app:delete',3,4,1126,'','','',null,0,1,1,1,'','2021-11-10 01:13:31','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1131,'支付应用信息导出','pay:app:export',3,5,1126,'','','',null,0,1,1,1,'','2021-11-10 01:13:31','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1132,'秘钥解析','pay:channel:parsing',3,6,1129,'','','',null,0,1,1,1,'1','2021-11-08 15:15:47','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1133,'支付商户信息查询','pay:merchant:query',3,1,1132,'','','',null,0,1,1,1,'','2021-11-10 01:13:41','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1134,'支付商户信息创建','pay:merchant:create',3,2,1132,'','','',null,0,1,1,1,'','2021-11-10 01:13:41','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1135,'支付商户信息更新','pay:merchant:update',3,3,1132,'','','',null,0,1,1,1,'','2021-11-10 01:13:41','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1136,'支付商户信息删除','pay:merchant:delete',3,4,1132,'','','',null,0,1,1,1,'','2021-11-10 01:13:41','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1137,'支付商户信息导出','pay:merchant:export',3,5,1132,'','','',null,0,1,1,1,'','2021-11-10 01:13:41','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1138,'租户列表','',2,0,1224,'list','peoples','system/tenant/index','SystemTenant',0,1,1,1,'','2021-12-14 12:31:43','1','2023-04-08 08:29:08',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1139,'租户查询','system:tenant:query',3,1,1138,'','','',null,0,1,1,1,'','2021-12-14 12:31:44','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1140,'租户创建','system:tenant:create',3,2,1138,'','','',null,0,1,1,1,'','2021-12-14 12:31:44','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1141,'租户更新','system:tenant:update',3,3,1138,'','','',null,0,1,1,1,'','2021-12-14 12:31:44','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1142,'租户删除','system:tenant:delete',3,4,1138,'','','',null,0,1,1,1,'','2021-12-14 12:31:44','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1143,'租户导出','system:tenant:export',3,5,1138,'','','',null,0,1,1,1,'','2021-12-14 12:31:44','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1150,'秘钥解析','',3,6,1129,'','','',null,0,1,1,1,'1','2021-11-08 15:15:47','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1161,'退款订单','',2,3,1117,'refund','order','pay/refund/index','PayRefund',0,1,1,1,'','2021-12-25 08:29:07','1','2023-04-08 10:46:02',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1162,'退款订单查询','pay:refund:query',3,1,1161,'','','',null,0,1,1,1,'','2021-12-25 08:29:07','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1163,'退款订单创建','pay:refund:create',3,2,1161,'','','',null,0,1,1,1,'','2021-12-25 08:29:07','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1164,'退款订单更新','pay:refund:update',3,3,1161,'','','',null,0,1,1,1,'','2021-12-25 08:29:07','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1165,'退款订单删除','pay:refund:delete',3,4,1161,'','','',null,0,1,1,1,'','2021-12-25 08:29:07','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1166,'退款订单导出','pay:refund:export',3,5,1161,'','','',null,0,1,1,1,'','2021-12-25 08:29:07','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1173,'支付订单','',2,2,1117,'order','pay','pay/order/index','PayOrder',0,1,1,1,'','2021-12-25 08:49:43','1','2023-04-08 10:43:37',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1174,'支付订单查询','pay:order:query',3,1,1173,'','','',null,0,1,1,1,'','2021-12-25 08:49:43','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1175,'支付订单创建','pay:order:create',3,2,1173,'','','',null,0,1,1,1,'','2021-12-25 08:49:43','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1176,'支付订单更新','pay:order:update',3,3,1173,'','','',null,0,1,1,1,'','2021-12-25 08:49:43','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1177,'支付订单删除','pay:order:delete',3,4,1173,'','','',null,0,1,1,1,'','2021-12-25 08:49:43','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1178,'支付订单导出','pay:order:export',3,5,1173,'','','',null,0,1,1,1,'','2021-12-25 08:49:43','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1179,'商户信息','',2,0,1117,'merchant','merchant','pay/merchant/index','PayApp',0,1,1,1,'','2021-12-25 09:01:44','1','2023-04-08 10:42:32',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1180,'支付商户信息查询','pay:merchant:query',3,1,1179,'','','',null,0,1,1,1,'','2021-12-25 09:01:44','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1181,'支付商户信息创建','pay:merchant:create',3,2,1179,'','','',null,0,1,1,1,'','2021-12-25 09:01:44','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1182,'支付商户信息更新','pay:merchant:update',3,3,1179,'','','',null,0,1,1,1,'','2021-12-25 09:01:44','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1183,'支付商户信息删除','',3,4,1179,'','','',null,0,1,1,1,'','2021-12-25 09:01:44','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1184,'支付商户信息导出','pay:merchant:export',3,5,1179,'','','',null,0,1,1,1,'','2021-12-25 09:01:44','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1185,'工作流程','',1,50,0,'/bpm','tool',null,null,0,1,1,1,'1','2021-12-30 20:26:36','103','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1186,'流程管理','',1,10,1185,'manager','nested',null,null,0,1,1,1,'1','2021-12-30 20:28:30','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1187,'流程表单','',2,0,1186,'form','form','bpm/form/index','BpmForm',0,1,1,1,'','2021-12-30 12:38:22','1','2023-04-08 10:50:37',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1188,'表单查询','bpm:form:query',3,1,1187,'','','',null,0,1,1,1,'','2021-12-30 12:38:22','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1189,'表单创建','bpm:form:create',3,2,1187,'','','',null,0,1,1,1,'','2021-12-30 12:38:22','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1190,'表单更新','bpm:form:update',3,3,1187,'','','',null,0,1,1,1,'','2021-12-30 12:38:22','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1191,'表单删除','bpm:form:delete',3,4,1187,'','','',null,0,1,1,1,'','2021-12-30 12:38:22','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1192,'表单导出','bpm:form:export',3,5,1187,'','','',null,0,1,1,1,'','2021-12-30 12:38:22','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1193,'流程模型','',2,5,1186,'model','guide','bpm/model/index','BpmModel',0,1,1,1,'1','2021-12-31 23:24:58','1','2023-04-08 10:53:38',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1194,'模型查询','bpm:model:query',3,1,1193,'','','',null,0,1,1,1,'1','2022-01-03 19:01:10','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1195,'模型创建','bpm:model:create',3,2,1193,'','','',null,0,1,1,1,'1','2022-01-03 19:01:24','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1196,'模型导入','bpm:model:import',3,3,1193,'','','',null,0,1,1,1,'1','2022-01-03 19:01:35','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1197,'模型更新','bpm:model:update',3,4,1193,'','','',null,0,1,1,1,'1','2022-01-03 19:02:28','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1198,'模型删除','bpm:model:delete',3,5,1193,'','','',null,0,1,1,1,'1','2022-01-03 19:02:43','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1199,'模型发布','bpm:model:deploy',3,6,1193,'','','',null,0,1,1,1,'1','2022-01-03 19:03:24','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1200,'任务管理','',1,20,1185,'task','cascader',null,null,0,1,1,1,'1','2022-01-07 23:51:48','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1201,'我的流程','',2,0,1200,'my','people','bpm/processInstance/index','BpmProcessInstance',0,1,1,1,'','2022-01-07 15:53:44','1','2023-04-08 11:16:55',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1202,'流程实例的查询','bpm:process-instance:query',3,1,1201,'','','',null,0,1,1,1,'','2022-01-07 15:53:44','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1207,'待办任务','',2,10,1200,'todo','eye-open','bpm/task/todo/index','BpmTodoTask',0,1,1,1,'1','2022-01-08 10:33:37','1','2023-04-08 11:29:08',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1208,'已办任务','',2,20,1200,'done','eye','bpm/task/done/index','BpmDoneTask',0,1,1,1,'1','2022-01-08 10:34:13','1','2023-04-08 11:29:00',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1209,'用户分组','',2,2,1186,'user-group','people','bpm/group/index','BpmUserGroup',0,1,1,1,'','2022-01-14 02:14:20','1','2023-04-08 10:51:06',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1210,'用户组查询','bpm:user-group:query',3,1,1209,'','','',null,0,1,1,1,'','2022-01-14 02:14:20','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1211,'用户组创建','bpm:user-group:create',3,2,1209,'','','',null,0,1,1,1,'','2022-01-14 02:14:20','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1212,'用户组更新','bpm:user-group:update',3,3,1209,'','','',null,0,1,1,1,'','2022-01-14 02:14:20','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1213,'用户组删除','bpm:user-group:delete',3,4,1209,'','','',null,0,1,1,1,'','2022-01-14 02:14:20','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1215,'流程定义查询','bpm:process-definition:query',3,10,1193,'','','',null,0,1,1,1,'1','2022-01-23 00:21:43','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1216,'流程任务分配规则查询','bpm:task-assign-rule:query',3,20,1193,'','','',null,0,1,1,1,'1','2022-01-23 00:26:53','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1217,'流程任务分配规则创建','bpm:task-assign-rule:create',3,21,1193,'','','',null,0,1,1,1,'1','2022-01-23 00:28:15','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1218,'流程任务分配规则更新','bpm:task-assign-rule:update',3,22,1193,'','','',null,0,1,1,1,'1','2022-01-23 00:28:41','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1219,'流程实例的创建','bpm:process-instance:create',3,2,1201,'','','',null,0,1,1,1,'1','2022-01-23 00:36:15','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1220,'流程实例的取消','bpm:process-instance:cancel',3,3,1201,'','','',null,0,1,1,1,'1','2022-01-23 00:36:33','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1221,'流程任务的查询','bpm:task:query',3,1,1207,'','','',null,0,1,1,1,'1','2022-01-23 00:38:52','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1222,'流程任务的更新','bpm:task:update',3,2,1207,'','','',null,0,1,1,1,'1','2022-01-23 00:39:24','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1224,'租户管理','',2,0,1,'tenant','peoples',null,null,0,1,1,1,'1','2022-02-20 01:41:13','1','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1225,'租户套餐','',2,0,1224,'package','eye','system/tenantPackage/index','SystemTenantPackage',0,1,1,1,'','2022-02-19 17:44:06','1','2023-04-08 08:17:08',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1226,'租户套餐查询','system:tenant-package:query',3,1,1225,'','','',null,0,1,1,1,'','2022-02-19 17:44:06','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1227,'租户套餐创建','system:tenant-package:create',3,2,1225,'','','',null,0,1,1,1,'','2022-02-19 17:44:06','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1228,'租户套餐更新','system:tenant-package:update',3,3,1225,'','','',null,0,1,1,1,'','2022-02-19 17:44:06','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1229,'租户套餐删除','system:tenant-package:delete',3,4,1225,'','','',null,0,1,1,1,'','2022-02-19 17:44:06','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1237,'文件配置','',2,0,1243,'file-config','config','infra/fileConfig/index','InfraFileConfig',0,1,1,1,'','2022-03-15 14:35:28','1','2023-04-08 09:16:05',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1238,'文件配置查询','infra:file-config:query',3,1,1237,'','','',null,0,1,1,1,'','2022-03-15 14:35:28','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1239,'文件配置创建','infra:file-config:create',3,2,1237,'','','',null,0,1,1,1,'','2022-03-15 14:35:28','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1240,'文件配置更新','infra:file-config:update',3,3,1237,'','','',null,0,1,1,1,'','2022-03-15 14:35:28','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1241,'文件配置删除','infra:file-config:delete',3,4,1237,'','','',null,0,1,1,1,'','2022-03-15 14:35:28','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1242,'文件配置导出','infra:file-config:export',3,5,1237,'','','',null,0,1,1,1,'','2022-03-15 14:35:28','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1243,'文件管理','',2,5,2,'file','download',null,'',0,1,1,1,'1','2022-03-16 23:47:40','1','2023-02-10 13:47:46',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1247,'敏感词管理','',2,13,1,'sensitive-word','education','system/sensitiveWord/index','SystemSensitiveWord',0,1,1,1,'','2022-04-07 16:55:03','1','2023-04-08 09:00:40',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1248,'敏感词查询','system:sensitive-word:query',3,1,1247,'','','',null,0,1,1,1,'','2022-04-07 16:55:03','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1249,'敏感词创建','system:sensitive-word:create',3,2,1247,'','','',null,0,1,1,1,'','2022-04-07 16:55:03','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1250,'敏感词更新','system:sensitive-word:update',3,3,1247,'','','',null,0,1,1,1,'','2022-04-07 16:55:03','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1251,'敏感词删除','system:sensitive-word:delete',3,4,1247,'','','',null,0,1,1,1,'','2022-04-07 16:55:03','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1252,'敏感词导出','system:sensitive-word:export',3,5,1247,'','','',null,0,1,1,1,'','2022-04-07 16:55:03','','2022-04-20 17:03:10',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1254,'作者动态','',1,0,0,'https://www.iocoder.cn','people',null,null,0,1,1,1,'1','2022-04-23 01:03:15','1','2023-02-10 00:06:52',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1255,'数据源配置','',2,1,2,'data-source-config','rate','infra/dataSourceConfig/index','InfraDataSourceConfig',0,1,1,1,'','2022-04-27 14:37:32','1','2023-04-08 09:05:21',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1256,'数据源配置查询','infra:data-source-config:query',3,1,1255,'','','',null,0,1,1,1,'','2022-04-27 14:37:32','','2022-04-27 14:37:32',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1257,'数据源配置创建','infra:data-source-config:create',3,2,1255,'','','',null,0,1,1,1,'','2022-04-27 14:37:32','','2022-04-27 14:37:32',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1258,'数据源配置更新','infra:data-source-config:update',3,3,1255,'','','',null,0,1,1,1,'','2022-04-27 14:37:32','','2022-04-27 14:37:32',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1259,'数据源配置删除','infra:data-source-config:delete',3,4,1255,'','','',null,0,1,1,1,'','2022-04-27 14:37:32','','2022-04-27 14:37:32',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1260,'数据源配置导出','infra:data-source-config:export',3,5,1255,'','','',null,0,1,1,1,'','2022-04-27 14:37:32','','2022-04-27 14:37:32',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1261,'OAuth 2.0','',1,10,1,'oauth2','people',null,null,0,1,1,1,'1','2022-05-09 23:38:17','1','2022-05-11 23:51:46',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1263,'应用管理','',2,0,1261,'oauth2/application','tool','system/oauth2/client/index','SystemOAuth2Client',0,1,1,1,'','2022-05-10 16:26:33','1','2023-04-08 08:47:31',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1264,'客户端查询','system:oauth2-client:query',3,1,1263,'','','',null,0,1,1,1,'','2022-05-10 16:26:33','1','2022-05-11 00:31:06',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1265,'客户端创建','system:oauth2-client:create',3,2,1263,'','','',null,0,1,1,1,'','2022-05-10 16:26:33','1','2022-05-11 00:31:23',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1266,'客户端更新','system:oauth2-client:update',3,3,1263,'','','',null,0,1,1,1,'','2022-05-10 16:26:33','1','2022-05-11 00:31:28',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1267,'客户端删除','system:oauth2-client:delete',3,4,1263,'','','',null,0,1,1,1,'','2022-05-10 16:26:33','1','2022-05-11 00:31:33',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1281,'报表管理','',1,40,0,'/report','chart',null,null,0,1,1,1,'1','2022-07-10 20:22:15','1','2023-02-07 17:16:40',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1282,'报表设计器','',2,1,1281,'jimu-report','example','report/jmreport/index','GoView',0,1,1,1,'1','2022-07-10 20:26:36','1','2023-04-08 10:47:59',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2000,'商品中心','',1,60,0,'/product','merchant',null,null,0,1,1,1,'','2022-07-29 15:53:53','1','2022-07-30 22:26:19',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2002,'商品分类','',2,2,2000,'category','dict','mall/product/category/index','ProductCategory',0,1,1,1,'','2022-07-29 15:53:53','1','2023-04-08 11:34:59',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2003,'分类查询','product:category:query',3,1,2002,'','','',null,0,1,1,1,'','2022-07-29 15:53:53','','2022-07-29 15:53:53',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2004,'分类创建','product:category:create',3,2,2002,'','','',null,0,1,1,1,'','2022-07-29 15:53:53','','2022-07-29 15:53:53',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2005,'分类更新','product:category:update',3,3,2002,'','','',null,0,1,1,1,'','2022-07-29 15:53:53','','2022-07-29 15:53:53',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2006,'分类删除','product:category:delete',3,4,2002,'','','',null,0,1,1,1,'','2022-07-29 15:53:53','','2022-07-29 15:53:53',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2008,'商品品牌','',2,3,2000,'brand','dashboard','mall/product/brand/index','ProductBrand',0,1,1,1,'','2022-07-30 13:52:44','1','2023-04-08 11:35:29',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2009,'品牌查询','product:brand:query',3,1,2008,'','','',null,0,1,1,1,'','2022-07-30 13:52:44','','2022-07-30 13:52:44',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2010,'品牌创建','product:brand:create',3,2,2008,'','','',null,0,1,1,1,'','2022-07-30 13:52:44','','2022-07-30 13:52:44',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2011,'品牌更新','product:brand:update',3,3,2008,'','','',null,0,1,1,1,'','2022-07-30 13:52:44','','2022-07-30 13:52:44',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2012,'品牌删除','product:brand:delete',3,4,2008,'','','',null,0,1,1,1,'','2022-07-30 13:52:44','','2022-07-30 13:52:44',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2014,'商品列表','',2,1,2000,'spu','list','mall/product/spu/index','ProductSpu',0,1,1,1,'','2022-07-30 14:22:58','1','2023-04-08 11:34:47',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2015,'商品查询','product:spu:query',3,1,2014,'','','',null,0,1,1,1,'','2022-07-30 14:22:58','','2022-07-30 14:22:58',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2016,'商品创建','product:spu:create',3,2,2014,'','','',null,0,1,1,1,'','2022-07-30 14:22:58','','2022-07-30 14:22:58',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2017,'商品更新','product:spu:update',3,3,2014,'','','',null,0,1,1,1,'','2022-07-30 14:22:58','','2022-07-30 14:22:58',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2018,'商品删除','product:spu:delete',3,4,2014,'','','',null,0,1,1,1,'','2022-07-30 14:22:58','','2022-07-30 14:22:58',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2019,'商品属性','',2,3,2000,'property','eye','mall/product/property/index','ProductProperty',0,1,1,1,'','2022-08-01 14:55:35','1','2023-04-08 11:35:15',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2020,'规格查询','product:property:query',3,1,2019,'','','',null,0,1,1,1,'','2022-08-01 14:55:35','','2022-12-12 20:26:24',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2021,'规格创建','product:property:create',3,2,2019,'','','',null,0,1,1,1,'','2022-08-01 14:55:35','','2022-12-12 20:26:30',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2022,'规格更新','product:property:update',3,3,2019,'','','',null,0,1,1,1,'','2022-08-01 14:55:35','','2022-12-12 20:26:33',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2023,'规格删除','product:property:delete',3,4,2019,'','','',null,0,1,1,1,'','2022-08-01 14:55:35','','2022-12-12 20:26:37',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2025,'Banner管理','',2,100,2000,'banner','','mall/market/banner/index',null,0,1,1,1,'','2022-08-01 14:56:14','1','2022-10-24 22:29:39',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2026,'Banner查询','market:banner:query',3,1,2025,'','','',null,0,1,1,1,'','2022-08-01 14:56:14','','2022-08-01 14:56:14',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2027,'Banner创建','market:banner:create',3,2,2025,'','','',null,0,1,1,1,'','2022-08-01 14:56:14','','2022-08-01 14:56:14',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2028,'Banner更新','market:banner:update',3,3,2025,'','','',null,0,1,1,1,'','2022-08-01 14:56:14','','2022-08-01 14:56:14',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2029,'Banner删除','market:banner:delete',3,4,2025,'','','',null,0,1,1,1,'','2022-08-01 14:56:14','','2022-08-01 14:56:14',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2030,'营销中心','',1,70,0,'/promotion','rate',null,null,0,1,1,1,'1','2022-10-31 21:25:09','1','2022-10-31 21:25:09',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2032,'优惠劵','',2,2,2030,'coupon-template','textarea','mall/promotion/couponTemplate/index','PromotionCouponTemplate',0,1,1,1,'','2022-10-31 22:27:14','1','2023-04-08 11:44:23',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2033,'优惠劵模板查询','promotion:coupon-template:query',3,1,2032,'','','',null,0,1,1,1,'','2022-10-31 22:27:14','','2022-10-31 22:27:14',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2034,'优惠劵模板创建','promotion:coupon-template:create',3,2,2032,'','','',null,0,1,1,1,'','2022-10-31 22:27:14','','2022-10-31 22:27:14',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2035,'优惠劵模板更新','promotion:coupon-template:update',3,3,2032,'','','',null,0,1,1,1,'','2022-10-31 22:27:14','','2022-10-31 22:27:14',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2036,'优惠劵模板删除','promotion:coupon-template:delete',3,4,2032,'','','',null,0,1,1,1,'','2022-10-31 22:27:14','','2022-10-31 22:27:14',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2038,'会员优惠劵','',2,2,2030,'coupon','','mall/promotion/coupon/index','PromotionCoupon',0,0,1,1,'','2022-11-03 23:21:31','1','2023-04-08 11:44:17',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2039,'优惠劵查询','promotion:coupon:query',3,1,2038,'','','',null,0,1,1,1,'','2022-11-03 23:21:31','','2022-11-03 23:21:31',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2040,'优惠劵删除','promotion:coupon:delete',3,4,2038,'','','',null,0,1,1,1,'','2022-11-03 23:21:31','','2022-11-03 23:21:31',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2041,'满减送活动','',2,10,2030,'reward-activity','radio','mall/promotion/rewardActivity/index','PromotionRewardActivity',0,1,1,1,'','2022-11-04 23:47:49','1','2023-04-08 11:45:35',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2042,'满减送活动查询','promotion:reward-activity:query',3,1,2041,'','','',null,0,1,1,1,'','2022-11-04 23:47:49','','2022-11-04 23:47:49',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2043,'满减送活动创建','promotion:reward-activity:create',3,2,2041,'','','',null,0,1,1,1,'','2022-11-04 23:47:49','','2022-11-04 23:47:49',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2044,'满减送活动更新','promotion:reward-activity:update',3,3,2041,'','','',null,0,1,1,1,'','2022-11-04 23:47:50','','2022-11-04 23:47:50',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2045,'满减送活动删除','promotion:reward-activity:delete',3,4,2041,'','','',null,0,1,1,1,'','2022-11-04 23:47:50','','2022-11-04 23:47:50',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2046,'满减送活动关闭','promotion:reward-activity:close',3,5,2041,'','','',null,0,1,1,1,'1','2022-11-05 10:42:53','1','2022-11-05 10:42:53',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2047,'限时折扣活动','',2,7,2030,'discount-activity','time','mall/promotion/discountActivity/index','PromotionDiscountActivity',0,1,1,1,'','2022-11-05 17:12:15','1','2023-04-08 11:45:44',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2048,'限时折扣活动查询','promotion:discount-activity:query',3,1,2047,'','','',null,0,1,1,1,'','2022-11-05 17:12:15','','2022-11-05 17:12:15',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", + "COMPONENT", "COMPONENT_NAME", "STATUS", "VISIBLE", "KEEP_ALIVE", + "ALWAYS_SHOW", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") +VALUES (2049, '限时折扣活动创建', 'promotion:discount-activity:create', 3, 2, 2047, '', '', '', null, 0, 1, 1, 1, '', + '2022-11-05 17:12:15', '', '2022-11-05 17:12:15', 0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", + "COMPONENT", "COMPONENT_NAME", "STATUS", "VISIBLE", "KEEP_ALIVE", + "ALWAYS_SHOW", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") +VALUES (2050, '限时折扣活动更新', 'promotion:discount-activity:update', 3, 3, 2047, '', '', '', null, 0, 1, 1, 1, '', + '2022-11-05 17:12:16', '', '2022-11-05 17:12:16', 0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", + "COMPONENT", "COMPONENT_NAME", "STATUS", "VISIBLE", "KEEP_ALIVE", + "ALWAYS_SHOW", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") +VALUES (2051, '限时折扣活动删除', 'promotion:discount-activity:delete', 3, 4, 2047, '', '', '', null, 0, 1, 1, 1, '', + '2022-11-05 17:12:16', '', '2022-11-05 17:12:16', 0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", + "COMPONENT", "COMPONENT_NAME", "STATUS", "VISIBLE", "KEEP_ALIVE", + "ALWAYS_SHOW", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") +VALUES (2052, '限时折扣活动关闭', 'promotion:discount-activity:close', 3, 5, 2047, '', '', '', null, 0, 1, 1, 1, '', + '2022-11-05 17:12:16', '', '2022-11-05 17:12:16', 0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", + "COMPONENT", "COMPONENT_NAME", "STATUS", "VISIBLE", "KEEP_ALIVE", + "ALWAYS_SHOW", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") +VALUES (2059, '秒杀活动管理', '', 2, 0, 2030, 'seckill-activity', 'time-range', + 'mall/promotion/seckill/seckillActivity/index', 'PromotionSeckillActivity', 0, 1, 1, 1, '', + '2022-11-06 22:24:49', '1', '2023-04-08 11:46:02', 0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", + "COMPONENT", "COMPONENT_NAME", "STATUS", "VISIBLE", "KEEP_ALIVE", + "ALWAYS_SHOW", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") +VALUES (2060, '秒杀活动查询', 'promotion:seckill-activity:query', 3, 1, 2059, '', '', '', null, 0, 1, 1, 1, '', + '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', 0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", + "COMPONENT", "COMPONENT_NAME", "STATUS", "VISIBLE", "KEEP_ALIVE", + "ALWAYS_SHOW", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") +VALUES (2061, '秒杀活动创建', 'promotion:seckill-activity:create', 3, 2, 2059, '', '', '', null, 0, 1, 1, 1, '', + '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', 0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", + "COMPONENT", "COMPONENT_NAME", "STATUS", "VISIBLE", "KEEP_ALIVE", + "ALWAYS_SHOW", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") +VALUES (2062, '秒杀活动更新', 'promotion:seckill-activity:update', 3, 3, 2059, '', '', '', null, 0, 1, 1, 1, '', + '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', 0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", + "COMPONENT", "COMPONENT_NAME", "STATUS", "VISIBLE", "KEEP_ALIVE", + "ALWAYS_SHOW", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") +VALUES (2063, '秒杀活动删除', 'promotion:seckill-activity:delete', 3, 4, 2059, '', '', '', null, 0, 1, 1, 1, '', + '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', 0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", + "COMPONENT", "COMPONENT_NAME", "STATUS", "VISIBLE", "KEEP_ALIVE", + "ALWAYS_SHOW", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") +VALUES (2064, '秒杀活动导出', 'promotion:seckill-activity:export', 3, 5, 2059, '', '', '', null, 0, 1, 1, 1, '', + '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', 0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", + "COMPONENT", "COMPONENT_NAME", "STATUS", "VISIBLE", "KEEP_ALIVE", + "ALWAYS_SHOW", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") +VALUES (2066, '秒杀时段管理', '', 2, 0, 2030, 'seckill-time', '', 'mall/promotion/seckill/SeckillConfig/index', + 'PromotionSeckillConfig', 0, 0, 1, 1, '', '2022-11-15 19:46:50', '1', '2023-04-08 11:46:17', 0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", + "COMPONENT", "COMPONENT_NAME", "STATUS", "VISIBLE", "KEEP_ALIVE", + "ALWAYS_SHOW", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") +VALUES (2067, '秒杀时段查询', 'promotion:seckill-time:query', 3, 1, 2066, '', '', '', null, 0, 1, 1, 1, '', + '2022-11-15 19:46:51', '', '2022-11-15 19:46:51', 0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", + "COMPONENT", "COMPONENT_NAME", "STATUS", "VISIBLE", "KEEP_ALIVE", + "ALWAYS_SHOW", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") +VALUES (2068, '秒杀时段创建', 'promotion:seckill-time:create', 3, 2, 2066, '', '', '', null, 0, 1, 1, 1, '', + '2022-11-15 19:46:51', '', '2022-11-15 19:46:51', 0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", + "COMPONENT", "COMPONENT_NAME", "STATUS", "VISIBLE", "KEEP_ALIVE", + "ALWAYS_SHOW", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") +VALUES (2069, '秒杀时段更新', 'promotion:seckill-time:update', 3, 3, 2066, '', '', '', null, 0, 1, 1, 1, '', + '2022-11-15 19:46:51', '', '2022-11-15 19:46:51', 0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", + "COMPONENT", "COMPONENT_NAME", "STATUS", "VISIBLE", "KEEP_ALIVE", + "ALWAYS_SHOW", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") +VALUES (2070, '秒杀时段删除', 'promotion:seckill-time:delete', 3, 4, 2066, '', '', '', null, 0, 1, 1, 1, '', + '2022-11-15 19:46:51', '', '2022-11-15 19:46:51', 0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", + "COMPONENT", "COMPONENT_NAME", "STATUS", "VISIBLE", "KEEP_ALIVE", + "ALWAYS_SHOW", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") +VALUES (2071, '秒杀时段导出', 'promotion:seckill-time:export', 3, 5, 2066, '', '', '', null, 0, 1, 1, 1, '', + '2022-11-15 19:46:51', '', '2022-11-15 19:46:51', 0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", + "COMPONENT", "COMPONENT_NAME", "STATUS", "VISIBLE", "KEEP_ALIVE", + "ALWAYS_SHOW", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") +VALUES (2072, '订单中心', '', 1, 65, 0, '/trade', 'order', null, null, 0, 1, 1, 1, '1', '2022-11-19 18:57:19', '1', + '2022-12-10 16:32:57', 0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", + "COMPONENT", "COMPONENT_NAME", "STATUS", "VISIBLE", "KEEP_ALIVE", + "ALWAYS_SHOW", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") +VALUES (2073, '售后退款', '', 2, 1, 2072, 'trade/after-sale', 'education', 'mall/trade/afterSale/index', + 'TradeAfterSale', 0, 1, 1, 1, '', '2022-11-19 20:15:32', '1', '2023-04-08 11:43:19', 0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", + "COMPONENT", "COMPONENT_NAME", "STATUS", "VISIBLE", "KEEP_ALIVE", + "ALWAYS_SHOW", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") +VALUES (2074, '售后查询', 'trade:after-sale:query', 3, 1, 2073, '', '', '', null, 0, 1, 1, 1, '', '2022-11-19 20:15:33', + '1', '2022-12-10 21:04:29', 0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", + "COMPONENT", "COMPONENT_NAME", "STATUS", "VISIBLE", "KEEP_ALIVE", + "ALWAYS_SHOW", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") +VALUES (2075, '秒杀活动关闭', 'promotion:sekill-activity:close', 3, 6, 2059, '', '', '', null, 0, 1, 1, 1, '1', + '2022-11-28 20:20:15', '1', '2022-11-28 20:20:15', 0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", + "COMPONENT", "COMPONENT_NAME", "STATUS", "VISIBLE", "KEEP_ALIVE", + "ALWAYS_SHOW", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") +VALUES (2076, '订单列表', '', 2, 0, 2072, 'trade/order', 'list', 'mall/trade/order/index', 'TradeOrder', 0, 1, 1, 1, + '1', '2022-12-10 21:05:44', '1', '2023-04-08 11:42:23', 0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2077,'物流公司管理管理','',2,0,2072,'express-company','','mall/trade/expressCompany/index',null,0,1,1,1,'','2022-12-20 23:27:55','1','2022-12-20 23:36:20',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2078,'物流公司管理查询','trade:express-company:query',3,1,2077,'','','',null,0,1,1,1,'','2022-12-20 23:27:55','','2022-12-20 23:27:55',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2079,'物流公司管理创建','trade:express-company:create',3,2,2077,'','','',null,0,1,1,1,'','2022-12-20 23:27:55','','2022-12-20 23:27:55',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2080,'物流公司管理更新','trade:express-company:update',3,3,2077,'','','',null,0,1,1,1,'','2022-12-20 23:27:55','','2022-12-20 23:27:55',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2081,'物流公司管理删除','trade:express-company:delete',3,4,2077,'','','',null,0,1,1,1,'','2022-12-20 23:27:55','','2022-12-20 23:27:55',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2082,'物流公司管理导出','trade:express-company:export',3,5,2077,'','','',null,0,1,1,1,'','2022-12-20 23:27:55','','2022-12-20 23:27:55',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2083,'地区管理','',2,14,1,'area','row','system/area/index','SystemArea',0,1,1,1,'1','2022-12-23 17:35:05','1','2023-04-08 09:01:37',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2084,'公众号管理','',1,100,0,'/mp','wechat',null,null,0,1,1,1,'1','2023-01-01 20:11:04','1','2023-01-15 11:28:57',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2085,'账号管理','',2,1,2084,'account','phone','mp/account/index','MpAccount',0,1,1,1,'1','2023-01-01 20:13:31','1','2023-02-09 23:56:39',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2086,'新增账号','mp:account:create',3,1,2085,'','','',null,0,1,1,1,'1','2023-01-01 20:21:40','1','2023-01-07 17:32:53',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2087,'修改账号','mp:account:update',3,2,2085,'','','',null,0,1,1,1,'1','2023-01-07 17:32:46','1','2023-01-07 17:32:46',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2088,'查询账号','mp:account:query',3,0,2085,'','','',null,0,1,1,1,'1','2023-01-07 17:33:07','1','2023-01-07 17:33:07',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2089,'删除账号','mp:account:delete',3,3,2085,'','','',null,0,1,1,1,'1','2023-01-07 17:33:21','1','2023-01-07 17:33:21',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2090,'生成二维码','mp:account:qr-code',3,4,2085,'','','',null,0,1,1,1,'1','2023-01-07 17:33:58','1','2023-01-07 17:33:58',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2091,'清空 API 配额','mp:account:clear-quota',3,5,2085,'','','',null,0,1,1,1,'1','2023-01-07 18:20:32','1','2023-01-07 18:20:59',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2092,'数据统计','mp:statistics:query',2,2,2084,'statistics','chart','mp/statistics/index','MpStatistics',0,1,1,1,'1','2023-01-07 20:17:36','1','2023-02-09 23:58:34',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2093,'标签管理','',2,3,2084,'tag','rate','mp/tag/index','MpTag',0,1,1,1,'1','2023-01-08 11:37:32','1','2023-02-09 23:58:47',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2094,'查询标签','mp:tag:query',3,0,2093,'','','',null,0,1,1,1,'1','2023-01-08 11:59:03','1','2023-01-08 11:59:03',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2095,'新增标签','mp:tag:create',3,1,2093,'','','',null,0,1,1,1,'1','2023-01-08 11:59:23','1','2023-01-08 11:59:23',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2096,'修改标签','mp:tag:update',3,2,2093,'','','',null,0,1,1,1,'1','2023-01-08 11:59:41','1','2023-01-08 11:59:41',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2097,'删除标签','mp:tag:delete',3,3,2093,'','','',null,0,1,1,1,'1','2023-01-08 12:00:04','1','2023-01-08 12:00:13',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2098,'同步标签','mp:tag:sync',3,4,2093,'','','',null,0,1,1,1,'1','2023-01-08 12:00:29','1','2023-01-08 12:00:29',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2099,'粉丝管理','',2,4,2084,'user','people','mp/user/index','MpUser',0,1,1,1,'1','2023-01-08 16:51:20','1','2023-02-09 23:58:21',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2100,'查询粉丝','mp:user:query',3,0,2099,'','','',null,0,1,1,1,'1','2023-01-08 17:16:59','1','2023-01-08 17:17:23',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2101,'修改粉丝','mp:user:update',3,1,2099,'','','',null,0,1,1,1,'1','2023-01-08 17:17:11','1','2023-01-08 17:17:11',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2102,'同步粉丝','mp:user:sync',3,2,2099,'','','',null,0,1,1,1,'1','2023-01-08 17:17:40','1','2023-01-08 17:17:40',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2103,'消息管理','',2,5,2084,'message','email','mp/message/index','MpMessage',0,1,1,1,'1','2023-01-08 18:44:19','1','2023-02-09 23:58:02',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2104,'图文发表记录','',2,10,2084,'free-publish','education','mp/freePublish/index','MpFreePublish',0,1,1,1,'1','2023-01-13 00:30:50','1','2023-02-09 23:57:22',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2105,'查询发布列表','mp:free-publish:query',3,1,2104,'','','',null,0,1,1,1,'1','2023-01-13 07:19:17','1','2023-01-13 07:19:17',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2106,'发布草稿','mp:free-publish:submit',3,2,2104,'','','',null,0,1,1,1,'1','2023-01-13 07:19:46','1','2023-01-13 07:19:46',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2107,'删除发布记录','mp:free-publish:delete',3,3,2104,'','','',null,0,1,1,1,'1','2023-01-13 07:20:01','1','2023-01-13 07:20:01',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2108,'图文草稿箱','',2,9,2084,'draft','edit','mp/draft/index','MpDraft',0,1,1,1,'1','2023-01-13 07:40:21','1','2023-02-09 23:56:58',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2109,'新建草稿','mp:draft:create',3,1,2108,'','','',null,0,1,1,1,'1','2023-01-13 23:15:30','1','2023-01-13 23:15:44',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2110,'修改草稿','mp:draft:update',3,2,2108,'','','',null,0,1,1,1,'1','2023-01-14 10:08:47','1','2023-01-14 10:08:47',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2111,'查询草稿','mp:draft:query',3,0,2108,'','','',null,0,1,1,1,'1','2023-01-14 10:09:01','1','2023-01-14 10:09:01',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2112,'删除草稿','mp:draft:delete',3,3,2108,'','','',null,0,1,1,1,'1','2023-01-14 10:09:19','1','2023-01-14 10:09:19',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2113,'素材管理','',2,8,2084,'material','skill','mp/material/index','MpMaterial',0,1,1,1,'1','2023-01-14 14:12:07','1','2023-02-09 23:57:36',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2114,'上传临时素材','mp:material:upload-temporary',3,1,2113,'','','',null,0,1,1,1,'1','2023-01-14 15:33:55','1','2023-01-14 15:33:55',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2115,'上传永久素材','mp:material:upload-permanent',3,2,2113,'','','',null,0,1,1,1,'1','2023-01-14 15:34:14','1','2023-01-14 15:34:14',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2116,'删除素材','mp:material:delete',3,3,2113,'','','',null,0,1,1,1,'1','2023-01-14 15:35:37','1','2023-01-14 15:35:37',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2117,'上传图文图片','mp:material:upload-news-image',3,4,2113,'','','',null,0,1,1,1,'1','2023-01-14 15:36:31','1','2023-01-14 15:36:31',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2118,'查询素材','mp:material:query',3,5,2113,'','','',null,0,1,1,1,'1','2023-01-14 15:39:22','1','2023-01-14 15:39:22',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2119,'菜单管理','',2,6,2084,'menu','button','mp/menu/index','MpMenu',0,1,1,1,'1','2023-01-14 17:43:54','1','2023-02-09 23:57:50',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2120,'自动回复','',2,7,2084,'auto-reply','eye','mp/autoReply/index','MpAutoReply',0,1,1,1,'1','2023-01-15 22:13:09','1','2023-02-09 23:56:28',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2121,'查询回复','mp:auto-reply:query',3,0,2120,'','','',null,0,1,1,1,'1','2023-01-16 22:28:41','1','2023-01-16 22:28:41',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2122,'新增回复','mp:auto-reply:create',3,1,2120,'','','',null,0,1,1,1,'1','2023-01-16 22:28:54','1','2023-01-16 22:28:54',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2123,'修改回复','mp:auto-reply:update',3,2,2120,'','','',null,0,1,1,1,'1','2023-01-16 22:29:05','1','2023-01-16 22:29:05',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2124,'删除回复','mp:auto-reply:delete',3,3,2120,'','','',null,0,1,1,1,'1','2023-01-16 22:29:34','1','2023-01-16 22:29:34',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2125,'查询菜单','mp:menu:query',3,0,2119,'','','',null,0,1,1,1,'1','2023-01-17 23:05:41','1','2023-01-17 23:05:41',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2126,'保存菜单','mp:menu:save',3,1,2119,'','','',null,0,1,1,1,'1','2023-01-17 23:06:01','1','2023-01-17 23:06:01',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2127,'删除菜单','mp:menu:delete',3,2,2119,'','','',null,0,1,1,1,'1','2023-01-17 23:06:16','1','2023-01-17 23:06:16',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2128,'查询消息','mp:message:query',3,0,2103,'','','',null,0,1,1,1,'1','2023-01-17 23:07:14','1','2023-01-17 23:07:14',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2129,'发送消息','mp:message:send',3,1,2103,'','','',null,0,1,1,1,'1','2023-01-17 23:07:26','1','2023-01-17 23:07:26',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2130,'邮箱管理','',2,11,1,'mail','email',null,null,0,1,1,1,'1','2023-01-25 17:27:44','1','2023-01-25 17:27:44',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2131,'邮箱账号','',2,0,2130,'mail-account','user','system/mail/account/index','SystemMailAccount',0,1,1,1,'','2023-01-25 09:33:48','1','2023-04-08 08:53:43',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2132,'账号查询','system:mail-account:query',3,1,2131,'','','',null,0,1,1,1,'','2023-01-25 09:33:48','','2023-01-25 09:33:48',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2133,'账号创建','system:mail-account:create',3,2,2131,'','','',null,0,1,1,1,'','2023-01-25 09:33:48','','2023-01-25 09:33:48',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2134,'账号更新','system:mail-account:update',3,3,2131,'','','',null,0,1,1,1,'','2023-01-25 09:33:48','','2023-01-25 09:33:48',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2135,'账号删除','system:mail-account:delete',3,4,2131,'','','',null,0,1,1,1,'','2023-01-25 09:33:48','','2023-01-25 09:33:48',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2136,'邮件模版','',2,0,2130,'mail-template','education','system/mail/template/index','SystemMailTemplate',0,1,1,1,'','2023-01-25 12:05:31','1','2023-04-08 08:53:34',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2137,'模版查询','system:mail-template:query',3,1,2136,'','','',null,0,1,1,1,'','2023-01-25 12:05:31','','2023-01-25 12:05:31',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2138,'模版创建','system:mail-template:create',3,2,2136,'','','',null,0,1,1,1,'','2023-01-25 12:05:31','','2023-01-25 12:05:31',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2139,'模版更新','system:mail-template:update',3,3,2136,'','','',null,0,1,1,1,'','2023-01-25 12:05:31','','2023-01-25 12:05:31',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2140,'模版删除','system:mail-template:delete',3,4,2136,'','','',null,0,1,1,1,'','2023-01-25 12:05:31','','2023-01-25 12:05:31',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2141,'邮件记录','',2,0,2130,'mail-log','log','system/mail/log/index','SystemMailLog',0,1,1,1,'','2023-01-26 02:16:50','1','2023-04-08 08:53:49',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2142,'日志查询','system:mail-log:query',3,1,2141,'','','',null,0,1,1,1,'','2023-01-26 02:16:50','','2023-01-26 02:16:50',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2143,'发送测试邮件','system:mail-template:send-mail',3,5,2136,'','','',null,0,1,1,1,'1','2023-01-26 23:29:15','1','2023-01-26 23:29:15',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2144,'站内信管理','',1,11,1,'notify','message',null,null,0,1,1,1,'1','2023-01-28 10:25:18','1','2023-01-28 10:25:46',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2145,'模板管理','',2,0,2144,'notify-template','education','system/notify/template/index','SystemNotifyTemplate',0,1,1,1,'','2023-01-28 02:26:42','1','2023-04-08 08:54:39',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2146,'站内信模板查询','system:notify-template:query',3,1,2145,'','','',null,0,1,1,1,'','2023-01-28 02:26:42','','2023-01-28 02:26:42',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2147,'站内信模板创建','system:notify-template:create',3,2,2145,'','','',null,0,1,1,1,'','2023-01-28 02:26:42','','2023-01-28 02:26:42',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2148,'站内信模板更新','system:notify-template:update',3,3,2145,'','','',null,0,1,1,1,'','2023-01-28 02:26:42','','2023-01-28 02:26:42',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2149,'站内信模板删除','system:notify-template:delete',3,4,2145,'','','',null,0,1,1,1,'','2023-01-28 02:26:42','','2023-01-28 02:26:42',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2150,'发送测试站内信','system:notify-template:send-notify',3,5,2145,'','','',null,0,1,1,1,'1','2023-01-28 10:54:43','1','2023-01-28 10:54:43',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2151,'消息记录','',2,0,2144,'notify-message','edit','system/notify/message/index','SystemNotifyMessage',0,1,1,1,'','2023-01-28 04:28:22','1','2023-04-08 08:54:11',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2152,'站内信消息查询','system:notify-message:query',3,1,2151,'','','',null,0,1,1,1,'','2023-01-28 04:28:22','','2023-01-28 04:28:22',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2153,'大屏设计器','',2,2,1281,'go-view','dashboard','report/goview/index','JimuReport',0,1,1,1,'1','2023-02-07 00:03:19','1','2023-04-08 10:48:15',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2154,'创建项目','report:go-view-project:create',3,1,2153,'','','',null,0,1,1,1,'1','2023-02-07 19:25:14','1','2023-02-07 19:25:14',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2155,'更新项目','report:go-view-project:delete',3,2,2153,'','','',null,0,1,1,1,'1','2023-02-07 19:25:34','1','2023-02-07 19:25:34',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2156,'查询项目','report:go-view-project:query',3,0,2153,'','','',null,0,1,1,1,'1','2023-02-07 19:25:53','1','2023-02-07 19:25:53',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2157,'使用 SQL 查询数据','report:go-view-data:get-by-sql',3,3,2153,'','','',null,0,1,1,1,'1','2023-02-07 19:26:15','1','2023-02-07 19:26:15',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2158,'使用 HTTP 查询数据','report:go-view-data:get-by-http',3,4,2153,'','','',null,0,1,1,1,'1','2023-02-07 19:26:35','1','2023-02-07 19:26:35',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2159,'Boot 开发文档','',1,1,0,'https://doc.iocoder.cn/','education',null,null,0,1,1,1,'1','2023-02-10 22:46:28','1','2023-02-10 22:46:28',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2160,'Cloud 开发文档','',1,2,0,'https://cloud.iocoder.cn','documentation',null,null,0,1,1,1,'1','2023-02-10 22:47:07','1','2023-02-10 22:47:07',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2161,'接入示例','',2,99,1117,'demo-order','drag','pay/demo/index',null,0,1,1,1,'','2023-02-11 14:21:42','1','2023-02-11 22:26:35',0); + +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_MENU" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_NOTICE" ON; +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_NOTICE"("ID","TITLE","CONTENT","TYPE","STATUS","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1,'闻荫的公众','

新版本内容133

',1,0,'admin','2021-01-05 17:03:48','1','2022-05-04 21:00:20',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_NOTICE"("ID","TITLE","CONTENT","TYPE","STATUS","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2,'维护通知:2018-07-01 若依系统凌晨维护','

维护内容

',2,1,'admin','2021-01-05 17:03:48','1','2022-05-11 12:34:24',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_NOTICE"("ID","TITLE","CONTENT","TYPE","STATUS","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(4,'我是测试标题','

哈哈哈哈123

',1,0,'110','2022-02-22 01:01:25','110','2022-02-22 01:01:46',0,121); + +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_NOTICE" OFF; +ALTER TABLE "RUOYI_VUE_PRO"."BPM_FORM" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."BPM_OA_LEAVE" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."BPM_PROCESS_DEFINITION_EXT" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."BPM_PROCESS_INSTANCE_EXT" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."BPM_TASK_ASSIGN_RULE" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."BPM_TASK_EXT" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."BPM_USER_GROUP" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."INFRA_API_ACCESS_LOG" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."INFRA_API_ERROR_LOG" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."INFRA_CODEGEN_COLUMN" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."INFRA_CODEGEN_TABLE" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."INFRA_CONFIG" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."INFRA_DATA_SOURCE_CONFIG" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."INFRA_FILE" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."INFRA_FILE_CONFIG" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."INFRA_FILE_CONTENT" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."INFRA_JOB" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."INFRA_JOB_LOG" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."INFRA_TEST_DEMO" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."MEMBER_USER" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."PAY_APP" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."PAY_CHANNEL" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."PAY_DEMO_ORDER" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."PAY_MERCHANT" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."PAY_NOTIFY_LOG" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."PAY_NOTIFY_TASK" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."PAY_ORDER" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."PAY_ORDER_EXTENSION" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."PAY_REFUND" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."QRTZ_BLOB_TRIGGERS" ADD CONSTRAINT PRIMARY KEY("SCHED_NAME","TRIGGER_NAME","TRIGGER_GROUP") ; + +ALTER TABLE "RUOYI_VUE_PRO"."QRTZ_CALENDARS" ADD CONSTRAINT PRIMARY KEY("SCHED_NAME","CALENDAR_NAME") ; + +ALTER TABLE "RUOYI_VUE_PRO"."QRTZ_CRON_TRIGGERS" ADD CONSTRAINT PRIMARY KEY("SCHED_NAME","TRIGGER_NAME","TRIGGER_GROUP") ; + +ALTER TABLE "RUOYI_VUE_PRO"."QRTZ_FIRED_TRIGGERS" ADD CONSTRAINT PRIMARY KEY("SCHED_NAME","ENTRY_ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."QRTZ_JOB_DETAILS" ADD CONSTRAINT PRIMARY KEY("SCHED_NAME","JOB_NAME","JOB_GROUP") ; + +ALTER TABLE "RUOYI_VUE_PRO"."QRTZ_LOCKS" ADD CONSTRAINT PRIMARY KEY("SCHED_NAME","LOCK_NAME") ; + +ALTER TABLE "RUOYI_VUE_PRO"."QRTZ_PAUSED_TRIGGER_GRPS" ADD CONSTRAINT PRIMARY KEY("SCHED_NAME","TRIGGER_GROUP") ; + +ALTER TABLE "RUOYI_VUE_PRO"."QRTZ_SCHEDULER_STATE" ADD CONSTRAINT PRIMARY KEY("SCHED_NAME","INSTANCE_NAME") ; + +ALTER TABLE "RUOYI_VUE_PRO"."QRTZ_SIMPLE_TRIGGERS" ADD CONSTRAINT PRIMARY KEY("SCHED_NAME","TRIGGER_NAME","TRIGGER_GROUP") ; + +ALTER TABLE "RUOYI_VUE_PRO"."QRTZ_SIMPROP_TRIGGERS" ADD CONSTRAINT PRIMARY KEY("SCHED_NAME","TRIGGER_NAME","TRIGGER_GROUP") ; + +ALTER TABLE "RUOYI_VUE_PRO"."QRTZ_TRIGGERS" ADD CONSTRAINT PRIMARY KEY("SCHED_NAME","TRIGGER_NAME","TRIGGER_GROUP") ; + +ALTER TABLE "RUOYI_VUE_PRO"."SYSTEM_DEPT" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."SYSTEM_ERROR_CODE" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."SYSTEM_LOGIN_LOG" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."SYSTEM_MAIL_ACCOUNT" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."SYSTEM_MAIL_LOG" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."SYSTEM_MAIL_TEMPLATE" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."SYSTEM_MENU" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."SYSTEM_NOTICE" ADD CONSTRAINT PRIMARY KEY("ID") ; + +CREATE INDEX "SCHED_NAME" +ON "RUOYI_VUE_PRO"."QRTZ_BLOB_TRIGGERS"("SCHED_NAME","TRIGGER_NAME","TRIGGER_GROUP"); + +CREATE INDEX "IDX_QRTZ_FT_INST_JOB_REQ_RCVRY" +ON "RUOYI_VUE_PRO"."QRTZ_FIRED_TRIGGERS"("SCHED_NAME","INSTANCE_NAME","REQUESTS_RECOVERY"); + +CREATE INDEX "IDX_QRTZ_FT_JG" +ON "RUOYI_VUE_PRO"."QRTZ_FIRED_TRIGGERS"("SCHED_NAME","JOB_GROUP"); + +CREATE INDEX "IDX_QRTZ_FT_J_G" +ON "RUOYI_VUE_PRO"."QRTZ_FIRED_TRIGGERS"("SCHED_NAME","JOB_NAME","JOB_GROUP"); + +CREATE INDEX "IDX_QRTZ_FT_TG" +ON "RUOYI_VUE_PRO"."QRTZ_FIRED_TRIGGERS"("SCHED_NAME","TRIGGER_GROUP"); + +CREATE INDEX "IDX_QRTZ_FT_TRIG_INST_NAME" +ON "RUOYI_VUE_PRO"."QRTZ_FIRED_TRIGGERS"("SCHED_NAME","INSTANCE_NAME"); + +CREATE INDEX "IDX_QRTZ_FT_T_G" +ON "RUOYI_VUE_PRO"."QRTZ_FIRED_TRIGGERS"("SCHED_NAME","TRIGGER_NAME","TRIGGER_GROUP"); + +CREATE INDEX "IDX_QRTZ_J_GRP" +ON "RUOYI_VUE_PRO"."QRTZ_JOB_DETAILS"("SCHED_NAME","JOB_GROUP"); + +CREATE INDEX "IDX_QRTZ_J_REQ_RECOVERY" +ON "RUOYI_VUE_PRO"."QRTZ_JOB_DETAILS"("SCHED_NAME","REQUESTS_RECOVERY"); + +CREATE INDEX "IDX_QRTZ_T_C" +ON "RUOYI_VUE_PRO"."QRTZ_TRIGGERS"("SCHED_NAME","CALENDAR_NAME"); + +CREATE INDEX "IDX_QRTZ_T_G" +ON "RUOYI_VUE_PRO"."QRTZ_TRIGGERS"("SCHED_NAME","TRIGGER_GROUP"); + +CREATE INDEX "IDX_QRTZ_T_J" +ON "RUOYI_VUE_PRO"."QRTZ_TRIGGERS"("SCHED_NAME","JOB_NAME","JOB_GROUP"); + +CREATE INDEX "IDX_QRTZ_T_JG" +ON "RUOYI_VUE_PRO"."QRTZ_TRIGGERS"("SCHED_NAME","JOB_GROUP"); + +CREATE INDEX "IDX_QRTZ_T_NEXT_FIRE_TIME" +ON "RUOYI_VUE_PRO"."QRTZ_TRIGGERS"("SCHED_NAME","NEXT_FIRE_TIME"); + +CREATE INDEX "IDX_QRTZ_T_NFT_MISFIRE" +ON "RUOYI_VUE_PRO"."QRTZ_TRIGGERS"("SCHED_NAME","MISFIRE_INSTR","NEXT_FIRE_TIME"); + +CREATE INDEX "IDX_QRTZ_T_NFT_ST" +ON "RUOYI_VUE_PRO"."QRTZ_TRIGGERS"("SCHED_NAME","TRIGGER_STATE","NEXT_FIRE_TIME"); + +CREATE INDEX "IDX_QRTZ_T_NFT_ST_MISFIRE" +ON "RUOYI_VUE_PRO"."QRTZ_TRIGGERS"("SCHED_NAME","MISFIRE_INSTR","NEXT_FIRE_TIME","TRIGGER_STATE"); + +CREATE INDEX "IDX_QRTZ_T_NFT_ST_MISFIRE_GRP" +ON "RUOYI_VUE_PRO"."QRTZ_TRIGGERS"("SCHED_NAME","MISFIRE_INSTR","NEXT_FIRE_TIME","TRIGGER_GROUP","TRIGGER_STATE"); + +CREATE INDEX "IDX_QRTZ_T_N_G_STATE" +ON "RUOYI_VUE_PRO"."QRTZ_TRIGGERS"("SCHED_NAME","TRIGGER_GROUP","TRIGGER_STATE"); + +CREATE INDEX "IDX_QRTZ_T_N_STATE" +ON "RUOYI_VUE_PRO"."QRTZ_TRIGGERS"("SCHED_NAME","TRIGGER_NAME","TRIGGER_GROUP","TRIGGER_STATE"); + +CREATE INDEX "IDX_QRTZ_T_STATE" +ON "RUOYI_VUE_PRO"."QRTZ_TRIGGERS"("SCHED_NAME","TRIGGER_STATE"); + +ALTER TABLE "RUOYI_VUE_PRO"."PAY_DEMO_ORDER" ADD CHECK("USER_ID" >= 0) ENABLE ; + +ALTER TABLE "RUOYI_VUE_PRO"."MEMBER_USER" ADD CONSTRAINT "UK_MOBILE" UNIQUE("MOBILE") ; + +ALTER TABLE "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE" ADD CONSTRAINT "DICT_TYPE" UNIQUE("TYPE") ; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."BPM_FORM" IS '工作流的表单定义'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_FORM"."ID" IS '编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_FORM"."NAME" IS '表单名'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_FORM"."STATUS" IS '开启状态'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_FORM"."CONF" IS '表单的配置'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_FORM"."FIELDS" IS '表单项的数组'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_FORM"."REMARK" IS '备注'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_FORM"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_FORM"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_FORM"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_FORM"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_FORM"."DELETED" IS '是否删除'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_FORM"."TENANT_ID" IS '租户编号'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."BPM_OA_LEAVE" IS 'OA 请假申请表'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_OA_LEAVE"."ID" IS '请假表单主键'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_OA_LEAVE"."USER_ID" IS '申请人的用户编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_OA_LEAVE"."TYPE" IS '请假类型'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_OA_LEAVE"."REASON" IS '请假原因'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_OA_LEAVE"."START_TIME" IS '开始时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_OA_LEAVE"."END_TIME" IS '结束时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_OA_LEAVE"."DAY" IS '请假天数'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_OA_LEAVE"."RESULT" IS '请假结果'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_OA_LEAVE"."PROCESS_INSTANCE_ID" IS '流程实例的编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_OA_LEAVE"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_OA_LEAVE"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_OA_LEAVE"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_OA_LEAVE"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_OA_LEAVE"."DELETED" IS '是否删除'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_OA_LEAVE"."TENANT_ID" IS '租户编号'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."BPM_PROCESS_DEFINITION_EXT" IS 'Bpm 流程定义的拓展表 +'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_PROCESS_DEFINITION_EXT"."ID" IS '编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_PROCESS_DEFINITION_EXT"."PROCESS_DEFINITION_ID" IS '流程定义的编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_PROCESS_DEFINITION_EXT"."MODEL_ID" IS '流程模型的编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_PROCESS_DEFINITION_EXT"."DESCRIPTION" IS '描述'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_PROCESS_DEFINITION_EXT"."FORM_TYPE" IS '表单类型'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_PROCESS_DEFINITION_EXT"."FORM_ID" IS '表单编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_PROCESS_DEFINITION_EXT"."FORM_CONF" IS '表单的配置'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_PROCESS_DEFINITION_EXT"."FORM_FIELDS" IS '表单项的数组'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_PROCESS_DEFINITION_EXT"."FORM_CUSTOM_CREATE_PATH" IS '自定义表单的提交路径'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_PROCESS_DEFINITION_EXT"."FORM_CUSTOM_VIEW_PATH" IS '自定义表单的查看路径'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_PROCESS_DEFINITION_EXT"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_PROCESS_DEFINITION_EXT"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_PROCESS_DEFINITION_EXT"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_PROCESS_DEFINITION_EXT"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_PROCESS_DEFINITION_EXT"."DELETED" IS '是否删除'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_PROCESS_DEFINITION_EXT"."TENANT_ID" IS '租户编号'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."BPM_PROCESS_INSTANCE_EXT" IS '工作流的流程实例的拓展'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_PROCESS_INSTANCE_EXT"."ID" IS '编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_PROCESS_INSTANCE_EXT"."START_USER_ID" IS '发起流程的用户编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_PROCESS_INSTANCE_EXT"."NAME" IS '流程实例的名字'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_PROCESS_INSTANCE_EXT"."PROCESS_INSTANCE_ID" IS '流程实例的编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_PROCESS_INSTANCE_EXT"."PROCESS_DEFINITION_ID" IS '流程定义的编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_PROCESS_INSTANCE_EXT"."CATEGORY" IS '流程分类'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_PROCESS_INSTANCE_EXT"."STATUS" IS '流程实例的状态'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_PROCESS_INSTANCE_EXT"."RESULT" IS '流程实例的结果'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_PROCESS_INSTANCE_EXT"."END_TIME" IS '结束时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_PROCESS_INSTANCE_EXT"."FORM_VARIABLES" IS '表单值'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_PROCESS_INSTANCE_EXT"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_PROCESS_INSTANCE_EXT"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_PROCESS_INSTANCE_EXT"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_PROCESS_INSTANCE_EXT"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_PROCESS_INSTANCE_EXT"."DELETED" IS '是否删除'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_PROCESS_INSTANCE_EXT"."TENANT_ID" IS '租户编号'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."BPM_TASK_ASSIGN_RULE" IS 'Bpm 任务规则表'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_TASK_ASSIGN_RULE"."ID" IS '编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_TASK_ASSIGN_RULE"."MODEL_ID" IS '流程模型的编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_TASK_ASSIGN_RULE"."PROCESS_DEFINITION_ID" IS '流程定义的编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_TASK_ASSIGN_RULE"."TASK_DEFINITION_KEY" IS '流程任务定义的 key'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_TASK_ASSIGN_RULE"."TYPE" IS '规则类型'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_TASK_ASSIGN_RULE"."OPTIONS" IS '规则值,JSON 数组'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_TASK_ASSIGN_RULE"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_TASK_ASSIGN_RULE"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_TASK_ASSIGN_RULE"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_TASK_ASSIGN_RULE"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_TASK_ASSIGN_RULE"."DELETED" IS '是否删除'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_TASK_ASSIGN_RULE"."TENANT_ID" IS '租户编号'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."BPM_TASK_EXT" IS '工作流的流程任务的拓展表'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_TASK_EXT"."ID" IS '编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_TASK_EXT"."ASSIGNEE_USER_ID" IS '任务的审批人'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_TASK_EXT"."NAME" IS '任务的名字'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_TASK_EXT"."TASK_ID" IS '任务的编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_TASK_EXT"."RESULT" IS '任务的结果'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_TASK_EXT"."REASON" IS '审批建议'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_TASK_EXT"."END_TIME" IS '任务的结束时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_TASK_EXT"."PROCESS_INSTANCE_ID" IS '流程实例的编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_TASK_EXT"."PROCESS_DEFINITION_ID" IS '流程定义的编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_TASK_EXT"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_TASK_EXT"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_TASK_EXT"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_TASK_EXT"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_TASK_EXT"."DELETED" IS '是否删除'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_TASK_EXT"."TENANT_ID" IS '租户编号'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."BPM_USER_GROUP" IS '用户组'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_USER_GROUP"."ID" IS '编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_USER_GROUP"."NAME" IS '组名'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_USER_GROUP"."DESCRIPTION" IS '描述'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_USER_GROUP"."MEMBER_USER_IDS" IS '成员编号数组'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_USER_GROUP"."STATUS" IS '状态(0正常 1停用)'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_USER_GROUP"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_USER_GROUP"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_USER_GROUP"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_USER_GROUP"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_USER_GROUP"."DELETED" IS '是否删除'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."BPM_USER_GROUP"."TENANT_ID" IS '租户编号'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."INFRA_API_ACCESS_LOG" IS 'API 访问日志表'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_API_ACCESS_LOG"."ID" IS '日志主键'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_API_ACCESS_LOG"."TRACE_ID" IS '链路追踪编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_API_ACCESS_LOG"."USER_ID" IS '用户编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_API_ACCESS_LOG"."USER_TYPE" IS '用户类型'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_API_ACCESS_LOG"."APPLICATION_NAME" IS '应用名'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_API_ACCESS_LOG"."REQUEST_METHOD" IS '请求方法名'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_API_ACCESS_LOG"."REQUEST_URL" IS '请求地址'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_API_ACCESS_LOG"."REQUEST_PARAMS" IS '请求参数'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_API_ACCESS_LOG"."USER_IP" IS '用户 IP'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_API_ACCESS_LOG"."USER_AGENT" IS '浏览器 UA'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_API_ACCESS_LOG"."BEGIN_TIME" IS '开始请求时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_API_ACCESS_LOG"."END_TIME" IS '结束请求时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_API_ACCESS_LOG"."DURATION" IS '执行时长'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_API_ACCESS_LOG"."RESULT_CODE" IS '结果码'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_API_ACCESS_LOG"."RESULT_MSG" IS '结果提示'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_API_ACCESS_LOG"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_API_ACCESS_LOG"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_API_ACCESS_LOG"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_API_ACCESS_LOG"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_API_ACCESS_LOG"."DELETED" IS '是否删除'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_API_ACCESS_LOG"."TENANT_ID" IS '租户编号'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."INFRA_API_ERROR_LOG" IS '系统异常日志'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_API_ERROR_LOG"."ID" IS '编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_API_ERROR_LOG"."TRACE_ID" IS '链路追踪编号 + * + * 一般来说,通过链路追踪编号,可以将访问日志,错误日志,链路追踪日志,logger 打印日志等,结合在一起,从而进行排错。'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_API_ERROR_LOG"."USER_ID" IS '用户编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_API_ERROR_LOG"."USER_TYPE" IS '用户类型'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_API_ERROR_LOG"."APPLICATION_NAME" IS '应用名 + * + * 目前读取 spring.application.name'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_API_ERROR_LOG"."REQUEST_METHOD" IS '请求方法名'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_API_ERROR_LOG"."REQUEST_URL" IS '请求地址'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_API_ERROR_LOG"."REQUEST_PARAMS" IS '请求参数'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_API_ERROR_LOG"."USER_IP" IS '用户 IP'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_API_ERROR_LOG"."USER_AGENT" IS '浏览器 UA'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_API_ERROR_LOG"."EXCEPTION_TIME" IS '异常发生时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_API_ERROR_LOG"."EXCEPTION_NAME" IS '异常名 + * + * {@link Throwable#getClass()} 的类全名'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_API_ERROR_LOG"."EXCEPTION_MESSAGE" IS '异常导致的消息 + * + * {@link cn.iocoder.common.framework.util.ExceptionUtil#getMessage(Throwable)}'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_API_ERROR_LOG"."EXCEPTION_ROOT_CAUSE_MESSAGE" IS '异常导致的根消息 + * + * {@link cn.iocoder.common.framework.util.ExceptionUtil#getRootCauseMessage(Throwable)}'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_API_ERROR_LOG"."EXCEPTION_STACK_TRACE" IS '异常的栈轨迹 + * + * {@link cn.iocoder.common.framework.util.ExceptionUtil#getServiceException(Exception)}'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_API_ERROR_LOG"."EXCEPTION_CLASS_NAME" IS '异常发生的类全名 + * + * {@link StackTraceElement#getClassName()}'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_API_ERROR_LOG"."EXCEPTION_FILE_NAME" IS '异常发生的类文件 + * + * {@link StackTraceElement#getFileName()}'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_API_ERROR_LOG"."EXCEPTION_METHOD_NAME" IS '异常发生的方法名 + * + * {@link StackTraceElement#getMethodName()}'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_API_ERROR_LOG"."EXCEPTION_LINE_NUMBER" IS '异常发生的方法所在行 + * + * {@link StackTraceElement#getLineNumber()}'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_API_ERROR_LOG"."PROCESS_STATUS" IS '处理状态'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_API_ERROR_LOG"."PROCESS_TIME" IS '处理时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_API_ERROR_LOG"."PROCESS_USER_ID" IS '处理用户编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_API_ERROR_LOG"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_API_ERROR_LOG"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_API_ERROR_LOG"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_API_ERROR_LOG"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_API_ERROR_LOG"."DELETED" IS '是否删除'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_API_ERROR_LOG"."TENANT_ID" IS '租户编号'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."INFRA_CODEGEN_COLUMN" IS '代码生成表字段定义'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CODEGEN_COLUMN"."ID" IS '编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CODEGEN_COLUMN"."TABLE_ID" IS '表编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CODEGEN_COLUMN"."COLUMN_NAME" IS '字段名'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CODEGEN_COLUMN"."DATA_TYPE" IS '字段类型'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CODEGEN_COLUMN"."COLUMN_COMMENT" IS '字段描述'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CODEGEN_COLUMN"."NULLABLE" IS '是否允许为空'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CODEGEN_COLUMN"."PRIMARY_KEY" IS '是否主键'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CODEGEN_COLUMN"."AUTO_INCREMENT" IS '是否自增'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CODEGEN_COLUMN"."ORDINAL_POSITION" IS '排序'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CODEGEN_COLUMN"."JAVA_TYPE" IS 'Java 属性类型'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CODEGEN_COLUMN"."JAVA_FIELD" IS 'Java 属性名'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CODEGEN_COLUMN"."DICT_TYPE" IS '字典类型'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CODEGEN_COLUMN"."EXAMPLE" IS '数据示例'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CODEGEN_COLUMN"."CREATE_OPERATION" IS '是否为 Create 创建操作的字段'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CODEGEN_COLUMN"."UPDATE_OPERATION" IS '是否为 Update 更新操作的字段'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CODEGEN_COLUMN"."LIST_OPERATION" IS '是否为 List 查询操作的字段'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CODEGEN_COLUMN"."LIST_OPERATION_CONDITION" IS 'List 查询操作的条件类型'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CODEGEN_COLUMN"."LIST_OPERATION_RESULT" IS '是否为 List 查询操作的返回字段'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CODEGEN_COLUMN"."HTML_TYPE" IS '显示类型'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CODEGEN_COLUMN"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CODEGEN_COLUMN"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CODEGEN_COLUMN"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CODEGEN_COLUMN"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CODEGEN_COLUMN"."DELETED" IS '是否删除'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."INFRA_CODEGEN_TABLE" IS '代码生成表定义'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CODEGEN_TABLE"."ID" IS '编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CODEGEN_TABLE"."DATA_SOURCE_CONFIG_ID" IS '数据源配置的编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CODEGEN_TABLE"."SCENE" IS '生成场景'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CODEGEN_TABLE"."TABLE_NAME" IS '表名称'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CODEGEN_TABLE"."TABLE_COMMENT" IS '表描述'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CODEGEN_TABLE"."REMARK" IS '备注'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CODEGEN_TABLE"."MODULE_NAME" IS '模块名'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CODEGEN_TABLE"."BUSINESS_NAME" IS '业务名'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CODEGEN_TABLE"."CLASS_NAME" IS '类名称'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CODEGEN_TABLE"."CLASS_COMMENT" IS '类描述'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CODEGEN_TABLE"."AUTHOR" IS '作者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CODEGEN_TABLE"."TEMPLATE_TYPE" IS '模板类型'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CODEGEN_TABLE"."FRONT_TYPE" IS '前端类型'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CODEGEN_TABLE"."PARENT_MENU_ID" IS '父菜单编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CODEGEN_TABLE"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CODEGEN_TABLE"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CODEGEN_TABLE"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CODEGEN_TABLE"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CODEGEN_TABLE"."DELETED" IS '是否删除'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."INFRA_CONFIG" IS '参数配置表'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CONFIG"."ID" IS '参数主键'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CONFIG"."CATEGORY" IS '参数分组'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CONFIG"."TYPE" IS '参数类型'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CONFIG"."NAME" IS '参数名称'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CONFIG"."CONFIG_KEY" IS '参数键名'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CONFIG"."VALUE" IS '参数键值'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CONFIG"."VISIBLE" IS '是否可见'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CONFIG"."REMARK" IS '备注'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CONFIG"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CONFIG"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CONFIG"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CONFIG"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_CONFIG"."DELETED" IS '是否删除'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."INFRA_DATA_SOURCE_CONFIG" IS '数据源配置表'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_DATA_SOURCE_CONFIG"."ID" IS '主键编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_DATA_SOURCE_CONFIG"."NAME" IS '参数名称'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_DATA_SOURCE_CONFIG"."URL" IS '数据源连接'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_DATA_SOURCE_CONFIG"."USERNAME" IS '用户名'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_DATA_SOURCE_CONFIG"."PASSWORD" IS '密码'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_DATA_SOURCE_CONFIG"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_DATA_SOURCE_CONFIG"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_DATA_SOURCE_CONFIG"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_DATA_SOURCE_CONFIG"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_DATA_SOURCE_CONFIG"."DELETED" IS '是否删除'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."INFRA_FILE" IS '文件表'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_FILE"."ID" IS '文件编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_FILE"."CONFIG_ID" IS '配置编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_FILE"."NAME" IS '文件名'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_FILE"."PATH" IS '文件路径'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_FILE"."URL" IS '文件 URL'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_FILE"."TYPE" IS '文件类型'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_FILE"."SIZE" IS '文件大小'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_FILE"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_FILE"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_FILE"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_FILE"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_FILE"."DELETED" IS '是否删除'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."INFRA_FILE_CONFIG" IS '文件配置表'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_FILE_CONFIG"."ID" IS '编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_FILE_CONFIG"."NAME" IS '配置名'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_FILE_CONFIG"."STORAGE" IS '存储器'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_FILE_CONFIG"."REMARK" IS '备注'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_FILE_CONFIG"."MASTER" IS '是否为主配置'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_FILE_CONFIG"."CONFIG" IS '存储配置'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_FILE_CONFIG"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_FILE_CONFIG"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_FILE_CONFIG"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_FILE_CONFIG"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_FILE_CONFIG"."DELETED" IS '是否删除'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."INFRA_FILE_CONTENT" IS '文件表'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_FILE_CONTENT"."ID" IS '编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_FILE_CONTENT"."CONFIG_ID" IS '配置编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_FILE_CONTENT"."PATH" IS '文件路径'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_FILE_CONTENT"."CONTENT" IS '文件内容'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_FILE_CONTENT"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_FILE_CONTENT"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_FILE_CONTENT"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_FILE_CONTENT"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_FILE_CONTENT"."DELETED" IS '是否删除'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."INFRA_JOB" IS '定时任务表'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_JOB"."ID" IS '任务编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_JOB"."NAME" IS '任务名称'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_JOB"."STATUS" IS '任务状态'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_JOB"."HANDLER_NAME" IS '处理器的名字'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_JOB"."HANDLER_PARAM" IS '处理器的参数'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_JOB"."CRON_EXPRESSION" IS 'CRON 表达式'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_JOB"."RETRY_COUNT" IS '重试次数'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_JOB"."RETRY_INTERVAL" IS '重试间隔'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_JOB"."MONITOR_TIMEOUT" IS '监控超时时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_JOB"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_JOB"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_JOB"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_JOB"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_JOB"."DELETED" IS '是否删除'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."INFRA_JOB_LOG" IS '定时任务日志表'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_JOB_LOG"."ID" IS '日志编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_JOB_LOG"."JOB_ID" IS '任务编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_JOB_LOG"."HANDLER_NAME" IS '处理器的名字'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_JOB_LOG"."HANDLER_PARAM" IS '处理器的参数'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_JOB_LOG"."EXECUTE_INDEX" IS '第几次执行'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_JOB_LOG"."BEGIN_TIME" IS '开始执行时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_JOB_LOG"."END_TIME" IS '结束执行时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_JOB_LOG"."DURATION" IS '执行时长'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_JOB_LOG"."STATUS" IS '任务状态'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_JOB_LOG"."RESULT" IS '结果数据'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_JOB_LOG"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_JOB_LOG"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_JOB_LOG"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_JOB_LOG"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_JOB_LOG"."DELETED" IS '是否删除'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."INFRA_TEST_DEMO" IS '字典类型表'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_TEST_DEMO"."ID" IS '编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_TEST_DEMO"."NAME" IS '名字'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_TEST_DEMO"."STATUS" IS '状态'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_TEST_DEMO"."TYPE" IS '类型'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_TEST_DEMO"."CATEGORY" IS '分类'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_TEST_DEMO"."REMARK" IS '备注'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_TEST_DEMO"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_TEST_DEMO"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_TEST_DEMO"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_TEST_DEMO"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."INFRA_TEST_DEMO"."DELETED" IS '是否删除'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."MEMBER_USER" IS '用户'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."MEMBER_USER"."ID" IS '编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."MEMBER_USER"."NICKNAME" IS '用户昵称'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."MEMBER_USER"."AVATAR" IS '头像'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."MEMBER_USER"."STATUS" IS '状态'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."MEMBER_USER"."MOBILE" IS '手机号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."MEMBER_USER"."PASSWORD" IS '密码'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."MEMBER_USER"."REGISTER_IP" IS '注册 IP'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."MEMBER_USER"."LOGIN_IP" IS '最后登录IP'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."MEMBER_USER"."LOGIN_DATE" IS '最后登录时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."MEMBER_USER"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."MEMBER_USER"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."MEMBER_USER"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."MEMBER_USER"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."MEMBER_USER"."DELETED" IS '是否删除'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."MEMBER_USER"."TENANT_ID" IS '租户编号'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."PAY_APP" IS '支付应用信息'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_APP"."ID" IS '应用编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_APP"."NAME" IS '应用名'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_APP"."STATUS" IS '开启状态'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_APP"."REMARK" IS '备注'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_APP"."PAY_NOTIFY_URL" IS '支付结果的回调地址'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_APP"."REFUND_NOTIFY_URL" IS '退款结果的回调地址'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_APP"."MERCHANT_ID" IS '商户编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_APP"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_APP"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_APP"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_APP"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_APP"."DELETED" IS '是否删除'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_APP"."TENANT_ID" IS '租户编号'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."PAY_CHANNEL" IS '支付渠道 +'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_CHANNEL"."ID" IS '商户编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_CHANNEL"."CODE" IS '渠道编码'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_CHANNEL"."STATUS" IS '开启状态'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_CHANNEL"."REMARK" IS '备注'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_CHANNEL"."FEE_RATE" IS '渠道费率,单位:百分比'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_CHANNEL"."MERCHANT_ID" IS '商户编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_CHANNEL"."APP_ID" IS '应用编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_CHANNEL"."CONFIG" IS '支付渠道配置'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_CHANNEL"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_CHANNEL"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_CHANNEL"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_CHANNEL"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_CHANNEL"."DELETED" IS '是否删除'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_CHANNEL"."TENANT_ID" IS '租户编号'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."PAY_DEMO_ORDER" IS '示例订单 +'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_DEMO_ORDER"."ID" IS '订单编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_DEMO_ORDER"."USER_ID" IS '用户编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_DEMO_ORDER"."SPU_ID" IS '商品编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_DEMO_ORDER"."SPU_NAME" IS '商品名字'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_DEMO_ORDER"."PRICE" IS '价格,单位:分'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_DEMO_ORDER"."PAYED" IS '是否已支付:[0:未支付 1:已经支付过]'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_DEMO_ORDER"."PAY_ORDER_ID" IS '支付订单编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_DEMO_ORDER"."PAY_CHANNEL_CODE" IS '支付成功的支付渠道'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_DEMO_ORDER"."PAY_TIME" IS '订单支付时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_DEMO_ORDER"."PAY_REFUND_ID" IS '退款订单编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_DEMO_ORDER"."REFUND_PRICE" IS '退款金额,单位:分'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_DEMO_ORDER"."REFUND_TIME" IS '退款时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_DEMO_ORDER"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_DEMO_ORDER"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_DEMO_ORDER"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_DEMO_ORDER"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_DEMO_ORDER"."DELETED" IS '是否删除'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_DEMO_ORDER"."TENANT_ID" IS '租户编号'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."PAY_MERCHANT" IS '支付商户信息'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_MERCHANT"."ID" IS '商户编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_MERCHANT"."NO" IS '商户号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_MERCHANT"."NAME" IS '商户全称'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_MERCHANT"."SHORT_NAME" IS '商户简称'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_MERCHANT"."STATUS" IS '开启状态'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_MERCHANT"."REMARK" IS '备注'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_MERCHANT"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_MERCHANT"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_MERCHANT"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_MERCHANT"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_MERCHANT"."DELETED" IS '是否删除'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_MERCHANT"."TENANT_ID" IS '租户编号'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."PAY_NOTIFY_LOG" IS '支付通知 App 的日志'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_NOTIFY_LOG"."ID" IS '日志编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_NOTIFY_LOG"."TASK_ID" IS '通知任务编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_NOTIFY_LOG"."NOTIFY_TIMES" IS '第几次被通知'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_NOTIFY_LOG"."RESPONSE" IS '请求参数'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_NOTIFY_LOG"."STATUS" IS '通知状态'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_NOTIFY_LOG"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_NOTIFY_LOG"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_NOTIFY_LOG"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_NOTIFY_LOG"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_NOTIFY_LOG"."DELETED" IS '是否删除'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_NOTIFY_LOG"."TENANT_ID" IS '租户编号'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."PAY_NOTIFY_TASK" IS '商户支付、退款等的通知 +'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_NOTIFY_TASK"."ID" IS '任务编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_NOTIFY_TASK"."MERCHANT_ID" IS '商户编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_NOTIFY_TASK"."APP_ID" IS '应用编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_NOTIFY_TASK"."TYPE" IS '通知类型'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_NOTIFY_TASK"."DATA_ID" IS '数据编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_NOTIFY_TASK"."STATUS" IS '通知状态'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_NOTIFY_TASK"."MERCHANT_ORDER_ID" IS '商户订单编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_NOTIFY_TASK"."NEXT_NOTIFY_TIME" IS '下一次通知时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_NOTIFY_TASK"."LAST_EXECUTE_TIME" IS '最后一次执行时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_NOTIFY_TASK"."NOTIFY_TIMES" IS '当前通知次数'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_NOTIFY_TASK"."MAX_NOTIFY_TIMES" IS '最大可通知次数'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_NOTIFY_TASK"."NOTIFY_URL" IS '异步通知地址'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_NOTIFY_TASK"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_NOTIFY_TASK"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_NOTIFY_TASK"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_NOTIFY_TASK"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_NOTIFY_TASK"."DELETED" IS '是否删除'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_NOTIFY_TASK"."TENANT_ID" IS '租户编号'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."PAY_ORDER" IS '支付订单 +'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_ORDER"."ID" IS '支付订单编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_ORDER"."MERCHANT_ID" IS '商户编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_ORDER"."APP_ID" IS '应用编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_ORDER"."CHANNEL_ID" IS '渠道编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_ORDER"."CHANNEL_CODE" IS '渠道编码'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_ORDER"."MERCHANT_ORDER_ID" IS '商户订单编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_ORDER"."SUBJECT" IS '商品标题'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_ORDER"."BODY" IS '商品描述'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_ORDER"."NOTIFY_URL" IS '异步通知地址'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_ORDER"."NOTIFY_STATUS" IS '通知商户支付结果的回调状态'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_ORDER"."AMOUNT" IS '支付金额,单位:分'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_ORDER"."CHANNEL_FEE_RATE" IS '渠道手续费,单位:百分比'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_ORDER"."CHANNEL_FEE_AMOUNT" IS '渠道手续金额,单位:分'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_ORDER"."STATUS" IS '支付状态'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_ORDER"."USER_IP" IS '用户 IP'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_ORDER"."EXPIRE_TIME" IS '订单失效时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_ORDER"."SUCCESS_TIME" IS '订单支付成功时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_ORDER"."NOTIFY_TIME" IS '订单支付通知时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_ORDER"."SUCCESS_EXTENSION_ID" IS '支付成功的订单拓展单编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_ORDER"."REFUND_STATUS" IS '退款状态'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_ORDER"."REFUND_TIMES" IS '退款次数'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_ORDER"."REFUND_AMOUNT" IS '退款总金额,单位:分'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_ORDER"."CHANNEL_USER_ID" IS '渠道用户编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_ORDER"."CHANNEL_ORDER_NO" IS '渠道订单号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_ORDER"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_ORDER"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_ORDER"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_ORDER"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_ORDER"."DELETED" IS '是否删除'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_ORDER"."TENANT_ID" IS '租户编号'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."PAY_ORDER_EXTENSION" IS '支付订单 +'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_ORDER_EXTENSION"."ID" IS '支付订单编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_ORDER_EXTENSION"."NO" IS '支付订单号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_ORDER_EXTENSION"."ORDER_ID" IS '支付订单编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_ORDER_EXTENSION"."CHANNEL_ID" IS '渠道编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_ORDER_EXTENSION"."CHANNEL_CODE" IS '渠道编码'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_ORDER_EXTENSION"."USER_IP" IS '用户 IP'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_ORDER_EXTENSION"."STATUS" IS '支付状态'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_ORDER_EXTENSION"."CHANNEL_EXTRAS" IS '支付渠道的额外参数'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_ORDER_EXTENSION"."CHANNEL_NOTIFY_DATA" IS '支付渠道异步通知的内容'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_ORDER_EXTENSION"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_ORDER_EXTENSION"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_ORDER_EXTENSION"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_ORDER_EXTENSION"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_ORDER_EXTENSION"."DELETED" IS '是否删除'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_ORDER_EXTENSION"."TENANT_ID" IS '租户编号'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."PAY_REFUND" IS '退款订单'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_REFUND"."ID" IS '支付退款编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_REFUND"."MERCHANT_ID" IS '商户编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_REFUND"."APP_ID" IS '应用编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_REFUND"."CHANNEL_ID" IS '渠道编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_REFUND"."CHANNEL_CODE" IS '渠道编码'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_REFUND"."ORDER_ID" IS '支付订单编号 pay_order 表id'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_REFUND"."TRADE_NO" IS '交易订单号 pay_extension 表no 字段'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_REFUND"."MERCHANT_ORDER_ID" IS '商户订单编号(商户系统生成)'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_REFUND"."MERCHANT_REFUND_NO" IS '商户退款订单号(商户系统生成)'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_REFUND"."NOTIFY_URL" IS '异步通知商户地址'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_REFUND"."NOTIFY_STATUS" IS '通知商户退款结果的回调状态'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_REFUND"."STATUS" IS '退款状态'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_REFUND"."TYPE" IS '退款类型(部分退款,全部退款)'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_REFUND"."PAY_AMOUNT" IS '支付金额,单位分'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_REFUND"."REFUND_AMOUNT" IS '退款金额,单位分'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_REFUND"."REASON" IS '退款原因'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_REFUND"."USER_IP" IS '用户 IP'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_REFUND"."CHANNEL_ORDER_NO" IS '渠道订单号,pay_order 中的channel_order_no 对应'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_REFUND"."CHANNEL_REFUND_NO" IS '渠道退款单号,渠道返回'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_REFUND"."CHANNEL_ERROR_CODE" IS '渠道调用报错时,错误码'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_REFUND"."CHANNEL_ERROR_MSG" IS '渠道调用报错时,错误信息'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_REFUND"."CHANNEL_EXTRAS" IS '支付渠道的额外参数'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_REFUND"."EXPIRE_TIME" IS '退款失效时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_REFUND"."SUCCESS_TIME" IS '退款成功时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_REFUND"."NOTIFY_TIME" IS '退款通知时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_REFUND"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_REFUND"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_REFUND"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_REFUND"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_REFUND"."DELETED" IS '是否删除'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."PAY_REFUND"."TENANT_ID" IS '租户编号'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."SYSTEM_DEPT" IS '部门表'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_DEPT"."ID" IS '部门id'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_DEPT"."NAME" IS '部门名称'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_DEPT"."PARENT_ID" IS '父部门id'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_DEPT"."SORT" IS '显示顺序'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_DEPT"."LEADER_USER_ID" IS '负责人'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_DEPT"."PHONE" IS '联系电话'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_DEPT"."EMAIL" IS '邮箱'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_DEPT"."STATUS" IS '部门状态(0正常 1停用)'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_DEPT"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_DEPT"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_DEPT"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_DEPT"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_DEPT"."DELETED" IS '是否删除'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_DEPT"."TENANT_ID" IS '租户编号'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA" IS '字典数据表'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"."ID" IS '字典编码'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"."SORT" IS '字典排序'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"."LABEL" IS '字典标签'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"."VALUE" IS '字典键值'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"."DICT_TYPE" IS '字典类型'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"."STATUS" IS '状态(0正常 1停用)'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"."COLOR_TYPE" IS '颜色类型'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"."CSS_CLASS" IS 'css 样式'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"."REMARK" IS '备注'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_DICT_DATA"."DELETED" IS '是否删除'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE" IS '字典类型表'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"."ID" IS '字典主键'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"."NAME" IS '字典名称'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"."TYPE" IS '字典类型'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"."STATUS" IS '状态(0正常 1停用)'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"."REMARK" IS '备注'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"."DELETED" IS '是否删除'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_DICT_TYPE"."DELETED_TIME" IS '删除时间'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."SYSTEM_ERROR_CODE" IS '错误码表'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_ERROR_CODE"."ID" IS '错误码编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_ERROR_CODE"."TYPE" IS '错误码类型'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_ERROR_CODE"."APPLICATION_NAME" IS '应用名'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_ERROR_CODE"."CODE" IS '错误码编码'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_ERROR_CODE"."MESSAGE" IS '错误码错误提示'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_ERROR_CODE"."MEMO" IS '备注'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_ERROR_CODE"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_ERROR_CODE"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_ERROR_CODE"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_ERROR_CODE"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_ERROR_CODE"."DELETED" IS '是否删除'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."SYSTEM_LOGIN_LOG" IS '系统访问记录'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_LOGIN_LOG"."ID" IS '访问ID'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_LOGIN_LOG"."LOG_TYPE" IS '日志类型'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_LOGIN_LOG"."TRACE_ID" IS '链路追踪编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_LOGIN_LOG"."USER_ID" IS '用户编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_LOGIN_LOG"."USER_TYPE" IS '用户类型'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_LOGIN_LOG"."USERNAME" IS '用户账号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_LOGIN_LOG"."RESULT" IS '登陆结果'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_LOGIN_LOG"."USER_IP" IS '用户 IP'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_LOGIN_LOG"."USER_AGENT" IS '浏览器 UA'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_LOGIN_LOG"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_LOGIN_LOG"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_LOGIN_LOG"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_LOGIN_LOG"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_LOGIN_LOG"."DELETED" IS '是否删除'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_LOGIN_LOG"."TENANT_ID" IS '租户编号'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."SYSTEM_MAIL_ACCOUNT" IS '邮箱账号表'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MAIL_ACCOUNT"."ID" IS '主键'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MAIL_ACCOUNT"."MAIL" IS '邮箱'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MAIL_ACCOUNT"."USERNAME" IS '用户名'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MAIL_ACCOUNT"."PASSWORD" IS '密码'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MAIL_ACCOUNT"."HOST" IS 'SMTP 服务器域名'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MAIL_ACCOUNT"."PORT" IS 'SMTP 服务器端口'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MAIL_ACCOUNT"."SSL_ENABLE" IS '是否开启 SSL'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MAIL_ACCOUNT"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MAIL_ACCOUNT"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MAIL_ACCOUNT"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MAIL_ACCOUNT"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MAIL_ACCOUNT"."DELETED" IS '是否删除'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."SYSTEM_MAIL_LOG" IS '邮件日志表'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MAIL_LOG"."ID" IS '编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MAIL_LOG"."USER_ID" IS '用户编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MAIL_LOG"."USER_TYPE" IS '用户类型'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MAIL_LOG"."TO_MAIL" IS '接收邮箱地址'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MAIL_LOG"."ACCOUNT_ID" IS '邮箱账号编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MAIL_LOG"."FROM_MAIL" IS '发送邮箱地址'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MAIL_LOG"."TEMPLATE_ID" IS '模板编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MAIL_LOG"."TEMPLATE_CODE" IS '模板编码'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MAIL_LOG"."TEMPLATE_NICKNAME" IS '模版发送人名称'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MAIL_LOG"."TEMPLATE_TITLE" IS '邮件标题'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MAIL_LOG"."TEMPLATE_CONTENT" IS '邮件内容'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MAIL_LOG"."TEMPLATE_PARAMS" IS '邮件参数'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MAIL_LOG"."SEND_STATUS" IS '发送状态'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MAIL_LOG"."SEND_TIME" IS '发送时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MAIL_LOG"."SEND_MESSAGE_ID" IS '发送返回的消息 ID'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MAIL_LOG"."SEND_EXCEPTION" IS '发送异常'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MAIL_LOG"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MAIL_LOG"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MAIL_LOG"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MAIL_LOG"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MAIL_LOG"."DELETED" IS '是否删除'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."SYSTEM_MAIL_TEMPLATE" IS '邮件模版表'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MAIL_TEMPLATE"."ID" IS '编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MAIL_TEMPLATE"."NAME" IS '模板名称'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MAIL_TEMPLATE"."CODE" IS '模板编码'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MAIL_TEMPLATE"."ACCOUNT_ID" IS '发送的邮箱账号编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MAIL_TEMPLATE"."NICKNAME" IS '发送人名称'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MAIL_TEMPLATE"."TITLE" IS '模板标题'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MAIL_TEMPLATE"."CONTENT" IS '模板内容'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MAIL_TEMPLATE"."PARAMS" IS '参数数组'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MAIL_TEMPLATE"."STATUS" IS '开启状态'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MAIL_TEMPLATE"."REMARK" IS '备注'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MAIL_TEMPLATE"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MAIL_TEMPLATE"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MAIL_TEMPLATE"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MAIL_TEMPLATE"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MAIL_TEMPLATE"."DELETED" IS '是否删除'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."SYSTEM_MENU" IS '菜单权限表'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MENU"."ID" IS '菜单ID'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MENU"."NAME" IS '菜单名称'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MENU"."PERMISSION" IS '权限标识'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MENU"."TYPE" IS '菜单类型'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MENU"."SORT" IS '显示顺序'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MENU"."PARENT_ID" IS '父菜单ID'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MENU"."PATH" IS '路由地址'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MENU"."ICON" IS '菜单图标'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MENU"."COMPONENT" IS '组件路径'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MENU"."COMPONENT_NAME" IS '组件名'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MENU"."STATUS" IS '菜单状态'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MENU"."VISIBLE" IS '是否可见'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MENU"."KEEP_ALIVE" IS '是否缓存'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MENU"."ALWAYS_SHOW" IS '是否总是显示'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MENU"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MENU"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MENU"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MENU"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_MENU"."DELETED" IS '是否删除'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."SYSTEM_NOTICE" IS '通知公告表'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_NOTICE"."ID" IS '公告ID'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_NOTICE"."TITLE" IS '公告标题'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_NOTICE"."CONTENT" IS '公告内容'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_NOTICE"."TYPE" IS '公告类型(1通知 2公告)'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_NOTICE"."STATUS" IS '公告状态(0正常 1关闭)'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_NOTICE"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_NOTICE"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_NOTICE"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_NOTICE"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_NOTICE"."DELETED" IS '是否删除'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_NOTICE"."TENANT_ID" IS '租户编号'; + +CREATE TABLE "RUOYI_VUE_PRO"."SYSTEM_NOTIFY_MESSAGE" +( + "ID" BIGINT IDENTITY(9,1) NOT NULL, + "USER_ID" BIGINT NOT NULL, + "USER_TYPE" TINYINT NOT NULL, + "TEMPLATE_ID" BIGINT NOT NULL, + "TEMPLATE_CODE" VARCHAR(64) NOT NULL, + "TEMPLATE_NICKNAME" VARCHAR(63) NOT NULL, + "TEMPLATE_CONTENT" VARCHAR(1024) NOT NULL, + "TEMPLATE_TYPE" INT NOT NULL, + "TEMPLATE_PARAMS" VARCHAR(255) NOT NULL, + "READ_STATUS" BIT NOT NULL, + "READ_TIME" TIMESTAMP(0) NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL, + "TENANT_ID" BIGINT DEFAULT 0 + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."SYSTEM_NOTIFY_TEMPLATE" +( + "ID" BIGINT IDENTITY(4,1) NOT NULL, + "NAME" VARCHAR(63) NOT NULL, + "CODE" VARCHAR(64) NOT NULL, + "NICKNAME" VARCHAR(255) NOT NULL, + "CONTENT" VARCHAR(1024) NOT NULL, + "TYPE" TINYINT NOT NULL, + "PARAMS" VARCHAR(255) NULL, + "STATUS" TINYINT NOT NULL, + "REMARK" VARCHAR(255) NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_ACCESS_TOKEN" +( + "ID" BIGINT IDENTITY(1785,1) NOT NULL, + "USER_ID" BIGINT NOT NULL, + "USER_TYPE" TINYINT NOT NULL, + "ACCESS_TOKEN" VARCHAR(255) NOT NULL, + "REFRESH_TOKEN" VARCHAR(32) NOT NULL, + "CLIENT_ID" VARCHAR(255) NOT NULL, + "SCOPES" VARCHAR(255) NULL, + "EXPIRES_TIME" TIMESTAMP(0) NOT NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL, + "TENANT_ID" BIGINT DEFAULT 0 + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_APPROVE" +( + "ID" BIGINT IDENTITY(82,1) NOT NULL, + "USER_ID" BIGINT NOT NULL, + "USER_TYPE" TINYINT NOT NULL, + "CLIENT_ID" VARCHAR(255) NOT NULL, + "SCOPE" VARCHAR(255) DEFAULT '' + NOT NULL, + "APPROVED" BIT DEFAULT '0' + NOT NULL, + "EXPIRES_TIME" TIMESTAMP(0) NOT NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL, + "TENANT_ID" BIGINT DEFAULT 0 + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CLIENT" +( + "ID" BIGINT IDENTITY(43,1) NOT NULL, + "CLIENT_ID" VARCHAR(255) NOT NULL, + "SECRET" VARCHAR(255) NOT NULL, + "NAME" VARCHAR(255) NOT NULL, + "LOGO" VARCHAR(255) NOT NULL, + "DESCRIPTION" VARCHAR(255) NULL, + "STATUS" TINYINT NOT NULL, + "ACCESS_TOKEN_VALIDITY_SECONDS" INT NOT NULL, + "REFRESH_TOKEN_VALIDITY_SECONDS" INT NOT NULL, + "REDIRECT_URIS" VARCHAR(255) NOT NULL, + "AUTHORIZED_GRANT_TYPES" VARCHAR(255) NOT NULL, + "SCOPES" VARCHAR(255) NULL, + "AUTO_APPROVE_SCOPES" VARCHAR(255) NULL, + "AUTHORITIES" VARCHAR(255) NULL, + "RESOURCE_IDS" VARCHAR(255) NULL, + "ADDITIONAL_INFORMATION" VARCHAR(4096) NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CODE" +( + "ID" BIGINT IDENTITY(147,1) NOT NULL, + "USER_ID" BIGINT NOT NULL, + "USER_TYPE" TINYINT NOT NULL, + "CODE" VARCHAR(32) NOT NULL, + "CLIENT_ID" VARCHAR(255) NOT NULL, + "SCOPES" VARCHAR(255) DEFAULT '' + NULL, + "EXPIRES_TIME" TIMESTAMP(0) NOT NULL, + "REDIRECT_URI" VARCHAR(255) NULL, + "STATE" VARCHAR(255) DEFAULT '' + NOT NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL, + "TENANT_ID" BIGINT DEFAULT 0 + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_REFRESH_TOKEN" +( + "ID" BIGINT IDENTITY(738,1) NOT NULL, + "USER_ID" BIGINT NOT NULL, + "REFRESH_TOKEN" VARCHAR(32) NOT NULL, + "USER_TYPE" TINYINT NOT NULL, + "CLIENT_ID" VARCHAR(255) NOT NULL, + "SCOPES" VARCHAR(255) NULL, + "EXPIRES_TIME" TIMESTAMP(0) NOT NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL, + "TENANT_ID" BIGINT DEFAULT 0 + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."SYSTEM_OPERATE_LOG" +( + "ID" BIGINT IDENTITY(6440,1) NOT NULL, + "TRACE_ID" VARCHAR(64) DEFAULT '' + NOT NULL, + "USER_ID" BIGINT NOT NULL, + "USER_TYPE" TINYINT DEFAULT 0 + NOT NULL, + "MODULE" VARCHAR(50) NOT NULL, + "NAME" VARCHAR(50) NOT NULL, + "TYPE" BIGINT DEFAULT 0 + NOT NULL, + "CONTENT" VARCHAR(2000) DEFAULT '' + NOT NULL, + "EXTS" VARCHAR(512) DEFAULT '' + NOT NULL, + "REQUEST_METHOD" VARCHAR(16) DEFAULT '' + NULL, + "REQUEST_URL" VARCHAR(255) DEFAULT '' + NULL, + "USER_IP" VARCHAR(50) NULL, + "USER_AGENT" VARCHAR(200) NULL, + "JAVA_METHOD" VARCHAR(512) DEFAULT '' + NOT NULL, + "JAVA_METHOD_ARGS" VARCHAR(8000) DEFAULT '' + NULL, + "START_TIME" TIMESTAMP(0) NOT NULL, + "DURATION" INT NOT NULL, + "RESULT_CODE" INT DEFAULT 0 + NOT NULL, + "RESULT_MSG" VARCHAR(512) DEFAULT '' + NULL, + "RESULT_DATA" VARCHAR(4000) DEFAULT '' + NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL, + "TENANT_ID" BIGINT DEFAULT 0 + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."SYSTEM_POST" +( + "ID" BIGINT IDENTITY(5,1) NOT NULL, + "CODE" VARCHAR(64) NOT NULL, + "NAME" VARCHAR(50) NOT NULL, + "SORT" INT NOT NULL, + "STATUS" TINYINT NOT NULL, + "REMARK" VARCHAR(500) NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL, + "TENANT_ID" BIGINT DEFAULT 0 + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."SYSTEM_ROLE" +( + "ID" BIGINT IDENTITY(139,1) NOT NULL, + "NAME" VARCHAR(30) NOT NULL, + "CODE" VARCHAR(100) NOT NULL, + "SORT" INT NOT NULL, + "DATA_SCOPE" TINYINT DEFAULT 1 + NOT NULL, + "DATA_SCOPE_DEPT_IDS" VARCHAR(500) DEFAULT '' + NOT NULL, + "STATUS" TINYINT NOT NULL, + "TYPE" TINYINT NOT NULL, + "REMARK" VARCHAR(500) NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL, + "TENANT_ID" BIGINT DEFAULT 0 + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU" +( + "ID" BIGINT IDENTITY(2873,1) NOT NULL, + "ROLE_ID" BIGINT NOT NULL, + "MENU_ID" BIGINT NOT NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL, + "TENANT_ID" BIGINT DEFAULT 0 + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."SYSTEM_SENSITIVE_WORD" +( + "ID" BIGINT IDENTITY(6,1) NOT NULL, + "NAME" VARCHAR(255) NOT NULL, + "DESCRIPTION" VARCHAR(512) NULL, + "TAGS" VARCHAR(255) NULL, + "STATUS" TINYINT NOT NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."SYSTEM_SMS_CHANNEL" +( + "ID" BIGINT IDENTITY(7,1) NOT NULL, + "SIGNATURE" VARCHAR(12) NOT NULL, + "CODE" VARCHAR(63) NOT NULL, + "STATUS" TINYINT NOT NULL, + "REMARK" VARCHAR(255) NULL, + "API_KEY" VARCHAR(128) NOT NULL, + "API_SECRET" VARCHAR(128) NULL, + "CALLBACK_URL" VARCHAR(255) NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."SYSTEM_SMS_CODE" +( + "ID" BIGINT IDENTITY(484,1) NOT NULL, + "MOBILE" VARCHAR(11) NOT NULL, + "CODE" VARCHAR(6) NOT NULL, + "CREATE_IP" VARCHAR(15) NOT NULL, + "SCENE" TINYINT NOT NULL, + "TODAY_INDEX" TINYINT NOT NULL, + "USED" TINYINT NOT NULL, + "USED_TIME" TIMESTAMP(0) NULL, + "USED_IP" VARCHAR(255) NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL, + "TENANT_ID" BIGINT DEFAULT 0 + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."SYSTEM_SMS_LOG" +( + "ID" BIGINT IDENTITY(349,1) NOT NULL, + "CHANNEL_ID" BIGINT NOT NULL, + "CHANNEL_CODE" VARCHAR(63) NOT NULL, + "TEMPLATE_ID" BIGINT NOT NULL, + "TEMPLATE_CODE" VARCHAR(63) NOT NULL, + "TEMPLATE_TYPE" TINYINT NOT NULL, + "TEMPLATE_CONTENT" VARCHAR(255) NOT NULL, + "TEMPLATE_PARAMS" VARCHAR(255) NOT NULL, + "API_TEMPLATE_ID" VARCHAR(63) NOT NULL, + "MOBILE" VARCHAR(11) NOT NULL, + "USER_ID" BIGINT NULL, + "USER_TYPE" TINYINT NULL, + "SEND_STATUS" TINYINT DEFAULT 0 + NOT NULL, + "SEND_TIME" TIMESTAMP(0) NULL, + "SEND_CODE" INT NULL, + "SEND_MSG" VARCHAR(255) NULL, + "API_SEND_CODE" VARCHAR(63) NULL, + "API_SEND_MSG" VARCHAR(255) NULL, + "API_REQUEST_ID" VARCHAR(255) NULL, + "API_SERIAL_NO" VARCHAR(255) NULL, + "RECEIVE_STATUS" TINYINT DEFAULT 0 + NOT NULL, + "RECEIVE_TIME" TIMESTAMP(0) NULL, + "API_RECEIVE_CODE" VARCHAR(63) NULL, + "API_RECEIVE_MSG" VARCHAR(255) NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."SYSTEM_SMS_TEMPLATE" +( + "ID" BIGINT IDENTITY(14,1) NOT NULL, + "TYPE" TINYINT NOT NULL, + "STATUS" TINYINT NOT NULL, + "CODE" VARCHAR(63) NOT NULL, + "NAME" VARCHAR(63) NOT NULL, + "CONTENT" VARCHAR(255) NOT NULL, + "PARAMS" VARCHAR(255) NOT NULL, + "REMARK" VARCHAR(255) NULL, + "API_TEMPLATE_ID" VARCHAR(63) NOT NULL, + "CHANNEL_ID" BIGINT NOT NULL, + "CHANNEL_CODE" VARCHAR(63) NOT NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."SYSTEM_SOCIAL_USER" +( + "ID" BIGINT IDENTITY(20,1) NOT NULL, + "TYPE" TINYINT NOT NULL, + "OPENID" VARCHAR(32) NOT NULL, + "TOKEN" VARCHAR(256) NULL, + "RAW_TOKEN_INFO" VARCHAR(1024) NOT NULL, + "NICKNAME" VARCHAR(32) NOT NULL, + "AVATAR" VARCHAR(255) NULL, + "RAW_USER_INFO" VARCHAR(1024) NOT NULL, + "CODE" VARCHAR(256) NOT NULL, + "STATE" VARCHAR(256) NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL, + "TENANT_ID" BIGINT DEFAULT 0 + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."SYSTEM_SOCIAL_USER_BIND" +( + "ID" BIGINT IDENTITY(39,1) NOT NULL, + "USER_ID" BIGINT NOT NULL, + "USER_TYPE" TINYINT NOT NULL, + "SOCIAL_TYPE" TINYINT NOT NULL, + "SOCIAL_USER_ID" BIGINT NOT NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL, + "TENANT_ID" BIGINT DEFAULT 0 + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."SYSTEM_TENANT" +( + "ID" BIGINT IDENTITY(150,1) NOT NULL, + "NAME" VARCHAR(30) NOT NULL, + "CONTACT_USER_ID" BIGINT NULL, + "CONTACT_NAME" VARCHAR(30) NOT NULL, + "CONTACT_MOBILE" VARCHAR(500) NULL, + "STATUS" TINYINT DEFAULT 0 + NOT NULL, + "DOMAIN" VARCHAR(256) DEFAULT '' + NULL, + "PACKAGE_ID" BIGINT NOT NULL, + "EXPIRE_TIME" TIMESTAMP(0) NOT NULL, + "ACCOUNT_COUNT" INT NOT NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NOT NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."SYSTEM_TENANT_PACKAGE" +( + "ID" BIGINT IDENTITY(112,1) NOT NULL, + "NAME" VARCHAR(30) NOT NULL, + "STATUS" TINYINT DEFAULT 0 + NOT NULL, + "REMARK" VARCHAR(256) DEFAULT '' + NULL, + "MENU_IDS" VARCHAR(2048) NOT NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NOT NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."SYSTEM_USERS" +( + "ID" BIGINT IDENTITY(126,1) NOT NULL, + "USERNAME" VARCHAR(30) NOT NULL, + "PASSWORD" VARCHAR(100) DEFAULT '' + NOT NULL, + "NICKNAME" VARCHAR(30) NOT NULL, + "REMARK" VARCHAR(500) NULL, + "DEPT_ID" BIGINT NULL, + "POST_IDS" VARCHAR(255) NULL, + "EMAIL" VARCHAR(50) DEFAULT '' + NULL, + "MOBILE" VARCHAR(11) DEFAULT '' + NULL, + "SEX" TINYINT DEFAULT 0 + NULL, + "AVATAR" VARCHAR(512) DEFAULT '' + NULL, + "STATUS" TINYINT DEFAULT 0 + NOT NULL, + "LOGIN_IP" VARCHAR(50) DEFAULT '' + NULL, + "LOGIN_DATE" TIMESTAMP(0) NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL, + "TENANT_ID" BIGINT DEFAULT 0 + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."SYSTEM_USER_POST" +( + "ID" BIGINT IDENTITY(118,1) NOT NULL, + "USER_ID" BIGINT DEFAULT 0 + NOT NULL, + "POST_ID" BIGINT DEFAULT 0 + NOT NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NOT NULL, + "DELETED" BIT DEFAULT '0' + NOT NULL, + "TENANT_ID" BIGINT DEFAULT 0 + NOT NULL +); +CREATE TABLE "RUOYI_VUE_PRO"."SYSTEM_USER_ROLE" +( + "ID" BIGINT IDENTITY(31,1) NOT NULL, + "USER_ID" BIGINT NOT NULL, + "ROLE_ID" BIGINT NOT NULL, + "CREATOR" VARCHAR(64) DEFAULT '' + NULL, + "CREATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NULL, + "UPDATER" VARCHAR(64) DEFAULT '' + NULL, + "UPDATE_TIME" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() + NULL, + "DELETED" BIT DEFAULT '0' + NULL, + "TENANT_ID" BIGINT DEFAULT 0 + NOT NULL +); +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_NOTIFY_MESSAGE" ON; +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_NOTIFY_MESSAGE"("ID","USER_ID","USER_TYPE","TEMPLATE_ID","TEMPLATE_CODE","TEMPLATE_NICKNAME","TEMPLATE_CONTENT","TEMPLATE_TYPE","TEMPLATE_PARAMS","READ_STATUS","READ_TIME","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2,1,2,1,'test','123','我是 1,我开始 2 了',1,'{"name":"1","what":"2"}',1,'2023-02-10 00:47:04','1','2023-01-28 11:44:08','1','2023-02-10 00:47:04',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_NOTIFY_MESSAGE"("ID","USER_ID","USER_TYPE","TEMPLATE_ID","TEMPLATE_CODE","TEMPLATE_NICKNAME","TEMPLATE_CONTENT","TEMPLATE_TYPE","TEMPLATE_PARAMS","READ_STATUS","READ_TIME","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(3,1,2,1,'test','123','我是 1,我开始 2 了',1,'{"name":"1","what":"2"}',1,'2023-02-10 00:47:04','1','2023-01-28 11:45:04','1','2023-02-10 00:47:04',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_NOTIFY_MESSAGE"("ID","USER_ID","USER_TYPE","TEMPLATE_ID","TEMPLATE_CODE","TEMPLATE_NICKNAME","TEMPLATE_CONTENT","TEMPLATE_TYPE","TEMPLATE_PARAMS","READ_STATUS","READ_TIME","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(4,103,2,2,'register','系统消息','你好,欢迎 哈哈 加入大家庭!',2,'{"name":"哈哈"}',0,null,'1','2023-01-28 21:02:20','1','2023-01-28 21:02:20',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_NOTIFY_MESSAGE"("ID","USER_ID","USER_TYPE","TEMPLATE_ID","TEMPLATE_CODE","TEMPLATE_NICKNAME","TEMPLATE_CONTENT","TEMPLATE_TYPE","TEMPLATE_PARAMS","READ_STATUS","READ_TIME","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(5,1,2,1,'test','123','我是 芋艿,我开始 写代码 了',1,'{"name":"芋艿","what":"写代码"}',1,'2023-02-10 00:47:04','1','2023-01-28 22:21:42','1','2023-02-10 00:47:04',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_NOTIFY_MESSAGE"("ID","USER_ID","USER_TYPE","TEMPLATE_ID","TEMPLATE_CODE","TEMPLATE_NICKNAME","TEMPLATE_CONTENT","TEMPLATE_TYPE","TEMPLATE_PARAMS","READ_STATUS","READ_TIME","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(6,1,2,1,'test','123','我是 芋艿,我开始 写代码 了',1,'{"name":"芋艿","what":"写代码"}',1,'2023-01-29 10:52:06','1','2023-01-28 22:22:07','1','2023-01-29 10:52:06',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_NOTIFY_MESSAGE"("ID","USER_ID","USER_TYPE","TEMPLATE_ID","TEMPLATE_CODE","TEMPLATE_NICKNAME","TEMPLATE_CONTENT","TEMPLATE_TYPE","TEMPLATE_PARAMS","READ_STATUS","READ_TIME","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(7,1,2,1,'test','123','我是 2,我开始 3 了',1,'{"name":"2","what":"3"}',1,'2023-01-29 10:52:06','1','2023-01-28 23:45:21','1','2023-01-29 10:52:06',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_NOTIFY_MESSAGE"("ID","USER_ID","USER_TYPE","TEMPLATE_ID","TEMPLATE_CODE","TEMPLATE_NICKNAME","TEMPLATE_CONTENT","TEMPLATE_TYPE","TEMPLATE_PARAMS","READ_STATUS","READ_TIME","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(8,1,2,2,'register','系统消息','你好,欢迎 123 加入大家庭!',2,'{"name":"123"}',1,'2023-01-29 10:52:06','1','2023-01-28 23:50:21','1','2023-01-29 10:52:06',0,1); + +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_NOTIFY_MESSAGE" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_NOTIFY_TEMPLATE" ON; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_NOTIFY_TEMPLATE" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_ACCESS_TOKEN" ON; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_ACCESS_TOKEN" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_APPROVE" ON; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_APPROVE" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CLIENT" ON; +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CLIENT"("ID","CLIENT_ID","SECRET","NAME","LOGO","DESCRIPTION","STATUS","ACCESS_TOKEN_VALIDITY_SECONDS","REFRESH_TOKEN_VALIDITY_SECONDS","REDIRECT_URIS","AUTHORIZED_GRANT_TYPES","SCOPES","AUTO_APPROVE_SCOPES","AUTHORITIES","RESOURCE_IDS","ADDITIONAL_INFORMATION","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1,'default','admin123','闻荫源码','http://test.win.iocoder.cn/a5e2e244368878a366b516805a4aabf1.png','我是描述',0,1800,43200,'["https://www.iocoder.cn","https://doc.iocoder.cn"]','["password","authorization_code","implicit","refresh_token"]','["user.read","user.write"]','[]','["user.read","user.write"]','[]','{}','1','2022-05-11 21:47:12','1','2022-07-05 16:23:52',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CLIENT"("ID","CLIENT_ID","SECRET","NAME","LOGO","DESCRIPTION","STATUS","ACCESS_TOKEN_VALIDITY_SECONDS","REFRESH_TOKEN_VALIDITY_SECONDS","REDIRECT_URIS","AUTHORIZED_GRANT_TYPES","SCOPES","AUTO_APPROVE_SCOPES","AUTHORITIES","RESOURCE_IDS","ADDITIONAL_INFORMATION","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(40,'test','test2','biubiu','http://test.win.iocoder.cn/277a899d573723f1fcdfb57340f00379.png',null,0,1800,43200,'["https://www.iocoder.cn"]','["password","authorization_code","implicit"]','["user_info","projects"]','["user_info"]','[]','[]','{}','1','2022-05-12 00:28:20','1','2022-06-19 00:26:13',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CLIENT"("ID","CLIENT_ID","SECRET","NAME","LOGO","DESCRIPTION","STATUS","ACCESS_TOKEN_VALIDITY_SECONDS","REFRESH_TOKEN_VALIDITY_SECONDS","REDIRECT_URIS","AUTHORIZED_GRANT_TYPES","SCOPES","AUTO_APPROVE_SCOPES","AUTHORITIES","RESOURCE_IDS","ADDITIONAL_INFORMATION","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(41,'win-sso-demo-by-code','test','基于授权码模式,如何实现 SSO 单点登录?','http://test.win.iocoder.cn/fe4ed36596adad5120036ef61a6d0153654544d44af8dd4ad3ffe8f759933d6f.png',null,0,1800,43200,'["http://127.0.0.1:18080"]','["authorization_code","refresh_token"]','["user.read","user.write"]','[]','[]','[]',null,'1','2022-09-29 13:28:31','1','2022-09-29 13:28:31',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CLIENT"("ID","CLIENT_ID","SECRET","NAME","LOGO","DESCRIPTION","STATUS","ACCESS_TOKEN_VALIDITY_SECONDS","REFRESH_TOKEN_VALIDITY_SECONDS","REDIRECT_URIS","AUTHORIZED_GRANT_TYPES","SCOPES","AUTO_APPROVE_SCOPES","AUTHORITIES","RESOURCE_IDS","ADDITIONAL_INFORMATION","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(42,'win-sso-demo-by-password','test','基于密码模式,如何实现 SSO 单点登录?','http://test.win.iocoder.cn/604bdc695e13b3b22745be704d1f2aa8ee05c5f26f9fead6d1ca49005afbc857.jpeg',null,0,1800,43200,'["http://127.0.0.1:18080"]','["password","refresh_token"]','["user.read","user.write"]','[]','[]','[]',null,'1','2022-10-04 17:40:16','1','2022-10-04 20:31:21',0); + +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CLIENT" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CODE" ON; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CODE" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_REFRESH_TOKEN" ON; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_REFRESH_TOKEN" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_OPERATE_LOG" ON; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_OPERATE_LOG" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_POST" ON; +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_POST"("ID","CODE","NAME","SORT","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1,'ceo','董事长',1,0,'','admin','2021-01-06 17:03:48','1','2023-02-11 15:19:04',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_POST"("ID","CODE","NAME","SORT","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2,'se','项目经理',2,0,'','admin','2021-01-05 17:03:48','1','2021-12-12 10:47:47',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_POST"("ID","CODE","NAME","SORT","STATUS","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(4,'user','普通员工',4,0,'111','admin','2021-01-05 17:03:48','1','2023-02-11 15:19:00',0,1); + +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_POST" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_ROLE" ON; +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE"("ID","NAME","CODE","SORT","DATA_SCOPE","DATA_SCOPE_DEPT_IDS","STATUS","TYPE","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1,'超级管理员','super_admin',1,1,'',0,1,'超级管理员','admin','2021-01-05 17:03:48','','2022-02-22 05:08:21',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE"("ID","NAME","CODE","SORT","DATA_SCOPE","DATA_SCOPE_DEPT_IDS","STATUS","TYPE","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2,'普通角色','common',2,2,'',0,1,'普通角色','admin','2021-01-05 17:03:48','','2022-02-22 05:08:20',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE"("ID","NAME","CODE","SORT","DATA_SCOPE","DATA_SCOPE_DEPT_IDS","STATUS","TYPE","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(101,'测试账号','test',0,1,'[]',0,2,'132','','2021-01-06 13:49:35','1','2022-09-25 12:09:38',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE"("ID","NAME","CODE","SORT","DATA_SCOPE","DATA_SCOPE_DEPT_IDS","STATUS","TYPE","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(109,'租户管理员','tenant_admin',0,1,'',0,1,'系统自动生成','1','2022-02-22 00:56:14','1','2022-02-22 00:56:14',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE"("ID","NAME","CODE","SORT","DATA_SCOPE","DATA_SCOPE_DEPT_IDS","STATUS","TYPE","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(110,'测试角色','test',0,1,'[]',0,2,'嘿嘿','110','2022-02-23 00:14:34','110','2022-02-23 13:14:58',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE"("ID","NAME","CODE","SORT","DATA_SCOPE","DATA_SCOPE_DEPT_IDS","STATUS","TYPE","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(111,'租户管理员','tenant_admin',0,1,'',0,1,'系统自动生成','1','2022-03-07 21:37:58','1','2022-03-07 21:37:58',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE"("ID","NAME","CODE","SORT","DATA_SCOPE","DATA_SCOPE_DEPT_IDS","STATUS","TYPE","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(113,'租户管理员','tenant_admin',0,1,'',0,1,'系统自动生成','1','2022-05-17 10:07:10','1','2022-05-17 10:07:10',0,124); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE"("ID","NAME","CODE","SORT","DATA_SCOPE","DATA_SCOPE_DEPT_IDS","STATUS","TYPE","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(114,'租户管理员','tenant_admin',0,1,'',0,1,'系统自动生成','1','2022-12-30 11:32:03','1','2022-12-30 11:32:03',0,125); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE"("ID","NAME","CODE","SORT","DATA_SCOPE","DATA_SCOPE_DEPT_IDS","STATUS","TYPE","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(115,'租户管理员','tenant_admin',0,1,'',0,1,'系统自动生成','1','2022-12-30 11:33:42','1','2022-12-30 11:33:42',0,126); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE"("ID","NAME","CODE","SORT","DATA_SCOPE","DATA_SCOPE_DEPT_IDS","STATUS","TYPE","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(116,'租户管理员','tenant_admin',0,1,'',0,1,'系统自动生成','1','2022-12-30 11:33:48','1','2022-12-30 11:33:48',0,127); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE"("ID","NAME","CODE","SORT","DATA_SCOPE","DATA_SCOPE_DEPT_IDS","STATUS","TYPE","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(118,'租户管理员','tenant_admin',0,1,'',0,1,'系统自动生成','1','2022-12-30 11:47:52','1','2022-12-30 11:47:52',0,129); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE"("ID","NAME","CODE","SORT","DATA_SCOPE","DATA_SCOPE_DEPT_IDS","STATUS","TYPE","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(136,'租户管理员','tenant_admin',0,1,'',0,1,'系统自动生成','1','2023-03-05 21:23:32','1','2023-03-05 21:23:32',0,147); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE"("ID","NAME","CODE","SORT","DATA_SCOPE","DATA_SCOPE_DEPT_IDS","STATUS","TYPE","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(137,'租户管理员','tenant_admin',0,1,'',0,1,'系统自动生成','1','2023-03-05 21:42:27','1','2023-03-05 21:42:27',0,148); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE"("ID","NAME","CODE","SORT","DATA_SCOPE","DATA_SCOPE_DEPT_IDS","STATUS","TYPE","REMARK","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(138,'租户管理员','tenant_admin',0,1,'',0,1,'系统自动生成','1','2023-03-05 21:59:02','1','2023-03-05 21:59:02',0,149); + +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_ROLE" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU" ON; +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(263,109,1,'1','2022-02-22 00:56:14','1','2022-02-22 00:56:14',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(434,2,1,'1','2022-02-22 13:09:12','1','2022-02-22 13:09:12',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(454,2,1093,'1','2022-02-22 13:09:12','1','2022-02-22 13:09:12',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(455,2,1094,'1','2022-02-22 13:09:12','1','2022-02-22 13:09:12',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(460,2,1100,'1','2022-02-22 13:09:12','1','2022-02-22 13:09:12',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(467,2,1107,'1','2022-02-22 13:09:12','1','2022-02-22 13:09:12',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(470,2,1110,'1','2022-02-22 13:09:12','1','2022-02-22 13:09:12',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(476,2,1117,'1','2022-02-22 13:09:12','1','2022-02-22 13:09:12',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(477,2,100,'1','2022-02-22 13:09:12','1','2022-02-22 13:09:12',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(478,2,101,'1','2022-02-22 13:09:12','1','2022-02-22 13:09:12',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(479,2,102,'1','2022-02-22 13:09:12','1','2022-02-22 13:09:12',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(480,2,1126,'1','2022-02-22 13:09:12','1','2022-02-22 13:09:12',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(481,2,103,'1','2022-02-22 13:09:12','1','2022-02-22 13:09:12',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(483,2,104,'1','2022-02-22 13:09:12','1','2022-02-22 13:09:12',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(485,2,105,'1','2022-02-22 13:09:12','1','2022-02-22 13:09:12',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(488,2,107,'1','2022-02-22 13:09:12','1','2022-02-22 13:09:12',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(490,2,108,'1','2022-02-22 13:09:12','1','2022-02-22 13:09:12',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(492,2,109,'1','2022-02-22 13:09:12','1','2022-02-22 13:09:12',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(498,2,1138,'1','2022-02-22 13:09:12','1','2022-02-22 13:09:12',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(523,2,1224,'1','2022-02-22 13:09:12','1','2022-02-22 13:09:12',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(524,2,1225,'1','2022-02-22 13:09:12','1','2022-02-22 13:09:12',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(541,2,500,'1','2022-02-22 13:09:12','1','2022-02-22 13:09:12',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(543,2,501,'1','2022-02-22 13:09:12','1','2022-02-22 13:09:12',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(675,2,2,'1','2022-02-22 13:16:57','1','2022-02-22 13:16:57',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(689,2,1077,'1','2022-02-22 13:16:57','1','2022-02-22 13:16:57',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(690,2,1078,'1','2022-02-22 13:16:57','1','2022-02-22 13:16:57',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(692,2,1083,'1','2022-02-22 13:16:57','1','2022-02-22 13:16:57',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(693,2,1084,'1','2022-02-22 13:16:57','1','2022-02-22 13:16:57',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(699,2,1090,'1','2022-02-22 13:16:57','1','2022-02-22 13:16:57',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(703,2,106,'1','2022-02-22 13:16:57','1','2022-02-22 13:16:57',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(704,2,110,'1','2022-02-22 13:16:57','1','2022-02-22 13:16:57',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(705,2,111,'1','2022-02-22 13:16:57','1','2022-02-22 13:16:57',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(706,2,112,'1','2022-02-22 13:16:57','1','2022-02-22 13:16:57',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(707,2,113,'1','2022-02-22 13:16:57','1','2022-02-22 13:16:57',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1296,110,1,'110','2022-02-23 00:23:55','110','2022-02-23 00:23:55',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1489,1,1,'1','2022-02-23 20:03:57','1','2022-02-23 20:03:57',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1490,1,2,'1','2022-02-23 20:03:57','1','2022-02-23 20:03:57',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1494,1,1077,'1','2022-02-23 20:03:57','1','2022-02-23 20:03:57',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1495,1,1078,'1','2022-02-23 20:03:57','1','2022-02-23 20:03:57',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1496,1,1083,'1','2022-02-23 20:03:57','1','2022-02-23 20:03:57',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1497,1,1084,'1','2022-02-23 20:03:57','1','2022-02-23 20:03:57',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1498,1,1090,'1','2022-02-23 20:03:57','1','2022-02-23 20:03:57',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1499,1,1093,'1','2022-02-23 20:03:57','1','2022-02-23 20:03:57',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1500,1,1094,'1','2022-02-23 20:03:57','1','2022-02-23 20:03:57',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1501,1,1100,'1','2022-02-23 20:03:57','1','2022-02-23 20:03:57',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1502,1,1107,'1','2022-02-23 20:03:57','1','2022-02-23 20:03:57',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1503,1,1110,'1','2022-02-23 20:03:57','1','2022-02-23 20:03:57',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1505,1,1117,'1','2022-02-23 20:03:57','1','2022-02-23 20:03:57',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1506,1,100,'1','2022-02-23 20:03:57','1','2022-02-23 20:03:57',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1507,1,101,'1','2022-02-23 20:03:57','1','2022-02-23 20:03:57',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1508,1,102,'1','2022-02-23 20:03:57','1','2022-02-23 20:03:57',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1509,1,1126,'1','2022-02-23 20:03:57','1','2022-02-23 20:03:57',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1510,1,103,'1','2022-02-23 20:03:57','1','2022-02-23 20:03:57',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1511,1,104,'1','2022-02-23 20:03:57','1','2022-02-23 20:03:57',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1512,1,105,'1','2022-02-23 20:03:57','1','2022-02-23 20:03:57',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1513,1,106,'1','2022-02-23 20:03:57','1','2022-02-23 20:03:57',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1514,1,107,'1','2022-02-23 20:03:57','1','2022-02-23 20:03:57',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1515,1,108,'1','2022-02-23 20:03:57','1','2022-02-23 20:03:57',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1516,1,109,'1','2022-02-23 20:03:57','1','2022-02-23 20:03:57',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1517,1,110,'1','2022-02-23 20:03:57','1','2022-02-23 20:03:57',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1518,1,111,'1','2022-02-23 20:03:57','1','2022-02-23 20:03:57',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1519,1,112,'1','2022-02-23 20:03:57','1','2022-02-23 20:03:57',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1520,1,113,'1','2022-02-23 20:03:57','1','2022-02-23 20:03:57',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1522,1,1138,'1','2022-02-23 20:03:57','1','2022-02-23 20:03:57',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1525,1,1224,'1','2022-02-23 20:03:57','1','2022-02-23 20:03:57',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1526,1,1225,'1','2022-02-23 20:03:57','1','2022-02-23 20:03:57',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1527,1,500,'1','2022-02-23 20:03:57','1','2022-02-23 20:03:57',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1528,1,501,'1','2022-02-23 20:03:57','1','2022-02-23 20:03:57',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1578,111,1,'1','2022-03-07 21:37:58','1','2022-03-07 21:37:58',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1604,101,1216,'1','2022-03-19 21:45:52','1','2022-03-19 21:45:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1605,101,1217,'1','2022-03-19 21:45:52','1','2022-03-19 21:45:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1606,101,1218,'1','2022-03-19 21:45:52','1','2022-03-19 21:45:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1607,101,1219,'1','2022-03-19 21:45:52','1','2022-03-19 21:45:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1608,101,1220,'1','2022-03-19 21:45:52','1','2022-03-19 21:45:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1609,101,1221,'1','2022-03-19 21:45:52','1','2022-03-19 21:45:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1610,101,5,'1','2022-03-19 21:45:52','1','2022-03-19 21:45:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1611,101,1222,'1','2022-03-19 21:45:52','1','2022-03-19 21:45:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1612,101,1118,'1','2022-03-19 21:45:52','1','2022-03-19 21:45:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1613,101,1119,'1','2022-03-19 21:45:52','1','2022-03-19 21:45:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1614,101,1120,'1','2022-03-19 21:45:52','1','2022-03-19 21:45:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1615,101,1185,'1','2022-03-19 21:45:52','1','2022-03-19 21:45:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1616,101,1186,'1','2022-03-19 21:45:52','1','2022-03-19 21:45:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1617,101,1187,'1','2022-03-19 21:45:52','1','2022-03-19 21:45:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1618,101,1188,'1','2022-03-19 21:45:52','1','2022-03-19 21:45:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1619,101,1189,'1','2022-03-19 21:45:52','1','2022-03-19 21:45:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1620,101,1190,'1','2022-03-19 21:45:52','1','2022-03-19 21:45:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1621,101,1191,'1','2022-03-19 21:45:52','1','2022-03-19 21:45:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1622,101,1192,'1','2022-03-19 21:45:52','1','2022-03-19 21:45:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1623,101,1193,'1','2022-03-19 21:45:52','1','2022-03-19 21:45:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1624,101,1194,'1','2022-03-19 21:45:52','1','2022-03-19 21:45:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1625,101,1195,'1','2022-03-19 21:45:52','1','2022-03-19 21:45:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1626,101,1196,'1','2022-03-19 21:45:52','1','2022-03-19 21:45:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1627,101,1197,'1','2022-03-19 21:45:52','1','2022-03-19 21:45:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1628,101,1198,'1','2022-03-19 21:45:52','1','2022-03-19 21:45:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1629,101,1199,'1','2022-03-19 21:45:52','1','2022-03-19 21:45:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1630,101,1200,'1','2022-03-19 21:45:52','1','2022-03-19 21:45:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1631,101,1201,'1','2022-03-19 21:45:52','1','2022-03-19 21:45:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1632,101,1202,'1','2022-03-19 21:45:52','1','2022-03-19 21:45:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1633,101,1207,'1','2022-03-19 21:45:52','1','2022-03-19 21:45:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1634,101,1208,'1','2022-03-19 21:45:52','1','2022-03-19 21:45:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1635,101,1209,'1','2022-03-19 21:45:52','1','2022-03-19 21:45:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1636,101,1210,'1','2022-03-19 21:45:52','1','2022-03-19 21:45:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1637,101,1211,'1','2022-03-19 21:45:52','1','2022-03-19 21:45:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1638,101,1212,'1','2022-03-19 21:45:52','1','2022-03-19 21:45:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1639,101,1213,'1','2022-03-19 21:45:52','1','2022-03-19 21:45:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1640,101,1215,'1','2022-03-19 21:45:52','1','2022-03-19 21:45:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1641,101,2,'1','2022-04-01 22:21:24','1','2022-04-01 22:21:24',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1642,101,1031,'1','2022-04-01 22:21:37','1','2022-04-01 22:21:37',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1643,101,1032,'1','2022-04-01 22:21:37','1','2022-04-01 22:21:37',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1644,101,1033,'1','2022-04-01 22:21:37','1','2022-04-01 22:21:37',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1645,101,1034,'1','2022-04-01 22:21:37','1','2022-04-01 22:21:37',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1646,101,1035,'1','2022-04-01 22:21:37','1','2022-04-01 22:21:37',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1647,101,1050,'1','2022-04-01 22:21:37','1','2022-04-01 22:21:37',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1648,101,1051,'1','2022-04-01 22:21:37','1','2022-04-01 22:21:37',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1649,101,1052,'1','2022-04-01 22:21:37','1','2022-04-01 22:21:37',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1650,101,1053,'1','2022-04-01 22:21:37','1','2022-04-01 22:21:37',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1651,101,1054,'1','2022-04-01 22:21:37','1','2022-04-01 22:21:37',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1652,101,1056,'1','2022-04-01 22:21:37','1','2022-04-01 22:21:37',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1653,101,1057,'1','2022-04-01 22:21:37','1','2022-04-01 22:21:37',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1654,101,1058,'1','2022-04-01 22:21:37','1','2022-04-01 22:21:37',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1655,101,1059,'1','2022-04-01 22:21:37','1','2022-04-01 22:21:37',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1656,101,1060,'1','2022-04-01 22:21:37','1','2022-04-01 22:21:37',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1657,101,1066,'1','2022-04-01 22:21:37','1','2022-04-01 22:21:37',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1658,101,1067,'1','2022-04-01 22:21:37','1','2022-04-01 22:21:37',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1659,101,1070,'1','2022-04-01 22:21:37','1','2022-04-01 22:21:37',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1660,101,1071,'1','2022-04-01 22:21:37','1','2022-04-01 22:21:37',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1661,101,1072,'1','2022-04-01 22:21:37','1','2022-04-01 22:21:37',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1662,101,1073,'1','2022-04-01 22:21:37','1','2022-04-01 22:21:37',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1663,101,1074,'1','2022-04-01 22:21:37','1','2022-04-01 22:21:37',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1664,101,1075,'1','2022-04-01 22:21:37','1','2022-04-01 22:21:37',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1665,101,1076,'1','2022-04-01 22:21:37','1','2022-04-01 22:21:37',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1666,101,1077,'1','2022-04-01 22:21:37','1','2022-04-01 22:21:37',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1667,101,1078,'1','2022-04-01 22:21:37','1','2022-04-01 22:21:37',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1668,101,1082,'1','2022-04-01 22:21:37','1','2022-04-01 22:21:37',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1669,101,1083,'1','2022-04-01 22:21:37','1','2022-04-01 22:21:37',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1670,101,1084,'1','2022-04-01 22:21:37','1','2022-04-01 22:21:37',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1671,101,1085,'1','2022-04-01 22:21:37','1','2022-04-01 22:21:37',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1672,101,1086,'1','2022-04-01 22:21:37','1','2022-04-01 22:21:37',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1673,101,1087,'1','2022-04-01 22:21:37','1','2022-04-01 22:21:37',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1674,101,1088,'1','2022-04-01 22:21:37','1','2022-04-01 22:21:37',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1675,101,1089,'1','2022-04-01 22:21:37','1','2022-04-01 22:21:37',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1679,101,1237,'1','2022-04-01 22:21:37','1','2022-04-01 22:21:37',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1680,101,1238,'1','2022-04-01 22:21:37','1','2022-04-01 22:21:37',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1681,101,1239,'1','2022-04-01 22:21:37','1','2022-04-01 22:21:37',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1682,101,1240,'1','2022-04-01 22:21:37','1','2022-04-01 22:21:37',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1683,101,1241,'1','2022-04-01 22:21:37','1','2022-04-01 22:21:37',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1684,101,1242,'1','2022-04-01 22:21:37','1','2022-04-01 22:21:37',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1685,101,1243,'1','2022-04-01 22:21:37','1','2022-04-01 22:21:37',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1687,101,106,'1','2022-04-01 22:21:37','1','2022-04-01 22:21:37',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1688,101,110,'1','2022-04-01 22:21:37','1','2022-04-01 22:21:37',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1689,101,111,'1','2022-04-01 22:21:37','1','2022-04-01 22:21:37',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1690,101,112,'1','2022-04-01 22:21:37','1','2022-04-01 22:21:37',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1691,101,113,'1','2022-04-01 22:21:37','1','2022-04-01 22:21:37',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1692,101,114,'1','2022-04-01 22:21:37','1','2022-04-01 22:21:37',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1693,101,115,'1','2022-04-01 22:21:37','1','2022-04-01 22:21:37',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1694,101,116,'1','2022-04-01 22:21:37','1','2022-04-01 22:21:37',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1712,113,1024,'1','2022-05-17 10:07:10','1','2022-05-17 10:07:10',0,124); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1713,113,1025,'1','2022-05-17 10:07:10','1','2022-05-17 10:07:10',0,124); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1714,113,1,'1','2022-05-17 10:07:10','1','2022-05-17 10:07:10',0,124); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1715,113,102,'1','2022-05-17 10:07:10','1','2022-05-17 10:07:10',0,124); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1716,113,103,'1','2022-05-17 10:07:10','1','2022-05-17 10:07:10',0,124); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1717,113,104,'1','2022-05-17 10:07:10','1','2022-05-17 10:07:10',0,124); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1718,113,1013,'1','2022-05-17 10:07:10','1','2022-05-17 10:07:10',0,124); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1719,113,1014,'1','2022-05-17 10:07:10','1','2022-05-17 10:07:10',0,124); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1720,113,1015,'1','2022-05-17 10:07:10','1','2022-05-17 10:07:10',0,124); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1721,113,1016,'1','2022-05-17 10:07:10','1','2022-05-17 10:07:10',0,124); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1722,113,1017,'1','2022-05-17 10:07:10','1','2022-05-17 10:07:10',0,124); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1723,113,1018,'1','2022-05-17 10:07:10','1','2022-05-17 10:07:10',0,124); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1724,113,1019,'1','2022-05-17 10:07:10','1','2022-05-17 10:07:10',0,124); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1725,113,1020,'1','2022-05-17 10:07:10','1','2022-05-17 10:07:10',0,124); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1726,113,1021,'1','2022-05-17 10:07:10','1','2022-05-17 10:07:10',0,124); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1727,113,1022,'1','2022-05-17 10:07:10','1','2022-05-17 10:07:10',0,124); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1728,113,1023,'1','2022-05-17 10:07:10','1','2022-05-17 10:07:10',0,124); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1729,109,100,'1','2022-09-21 22:08:51','1','2022-09-21 22:08:51',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1730,109,101,'1','2022-09-21 22:08:51','1','2022-09-21 22:08:51',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1731,109,1063,'1','2022-09-21 22:08:51','1','2022-09-21 22:08:51',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1732,109,1064,'1','2022-09-21 22:08:51','1','2022-09-21 22:08:51',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1733,109,1001,'1','2022-09-21 22:08:51','1','2022-09-21 22:08:51',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1734,109,1065,'1','2022-09-21 22:08:51','1','2022-09-21 22:08:51',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1735,109,1002,'1','2022-09-21 22:08:51','1','2022-09-21 22:08:51',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1736,109,1003,'1','2022-09-21 22:08:51','1','2022-09-21 22:08:51',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1737,109,1004,'1','2022-09-21 22:08:51','1','2022-09-21 22:08:51',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1738,109,1005,'1','2022-09-21 22:08:51','1','2022-09-21 22:08:51',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1739,109,1006,'1','2022-09-21 22:08:51','1','2022-09-21 22:08:51',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1740,109,1007,'1','2022-09-21 22:08:51','1','2022-09-21 22:08:51',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1741,109,1008,'1','2022-09-21 22:08:51','1','2022-09-21 22:08:51',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1742,109,1009,'1','2022-09-21 22:08:51','1','2022-09-21 22:08:51',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1743,109,1010,'1','2022-09-21 22:08:51','1','2022-09-21 22:08:51',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1744,109,1011,'1','2022-09-21 22:08:51','1','2022-09-21 22:08:51',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1745,109,1012,'1','2022-09-21 22:08:51','1','2022-09-21 22:08:51',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1746,111,100,'1','2022-09-21 22:08:52','1','2022-09-21 22:08:52',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1747,111,101,'1','2022-09-21 22:08:52','1','2022-09-21 22:08:52',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1748,111,1063,'1','2022-09-21 22:08:52','1','2022-09-21 22:08:52',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1749,111,1064,'1','2022-09-21 22:08:52','1','2022-09-21 22:08:52',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1750,111,1001,'1','2022-09-21 22:08:52','1','2022-09-21 22:08:52',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1751,111,1065,'1','2022-09-21 22:08:52','1','2022-09-21 22:08:52',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1752,111,1002,'1','2022-09-21 22:08:52','1','2022-09-21 22:08:52',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1753,111,1003,'1','2022-09-21 22:08:52','1','2022-09-21 22:08:52',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1754,111,1004,'1','2022-09-21 22:08:52','1','2022-09-21 22:08:52',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1755,111,1005,'1','2022-09-21 22:08:52','1','2022-09-21 22:08:52',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1756,111,1006,'1','2022-09-21 22:08:52','1','2022-09-21 22:08:52',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1757,111,1007,'1','2022-09-21 22:08:52','1','2022-09-21 22:08:52',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1758,111,1008,'1','2022-09-21 22:08:52','1','2022-09-21 22:08:52',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1759,111,1009,'1','2022-09-21 22:08:52','1','2022-09-21 22:08:52',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1760,111,1010,'1','2022-09-21 22:08:52','1','2022-09-21 22:08:52',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1761,111,1011,'1','2022-09-21 22:08:52','1','2022-09-21 22:08:52',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1762,111,1012,'1','2022-09-21 22:08:52','1','2022-09-21 22:08:52',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1763,109,100,'1','2022-09-21 22:08:53','1','2022-09-21 22:08:53',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1764,109,101,'1','2022-09-21 22:08:53','1','2022-09-21 22:08:53',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1765,109,1063,'1','2022-09-21 22:08:53','1','2022-09-21 22:08:53',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1766,109,1064,'1','2022-09-21 22:08:53','1','2022-09-21 22:08:53',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1767,109,1001,'1','2022-09-21 22:08:53','1','2022-09-21 22:08:53',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1768,109,1065,'1','2022-09-21 22:08:53','1','2022-09-21 22:08:53',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1769,109,1002,'1','2022-09-21 22:08:53','1','2022-09-21 22:08:53',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1770,109,1003,'1','2022-09-21 22:08:53','1','2022-09-21 22:08:53',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1771,109,1004,'1','2022-09-21 22:08:53','1','2022-09-21 22:08:53',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1772,109,1005,'1','2022-09-21 22:08:53','1','2022-09-21 22:08:53',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1773,109,1006,'1','2022-09-21 22:08:53','1','2022-09-21 22:08:53',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1774,109,1007,'1','2022-09-21 22:08:53','1','2022-09-21 22:08:53',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1775,109,1008,'1','2022-09-21 22:08:53','1','2022-09-21 22:08:53',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1776,109,1009,'1','2022-09-21 22:08:53','1','2022-09-21 22:08:53',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1777,109,1010,'1','2022-09-21 22:08:53','1','2022-09-21 22:08:53',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1778,109,1011,'1','2022-09-21 22:08:53','1','2022-09-21 22:08:53',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1779,109,1012,'1','2022-09-21 22:08:53','1','2022-09-21 22:08:53',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1780,111,100,'1','2022-09-21 22:08:54','1','2022-09-21 22:08:54',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1781,111,101,'1','2022-09-21 22:08:54','1','2022-09-21 22:08:54',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1782,111,1063,'1','2022-09-21 22:08:54','1','2022-09-21 22:08:54',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1783,111,1064,'1','2022-09-21 22:08:54','1','2022-09-21 22:08:54',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1784,111,1001,'1','2022-09-21 22:08:54','1','2022-09-21 22:08:54',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1785,111,1065,'1','2022-09-21 22:08:54','1','2022-09-21 22:08:54',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1786,111,1002,'1','2022-09-21 22:08:54','1','2022-09-21 22:08:54',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1787,111,1003,'1','2022-09-21 22:08:54','1','2022-09-21 22:08:54',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1788,111,1004,'1','2022-09-21 22:08:54','1','2022-09-21 22:08:54',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1789,111,1005,'1','2022-09-21 22:08:54','1','2022-09-21 22:08:54',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1790,111,1006,'1','2022-09-21 22:08:54','1','2022-09-21 22:08:54',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1791,111,1007,'1','2022-09-21 22:08:54','1','2022-09-21 22:08:54',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1792,111,1008,'1','2022-09-21 22:08:54','1','2022-09-21 22:08:54',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1793,111,1009,'1','2022-09-21 22:08:54','1','2022-09-21 22:08:54',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1794,111,1010,'1','2022-09-21 22:08:54','1','2022-09-21 22:08:54',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1795,111,1011,'1','2022-09-21 22:08:54','1','2022-09-21 22:08:54',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1796,111,1012,'1','2022-09-21 22:08:54','1','2022-09-21 22:08:54',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1797,109,100,'1','2022-09-21 22:08:55','1','2022-09-21 22:08:55',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1798,109,101,'1','2022-09-21 22:08:55','1','2022-09-21 22:08:55',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1799,109,1063,'1','2022-09-21 22:08:55','1','2022-09-21 22:08:55',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1800,109,1064,'1','2022-09-21 22:08:55','1','2022-09-21 22:08:55',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1801,109,1001,'1','2022-09-21 22:08:55','1','2022-09-21 22:08:55',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1802,109,1065,'1','2022-09-21 22:08:55','1','2022-09-21 22:08:55',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1803,109,1002,'1','2022-09-21 22:08:55','1','2022-09-21 22:08:55',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1804,109,1003,'1','2022-09-21 22:08:55','1','2022-09-21 22:08:55',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1805,109,1004,'1','2022-09-21 22:08:55','1','2022-09-21 22:08:55',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1806,109,1005,'1','2022-09-21 22:08:55','1','2022-09-21 22:08:55',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1807,109,1006,'1','2022-09-21 22:08:55','1','2022-09-21 22:08:55',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1808,109,1007,'1','2022-09-21 22:08:55','1','2022-09-21 22:08:55',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1809,109,1008,'1','2022-09-21 22:08:55','1','2022-09-21 22:08:55',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1810,109,1009,'1','2022-09-21 22:08:55','1','2022-09-21 22:08:55',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1811,109,1010,'1','2022-09-21 22:08:55','1','2022-09-21 22:08:55',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1812,109,1011,'1','2022-09-21 22:08:55','1','2022-09-21 22:08:55',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1813,109,1012,'1','2022-09-21 22:08:55','1','2022-09-21 22:08:55',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1814,111,100,'1','2022-09-21 22:08:56','1','2022-09-21 22:08:56',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1815,111,101,'1','2022-09-21 22:08:56','1','2022-09-21 22:08:56',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1816,111,1063,'1','2022-09-21 22:08:56','1','2022-09-21 22:08:56',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1817,111,1064,'1','2022-09-21 22:08:56','1','2022-09-21 22:08:56',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1818,111,1001,'1','2022-09-21 22:08:56','1','2022-09-21 22:08:56',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1819,111,1065,'1','2022-09-21 22:08:56','1','2022-09-21 22:08:56',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1820,111,1002,'1','2022-09-21 22:08:56','1','2022-09-21 22:08:56',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1821,111,1003,'1','2022-09-21 22:08:56','1','2022-09-21 22:08:56',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1822,111,1004,'1','2022-09-21 22:08:56','1','2022-09-21 22:08:56',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1823,111,1005,'1','2022-09-21 22:08:56','1','2022-09-21 22:08:56',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1824,111,1006,'1','2022-09-21 22:08:56','1','2022-09-21 22:08:56',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1825,111,1007,'1','2022-09-21 22:08:56','1','2022-09-21 22:08:56',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1826,111,1008,'1','2022-09-21 22:08:56','1','2022-09-21 22:08:56',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1827,111,1009,'1','2022-09-21 22:08:56','1','2022-09-21 22:08:56',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1828,111,1010,'1','2022-09-21 22:08:56','1','2022-09-21 22:08:56',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1829,111,1011,'1','2022-09-21 22:08:56','1','2022-09-21 22:08:56',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1830,111,1012,'1','2022-09-21 22:08:56','1','2022-09-21 22:08:56',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1831,109,103,'1','2022-09-21 22:43:23','1','2022-09-21 22:43:23',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1832,109,1017,'1','2022-09-21 22:43:23','1','2022-09-21 22:43:23',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1833,109,1018,'1','2022-09-21 22:43:23','1','2022-09-21 22:43:23',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1834,109,1019,'1','2022-09-21 22:43:23','1','2022-09-21 22:43:23',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1835,109,1020,'1','2022-09-21 22:43:23','1','2022-09-21 22:43:23',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1836,111,103,'1','2022-09-21 22:43:24','1','2022-09-21 22:43:24',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1837,111,1017,'1','2022-09-21 22:43:24','1','2022-09-21 22:43:24',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1838,111,1018,'1','2022-09-21 22:43:24','1','2022-09-21 22:43:24',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1839,111,1019,'1','2022-09-21 22:43:24','1','2022-09-21 22:43:24',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1840,111,1020,'1','2022-09-21 22:43:24','1','2022-09-21 22:43:24',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1841,109,1036,'1','2022-09-21 22:48:13','1','2022-09-21 22:48:13',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1842,109,1037,'1','2022-09-21 22:48:13','1','2022-09-21 22:48:13',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1843,109,1038,'1','2022-09-21 22:48:13','1','2022-09-21 22:48:13',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1844,109,1039,'1','2022-09-21 22:48:13','1','2022-09-21 22:48:13',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1845,109,107,'1','2022-09-21 22:48:13','1','2022-09-21 22:48:13',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1846,111,1036,'1','2022-09-21 22:48:13','1','2022-09-21 22:48:13',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1847,111,1037,'1','2022-09-21 22:48:13','1','2022-09-21 22:48:13',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1848,111,1038,'1','2022-09-21 22:48:13','1','2022-09-21 22:48:13',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1849,111,1039,'1','2022-09-21 22:48:13','1','2022-09-21 22:48:13',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1850,111,107,'1','2022-09-21 22:48:13','1','2022-09-21 22:48:13',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1851,114,1,'1','2022-12-30 11:32:03','1','2022-12-30 11:32:03',0,125); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1852,114,1036,'1','2022-12-30 11:32:03','1','2022-12-30 11:32:03',0,125); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1853,114,1037,'1','2022-12-30 11:32:03','1','2022-12-30 11:32:03',0,125); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1854,114,1038,'1','2022-12-30 11:32:03','1','2022-12-30 11:32:03',0,125); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1855,114,1039,'1','2022-12-30 11:32:03','1','2022-12-30 11:32:03',0,125); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1856,114,100,'1','2022-12-30 11:32:03','1','2022-12-30 11:32:03',0,125); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1857,114,101,'1','2022-12-30 11:32:03','1','2022-12-30 11:32:03',0,125); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1858,114,1063,'1','2022-12-30 11:32:03','1','2022-12-30 11:32:03',0,125); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1859,114,103,'1','2022-12-30 11:32:03','1','2022-12-30 11:32:03',0,125); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1860,114,1064,'1','2022-12-30 11:32:03','1','2022-12-30 11:32:03',0,125); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1861,114,1001,'1','2022-12-30 11:32:03','1','2022-12-30 11:32:03',0,125); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1862,114,1065,'1','2022-12-30 11:32:03','1','2022-12-30 11:32:03',0,125); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1863,114,1002,'1','2022-12-30 11:32:03','1','2022-12-30 11:32:03',0,125); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1864,114,1003,'1','2022-12-30 11:32:03','1','2022-12-30 11:32:03',0,125); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1865,114,107,'1','2022-12-30 11:32:03','1','2022-12-30 11:32:03',0,125); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1866,114,1004,'1','2022-12-30 11:32:03','1','2022-12-30 11:32:03',0,125); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1867,114,1005,'1','2022-12-30 11:32:03','1','2022-12-30 11:32:03',0,125); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1868,114,1006,'1','2022-12-30 11:32:03','1','2022-12-30 11:32:03',0,125); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1869,114,1007,'1','2022-12-30 11:32:03','1','2022-12-30 11:32:03',0,125); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1870,114,1008,'1','2022-12-30 11:32:03','1','2022-12-30 11:32:03',0,125); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1871,114,1009,'1','2022-12-30 11:32:03','1','2022-12-30 11:32:03',0,125); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1872,114,1010,'1','2022-12-30 11:32:03','1','2022-12-30 11:32:03',0,125); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1873,114,1011,'1','2022-12-30 11:32:03','1','2022-12-30 11:32:03',0,125); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1874,114,1012,'1','2022-12-30 11:32:03','1','2022-12-30 11:32:03',0,125); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1875,114,1017,'1','2022-12-30 11:32:03','1','2022-12-30 11:32:03',0,125); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1876,114,1018,'1','2022-12-30 11:32:03','1','2022-12-30 11:32:03',0,125); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1877,114,1019,'1','2022-12-30 11:32:03','1','2022-12-30 11:32:03',0,125); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1878,114,1020,'1','2022-12-30 11:32:03','1','2022-12-30 11:32:03',0,125); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1879,115,1,'1','2022-12-30 11:33:42','1','2022-12-30 11:33:42',0,126); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1880,115,1036,'1','2022-12-30 11:33:42','1','2022-12-30 11:33:42',0,126); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1881,115,1037,'1','2022-12-30 11:33:42','1','2022-12-30 11:33:42',0,126); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1882,115,1038,'1','2022-12-30 11:33:42','1','2022-12-30 11:33:42',0,126); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1883,115,1039,'1','2022-12-30 11:33:42','1','2022-12-30 11:33:42',0,126); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1884,115,100,'1','2022-12-30 11:33:42','1','2022-12-30 11:33:42',0,126); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1885,115,101,'1','2022-12-30 11:33:42','1','2022-12-30 11:33:42',0,126); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1886,115,1063,'1','2022-12-30 11:33:42','1','2022-12-30 11:33:42',0,126); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1887,115,103,'1','2022-12-30 11:33:42','1','2022-12-30 11:33:42',0,126); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1888,115,1064,'1','2022-12-30 11:33:42','1','2022-12-30 11:33:42',0,126); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1889,115,1001,'1','2022-12-30 11:33:42','1','2022-12-30 11:33:42',0,126); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1890,115,1065,'1','2022-12-30 11:33:42','1','2022-12-30 11:33:42',0,126); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1891,115,1002,'1','2022-12-30 11:33:42','1','2022-12-30 11:33:42',0,126); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1892,115,1003,'1','2022-12-30 11:33:42','1','2022-12-30 11:33:42',0,126); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1893,115,107,'1','2022-12-30 11:33:42','1','2022-12-30 11:33:42',0,126); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1894,115,1004,'1','2022-12-30 11:33:42','1','2022-12-30 11:33:42',0,126); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1895,115,1005,'1','2022-12-30 11:33:42','1','2022-12-30 11:33:42',0,126); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1896,115,1006,'1','2022-12-30 11:33:42','1','2022-12-30 11:33:42',0,126); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1897,115,1007,'1','2022-12-30 11:33:42','1','2022-12-30 11:33:42',0,126); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1898,115,1008,'1','2022-12-30 11:33:42','1','2022-12-30 11:33:42',0,126); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1899,115,1009,'1','2022-12-30 11:33:42','1','2022-12-30 11:33:42',0,126); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1900,115,1010,'1','2022-12-30 11:33:42','1','2022-12-30 11:33:42',0,126); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1901,115,1011,'1','2022-12-30 11:33:42','1','2022-12-30 11:33:42',0,126); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1902,115,1012,'1','2022-12-30 11:33:42','1','2022-12-30 11:33:42',0,126); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1903,115,1017,'1','2022-12-30 11:33:42','1','2022-12-30 11:33:42',0,126); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1904,115,1018,'1','2022-12-30 11:33:42','1','2022-12-30 11:33:42',0,126); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1905,115,1019,'1','2022-12-30 11:33:42','1','2022-12-30 11:33:42',0,126); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1906,115,1020,'1','2022-12-30 11:33:42','1','2022-12-30 11:33:42',0,126); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1907,116,1,'1','2022-12-30 11:33:48','1','2022-12-30 11:33:48',0,127); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1908,116,1036,'1','2022-12-30 11:33:48','1','2022-12-30 11:33:48',0,127); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1909,116,1037,'1','2022-12-30 11:33:48','1','2022-12-30 11:33:48',0,127); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1910,116,1038,'1','2022-12-30 11:33:48','1','2022-12-30 11:33:48',0,127); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1911,116,1039,'1','2022-12-30 11:33:48','1','2022-12-30 11:33:48',0,127); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1912,116,100,'1','2022-12-30 11:33:48','1','2022-12-30 11:33:48',0,127); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1913,116,101,'1','2022-12-30 11:33:48','1','2022-12-30 11:33:48',0,127); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1914,116,1063,'1','2022-12-30 11:33:48','1','2022-12-30 11:33:48',0,127); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1915,116,103,'1','2022-12-30 11:33:48','1','2022-12-30 11:33:48',0,127); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1916,116,1064,'1','2022-12-30 11:33:48','1','2022-12-30 11:33:48',0,127); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1917,116,1001,'1','2022-12-30 11:33:48','1','2022-12-30 11:33:48',0,127); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1918,116,1065,'1','2022-12-30 11:33:48','1','2022-12-30 11:33:48',0,127); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1919,116,1002,'1','2022-12-30 11:33:48','1','2022-12-30 11:33:48',0,127); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1920,116,1003,'1','2022-12-30 11:33:48','1','2022-12-30 11:33:48',0,127); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1921,116,107,'1','2022-12-30 11:33:48','1','2022-12-30 11:33:48',0,127); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1922,116,1004,'1','2022-12-30 11:33:48','1','2022-12-30 11:33:48',0,127); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1923,116,1005,'1','2022-12-30 11:33:48','1','2022-12-30 11:33:48',0,127); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1924,116,1006,'1','2022-12-30 11:33:48','1','2022-12-30 11:33:48',0,127); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1925,116,1007,'1','2022-12-30 11:33:48','1','2022-12-30 11:33:48',0,127); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1926,116,1008,'1','2022-12-30 11:33:48','1','2022-12-30 11:33:48',0,127); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1927,116,1009,'1','2022-12-30 11:33:48','1','2022-12-30 11:33:48',0,127); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1928,116,1010,'1','2022-12-30 11:33:48','1','2022-12-30 11:33:48',0,127); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1929,116,1011,'1','2022-12-30 11:33:48','1','2022-12-30 11:33:48',0,127); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1930,116,1012,'1','2022-12-30 11:33:48','1','2022-12-30 11:33:48',0,127); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1931,116,1017,'1','2022-12-30 11:33:48','1','2022-12-30 11:33:48',0,127); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1932,116,1018,'1','2022-12-30 11:33:48','1','2022-12-30 11:33:48',0,127); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1933,116,1019,'1','2022-12-30 11:33:48','1','2022-12-30 11:33:48',0,127); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1934,116,1020,'1','2022-12-30 11:33:48','1','2022-12-30 11:33:48',0,127); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1963,118,1,'1','2022-12-30 11:47:52','1','2022-12-30 11:47:52',0,129); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1964,118,1036,'1','2022-12-30 11:47:52','1','2022-12-30 11:47:52',0,129); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1965,118,1037,'1','2022-12-30 11:47:52','1','2022-12-30 11:47:52',0,129); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1966,118,1038,'1','2022-12-30 11:47:52','1','2022-12-30 11:47:52',0,129); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1967,118,1039,'1','2022-12-30 11:47:52','1','2022-12-30 11:47:52',0,129); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1968,118,100,'1','2022-12-30 11:47:52','1','2022-12-30 11:47:52',0,129); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1969,118,101,'1','2022-12-30 11:47:52','1','2022-12-30 11:47:52',0,129); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1970,118,1063,'1','2022-12-30 11:47:52','1','2022-12-30 11:47:52',0,129); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1971,118,103,'1','2022-12-30 11:47:52','1','2022-12-30 11:47:52',0,129); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1972,118,1064,'1','2022-12-30 11:47:52','1','2022-12-30 11:47:52',0,129); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1973,118,1001,'1','2022-12-30 11:47:52','1','2022-12-30 11:47:52',0,129); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1974,118,1065,'1','2022-12-30 11:47:52','1','2022-12-30 11:47:52',0,129); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1975,118,1002,'1','2022-12-30 11:47:52','1','2022-12-30 11:47:52',0,129); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1976,118,1003,'1','2022-12-30 11:47:52','1','2022-12-30 11:47:52',0,129); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1977,118,107,'1','2022-12-30 11:47:52','1','2022-12-30 11:47:52',0,129); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1978,118,1004,'1','2022-12-30 11:47:52','1','2022-12-30 11:47:52',0,129); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1979,118,1005,'1','2022-12-30 11:47:52','1','2022-12-30 11:47:52',0,129); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1980,118,1006,'1','2022-12-30 11:47:52','1','2022-12-30 11:47:52',0,129); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1981,118,1007,'1','2022-12-30 11:47:52','1','2022-12-30 11:47:52',0,129); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1982,118,1008,'1','2022-12-30 11:47:52','1','2022-12-30 11:47:52',0,129); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1983,118,1009,'1','2022-12-30 11:47:52','1','2022-12-30 11:47:52',0,129); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1984,118,1010,'1','2022-12-30 11:47:52','1','2022-12-30 11:47:52',0,129); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1985,118,1011,'1','2022-12-30 11:47:52','1','2022-12-30 11:47:52',0,129); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1986,118,1012,'1','2022-12-30 11:47:52','1','2022-12-30 11:47:52',0,129); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1987,118,1017,'1','2022-12-30 11:47:52','1','2022-12-30 11:47:52',0,129); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1988,118,1018,'1','2022-12-30 11:47:52','1','2022-12-30 11:47:52',0,129); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1989,118,1019,'1','2022-12-30 11:47:52','1','2022-12-30 11:47:52',0,129); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1990,118,1020,'1','2022-12-30 11:47:52','1','2022-12-30 11:47:52',0,129); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1991,2,1024,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1992,2,1025,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1993,2,1026,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1994,2,1027,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1995,2,1028,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1996,2,1029,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1997,2,1030,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1998,2,1031,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1999,2,1032,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2000,2,1033,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2001,2,1034,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2002,2,1035,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2003,2,1036,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2004,2,1037,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2005,2,1038,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2006,2,1039,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2007,2,1040,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2008,2,1042,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2009,2,1043,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2010,2,1045,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2011,2,1046,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2012,2,1048,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2013,2,1050,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2014,2,1051,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2015,2,1052,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2016,2,1053,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2017,2,1054,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2018,2,1056,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2019,2,1057,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2020,2,1058,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2021,2,2083,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2022,2,1059,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2023,2,1060,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2024,2,1063,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2025,2,1064,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2026,2,1065,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2027,2,1066,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2028,2,1067,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2029,2,1070,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2030,2,1071,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2031,2,1072,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2032,2,1073,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2033,2,1074,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2034,2,1075,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2035,2,1076,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2036,2,1082,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2037,2,1085,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2038,2,1086,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2039,2,1087,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2040,2,1088,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2041,2,1089,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2042,2,1091,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2043,2,1092,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2044,2,1095,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2045,2,1096,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2046,2,1097,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2047,2,1098,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2048,2,1101,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2049,2,1102,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2050,2,1103,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2051,2,1104,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2052,2,1105,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2053,2,1106,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2054,2,1108,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2055,2,1109,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2056,2,1111,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2057,2,1112,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2058,2,1113,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2059,2,1114,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2060,2,1115,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2061,2,1127,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2062,2,1128,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2063,2,1129,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2064,2,1130,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2065,2,1131,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2066,2,1132,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2067,2,1133,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2068,2,1134,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2069,2,1135,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2070,2,1136,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2071,2,1137,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2072,2,114,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2073,2,1139,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2074,2,115,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2075,2,1140,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2076,2,116,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2077,2,1141,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2078,2,1142,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2079,2,1143,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2080,2,1150,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2081,2,1161,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2082,2,1162,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2083,2,1163,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2084,2,1164,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2085,2,1165,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2086,2,1166,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2087,2,1173,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2088,2,1174,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2089,2,1175,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2090,2,1176,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2091,2,1177,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2092,2,1178,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2093,2,1179,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2094,2,1180,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2095,2,1181,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2096,2,1182,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2097,2,1183,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2098,2,1184,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2099,2,1226,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2100,2,1227,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2101,2,1228,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2102,2,1229,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2103,2,1237,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2104,2,1238,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2105,2,1239,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2106,2,1240,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2107,2,1241,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2108,2,1242,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2109,2,1243,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2110,2,1247,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2111,2,1248,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2112,2,1249,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2113,2,1250,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2114,2,1251,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2115,2,1252,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2116,2,1254,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2117,2,1255,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2118,2,1256,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2119,2,1257,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2120,2,1258,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2121,2,1259,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2122,2,1260,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2123,2,1261,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2124,2,1263,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2125,2,1264,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2126,2,1265,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2127,2,1266,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2128,2,1267,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2129,2,1001,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2130,2,1002,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2131,2,1003,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2132,2,1004,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2133,2,1005,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2134,2,1006,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2135,2,1007,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2136,2,1008,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2137,2,1009,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2138,2,1010,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2139,2,1011,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2140,2,1012,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2141,2,1013,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2142,2,1014,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2143,2,1015,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2144,2,1016,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2145,2,1017,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2146,2,1018,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2147,2,1019,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2148,2,1020,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2149,2,1021,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2150,2,1022,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2151,2,1023,'1','2023-01-25 08:42:52','1','2023-01-25 08:42:52',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2152,2,1281,'1','2023-01-25 08:42:58','1','2023-01-25 08:42:58',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2153,2,1282,'1','2023-01-25 08:42:58','1','2023-01-25 08:42:58',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2154,2,2000,'1','2023-01-25 08:42:58','1','2023-01-25 08:42:58',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2155,2,2002,'1','2023-01-25 08:42:58','1','2023-01-25 08:42:58',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2156,2,2003,'1','2023-01-25 08:42:58','1','2023-01-25 08:42:58',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2157,2,2004,'1','2023-01-25 08:42:58','1','2023-01-25 08:42:58',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2158,2,2005,'1','2023-01-25 08:42:58','1','2023-01-25 08:42:58',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2159,2,2006,'1','2023-01-25 08:42:58','1','2023-01-25 08:42:58',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2160,2,2008,'1','2023-01-25 08:42:58','1','2023-01-25 08:42:58',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2161,2,2009,'1','2023-01-25 08:42:58','1','2023-01-25 08:42:58',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2162,2,2010,'1','2023-01-25 08:42:58','1','2023-01-25 08:42:58',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2163,2,2011,'1','2023-01-25 08:42:58','1','2023-01-25 08:42:58',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2164,2,2012,'1','2023-01-25 08:42:58','1','2023-01-25 08:42:58',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2170,2,2019,'1','2023-01-25 08:42:58','1','2023-01-25 08:42:58',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2171,2,2020,'1','2023-01-25 08:42:58','1','2023-01-25 08:42:58',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2172,2,2021,'1','2023-01-25 08:42:58','1','2023-01-25 08:42:58',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2173,2,2022,'1','2023-01-25 08:42:58','1','2023-01-25 08:42:58',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2174,2,2023,'1','2023-01-25 08:42:58','1','2023-01-25 08:42:58',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2175,2,2025,'1','2023-01-25 08:42:58','1','2023-01-25 08:42:58',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2177,2,2027,'1','2023-01-25 08:42:58','1','2023-01-25 08:42:58',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2178,2,2028,'1','2023-01-25 08:42:58','1','2023-01-25 08:42:58',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2179,2,2029,'1','2023-01-25 08:42:58','1','2023-01-25 08:42:58',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2180,2,2014,'1','2023-01-25 08:43:12','1','2023-01-25 08:43:12',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2181,2,2015,'1','2023-01-25 08:43:12','1','2023-01-25 08:43:12',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2182,2,2016,'1','2023-01-25 08:43:12','1','2023-01-25 08:43:12',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2183,2,2017,'1','2023-01-25 08:43:12','1','2023-01-25 08:43:12',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2184,2,2018,'1','2023-01-25 08:43:12','1','2023-01-25 08:43:12',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2188,101,1024,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2189,101,1,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2190,101,1025,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2191,101,1026,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2192,101,1027,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2193,101,1028,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2194,101,1029,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2195,101,1030,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2196,101,1036,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2197,101,1037,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2198,101,1038,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2199,101,1039,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2200,101,1040,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2201,101,1042,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2202,101,1043,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2203,101,1045,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2204,101,1046,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2205,101,1048,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2206,101,2083,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2207,101,1063,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2208,101,1064,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2209,101,1065,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2210,101,1093,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2211,101,1094,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2212,101,1095,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2213,101,1096,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2214,101,1097,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2215,101,1098,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2216,101,1100,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2217,101,1101,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2218,101,1102,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2219,101,1103,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2220,101,1104,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2221,101,1105,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2222,101,1106,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2223,101,2130,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2224,101,1107,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2225,101,2131,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2226,101,1108,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2227,101,2132,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2228,101,1109,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2229,101,2133,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2230,101,2134,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2231,101,1110,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2232,101,2135,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2233,101,1111,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2234,101,2136,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2235,101,1112,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2236,101,2137,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2237,101,1113,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2238,101,2138,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2239,101,1114,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2240,101,2139,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2241,101,1115,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2242,101,2140,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2243,101,2141,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2244,101,2142,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2245,101,2143,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2246,101,2144,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2247,101,2145,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2248,101,2146,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2249,101,2147,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2250,101,100,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2251,101,2148,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2252,101,101,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2253,101,2149,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2254,101,102,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2255,101,2150,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2256,101,103,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2257,101,2151,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2258,101,104,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2259,101,2152,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2260,101,105,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2261,101,107,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2262,101,108,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2263,101,109,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2264,101,1138,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2265,101,1139,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2266,101,1140,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2267,101,1141,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2268,101,1142,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2269,101,1143,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2270,101,1224,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2271,101,1225,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2272,101,1226,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2273,101,1227,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2274,101,1228,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2275,101,1229,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2276,101,1247,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2277,101,1248,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2278,101,1249,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2279,101,1250,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2280,101,1251,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2281,101,1252,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2282,101,1261,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2283,101,1263,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2284,101,1264,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2285,101,1265,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2286,101,1266,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2287,101,1267,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2288,101,1001,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2289,101,1002,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2290,101,1003,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2291,101,1004,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2292,101,1005,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2293,101,1006,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2294,101,1007,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2295,101,1008,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2296,101,1009,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2297,101,1010,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2298,101,1011,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2299,101,1012,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2300,101,500,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2301,101,1013,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2302,101,501,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2303,101,1014,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2304,101,1015,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2305,101,1016,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2306,101,1017,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2307,101,1018,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2308,101,1019,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2309,101,1020,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2310,101,1021,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2311,101,1022,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2312,101,1023,'1','2023-02-09 23:49:46','1','2023-02-09 23:49:46',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2789,136,1,'1','2023-03-05 21:23:32','1','2023-03-05 21:23:32',0,147); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2790,136,1036,'1','2023-03-05 21:23:32','1','2023-03-05 21:23:32',0,147); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2791,136,1037,'1','2023-03-05 21:23:32','1','2023-03-05 21:23:32',0,147); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2792,136,1038,'1','2023-03-05 21:23:32','1','2023-03-05 21:23:32',0,147); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2793,136,1039,'1','2023-03-05 21:23:32','1','2023-03-05 21:23:32',0,147); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2794,136,100,'1','2023-03-05 21:23:32','1','2023-03-05 21:23:32',0,147); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2795,136,101,'1','2023-03-05 21:23:32','1','2023-03-05 21:23:32',0,147); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2796,136,1063,'1','2023-03-05 21:23:32','1','2023-03-05 21:23:32',0,147); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2797,136,103,'1','2023-03-05 21:23:32','1','2023-03-05 21:23:32',0,147); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2798,136,1064,'1','2023-03-05 21:23:32','1','2023-03-05 21:23:32',0,147); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2799,136,1001,'1','2023-03-05 21:23:32','1','2023-03-05 21:23:32',0,147); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2800,136,1065,'1','2023-03-05 21:23:32','1','2023-03-05 21:23:32',0,147); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2801,136,1002,'1','2023-03-05 21:23:32','1','2023-03-05 21:23:32',0,147); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2802,136,1003,'1','2023-03-05 21:23:32','1','2023-03-05 21:23:32',0,147); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2803,136,107,'1','2023-03-05 21:23:32','1','2023-03-05 21:23:32',0,147); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2804,136,1004,'1','2023-03-05 21:23:32','1','2023-03-05 21:23:32',0,147); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2805,136,1005,'1','2023-03-05 21:23:32','1','2023-03-05 21:23:32',0,147); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2806,136,1006,'1','2023-03-05 21:23:32','1','2023-03-05 21:23:32',0,147); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2807,136,1007,'1','2023-03-05 21:23:32','1','2023-03-05 21:23:32',0,147); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2808,136,1008,'1','2023-03-05 21:23:32','1','2023-03-05 21:23:32',0,147); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2809,136,1009,'1','2023-03-05 21:23:32','1','2023-03-05 21:23:32',0,147); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2810,136,1010,'1','2023-03-05 21:23:32','1','2023-03-05 21:23:32',0,147); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2811,136,1011,'1','2023-03-05 21:23:32','1','2023-03-05 21:23:32',0,147); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2812,136,1012,'1','2023-03-05 21:23:32','1','2023-03-05 21:23:32',0,147); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2813,136,1017,'1','2023-03-05 21:23:32','1','2023-03-05 21:23:32',0,147); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2814,136,1018,'1','2023-03-05 21:23:32','1','2023-03-05 21:23:32',0,147); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2815,136,1019,'1','2023-03-05 21:23:32','1','2023-03-05 21:23:32',0,147); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2816,136,1020,'1','2023-03-05 21:23:32','1','2023-03-05 21:23:32',0,147); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2817,137,1,'1','2023-03-05 21:42:27','1','2023-03-05 21:42:27',0,148); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2818,137,1036,'1','2023-03-05 21:42:27','1','2023-03-05 21:42:27',0,148); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2819,137,1037,'1','2023-03-05 21:42:27','1','2023-03-05 21:42:27',0,148); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2820,137,1038,'1','2023-03-05 21:42:27','1','2023-03-05 21:42:27',0,148); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2821,137,1039,'1','2023-03-05 21:42:27','1','2023-03-05 21:42:27',0,148); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2822,137,100,'1','2023-03-05 21:42:27','1','2023-03-05 21:42:27',0,148); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2823,137,101,'1','2023-03-05 21:42:27','1','2023-03-05 21:42:27',0,148); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2824,137,1063,'1','2023-03-05 21:42:27','1','2023-03-05 21:42:27',0,148); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2825,137,103,'1','2023-03-05 21:42:27','1','2023-03-05 21:42:27',0,148); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2826,137,1064,'1','2023-03-05 21:42:27','1','2023-03-05 21:42:27',0,148); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2827,137,1001,'1','2023-03-05 21:42:27','1','2023-03-05 21:42:27',0,148); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2828,137,1065,'1','2023-03-05 21:42:27','1','2023-03-05 21:42:27',0,148); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2829,137,1002,'1','2023-03-05 21:42:27','1','2023-03-05 21:42:27',0,148); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2830,137,1003,'1','2023-03-05 21:42:27','1','2023-03-05 21:42:27',0,148); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2831,137,107,'1','2023-03-05 21:42:27','1','2023-03-05 21:42:27',0,148); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2832,137,1004,'1','2023-03-05 21:42:27','1','2023-03-05 21:42:27',0,148); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2833,137,1005,'1','2023-03-05 21:42:27','1','2023-03-05 21:42:27',0,148); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2834,137,1006,'1','2023-03-05 21:42:27','1','2023-03-05 21:42:27',0,148); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2835,137,1007,'1','2023-03-05 21:42:27','1','2023-03-05 21:42:27',0,148); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2836,137,1008,'1','2023-03-05 21:42:27','1','2023-03-05 21:42:27',0,148); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2837,137,1009,'1','2023-03-05 21:42:27','1','2023-03-05 21:42:27',0,148); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2838,137,1010,'1','2023-03-05 21:42:27','1','2023-03-05 21:42:27',0,148); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2839,137,1011,'1','2023-03-05 21:42:27','1','2023-03-05 21:42:27',0,148); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2840,137,1012,'1','2023-03-05 21:42:27','1','2023-03-05 21:42:27',0,148); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2841,137,1017,'1','2023-03-05 21:42:27','1','2023-03-05 21:42:27',0,148); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2842,137,1018,'1','2023-03-05 21:42:27','1','2023-03-05 21:42:27',0,148); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2843,137,1019,'1','2023-03-05 21:42:27','1','2023-03-05 21:42:27',0,148); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2844,137,1020,'1','2023-03-05 21:42:27','1','2023-03-05 21:42:27',0,148); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2845,138,1,'1','2023-03-05 21:59:02','1','2023-03-05 21:59:02',0,149); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2846,138,1036,'1','2023-03-05 21:59:02','1','2023-03-05 21:59:02',0,149); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2847,138,1037,'1','2023-03-05 21:59:02','1','2023-03-05 21:59:02',0,149); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2848,138,1038,'1','2023-03-05 21:59:02','1','2023-03-05 21:59:02',0,149); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2849,138,1039,'1','2023-03-05 21:59:02','1','2023-03-05 21:59:02',0,149); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2850,138,100,'1','2023-03-05 21:59:02','1','2023-03-05 21:59:02',0,149); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2851,138,101,'1','2023-03-05 21:59:02','1','2023-03-05 21:59:02',0,149); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2852,138,1063,'1','2023-03-05 21:59:02','1','2023-03-05 21:59:02',0,149); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2853,138,103,'1','2023-03-05 21:59:02','1','2023-03-05 21:59:02',0,149); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2854,138,1064,'1','2023-03-05 21:59:02','1','2023-03-05 21:59:02',0,149); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2855,138,1001,'1','2023-03-05 21:59:02','1','2023-03-05 21:59:02',0,149); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2856,138,1065,'1','2023-03-05 21:59:02','1','2023-03-05 21:59:02',0,149); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2857,138,1002,'1','2023-03-05 21:59:02','1','2023-03-05 21:59:02',0,149); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2858,138,1003,'1','2023-03-05 21:59:02','1','2023-03-05 21:59:02',0,149); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2859,138,107,'1','2023-03-05 21:59:02','1','2023-03-05 21:59:02',0,149); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2860,138,1004,'1','2023-03-05 21:59:02','1','2023-03-05 21:59:02',0,149); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2861,138,1005,'1','2023-03-05 21:59:02','1','2023-03-05 21:59:02',0,149); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2862,138,1006,'1','2023-03-05 21:59:02','1','2023-03-05 21:59:02',0,149); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2863,138,1007,'1','2023-03-05 21:59:02','1','2023-03-05 21:59:02',0,149); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2864,138,1008,'1','2023-03-05 21:59:02','1','2023-03-05 21:59:02',0,149); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2865,138,1009,'1','2023-03-05 21:59:02','1','2023-03-05 21:59:02',0,149); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2866,138,1010,'1','2023-03-05 21:59:02','1','2023-03-05 21:59:02',0,149); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2867,138,1011,'1','2023-03-05 21:59:02','1','2023-03-05 21:59:02',0,149); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2868,138,1012,'1','2023-03-05 21:59:02','1','2023-03-05 21:59:02',0,149); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2869,138,1017,'1','2023-03-05 21:59:02','1','2023-03-05 21:59:02',0,149); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2870,138,1018,'1','2023-03-05 21:59:02','1','2023-03-05 21:59:02',0,149); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2871,138,1019,'1','2023-03-05 21:59:02','1','2023-03-05 21:59:02',0,149); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"("ID","ROLE_ID","MENU_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2872,138,1020,'1','2023-03-05 21:59:02','1','2023-03-05 21:59:02',0,149); + +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_SENSITIVE_WORD" ON; +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_SENSITIVE_WORD"("ID","NAME","DESCRIPTION","TAGS","STATUS","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(3,'土豆','好呀','蔬菜,短信',0,'1','2022-04-08 21:07:12','1','2022-04-09 10:28:14',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_SENSITIVE_WORD"("ID","NAME","DESCRIPTION","TAGS","STATUS","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(4,'XXX',null,'短信',0,'1','2022-04-08 21:27:49','1','2022-06-19 00:36:50',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_SENSITIVE_WORD"("ID","NAME","DESCRIPTION","TAGS","STATUS","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(5,'白痴',null,'测试',0,'1','2022-12-31 19:08:25','1','2022-12-31 19:08:25',0); + +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_SENSITIVE_WORD" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_SMS_CHANNEL" ON; +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_SMS_CHANNEL"("ID","SIGNATURE","CODE","STATUS","REMARK","API_KEY","API_SECRET","CALLBACK_URL","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2,'Ballcat','ALIYUN',0,'啦啦啦','LTAI5tCnKso2uG3kJ5gRav88','fGJ5SNXL7P1NHNRmJ7DJaMJGPyE55C',null,'','2021-03-31 11:53:10','1','2021-04-14 00:08:37',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_SMS_CHANNEL"("ID","SIGNATURE","CODE","STATUS","REMARK","API_KEY","API_SECRET","CALLBACK_URL","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(4,'测试渠道','DEBUG_DING_TALK',0,'123','696b5d8ead48071237e4aa5861ff08dbadb2b4ded1c688a7b7c9afc615579859','SEC5c4e5ff888bc8a9923ae47f59e7ccd30af1f14d93c55b4e2c9cb094e35aeed67',null,'1','2021-04-13 00:23:14','1','2022-03-27 20:29:49',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_SMS_CHANNEL"("ID","SIGNATURE","CODE","STATUS","REMARK","API_KEY","API_SECRET","CALLBACK_URL","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(6,'测试演示','DEBUG_DING_TALK',0,null,'696b5d8ead48071237e4aa5861ff08dbadb2b4ded1c688a7b7c9afc615579859','SEC5c4e5ff888bc8a9923ae47f59e7ccd30af1f14d93c55b4e2c9cb094e35aeed67',null,'1','2022-04-10 23:07:59','1','2022-06-19 00:33:54',0); + +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_SMS_CHANNEL" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_SMS_CODE" ON; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_SMS_CODE" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_SMS_LOG" ON; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_SMS_LOG" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_SMS_TEMPLATE" ON; +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_SMS_TEMPLATE"("ID","TYPE","STATUS","CODE","NAME","CONTENT","PARAMS","REMARK","API_TEMPLATE_ID","CHANNEL_ID","CHANNEL_CODE","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2,1,0,'test_01','测试验证码短信','正在进行登录操作{operation},您的验证码是{code}','["operation","code"]',null,'4383920',6,'DEBUG_DING_TALK','','2021-03-31 10:49:38','1','2022-12-10 21:26:20',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_SMS_TEMPLATE"("ID","TYPE","STATUS","CODE","NAME","CONTENT","PARAMS","REMARK","API_TEMPLATE_ID","CHANNEL_ID","CHANNEL_CODE","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(3,1,0,'test_02','公告通知','您的验证码{code},该验证码5分钟内有效,请勿泄漏于他人!','["code"]',null,'SMS_207945135',2,'ALIYUN','','2021-03-31 11:56:30','1','2021-04-10 01:22:02',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_SMS_TEMPLATE"("ID","TYPE","STATUS","CODE","NAME","CONTENT","PARAMS","REMARK","API_TEMPLATE_ID","CHANNEL_ID","CHANNEL_CODE","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(6,3,0,'test-01','测试模板','哈哈哈 {name}','["name"]','f哈哈哈','4383920',6,'DEBUG_DING_TALK','1','2021-04-10 01:07:21','1','2022-12-10 21:26:09',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_SMS_TEMPLATE"("ID","TYPE","STATUS","CODE","NAME","CONTENT","PARAMS","REMARK","API_TEMPLATE_ID","CHANNEL_ID","CHANNEL_CODE","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(7,3,0,'test-04','测试下','老鸡{name},牛逼{code}','["name","code"]',null,'suibian',4,'DEBUG_DING_TALK','1','2021-04-13 00:29:53','1','2021-04-14 00:30:38',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_SMS_TEMPLATE"("ID","TYPE","STATUS","CODE","NAME","CONTENT","PARAMS","REMARK","API_TEMPLATE_ID","CHANNEL_ID","CHANNEL_CODE","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(8,1,0,'user-sms-login','前台用户短信登录','您的验证码是{code}','["code"]',null,'4372216',6,'DEBUG_DING_TALK','1','2021-10-11 08:10:00','1','2022-12-10 21:25:59',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_SMS_TEMPLATE"("ID","TYPE","STATUS","CODE","NAME","CONTENT","PARAMS","REMARK","API_TEMPLATE_ID","CHANNEL_ID","CHANNEL_CODE","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(9,2,0,'bpm_task_assigned','【工作流】任务被分配','您收到了一条新的待办任务:{processInstanceName}-{taskName},申请人:{startUserNickname},处理链接:{detailUrl}','["processInstanceName","taskName","startUserNickname","detailUrl"]',null,'suibian',4,'DEBUG_DING_TALK','1','2022-01-21 22:31:19','1','2022-01-22 00:03:36',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_SMS_TEMPLATE"("ID","TYPE","STATUS","CODE","NAME","CONTENT","PARAMS","REMARK","API_TEMPLATE_ID","CHANNEL_ID","CHANNEL_CODE","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(10,2,0,'bpm_process_instance_reject','【工作流】流程被不通过','您的流程被审批不通过:{processInstanceName},原因:{reason},查看链接:{detailUrl}','["processInstanceName","reason","detailUrl"]',null,'suibian',4,'DEBUG_DING_TALK','1','2022-01-22 00:03:31','1','2022-05-01 12:33:14',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_SMS_TEMPLATE"("ID","TYPE","STATUS","CODE","NAME","CONTENT","PARAMS","REMARK","API_TEMPLATE_ID","CHANNEL_ID","CHANNEL_CODE","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(11,2,0,'bpm_process_instance_approve','【工作流】流程被通过','您的流程被审批通过:{processInstanceName},查看链接:{detailUrl}','["processInstanceName","detailUrl"]',null,'suibian',4,'DEBUG_DING_TALK','1','2022-01-22 00:04:31','1','2022-03-27 20:32:21',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_SMS_TEMPLATE"("ID","TYPE","STATUS","CODE","NAME","CONTENT","PARAMS","REMARK","API_TEMPLATE_ID","CHANNEL_ID","CHANNEL_CODE","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(12,2,0,'demo','演示模板','我就是测试一下下','[]',null,'biubiubiu',6,'DEBUG_DING_TALK','1','2022-04-10 23:22:49','1','2023-03-24 23:45:07',0); + +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_SMS_TEMPLATE" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_SOCIAL_USER" ON; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_SOCIAL_USER" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_SOCIAL_USER_BIND" ON; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_SOCIAL_USER_BIND" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_TENANT" ON; +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_TENANT"("ID","NAME","CONTACT_USER_ID","CONTACT_NAME","CONTACT_MOBILE","STATUS","DOMAIN","PACKAGE_ID","EXPIRE_TIME","ACCOUNT_COUNT","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(1,'闻荫源码',null,'芋艿','17321315478',0,'https://www.iocoder.cn',0,'2099-02-19 17:14:16',9999,'1','2021-01-05 17:03:47','1','2022-02-23 12:15:11',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_TENANT"("ID","NAME","CONTACT_USER_ID","CONTACT_NAME","CONTACT_MOBILE","STATUS","DOMAIN","PACKAGE_ID","EXPIRE_TIME","ACCOUNT_COUNT","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(121,'小租户',110,'小王2','15601691300',0,'http://www.iocoder.cn',111,'2024-03-11 00:00:00',20,'1','2022-02-22 00:56:14','1','2022-05-17 10:03:59',0); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_TENANT"("ID","NAME","CONTACT_USER_ID","CONTACT_NAME","CONTACT_MOBILE","STATUS","DOMAIN","PACKAGE_ID","EXPIRE_TIME","ACCOUNT_COUNT","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(122,'测试租户',113,'闻荫','15601691300',0,'https://www.iocoder.cn',111,'2022-04-30 00:00:00',50,'1','2022-03-07 21:37:58','1','2022-03-07 21:37:58',0); + +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_TENANT" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_TENANT_PACKAGE" ON; +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_TENANT_PACKAGE"("ID","NAME","STATUS","REMARK","MENU_IDS","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(111,'普通套餐',0,'小功能','[1,1036,1037,1038,1039,100,101,1063,103,1064,1001,1065,1002,1003,107,1004,1005,1006,1007,1008,1009,1010,1011,1012,1017,1018,1019,1020]','1','2022-02-22 00:54:00','1','2022-09-21 22:48:12',0); + +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_TENANT_PACKAGE" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_USERS" ON; +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USERS"("ID","USERNAME","PASSWORD","NICKNAME","REMARK","DEPT_ID","POST_IDS","EMAIL","MOBILE","SEX","AVATAR","STATUS","LOGIN_IP","LOGIN_DATE","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1,'admin','$2a$10$mRMIYLDtRHlf6.9ipiqH1.Z.bh/R9dO9d5iHiGYPigi6r5KOoR2Wm','闻荫源码','管理员',103,'[1]','aoteman@126.com','15612345678',1,'http://test.win.iocoder.cn/e1fdd7271685ec143a0900681606406621717a666ad0b2798b096df41422b32f.png',0,'0:0:0:0:0:0:0:1','2023-04-13 23:09:16','admin','2021-01-05 17:03:47',null,'2023-04-13 23:09:16',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USERS"("ID","USERNAME","PASSWORD","NICKNAME","REMARK","DEPT_ID","POST_IDS","EMAIL","MOBILE","SEX","AVATAR","STATUS","LOGIN_IP","LOGIN_DATE","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(100,'win','$2a$10$11U48RhyJ5pSBYWSn12AD./ld671.ycSzJHbyrtpeoMeYiw31eo8a','闻荫','不要吓我',104,'[1]','win@iocoder.cn','15601691300',1,'',1,'127.0.0.1','2022-07-09 23:03:33','','2021-01-07 09:07:17',null,'2022-07-09 23:03:33',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USERS"("ID","USERNAME","PASSWORD","NICKNAME","REMARK","DEPT_ID","POST_IDS","EMAIL","MOBILE","SEX","AVATAR","STATUS","LOGIN_IP","LOGIN_DATE","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(103,'yuanma','$2a$10$YMpimV4T6BtDhIaA8jSW.u8UTGBeGhc/qwXP4oxoMr4mOw9.qttt6','源码',null,106,null,'yuanma@iocoder.cn','15601701300',0,'',0,'127.0.0.1','2022-07-08 01:26:27','','2021-01-13 23:50:35',null,'2022-07-08 01:26:27',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USERS"("ID","USERNAME","PASSWORD","NICKNAME","REMARK","DEPT_ID","POST_IDS","EMAIL","MOBILE","SEX","AVATAR","STATUS","LOGIN_IP","LOGIN_DATE","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(104,'test','$2a$10$GP8zvqHB//TekuzYZSBYAuBQJiNq1.fxQVDYJ.uBCOnWCtDVKE4H6','测试号',null,107,'[1,2]','111@qq.com','15601691200',1,'',0,'127.0.0.1','2022-05-28 15:43:17','','2021-01-21 02:13:53',null,'2022-07-09 09:00:33',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USERS"("ID","USERNAME","PASSWORD","NICKNAME","REMARK","DEPT_ID","POST_IDS","EMAIL","MOBILE","SEX","AVATAR","STATUS","LOGIN_IP","LOGIN_DATE","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(107,'admin107','$2a$10$dYOOBKMO93v/.ReCqzyFg.o67Tqk.bbc2bhrpyBGkIw9aypCtr2pm','芋艿',null,null,null,'','15601691300',0,'',0,'',null,'1','2022-02-20 22:59:33','1','2022-02-27 08:26:51',0,118); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USERS"("ID","USERNAME","PASSWORD","NICKNAME","REMARK","DEPT_ID","POST_IDS","EMAIL","MOBILE","SEX","AVATAR","STATUS","LOGIN_IP","LOGIN_DATE","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(108,'admin108','$2a$10$y6mfvKoNYL1GXWak8nYwVOH.kCWqjactkzdoIDgiKl93WN3Ejg.Lu','芋艿',null,null,null,'','15601691300',0,'',0,'',null,'1','2022-02-20 23:00:50','1','2022-02-27 08:26:53',0,119); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USERS"("ID","USERNAME","PASSWORD","NICKNAME","REMARK","DEPT_ID","POST_IDS","EMAIL","MOBILE","SEX","AVATAR","STATUS","LOGIN_IP","LOGIN_DATE","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(109,'admin109','$2a$10$JAqvH0tEc0I7dfDVBI7zyuB4E3j.uH6daIjV53.vUS6PknFkDJkuK','芋艿',null,null,null,'','15601691300',0,'',0,'',null,'1','2022-02-20 23:11:50','1','2022-02-27 08:26:56',0,120); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USERS"("ID","USERNAME","PASSWORD","NICKNAME","REMARK","DEPT_ID","POST_IDS","EMAIL","MOBILE","SEX","AVATAR","STATUS","LOGIN_IP","LOGIN_DATE","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(110,'admin110','$2a$10$mRMIYLDtRHlf6.9ipiqH1.Z.bh/R9dO9d5iHiGYPigi6r5KOoR2Wm','小王',null,null,null,'','15601691300',0,'',0,'127.0.0.1','2022-09-25 22:47:33','1','2022-02-22 00:56:14',null,'2022-09-25 22:47:33',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USERS"("ID","USERNAME","PASSWORD","NICKNAME","REMARK","DEPT_ID","POST_IDS","EMAIL","MOBILE","SEX","AVATAR","STATUS","LOGIN_IP","LOGIN_DATE","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(111,'test','$2a$10$mExveopHUx9Q4QiLtAzhDeH3n4/QlNLzEsM4AqgxKrU.ciUZDXZCy','测试用户',null,null,'[]','','',0,'',0,'',null,'110','2022-02-23 13:14:33','110','2022-02-23 13:14:33',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USERS"("ID","USERNAME","PASSWORD","NICKNAME","REMARK","DEPT_ID","POST_IDS","EMAIL","MOBILE","SEX","AVATAR","STATUS","LOGIN_IP","LOGIN_DATE","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(112,'newobject','$2a$10$3alwklxqfq8/hKoW6oUV0OJp0IdQpBDauLy4633SpUjrRsStl6kMa','新对象',null,100,'[]','','',1,'',0,'0:0:0:0:0:0:0:1','2023-02-10 13:48:13','1','2022-02-23 19:08:03',null,'2023-02-10 13:48:13',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USERS"("ID","USERNAME","PASSWORD","NICKNAME","REMARK","DEPT_ID","POST_IDS","EMAIL","MOBILE","SEX","AVATAR","STATUS","LOGIN_IP","LOGIN_DATE","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(113,'aoteman','$2a$10$0acJOIk2D25/oC87nyclE..0lzeu9DtQ/n3geP4fkun/zIVRhHJIO','闻荫',null,null,null,'','15601691300',0,'',0,'127.0.0.1','2022-03-19 18:38:51','1','2022-03-07 21:37:58',null,'2022-03-19 18:38:51',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USERS"("ID","USERNAME","PASSWORD","NICKNAME","REMARK","DEPT_ID","POST_IDS","EMAIL","MOBILE","SEX","AVATAR","STATUS","LOGIN_IP","LOGIN_DATE","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(114,'hrmgr','$2a$10$TR4eybBioGRhBmDBWkqWLO6NIh3mzYa8KBKDDB5woiGYFVlRAi.fu','hr 小姐姐',null,null,'[3]','','',0,'',0,'127.0.0.1','2022-03-19 22:15:43','1','2022-03-19 21:50:58',null,'2022-03-19 22:15:43',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USERS"("ID","USERNAME","PASSWORD","NICKNAME","REMARK","DEPT_ID","POST_IDS","EMAIL","MOBILE","SEX","AVATAR","STATUS","LOGIN_IP","LOGIN_DATE","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(115,'aotemane','$2a$10$/WCwGHu1eq0wOVDd/u8HweJ0gJCHyLS6T7ndCqI8UXZAQom1etk2e','1','11',101,'[]','','',1,'',0,'',null,'1','2022-04-30 02:55:43','1','2022-06-22 13:34:58',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USERS"("ID","USERNAME","PASSWORD","NICKNAME","REMARK","DEPT_ID","POST_IDS","EMAIL","MOBILE","SEX","AVATAR","STATUS","LOGIN_IP","LOGIN_DATE","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(116,'15601691302','$2a$10$L5C4S0U6adBWMvFv1Wwl4.DI/NwYS3WIfLj5Q.Naqr5II8CmqsDZ6','小豆',null,null,null,'','',0,'',0,'',null,'1','2022-05-17 10:07:10','1','2022-05-17 10:07:10',0,124); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USERS"("ID","USERNAME","PASSWORD","NICKNAME","REMARK","DEPT_ID","POST_IDS","EMAIL","MOBILE","SEX","AVATAR","STATUS","LOGIN_IP","LOGIN_DATE","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(117,'admin123','$2a$10$WI8Gg/lpZQIrOEZMHqka7OdFaD4Nx.B/qY8ZGTTUKrOJwaHFqibaC','测试号','1111',100,'[2]','','15601691234',1,'',0,'',null,'1','2022-07-09 17:40:26','1','2022-07-09 17:40:26',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USERS"("ID","USERNAME","PASSWORD","NICKNAME","REMARK","DEPT_ID","POST_IDS","EMAIL","MOBILE","SEX","AVATAR","STATUS","LOGIN_IP","LOGIN_DATE","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(118,'goudan','$2a$10$Lrb71muL.s5/AFjQ2IHkzOFlAFwUToH.zQL7bnghvTDt/QptjGgF6','狗蛋',null,103,'[1]','','',2,'',0,'',null,'1','2022-07-09 17:44:43','1','2022-12-31 17:29:13',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USERS"("ID","USERNAME","PASSWORD","NICKNAME","REMARK","DEPT_ID","POST_IDS","EMAIL","MOBILE","SEX","AVATAR","STATUS","LOGIN_IP","LOGIN_DATE","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(119,'admin','$2a$10$AheSOpxeWQYhEO/gGZhDz.oifdX5zt.kprWNHptPiiStUx4mXmHb.','12',null,null,null,'','',0,'',0,'',null,'1','2022-12-30 11:32:04','1','2022-12-30 11:32:04',0,125); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USERS"("ID","USERNAME","PASSWORD","NICKNAME","REMARK","DEPT_ID","POST_IDS","EMAIL","MOBILE","SEX","AVATAR","STATUS","LOGIN_IP","LOGIN_DATE","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(120,'admin','$2a$10$D.xFtcgma/NJ3SyYlUj3bORcs0mwOD6Zu.4I7GCI/8/25/QSn4qJC','12',null,null,null,'','',0,'',0,'',null,'1','2022-12-30 11:33:42','1','2022-12-30 11:33:42',0,126); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USERS"("ID","USERNAME","PASSWORD","NICKNAME","REMARK","DEPT_ID","POST_IDS","EMAIL","MOBILE","SEX","AVATAR","STATUS","LOGIN_IP","LOGIN_DATE","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(121,'admin','$2a$10$R2guBf7TyERjjW9lm0Pd0Osut6vt7NuH2Vx6fkOI5.VgSvJK2Xb82','12',null,null,null,'','',0,'',0,'',null,'1','2022-12-30 11:33:49','1','2022-12-30 11:33:49',0,127); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USERS"("ID","USERNAME","PASSWORD","NICKNAME","REMARK","DEPT_ID","POST_IDS","EMAIL","MOBILE","SEX","AVATAR","STATUS","LOGIN_IP","LOGIN_DATE","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(122,'admin','$2a$10$pwxqUUza61HBgx3FTjp2d.Mc2UKalikXxP91wUdP4bFe7Hl.lfmeq','12',null,null,null,'','',0,'',0,'',null,'1','2022-12-30 11:47:52','1','2022-12-30 11:47:52',0,129); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USERS"("ID","USERNAME","PASSWORD","NICKNAME","REMARK","DEPT_ID","POST_IDS","EMAIL","MOBILE","SEX","AVATAR","STATUS","LOGIN_IP","LOGIN_DATE","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(123,'tudou','$2a$10$m33ROHSPa9lshwQIaiVlFeoG1TZjCoQmfvExn4QWS8r5X59AEsTz2','15601691234',null,null,null,'','',0,'',0,'',null,'1','2023-03-05 21:23:35','1','2023-03-05 21:23:35',0,147); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USERS"("ID","USERNAME","PASSWORD","NICKNAME","REMARK","DEPT_ID","POST_IDS","EMAIL","MOBILE","SEX","AVATAR","STATUS","LOGIN_IP","LOGIN_DATE","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(124,'tudou','$2a$10$1pzAJAEIRf/vYyMy8FTFiOzX40Q/NnozXixun/ExPZwv8A/CQkR4q','15601691234',null,null,null,'','',0,'',0,'',null,'1','2023-03-05 21:42:27','1','2023-03-05 21:42:27',0,148); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USERS"("ID","USERNAME","PASSWORD","NICKNAME","REMARK","DEPT_ID","POST_IDS","EMAIL","MOBILE","SEX","AVATAR","STATUS","LOGIN_IP","LOGIN_DATE","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(125,'admin','$2a$10$E49momkI6Uf9v6pkfjoRP.dHzK4RjDIK39AWHz9eXRmqUR5sbJpoy','秃头',null,null,null,'','',0,'',0,'',null,'1','2023-03-05 21:59:03','1','2023-03-05 21:59:03',0,149); + +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_USERS" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_USER_POST" ON; +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USER_POST"("ID","USER_ID","POST_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(112,1,1,'admin','2022-05-02 07:25:24','admin','2022-05-02 07:25:24',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USER_POST"("ID","USER_ID","POST_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(113,100,1,'admin','2022-05-02 07:25:24','admin','2022-05-02 07:25:24',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USER_POST"("ID","USER_ID","POST_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(114,114,3,'admin','2022-05-02 07:25:24','admin','2022-05-02 07:25:24',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USER_POST"("ID","USER_ID","POST_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(115,104,1,'1','2022-05-16 19:36:28','1','2022-05-16 19:36:28',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USER_POST"("ID","USER_ID","POST_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(116,117,2,'1','2022-07-09 17:40:26','1','2022-07-09 17:40:26',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USER_POST"("ID","USER_ID","POST_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(117,118,1,'1','2022-07-09 17:44:44','1','2022-07-09 17:44:44',0,1); + +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_USER_POST" OFF; +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_USER_ROLE" ON; +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USER_ROLE"("ID","USER_ID","ROLE_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(1,1,1,'','2022-01-11 13:19:45','','2022-05-12 12:35:17',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USER_ROLE"("ID","USER_ID","ROLE_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(2,2,2,'','2022-01-11 13:19:45','','2022-05-12 12:35:13',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USER_ROLE"("ID","USER_ID","ROLE_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(4,100,101,'','2022-01-11 13:19:45','','2022-05-12 12:35:13',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USER_ROLE"("ID","USER_ID","ROLE_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(5,100,1,'','2022-01-11 13:19:45','','2022-05-12 12:35:12',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USER_ROLE"("ID","USER_ID","ROLE_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(6,100,2,'','2022-01-11 13:19:45','','2022-05-12 12:35:11',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USER_ROLE"("ID","USER_ID","ROLE_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(10,103,1,'1','2022-01-11 13:19:45','1','2022-01-11 13:19:45',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USER_ROLE"("ID","USER_ID","ROLE_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(11,107,106,'1','2022-02-20 22:59:33','1','2022-02-20 22:59:33',0,118); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USER_ROLE"("ID","USER_ID","ROLE_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(12,108,107,'1','2022-02-20 23:00:50','1','2022-02-20 23:00:50',0,119); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USER_ROLE"("ID","USER_ID","ROLE_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(13,109,108,'1','2022-02-20 23:11:50','1','2022-02-20 23:11:50',0,120); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USER_ROLE"("ID","USER_ID","ROLE_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(14,110,109,'1','2022-02-22 00:56:14','1','2022-02-22 00:56:14',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USER_ROLE"("ID","USER_ID","ROLE_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(15,111,110,'110','2022-02-23 13:14:38','110','2022-02-23 13:14:38',0,121); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USER_ROLE"("ID","USER_ID","ROLE_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(16,113,111,'1','2022-03-07 21:37:58','1','2022-03-07 21:37:58',0,122); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USER_ROLE"("ID","USER_ID","ROLE_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(17,114,101,'1','2022-03-19 21:51:13','1','2022-03-19 21:51:13',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USER_ROLE"("ID","USER_ID","ROLE_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(18,1,2,'1','2022-05-12 20:39:29','1','2022-05-12 20:39:29',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USER_ROLE"("ID","USER_ID","ROLE_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(19,116,113,'1','2022-05-17 10:07:10','1','2022-05-17 10:07:10',0,124); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USER_ROLE"("ID","USER_ID","ROLE_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(20,104,101,'1','2022-05-28 15:43:57','1','2022-05-28 15:43:57',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USER_ROLE"("ID","USER_ID","ROLE_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(22,115,2,'1','2022-07-21 22:08:30','1','2022-07-21 22:08:30',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USER_ROLE"("ID","USER_ID","ROLE_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(23,119,114,'1','2022-12-30 11:32:04','1','2022-12-30 11:32:04',0,125); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USER_ROLE"("ID","USER_ID","ROLE_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(24,120,115,'1','2022-12-30 11:33:42','1','2022-12-30 11:33:42',0,126); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USER_ROLE"("ID","USER_ID","ROLE_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(25,121,116,'1','2022-12-30 11:33:49','1','2022-12-30 11:33:49',0,127); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USER_ROLE"("ID","USER_ID","ROLE_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(26,122,118,'1','2022-12-30 11:47:53','1','2022-12-30 11:47:53',0,129); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USER_ROLE"("ID","USER_ID","ROLE_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(27,112,101,'1','2023-02-09 23:18:51','1','2023-02-09 23:18:51',0,1); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USER_ROLE"("ID","USER_ID","ROLE_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(28,123,136,'1','2023-03-05 21:23:35','1','2023-03-05 21:23:35',0,147); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USER_ROLE"("ID","USER_ID","ROLE_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(29,124,137,'1','2023-03-05 21:42:27','1','2023-03-05 21:42:27',0,148); +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_USER_ROLE"("ID","USER_ID","ROLE_ID","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED","TENANT_ID") VALUES(30,125,138,'1','2023-03-05 21:59:03','1','2023-03-05 21:59:03',0,149); + +SET IDENTITY_INSERT "RUOYI_VUE_PRO"."SYSTEM_USER_ROLE" OFF; +ALTER TABLE "RUOYI_VUE_PRO"."SYSTEM_NOTIFY_MESSAGE" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."SYSTEM_NOTIFY_TEMPLATE" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_ACCESS_TOKEN" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_APPROVE" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CLIENT" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CODE" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_REFRESH_TOKEN" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."SYSTEM_OPERATE_LOG" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."SYSTEM_POST" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."SYSTEM_ROLE" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."SYSTEM_SENSITIVE_WORD" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."SYSTEM_SMS_CHANNEL" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."SYSTEM_SMS_CODE" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."SYSTEM_SMS_LOG" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."SYSTEM_SMS_TEMPLATE" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."SYSTEM_SOCIAL_USER" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."SYSTEM_SOCIAL_USER_BIND" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."SYSTEM_TENANT" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."SYSTEM_TENANT_PACKAGE" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."SYSTEM_USERS" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."SYSTEM_USER_POST" ADD CONSTRAINT PRIMARY KEY("ID") ; + +ALTER TABLE "RUOYI_VUE_PRO"."SYSTEM_USER_ROLE" ADD CONSTRAINT PRIMARY KEY("ID") ; + +CREATE INDEX "IDX_MOBILE" +ON "RUOYI_VUE_PRO"."SYSTEM_SMS_CODE"("MOBILE"); + +ALTER TABLE "RUOYI_VUE_PRO"."SYSTEM_USERS" ADD CONSTRAINT "IDX_USERNAME" UNIQUE("USERNAME","UPDATE_TIME","TENANT_ID") ; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."SYSTEM_NOTIFY_MESSAGE" IS '站内信消息表'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_NOTIFY_MESSAGE"."ID" IS '用户ID'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_NOTIFY_MESSAGE"."USER_ID" IS '用户id'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_NOTIFY_MESSAGE"."USER_TYPE" IS '用户类型'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_NOTIFY_MESSAGE"."TEMPLATE_ID" IS '模版编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_NOTIFY_MESSAGE"."TEMPLATE_CODE" IS '模板编码'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_NOTIFY_MESSAGE"."TEMPLATE_NICKNAME" IS '模版发送人名称'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_NOTIFY_MESSAGE"."TEMPLATE_CONTENT" IS '模版内容'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_NOTIFY_MESSAGE"."TEMPLATE_TYPE" IS '模版类型'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_NOTIFY_MESSAGE"."TEMPLATE_PARAMS" IS '模版参数'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_NOTIFY_MESSAGE"."READ_STATUS" IS '是否已读'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_NOTIFY_MESSAGE"."READ_TIME" IS '阅读时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_NOTIFY_MESSAGE"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_NOTIFY_MESSAGE"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_NOTIFY_MESSAGE"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_NOTIFY_MESSAGE"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_NOTIFY_MESSAGE"."DELETED" IS '是否删除'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_NOTIFY_MESSAGE"."TENANT_ID" IS '租户编号'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."SYSTEM_NOTIFY_TEMPLATE" IS '站内信模板表'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_NOTIFY_TEMPLATE"."ID" IS '主键'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_NOTIFY_TEMPLATE"."NAME" IS '模板名称'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_NOTIFY_TEMPLATE"."CODE" IS '模版编码'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_NOTIFY_TEMPLATE"."NICKNAME" IS '发送人名称'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_NOTIFY_TEMPLATE"."CONTENT" IS '模版内容'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_NOTIFY_TEMPLATE"."TYPE" IS '类型'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_NOTIFY_TEMPLATE"."PARAMS" IS '参数数组'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_NOTIFY_TEMPLATE"."STATUS" IS '状态'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_NOTIFY_TEMPLATE"."REMARK" IS '备注'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_NOTIFY_TEMPLATE"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_NOTIFY_TEMPLATE"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_NOTIFY_TEMPLATE"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_NOTIFY_TEMPLATE"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_NOTIFY_TEMPLATE"."DELETED" IS '是否删除'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_ACCESS_TOKEN" IS 'OAuth2 访问令牌'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_ACCESS_TOKEN"."ID" IS '编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_ACCESS_TOKEN"."USER_ID" IS '用户编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_ACCESS_TOKEN"."USER_TYPE" IS '用户类型'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_ACCESS_TOKEN"."ACCESS_TOKEN" IS '访问令牌'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_ACCESS_TOKEN"."REFRESH_TOKEN" IS '刷新令牌'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_ACCESS_TOKEN"."CLIENT_ID" IS '客户端编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_ACCESS_TOKEN"."SCOPES" IS '授权范围'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_ACCESS_TOKEN"."EXPIRES_TIME" IS '过期时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_ACCESS_TOKEN"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_ACCESS_TOKEN"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_ACCESS_TOKEN"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_ACCESS_TOKEN"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_ACCESS_TOKEN"."DELETED" IS '是否删除'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_ACCESS_TOKEN"."TENANT_ID" IS '租户编号'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_APPROVE" IS 'OAuth2 批准表'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_APPROVE"."ID" IS '编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_APPROVE"."USER_ID" IS '用户编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_APPROVE"."USER_TYPE" IS '用户类型'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_APPROVE"."CLIENT_ID" IS '客户端编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_APPROVE"."SCOPE" IS '授权范围'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_APPROVE"."APPROVED" IS '是否接受'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_APPROVE"."EXPIRES_TIME" IS '过期时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_APPROVE"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_APPROVE"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_APPROVE"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_APPROVE"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_APPROVE"."DELETED" IS '是否删除'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_APPROVE"."TENANT_ID" IS '租户编号'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CLIENT" IS 'OAuth2 客户端表'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CLIENT"."ID" IS '编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CLIENT"."CLIENT_ID" IS '客户端编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CLIENT"."SECRET" IS '客户端密钥'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CLIENT"."NAME" IS '应用名'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CLIENT"."LOGO" IS '应用图标'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CLIENT"."DESCRIPTION" IS '应用描述'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CLIENT"."STATUS" IS '状态'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CLIENT"."ACCESS_TOKEN_VALIDITY_SECONDS" IS '访问令牌的有效期'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CLIENT"."REFRESH_TOKEN_VALIDITY_SECONDS" IS '刷新令牌的有效期'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CLIENT"."REDIRECT_URIS" IS '可重定向的 URI 地址'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CLIENT"."AUTHORIZED_GRANT_TYPES" IS '授权类型'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CLIENT"."SCOPES" IS '授权范围'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CLIENT"."AUTO_APPROVE_SCOPES" IS '自动通过的授权范围'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CLIENT"."AUTHORITIES" IS '权限'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CLIENT"."RESOURCE_IDS" IS '资源'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CLIENT"."ADDITIONAL_INFORMATION" IS '附加信息'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CLIENT"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CLIENT"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CLIENT"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CLIENT"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CLIENT"."DELETED" IS '是否删除'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CODE" IS 'OAuth2 授权码表'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CODE"."ID" IS '编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CODE"."USER_ID" IS '用户编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CODE"."USER_TYPE" IS '用户类型'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CODE"."CODE" IS '授权码'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CODE"."CLIENT_ID" IS '客户端编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CODE"."SCOPES" IS '授权范围'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CODE"."EXPIRES_TIME" IS '过期时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CODE"."REDIRECT_URI" IS '可重定向的 URI 地址'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CODE"."STATE" IS '状态'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CODE"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CODE"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CODE"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CODE"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CODE"."DELETED" IS '是否删除'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_CODE"."TENANT_ID" IS '租户编号'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_REFRESH_TOKEN" IS 'OAuth2 刷新令牌'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_REFRESH_TOKEN"."ID" IS '编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_REFRESH_TOKEN"."USER_ID" IS '用户编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_REFRESH_TOKEN"."REFRESH_TOKEN" IS '刷新令牌'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_REFRESH_TOKEN"."USER_TYPE" IS '用户类型'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_REFRESH_TOKEN"."CLIENT_ID" IS '客户端编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_REFRESH_TOKEN"."SCOPES" IS '授权范围'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_REFRESH_TOKEN"."EXPIRES_TIME" IS '过期时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_REFRESH_TOKEN"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_REFRESH_TOKEN"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_REFRESH_TOKEN"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_REFRESH_TOKEN"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_REFRESH_TOKEN"."DELETED" IS '是否删除'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OAUTH2_REFRESH_TOKEN"."TENANT_ID" IS '租户编号'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."SYSTEM_OPERATE_LOG" IS '操作日志记录'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OPERATE_LOG"."ID" IS '日志主键'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OPERATE_LOG"."TRACE_ID" IS '链路追踪编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OPERATE_LOG"."USER_ID" IS '用户编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OPERATE_LOG"."USER_TYPE" IS '用户类型'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OPERATE_LOG"."MODULE" IS '模块标题'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OPERATE_LOG"."NAME" IS '操作名'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OPERATE_LOG"."TYPE" IS '操作分类'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OPERATE_LOG"."CONTENT" IS '操作内容'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OPERATE_LOG"."EXTS" IS '拓展字段'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OPERATE_LOG"."REQUEST_METHOD" IS '请求方法名'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OPERATE_LOG"."REQUEST_URL" IS '请求地址'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OPERATE_LOG"."USER_IP" IS '用户 IP'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OPERATE_LOG"."USER_AGENT" IS '浏览器 UA'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OPERATE_LOG"."JAVA_METHOD" IS 'Java 方法名'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OPERATE_LOG"."JAVA_METHOD_ARGS" IS 'Java 方法的参数'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OPERATE_LOG"."START_TIME" IS '操作时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OPERATE_LOG"."DURATION" IS '执行时长'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OPERATE_LOG"."RESULT_CODE" IS '结果码'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OPERATE_LOG"."RESULT_MSG" IS '结果提示'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OPERATE_LOG"."RESULT_DATA" IS '结果数据'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OPERATE_LOG"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OPERATE_LOG"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OPERATE_LOG"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OPERATE_LOG"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OPERATE_LOG"."DELETED" IS '是否删除'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_OPERATE_LOG"."TENANT_ID" IS '租户编号'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."SYSTEM_POST" IS '岗位信息表'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_POST"."ID" IS '岗位ID'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_POST"."CODE" IS '岗位编码'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_POST"."NAME" IS '岗位名称'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_POST"."SORT" IS '显示顺序'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_POST"."STATUS" IS '状态(0正常 1停用)'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_POST"."REMARK" IS '备注'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_POST"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_POST"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_POST"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_POST"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_POST"."DELETED" IS '是否删除'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_POST"."TENANT_ID" IS '租户编号'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."SYSTEM_ROLE" IS '角色信息表'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_ROLE"."ID" IS '角色ID'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_ROLE"."NAME" IS '角色名称'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_ROLE"."CODE" IS '角色权限字符串'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_ROLE"."SORT" IS '显示顺序'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_ROLE"."DATA_SCOPE" IS '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_ROLE"."DATA_SCOPE_DEPT_IDS" IS '数据范围(指定部门数组)'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_ROLE"."STATUS" IS '角色状态(0正常 1停用)'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_ROLE"."TYPE" IS '角色类型'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_ROLE"."REMARK" IS '备注'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_ROLE"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_ROLE"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_ROLE"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_ROLE"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_ROLE"."DELETED" IS '是否删除'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_ROLE"."TENANT_ID" IS '租户编号'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU" IS '角色和菜单关联表'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"."ID" IS '自增编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"."ROLE_ID" IS '角色ID'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"."MENU_ID" IS '菜单ID'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"."DELETED" IS '是否删除'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_ROLE_MENU"."TENANT_ID" IS '租户编号'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."SYSTEM_SENSITIVE_WORD" IS '敏感词'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SENSITIVE_WORD"."ID" IS '编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SENSITIVE_WORD"."NAME" IS '敏感词'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SENSITIVE_WORD"."DESCRIPTION" IS '描述'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SENSITIVE_WORD"."TAGS" IS '标签数组'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SENSITIVE_WORD"."STATUS" IS '状态'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SENSITIVE_WORD"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SENSITIVE_WORD"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SENSITIVE_WORD"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SENSITIVE_WORD"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SENSITIVE_WORD"."DELETED" IS '是否删除'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."SYSTEM_SMS_CHANNEL" IS '短信渠道'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_CHANNEL"."ID" IS '编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_CHANNEL"."SIGNATURE" IS '短信签名'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_CHANNEL"."CODE" IS '渠道编码'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_CHANNEL"."STATUS" IS '开启状态'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_CHANNEL"."REMARK" IS '备注'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_CHANNEL"."API_KEY" IS '短信 API 的账号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_CHANNEL"."API_SECRET" IS '短信 API 的秘钥'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_CHANNEL"."CALLBACK_URL" IS '短信发送回调 URL'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_CHANNEL"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_CHANNEL"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_CHANNEL"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_CHANNEL"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_CHANNEL"."DELETED" IS '是否删除'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."SYSTEM_SMS_CODE" IS '手机验证码'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_CODE"."ID" IS '编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_CODE"."MOBILE" IS '手机号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_CODE"."CODE" IS '验证码'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_CODE"."CREATE_IP" IS '创建 IP'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_CODE"."SCENE" IS '发送场景'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_CODE"."TODAY_INDEX" IS '今日发送的第几条'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_CODE"."USED" IS '是否使用'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_CODE"."USED_TIME" IS '使用时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_CODE"."USED_IP" IS '使用 IP'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_CODE"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_CODE"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_CODE"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_CODE"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_CODE"."DELETED" IS '是否删除'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_CODE"."TENANT_ID" IS '租户编号'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."SYSTEM_SMS_LOG" IS '短信日志'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_LOG"."ID" IS '编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_LOG"."CHANNEL_ID" IS '短信渠道编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_LOG"."CHANNEL_CODE" IS '短信渠道编码'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_LOG"."TEMPLATE_ID" IS '模板编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_LOG"."TEMPLATE_CODE" IS '模板编码'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_LOG"."TEMPLATE_TYPE" IS '短信类型'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_LOG"."TEMPLATE_CONTENT" IS '短信内容'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_LOG"."TEMPLATE_PARAMS" IS '短信参数'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_LOG"."API_TEMPLATE_ID" IS '短信 API 的模板编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_LOG"."MOBILE" IS '手机号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_LOG"."USER_ID" IS '用户编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_LOG"."USER_TYPE" IS '用户类型'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_LOG"."SEND_STATUS" IS '发送状态'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_LOG"."SEND_TIME" IS '发送时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_LOG"."SEND_CODE" IS '发送结果的编码'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_LOG"."SEND_MSG" IS '发送结果的提示'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_LOG"."API_SEND_CODE" IS '短信 API 发送结果的编码'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_LOG"."API_SEND_MSG" IS '短信 API 发送失败的提示'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_LOG"."API_REQUEST_ID" IS '短信 API 发送返回的唯一请求 ID'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_LOG"."API_SERIAL_NO" IS '短信 API 发送返回的序号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_LOG"."RECEIVE_STATUS" IS '接收状态'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_LOG"."RECEIVE_TIME" IS '接收时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_LOG"."API_RECEIVE_CODE" IS 'API 接收结果的编码'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_LOG"."API_RECEIVE_MSG" IS 'API 接收结果的说明'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_LOG"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_LOG"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_LOG"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_LOG"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_LOG"."DELETED" IS '是否删除'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."SYSTEM_SMS_TEMPLATE" IS '短信模板'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_TEMPLATE"."ID" IS '编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_TEMPLATE"."TYPE" IS '短信签名'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_TEMPLATE"."STATUS" IS '开启状态'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_TEMPLATE"."CODE" IS '模板编码'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_TEMPLATE"."NAME" IS '模板名称'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_TEMPLATE"."CONTENT" IS '模板内容'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_TEMPLATE"."PARAMS" IS '参数数组'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_TEMPLATE"."REMARK" IS '备注'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_TEMPLATE"."API_TEMPLATE_ID" IS '短信 API 的模板编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_TEMPLATE"."CHANNEL_ID" IS '短信渠道编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_TEMPLATE"."CHANNEL_CODE" IS '短信渠道编码'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_TEMPLATE"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_TEMPLATE"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_TEMPLATE"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_TEMPLATE"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SMS_TEMPLATE"."DELETED" IS '是否删除'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."SYSTEM_SOCIAL_USER" IS '社交用户表'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SOCIAL_USER"."ID" IS '主键(自增策略)'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SOCIAL_USER"."TYPE" IS '社交平台的类型'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SOCIAL_USER"."OPENID" IS '社交 openid'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SOCIAL_USER"."TOKEN" IS '社交 token'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SOCIAL_USER"."RAW_TOKEN_INFO" IS '原始 Token 数据,一般是 JSON 格式'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SOCIAL_USER"."NICKNAME" IS '用户昵称'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SOCIAL_USER"."AVATAR" IS '用户头像'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SOCIAL_USER"."RAW_USER_INFO" IS '原始用户数据,一般是 JSON 格式'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SOCIAL_USER"."CODE" IS '最后一次的认证 code'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SOCIAL_USER"."STATE" IS '最后一次的认证 state'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SOCIAL_USER"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SOCIAL_USER"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SOCIAL_USER"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SOCIAL_USER"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SOCIAL_USER"."DELETED" IS '是否删除'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SOCIAL_USER"."TENANT_ID" IS '租户编号'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."SYSTEM_SOCIAL_USER_BIND" IS '社交绑定表'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SOCIAL_USER_BIND"."ID" IS '主键(自增策略)'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SOCIAL_USER_BIND"."USER_ID" IS '用户编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SOCIAL_USER_BIND"."USER_TYPE" IS '用户类型'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SOCIAL_USER_BIND"."SOCIAL_TYPE" IS '社交平台的类型'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SOCIAL_USER_BIND"."SOCIAL_USER_ID" IS '社交用户的编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SOCIAL_USER_BIND"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SOCIAL_USER_BIND"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SOCIAL_USER_BIND"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SOCIAL_USER_BIND"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SOCIAL_USER_BIND"."DELETED" IS '是否删除'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_SOCIAL_USER_BIND"."TENANT_ID" IS '租户编号'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."SYSTEM_TENANT" IS '租户表'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_TENANT"."ID" IS '租户编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_TENANT"."NAME" IS '租户名'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_TENANT"."CONTACT_USER_ID" IS '联系人的用户编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_TENANT"."CONTACT_NAME" IS '联系人'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_TENANT"."CONTACT_MOBILE" IS '联系手机'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_TENANT"."STATUS" IS '租户状态(0正常 1停用)'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_TENANT"."DOMAIN" IS '绑定域名'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_TENANT"."PACKAGE_ID" IS '租户套餐编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_TENANT"."EXPIRE_TIME" IS '过期时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_TENANT"."ACCOUNT_COUNT" IS '账号数量'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_TENANT"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_TENANT"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_TENANT"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_TENANT"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_TENANT"."DELETED" IS '是否删除'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."SYSTEM_TENANT_PACKAGE" IS '租户套餐表'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_TENANT_PACKAGE"."ID" IS '套餐编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_TENANT_PACKAGE"."NAME" IS '套餐名'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_TENANT_PACKAGE"."STATUS" IS '租户状态(0正常 1停用)'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_TENANT_PACKAGE"."REMARK" IS '备注'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_TENANT_PACKAGE"."MENU_IDS" IS '关联的菜单编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_TENANT_PACKAGE"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_TENANT_PACKAGE"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_TENANT_PACKAGE"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_TENANT_PACKAGE"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_TENANT_PACKAGE"."DELETED" IS '是否删除'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."SYSTEM_USERS" IS '用户信息表'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_USERS"."ID" IS '用户ID'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_USERS"."USERNAME" IS '用户账号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_USERS"."PASSWORD" IS '密码'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_USERS"."NICKNAME" IS '用户昵称'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_USERS"."REMARK" IS '备注'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_USERS"."DEPT_ID" IS '部门ID'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_USERS"."POST_IDS" IS '岗位编号数组'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_USERS"."EMAIL" IS '用户邮箱'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_USERS"."MOBILE" IS '手机号码'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_USERS"."SEX" IS '用户性别'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_USERS"."AVATAR" IS '头像地址'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_USERS"."STATUS" IS '帐号状态(0正常 1停用)'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_USERS"."LOGIN_IP" IS '最后登录IP'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_USERS"."LOGIN_DATE" IS '最后登录时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_USERS"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_USERS"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_USERS"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_USERS"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_USERS"."DELETED" IS '是否删除'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_USERS"."TENANT_ID" IS '租户编号'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."SYSTEM_USER_POST" IS '用户岗位表'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_USER_POST"."ID" IS 'id'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_USER_POST"."USER_ID" IS '用户ID'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_USER_POST"."POST_ID" IS '岗位ID'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_USER_POST"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_USER_POST"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_USER_POST"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_USER_POST"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_USER_POST"."DELETED" IS '是否删除'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_USER_POST"."TENANT_ID" IS '租户编号'; + +COMMENT ON TABLE "RUOYI_VUE_PRO"."SYSTEM_USER_ROLE" IS '用户和角色关联表'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_USER_ROLE"."ID" IS '自增编号'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_USER_ROLE"."USER_ID" IS '用户ID'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_USER_ROLE"."ROLE_ID" IS '角色ID'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_USER_ROLE"."CREATOR" IS '创建者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_USER_ROLE"."CREATE_TIME" IS '创建时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_USER_ROLE"."UPDATER" IS '更新者'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_USER_ROLE"."UPDATE_TIME" IS '更新时间'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_USER_ROLE"."DELETED" IS '是否删除'; + +COMMENT ON COLUMN "RUOYI_VUE_PRO"."SYSTEM_USER_ROLE"."TENANT_ID" IS '租户编号'; + diff --git a/sql/mysql/brokerage.sql b/sql/mysql/brokerage.sql new file mode 100644 index 0000000..a84d800 --- /dev/null +++ b/sql/mysql/brokerage.sql @@ -0,0 +1,221 @@ +-- 增加配置表 +create table trade_config +( + id bigint auto_increment comment '自增主键' primary key, + brokerage_enabled bit default 1 not null comment '是否启用分佣', + brokerage_enabled_condition tinyint default 0 not null comment '分佣模式:1-人人分销 2-指定分销', + brokerage_bind_mode tinyint default 0 not null comment '分销关系绑定模式: 1-没有推广人,2-新用户, 3-扫码覆盖', + brokerage_post_urls varchar(2000) default '' null comment '分销海报图地址数组', + brokerage_first_percent int default 0 not null comment '一级返佣比例', + brokerage_second_percent int default 0 not null comment '二级返佣比例', + brokerage_withdraw_min_price int default 0 not null comment '用户提现最低金额', + brokerage_bank_names varchar(200) default '' not null comment '提现银行(字典类型=brokerage_bank_name)', + brokerage_frozen_days int default 7 not null comment '佣金冻结时间(天)', + brokerage_withdraw_type varchar(32) default '1,2,3,4' not null comment '提现方式:1-钱包;2-银行卡;3-微信;4-支付宝', + creator varchar(64) collate utf8mb4_unicode_ci default '' null comment '创建者', + create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间', + updater varchar(64) collate utf8mb4_unicode_ci default '' null comment '更新者', + update_time datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间', + deleted bit default b'0' not null comment '是否删除', + tenant_id bigint default 0 not null comment '租户编号' +) comment '交易中心配置'; + +-- 增加分销用户扩展表 +create table trade_brokerage_user +( + id bigint auto_increment comment '用户编号' primary key, + bind_user_id bigint null comment '推广员编号', + bind_user_time datetime null comment '推广员绑定时间', + brokerage_enabled bit default 1 not null comment '是否成为推广员', + brokerage_time datetime null comment '成为分销员时间', + price int default 0 not null comment '可用佣金', + frozen_price int default 0 not null comment '冻结佣金', + creator varchar(64) collate utf8mb4_unicode_ci default '' null comment '创建者', + create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间', + updater varchar(64) collate utf8mb4_unicode_ci default '' null comment '更新者', + update_time datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间', + deleted bit default b'0' not null comment '是否删除', + tenant_id bigint default 0 not null comment '租户编号' +) comment '分销用户'; + +create index idx_invite_user_id on trade_brokerage_user (bind_user_id) comment '推广员编号'; +create index idx_agent on trade_brokerage_user (brokerage_enabled) comment '是否成为推广员'; + + +create table trade_brokerage_record +( + id int auto_increment comment '编号' + primary key, + user_id bigint not null comment '用户编号', + biz_id varchar(64) default '' not null comment '业务编号', + biz_type tinyint default 0 not null comment '业务类型:0-订单,1-提现', + title varchar(64) default '' not null comment '标题', + price int default 0 not null comment '金额', + total_price int default 0 not null comment '当前总佣金', + description varchar(500) default '' not null comment '说明', + status tinyint default 0 not null comment '状态:0-待结算,1-已结算,2-已取消', + frozen_days int default 0 not null comment '冻结时间(天)', + unfreeze_time datetime null comment '解冻时间', + creator varchar(64) collate utf8mb4_general_ci default '' null comment '创建者', + create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间', + updater varchar(64) collate utf8mb4_general_ci default '' null comment '更新者', + update_time datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间', + deleted bit default b'0' not null comment '是否删除', + tenant_id bigint default 0 not null comment '租户编号' +) + comment '佣金记录'; + +create index idx_user_id on trade_brokerage_record (user_id) comment '用户编号'; +create index idx_biz on trade_brokerage_record (biz_type, biz_id) comment '业务'; +create index idx_status on trade_brokerage_record (status) comment '状态'; + + +create table trade_brokerage_withdraw +( + id int auto_increment comment '编号' + primary key, + user_id bigint not null comment '用户编号', + price int default 0 not null comment '提现金额', + fee_price int default 0 not null comment '提现手续费', + total_price int default 0 not null comment '当前总佣金', + type tinyint default 0 not null comment '提现类型:1-钱包;2-银行卡;3-微信;4-支付宝', + name varchar(64) null comment '真实姓名', + account_no varchar(64) null comment '账号', + bank_name varchar(100) null comment '银行名称', + bank_address varchar(200) null comment '开户地址', + account_qr_code_url varchar(512) null comment '收款码', + status tinyint(2) default 0 not null comment '状态:0-审核中,10-审核通过 20-审核不通过;预留:11 - 提现成功;21-提现失败', + audit_reason varchar(128) null comment '审核驳回原因', + audit_time datetime null comment '审核时间', + remark varchar(500) null comment '备注', + creator varchar(64) collate utf8mb4_general_ci default '' null comment '创建者', + create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间', + updater varchar(64) collate utf8mb4_general_ci default '' null comment '更新者', + update_time datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间', + deleted bit default b'0' not null comment '是否删除', + tenant_id bigint default 0 not null comment '租户编号' +) + comment '佣金提现'; + +create index idx_user_id on trade_brokerage_withdraw (user_id) comment '用户编号'; +create index idx_audit_status on trade_brokerage_withdraw (status) comment '状态'; + +-- 增加字典 +insert into system_dict_type(type, name) +values ('brokerage_enabled_condition', '分佣模式'); +insert into system_dict_data(dict_type, label, value, sort, remark) +values ('brokerage_enabled_condition', '人人分销', 1, 1, '所有用户都可以分销'), + ('brokerage_enabled_condition', '指定分销', 2, 2, '仅可后台手动设置推广员'); + +insert into system_dict_type(type, name) +values ('brokerage_bind_mode', '分销关系绑定模式'); +insert into system_dict_data(dict_type, label, value, sort, remark) +values ('brokerage_bind_mode', '没有推广人', 1, 1, '只要用户没有推广人,随时都可以绑定推广关系'), + ('brokerage_bind_mode', '新用户', 2, 2, '仅新用户注册时才能绑定推广关系'), + ('brokerage_bind_mode', '扫码覆盖', 3, 3, '如果用户已经有推广人,推广人会被变更'); + +insert into system_dict_type(type, name) +values ('brokerage_withdraw_type', '佣金提现类型'); +insert into system_dict_data(dict_type, label, value, sort) +values ('brokerage_withdraw_type', '钱包', 1, 1), + ('brokerage_withdraw_type', '银行卡', 2, 2), + ('brokerage_withdraw_type', '微信', 3, 3), + ('brokerage_withdraw_type', '支付宝', 4, 4); + +insert into system_dict_type(type, name) +values ('brokerage_record_biz_type', '佣金记录业务类型'); +insert into system_dict_data(dict_type, label, value, sort) +values ('brokerage_record_biz_type', '订单返佣', 1, 1), + ('brokerage_record_biz_type', '申请提现', 2, 2); + +insert into system_dict_type(type, name) +values ('brokerage_record_status', '佣金记录状态'); +insert into system_dict_data(dict_type, label, value, sort) +values ('brokerage_record_status', '待结算', 0, 0), + ('brokerage_record_status', '已结算', 1, 1), + ('brokerage_record_status', '已取消', 2, 2); + +insert into system_dict_type(type, name) +values ('brokerage_withdraw_status', '佣金提现状态'); +insert into system_dict_data(dict_type, label, value, sort) +values ('brokerage_withdraw_status', '审核中', 0, 0), + ('brokerage_withdraw_status', '审核通过', 10, 10), + ('brokerage_withdraw_status', '提现成功', 11, 11), + ('brokerage_withdraw_status', '审核不通过', 20, 20), + ('brokerage_withdraw_status', '提现失败', 21, 21); + +insert into system_dict_type(type, name) +values ('brokerage_bank_name', '佣金提现银行'); +insert into system_dict_data(dict_type, label, value, sort) +values ('brokerage_bank_name', '工商银行', 0, 0), + ('brokerage_bank_name', '建设银行', 1, 1), + ('brokerage_bank_name', '农业银行', 2, 2), + ('brokerage_bank_name', '中国银行', 3, 3), + ('brokerage_bank_name', '交通银行', 4, 4), + ('brokerage_bank_name', '招商银行', 5, 5); + + +-- 交易中心配置:菜单 SQL +INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status, component_name) +VALUES ('交易中心配置', '', 2, 0, 2072, 'config', 'ep:setting', 'trade/config/index', 0, 'TradeConfig'); +-- 按钮父菜单ID +-- 暂时只支持 MySQL。如果你是 Oracle、PostgreSQL、SQLServer 的话,需要手动修改 @parentId 的部分的代码 +SELECT @parentId := LAST_INSERT_ID(); +-- 按钮 SQL +INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status) +VALUES ('交易中心配置查询', 'trade:config:query', 3, 1, @parentId, '', '', '', 0); +INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status) +VALUES ('交易中心配置保存', 'trade:config:save', 3, 2, @parentId, '', '', '', 0); + + +-- 增加菜单:分销 +INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status, component_name) +VALUES ('分销', '', 1, 5, 2072, 'brokerage', 'fa-solid:project-diagram', '', 0, ''); +-- 按钮父菜单ID +SELECT @brokerageMenuId := LAST_INSERT_ID(); + +-- 增加菜单:分销员 +-- 菜单 SQL +INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status, component_name) +VALUES ('分销用户', '', 2, 0, @brokerageMenuId, 'brokerage-user', 'fa-solid:user-tie', 'trade/brokerage/user/index', 0, + 'TradeBrokerageUser'); +-- 按钮父菜单ID +-- 暂时只支持 MySQL。如果你是 Oracle、PostgreSQL、SQLServer 的话,需要手动修改 @parentId 的部分的代码 +SELECT @parentId := LAST_INSERT_ID(); +-- 按钮 SQL +INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status) +VALUES ('分销用户查询', 'trade:brokerage-user:query', 3, 1, @parentId, '', '', '', 0); +INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status) +VALUES ('分销用户推广人查询', 'trade:brokerage-user:user-query', 3, 2, @parentId, '', '', '', 0); +INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status) +VALUES ('分销用户推广订单查询', 'trade:brokerage-user:order-query', 3, 3, @parentId, '', '', '', 0); +INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status) +VALUES ('分销用户修改推广资格', 'trade:brokerage-user:update-brokerage-enable', 3, 4, @parentId, '', '', '', 0); +INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status) +VALUES ('分销用户修改推广员', 'trade:brokerage-user:update-brokerage-user', 3, 5, @parentId, '', '', '', 0); +INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status) +VALUES ('分销用户清除推广员', 'trade:brokerage-user:clear-brokerage-user', 3, 6, @parentId, '', '', '', 0); + +-- 增加菜单:佣金记录 +INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status, component_name) +VALUES ('佣金记录', '', 2, 1, @brokerageMenuId, 'brokerage-record', 'fa:money', 'trade/brokerage/record/index', 0, + 'TradeBrokerageRecord'); +-- 按钮父菜单ID +-- 暂时只支持 MySQL。如果你是 Oracle、PostgreSQL、SQLServer 的话,需要手动修改 @parentId 的部分的代码 +SELECT @parentId := LAST_INSERT_ID(); +-- 按钮 SQL +INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status) +VALUES ('佣金记录查询', 'trade:brokerage-record:query', 3, 1, @parentId, '', '', '', 0); + +-- 增加菜单:佣金提现 +INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status, component_name) +VALUES ('佣金提现', '', 2, 2, @brokerageMenuId, 'brokerage-withdraw', 'fa:credit-card', + 'trade/brokerage/withdraw/index', 0, 'TradeBrokerageWithdraw'); +-- 按钮父菜单ID +-- 暂时只支持 MySQL。如果你是 Oracle、PostgreSQL、SQLServer 的话,需要手动修改 @parentId 的部分的代码 +SELECT @parentId := LAST_INSERT_ID(); +-- 按钮 SQL +INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status) +VALUES ('佣金提现查询', 'trade:brokerage-withdraw:query', 3, 1, @parentId, '', '', '', 0); +INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status) +VALUES ('佣金提现审核', 'trade:brokerage-withdraw:audit', 3, 2, @parentId, '', '', '', 0); \ No newline at end of file diff --git a/sql/mysql/go-view.sql b/sql/mysql/go-view.sql new file mode 100644 index 0000000..210cff3 --- /dev/null +++ b/sql/mysql/go-view.sql @@ -0,0 +1,47 @@ +/* + Navicat Premium Data Transfer + + Source Server : 127.0.0.1 MySQL + Source Server Type : MySQL + Source Server Version : 80026 + Source Host : localhost:3306 + Source Schema : ruoyi-vue-pro + + Target Server Type : MySQL + Target Server Version : 80026 + File Encoding : 65001 + + Date: 07/02/2023 22:00:03 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for report_go_view_project +-- ---------------------------- +DROP TABLE IF EXISTS `report_go_view_project`; +CREATE TABLE `report_go_view_project` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '项目名称', + `pic_url` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '预览图片 URL', + `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '报表内容', + `status` tinyint NOT NULL COMMENT '发布状态', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '项目备注', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 9 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'GoView 项目表'; + +-- ---------------------------- +-- Records of report_go_view_project +-- ---------------------------- +BEGIN; +INSERT INTO `report_go_view_project` (`id`, `name`, `pic_url`, `content`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (6, 'HTTP示例', 'http://test.yudao.iocoder.cn/7c0cb26b09cfa97cae0b3e5d19b210978eed0ab184dd0bff1b66b3daf70a01fc.png', '{\n \"editCanvasConfig\": {\n \"projectName\": \"HTTP示例\",\n \"width\": 1920,\n \"height\": 1080,\n \"filterShow\": false,\n \"hueRotate\": 0,\n \"saturate\": 1,\n \"contrast\": 1,\n \"brightness\": 1,\n \"opacity\": 1,\n \"rotateZ\": 0,\n \"rotateX\": 0,\n \"rotateY\": 0,\n \"skewX\": 0,\n \"skewY\": 0,\n \"blendMode\": \"normal\",\n \"background\": null,\n \"backgroundImage\": null,\n \"selectColor\": true,\n \"chartThemeColor\": \"dark\",\n \"chartThemeSetting\": {\n \"title\": {\n \"show\": true,\n \"textStyle\": {\n \"color\": \"#BFBFBF\",\n \"fontSize\": 18\n },\n \"subtextStyle\": {\n \"color\": \"#A2A2A2\",\n \"fontSize\": 14\n }\n },\n \"xAxis\": {\n \"show\": true,\n \"name\": \"\",\n \"nameGap\": 15,\n \"nameTextStyle\": {\n \"color\": \"#B9B8CE\",\n \"fontSize\": 12\n },\n \"inverse\": false,\n \"axisLabel\": {\n \"show\": true,\n \"fontSize\": 12,\n \"color\": \"#B9B8CE\",\n \"rotate\": 0\n },\n \"position\": \"bottom\",\n \"axisLine\": {\n \"show\": true,\n \"lineStyle\": {\n \"color\": \"#B9B8CE\",\n \"width\": 1\n },\n \"onZero\": true\n },\n \"axisTick\": {\n \"show\": true,\n \"length\": 5\n },\n \"splitLine\": {\n \"show\": false,\n \"lineStyle\": {\n \"color\": \"#484753\",\n \"width\": 1,\n \"type\": \"solid\"\n }\n }\n },\n \"yAxis\": {\n \"show\": true,\n \"name\": \"\",\n \"nameGap\": 15,\n \"nameTextStyle\": {\n \"color\": \"#B9B8CE\",\n \"fontSize\": 12\n },\n \"inverse\": false,\n \"axisLabel\": {\n \"show\": true,\n \"fontSize\": 12,\n \"color\": \"#B9B8CE\",\n \"rotate\": 0\n },\n \"position\": \"left\",\n \"axisLine\": {\n \"show\": true,\n \"lineStyle\": {\n \"color\": \"#B9B8CE\",\n \"width\": 1\n },\n \"onZero\": true\n },\n \"axisTick\": {\n \"show\": true,\n \"length\": 5\n },\n \"splitLine\": {\n \"show\": true,\n \"lineStyle\": {\n \"color\": \"#484753\",\n \"width\": 1,\n \"type\": \"solid\"\n }\n }\n },\n \"legend\": {\n \"show\": true,\n \"top\": \"5%\",\n \"textStyle\": {\n \"color\": \"#B9B8CE\"\n }\n },\n \"grid\": {\n \"show\": false,\n \"left\": \"10%\",\n \"top\": \"60\",\n \"right\": \"10%\",\n \"bottom\": \"60\"\n },\n \"dataset\": null\n },\n \"previewScaleType\": \"fit\"\n },\n \"componentList\": [\n {\n \"id\": \"4vxgys8nh6g000\",\n \"isGroup\": false,\n \"attr\": {\n \"x\": 7,\n \"y\": 11,\n \"w\": 1898,\n \"h\": 1066,\n \"offsetX\": 0,\n \"offsetY\": 0,\n \"zIndex\": -1\n },\n \"styles\": {\n \"filterShow\": false,\n \"hueRotate\": 0,\n \"saturate\": 1,\n \"contrast\": 1,\n \"brightness\": 1,\n \"opacity\": 1,\n \"rotateZ\": 0,\n \"rotateX\": 0,\n \"rotateY\": 0,\n \"skewX\": 0,\n \"skewY\": 0,\n \"blendMode\": \"normal\",\n \"animations\": []\n },\n \"status\": {\n \"lock\": false,\n \"hide\": false\n },\n \"request\": {\n \"requestDataType\": 1,\n \"requestHttpType\": \"get\",\n \"requestUrl\": \"http://127.0.0.1:48080/admin-api/report/go-view/data/get-by-http\",\n \"requestInterval\": null,\n \"requestIntervalUnit\": \"second\",\n \"requestContentType\": 0,\n \"requestParamsBodyType\": \"none\",\n \"requestSQLContent\": {\n \"sql\": \"select * from where\"\n },\n \"requestParams\": {\n \"Body\": {\n \"form-data\": {},\n \"x-www-form-urlencoded\": {},\n \"json\": \"\",\n \"xml\": \"\"\n },\n \"Header\": {},\n \"Params\": {}\n }\n },\n \"filter\": null,\n \"events\": {\n \"baseEvent\": {\n \"click\": null,\n \"dblclick\": null,\n \"mouseenter\": null,\n \"mouseleave\": null\n },\n \"advancedEvents\": {\n \"vnodeMounted\": null,\n \"vnodeBeforeMount\": null\n }\n },\n \"key\": \"LineCommon\",\n \"chartConfig\": {\n \"key\": \"LineCommon\",\n \"chartKey\": \"VLineCommon\",\n \"conKey\": \"VCLineCommon\",\n \"title\": \"折线图\",\n \"category\": \"Lines\",\n \"categoryName\": \"折线图\",\n \"package\": \"Charts\",\n \"chartFrame\": \"echarts\",\n \"image\": \"line.png\"\n },\n \"option\": {\n \"legend\": {\n \"show\": true,\n \"top\": \"5%\",\n \"textStyle\": {\n \"color\": \"#B9B8CE\"\n }\n },\n \"xAxis\": {\n \"show\": true,\n \"name\": \"\",\n \"nameGap\": 15,\n \"nameTextStyle\": {\n \"color\": \"#B9B8CE\",\n \"fontSize\": 12\n },\n \"inverse\": false,\n \"axisLabel\": {\n \"show\": true,\n \"fontSize\": 12,\n \"color\": \"#B9B8CE\",\n \"rotate\": 0\n },\n \"position\": \"bottom\",\n \"axisLine\": {\n \"show\": true,\n \"lineStyle\": {\n \"color\": \"#B9B8CE\",\n \"width\": 1\n },\n \"onZero\": true\n },\n \"axisTick\": {\n \"show\": true,\n \"length\": 5\n },\n \"splitLine\": {\n \"show\": false,\n \"lineStyle\": {\n \"color\": \"#484753\",\n \"width\": 1,\n \"type\": \"solid\"\n }\n },\n \"type\": \"category\"\n },\n \"yAxis\": {\n \"show\": true,\n \"name\": \"\",\n \"nameGap\": 15,\n \"nameTextStyle\": {\n \"color\": \"#B9B8CE\",\n \"fontSize\": 12\n },\n \"inverse\": false,\n \"axisLabel\": {\n \"show\": true,\n \"fontSize\": 12,\n \"color\": \"#B9B8CE\",\n \"rotate\": 0\n },\n \"position\": \"left\",\n \"axisLine\": {\n \"show\": true,\n \"lineStyle\": {\n \"color\": \"#B9B8CE\",\n \"width\": 1\n },\n \"onZero\": true\n },\n \"axisTick\": {\n \"show\": true,\n \"length\": 5\n },\n \"splitLine\": {\n \"show\": true,\n \"lineStyle\": {\n \"color\": \"#484753\",\n \"width\": 1,\n \"type\": \"solid\"\n }\n },\n \"type\": \"value\"\n },\n \"grid\": {\n \"show\": false,\n \"left\": \"10%\",\n \"top\": \"60\",\n \"right\": \"10%\",\n \"bottom\": \"60\"\n },\n \"tooltip\": {\n \"show\": true,\n \"trigger\": \"axis\",\n \"axisPointer\": {\n \"type\": \"line\"\n }\n },\n \"dataset\": {\n \"dimensions\": [\n \"日期\",\n \"PV\",\n \"UV\"\n ],\n \"source\": [\n {\n \"UV\": 518,\n \"日期\": \"2021-01\",\n \"PV\": 7954\n },\n {\n \"UV\": 135,\n \"日期\": \"2021-02\",\n \"PV\": 9402\n },\n {\n \"UV\": 905,\n \"日期\": \"2021-03\",\n \"PV\": 1665\n },\n {\n \"UV\": 157,\n \"日期\": \"2021-04\",\n \"PV\": 2633\n },\n {\n \"UV\": 849,\n \"日期\": \"2021-05\",\n \"PV\": 7650\n },\n {\n \"UV\": 563,\n \"日期\": \"2021-06\",\n \"PV\": 2399\n },\n {\n \"UV\": 427,\n \"日期\": \"2021-07\",\n \"PV\": 9952\n },\n {\n \"UV\": 158,\n \"日期\": \"2021-08\",\n \"PV\": 9232\n },\n {\n \"UV\": 894,\n \"日期\": \"2021-09\",\n \"PV\": 3013\n },\n {\n \"UV\": 343,\n \"日期\": \"2021-10\",\n \"PV\": 6181\n },\n {\n \"UV\": 294,\n \"日期\": \"2021-11\",\n \"PV\": 8949\n },\n {\n \"UV\": 452,\n \"日期\": \"2021-12\",\n \"PV\": 8730\n }\n ]\n },\n \"series\": [\n {\n \"type\": \"line\",\n \"label\": {\n \"show\": true,\n \"position\": \"top\",\n \"color\": \"#fff\",\n \"fontSize\": 12\n },\n \"symbolSize\": 5,\n \"itemStyle\": {\n \"color\": null,\n \"borderRadius\": 0\n },\n \"lineStyle\": {\n \"type\": \"solid\",\n \"width\": 3,\n \"color\": null\n }\n },\n {\n \"type\": \"line\",\n \"label\": {\n \"show\": true,\n \"position\": \"top\",\n \"color\": \"#fff\",\n \"fontSize\": 12\n },\n \"symbolSize\": 5,\n \"itemStyle\": {\n \"color\": null,\n \"borderRadius\": 0\n },\n \"lineStyle\": {\n \"type\": \"solid\",\n \"width\": 3,\n \"color\": null\n }\n }\n ],\n \"backgroundColor\": \"rgba(0,0,0,0)\"\n }\n }\n ],\n \"requestGlobalConfig\": {\n \"requestDataPond\": [],\n \"requestOriginUrl\": \"\",\n \"requestInterval\": 30,\n \"requestIntervalUnit\": \"second\",\n \"requestParams\": {\n \"Body\": {\n \"form-data\": {},\n \"x-www-form-urlencoded\": {},\n \"json\": \"\",\n \"xml\": \"\"\n },\n \"Header\": {},\n \"Params\": {}\n }\n }\n}', 0, NULL, '1', '2023-02-07 11:38:22', '1', '2023-02-07 17:27:43', b'0', 1), (7, 'SQL示例', 'http://test.yudao.iocoder.cn/c1f570bad6ec7e7fa4a0a7c8f563da4ea158fde6e731da4dd1abe8ba9b6baeed.png', '{\n \"editCanvasConfig\": {\n \"projectName\": \"SQL示例\",\n \"width\": 1920,\n \"height\": 1080,\n \"filterShow\": false,\n \"hueRotate\": 0,\n \"saturate\": 1,\n \"contrast\": 1,\n \"brightness\": 1,\n \"opacity\": 1,\n \"rotateZ\": 0,\n \"rotateX\": 0,\n \"rotateY\": 0,\n \"skewX\": 0,\n \"skewY\": 0,\n \"blendMode\": \"normal\",\n \"background\": null,\n \"backgroundImage\": null,\n \"selectColor\": true,\n \"chartThemeColor\": \"dark\",\n \"chartThemeSetting\": {\n \"title\": {\n \"show\": true,\n \"textStyle\": {\n \"color\": \"#BFBFBF\",\n \"fontSize\": 18\n },\n \"subtextStyle\": {\n \"color\": \"#A2A2A2\",\n \"fontSize\": 14\n }\n },\n \"xAxis\": {\n \"show\": true,\n \"name\": \"\",\n \"nameGap\": 15,\n \"nameTextStyle\": {\n \"color\": \"#B9B8CE\",\n \"fontSize\": 12\n },\n \"inverse\": false,\n \"axisLabel\": {\n \"show\": true,\n \"fontSize\": 12,\n \"color\": \"#B9B8CE\",\n \"rotate\": 0\n },\n \"position\": \"bottom\",\n \"axisLine\": {\n \"show\": true,\n \"lineStyle\": {\n \"color\": \"#B9B8CE\",\n \"width\": 1\n },\n \"onZero\": true\n },\n \"axisTick\": {\n \"show\": true,\n \"length\": 5\n },\n \"splitLine\": {\n \"show\": false,\n \"lineStyle\": {\n \"color\": \"#484753\",\n \"width\": 1,\n \"type\": \"solid\"\n }\n }\n },\n \"yAxis\": {\n \"show\": true,\n \"name\": \"\",\n \"nameGap\": 15,\n \"nameTextStyle\": {\n \"color\": \"#B9B8CE\",\n \"fontSize\": 12\n },\n \"inverse\": false,\n \"axisLabel\": {\n \"show\": true,\n \"fontSize\": 12,\n \"color\": \"#B9B8CE\",\n \"rotate\": 0\n },\n \"position\": \"left\",\n \"axisLine\": {\n \"show\": true,\n \"lineStyle\": {\n \"color\": \"#B9B8CE\",\n \"width\": 1\n },\n \"onZero\": true\n },\n \"axisTick\": {\n \"show\": true,\n \"length\": 5\n },\n \"splitLine\": {\n \"show\": true,\n \"lineStyle\": {\n \"color\": \"#484753\",\n \"width\": 1,\n \"type\": \"solid\"\n }\n }\n },\n \"legend\": {\n \"show\": true,\n \"top\": \"5%\",\n \"textStyle\": {\n \"color\": \"#B9B8CE\"\n }\n },\n \"grid\": {\n \"show\": false,\n \"left\": \"10%\",\n \"top\": \"60\",\n \"right\": \"10%\",\n \"bottom\": \"60\"\n },\n \"dataset\": null\n },\n \"previewScaleType\": \"fit\"\n },\n \"componentList\": [\n {\n \"id\": \"5cqrghfle9g000\",\n \"isGroup\": false,\n \"attr\": {\n \"x\": 27,\n \"y\": 3,\n \"w\": 1870,\n \"h\": 1051,\n \"offsetX\": 0,\n \"offsetY\": 0,\n \"zIndex\": -1\n },\n \"styles\": {\n \"filterShow\": false,\n \"hueRotate\": 0,\n \"saturate\": 1,\n \"contrast\": 1,\n \"brightness\": 1,\n \"opacity\": 1,\n \"rotateZ\": 0,\n \"rotateX\": 0,\n \"rotateY\": 0,\n \"skewX\": 0,\n \"skewY\": 0,\n \"blendMode\": \"normal\",\n \"animations\": [\n \"headShake\"\n ]\n },\n \"status\": {\n \"lock\": false,\n \"hide\": false\n },\n \"request\": {\n \"requestDataType\": 1,\n \"requestHttpType\": \"post\",\n \"requestUrl\": \"http://127.0.0.1:48080/admin-api/report/go-view/data/get-by-sql\",\n \"requestInterval\": null,\n \"requestIntervalUnit\": \"second\",\n \"requestContentType\": 0,\n \"requestParamsBodyType\": \"none\",\n \"requestSQLContent\": {\n \"sql\": \"SELECT DATE_FORMAT(create_time, \\\"%Y-%m\\\") AS time, COUNT(*) AS \'次数\', COUNT(DISTINCT(user_id)) AS \'人数\' FROM system_login_log GROUP BY DATE_FORMAT(create_time, \\\"%Y-%m\\\")\"\n },\n \"requestParams\": {\n \"Body\": {\n \"form-data\": {},\n \"x-www-form-urlencoded\": {},\n \"json\": \"\",\n \"xml\": \"\"\n },\n \"Header\": {},\n \"Params\": {}\n }\n },\n \"filter\": null,\n \"events\": {\n \"baseEvent\": {\n \"click\": null,\n \"dblclick\": null,\n \"mouseenter\": null,\n \"mouseleave\": null\n },\n \"advancedEvents\": {\n \"vnodeMounted\": null,\n \"vnodeBeforeMount\": null\n }\n },\n \"key\": \"LineCommon\",\n \"chartConfig\": {\n \"key\": \"LineCommon\",\n \"chartKey\": \"VLineCommon\",\n \"conKey\": \"VCLineCommon\",\n \"title\": \"折线图\",\n \"category\": \"Lines\",\n \"categoryName\": \"折线图\",\n \"package\": \"Charts\",\n \"chartFrame\": \"echarts\",\n \"image\": \"line.png\"\n },\n \"option\": {\n \"legend\": {\n \"show\": true,\n \"top\": \"5%\",\n \"textStyle\": {\n \"color\": \"#B9B8CE\"\n }\n },\n \"xAxis\": {\n \"show\": true,\n \"name\": \"\",\n \"nameGap\": 15,\n \"nameTextStyle\": {\n \"color\": \"#B9B8CE\",\n \"fontSize\": 12\n },\n \"inverse\": false,\n \"axisLabel\": {\n \"show\": true,\n \"fontSize\": 12,\n \"color\": \"#B9B8CE\",\n \"rotate\": 0\n },\n \"position\": \"bottom\",\n \"axisLine\": {\n \"show\": true,\n \"lineStyle\": {\n \"color\": \"#B9B8CE\",\n \"width\": 1\n },\n \"onZero\": true\n },\n \"axisTick\": {\n \"show\": true,\n \"length\": 5\n },\n \"splitLine\": {\n \"show\": false,\n \"lineStyle\": {\n \"color\": \"#484753\",\n \"width\": 1,\n \"type\": \"solid\"\n }\n },\n \"type\": \"category\"\n },\n \"yAxis\": {\n \"show\": true,\n \"name\": \"\",\n \"nameGap\": 15,\n \"nameTextStyle\": {\n \"color\": \"#B9B8CE\",\n \"fontSize\": 12\n },\n \"inverse\": false,\n \"axisLabel\": {\n \"show\": true,\n \"fontSize\": 12,\n \"color\": \"#B9B8CE\",\n \"rotate\": 0\n },\n \"position\": \"left\",\n \"axisLine\": {\n \"show\": true,\n \"lineStyle\": {\n \"color\": \"#B9B8CE\",\n \"width\": 1\n },\n \"onZero\": true\n },\n \"axisTick\": {\n \"show\": true,\n \"length\": 5\n },\n \"splitLine\": {\n \"show\": true,\n \"lineStyle\": {\n \"color\": \"#484753\",\n \"width\": 1,\n \"type\": \"solid\"\n }\n },\n \"type\": \"value\"\n },\n \"grid\": {\n \"show\": false,\n \"left\": \"10%\",\n \"top\": \"60\",\n \"right\": \"10%\",\n \"bottom\": \"60\"\n },\n \"tooltip\": {\n \"show\": true,\n \"trigger\": \"axis\",\n \"axisPointer\": {\n \"type\": \"line\"\n }\n },\n \"dataset\": {\n \"dimensions\": [\n \"time\",\n \"次数\",\n \"人数\"\n ],\n \"source\": [\n {\n \"次数\": 94,\n \"time\": \"2022-05\",\n \"人数\": 5\n },\n {\n \"次数\": 120,\n \"time\": \"2022-06\",\n \"人数\": 2\n },\n {\n \"次数\": 118,\n \"time\": \"2022-07\",\n \"人数\": 5\n },\n {\n \"次数\": 37,\n \"time\": \"2022-08\",\n \"人数\": 2\n },\n {\n \"次数\": 65,\n \"time\": \"2022-09\",\n \"人数\": 2\n },\n {\n \"次数\": 35,\n \"time\": \"2022-10\",\n \"人数\": 2\n },\n {\n \"次数\": 86,\n \"time\": \"2022-11\",\n \"人数\": 1\n },\n {\n \"次数\": 49,\n \"time\": \"2022-12\",\n \"人数\": 3\n },\n {\n \"次数\": 45,\n \"time\": \"2023-01\",\n \"人数\": 1\n },\n {\n \"次数\": 70,\n \"time\": \"2023-02\",\n \"人数\": 1\n }\n ]\n },\n \"series\": [\n {\n \"type\": \"line\",\n \"label\": {\n \"show\": true,\n \"position\": \"top\",\n \"color\": \"#fff\",\n \"fontSize\": 12\n },\n \"symbolSize\": 5,\n \"itemStyle\": {\n \"color\": null,\n \"borderRadius\": 0\n },\n \"lineStyle\": {\n \"type\": \"solid\",\n \"width\": 3,\n \"color\": null\n }\n },\n {\n \"type\": \"line\",\n \"label\": {\n \"show\": true,\n \"position\": \"top\",\n \"color\": \"#fff\",\n \"fontSize\": 12\n },\n \"symbolSize\": 5,\n \"itemStyle\": {\n \"color\": null,\n \"borderRadius\": 0\n },\n \"lineStyle\": {\n \"type\": \"solid\",\n \"width\": 3,\n \"color\": null\n }\n }\n ],\n \"backgroundColor\": \"rgba(0,0,0,0)\"\n }\n }\n ],\n \"requestGlobalConfig\": {\n \"requestDataPond\": [],\n \"requestOriginUrl\": \"\",\n \"requestInterval\": 30,\n \"requestIntervalUnit\": \"second\",\n \"requestParams\": {\n \"Body\": {\n \"form-data\": {},\n \"x-www-form-urlencoded\": {},\n \"json\": \"\",\n \"xml\": \"\"\n },\n \"Header\": {},\n \"Params\": {}\n }\n }\n}', 0, NULL, '1', '2023-02-07 11:43:57', '1', '2023-02-07 17:27:40', b'0', 1), (8, '57q2gor533g000', NULL, NULL, 1, NULL, '1', '2023-02-07 19:27:09', '1', '2023-02-07 19:27:09', b'0', 1); +COMMIT; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/sql/mysql/jimureport.mysql5.7.create.sql b/sql/mysql/jimureport.mysql5.7.create.sql new file mode 100644 index 0000000..ff901ce --- /dev/null +++ b/sql/mysql/jimureport.mysql5.7.create.sql @@ -0,0 +1,1635 @@ +/* + Navicat Premium Data Transfer + + Source Server : mysql5.7 + Source Server Type : MySQL + Source Server Version : 50727 + Source Host : 127.0.0.1:3306 + Source Schema : jimureport + + Target Server Type : MySQL + Target Server Version : 50727 + File Encoding : 65001 + + Date: 11/10/2021 17:48:45 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for jimu_dict +-- ---------------------------- +DROP TABLE IF EXISTS `jimu_dict`; +CREATE TABLE `jimu_dict` ( + `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `dict_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '字典名称', + `dict_code` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '字典编码', + `description` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '描述', + `del_flag` int(1) NULL DEFAULT NULL COMMENT '删除状态', + `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + `type` int(1) UNSIGNED ZEROFILL NULL DEFAULT 0 COMMENT '字典类型0为string,1为number', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `uk_sd_dict_code`(`dict_code`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of jimu_dict +-- ---------------------------- +INSERT INTO `jimu_dict` VALUES ('0b1dac3e87ed7229ae19a586a8b8c8f8', '物资类型', 'wz_cc_type', NULL, 0, 'admin', '2019-04-26 18:25:48', NULL, NULL, 0); +INSERT INTO `jimu_dict` VALUES ('0b5d19e1fce4b2e6647e6b4a17760c14', '通告类型', 'msg_category', '消息类型1:通知公告2:系统消息', 0, 'admin', '2019-04-22 18:01:35', NULL, NULL, 0); +INSERT INTO `jimu_dict` VALUES ('1166528843122561025', '测试字典员工类型', 'ceshi_code', '', 0, 'admin', '2019-08-28 09:52:04', 'admin', '2021-01-08 14:33:43', 0); +INSERT INTO `jimu_dict` VALUES ('1174509082208395266', '职务职级', 'position_rank', '职务表职级字典', 0, 'admin', '2019-09-19 10:22:41', NULL, NULL, 0); +INSERT INTO `jimu_dict` VALUES ('1174511106530525185', '机构类型', 'org_category', '机构类型 1公司,2部门 3岗位', 0, 'admin', '2019-09-19 10:30:43', NULL, NULL, 0); +INSERT INTO `jimu_dict` VALUES ('1178295274528845826', '表单权限策略', 'form_perms_type', '', 0, 'admin', '2019-09-29 21:07:39', 'admin', '2019-09-29 21:08:26', NULL); +INSERT INTO `jimu_dict` VALUES ('1199517671259906049', '紧急程度', 'urgent_level', '日程计划紧急程度', 0, 'admin', '2019-11-27 10:37:53', NULL, NULL, 0); +INSERT INTO `jimu_dict` VALUES ('1199518099888414722', '日程计划类型', 'eoa_plan_type', '', 0, 'admin', '2019-11-27 10:39:36', NULL, NULL, 0); +INSERT INTO `jimu_dict` VALUES ('1199525215290306561', '日程计划状态', 'eoa_plan_status', '', 0, 'admin', '2019-11-27 11:07:52', 'admin', '2019-11-27 11:10:11', 0); +INSERT INTO `jimu_dict` VALUES ('1204580702536957953', '打卡类型', 'sign_type', '', 0, 'admin', '2019-12-11 09:56:34', 'admin', '2020-02-13 14:21:36', 0); +INSERT INTO `jimu_dict` VALUES ('1204581134206337025', '打卡状态', 'sign_status', '', 0, 'admin', '2019-12-11 09:58:17', NULL, NULL, 0); +INSERT INTO `jimu_dict` VALUES ('1209733563293962241', '数据库类型', 'database_type', '', 0, 'admin', '2019-12-25 15:12:12', NULL, NULL, 0); +INSERT INTO `jimu_dict` VALUES ('1232913193820581889', 'Online表单业务分类', 'ol_form_biz_type', '', 0, 'admin', '2020-02-27 14:19:46', 'admin', '2020-02-27 14:20:23', 0); +INSERT INTO `jimu_dict` VALUES ('1242281790421389314', '会议类型', 'mettingType', '', 0, 'admin', '2020-03-24 10:47:13', NULL, NULL, 0); +INSERT INTO `jimu_dict` VALUES ('1242298510024429569', '提醒方式', 'remindMode', '', 0, 'admin', '2020-03-24 11:53:40', 'admin', '2020-03-24 12:03:22', 0); +INSERT INTO `jimu_dict` VALUES ('1244538302904672258', '提醒时间', 'remindTime', '', 0, 'admin', '2020-03-30 16:13:48', NULL, NULL, 0); +INSERT INTO `jimu_dict` VALUES ('1244538772909989889', '重复提醒', 'reminders', '', 0, 'admin', '2020-03-30 16:15:40', NULL, NULL, 0); +INSERT INTO `jimu_dict` VALUES ('1244941599661178882', '表单设计器路由类型', 'desform_route_type', '表单设计器下一步路由跳转类型', 0, 'admin', '2020-03-31 18:56:22', NULL, NULL, 0); +INSERT INTO `jimu_dict` VALUES ('1250687930947620866', '定时任务状态', 'quartz_status', '', 0, 'admin', '2020-04-16 15:30:14', '', NULL, NULL); +INSERT INTO `jimu_dict` VALUES ('1252881342601908225', '栏目类型', 'cms_menu_type', '', 0, 'admin', '2020-04-22 16:46:04', '', NULL, NULL); +INSERT INTO `jimu_dict` VALUES ('1253673013610672130', '会议室规模', 'meeting_scale', '', 0, 'admin', '2020-04-24 21:11:53', '', NULL, NULL); +INSERT INTO `jimu_dict` VALUES ('1272739651112034306', '缓急', 'urgency', '', 0, 'admin', '2020-06-16 11:55:54', NULL, NULL, 0); +INSERT INTO `jimu_dict` VALUES ('1272740254731100161', '密级', 'secret_level', '', 0, 'admin', '2020-06-16 11:58:18', NULL, NULL, 0); +INSERT INTO `jimu_dict` VALUES ('1280401766745718786', '租户状态', 'tenant_status', '租户状态', 0, 'admin', '2020-07-07 15:22:25', NULL, NULL, 0); +INSERT INTO `jimu_dict` VALUES ('1336551227544694785', '999', '999', '', 1, 'admin', '2020-12-09 14:00:19', NULL, NULL, 0); +INSERT INTO `jimu_dict` VALUES ('1338811917237489665', '报表测试职务', 'zhiwu', '积木报表演示', 0, 'admin', '2020-12-15 19:43:30', 'admin', '2021-01-13 14:03:13', 0); +INSERT INTO `jimu_dict` VALUES ('20863a840c7622c3eab0ee69e55a8c7c', '常用审批语', 'approval_remarks', '常用审批语', 0, 'admin', '2019-03-15 11:03:26', 'admin', '2019-06-10 19:38:31', 0); +INSERT INTO `jimu_dict` VALUES ('236e8a4baff0db8c62c00dd95632834f', '同步工作流引擎', 'activiti_sync', '同步工作流引擎', 0, 'admin', '2019-05-15 15:27:33', NULL, NULL, 0); +INSERT INTO `jimu_dict` VALUES ('2e02df51611a4b9632828ab7e5338f00', '权限策略', 'perms_type', '权限策略', 0, 'admin', '2019-04-26 18:26:55', NULL, NULL, 0); +INSERT INTO `jimu_dict` VALUES ('2f0320997ade5dd147c90130f7218c3e', '推送类别', 'msg_type', '', 0, 'admin', '2019-03-17 21:21:32', 'admin', '2019-03-26 19:57:45', 0); +INSERT INTO `jimu_dict` VALUES ('3486f32803bb953e7155dab3513dc68b', '删除状态', 'del_flag', '', 0, 'admin', '2019-10-18 21:46:26', 'admin', '2019-05-31 11:32:41', 0); +INSERT INTO `jimu_dict` VALUES ('36d57175542a3ea85073923e8fccc21c', '尺码类型', 'air_china_size', NULL, 0, 'admin', '2019-04-23 23:02:44', NULL, NULL, 0); +INSERT INTO `jimu_dict` VALUES ('3d9a351be3436fbefb1307d4cfb49bf2', '性别', 'sex', NULL, 0, NULL, '2019-01-04 14:56:32', 'admin', '2019-03-30 11:28:27', 1); +INSERT INTO `jimu_dict` VALUES ('4274efc2292239b6f000b153f50823ff', '全局权限策略', 'global_perms_type', '全局权限策略', 0, 'admin', '2019-05-10 17:54:05', NULL, NULL, 0); +INSERT INTO `jimu_dict` VALUES ('49a0f7247f9c2a7df4e5733b790a4c9f', '供应商', 'air_china_ supplier', NULL, 0, 'admin', '2019-04-24 16:49:25', NULL, NULL, 0); +INSERT INTO `jimu_dict` VALUES ('4c03fca6bf1f0299c381213961566349', 'Online图表展示模板', 'online_graph_display_template', 'Online图表展示模板', 0, 'admin', '2019-04-12 17:28:50', NULL, NULL, 0); +INSERT INTO `jimu_dict` VALUES ('4c753b5293304e7a445fd2741b46529d', '字典状态', 'dict_item_status', NULL, 0, 'admin', '2019-06-18 23:18:42', 'admin', '2019-03-30 19:33:52', 1); +INSERT INTO `jimu_dict` VALUES ('4d7fec1a7799a436d26d02325eff295e', '优先级', 'priority', '优先级', 0, 'admin', '2019-03-16 17:03:34', 'admin', '2019-04-16 17:39:23', 0); +INSERT INTO `jimu_dict` VALUES ('4e4602b3e3686f0911384e188dc7efb4', '条件规则', 'rule_conditions', '', 0, 'admin', '2019-04-01 10:15:03', 'admin', '2019-04-01 10:30:47', 0); +INSERT INTO `jimu_dict` VALUES ('4f69be5f507accea8d5df5f11346181a', '发送消息类型', 'msgType', NULL, 0, 'admin', '2019-04-11 14:27:09', NULL, NULL, 0); +INSERT INTO `jimu_dict` VALUES ('68168534ff5065a152bfab275c2136f8', '有效无效状态', 'valid_status', '有效无效状态', 0, 'admin', '2020-09-26 19:21:14', 'admin', '2019-06-07 00:30:10', 0); +INSERT INTO `jimu_dict` VALUES ('72cce0989df68887546746d8f09811aa', 'Online表单类型', 'cgform_table_type', '', 0, 'admin', '2019-01-27 10:13:02', 'admin', '2019-03-30 11:37:36', 0); +INSERT INTO `jimu_dict` VALUES ('76c1d6755018a918c9eeda575dbf3f98', '计量单位', 'air_china_unit', NULL, 0, 'admin', '2017-12-23 23:00:02', 'admin', '2019-04-23 23:13:52', 0); +INSERT INTO `jimu_dict` VALUES ('78bda155fe380b1b3f175f1e88c284c6', '流程状态', 'bpm_status', '流程状态', 0, 'admin', '2019-05-09 16:31:52', NULL, NULL, 0); +INSERT INTO `jimu_dict` VALUES ('83bfb33147013cc81640d5fd9eda030c', '日志类型', 'log_type', NULL, 0, 'admin', '2019-03-18 23:22:19', NULL, NULL, 1); +INSERT INTO `jimu_dict` VALUES ('880a895c98afeca9d9ac39f29e67c13e', '操作类型', 'operate_type', '操作类型', 0, 'admin', '2019-07-22 10:54:29', NULL, NULL, 0); +INSERT INTO `jimu_dict` VALUES ('8dfe32e2d29ea9430a988b3b558bf233', '发布状态', 'send_status', '发布状态', 0, 'admin', '2019-04-16 17:40:42', NULL, NULL, 0); +INSERT INTO `jimu_dict` VALUES ('a7adbcd86c37f7dbc9b66945c82ef9e6', '1是0否', 'yn', '', 1, 'admin', '2019-05-22 19:29:29', NULL, NULL, 0); +INSERT INTO `jimu_dict` VALUES ('a9d9942bd0eccb6e89de92d130ec4c4a', '消息发送状态', 'msgSendStatus', NULL, 0, 'admin', '2019-04-12 18:18:17', NULL, NULL, 0); +INSERT INTO `jimu_dict` VALUES ('ac2f7c0c5c5775fcea7e2387bcb22f01', '菜单类型', 'menu_type', NULL, 0, 'admin', '2019-12-18 23:24:32', 'admin', '2019-04-01 15:27:06', 1); +INSERT INTO `jimu_dict` VALUES ('bd1b8bc28e65d6feefefb6f3c79f42fd', 'Online图表数据类型', 'online_graph_data_type', 'Online图表数据类型', 0, 'admin', '2019-04-12 17:24:24', 'admin', '2019-04-12 17:24:57', 0); +INSERT INTO `jimu_dict` VALUES ('c36169beb12de8a71c8683ee7c28a503', '部门状态', 'depart_status', NULL, 0, 'admin', '2019-03-18 21:59:51', NULL, NULL, 0); +INSERT INTO `jimu_dict` VALUES ('c5a14c75172783d72cbee6ee7f5df5d1', 'Online图表类型', 'online_graph_type', 'Online图表类型', 0, 'admin', '2019-04-12 17:04:06', NULL, NULL, 0); +INSERT INTO `jimu_dict` VALUES ('c72e92c2c13cdbc07b455e6abcc60d47', '启动状态', 'air_china_valid', NULL, 0, 'admin', '2019-04-23 23:05:29', NULL, NULL, 0); +INSERT INTO `jimu_dict` VALUES ('d6e1152968b02d69ff358c75b48a6ee1', '流程类型', 'bpm_process_type', NULL, 0, 'admin', '2019-02-22 19:26:54', 'admin', '2019-03-30 18:14:44', 0); +INSERT INTO `jimu_dict` VALUES ('fc6cd58fde2e8481db10d3a1e68ce70c', '用户状态', 'user_status', NULL, 0, 'admin', '2019-03-18 21:57:25', 'admin', '2019-03-18 23:11:58', 1); + +-- ---------------------------- +-- Table structure for jimu_dict_item +-- ---------------------------- +DROP TABLE IF EXISTS `jimu_dict_item`; +CREATE TABLE `jimu_dict_item` ( + `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `dict_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '字典id', + `item_text` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '字典项文本', + `item_value` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '字典项值', + `description` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '描述', + `sort_order` int(10) NULL DEFAULT NULL COMMENT '排序', + `status` int(11) NULL DEFAULT NULL COMMENT '状态(1启用 0不启用)', + `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `create_time` datetime NULL DEFAULT NULL, + `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `update_time` datetime NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_sdi_role_dict_id`(`dict_id`) USING BTREE, + INDEX `idx_sdi_role_sort_order`(`sort_order`) USING BTREE, + INDEX `idx_sdi_status`(`status`) USING BTREE, + INDEX `idx_sdi_dict_val`(`dict_id`, `item_value`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of jimu_dict_item +-- ---------------------------- +INSERT INTO `jimu_dict_item` VALUES ('0072d115e07c875d76c9b022e2179128', '4d7fec1a7799a436d26d02325eff295e', '低', 'L', '低', 3, 1, 'admin', '2019-04-16 17:04:59', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('00cd5762c968332e2bf8d1fdae872f26', '76c1d6755018a918c9eeda575dbf3f98', '条', '3', NULL, 3, 1, 'admin', '2019-04-23 23:00:42', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('05a2e732ce7b00aa52141ecc3e330b4e', '3486f32803bb953e7155dab3513dc68b', '已删除', '1', NULL, NULL, 1, 'admin', '2025-10-18 21:46:56', 'admin', '2019-03-28 22:23:20'); +INSERT INTO `jimu_dict_item` VALUES ('0737b49b097033b35e1882f970d43263', '36d57175542a3ea85073923e8fccc21c', '量体类', '1', NULL, 1, 1, 'admin', '2019-04-23 23:03:02', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('08ec6c5c986766cc0f398bf88b2c7fd5', '20863a840c7622c3eab0ee69e55a8c7c', '呈领导阅示', '呈领导阅示', '呈领导阅示', 7, 1, 'admin', '2019-05-15 11:07:59', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('096c2e758d823def3855f6376bc736fb', 'bd1b8bc28e65d6feefefb6f3c79f42fd', 'SQL', 'sql', NULL, 1, 1, 'admin', '2019-04-12 17:26:26', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('0c9532916f5cd722017b46bc4d953e41', '2f0320997ade5dd147c90130f7218c3e', '指定用户', 'USER', NULL, NULL, 1, 'admin', '2019-03-17 21:22:19', 'admin', '2019-03-17 21:22:28'); +INSERT INTO `jimu_dict_item` VALUES ('0ca4beba9efc4f9dd54af0911a946d5c', '72cce0989df68887546746d8f09811aa', '附表', '3', NULL, 3, 1, 'admin', '2019-03-27 10:13:43', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1030a2652608f5eac3b49d70458b8532', '2e02df51611a4b9632828ab7e5338f00', '禁用', '2', '禁用', 2, 1, 'admin', '2021-03-26 18:27:28', 'admin', '2019-04-26 18:39:11'); +INSERT INTO `jimu_dict_item` VALUES ('10e3b1b78da8b40161b7b89cefb2f31b', '0b1dac3e87ed7229ae19a586a8b8c8f8', '衣服', 'yifu', NULL, 1, 1, 'admin', '2019-04-26 18:26:04', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1166528884218351617', '1166528843122561025', '普通员工', '1', '', 1, 1, 'admin', '2019-08-28 09:52:14', 'admin', '2021-01-08 14:33:52'); +INSERT INTO `jimu_dict_item` VALUES ('1166528900752297986', '1166528843122561025', '领导', '2', '', 1, 1, 'admin', '2019-08-28 09:52:18', 'admin', '2021-01-08 14:33:57'); +INSERT INTO `jimu_dict_item` VALUES ('1174509082208395266', '1174511106530525185', '岗位', '3', '岗位', 1, 1, 'admin', '2019-09-19 10:31:16', '', NULL); +INSERT INTO `jimu_dict_item` VALUES ('1174509601047994369', '1174509082208395266', '员级', '1', '', 1, 1, 'admin', '2019-09-19 10:24:45', 'admin', '2019-09-23 11:46:39'); +INSERT INTO `jimu_dict_item` VALUES ('1174509667297026049', '1174509082208395266', '助级', '2', '', 2, 1, 'admin', '2019-09-19 10:25:01', 'admin', '2019-09-23 11:46:47'); +INSERT INTO `jimu_dict_item` VALUES ('1174509713568587777', '1174509082208395266', '中级', '3', '', 3, 1, 'admin', '2019-09-19 10:25:12', 'admin', '2019-09-23 11:46:56'); +INSERT INTO `jimu_dict_item` VALUES ('1174509788361416705', '1174509082208395266', '副高级', '4', '', 4, 1, 'admin', '2019-09-19 10:25:30', 'admin', '2019-09-23 11:47:06'); +INSERT INTO `jimu_dict_item` VALUES ('1174509835803189250', '1174509082208395266', '正高级', '5', '', 5, 1, 'admin', '2019-09-19 10:25:41', 'admin', '2019-09-23 11:47:12'); +INSERT INTO `jimu_dict_item` VALUES ('1174511197735665665', '1174511106530525185', '公司', '1', '公司', 1, 1, 'admin', '2019-09-19 10:31:05', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1174511244036587521', '1174511106530525185', '部门', '2', '部门', 1, 1, 'admin', '2019-09-19 10:31:16', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1178295553450061826', '1178295274528845826', '可编辑(未授权禁用)', '2', '', 2, 1, 'admin', '2019-09-29 21:08:46', 'admin', '2019-09-29 21:09:18'); +INSERT INTO `jimu_dict_item` VALUES ('1178295639554928641', '1178295274528845826', '可见(未授权不可见)', '1', '', 1, 1, 'admin', '2019-09-29 21:09:06', 'admin', '2019-09-29 21:09:24'); +INSERT INTO `jimu_dict_item` VALUES ('1199517884758368257', '1199517671259906049', '一般', '1', '', 1, 1, 'admin', '2019-11-27 10:38:44', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1199517914017832962', '1199517671259906049', '重要', '2', '', 1, 1, 'admin', '2019-11-27 10:38:51', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1199517941339529217', '1199517671259906049', '紧急', '3', '', 1, 1, 'admin', '2019-11-27 10:38:58', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1199518186144276482', '1199518099888414722', '日常记录', '1', '', 1, 1, 'admin', '2019-11-27 10:39:56', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1199518214858481666', '1199518099888414722', '本周工作', '2', '', 1, 1, 'admin', '2019-11-27 10:40:03', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1199518235943247874', '1199518099888414722', '下周计划', '3', '', 1, 1, 'admin', '2019-11-27 10:40:08', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1199525468672405505', '1199525215290306561', '未开始', '0', '', 1, 1, 'admin', '2019-11-27 11:08:52', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1199525490575060993', '1199525215290306561', '进行中', '2', '', 3, 1, 'admin', '2019-11-27 11:08:58', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1199525506429530114', '1199525215290306561', '已完成', '3', '', 4, 1, 'admin', '2019-11-27 11:09:02', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1199607547704647681', '4f69be5f507accea8d5df5f11346181a', '系统', '4', '', 1, 1, 'admin', '2019-11-27 16:35:02', 'admin', '2019-11-27 19:37:46'); +INSERT INTO `jimu_dict_item` VALUES ('1203571948706095105', '1199525215290306561', '已提醒', '1', '', 2, 1, 'admin', '2019-12-08 15:08:09', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1204581455016067074', '1204580702536957953', '上班打卡', '1', '', 1, 1, 'admin', '2019-12-11 09:59:34', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1204581521328013314', '1204580702536957953', '下班打卡', '2', '', 1, 1, 'admin', '2019-12-11 09:59:49', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1204581542945456129', '1204580702536957953', '外出打卡', '3', '', 1, 1, 'admin', '2019-12-11 09:59:55', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1204581564143468546', '1204580702536957953', '请假', '4', '', 1, 1, 'admin', '2019-12-11 10:00:00', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1204581583089139713', '1204580702536957953', '出差', '5', '', 1, 1, 'admin', '2019-12-11 10:00:04', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1204581803613061122', '1204581134206337025', '缺卡', '0', '', 1, 1, 'admin', '2019-12-11 10:00:57', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1204581830603407362', '1204581134206337025', '正常', '1', '', 1, 1, 'admin', '2019-12-11 10:01:03', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1204581850283081729', '1204581134206337025', '迟到', '2', '', 1, 1, 'admin', '2019-12-11 10:01:08', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1204581868406669314', '1204581134206337025', '旷工', '3', '', 1, 1, 'admin', '2019-12-11 10:01:12', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1204581886026940417', '1204581134206337025', '早退', '4', '', 1, 1, 'admin', '2019-12-11 10:01:16', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1209733775114702850', '1209733563293962241', 'MySQL5.5', '1', '', 1, 1, 'admin', '2019-12-25 15:13:02', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1209733839933476865', '1209733563293962241', 'Oracle', '2', '', 3, 1, 'admin', '2019-12-25 15:13:18', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1209733903020003330', '1209733563293962241', 'SQLServer', '3', '', 4, 1, 'admin', '2019-12-25 15:13:33', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1232913424813486081', '1232913193820581889', '官方示例', 'demo', '', 1, 1, 'admin', '2020-02-27 14:20:42', 'admin', '2020-02-27 14:21:37'); +INSERT INTO `jimu_dict_item` VALUES ('1232913493717512194', '1232913193820581889', '流程表单', 'bpm', '', 2, 1, 'admin', '2020-02-27 14:20:58', 'admin', '2020-02-27 14:22:20'); +INSERT INTO `jimu_dict_item` VALUES ('1232913605382467585', '1232913193820581889', '测试表单', 'temp', '', 4, 1, 'admin', '2020-02-27 14:21:25', 'admin', '2020-02-27 14:22:16'); +INSERT INTO `jimu_dict_item` VALUES ('1232914232372195330', '1232913193820581889', '导入表单', 'bdfl_include', '', 5, 1, 'admin', '2020-02-27 14:23:54', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1233279228474138625', '4e4602b3e3686f0911384e188dc7efb4', '左模糊', 'LEFT_LIKE', '', 7, 1, 'admin', '2020-02-28 14:34:16', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1233279337333104641', '4e4602b3e3686f0911384e188dc7efb4', '右模糊', 'RIGHT_LIKE', '', 7, 1, 'admin', '2020-02-28 14:34:42', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1242281959082741761', '1242281790421389314', '部门会议', 'depart', '', 1, 1, 'admin', '2020-03-24 10:47:54', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1242282018893516802', '1242281790421389314', '临时会议', 'temp', '', 1, 1, 'admin', '2020-03-24 10:48:08', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1242282141274918913', '1242281790421389314', '公司会议', 'company', '', 1, 1, 'admin', '2020-03-24 10:48:37', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1242282318563954690', '1242281790421389314', '培训会议', 'train', '', 1, 1, 'admin', '2020-03-24 10:49:19', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1242282375325470721', '1242281790421389314', '普通会议', 'common', '', 1, 1, 'admin', '2020-03-24 10:49:33', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1242300779390357505', '1242298510024429569', '短信提醒', '2', '', 2, 1, 'admin', '2020-03-24 12:02:41', 'admin', '2020-03-30 18:21:33'); +INSERT INTO `jimu_dict_item` VALUES ('1242300814383435777', '1242298510024429569', '邮件提醒', '1', '', 1, 1, 'admin', '2020-03-24 12:02:49', 'admin', '2020-03-30 18:21:26'); +INSERT INTO `jimu_dict_item` VALUES ('1242300887343353857', '1242298510024429569', '系统消息', '4', '', 4, 1, 'admin', '2020-03-24 12:03:07', 'admin', '2020-03-30 18:21:43'); +INSERT INTO `jimu_dict_item` VALUES ('1244538412480864258', '1244538302904672258', '不提醒', '0', '', 1, 1, 'admin', '2020-03-30 16:14:14', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1244538453169807361', '1244538302904672258', '开始时', '1', '', 1, 1, 'admin', '2020-03-30 16:14:24', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1244538498132746241', '1244538302904672258', '提前5分钟', '2', '', 2, 1, 'admin', '2020-03-30 16:14:35', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1244538537420791810', '1244538302904672258', '提前10分钟', '3', '', 3, 1, 'admin', '2020-03-30 16:14:44', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1244538569926647810', '1244538302904672258', '提前15分钟', '4', '', 4, 1, 'admin', '2020-03-30 16:14:52', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1244538620744835073', '1244538302904672258', '提前30分钟', '5', '', 5, 1, 'admin', '2020-03-30 16:15:04', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1244538674016690178', '1244538302904672258', '提前1小时', '6', '', 6, 1, 'admin', '2020-03-30 16:15:16', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1244538712323268610', '1244538302904672258', '提前2小时', '7', '', 7, 1, 'admin', '2020-03-30 16:15:26', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1244538832364249090', '1244538772909989889', '不重复', '0', '', 1, 1, 'admin', '2020-03-30 16:15:54', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1244538882335186946', '1244538772909989889', '每天', '1', '', 1, 1, 'admin', '2020-03-30 16:16:06', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1244538920792760321', '1244538772909989889', '每周', '2', '', 2, 1, 'admin', '2020-03-30 16:16:15', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1244538964811980802', '1244538772909989889', '每月(当日)', '3', '', 3, 1, 'admin', '2020-03-30 16:16:26', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1244539005064716289', '1244538772909989889', '每年(当日)', '4', '', 4, 1, 'admin', '2020-03-30 16:16:35', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1244941726052335617', '1244941599661178882', '跳转到表单', '1', '', 1, 1, 'admin', '2020-03-31 18:56:52', 'admin', '2020-03-31 21:16:05'); +INSERT INTO `jimu_dict_item` VALUES ('1244941755555069953', '1244941599661178882', '跳转到菜单', '2', '', 2, 1, 'admin', '2020-03-31 18:56:59', 'admin', '2020-03-31 21:16:09'); +INSERT INTO `jimu_dict_item` VALUES ('1244941784743231489', '1244941599661178882', '跳转到外部', '3', '', 3, 1, 'admin', '2020-03-31 18:57:06', 'admin', '2020-03-31 21:16:14'); +INSERT INTO `jimu_dict_item` VALUES ('1250688147579228161', '1250687930947620866', '正常', '0', '', 1, 1, 'admin', '2020-04-16 15:31:05', '', NULL); +INSERT INTO `jimu_dict_item` VALUES ('1250688201064992770', '1250687930947620866', '停止', '-1', '', 1, 1, 'admin', '2020-04-16 15:31:18', '', NULL); +INSERT INTO `jimu_dict_item` VALUES ('1252882203973537794', '1252881342601908225', '列表', '1', '', 1, 1, 'admin', '2020-04-22 16:49:29', '', NULL); +INSERT INTO `jimu_dict_item` VALUES ('1252882248991002626', '1252881342601908225', '链接', '2', '', 1, 1, 'admin', '2020-04-22 16:49:40', '', NULL); +INSERT INTO `jimu_dict_item` VALUES ('1253673087988264962', '1253673013610672130', '小型', 'S', '', 1, 1, 'admin', '2020-04-24 21:12:10', '', NULL); +INSERT INTO `jimu_dict_item` VALUES ('1253673146364588034', '1253673013610672130', '中型', 'M', '', 1, 1, 'admin', '2020-04-24 21:12:24', '', NULL); +INSERT INTO `jimu_dict_item` VALUES ('1253673184885075970', '1253673013610672130', '大型', 'L', '', 1, 1, 'admin', '2020-04-24 21:12:34', '', NULL); +INSERT INTO `jimu_dict_item` VALUES ('1272739846449160193', '1272739651112034306', '一般', '0', '', 1, 1, 'admin', '2020-06-16 11:56:40', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1272739980616556545', '1272739651112034306', '平急', '1', '', 1, 1, 'admin', '2020-06-16 11:57:12', 'admin', '2020-10-28 17:50:22'); +INSERT INTO `jimu_dict_item` VALUES ('1272740017782284289', '1272739651112034306', '加急', '2', '', 1, 1, 'admin', '2020-06-16 11:57:21', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1272740063856713730', '1272739651112034306', '特急', '3', '', 1, 1, 'admin', '2020-06-16 11:57:32', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1272740134505570306', '1272739651112034306', '特提', '4', '', 1, 1, 'admin', '2020-06-16 11:57:49', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1272740342673072129', '1272740254731100161', '一般', '0', '', 1, 1, 'admin', '2020-06-16 11:58:39', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1272740397966581762', '1272740254731100161', '秘密', '1', '', 1, 1, 'admin', '2020-06-16 11:58:52', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1272740445697761282', '1272740254731100161', '机密', '2', '', 1, 1, 'admin', '2020-06-16 11:59:03', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1272740494238441473', '1272740254731100161', '绝密', '3', '', 1, 1, 'admin', '2020-06-16 11:59:15', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1280401815068295170', '1280401766745718786', '正常', '1', '', 1, 1, 'admin', '2020-07-07 15:22:36', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1280401847607705602', '1280401766745718786', '冻结', '0', '', 1, 1, 'admin', '2020-07-07 15:22:44', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1280417387279060994', '1199525215290306561', '已接受', '4', '', 4, 1, 'admin', '2020-07-07 16:24:28', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1280417420456005634', '1199525215290306561', '已取消', '5', '5', 5, 1, 'admin', '2020-07-07 16:24:36', 'admin', '2020-07-07 16:24:45'); +INSERT INTO `jimu_dict_item` VALUES ('1305827309355302914', 'bd1b8bc28e65d6feefefb6f3c79f42fd', 'API', 'api', '', 3, 1, 'admin', '2020-09-15 19:14:26', 'admin', '2020-09-15 19:14:41'); +INSERT INTO `jimu_dict_item` VALUES ('1334440962954936321', '1209733563293962241', 'MYSQL5.7', '4', NULL, 1, 1, 'admin', '2020-12-03 18:16:02', 'admin', '2020-12-03 18:16:02'); +INSERT INTO `jimu_dict_item` VALUES ('1338812279746990082', '1338811917237489665', '研发经理', '1', '', 1, 1, 'admin', '2020-12-15 19:44:56', 'admin', '2021-01-13 14:00:13'); +INSERT INTO `jimu_dict_item` VALUES ('1338812321702612993', '1338811917237489665', '研发专员', '2', '', 1, 1, 'admin', '2020-12-15 19:45:06', 'admin', '2021-01-13 14:00:16'); +INSERT INTO `jimu_dict_item` VALUES ('1338812381655994370', '1338811917237489665', '财务经理', '3', '', 1, 1, 'admin', '2020-12-15 19:45:20', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1338812417886392322', '1338811917237489665', '财务专员', '4', '', 1, 1, 'admin', '2020-12-15 19:45:29', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1338812461297438721', '1338811917237489665', '客服经理', '5', '', 1, 1, 'admin', '2020-12-15 19:45:39', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1338812495665565697', '1338811917237489665', '客服专员', '6', '', 1, 1, 'admin', '2020-12-15 19:45:48', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('147c48ff4b51545032a9119d13f3222a', 'd6e1152968b02d69ff358c75b48a6ee1', '测试流程', 'test', NULL, 1, 1, 'admin', '2019-03-22 19:27:05', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('1543fe7e5e26fb97cdafe4981bedc0c8', '4c03fca6bf1f0299c381213961566349', '单排布局', 'single', NULL, 2, 1, 'admin', '2022-07-12 17:43:39', 'admin', '2019-04-12 17:43:57'); +INSERT INTO `jimu_dict_item` VALUES ('1db531bcff19649fa82a644c8a939dc4', '4c03fca6bf1f0299c381213961566349', '组合布局', 'combination', '', 4, 1, 'admin', '2019-05-11 16:07:08', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('222705e11ef0264d4214affff1fb4ff9', '4f69be5f507accea8d5df5f11346181a', '短信', '1', '', 1, 1, 'admin', '2023-02-28 10:50:36', 'admin', '2019-04-28 10:58:11'); +INSERT INTO `jimu_dict_item` VALUES ('23a5bb76004ed0e39414e928c4cde155', '4e4602b3e3686f0911384e188dc7efb4', '不等于', '!=', '不等于', 3, 1, 'admin', '2019-04-01 16:46:15', 'admin', '2019-04-01 17:48:40'); +INSERT INTO `jimu_dict_item` VALUES ('25847e9cb661a7c711f9998452dc09e6', '4e4602b3e3686f0911384e188dc7efb4', '小于等于', '<=', '小于等于', 6, 1, 'admin', '2019-04-01 16:44:34', 'admin', '2019-04-01 17:49:10'); +INSERT INTO `jimu_dict_item` VALUES ('2d51376643f220afdeb6d216a8ac2c01', '68168534ff5065a152bfab275c2136f8', '有效', '1', '有效', 1, 1, 'admin', '2020-10-26 19:22:01', 'admin', '2019-10-04 17:46:58'); +INSERT INTO `jimu_dict_item` VALUES ('308c8aadf0c37ecdde188b97ca9833f5', '8dfe32e2d29ea9430a988b3b558bf233', '已发布', '1', '已发布', 2, 1, 'admin', '2019-04-16 17:41:24', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('333e6b2196e01ef9a5f76d74e86a6e33', '8dfe32e2d29ea9430a988b3b558bf233', '未发布', '0', '未发布', 1, 1, 'admin', '2019-04-16 17:41:12', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('337ea1e401bda7233f6258c284ce4f50', 'bd1b8bc28e65d6feefefb6f3c79f42fd', 'JSON', 'json', NULL, 1, 1, 'admin', '2019-04-12 17:26:33', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('33bc9d9f753cf7dc40e70461e50fdc54', 'a9d9942bd0eccb6e89de92d130ec4c4a', '发送失败', '2', NULL, 3, 1, 'admin', '2019-04-12 18:20:02', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('3c209b31417aba7cd5663355611d12c5', '36d57175542a3ea85073923e8fccc21c', '羊毛衫及毛背心类', '3', NULL, 3, 1, 'admin', '2019-04-23 23:03:27', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('3fbc03d6c994ae06d083751248037c0e', '78bda155fe380b1b3f175f1e88c284c6', '已完成', '3', '已完成', 3, 1, 'admin', '2019-05-09 16:33:25', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('41d7aaa40c9b61756ffb1f28da5ead8e', '0b5d19e1fce4b2e6647e6b4a17760c14', '通知公告', '1', NULL, 1, 1, 'admin', '2019-04-22 18:01:57', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('41fa1e9571505d643aea87aeb83d4d76', '4e4602b3e3686f0911384e188dc7efb4', '等于', '=', '等于', 4, 1, 'admin', '2019-04-01 16:45:24', 'admin', '2019-04-01 17:49:00'); +INSERT INTO `jimu_dict_item` VALUES ('4d7bcaf63f274e262c8e919470e47e5f', '20863a840c7622c3eab0ee69e55a8c7c', '同意', '同意', '同意', 1, 1, 'admin', '2019-05-15 11:04:31', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('4f05fb5376f4c61502c5105f52e4dd2b', '83bfb33147013cc81640d5fd9eda030c', '操作日志', '2', NULL, NULL, 1, 'admin', '2019-03-18 23:22:49', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('50223341bfb5ba30bf6319789d8d17fe', 'd6e1152968b02d69ff358c75b48a6ee1', '业务办理', 'business', NULL, 3, 1, 'admin', '2023-04-22 19:28:05', 'admin', '2019-03-22 23:24:39'); +INSERT INTO `jimu_dict_item` VALUES ('51222413e5906cdaf160bb5c86fb827c', 'a7adbcd86c37f7dbc9b66945c82ef9e6', '是', '1', '', 1, 1, 'admin', '2019-05-22 19:29:45', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('538fca35afe004972c5f3947c039e766', '2e02df51611a4b9632828ab7e5338f00', '显示', '1', '显示', 1, 1, 'admin', '2025-03-26 18:27:13', 'admin', '2019-04-26 18:39:07'); +INSERT INTO `jimu_dict_item` VALUES ('5584c21993bde231bbde2b966f2633ac', '4e4602b3e3686f0911384e188dc7efb4', '自定义SQL', 'USE_SQL_RULES', '自定义SQL表达式', 9, 1, 'admin', '2019-04-01 10:45:24', 'admin', '2019-04-01 17:49:27'); +INSERT INTO `jimu_dict_item` VALUES ('56b9f1c6364c775236e1aa16ff97afae', '20863a840c7622c3eab0ee69e55a8c7c', '不同意', '不同意', '不同意', 6, 1, 'admin', '2019-05-15 11:07:17', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('58b73b344305c99b9d8db0fc056bbc0a', '72cce0989df68887546746d8f09811aa', '主表', '2', NULL, 2, 1, 'admin', '2019-03-27 10:13:36', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('598380c65be4568b6ad507e563aba667', '76c1d6755018a918c9eeda575dbf3f98', '包', '8', NULL, 8, 1, 'admin', '2019-04-23 23:01:58', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('5b65a88f076b32e8e69d19bbaadb52d5', '2f0320997ade5dd147c90130f7218c3e', '全体用户', 'ALL', NULL, NULL, 1, 'admin', '2020-10-17 21:22:43', 'admin', '2019-03-28 22:17:09'); +INSERT INTO `jimu_dict_item` VALUES ('5d833f69296f691843ccdd0c91212b6b', '880a895c98afeca9d9ac39f29e67c13e', '修改', '3', '', 3, 1, 'admin', '2019-07-22 10:55:07', 'admin', '2019-07-22 10:55:41'); +INSERT INTO `jimu_dict_item` VALUES ('5d84a8634c8fdfe96275385075b105c9', '3d9a351be3436fbefb1307d4cfb49bf2', '女', '2', NULL, 2, 1, NULL, '2019-01-04 14:56:56', NULL, '2019-01-04 17:38:12'); +INSERT INTO `jimu_dict_item` VALUES ('66c952ae2c3701a993e7db58f3baf55e', '4e4602b3e3686f0911384e188dc7efb4', '大于', '>', '大于', 1, 1, 'admin', '2019-04-01 10:45:46', 'admin', '2019-04-01 17:48:29'); +INSERT INTO `jimu_dict_item` VALUES ('69cacf64e244100289ddd4aa9fa3b915', 'a9d9942bd0eccb6e89de92d130ec4c4a', '未发送', '0', NULL, 1, 1, 'admin', '2019-04-12 18:19:23', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('6a7a9e1403a7943aba69e54ebeff9762', '4f69be5f507accea8d5df5f11346181a', '邮件', '2', '', 2, 1, 'admin', '2031-02-28 10:50:44', 'admin', '2019-04-28 10:59:03'); +INSERT INTO `jimu_dict_item` VALUES ('6c682d78ddf1715baf79a1d52d2aa8c2', '72cce0989df68887546746d8f09811aa', '单表', '1', NULL, 1, 1, 'admin', '2019-03-27 10:13:29', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('6d404fd2d82311fbc87722cd302a28bc', '4e4602b3e3686f0911384e188dc7efb4', '模糊', 'LIKE', '模糊', 7, 1, 'admin', '2019-04-01 16:46:02', 'admin', '2019-04-01 17:49:20'); +INSERT INTO `jimu_dict_item` VALUES ('6d4e26e78e1a09699182e08516c49fc4', '4d7fec1a7799a436d26d02325eff295e', '高', 'H', '高', 1, 1, 'admin', '2019-04-16 17:04:24', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('6e65c7d1cb1a433b5cccc2e072f6c536', '76c1d6755018a918c9eeda575dbf3f98', '双', '4', NULL, 4, 1, 'admin', '2019-04-23 23:01:10', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('7050c1522702bac3be40e3b7d2e1dfd8', 'c5a14c75172783d72cbee6ee7f5df5d1', '柱状图', 'bar', NULL, 1, 1, 'admin', '2019-04-12 17:05:17', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('71b924faa93805c5c1579f12e001c809', 'd6e1152968b02d69ff358c75b48a6ee1', 'OA办公', 'oa', NULL, 2, 1, 'admin', '2021-03-22 19:27:17', 'admin', '2019-03-22 23:24:36'); +INSERT INTO `jimu_dict_item` VALUES ('75b260d7db45a39fc7f21badeabdb0ed', 'c36169beb12de8a71c8683ee7c28a503', '不启用', '0', NULL, NULL, 1, 'admin', '2019-03-18 23:29:41', 'admin', '2019-03-18 23:29:54'); +INSERT INTO `jimu_dict_item` VALUES ('7688469db4a3eba61e6e35578dc7c2e5', 'c36169beb12de8a71c8683ee7c28a503', '启用', '1', NULL, NULL, 1, 'admin', '2019-03-18 23:29:28', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('78ea6cadac457967a4b1c4eb7aaa418c', 'fc6cd58fde2e8481db10d3a1e68ce70c', '正常', '1', NULL, NULL, 1, 'admin', '2019-03-18 23:30:28', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('7ccf7b80c70ee002eceb3116854b75cb', 'ac2f7c0c5c5775fcea7e2387bcb22f01', '按钮权限', '2', NULL, NULL, 1, 'admin', '2019-03-18 23:25:40', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('81fb2bb0e838dc68b43f96cc309f8257', 'fc6cd58fde2e8481db10d3a1e68ce70c', '冻结', '2', NULL, NULL, 1, 'admin', '2019-03-18 23:30:37', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('83250269359855501ec4e9c0b7e21596', '4274efc2292239b6f000b153f50823ff', '可见/可访问(授权后可见/可访问)', '1', '', 1, 1, 'admin', '2023-06-10 17:54:51', 'admin', '2019-06-05 19:43:11'); +INSERT INTO `jimu_dict_item` VALUES ('84778d7e928bc843ad4756db1322301f', '4e4602b3e3686f0911384e188dc7efb4', '大于等于', '>=', '大于等于', 5, 1, 'admin', '2019-04-01 10:46:02', 'admin', '2019-04-01 17:49:05'); +INSERT INTO `jimu_dict_item` VALUES ('848d4da35ebd93782029c57b103e5b36', 'c5a14c75172783d72cbee6ee7f5df5d1', '饼图', 'pie', NULL, 3, 1, 'admin', '2019-04-12 17:05:49', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('84dfc178dd61b95a72900fcdd624c471', '78bda155fe380b1b3f175f1e88c284c6', '处理中', '2', '处理中', 2, 1, 'admin', '2019-05-09 16:33:01', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('86f19c7e0a73a0bae451021ac05b99dd', 'ac2f7c0c5c5775fcea7e2387bcb22f01', '子菜单', '1', NULL, NULL, 1, 'admin', '2019-03-18 23:25:27', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('8bccb963e1cd9e8d42482c54cc609ca2', '4f69be5f507accea8d5df5f11346181a', '微信', '3', NULL, 3, 1, 'admin', '2021-05-11 14:29:12', 'admin', '2019-04-11 14:29:31'); +INSERT INTO `jimu_dict_item` VALUES ('8c618902365ca681ebbbe1e28f11a548', '4c753b5293304e7a445fd2741b46529d', '启用', '1', NULL, 0, 0, 'admin', '2019-03-18 23:19:27', 'admin', '2019-03-20 09:33:30'); +INSERT INTO `jimu_dict_item` VALUES ('8cdf08045056671efd10677b8456c999', '4274efc2292239b6f000b153f50823ff', '可编辑(未授权时禁用)', '2', '', 2, 1, 'admin', '2019-05-10 17:55:38', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('8ff48e657a7c5090d4f2a59b37d1b878', '4d7fec1a7799a436d26d02325eff295e', '中', 'M', '中', 2, 1, 'admin', '2019-04-16 17:04:40', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('948923658baa330319e59b2213cda97c', '880a895c98afeca9d9ac39f29e67c13e', '添加', '2', '', 2, 1, 'admin', '2019-07-22 10:54:59', 'admin', '2019-07-22 10:55:36'); +INSERT INTO `jimu_dict_item` VALUES ('9a96c4a4e4c5c9b4e4d0cbf6eb3243cc', '4c753b5293304e7a445fd2741b46529d', '不启用', '0', NULL, 1, 1, 'admin', '2019-03-18 23:19:53', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('9c5b6144c4f954d938c96384e2e948aa', '20863a840c7622c3eab0ee69e55a8c7c', '请审批', '请审批', '请审批', 8, 1, 'admin', '2019-05-15 11:08:35', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('a05f177a7d9aeb84125ee8bc9c4fc64b', '49a0f7247f9c2a7df4e5733b790a4c9f', '耐克供应商', '2', NULL, 1, 1, 'admin', '2023-01-24 16:49:39', 'admin', '2019-04-24 16:49:59'); +INSERT INTO `jimu_dict_item` VALUES ('a1e7d1ca507cff4a480c8caba7c1339e', '880a895c98afeca9d9ac39f29e67c13e', '导出', '6', '', 6, 1, 'admin', '2019-07-22 12:06:50', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('a2be752dd4ec980afaec1efd1fb589af', '8dfe32e2d29ea9430a988b3b558bf233', '已撤销', '2', '已撤销', 3, 1, 'admin', '2019-04-16 17:41:39', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('aa0d8a8042a18715a17f0a888d360aa4', 'ac2f7c0c5c5775fcea7e2387bcb22f01', '一级菜单', '0', NULL, NULL, 1, 'admin', '2019-03-18 23:24:52', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('adcf2a1fe93bb99a84833043f475fe0b', '4e4602b3e3686f0911384e188dc7efb4', '包含', 'IN', '包含', 8, 1, 'admin', '2019-04-01 16:45:47', 'admin', '2019-04-01 17:49:24'); +INSERT INTO `jimu_dict_item` VALUES ('b029a41a851465332ee4ee69dcf0a4c2', '0b5d19e1fce4b2e6647e6b4a17760c14', '系统消息', '2', NULL, 1, 1, 'admin', '2019-02-22 18:02:08', 'admin', '2019-04-22 18:02:13'); +INSERT INTO `jimu_dict_item` VALUES ('b038e6f80c527d684c9ca0e1ecbef72f', '49a0f7247f9c2a7df4e5733b790a4c9f', '阿迪供应商', '1', NULL, 1, 1, 'admin', '2023-01-24 16:49:34', 'admin', '2019-04-24 16:50:02'); +INSERT INTO `jimu_dict_item` VALUES ('b2a8b4bb2c8e66c2c4b1bb086337f393', '3486f32803bb953e7155dab3513dc68b', '正常', '0', NULL, NULL, 1, 'admin', '2022-10-18 21:46:48', 'admin', '2019-03-28 22:22:20'); +INSERT INTO `jimu_dict_item` VALUES ('b5f3bd5f66bb9a83fecd89228c0d93d1', '68168534ff5065a152bfab275c2136f8', '无效', '0', '无效', 2, 1, 'admin', '2020-09-26 19:21:49', 'admin', '2019-05-13 17:20:07'); +INSERT INTO `jimu_dict_item` VALUES ('b96af20aef0c9388f2ae843ea7f8d722', '20863a840c7622c3eab0ee69e55a8c7c', '请***阅示', '请***阅示', '请***阅示', 4, 1, 'admin', '2019-05-15 11:06:25', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('b9fbe2a3602d4a27b45c100ac5328484', '78bda155fe380b1b3f175f1e88c284c6', '待提交', '1', '待提交', 1, 1, 'admin', '2019-05-09 16:32:35', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('ba27737829c6e0e582e334832703d75e', '236e8a4baff0db8c62c00dd95632834f', '同步', '1', '同步', 1, 1, 'admin', '2019-05-15 15:28:15', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('bcec04526b04307e24a005d6dcd27fd6', '880a895c98afeca9d9ac39f29e67c13e', '导入', '5', '', 5, 1, 'admin', '2019-07-22 12:06:41', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('bdeae295bf98a61b45e9be0322657d4b', 'c72e92c2c13cdbc07b455e6abcc60d47', '不启动', '2', NULL, 1, 1, 'admin', '2019-04-23 23:05:57', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('c4896da3525689b477b3c868d728c87f', 'c72e92c2c13cdbc07b455e6abcc60d47', '启动', '1', NULL, 1, 1, 'admin', '2019-04-23 23:05:40', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('c53da022b9912e0aed691bbec3c78473', '880a895c98afeca9d9ac39f29e67c13e', '查询', '1', '', 1, 1, 'admin', '2019-07-22 10:54:51', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('c5700a71ad08994d18ad1dacc37a71a9', 'a7adbcd86c37f7dbc9b66945c82ef9e6', '否', '0', '', 1, 1, 'admin', '2019-05-22 19:29:55', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('c83d907903a7a5ff52de60aabf3550ee', '76c1d6755018a918c9eeda575dbf3f98', '件', '1', NULL, 1, 1, 'admin', '2018-12-23 23:00:17', 'admin', '2019-04-23 23:14:00'); +INSERT INTO `jimu_dict_item` VALUES ('c8e63916333e588ef52d3eb3be9b6944', '0b1dac3e87ed7229ae19a586a8b8c8f8', 'dd', 'dd', NULL, 1, 1, 'admin', '2019-04-26 18:26:07', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('c9c3fb6c8a06b7bf577b4f574adccd12', '20863a840c7622c3eab0ee69e55a8c7c', '请指示', '请指示', '请指示', 3, 1, 'admin', '2019-05-15 11:05:58', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('cbfcc5b88fc3a90975df23ffc8cbe29c', 'c5a14c75172783d72cbee6ee7f5df5d1', '曲线图', 'line', NULL, 2, 1, 'admin', '2019-05-12 17:05:30', 'admin', '2019-04-12 17:06:06'); +INSERT INTO `jimu_dict_item` VALUES ('d217592908ea3e00ff986ce97f24fb98', 'c5a14c75172783d72cbee6ee7f5df5d1', '数据列表', 'table', NULL, 4, 1, 'admin', '2019-04-12 17:05:56', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('d76e35d4fa1c2892ff812e1de08b8684', '36d57175542a3ea85073923e8fccc21c', '标准尺码类', '4', NULL, 4, 1, 'admin', '2019-04-23 23:03:37', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('da01e5c526fc1984ca60fdcf13354d05', '20863a840c7622c3eab0ee69e55a8c7c', '同意***的意见', '同意***的意见', '同意***的意见', 2, 1, 'admin', '2019-05-15 11:05:33', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('db681e7aabd2ff52fdfaf6c2770448ff', '76c1d6755018a918c9eeda575dbf3f98', '套', '2', NULL, 2, 1, 'admin', '2019-04-23 23:00:32', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('df168368dcef46cade2aadd80100d8aa', '3d9a351be3436fbefb1307d4cfb49bf2', '男', '1', '', 1, 1, NULL, '2027-08-04 14:56:49', 'admin', '2020-05-11 14:07:04'); +INSERT INTO `jimu_dict_item` VALUES ('e05d424ee35c707d7bc20de3719fb3ae', '76c1d6755018a918c9eeda575dbf3f98', '块', '7', NULL, 7, 1, 'admin', '2019-01-23 23:01:36', 'admin', '2019-04-23 23:01:48'); +INSERT INTO `jimu_dict_item` VALUES ('e6329e3a66a003819e2eb830b0ca2ea0', '4e4602b3e3686f0911384e188dc7efb4', '小于', '<', '小于', 2, 1, 'admin', '2019-04-01 16:44:15', 'admin', '2019-04-01 17:48:34'); +INSERT INTO `jimu_dict_item` VALUES ('e8f34a36f38f35e2efb1aaa342509242', '78bda155fe380b1b3f175f1e88c284c6', '已挂起', '5', '已挂起', 5, 1, 'admin', '2019-05-23 16:12:42', 'admin', '2019-05-22 18:39:42'); +INSERT INTO `jimu_dict_item` VALUES ('e94eb7af89f1dbfa0d823580a7a6e66a', '236e8a4baff0db8c62c00dd95632834f', '不同步', '0', '不同步', 2, 1, 'admin', '2019-05-15 15:28:28', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('ecb788a9b71d3d11357c31a0febefaaa', '36d57175542a3ea85073923e8fccc21c', '男衬衫类', '2', NULL, 2, 1, 'admin', '2019-04-23 23:03:18', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('f16c5706f3ae05c57a53850c64ce7c45', 'a9d9942bd0eccb6e89de92d130ec4c4a', '发送成功', '1', NULL, 2, 1, 'admin', '2019-04-12 18:19:43', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('f2688992fffa5c62e31ce50bbb1919d9', '20863a840c7622c3eab0ee69e55a8c7c', '审核无误', '审核无误', '审核无误', 9, 1, 'admin', '2019-05-15 11:08:58', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('f2bda3b1ca643b789a2e712ad53b06fb', '36d57175542a3ea85073923e8fccc21c', '固定型号', '5', NULL, 5, 1, 'admin', '2019-04-23 23:03:47', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('f37f90c496ec9841c4c326b065e00bb2', '83bfb33147013cc81640d5fd9eda030c', '登录日志', '1', NULL, NULL, 1, 'admin', '2019-03-18 23:22:37', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('f64ca22c7a2d5793a271590e7b01eb6b', '76c1d6755018a918c9eeda575dbf3f98', '个', '5', NULL, 6, 1, 'admin', '2019-04-23 23:01:21', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('f753aff60ff3931c0ecb4812d8b5e643', '4c03fca6bf1f0299c381213961566349', '双排布局', 'double', NULL, 3, 1, 'admin', '2019-04-12 17:43:51', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('f80a8f6838215753b05e1a5ba3346d22', '880a895c98afeca9d9ac39f29e67c13e', '删除', '4', '', 4, 1, 'admin', '2019-07-22 10:55:14', 'admin', '2019-07-22 10:55:30'); +INSERT INTO `jimu_dict_item` VALUES ('fb80836f3e69d977303e56023cf4b0ca', '20863a840c7622c3eab0ee69e55a8c7c', '请处理', '请处理', '请处理', 5, 1, 'admin', '2019-05-15 11:06:57', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('fcec03570f68a175e1964808dc3f1c91', '4c03fca6bf1f0299c381213961566349', 'Tab风格', 'tab', NULL, 1, 1, 'admin', '2019-04-12 17:43:31', NULL, NULL); +INSERT INTO `jimu_dict_item` VALUES ('fe50b23ae5e68434def76f67cef35d2d', '78bda155fe380b1b3f175f1e88c284c6', '已作废', '4', '已作废', 4, 1, 'admin', '2021-09-09 16:33:43', 'admin', '2019-05-09 16:34:40'); + +-- ---------------------------- +-- Table structure for jimu_report +-- ---------------------------- +DROP TABLE IF EXISTS `jimu_report`; +CREATE TABLE `jimu_report` ( + `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键', + `code` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '编码', + `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '名称', + `note` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '说明', + `status` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '状态', + `type` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '类型', + `json_str` longtext CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT 'json字符串', + `api_url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '请求地址', + `thumb` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '缩略图', + `create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + `del_flag` tinyint(1) NULL DEFAULT NULL COMMENT '删除标识0-正常,1-已删除', + `api_method` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '请求方法0-get,1-post', + `api_code` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '请求编码', + `template` tinyint(1) NULL DEFAULT NULL COMMENT '是否是模板 0-是,1-不是', + `view_count` bigint(15) NULL DEFAULT 0 COMMENT '浏览次数', + `css_str` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT 'css增强', + `js_str` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT 'js增强', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `uniq_jmreport_code`(`code`) USING BTREE, + INDEX `uniq_jmreport_createby`(`create_by`) USING BTREE, + INDEX `uniq_jmreport_delflag`(`del_flag`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '在线excel设计器' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of jimu_report +-- ---------------------------- +INSERT INTO `jimu_report` VALUES ('01a1e07ed4b12348b29d5a47ac7f0228', '566960792', '销售公司出库单副本0792', '', NULL, 'printinfo', '{\"area\":{\"sri\":4,\"sci\":0,\"eri\":4,\"eci\":0,\"width\":32,\"height\":25},\"printElWidth\":794,\"excel_config_id\":\"ff9bd143582a6dfed897ba8b6f93b175\",\"printElHeight\":800,\"rows\":{\"0\":{\"cells\":{\"0\":{\"style\":11,\"text\":\"医疗器械销售公司出货单\",\"merge\":[0,9]}},\"height\":83},\"1\":{\"cells\":{\"0\":{\"text\":\"供货单位:\",\"style\":20,\"merge\":[0,1]},\"1\":{\"style\":30},\"2\":{\"text\":\"${gongsi.gname}\",\"style\":19},\"3\":{\"style\":19},\"4\":{\"text\":\"供货日期:\",\"style\":19},\"5\":{\"text\":\"${gongsi.gdata}\",\"style\":19,\"merge\":[0,1]},\"6\":{\"style\":19},\"7\":{\"text\":\"编号:\",\"style\":20},\"8\":{\"text\":\"${gongsi.num}\",\"style\":19,\"merge\":[0,1]},\"9\":{\"style\":19}},\"isDrag\":true},\"2\":{\"cells\":{\"0\":{\"text\":\"行号\",\"style\":39},\"1\":{\"text\":\"产品代码\",\"style\":39},\"2\":{\"text\":\"产品名称\",\"style\":39},\"3\":{\"text\":\"规格型号\",\"style\":39},\"4\":{\"text\":\"单位\",\"style\":39},\"5\":{\"text\":\"实发数量\",\"style\":39},\"6\":{\"text\":\"销售单价(元)\",\"style\":39},\"7\":{\"text\":\"折扣率(%)\",\"style\":39},\"8\":{\"text\":\"销售金额(元)\",\"style\":39},\"9\":{\"text\":\"备注\",\"style\":39}}},\"3\":{\"cells\":{\"0\":{\"style\":35,\"text\":\"#{xiaoshou.id}\"},\"1\":{\"style\":35,\"text\":\"#{xiaoshou.hnum}\"},\"2\":{\"style\":35,\"text\":\"#{xiaoshou.hname}\"},\"3\":{\"style\":35,\"text\":\"#{xiaoshou.xinghao}\"},\"4\":{\"style\":35,\"text\":\"#{xiaoshou.danwei}\"},\"5\":{\"style\":35,\"text\":\"#{xiaoshou.num}\"},\"6\":{\"style\":35,\"text\":\"#{xiaoshou.danjia}\"},\"7\":{\"style\":35,\"text\":\"#{xiaoshou.zhekoulv}\"},\"8\":{\"style\":35,\"text\":\"#{xiaoshou.xiaoshoujine}\"},\"9\":{\"style\":35,\"text\":\"#{xiaoshou.xiaoshoujine}\"}}},\"4\":{\"cells\":{\"0\":{\"style\":4},\"1\":{}},\"isDrag\":true},\"len\":84,\"-1\":{\"cells\":{\"0\":{\"text\":\"#{gongsi.gdata}\"},\"-1\":{\"text\":\"#{gongsi.didian}\"}},\"isDrag\":true}},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":794,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\"},{\"font\":{\"size\":16}},{\"font\":{\"size\":16},\"align\":\"center\"},{\"align\":\"center\"},{\"border\":{\"top\":[\"thin\",\"#000\"],\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"bottom\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"bottom\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"right\"},{\"align\":\"right\"},{\"align\":\"center\",\"font\":{\"size\":14}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true}},{\"align\":\"center\",\"font\":{\"size\":9}},{\"font\":{\"size\":9}},{\"align\":\"right\",\"font\":{\"size\":9}},{\"align\":\"center\",\"font\":{\"size\":8}},{\"font\":{\"size\":8}},{\"align\":\"right\",\"font\":{\"size\":8}},{\"align\":\"center\",\"font\":{\"size\":8},\"color\":\"#7f7f7f\"},{\"font\":{\"size\":8},\"color\":\"#7f7f7f\"},{\"align\":\"right\",\"font\":{\"size\":8},\"color\":\"#7f7f7f\"},{\"align\":\"center\",\"font\":{\"size\":8},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":8},\"color\":\"#3f3f3f\"},{\"align\":\"right\",\"font\":{\"size\":8},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"font\":{\"size\":8},\"color\":\"#262626\"},{\"font\":{\"size\":8},\"color\":\"#262626\"},{\"align\":\"right\",\"font\":{\"size\":8},\"color\":\"#262626\"},{\"align\":\"center\",\"font\":{\"size\":8},\"color\":\"#0c0c0c\"},{\"font\":{\"size\":8},\"color\":\"#0c0c0c\"},{\"align\":\"right\",\"font\":{\"size\":8},\"color\":\"#0c0c0c\"},{\"align\":\"right\",\"color\":\"#7f7f7f\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\",\"bgcolor\":\"#71ae47\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#71ae47\"},{\"border\":{\"bottom\":[\"thin\",\"#538136\"],\"top\":[\"thin\",\"#538136\"],\"left\":[\"thin\",\"#538136\"],\"right\":[\"thin\",\"#538136\"]},\"align\":\"center\",\"bgcolor\":\"#71ae47\"},{\"border\":{\"bottom\":[\"thin\",\"#538136\"],\"top\":[\"thin\",\"#538136\"],\"left\":[\"thin\",\"#538136\"],\"right\":[\"thin\",\"#538136\"]},\"bgcolor\":\"#71ae47\"},{\"border\":{\"bottom\":[\"thin\",\"#538136\"],\"top\":[\"thin\",\"#538136\"],\"left\":[\"thin\",\"#538136\"],\"right\":[\"thin\",\"#538136\"]},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#538136\"],\"top\":[\"thin\",\"#538136\"],\"left\":[\"thin\",\"#538136\"],\"right\":[\"thin\",\"#538136\"]}},{\"border\":{\"bottom\":[\"thin\",\"#538136\"],\"top\":[\"thin\",\"#538136\"],\"left\":[\"thin\",\"#538136\"],\"right\":[\"thin\",\"#538136\"]},\"align\":\"center\",\"bgcolor\":\"#c5e0b3\"},{\"border\":{\"bottom\":[\"thin\",\"#538136\"],\"top\":[\"thin\",\"#538136\"],\"left\":[\"thin\",\"#538136\"],\"right\":[\"thin\",\"#538136\"]},\"bgcolor\":\"#c5e0b3\"},{\"border\":{\"bottom\":[\"thin\",\"#538136\"],\"top\":[\"thin\",\"#538136\"],\"left\":[\"thin\",\"#538136\"],\"right\":[\"thin\",\"#538136\"]},\"align\":\"center\",\"bgcolor\":\"#a7d08c\"},{\"border\":{\"bottom\":[\"thin\",\"#538136\"],\"top\":[\"thin\",\"#538136\"],\"left\":[\"thin\",\"#538136\"],\"right\":[\"thin\",\"#538136\"]},\"bgcolor\":\"#a7d08c\"}],\"validations\":[],\"cols\":{\"0\":{\"width\":32},\"1\":{\"width\":65},\"2\":{\"width\":115},\"3\":{\"width\":70},\"4\":{\"width\":52},\"5\":{\"width\":70},\"6\":{\"width\":93},\"7\":{\"width\":86},\"8\":{\"width\":75},\"9\":{\"width\":136},\"10\":{\"width\":81},\"len\":24},\"merges\":[\"F2:G2\",\"F2:G2\",\"I2:J2\",\"A2:B2\",\"C2:D2\",\"A2:B2\",\"A1:J1\"]}', '', 'https://static.jeecg.com/designreport/images/医疗器械_1607070355110.png', 'admin', '2021-01-19 10:46:43', 'admin', '2021-02-02 19:00:59', 1, NULL, NULL, 0, 766, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('1314846205892759552', '20201010163252', 'XXX有限公司员工登记表', NULL, NULL, 'printinfo', '{\"loopBlockList\":[],\"area\":{\"sri\":10,\"sci\":11,\"eri\":10,\"eci\":11,\"width\":85,\"height\":38},\"excel_config_id\":\"1314846205892759552\",\"printConfig\":{\"paper\":\"A4\",\"width\":210,\"height\":297,\"definition\":1,\"isBackend\":false,\"marginX\":10,\"marginY\":10},\"rows\":{\"0\":{\"cells\":{\"0\":{\"merge\":[0,8]},\"9\":{}},\"height\":22},\"1\":{\"cells\":{\"1\":{\"style\":87,\"text\":\" \"},\"2\":{\"style\":87,\"text\":\" \"},\"3\":{\"style\":87,\"text\":\" \"},\"4\":{\"style\":87,\"text\":\" \"},\"5\":{\"style\":87,\"text\":\" \"},\"6\":{\"style\":87,\"text\":\" \"},\"7\":{\"style\":87,\"text\":\" \"},\"8\":{\"style\":87,\"text\":\" \"}},\"height\":24},\"2\":{\"cells\":{\"0\":{\"text\":\"所在部门\",\"style\":93},\"1\":{\"text\":\"${yuangongjiben.department}\",\"style\":23,\"merge\":[0,2]},\"4\":{\"text\":\"职务\",\"style\":93},\"5\":{\"text\":\"${yuangongjiben.post}\",\"style\":23},\"6\":{\"text\":\"填写日期\",\"style\":93},\"7\":{\"text\":\"${yuangongjiben.data}\",\"style\":23,\"merge\":[0,1]}},\"isDrag\":true,\"height\":36},\"3\":{\"cells\":{\"0\":{\"text\":\"姓名\",\"style\":93},\"1\":{\"text\":\"${yuangongjiben.name}\",\"style\":23},\"2\":{\"text\":\"性别\",\"style\":93},\"3\":{\"text\":\"${yuangongjiben.sex}\",\"style\":23},\"4\":{\"text\":\"出生日期\",\"style\":93},\"5\":{\"text\":\"${yuangongjiben.birth}\",\"style\":23},\"6\":{\"text\":\"政治面貌\",\"style\":93},\"7\":{\"text\":\"${yuangongjiben.political}\",\"style\":130,\"merge\":[0,1]}},\"isDrag\":true,\"height\":33},\"4\":{\"cells\":{\"0\":{\"text\":\"机关\",\"style\":93},\"1\":{\"text\":\"${yuangongjiben.office}\",\"style\":23},\"2\":{\"style\":93,\"text\":\"民族\"},\"3\":{\"text\":\"${yuangongjiben.nation}\",\"style\":23},\"4\":{\"style\":93,\"text\":\"健康状况\"},\"5\":{\"text\":\"${yuangongjiben.health}\",\"style\":23},\"6\":{\"style\":93,\"text\":\"户籍类型\",\"virtual\":\"1KT8bnqRT4bi8Z7b\"},\"7\":{\"text\":\"${yuangongjiben.register}\",\"style\":26,\"virtual\":\"1KT8bnqRT4bi8Z7b\"},\"8\":{\"merge\":[3,0],\"height\":104,\"style\":35,\"text\":\" \",\"virtual\":\"cvkWDQVZhfJPgcS4\"}},\"isDrag\":true,\"height\":31},\"5\":{\"cells\":{\"0\":{\"text\":\"最高学历\",\"style\":93},\"1\":{\"text\":\"${yuangongjiben.education}\",\"style\":23},\"2\":{\"text\":\"所学专业\",\"style\":93},\"3\":{\"text\":\"${yuangongjiben.major}\",\"style\":23,\"merge\":[0,2]},\"6\":{\"text\":\"毕业时间\",\"style\":93},\"7\":{\"text\":\"${yuangongjiben.gdata}\",\"style\":23}},\"isDrag\":true,\"height\":35},\"6\":{\"cells\":{\"0\":{\"text\":\"电子邮箱\",\"style\":93},\"1\":{\"text\":\"${yuangongjiben.mailbox}\",\"style\":23},\"2\":{\"text\":\"手机号\",\"style\":93},\"3\":{\"text\":\"${yuangongjiben.telphone}\",\"style\":23,\"merge\":[0,2]},\"6\":{\"text\":\"家庭电话\",\"style\":93},\"7\":{\"text\":\"${yuangongjiben.homephone}\",\"style\":23}},\"isDrag\":true,\"height\":38},\"7\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"第一次参加工作时间\",\"style\":93},\"2\":{\"text\":\"${yuangongjiben.pworktime}\",\"style\":133,\"merge\":[0,2]},\"5\":{\"style\":93,\"text\":\"入职时间\"},\"6\":{\"text\":\"${yuangongjiben.entrytime}\",\"style\":24,\"merge\":[0,1]}},\"isDrag\":true,\"height\":27},\"8\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"毕业院校\",\"style\":93},\"2\":{\"text\":\"${yuangongjiben.school}\",\"style\":24,\"merge\":[0,2]},\"5\":{\"style\":93,\"text\":\"身份证号\"},\"6\":{\"text\":\"${yuangongjiben.idcard}\",\"style\":24,\"merge\":[0,2]}},\"isDrag\":true,\"height\":34},\"9\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"入党(团)时间、地点\",\"style\":94},\"2\":{\"text\":\"${yuangongjiben.entrytime}\",\"style\":24,\"merge\":[0,2]},\"5\":{\"text\":\"婚姻状况\",\"style\":93},\"6\":{\"text\":\"${yuangongjiben.marital}\",\"style\":23},\"7\":{\"text\":\"有无子女\",\"style\":93},\"8\":{\"text\":\"${yuangongjiben.children}\",\"style\":23}},\"isDrag\":true,\"height\":33},\"10\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"户口所在街道名称\",\"style\":93},\"2\":{\"text\":\"${yuangongjiben.hukoustreet}\",\"style\":24,\"merge\":[0,2]},\"5\":{\"merge\":[0,1],\"text\":\"户口所在地邮编\",\"style\":93},\"7\":{\"text\":\"${yuangongjiben.hukounum}\",\"style\":23,\"merge\":[0,1]}},\"isDrag\":true,\"height\":38},\"11\":{\"cells\":{\"0\":{\"text\":\"户口所在地地址\",\"style\":96,\"merge\":[2,1]},\"2\":{\"text\":\"${yuangongjiben.hukoudi}\",\"style\":26,\"merge\":[2,6]}},\"isDrag\":true},\"12\":{\"cells\":{}},\"13\":{\"cells\":{\"11\":{\"text\":\"\"}},\"isDrag\":true},\"14\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"现居住地址\",\"style\":98},\"2\":{\"text\":\"${yuangongjiben.currentdi}\",\"style\":26,\"merge\":[0,2]},\"5\":{\"style\":98,\"merge\":[0,1],\"text\":\"现居住地址邮编\"},\"7\":{\"text\":\"${yuangongjiben.currentnum}\",\"style\":26,\"merge\":[0,1]}},\"isDrag\":true,\"height\":33},\"15\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"是否参加社保\",\"style\":98},\"2\":{\"text\":\"${yuangongjiben.socialsecurity}\",\"style\":27,\"merge\":[0,1]},\"4\":{\"text\":\"有无公积金\",\"style\":98},\"5\":{\"text\":\"${yuangongjiben.providentfund}\",\"style\":27,\"merge\":[0,1]},\"7\":{\"text\":\"兴趣爱好\",\"style\":98},\"8\":{\"text\":\"${yuangongjiben.hobby}\",\"style\":27}},\"isDrag\":true,\"height\":34},\"16\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"参加社保类型\",\"style\":98},\"2\":{\"text\":\"${yuangongjiben.sbtype}\",\"style\":116,\"merge\":[0,6]}},\"isDrag\":true,\"height\":30},\"17\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"个人档案存放地\",\"style\":98},\"2\":{\"text\":\"${yuangongjiben.archivesdi}\",\"style\":116,\"merge\":[0,6]}},\"isDrag\":true,\"height\":33},\"18\":{\"cells\":{\"0\":{\"text\":\" \",\"style\":7},\"1\":{\"text\":\" \",\"style\":7},\"2\":{\"text\":\" \",\"style\":7},\"3\":{\"text\":\" \",\"style\":7},\"4\":{\"text\":\" \",\"style\":7},\"5\":{\"text\":\" \",\"style\":7},\"6\":{\"text\":\" \",\"style\":7},\"7\":{\"text\":\" \",\"style\":7},\"8\":{\"text\":\" \",\"style\":7}}},\"19\":{\"cells\":{\"0\":{\"merge\":[0,4],\"text\":\"学历、经历(从高中开始写)\",\"style\":99},\"5\":{\"style\":7,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":112,\"text\":\" \"}}},\"20\":{\"cells\":{\"0\":{\"text\":\"由_年_月\",\"merge\":[0,1],\"style\":36},\"2\":{\"merge\":[0,1],\"text\":\"至_年_月\",\"style\":38},\"4\":{\"merge\":[0,1],\"text\":\"就读学校\",\"style\":38},\"6\":{\"merge\":[0,1],\"text\":\"专业\",\"style\":38},\"8\":{\"text\":\"担任职务\",\"style\":38},\"9\":{\"style\":112,\"text\":\" \"}}},\"21\":{\"cells\":{\"0\":{\"style\":90,\"merge\":[0,1],\"text\":\"#{xueli.kdate}\"},\"2\":{\"style\":90,\"text\":\"#{xueli.jdate}\",\"merge\":[0,1]},\"4\":{\"style\":90,\"text\":\"#{xueli.jstudent}\",\"merge\":[0,1]},\"6\":{\"style\":90,\"text\":\"#{xueli.zhuanye}\",\"merge\":[0,1]},\"8\":{\"style\":90,\"text\":\"#{xueli.zhiwu}\"},\"9\":{\"style\":112,\"text\":\" \"}},\"isDrag\":true},\"22\":{\"cells\":{\"0\":{\"style\":7,\"text\":\" \"},\"1\":{\"style\":7,\"text\":\" \"},\"2\":{\"style\":7,\"text\":\" \"},\"3\":{\"style\":7,\"text\":\" \"},\"4\":{\"style\":7,\"text\":\" \"},\"5\":{\"style\":7,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":112,\"text\":\" \"}}},\"23\":{\"cells\":{\"0\":{\"merge\":[0,4],\"text\":\"工作经历\",\"style\":124},\"5\":{\"style\":7,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":112,\"text\":\" \"}},\"height\":27},\"24\":{\"cells\":{\"0\":{\"text\":\"由_年_月\",\"merge\":[0,1],\"style\":36},\"2\":{\"merge\":[0,1],\"text\":\"至_年_月\",\"style\":38},\"4\":{\"text\":\"工作单位及职称\",\"style\":38,\"merge\":[0,1]},\"6\":{\"merge\":[0,1],\"text\":\"证明人\",\"style\":38},\"8\":{\"text\":\"联系方式\",\"style\":38},\"9\":{\"style\":112,\"text\":\" \"}}},\"25\":{\"cells\":{\"0\":{\"text\":\"#{uu.kdate}\",\"style\":90,\"merge\":[0,1]},\"2\":{\"text\":\"#{uu.jdate}\",\"style\":90,\"merge\":[0,1]},\"4\":{\"text\":\"#{uu.jstudent}\",\"style\":90,\"merge\":[0,1]},\"6\":{\"text\":\"#{uu.zmname}\",\"style\":90,\"merge\":[0,1]},\"8\":{\"text\":\"#{uu.zmphone}\",\"style\":90},\"9\":{\"style\":112,\"text\":\" \"}},\"isDrag\":true},\"26\":{\"cells\":{\"0\":{\"style\":7,\"text\":\" \"},\"1\":{\"style\":7,\"text\":\" \"},\"2\":{\"style\":7,\"text\":\" \"},\"3\":{\"style\":7,\"text\":\" \"},\"4\":{\"style\":7,\"text\":\" \"},\"5\":{\"style\":7,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":112,\"text\":\" \"}}},\"27\":{\"cells\":{\"0\":{\"merge\":[0,4],\"text\":\"职称/资格、证书\",\"style\":125},\"5\":{\"style\":7,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":112,\"text\":\" \"}},\"height\":46},\"28\":{\"cells\":{\"0\":{\"text\":\"发证时间\",\"merge\":[0,1],\"style\":36},\"2\":{\"merge\":[0,1],\"text\":\"职称名称\",\"style\":38},\"4\":{\"text\":\"级别\",\"style\":38,\"merge\":[0,1]},\"6\":{\"text\":\"发证单位\",\"style\":38,\"merge\":[0,1]},\"8\":{\"text\":\"备注\",\"style\":38},\"9\":{\"style\":112,\"text\":\" \"}}},\"29\":{\"cells\":{\"0\":{\"text\":\"#{zhengshu.fdate}\",\"style\":90,\"merge\":[0,1]},\"2\":{\"text\":\"#{zhengshu.zcname}\",\"style\":90,\"merge\":[0,1]},\"4\":{\"text\":\"#{zhengshu.jibie}\",\"style\":90,\"merge\":[0,1]},\"6\":{\"text\":\"#{zhengshu.danwei}\",\"style\":90,\"merge\":[0,1]},\"8\":{\"text\":\"#{zhengshu.beizhu}\",\"style\":90},\"9\":{\"style\":112,\"text\":\" \"}},\"isDrag\":true},\"30\":{\"cells\":{\"0\":{\"style\":7,\"text\":\" \"},\"1\":{\"style\":7,\"text\":\" \"},\"2\":{\"style\":7,\"text\":\" \"},\"3\":{\"style\":7,\"text\":\" \"},\"4\":{\"style\":7,\"text\":\" \"},\"5\":{\"style\":7,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":112,\"text\":\" \"}}},\"31\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"家庭成员\",\"style\":125},\"2\":{\"style\":7,\"text\":\" \"},\"3\":{\"style\":7,\"text\":\" \"},\"4\":{\"style\":7,\"text\":\" \"},\"5\":{\"style\":7,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":112,\"text\":\" \"}},\"height\":42},\"32\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"姓名\",\"style\":38},\"2\":{\"merge\":[0,1],\"text\":\"关系\",\"style\":38},\"4\":{\"text\":\"年龄\",\"style\":38},\"5\":{\"text\":\"工作单位\",\"style\":38,\"merge\":[0,1]},\"7\":{\"text\":\"政治面貌\",\"style\":38},\"8\":{\"text\":\"联系方式\",\"style\":38},\"9\":{\"style\":112,\"text\":\" \"}}},\"33\":{\"cells\":{\"0\":{\"text\":\"#{jtcy.name}\",\"style\":90,\"merge\":[0,1]},\"2\":{\"text\":\"#{jtcy.guanxi}\",\"style\":90,\"merge\":[0,1]},\"4\":{\"text\":\"#{jtcy.age}\",\"style\":90},\"5\":{\"text\":\"#{jtcy.danwei}\",\"style\":90,\"merge\":[0,1]},\"7\":{\"text\":\"#{jtcy.zzmm}\",\"style\":90},\"8\":{\"text\":\"#{jtcy.phone}\",\"style\":90},\"9\":{\"style\":112,\"text\":\" \"}},\"isDrag\":true},\"34\":{\"cells\":{\"0\":{\"text\":\" \",\"style\":7},\"1\":{\"text\":\" \",\"style\":7},\"2\":{\"text\":\" \",\"style\":7},\"3\":{\"text\":\" \",\"style\":7},\"4\":{\"text\":\" \",\"style\":7},\"5\":{\"text\":\" \",\"style\":7},\"6\":{\"text\":\" \",\"style\":7},\"7\":{\"text\":\" \",\"style\":7},\"8\":{\"text\":\" \",\"style\":7},\"9\":{\"style\":112,\"text\":\" \"}}},\"35\":{\"cells\":{\"0\":{\"merge\":[0,2],\"text\":\"所获奖励\",\"style\":125},\"3\":{\"text\":\" \",\"style\":7},\"4\":{\"text\":\" \",\"style\":7},\"5\":{\"text\":\" \",\"style\":7},\"6\":{\"text\":\" \",\"style\":7},\"7\":{\"text\":\" \",\"style\":7},\"8\":{\"text\":\" \",\"style\":7},\"9\":{\"style\":112,\"text\":\" \"}},\"height\":47},\"36\":{\"cells\":{\"0\":{\"text\":\"时间\",\"style\":90,\"merge\":[0,2]},\"3\":{\"style\":90,\"text\":\"地点\",\"merge\":[0,2]},\"6\":{\"style\":90,\"text\":\"所获得的奖励名称\",\"merge\":[0,2]},\"9\":{\"style\":112,\"text\":\" \"}}},\"37\":{\"cells\":{\"0\":{\"text\":\"#{jiangli.date}\",\"style\":90,\"merge\":[0,2]},\"3\":{\"text\":\"#{jiangli.didian}\",\"style\":90,\"merge\":[0,2]},\"6\":{\"text\":\"#{jiangli.mingcheng}\",\"style\":90,\"merge\":[0,2]},\"9\":{\"style\":112,\"text\":\" \"}},\"isDrag\":true},\"len\":98},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":718,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":703,\"displayConfig\":{},\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":16}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true}},{\"align\":\"center\",\"font\":{\"name\":\"仿宋\"}},{\"font\":{\"name\":\"仿宋\"}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":12}},{\"font\":{\"name\":\"宋体\",\"size\":12}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":8}},{\"font\":{\"name\":\"宋体\",\"size\":8}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":10}},{\"font\":{\"name\":\"宋体\",\"size\":10}},{\"align\":\"center\",\"font\":{\"name\":\"隶书\",\"size\":10}},{\"font\":{\"name\":\"隶书\",\"size\":10}},{\"align\":\"center\",\"font\":{\"name\":\"华文中宋\",\"size\":10}},{\"font\":{\"name\":\"华文中宋\",\"size\":10}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\",\"size\":10}},{\"font\":{\"name\":\"Microsoft YaHei\",\"size\":10}},{\"textwrap\":true},{\"textwrap\":true,\"align\":\"center\"},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"bold\":true}},{\"font\":{\"bold\":true,\"size\":12}},{\"font\":{\"bold\":true,\"size\":10}},{\"font\":{\"bold\":true,\"size\":10},\"align\":\"center\"},{\"font\":{\"bold\":true},\"align\":\"center\"},{\"font\":{\"bold\":true,\"size\":10},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"bold\":true},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"bold\":true,\"size\":10,\"name\":\"宋体\"},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"bold\":true,\"size\":10,\"name\":\"宋体\"},\"align\":\"center\"},{\"font\":{\"bold\":true,\"name\":\"宋体\"},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"bold\":true,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true},\"border\":{\"top\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true},\"border\":{\"top\":[\"medium\",\"#000\"]}},{\"border\":{\"top\":[\"medium\",\"#000\"],\"right\":[\"medium\",\"#000\"]}},{\"border\":{\"left\":[\"medium\",\"#000\"]}},{\"border\":{\"right\":[\"medium\",\"#000\"]}},{\"border\":{\"bottom\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"]}},{\"border\":{\"bottom\":[\"medium\",\"#000\"]}},{\"border\":{\"bottom\":[\"medium\",\"#000\"],\"right\":[\"medium\",\"#000\"]}},{\"border\":{\"top\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true,\"name\":\"Microsoft YaHei\"},\"border\":{\"top\":[\"medium\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true,\"name\":\"Microsoft YaHei\"}},{\"border\":{\"top\":[\"medium\",\"#000\"],\"right\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"left\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"right\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"font\":{\"name\":\"Microsoft YaHei\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"Microsoft YaHei\"}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\"}},{\"font\":{\"name\":\"Microsoft YaHei\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\"}},{\"font\":{\"bold\":true,\"size\":10,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"bold\":true,\"size\":10,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"font\":{\"bold\":true,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"bold\":true,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"bottom\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"bottom\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"bottom\":[\"medium\",\"#000\"],\"right\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\",\"size\":8},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"Microsoft YaHei\",\"size\":8}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\",\"size\":9},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\",\"size\":8}},{\"border\":{\"top\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true,\"name\":\"宋体\"},\"border\":{\"top\":[\"medium\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true,\"name\":\"宋体\"}},{\"border\":{\"left\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":8},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":10,\"bold\":true},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"宋体\",\"size\":10,\"bold\":true},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"宋体\",\"size\":10,\"bold\":true}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"bold\":true},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"bold\":true}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"bold\":true},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"宋体\",\"bold\":true}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true,\"name\":\"宋体\"},\"border\":{\"top\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"left\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true,\"name\":\"宋体\"},\"border\":{\"top\":[\"thin\",\"#ffffff\"]}},{\"border\":{\"top\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"left\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"right\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"left\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"left\",\"font\":{\"name\":\"宋体\"}},{\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"name\":\"宋体\",\"bold\":true},\"align\":\"right\"},{\"font\":{\"name\":\"宋体\",\"bold\":true},\"align\":\"right\",\"valign\":\"bottom\"},{\"font\":{\"name\":\"宋体\",\"bold\":true},\"align\":\"left\",\"valign\":\"bottom\"},{\"font\":{\"name\":\"宋体\",\"bold\":true},\"valign\":\"bottom\"},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"name\":\"宋体\",\"size\":10,\"bold\":true},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"bold\":true},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"format\":\"datetime\"},{\"font\":{\"name\":\"宋体\",\"size\":10},\"format\":\"datetime\"},{\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"format\":\"normal\"},{\"font\":{\"name\":\"宋体\",\"size\":10},\"format\":\"normal\"}],\"validations\":[],\"cols\":{\"0\":{\"width\":73},\"1\":{\"width\":71},\"2\":{\"width\":69},\"3\":{\"width\":89},\"4\":{\"width\":64},\"5\":{\"width\":47},\"6\":{\"width\":68},\"7\":{\"width\":100},\"8\":{\"width\":103},\"9\":{\"width\":19},\"10\":{\"width\":146},\"11\":{\"width\":85},\"len\":50},\"merges\":[\"H3:I3\",\"B3:D3\",\"A2:I2\",\"D6:F6\",\"D7:F7\",\"A8:B8\",\"G8:H8\",\"A9:B9\",\"A10:B10\",\"C10:E10\",\"C8:E8\",\"C9:E9\",\"A11:B11\",\"C11:E11\",\"F11:G11\",\"H11:I11\",\"C12:I14\",\"A15:B15\",\"C15:E15\",\"F15:G15\",\"H15:I15\",\"A16:B16\",\"A17:B17\",\"A18:B18\",\"C17:I17\",\"C18:I18\",\"A20:E20\",\"A21:B21\",\"C21:D21\",\"E21:F21\",\"G21:H21\",\"A22:B22\",\"A24:E24\",\"A25:B25\",\"C25:D25\",\"G25:H25\",\"A26:B26\",\"A28:E28\",\"A29:B29\",\"C29:D29\",\"A30:B30\",\"A32:B32\",\"A33:B33\",\"C33:D33\",\"A34:B34\",\"C34:D34\",\"A36:C36\",\"C16:D16\",\"F16:G16\",\"QAAAAAACI1:JAAAAAABJ38\",\"A1:I1\",\"H4:I4\",\"G9:I9\",\"G22:H22\",\"E22:F22\",\"C22:D22\",\"C26:D26\",\"G26:H26\",\"C30:D30\",\"G30:H30\",\"E30:F30\",\"D37:F37\",\"D38:F38\",\"A38:C38\",\"A37:C37\",\"G37:I37\",\"G38:I38\",\"E29:F29\",\"G29:H29\",\"E25:F25\",\"E26:F26\",\"F33:G33\",\"F34:G34\",\"A12:B14\",\"I5:I8\"],\"imgList\":[{\"row\":4,\"col\":8,\"width\":\"101\",\"height\":\"128\",\"src\":\"https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/images/QQ截图20210115102648_1610694177544_1617244906979.png\",\"layer_id\":\"cvkWDQVZhfJPgcS4\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[4,8]]}]}', NULL, 'https://static.jeecg.com/designreport/images/1122_1607312336469.png', 'admin', '2020-10-10 16:32:53', 'admin', '2021-06-30 10:16:00', 0, NULL, NULL, 1, 607, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('1316944968992034816', '20201016113231', '员工信息登记', NULL, NULL, 'printinfo', '{\"loopBlockList\":[],\"area\":false,\"printElWidth\":718,\"excel_config_id\":\"1316944968992034816\",\"printElHeight\":1047,\"rows\":{\"1\":{\"cells\":{\"0\":{\"text\":\"员工信息登记表\",\"merge\":[0,6],\"style\":28},\"1\":{\"style\":21,\"text\":\" \"},\"2\":{\"style\":21,\"text\":\" \"},\"3\":{\"style\":21,\"text\":\" \"},\"4\":{\"style\":21,\"text\":\" \"},\"5\":{\"style\":21,\"text\":\" \"},\"6\":{\"style\":21,\"text\":\" \"}},\"height\":46},\"2\":{\"cells\":{\"0\":{\"text\":\"编号:\",\"style\":29},\"1\":{\"text\":\"${employee.num}\",\"style\":30,\"merge\":[0,3]},\"2\":{\"text\":\" \",\"style\":24},\"3\":{\"text\":\" \",\"style\":24},\"4\":{\"text\":\" \",\"style\":24},\"5\":{\"text\":\"填写日期:\",\"style\":29},\"6\":{\"text\":\"${employee.create_time}\",\"style\":36}},\"isDrag\":true,\"height\":44},\"3\":{\"cells\":{\"0\":{\"text\":\"姓名:\",\"style\":29},\"1\":{\"text\":\"${employee.name}\",\"style\":30},\"2\":{\"text\":\"性别:\",\"style\":29},\"3\":{\"text\":\"${employee.sex}\",\"style\":30},\"4\":{\"text\":\"出生年月:\",\"style\":29},\"5\":{\"text\":\"${employee.birthday}\",\"style\":36},\"6\":{\"style\":3,\"text\":\" \",\"merge\":[4,0],\"virtual\":\"Ym8ny6lYTdutY5tT\"}},\"isDrag\":true,\"height\":42},\"4\":{\"cells\":{\"0\":{\"text\":\"民族:\",\"style\":29},\"1\":{\"text\":\"${employee.nation}\",\"style\":30},\"2\":{\"text\":\"政治面貌:\",\"style\":29},\"3\":{\"text\":\"${employee.political}\",\"style\":30},\"4\":{\"text\":\"籍贯:\",\"style\":29},\"5\":{\"text\":\"${employee.native_place}\",\"style\":30}},\"isDrag\":true,\"height\":38},\"5\":{\"cells\":{\"0\":{\"text\":\"身高(cm):\",\"style\":29},\"1\":{\"text\":\"${employee.height}\",\"style\":30},\"2\":{\"text\":\"体重(kg):\",\"style\":29},\"3\":{\"text\":\"${employee.weight}\",\"style\":30},\"4\":{\"text\":\"健康状况:\",\"style\":29},\"5\":{\"text\":\"${employee.health}\",\"style\":30}},\"isDrag\":true,\"height\":38},\"6\":{\"cells\":{\"0\":{\"text\":\"身份证号:\",\"style\":29},\"1\":{\"text\":\"${employee.id_card}\",\"style\":30,\"merge\":[0,2]},\"2\":{\"text\":\" \",\"style\":24},\"3\":{\"text\":\" \",\"style\":24},\"4\":{\"text\":\"学历:\",\"style\":29},\"5\":{\"text\":\"${employee.education}\",\"style\":30}},\"isDrag\":true,\"height\":40},\"7\":{\"cells\":{\"0\":{\"text\":\"毕业学校:\",\"style\":29},\"1\":{\"text\":\"${employee.school}\",\"style\":30,\"merge\":[0,2]},\"2\":{\"text\":\" \",\"style\":24},\"3\":{\"text\":\" \",\"style\":24},\"4\":{\"text\":\"专业:\",\"style\":29},\"5\":{\"text\":\"${employee.major}\",\"style\":30}},\"isDrag\":true,\"height\":44},\"8\":{\"cells\":{\"0\":{\"text\":\"联系地址:\",\"style\":29},\"1\":{\"text\":\"${employee.address}\",\"style\":30,\"merge\":[0,2]},\"2\":{\"text\":\" \",\"style\":24},\"3\":{\"text\":\" \",\"style\":24},\"4\":{\"text\":\"邮编:\",\"style\":29},\"5\":{\"text\":\"${employee.zip_code}\",\"style\":30,\"merge\":[0,1]},\"6\":{\"text\":\" \",\"style\":24}},\"isDrag\":true,\"height\":45},\"9\":{\"cells\":{\"0\":{\"text\":\"Email:\",\"style\":29},\"1\":{\"text\":\"${employee.email}\",\"style\":30,\"merge\":[0,2]},\"2\":{\"text\":\" \",\"style\":24},\"3\":{\"text\":\" \",\"style\":24},\"4\":{\"text\":\"手机号:\",\"style\":29},\"5\":{\"text\":\"${employee.phone}\",\"style\":30,\"merge\":[0,1]},\"6\":{\"text\":\" \",\"style\":24}},\"isDrag\":true,\"height\":40},\"10\":{\"cells\":{\"0\":{\"text\":\"外语语种:\",\"style\":29},\"1\":{\"text\":\"${employee.foreign_language}\",\"style\":30},\"2\":{\"text\":\"外语水平:\",\"style\":29},\"3\":{\"text\":\"${employee.foreign_language_level}\",\"style\":30},\"4\":{\"text\":\"计算机水平:\",\"style\":29},\"5\":{\"text\":\"${employee.computer_level}\",\"style\":30,\"merge\":[0,1]},\"6\":{\"text\":\" \",\"style\":24}},\"isDrag\":true,\"height\":41},\"11\":{\"cells\":{\"0\":{\"text\":\"毕业时间:\",\"style\":29},\"1\":{\"text\":\"${employee.graduation_time}\",\"style\":34},\"2\":{\"text\":\"到职时间:\",\"style\":29},\"3\":{\"text\":\"${employee.arrival_time}\",\"style\":34},\"4\":{\"text\":\"职称:\",\"style\":29},\"5\":{\"text\":\"${employee.positional_titles}\",\"style\":30,\"merge\":[0,1]},\"6\":{\"text\":\" \",\"style\":24}},\"isDrag\":true,\"height\":42},\"12\":{\"cells\":{\"0\":{\"text\":\"教育经历:\",\"style\":32},\"1\":{\"text\":\"\",\"style\":35,\"merge\":[0,5]},\"2\":{\"text\":\" \",\"style\":40},\"3\":{\"text\":\" \",\"style\":40},\"4\":{\"text\":\" \",\"style\":40},\"5\":{\"text\":\" \",\"style\":40},\"6\":{\"text\":\" \",\"style\":40}},\"isDrag\":true,\"height\":39},\"13\":{\"cells\":{\"0\":{\"text\":\"${employee.education_experience}\",\"style\":33,\"merge\":[0,6]},\"1\":{\"style\":27,\"text\":\" \"},\"2\":{\"style\":27,\"text\":\" \"},\"3\":{\"style\":27,\"text\":\" \"},\"4\":{\"style\":27,\"text\":\" \"},\"5\":{\"style\":27,\"text\":\" \"},\"6\":{\"style\":27,\"text\":\" \"}},\"isDrag\":true,\"height\":70},\"14\":{\"cells\":{\"0\":{\"text\":\"工作经历:\",\"style\":32},\"1\":{\"merge\":[0,5],\"style\":30,\"text\":\" \"},\"2\":{\"text\":\" \",\"style\":24},\"3\":{\"text\":\" \",\"style\":24},\"4\":{\"text\":\" \",\"style\":24},\"5\":{\"text\":\" \",\"style\":24},\"6\":{\"text\":\" \",\"style\":24}},\"height\":43},\"15\":{\"cells\":{\"0\":{\"text\":\"${employee.work_experience}\",\"style\":30,\"merge\":[0,6]},\"1\":{\"text\":\" \",\"style\":24},\"2\":{\"text\":\" \",\"style\":24},\"3\":{\"text\":\" \",\"style\":24},\"4\":{\"text\":\" \",\"style\":24},\"5\":{\"text\":\" \",\"style\":24},\"6\":{\"text\":\" \",\"style\":24}},\"isDrag\":true,\"height\":61},\"17\":{\"cells\":{\"1\":{\"text\":\"\",\"style\":37}}},\"len\":100},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":718,\"heightPx\":1047},\"dicts\":[\"sex1\"],\"freeze\":\"A1\",\"dataRectWidth\":712,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true}},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":16}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"bold\":true}},{\"font\":{\"bold\":true}},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":16},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"bold\":false}},{\"font\":{\"bold\":false}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"bold\":true},\"align\":\"right\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":16},\"border\":{\"bottom\":[\"thin\",\"#a5a5a5\"],\"top\":[\"thin\",\"#a5a5a5\"],\"left\":[\"thin\",\"#a5a5a5\"],\"right\":[\"thin\",\"#a5a5a5\"]}},{\"border\":{\"bottom\":[\"thin\",\"#a5a5a5\"],\"top\":[\"thin\",\"#a5a5a5\"],\"left\":[\"thin\",\"#a5a5a5\"],\"right\":[\"thin\",\"#a5a5a5\"]},\"font\":{\"bold\":true},\"align\":\"right\"},{\"border\":{\"bottom\":[\"thin\",\"#a5a5a5\"],\"top\":[\"thin\",\"#a5a5a5\"],\"left\":[\"thin\",\"#a5a5a5\"],\"right\":[\"thin\",\"#a5a5a5\"]}},{\"border\":{\"bottom\":[\"thin\",\"#a5a5a5\"],\"top\":[\"thin\",\"#a5a5a5\"],\"left\":[\"thin\",\"#a5a5a5\"],\"right\":[\"thin\",\"#a5a5a5\"]},\"font\":{\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#a5a5a5\"],\"top\":[\"thin\",\"#a5a5a5\"],\"left\":[\"thin\",\"#a5a5a5\"],\"right\":[\"thin\",\"#a5a5a5\"]},\"font\":{\"bold\":false}},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":16},\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]}},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"font\":{\"bold\":true},\"align\":\"right\"},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]}},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"font\":{\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"font\":{\"bold\":false}},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":16,\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]}},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":16,\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"font\":{\"bold\":true,\"name\":\"宋体\"},\"align\":\"right\"},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"font\":{\"name\":\"宋体\"}},{\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"font\":{\"bold\":true,\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"font\":{\"bold\":false,\"name\":\"宋体\"}},{\"font\":{\"bold\":false,\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":16,\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"bold\":true,\"name\":\"宋体\"},\"align\":\"right\"},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"bold\":true,\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"bold\":false,\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"name\":\"宋体\"},\"format\":\"date2\"},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"name\":\"宋体\"},\"format\":\"normal\"},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"name\":\"宋体\"},\"format\":\"date\"},{\"format\":\"date2\"},{\"font\":{\"name\":\"宋体\"},\"format\":\"date2\"},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"name\":\"宋体\"},\"format\":\"time\"},{\"font\":{\"name\":\"宋体\"},\"format\":\"normal\"}],\"validations\":[],\"cols\":{\"0\":{\"width\":79},\"1\":{\"width\":92},\"2\":{\"width\":76},\"3\":{\"width\":106},\"5\":{\"width\":123},\"6\":{\"width\":136},\"len\":50},\"merges\":[\"A2:G2\",\"B3:E3\",\"B7:D7\",\"B8:D8\",\"B9:D9\",\"B10:D10\",\"F9:G9\",\"F10:G10\",\"F11:G11\",\"F12:G12\",\"B13:G13\",\"A14:G14\",\"B15:G15\",\"A16:G16\",\"G4:G8\"],\"imgList\":[{\"row\":3,\"col\":6,\"width\":\"135\",\"height\":\"192\",\"src\":\"https://static.jeecg.com/designreport/images/QQ截图20210108095848_1610071294294.png\",\"layer_id\":\"Ym8ny6lYTdutY5tT\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[3,6]]}]}', NULL, 'https://static.jeecg.com/designreport/images/1133_1607312428261.png', 'admin', '2020-10-16 11:32:32', 'admin', '2021-07-13 05:39:23', 0, NULL, NULL, 1, 1412, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('1331503965770223616', '20201125155042', '房屋销售综合展示大屏', NULL, NULL, 'chartinfo', '{\"loopBlockList\":[],\"chartList\":[{\"row\":1,\"col\":1,\"colspan\":0,\"rowspan\":0,\"width\":\"338\",\"height\":\"378\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":0,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"data\\\":[\\\"缤纷南郡\\\",\\\"中航华府\\\",\\\"3中家属楼\\\",\\\"幸福家园\\\",\\\"水晶国际\\\",\\\"绿城小区\\\",\\\"缤纷南郡二期\\\",\\\"国奥家园\\\",\\\"西西胡同\\\",\\\"融创学府\\\",\\\"蓝湾国际\\\",\\\"广发小区\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type\\\":\\\"category\\\"},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type \\\":\\\"value\\\"},\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"房子\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"grid\\\":{\\\"top\\\":60,\\\"left\\\":71,\\\"bottom\\\":39,\\\"right\\\":29},\\\"series\\\":[{\\\"barWidth\\\":13,\\\"data\\\":[2,2,2,3,4,3,3,5,2,7,4,8],\\\"name\\\":\\\"房子\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"\\\",\\\"barBorderRadius\\\":7},\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"top\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":2,\\\"typeData\\\":[]}],\\\"tooltip\\\":{\\\"show\\\":true,\\\"axisPointer\\\":{\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"padding\\\":[5,20,5,20],\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"各楼盘成交量排名\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"14\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"top\\\":10}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1331511745851731969\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"chengjiao\",\"chartType\":\"bar.multi.horizontal\",\"isTiming\":true,\"intervalTime\":\"5\"},\"layer_id\":\"5ggWQtDUvSopC4iL\",\"offsetX\":0,\"offsetY\":0,\"backgroud\":{\"enabled\":false,\"color\":\"#fff\",\"image\":\"\"},\"virtualCellRange\":[[1,1],[1,2],[1,3]]},{\"row\":1,\"col\":12,\"colspan\":0,\"rowspan\":0,\"width\":\"327\",\"height\":\"152\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":12}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"name\\\":\\\"\\\",\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":34,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"data\\\":[\\\"高层\\\",\\\"小高层\\\",\\\"写字楼\\\",\\\"厂房\\\",\\\"公寓\\\",\\\"别墅\\\",\\\"厂房\\\",\\\"四合院\\\",\\\"loft\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"name\\\":\\\"\\\",\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false}},\\\"grid\\\":{\\\"top\\\":50,\\\"left\\\":30,\\\"bottom\\\":44,\\\"right\\\":24},\\\"series\\\":[{\\\"areaStyle\\\":null,\\\"data\\\":[20,25,10,5,9,1,5,1,20],\\\"showSymbol\\\":true,\\\"lineStyle\\\":{\\\"width\\\":2},\\\"symbolSize\\\":5,\\\"isArea\\\":false,\\\"name\\\":\\\"\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#D04672\\\"},\\\"step\\\":false,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"top\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"line\\\",\\\"smooth\\\":true}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":10,\\\"text\\\":\\\"房形分析\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,10]}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1331922734933987329\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"fangyuan\",\"chartType\":\"line.smooth\",\"isTiming\":true,\"intervalTime\":\"5\"},\"layer_id\":\"nk6I2RCefm9scS1k\",\"offsetX\":0,\"offsetY\":0,\"backgroud\":{\"enabled\":false,\"color\":\"#fff\",\"image\":\"\"},\"virtualCellRange\":[[1,12],[1,13],[1,14],[1,15]]},{\"row\":7,\"col\":12,\"colspan\":0,\"rowspan\":0,\"width\":\"324\",\"height\":\"215\",\"config\":\"{\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"1室\\\",\\\"2室\\\",\\\"3室\\\",\\\"4室\\\",\\\"5室\\\"],\\\"top\\\":\\\"bottom\\\",\\\"orient\\\":\\\"vertical\\\",\\\"left\\\":\\\"right\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"series\\\":[{\\\"isRose\\\":false,\\\"data\\\":[{\\\"name\\\":\\\"1室\\\",\\\"value\\\":10,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(53,165,180,1)\\\"}},{\\\"name\\\":\\\"2室\\\",\\\"value\\\":30,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(60,140,198,1)\\\"}},{\\\"name\\\":\\\"3室\\\",\\\"value\\\":20,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(93,144,81,1)\\\"}},{\\\"name\\\":\\\"4室\\\",\\\"value\\\":5,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(191,146,68,1)\\\"}},{\\\"name\\\":\\\"5室\\\",\\\"value\\\":3,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(188,69,117,1)\\\"}}],\\\"isRadius\\\":true,\\\"roseType\\\":\\\"\\\",\\\"notCount\\\":false,\\\"center\\\":[\\\"160\\\",\\\"120\\\"],\\\"name\\\":\\\"\\\",\\\"minAngle\\\":0,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"outside\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"\\\",\\\"fontSize\\\":\\\"8\\\",\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"40%\\\",\\\"50%\\\"],\\\"autoSort\\\":false}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":10,\\\"text\\\":\\\"不同户型销售\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,10]}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1331919172472524801\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"huxingxiaoshou\",\"chartType\":\"pie.doughnut\",\"isTiming\":true,\"intervalTime\":\"5\",\"id\":\"MCJP8uqwe57YoCvF\"},\"layer_id\":\"MCJP8uqwe57YoCvF\",\"offsetX\":0,\"offsetY\":0,\"backgroud\":{\"enabled\":false,\"color\":\"#fff\",\"image\":\"\"},\"virtualCellRange\":[[7,12],[7,13],[7,14],[7,15]]},{\"row\":7,\"col\":4,\"colspan\":0,\"rowspan\":0,\"width\":\"662\",\"height\":\"222\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type \\\":\\\"value\\\"},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":0,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"data\\\":[\\\"1月\\\",\\\"2月\\\",\\\"3月\\\",\\\"4月\\\",\\\"5月\\\",\\\"6月\\\",\\\"7月\\\",\\\"8月\\\",\\\"9月\\\",\\\"10月\\\",\\\"11月\\\",\\\"12月\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#A98E8E\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type\\\":\\\"category\\\"},\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"成交量\\\",\\\"成交价\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"vertical\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#FBF8F8\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"grid\\\":{\\\"top\\\":58,\\\"left\\\":30,\\\"bottom\\\":43,\\\"right\\\":32},\\\"series\\\":[{\\\"barWidth\\\":15,\\\"stack\\\":\\\"1\\\",\\\"data\\\":[10,7,5,5,7,9,3,6,5,8,6,6],\\\"name\\\":\\\"成交量\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#37A5B1\\\",\\\"barBorderRadius\\\":13},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":7,\\\"typeData\\\":[{\\\"name\\\":\\\"成交量\\\",\\\"type\\\":\\\"\\\",\\\"_index\\\":0,\\\"_rowKey\\\":136,\\\"stack\\\":\\\"1\\\"},{\\\"name\\\":\\\"成交价\\\",\\\"type\\\":\\\"\\\",\\\"stack\\\":\\\"1\\\",\\\"_index\\\":1,\\\"_rowKey\\\":139}]},{\\\"barWidth\\\":15,\\\"stack\\\":\\\"1\\\",\\\"data\\\":[5,5,12,5,5,5,5,10,5,5,5,5],\\\"name\\\":\\\"成交价\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#2E72A7\\\",\\\"barBorderRadius\\\":13},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":7,\\\"typeData\\\":[{\\\"name\\\":\\\"成交量\\\",\\\"type\\\":\\\"\\\",\\\"_index\\\":0,\\\"_rowKey\\\":136,\\\"stack\\\":\\\"1\\\"},{\\\"name\\\":\\\"成交价\\\",\\\"type\\\":\\\"\\\",\\\"stack\\\":\\\"1\\\",\\\"_index\\\":1,\\\"_rowKey\\\":139}]}],\\\"tooltip\\\":{\\\"show\\\":true,\\\"axisPointer\\\":{\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"padding\\\":[5,20,5,20],\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"成交量和成交价趋势\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"14\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"top\\\":10}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1331872643531526146\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"chengjiao1\",\"chartType\":\"bar.stack\",\"chartId\":\"\",\"isTiming\":true,\"intervalTime\":\"5\"},\"layer_id\":\"Nf6Xud4fZqEfvQw4\",\"offsetX\":0,\"offsetY\":0,\"backgroud\":{\"enabled\":false,\"color\":\"#fff\",\"image\":\"\"},\"virtualCellRange\":[[7,4],[7,5],[7,6],[7,7],[7,8],[7,9],[7,10],[7,11]]},{\"row\":16,\"col\":12,\"colspan\":0,\"rowspan\":0,\"width\":\"326\",\"height\":\"200\",\"config\":\"{\\\"radar\\\":[{\\\"indicator\\\":[{\\\"name\\\":\\\"房产证\\\",\\\"max\\\":520},{\\\"name\\\":\\\"购房发票\\\",\\\"max\\\":310},{\\\"name\\\":\\\"购房合同\\\",\\\"max\\\":380},{\\\"name\\\":\\\"预售合同\\\",\\\"max\\\":450},{\\\"name\\\":\\\"抵押合同\\\",\\\"max\\\":600},{\\\"name\\\":\\\"预收合同\\\",\\\"max\\\":350}],\\\"shape\\\":\\\"polygon\\\",\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"gray\\\",\\\"opacity\\\":0.5}},\\\"center\\\":[\\\"50%\\\",\\\"50%\\\"],\\\"name\\\":{\\\"formatter\\\":\\\"【{value}】\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#72ACD1\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"gray\\\",\\\"opacity\\\":0.5}}}],\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"售后产权\\\",\\\"单位产权\\\",\\\"个人产权\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"series\\\":[{\\\"type\\\":\\\"radar\\\",\\\"data\\\":[{\\\"name\\\":\\\"售后产权\\\",\\\"value\\\":[43,100,280,350,500,250],\\\"areaStyle\\\":{\\\"color\\\":\\\"#3F9AFB\\\",\\\"opacity\\\":1},\\\"lineStyle\\\":{\\\"color\\\":\\\"#2D8CF0\\\"}},{\\\"name\\\":\\\"单位产权\\\",\\\"value\\\":[190,50,140,280,310,150],\\\"areaStyle\\\":{\\\"color\\\":\\\"#A6F65C\\\",\\\"opacity\\\":1},\\\"lineStyle\\\":{\\\"color\\\":\\\"#55FE4D\\\"}},{\\\"name\\\":\\\"个人产权\\\",\\\"value\\\":[420,210,160,0,120,130],\\\"areaStyle\\\":{\\\"color\\\":\\\"rgba(188,69,117,1)\\\",\\\"opacity\\\":1},\\\"lineStyle\\\":{\\\"color\\\":\\\"rgba(188,69,117,1)\\\"}}]}],\\\"tooltip\\\":{\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":10,\\\"text\\\":\\\"不同产权、证件成交量\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#ffffff\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,20]}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1331916030221602818\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"btchanquan\",\"chartType\":\"radar.basic\",\"isTiming\":true,\"intervalTime\":\"10\",\"id\":\"IWoBtyiRxjkEbkfD\"},\"layer_id\":\"IWoBtyiRxjkEbkfD\",\"offsetX\":0,\"offsetY\":0,\"backgroud\":{\"enabled\":false,\"color\":\"#fff\",\"image\":\"\"},\"virtualCellRange\":[[16,12],[16,13],[16,14],[16,15]]},{\"row\":16,\"col\":1,\"colspan\":0,\"rowspan\":0,\"width\":\"337\",\"height\":\"205\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":0,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"data\\\":[\\\"马小姐\\\",\\\"孙小姐\\\",\\\"王先生\\\",\\\"李先生\\\",\\\"赵小姐\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type\\\":\\\"category\\\"},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type \\\":\\\"value\\\"},\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"房子\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"grid\\\":{\\\"top\\\":55,\\\"left\\\":70,\\\"bottom\\\":40,\\\"right\\\":24},\\\"series\\\":[{\\\"barWidth\\\":13,\\\"data\\\":[20,15,12,10,7],\\\"name\\\":\\\"房子\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"\\\",\\\"barBorderRadius\\\":7},\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"top\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":2,\\\"typeData\\\":[]}],\\\"tooltip\\\":{\\\"show\\\":true,\\\"axisPointer\\\":{\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"padding\\\":[5,20,5,20],\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"销售量成交排行榜\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"14\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"top\\\":10}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1331514838211407873\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"cjpaihang\",\"chartType\":\"bar.multi.horizontal\",\"isTiming\":true,\"intervalTime\":\"5\"},\"layer_id\":\"Cror94F1kmbP71ip\",\"offsetX\":0,\"offsetY\":0,\"backgroud\":{\"enabled\":false,\"color\":\"#fff\",\"image\":\"\"},\"virtualCellRange\":[[16,1],[16,2],[16,3]]},{\"row\":16,\"col\":4,\"colspan\":0,\"rowspan\":0,\"width\":\"334\",\"height\":\"206\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":0,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"data\\\":[\\\"马小姐\\\",\\\"孙小姐\\\",\\\"王先生\\\",\\\"李先生\\\",\\\"赵小姐\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type\\\":\\\"category\\\"},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type \\\":\\\"value\\\"},\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"房子\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"grid\\\":{\\\"top\\\":55,\\\"left\\\":56,\\\"bottom\\\":38,\\\"right\\\":30},\\\"series\\\":[{\\\"barWidth\\\":13,\\\"data\\\":[20,15,12,10,7],\\\"name\\\":\\\"房子\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"\\\",\\\"barBorderRadius\\\":7},\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"top\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":2,\\\"typeData\\\":[]}],\\\"tooltip\\\":{\\\"show\\\":true,\\\"axisPointer\\\":{\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"padding\\\":[5,20,5,20],\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"销售员成交金额\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"14\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"top\\\":10}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1331514838211407873\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"cjpaihang\",\"chartType\":\"bar.multi.horizontal\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartId\":\"\"},\"layer_id\":\"pBOwp0Q0g4iuJCVm\",\"offsetX\":0,\"offsetY\":0,\"backgroud\":{\"enabled\":false,\"color\":\"#fff\",\"image\":\"\"},\"virtualCellRange\":[[16,4],[16,5],[16,6],[16,7]]},{\"row\":16,\"col\":8,\"colspan\":0,\"rowspan\":0,\"width\":\"324\",\"height\":\"206\",\"config\":\"{\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"简装\\\",\\\"中装\\\",\\\"精装\\\",\\\"豪装\\\",\\\"毛坯\\\"],\\\"top\\\":\\\"bottom\\\",\\\"orient\\\":\\\"vertical\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"series\\\":[{\\\"isRose\\\":false,\\\"data\\\":[{\\\"name\\\":\\\"简装\\\",\\\"value\\\":10,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(52,158,172,1)\\\"}},{\\\"name\\\":\\\"中装\\\",\\\"value\\\":10,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(56,131,185,1)\\\"}},{\\\"name\\\":\\\"精装\\\",\\\"value\\\":10,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(103,153,75,1)\\\"}},{\\\"name\\\":\\\"豪装\\\",\\\"value\\\":10,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(230,165,55,1)\\\"}},{\\\"name\\\":\\\"毛坯\\\",\\\"value\\\":10,\\\"itemStyle\\\":{\\\"color\\\":\\\"\\\"}}],\\\"isRadius\\\":false,\\\"roseType\\\":\\\"\\\",\\\"notCount\\\":false,\\\"center\\\":[\\\"180\\\",\\\"100\\\"],\\\"name\\\":\\\"\\\",\\\"minAngle\\\":0,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"outside\\\",\\\"textStyle\\\":{\\\"fontSize\\\":\\\"10\\\",\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"52%\\\",\\\"autoSort\\\":false}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":10,\\\"text\\\":\\\"不同装修类型销售销量\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#ffffff\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,10]}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1331878107552010242\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"zhuangxiu\",\"chartType\":\"pie.simple\",\"isTiming\":true,\"intervalTime\":\"5\",\"id\":\"rQgkcYfLy4x0EP6h\"},\"layer_id\":\"rQgkcYfLy4x0EP6h\",\"offsetX\":0,\"offsetY\":0,\"backgroud\":{\"enabled\":false,\"color\":\"#fff\",\"image\":\"\"},\"virtualCellRange\":[[16,8],[16,9],[16,10],[16,11]]}],\"area\":false,\"excel_config_id\":\"1331503965770223616\",\"printConfig\":{\"paper\":\"A3\",\"width\":297,\"height\":420,\"definition\":1,\"isBackend\":false,\"marginX\":10,\"marginY\":10,\"layout\":\"landscape\"},\"rows\":{\"0\":{\"cells\":{\"0\":{\"text\":\"\"},\"1\":{\"style\":60,\"merge\":[0,13],\"text\":\"房屋销售综合展示大屏\"}},\"height\":113},\"1\":{\"cells\":{\"1\":{\"merge\":[14,2],\"style\":43,\"text\":\" \",\"virtual\":\"5ggWQtDUvSopC4iL\"},\"2\":{\"text\":\" \",\"virtual\":\"5ggWQtDUvSopC4iL\"},\"3\":{\"text\":\" \",\"virtual\":\"5ggWQtDUvSopC4iL\"},\"4\":{\"style\":53,\"text\":\"成交量:\",\"merge\":[2,0],\"virtual\":\"5ggWQtDUvSopC4iL\"},\"5\":{\"text\":\"#{qingkuang.cjl}\",\"style\":64,\"merge\":[2,0]},\"7\":{\"style\":53,\"text\":\"成交金额:\",\"merge\":[2,0]},\"8\":{\"text\":\"#{qingkuang.cjje}\",\"style\":68,\"merge\":[2,0]},\"10\":{\"style\":53,\"text\":\"销售面积:\",\"merge\":[2,0]},\"11\":{\"text\":\"#{qingkuang.xsmj}\",\"style\":64,\"merge\":[2,0]},\"12\":{\"text\":\" \",\"virtual\":\"nk6I2RCefm9scS1k\"},\"13\":{\"text\":\" \",\"virtual\":\"nk6I2RCefm9scS1k\"},\"14\":{\"text\":\" \",\"virtual\":\"nk6I2RCefm9scS1k\"},\"15\":{\"text\":\" \",\"virtual\":\"nk6I2RCefm9scS1k\"}},\"isDrag\":true},\"2\":{\"cells\":{\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"3\":{\"cells\":{\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"4\":{\"cells\":{\"4\":{\"style\":58,\"text\":\"成交均价:\",\"merge\":[2,0]},\"5\":{\"text\":\"#{qingkuang.cjjj}\",\"style\":65,\"merge\":[2,0]},\"7\":{\"style\":58,\"text\":\"售房佣金:\",\"merge\":[2,0]},\"8\":{\"text\":\"#{qingkuang.sfyj}\",\"style\":65,\"merge\":[2,0]},\"10\":{\"style\":58,\"text\":\"预定客户:\",\"merge\":[2,0]},\"11\":{\"text\":\"#{qingkuang.ydkh}\",\"style\":65,\"merge\":[2,0]},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}},\"isDrag\":true,\"height\":25},\"5\":{\"cells\":{\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"6\":{\"cells\":{\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"7\":{\"cells\":{\"4\":{\"text\":\" \",\"virtual\":\"Nf6Xud4fZqEfvQw4\"},\"5\":{\"text\":\" \",\"virtual\":\"Nf6Xud4fZqEfvQw4\"},\"6\":{\"text\":\" \",\"virtual\":\"Nf6Xud4fZqEfvQw4\"},\"7\":{\"text\":\" \",\"virtual\":\"Nf6Xud4fZqEfvQw4\"},\"8\":{\"text\":\" \",\"virtual\":\"Nf6Xud4fZqEfvQw4\"},\"9\":{\"text\":\" \",\"virtual\":\"Nf6Xud4fZqEfvQw4\"},\"10\":{\"text\":\" \",\"virtual\":\"Nf6Xud4fZqEfvQw4\"},\"11\":{\"text\":\" \",\"virtual\":\"Nf6Xud4fZqEfvQw4\"},\"12\":{\"text\":\" \",\"virtual\":\"MCJP8uqwe57YoCvF\"},\"13\":{\"text\":\" \",\"virtual\":\"MCJP8uqwe57YoCvF\"},\"14\":{\"text\":\" \",\"virtual\":\"MCJP8uqwe57YoCvF\"},\"15\":{\"text\":\" \",\"virtual\":\"MCJP8uqwe57YoCvF\"}}},\"8\":{\"cells\":{\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"9\":{\"cells\":{\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"10\":{\"cells\":{\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"11\":{\"cells\":{\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"12\":{\"cells\":{\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"13\":{\"cells\":{\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"14\":{\"cells\":{\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"15\":{\"cells\":{\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"16\":{\"cells\":{\"1\":{\"style\":43,\"text\":\" \",\"merge\":[7,2],\"virtual\":\"Cror94F1kmbP71ip\"},\"2\":{\"text\":\" \",\"virtual\":\"Cror94F1kmbP71ip\"},\"3\":{\"text\":\" \",\"virtual\":\"Cror94F1kmbP71ip\"},\"4\":{\"text\":\" \",\"virtual\":\"pBOwp0Q0g4iuJCVm\"},\"5\":{\"text\":\" \",\"virtual\":\"pBOwp0Q0g4iuJCVm\"},\"6\":{\"text\":\" \",\"virtual\":\"pBOwp0Q0g4iuJCVm\"},\"7\":{\"text\":\" \",\"virtual\":\"pBOwp0Q0g4iuJCVm\"},\"8\":{\"text\":\" \",\"virtual\":\"rQgkcYfLy4x0EP6h\"},\"9\":{\"text\":\" \",\"virtual\":\"rQgkcYfLy4x0EP6h\"},\"10\":{\"text\":\" \",\"virtual\":\"rQgkcYfLy4x0EP6h\"},\"11\":{\"text\":\" \",\"virtual\":\"rQgkcYfLy4x0EP6h\"},\"12\":{\"text\":\" \",\"virtual\":\"IWoBtyiRxjkEbkfD\"},\"13\":{\"text\":\" \",\"virtual\":\"IWoBtyiRxjkEbkfD\"},\"14\":{\"text\":\" \",\"virtual\":\"IWoBtyiRxjkEbkfD\"},\"15\":{\"text\":\" \",\"virtual\":\"IWoBtyiRxjkEbkfD\"}}},\"17\":{\"cells\":{\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"18\":{\"cells\":{\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"19\":{\"cells\":{\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"20\":{\"cells\":{\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"21\":{\"cells\":{\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"22\":{\"cells\":{\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"23\":{\"cells\":{\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"24\":{\"cells\":{\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"text\":\" \"},\"13\":{\"text\":\" \"},\"14\":{\"text\":\" \"}}},\"len\":98},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":1463,\"displayConfig\":{},\"background\":{\"path\":\"https://static.jeecg.com/designreport/images/bg_1606961893275.png\",\"repeat\":\"repeat\",\"width\":\"\",\"height\":\"\"},\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"font\":{\"bold\":true}},{\"font\":{\"bold\":true,\"name\":\"宋体\"}},{\"font\":{\"name\":\"宋体\"}},{\"font\":{\"bold\":true,\"name\":\"Microsoft YaHei\"}},{\"font\":{\"name\":\"Microsoft YaHei\"}},{\"font\":{\"bold\":true,\"name\":\"Microsoft YaHei\",\"size\":18}},{\"font\":{\"name\":\"Microsoft YaHei\",\"size\":18}},{\"font\":{\"bold\":true,\"name\":\"Microsoft YaHei\",\"size\":16}},{\"font\":{\"name\":\"Microsoft YaHei\",\"size\":16}},{\"font\":{\"bold\":true,\"name\":\"Microsoft YaHei\",\"size\":16},\"align\":\"center\"},{\"font\":{\"name\":\"Microsoft YaHei\",\"size\":16},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"align\":\"right\"},{\"align\":\"right\"},{\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"align\":\"right\",\"font\":{\"size\":14}},{\"align\":\"right\",\"font\":{\"size\":14}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"align\":\"right\",\"font\":{\"size\":12}},{\"align\":\"right\",\"font\":{\"size\":12}},{\"align\":\"center\",\"font\":{\"size\":12}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"align\":\"center\",\"font\":{\"size\":12}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"font\":{\"size\":12}},{\"font\":{\"size\":12}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"align\":\"right\",\"font\":{\"size\":11}},{\"align\":\"right\",\"font\":{\"size\":11}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"align\":\"center\",\"font\":{\"size\":11}},{\"align\":\"center\",\"font\":{\"size\":11}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"font\":{\"size\":11}},{\"font\":{\"size\":11}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"align\":\"right\",\"font\":{\"size\":11,\"bold\":true}},{\"align\":\"right\",\"font\":{\"size\":11,\"bold\":true}},{\"font\":{\"bold\":true,\"name\":\"Microsoft YaHei\",\"size\":16},\"align\":\"center\",\"color\":\"#ffffff\"},{\"color\":\"#ffffff\"},{\"font\":{\"bold\":true,\"name\":\"Microsoft YaHei\",\"size\":22},\"align\":\"center\",\"color\":\"#ffffff\"},{\"color\":\"#ffffff\",\"font\":{\"size\":22}},{\"font\":{\"bold\":true,\"name\":\"Microsoft YaHei\",\"size\":22},\"align\":\"center\",\"color\":\"#000100\"},{\"color\":\"#000100\",\"font\":{\"size\":22}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"align\":\"right\",\"font\":{\"size\":11,\"bold\":true},\"color\":\"#ffffff\"},{\"align\":\"right\",\"font\":{\"size\":11,\"bold\":true},\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"align\":\"center\",\"font\":{\"size\":11},\"color\":\"#ffffff\"},{\"align\":\"center\",\"font\":{\"size\":11},\"color\":\"#ffffff\"},{\"font\":{\"size\":11},\"color\":\"#ffffff\"},{},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"align\":\"right\",\"font\":{\"size\":11,\"bold\":false},\"color\":\"#ffffff\"},{\"align\":\"right\",\"font\":{\"size\":11,\"bold\":false},\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"align\":\"right\",\"font\":{\"size\":11,\"bold\":true,\"name\":\"宋体\"},\"color\":\"#ffffff\"},{\"align\":\"right\",\"font\":{\"size\":11,\"bold\":true,\"name\":\"宋体\"},\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"align\":\"right\",\"font\":{\"size\":11,\"bold\":false,\"name\":\"宋体\"},\"color\":\"#ffffff\"},{\"align\":\"right\",\"font\":{\"size\":11,\"bold\":false,\"name\":\"宋体\"},\"color\":\"#ffffff\"},{\"align\":\"center\",\"font\":{\"size\":11},\"color\":\"#ffffff\",\"border\":{\"right\":[\"thin\",\"#eee\"]}},{\"align\":\"right\",\"font\":{\"size\":16,\"bold\":false,\"name\":\"宋体\"},\"color\":\"#ffffff\"},{\"align\":\"right\",\"font\":{\"size\":15,\"bold\":false,\"name\":\"宋体\"},\"color\":\"#ffffff\"},{\"align\":\"right\",\"font\":{\"size\":14,\"bold\":false,\"name\":\"宋体\"},\"color\":\"#ffffff\"},{\"align\":\"center\",\"font\":{\"size\":14},\"color\":\"#ffffff\"},{\"font\":{\"size\":14},\"color\":\"#ffffff\"},{\"align\":\"left\",\"font\":{\"size\":14},\"color\":\"#ffffff\"},{\"align\":\"left\",\"font\":{\"size\":14,\"bold\":false,\"name\":\"宋体\"},\"color\":\"#ffffff\"},{\"align\":\"right\",\"font\":{\"size\":14,\"bold\":false,\"name\":\"宋体\"},\"color\":\"#ffffff\",\"valign\":\"top\"},{\"align\":\"left\",\"font\":{\"size\":14},\"color\":\"#ffffff\",\"valign\":\"top\"},{\"font\":{\"bold\":true,\"name\":\"宋体\",\"size\":22},\"align\":\"center\",\"color\":\"#ffffff\"},{\"color\":\"#ffffff\",\"font\":{\"size\":22,\"name\":\"宋体\"}},{\"align\":\"left\",\"font\":{\"size\":14,\"name\":\"宋体\"},\"color\":\"#ffffff\",\"valign\":\"top\"},{\"align\":\"left\",\"font\":{\"size\":14,\"name\":\"宋体\"},\"color\":\"#ffffff\"},{\"align\":\"left\",\"font\":{\"size\":14,\"name\":\"宋体\"},\"color\":\"#ffff01\"},{\"align\":\"left\",\"font\":{\"size\":14,\"name\":\"宋体\"},\"color\":\"#ffff01\",\"valign\":\"top\"},{\"align\":\"left\",\"font\":{\"size\":14,\"name\":\"宋体\"},\"color\":\"#ffffff\",\"bgcolor\":\"#ffff01\"},{\"align\":\"left\",\"font\":{\"size\":14,\"name\":\"宋体\"},\"color\":\"#ffffff\",\"bgcolor\":\"\"},{\"align\":\"left\",\"font\":{\"size\":14,\"name\":\"宋体\"},\"color\":\"#ffff01\",\"bgcolor\":\"\"}],\"validations\":[],\"cols\":{\"0\":{\"width\":34},\"3\":{\"width\":140},\"4\":{\"width\":136},\"5\":{\"width\":79},\"6\":{\"width\":1},\"7\":{\"width\":123},\"8\":{\"width\":102},\"9\":{\"width\":24},\"11\":{\"width\":100},\"14\":{\"width\":124},\"len\":50},\"merges\":[\"B1:O1\",\"B2:D16\",\"E2:E4\",\"F2:F4\",\"H2:H4\",\"I2:I4\",\"K2:K4\",\"L2:L4\",\"E5:E7\",\"F5:F7\",\"H5:H7\",\"I5:I7\",\"K5:K7\",\"L5:L7\",\"B17:D24\"]}', NULL, 'https://static.jeecg.com/designreport/images/QQ截图20201125161646_1606705892603.png', 'admin', '2020-11-25 15:50:43', 'admin', '2021-07-13 10:05:37', 0, NULL, NULL, 1, 713, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('1334378897302753280', '20201203140834', '区域销售表', NULL, NULL, 'datainfo', '{\"loopBlockList\":[],\"area\":false,\"printElWidth\":718,\"excel_config_id\":\"1334378897302753280\",\"printElHeight\":1047,\"rows\":{\"0\":{\"cells\":{\"1\":{\"text\":\"区域销售表\",\"merge\":[0,22],\"style\":10},\"2\":{\"style\":10},\"3\":{\"style\":10},\"4\":{\"style\":10},\"5\":{\"style\":10},\"6\":{\"style\":10},\"7\":{\"style\":10},\"8\":{\"style\":10},\"9\":{\"style\":10},\"10\":{\"style\":10},\"11\":{\"style\":10},\"12\":{\"style\":10},\"13\":{\"style\":10},\"14\":{\"style\":10},\"15\":{\"style\":10},\"16\":{\"style\":10},\"17\":{\"style\":10},\"18\":{\"style\":10},\"19\":{\"style\":10},\"20\":{\"style\":10},\"21\":{\"style\":10},\"22\":{\"style\":10},\"23\":{\"style\":10}},\"height\":72},\"1\":{\"cells\":{\"0\":{\"style\":64},\"1\":{\"text\":\"区域\",\"merge\":[1,0],\"style\":65},\"2\":{\"text\":\"省份\",\"merge\":[1,0],\"style\":65},\"3\":{\"text\":\"1月\",\"merge\":[0,2],\"style\":65},\"4\":{\"style\":66,\"text\":\" \"},\"5\":{\"style\":66,\"text\":\" \"},\"6\":{\"text\":\"2月\",\"merge\":[0,2],\"style\":65},\"7\":{\"style\":66,\"text\":\" \"},\"8\":{\"style\":66,\"text\":\" \"},\"9\":{\"text\":\"3月\",\"merge\":[0,2],\"style\":65},\"10\":{\"style\":66,\"text\":\" \"},\"11\":{\"style\":66,\"text\":\" \"},\"12\":{\"text\":\"4月\",\"merge\":[0,2],\"style\":65},\"13\":{\"style\":66,\"text\":\" \"},\"14\":{\"style\":66,\"text\":\" \"},\"15\":{\"text\":\"5月\",\"merge\":[0,2],\"style\":65},\"16\":{\"style\":66,\"text\":\" \"},\"17\":{\"style\":66,\"text\":\" \"},\"18\":{\"text\":\"6月\",\"merge\":[0,2],\"style\":65},\"19\":{\"style\":66,\"text\":\" \"},\"20\":{\"style\":66,\"text\":\" \"},\"21\":{\"text\":\"总合计\",\"merge\":[0,2],\"style\":65},\"22\":{\"style\":66,\"text\":\" \"},\"23\":{\"style\":66,\"text\":\" \"},\"24\":{\"style\":64},\"25\":{\"style\":64}},\"height\":22},\"2\":{\"cells\":{\"0\":{\"style\":64},\"1\":{\"style\":66,\"text\":\" \"},\"2\":{\"style\":65,\"text\":\" \"},\"3\":{\"text\":\"销售额\",\"style\":65},\"4\":{\"text\":\"搭赠\",\"style\":65},\"5\":{\"text\":\"比例\",\"style\":65},\"6\":{\"text\":\"销售额\",\"style\":65},\"7\":{\"text\":\"搭赠\",\"style\":65},\"8\":{\"text\":\"比例\",\"style\":65},\"9\":{\"text\":\"销售额\",\"style\":65},\"10\":{\"text\":\"搭赠\",\"style\":65},\"11\":{\"text\":\"比例\",\"style\":65},\"12\":{\"text\":\"销售额\",\"style\":65},\"13\":{\"text\":\"搭赠\",\"style\":65},\"14\":{\"text\":\"比例\",\"style\":65},\"15\":{\"text\":\"销售额\",\"style\":65},\"16\":{\"text\":\"搭赠\",\"style\":65},\"17\":{\"text\":\"比例\",\"style\":65},\"18\":{\"text\":\"销售额\",\"style\":65},\"19\":{\"text\":\"搭赠\",\"style\":65},\"20\":{\"text\":\"比例\",\"style\":65},\"21\":{\"text\":\"销售额\",\"style\":65},\"22\":{\"text\":\"搭赠\",\"style\":65},\"23\":{\"text\":\"比例\",\"style\":65},\"24\":{\"style\":64},\"25\":{\"style\":64}},\"height\":24},\"3\":{\"cells\":{\"0\":{\"style\":67},\"1\":{\"text\":\"#{quyuxiaoshou.group(region)}\",\"style\":52,\"aggregate\":\"group\"},\"2\":{\"text\":\"#{quyuxiaoshou.province}\",\"style\":53},\"3\":{\"text\":\"#{quyuxiaoshou.sales_1}\",\"style\":17},\"4\":{\"text\":\"#{quyuxiaoshou.gift_1}\",\"style\":17},\"5\":{\"text\":\"#{quyuxiaoshou.proportion_1}\",\"style\":17},\"6\":{\"text\":\"#{quyuxiaoshou.sales_2}\",\"style\":17},\"7\":{\"text\":\"#{quyuxiaoshou.gift_2}\",\"style\":17},\"8\":{\"text\":\"#{quyuxiaoshou.proportion_2}\",\"style\":17},\"9\":{\"text\":\"#{quyuxiaoshou.sales_3}\",\"style\":17},\"10\":{\"text\":\"#{quyuxiaoshou.gift_3}\",\"style\":17},\"11\":{\"text\":\"#{quyuxiaoshou.proportion_3}\",\"style\":17},\"12\":{\"text\":\"#{quyuxiaoshou.sales_4}\",\"style\":17},\"13\":{\"text\":\"#{quyuxiaoshou.gift_4}\",\"style\":17},\"14\":{\"text\":\"#{quyuxiaoshou.proportion_4}\",\"style\":17},\"15\":{\"text\":\"#{quyuxiaoshou.sales_5}\",\"style\":17},\"16\":{\"text\":\"#{quyuxiaoshou.gift_5}\",\"style\":17},\"17\":{\"text\":\"#{quyuxiaoshou.proportion_5}\",\"style\":15},\"18\":{\"text\":\"#{quyuxiaoshou.sales_6}\",\"style\":15},\"19\":{\"text\":\"#{quyuxiaoshou.gift_6}\",\"style\":15},\"20\":{\"text\":\"#{quyuxiaoshou.proportion_6}\",\"style\":15},\"21\":{\"text\":\"#{quyuxiaoshou.sales_z}\",\"style\":15},\"22\":{\"text\":\"#{quyuxiaoshou.gift_z}\",\"style\":15},\"23\":{\"text\":\"#{quyuxiaoshou.proportion_z}\",\"style\":15},\"24\":{\"style\":67},\"25\":{\"style\":67}},\"isDrag\":true,\"height\":56},\"4\":{\"cells\":{\"0\":{\"style\":64},\"1\":{\"style\":39,\"text\":\"总计\",\"merge\":[0,1]},\"3\":{\"style\":68,\"text\":\"=SUM(D4)\"},\"4\":{\"style\":69,\"text\":\"=SUM(E4)\"},\"5\":{\"style\":70,\"text\":\"=SUM(F4)\"},\"6\":{\"style\":69,\"text\":\"=SUM(G4)\"},\"7\":{\"style\":69,\"text\":\"=SUM(H4)\"},\"8\":{\"style\":70,\"text\":\"=SUM(I4)\"},\"9\":{\"style\":69,\"text\":\"=SUM(J4)\"},\"10\":{\"style\":69,\"text\":\"=SUM(K4)\"},\"11\":{\"style\":70,\"text\":\"=SUM(L4)\"},\"12\":{\"style\":69,\"text\":\"=SUM(M4)\"},\"13\":{\"style\":69,\"text\":\"=SUM(N4)\"},\"14\":{\"style\":70,\"text\":\"=SUM(O4)\"},\"15\":{\"style\":69,\"text\":\"=SUM(P4)\"},\"16\":{\"style\":69,\"text\":\"=SUM(Q4)\"},\"17\":{\"style\":70,\"text\":\"=SUM(R4)\"},\"18\":{\"style\":69,\"text\":\"=SUM(S4)\"},\"19\":{\"style\":69,\"text\":\"=SUM(T4)\"},\"20\":{\"style\":70,\"text\":\"=SUM(U4)\"},\"21\":{\"style\":69,\"text\":\"=SUM(V4)\"},\"22\":{\"style\":69,\"text\":\"=SUM(W4)\"},\"23\":{\"style\":69,\"text\":\"=SUM(X4)\"},\"24\":{\"style\":64},\"25\":{\"style\":64}},\"height\":38},\"len\":100},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":718,\"heightPx\":1047},\"dicts\":[],\"groupField\":\"quyuxiaoshou.region\",\"freeze\":\"A1\",\"dataRectWidth\":1554,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"center\"},{\"align\":\"center\",\"bgcolor\":\"\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\"},{\"bgcolor\":\"#02a274\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"bfbfbf\"],\"top\":[\"thin\",\"bfbfbf\"],\"left\":[\"thin\",\"bfbfbf\"],\"right\":[\"thin\",\"bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"bfbfbf\"],\"top\":[\"thin\",\"bfbfbf\"],\"left\":[\"thin\",\"bfbfbf\"],\"right\":[\"thin\",\"bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"font\":{\"size\":16}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"隶书\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#7f7f7f\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":true}},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"font\":{\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#f1f9f6\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#ddefe8\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":true,\"size\":9}},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"font\":{\"bold\":true,\"size\":9}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"华文中宋\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#f1f9f6\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Arial\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#f1f9f6\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8},\"bgcolor\":\"#\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#aedac8\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8},\"bgcolor\":\"#aedac8\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#aedac8\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8},\"bgcolor\":\"#aedac8\",\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8},\"bgcolor\":\"#aedac8\",\"align\":\"center\",\"format\":\"number\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8},\"bgcolor\":\"#aedac8\",\"align\":\"center\",\"format\":\"normal\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#aedac8\",\"align\":\"center\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":false,\"size\":9}},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"font\":{\"bold\":false,\"size\":9}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#aedac8\"},{\"font\":{\"size\":10}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10},\"bgcolor\":\"#aedac8\",\"align\":\"center\",\"format\":\"normal\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10},\"bgcolor\":\"#aedac8\",\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#aedac8\",\"font\":{\"size\":10}},{\"font\":{\"size\":10},\"bgcolor\":\"#aedac8\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":false,\"size\":10}},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"font\":{\"bold\":false,\"size\":10}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#f1f9f6\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#ddefe8\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"font\":{\"size\":8}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#f1f9f6\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#ddefe8\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":false,\"size\":10,\"name\":\"宋体\"}},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"font\":{\"bold\":false,\"size\":10,\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#f1f9f6\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#ddefe8\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"宋体\"},\"align\":\"center\",\"color\":\"#262626\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#aedac8\"},{\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"宋体\"},\"bgcolor\":\"#aedac8\",\"align\":\"center\",\"format\":\"normal\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"宋体\"},\"bgcolor\":\"#aedac8\",\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#aedac8\",\"font\":{\"size\":10,\"name\":\"宋体\"}},{\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":false,\"size\":10,\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"font\":{\"bold\":false,\"size\":10,\"name\":\"Microsoft YaHei\"}},{\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"Microsoft YaHei\"},\"bgcolor\":\"#aedac8\",\"align\":\"center\",\"format\":\"normal\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"Microsoft YaHei\"},\"bgcolor\":\"#aedac8\",\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#aedac8\",\"font\":{\"size\":10,\"name\":\"Microsoft YaHei\"}}],\"validations\":[],\"isGroup\":true,\"cols\":{\"0\":{\"width\":20},\"1\":{\"width\":84},\"2\":{\"width\":81},\"3\":{\"width\":75},\"4\":{\"width\":63},\"5\":{\"width\":59},\"6\":{\"width\":70},\"7\":{\"width\":57},\"8\":{\"width\":60},\"9\":{\"width\":75},\"10\":{\"width\":66},\"11\":{\"width\":64},\"12\":{\"width\":70},\"13\":{\"width\":61},\"14\":{\"width\":61},\"15\":{\"width\":70},\"16\":{\"width\":58},\"17\":{\"width\":63},\"18\":{\"width\":60},\"19\":{\"width\":63},\"20\":{\"width\":59},\"21\":{\"width\":73},\"22\":{\"width\":69},\"23\":{\"width\":73},\"len\":50},\"merges\":[\"B2:B3\",\"C2:C3\",\"D2:F2\",\"G2:I2\",\"J2:L2\",\"M2:O2\",\"P2:R2\",\"S2:U2\",\"V2:X2\",\"B1:X1\",\"B5:C5\"]}', NULL, 'https://static.jeecg.com/designreport/images/quyu_1607069899537.png', 'admin', '2020-12-03 14:08:34', 'admin', '2021-07-13 05:39:14', 0, NULL, NULL, 1, 444, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('1334420681185566722', '202012031408346166', '学校经费一览表', NULL, NULL, 'datainfo', '{\"loopBlockList\":[],\"area\":{\"sri\":7,\"sci\":1,\"eri\":7,\"eci\":2,\"width\":216,\"height\":25},\"printElWidth\":718,\"excel_config_id\":\"1334420681185566722\",\"printElHeight\":1047,\"rows\":{\"0\":{\"cells\":{\"1\":{\"text\":\"学校经费一览表\",\"merge\":[0,22],\"style\":10},\"2\":{\"style\":10},\"3\":{\"style\":10},\"4\":{\"style\":10},\"5\":{\"style\":10},\"6\":{\"style\":10},\"7\":{\"style\":10},\"8\":{\"style\":10},\"9\":{\"style\":10},\"10\":{\"style\":10},\"11\":{\"style\":10},\"12\":{\"style\":10},\"13\":{\"style\":10},\"14\":{\"style\":10},\"15\":{\"style\":10},\"16\":{\"style\":10},\"17\":{\"style\":10},\"18\":{\"style\":10},\"19\":{\"style\":10},\"20\":{\"style\":10},\"21\":{\"style\":10},\"22\":{\"style\":10},\"23\":{\"style\":10}},\"height\":72},\"1\":{\"cells\":{\"1\":{\"text\":\"学校类别\",\"style\":221,\"merge\":[4,0]},\"2\":{\"merge\":[4,0],\"style\":222,\"text\":\"学校名称\"},\"3\":{\"text\":\"财政教育经费投入(万元)\",\"merge\":[0,8],\"style\":84},\"4\":{\"style\":40,\"text\":\" \"},\"5\":{\"style\":40,\"text\":\" \"},\"6\":{\"style\":40,\"text\":\" \"},\"7\":{\"style\":40,\"text\":\" \"},\"8\":{\"style\":40,\"text\":\" \"},\"9\":{\"style\":40,\"text\":\" \"},\"10\":{\"style\":40,\"text\":\" \"},\"11\":{\"style\":40,\"text\":\" \"},\"12\":{\"text\":\"其他投入\",\"merge\":[0,7],\"style\":84},\"13\":{\"text\":\" \",\"style\":40},\"14\":{\"text\":\" \",\"style\":40},\"15\":{\"text\":\" \",\"style\":40},\"16\":{\"text\":\" \",\"style\":40},\"17\":{\"text\":\" \",\"style\":40},\"18\":{\"text\":\" \",\"style\":40},\"19\":{\"text\":\" \",\"style\":40},\"20\":{\"style\":84,\"text\":\"补充资料\",\"merge\":[0,4]},\"21\":{\"text\":\" \",\"style\":40},\"22\":{\"text\":\" \",\"style\":40},\"23\":{\"text\":\" \",\"style\":40},\"24\":{\"text\":\" \",\"style\":40}},\"height\":28},\"2\":{\"cells\":{\"1\":{\"text\":\" \",\"style\":40},\"2\":{\"style\":222,\"text\":\" \"},\"3\":{\"text\":\"总计\",\"style\":117,\"merge\":[3,0]},\"4\":{\"text\":\"教育事业费\",\"style\":117,\"merge\":[0,6]},\"5\":{\"style\":118,\"text\":\" \"},\"6\":{\"style\":118,\"text\":\" \"},\"7\":{\"style\":118,\"text\":\" \"},\"8\":{\"style\":118,\"text\":\" \"},\"9\":{\"style\":118,\"text\":\" \"},\"10\":{\"style\":118,\"text\":\" \"},\"11\":{\"text\":\"基础拨款\",\"style\":117,\"merge\":[3,0]},\"12\":{\"text\":\"村投入\",\"style\":117,\"merge\":[0,4]},\"13\":{\"text\":\" \",\"style\":223},\"14\":{\"text\":\" \",\"style\":223},\"15\":{\"text\":\" \",\"style\":223},\"16\":{\"text\":\" \",\"style\":223},\"17\":{\"text\":\"社会捐款\",\"style\":117,\"merge\":[0,2]},\"18\":{\"text\":\" \",\"style\":223},\"19\":{\"text\":\" \",\"style\":223},\"20\":{\"style\":126,\"merge\":[0,4],\"text\":\"信息化建设\"},\"21\":{\"style\":122,\"text\":\" \"},\"22\":{\"style\":122,\"text\":\" \"},\"23\":{\"style\":122,\"text\":\" \"},\"24\":{\"style\":122,\"text\":\" \"}},\"height\":24},\"3\":{\"cells\":{\"1\":{\"text\":\" \",\"style\":40},\"2\":{\"style\":222,\"text\":\" \"},\"3\":{\"style\":118,\"text\":\" \"},\"4\":{\"merge\":[0,1],\"text\":\"合计\",\"style\":121},\"5\":{\"style\":122,\"text\":\" \"},\"6\":{\"merge\":[2,0],\"text\":\"人员经费\",\"style\":121},\"7\":{\"merge\":[2,0],\"text\":\"日常公用费用\",\"style\":123},\"8\":{\"merge\":[0,2],\"text\":\"项目经费\",\"style\":121},\"9\":{\"style\":122,\"text\":\" \"},\"10\":{\"style\":122,\"text\":\" \"},\"11\":{\"style\":118,\"text\":\" \"},\"12\":{\"merge\":[2,0],\"text\":\"合计\",\"style\":121},\"13\":{\"merge\":[0,3],\"text\":\"其中\",\"style\":121},\"14\":{\"text\":\" \",\"style\":223},\"15\":{\"text\":\" \",\"style\":223},\"16\":{\"text\":\" \",\"style\":223},\"17\":{\"merge\":[2,0],\"text\":\"合计\",\"style\":121},\"18\":{\"merge\":[0,1],\"text\":\"其中\",\"style\":121},\"19\":{\"style\":122,\"text\":\" \"},\"20\":{\"merge\":[2,0],\"text\":\"本年投入金额(万元)\",\"style\":230},\"21\":{\"merge\":[0,1],\"text\":\"电脑数(台数)\",\"style\":121},\"22\":{\"style\":122,\"text\":\" \"},\"23\":{\"merge\":[0,1],\"text\":\"校园网数(个)\",\"style\":121},\"24\":{\"style\":122,\"text\":\" \"}}},\"4\":{\"cells\":{\"1\":{\"text\":\" \",\"style\":40},\"2\":{\"style\":222,\"text\":\" \"},\"3\":{\"style\":118,\"text\":\" \"},\"4\":{\"merge\":[1,0],\"text\":\"金额\",\"style\":126},\"5\":{\"merge\":[1,0],\"text\":\"比上年增长(%)\",\"style\":127},\"6\":{\"style\":122,\"text\":\" \"},\"7\":{\"style\":123,\"text\":\" \"},\"8\":{\"merge\":[1,0],\"text\":\"合计\",\"style\":121},\"9\":{\"merge\":[0,1],\"text\":\"其中\",\"style\":121},\"10\":{\"style\":122,\"text\":\" \"},\"11\":{\"style\":118,\"text\":\" \"},\"12\":{\"style\":121,\"text\":\" \"},\"13\":{\"merge\":[1,0],\"text\":\"人员经费\",\"style\":131},\"14\":{\"merge\":[1,0],\"text\":\"日常公用费用\",\"style\":131},\"15\":{\"merge\":[1,0],\"text\":\"项目经费\",\"style\":131},\"16\":{\"merge\":[1,0],\"text\":\"基建投入\",\"style\":131},\"17\":{\"style\":121,\"text\":\" \"},\"18\":{\"merge\":[1,0],\"text\":\"项目经费\",\"style\":131},\"19\":{\"merge\":[1,0],\"text\":\"基础投入\",\"style\":131},\"20\":{\"style\":231,\"text\":\" \"},\"21\":{\"merge\":[1,0],\"text\":\"合计\",\"style\":121},\"22\":{\"merge\":[1,0],\"text\":\"本年购置数\",\"style\":121},\"23\":{\"style\":121,\"merge\":[1,0],\"text\":\"合计\"},\"24\":{\"merge\":[1,0],\"text\":\"本年建成数\",\"style\":121}}},\"5\":{\"cells\":{\"1\":{\"text\":\" \",\"style\":40},\"2\":{\"style\":222,\"text\":\" \"},\"3\":{\"style\":118,\"text\":\" \"},\"4\":{\"style\":126,\"text\":\" \"},\"5\":{\"style\":129,\"text\":\" \"},\"6\":{\"style\":121,\"text\":\" \"},\"7\":{\"style\":130,\"text\":\" \"},\"8\":{\"style\":121,\"text\":\" \"},\"9\":{\"text\":\"标准化建设\",\"style\":131},\"10\":{\"text\":\"信息化建设\",\"style\":121},\"11\":{\"style\":118,\"text\":\" \"},\"12\":{\"style\":121,\"text\":\" \"},\"13\":{\"text\":\" \",\"style\":223},\"14\":{\"style\":131,\"text\":\" \"},\"15\":{\"text\":\" \",\"style\":223},\"16\":{\"style\":131,\"text\":\" \"},\"17\":{\"style\":121,\"text\":\" \"},\"18\":{\"text\":\" \",\"style\":223},\"19\":{\"style\":131,\"text\":\" \"},\"20\":{\"style\":231,\"text\":\" \"},\"21\":{\"style\":121,\"text\":\" \"},\"22\":{\"style\":122,\"text\":\" \"},\"23\":{\"style\":131,\"text\":\" \"},\"24\":{\"style\":122,\"text\":\" \"}}},\"6\":{\"cells\":{\"0\":{\"style\":236},\"1\":{\"text\":\"#{laiyuan.group(class)}\",\"style\":233,\"aggregate\":\"group\"},\"2\":{\"text\":\"#{laiyuan.school}\",\"style\":234},\"3\":{\"style\":15,\"text\":\"=SUM(E7,I7)\"},\"4\":{\"style\":15,\"text\":\"=SUM(G7,H7)\"},\"5\":{\"text\":\"#{laiyuan.lv}\",\"style\":12},\"6\":{\"text\":\"#{laiyuan.renyuan_jy}\",\"style\":12},\"7\":{\"text\":\"#{laiyuan.richang_jy}\",\"style\":12},\"8\":{\"style\":12,\"text\":\"=SUM(J7,K7)\"},\"9\":{\"text\":\"#{laiyuan.biaozhun_jy}\",\"style\":12},\"10\":{\"text\":\"#{laiyuan.xinxi_jy}\",\"style\":12},\"11\":{\"text\":\"#{laiyuan.jichubokuan_jy}\",\"style\":12},\"12\":{\"style\":12,\"text\":\"=SUM(N7,O7)\"},\"13\":{\"text\":\"#{laiyuan.renyuan_ct}\",\"style\":12},\"14\":{\"text\":\"#{laiyuan.richang_ct}\",\"style\":12},\"15\":{\"text\":\"#{laiyuan.xiangmu_ct}\",\"style\":12},\"16\":{\"text\":\"#{laiyuan.jichubokuan_ct}\",\"style\":12},\"17\":{\"style\":12,\"text\":\"=SUM(S7,T7)\"},\"18\":{\"text\":\"#{laiyuan.xiangmu_sh}\",\"style\":12},\"19\":{\"text\":\"#{laiyuan.jichubokuan_sh}\",\"style\":12},\"20\":{\"style\":12,\"text\":\"=SUM(V7,X7)\"},\"21\":{\"style\":12,\"text\":\"#{laiyuan.diannao}\"},\"22\":{\"text\":\"#{laiyuan.diannao}\",\"style\":12},\"23\":{\"style\":12,\"text\":\"#{laiyuan.xiaoyuanwang}\"},\"24\":{\"text\":\"#{laiyuan.xiaoyuanwang}\",\"style\":12},\"25\":{\"style\":236}},\"isDrag\":true},\"7\":{\"cells\":{\"1\":{\"text\":\"总计\",\"style\":226,\"rendered\":\"\",\"merge\":[0,1]},\"3\":{\"style\":228,\"text\":\"=SUM(D7)\"},\"4\":{\"style\":228,\"text\":\"=SUM(E7)\"},\"5\":{\"style\":228,\"text\":\"\"},\"6\":{\"style\":228,\"text\":\"=SUM(G7)\"},\"7\":{\"style\":228,\"text\":\"=SUM(H7)\"},\"8\":{\"style\":228,\"text\":\"=SUM(I7)\"},\"9\":{\"style\":228,\"text\":\"=SUM(J7)\"},\"10\":{\"style\":228,\"text\":\"=SUM(K7)\"},\"11\":{\"style\":228,\"text\":\"=SUM(L7)\"},\"12\":{\"style\":228,\"text\":\"=SUM(M7)\"},\"13\":{\"style\":229,\"text\":\"=SUM(N7)\"},\"14\":{\"style\":229,\"text\":\"=SUM(O7)\"},\"15\":{\"style\":229,\"text\":\"=SUM(P7)\"},\"16\":{\"style\":229,\"text\":\"=SUM(Q7)\"},\"17\":{\"style\":229,\"text\":\"=SUM(R7)\"},\"18\":{\"style\":229,\"text\":\"=SUM(S7)\"},\"19\":{\"style\":229,\"text\":\"=SUM(T7)\"},\"20\":{\"style\":229,\"text\":\"=SUM(U7)\"},\"21\":{\"style\":229,\"text\":\"=SUM(V8)\"},\"22\":{\"style\":229,\"text\":\"=SUM(W7)\"},\"23\":{\"style\":232,\"text\":\"=SUM(X7)\"},\"24\":{\"style\":229,\"text\":\"=SUM(Y7)\"}}},\"9\":{\"cells\":{\"4\":{\"lineStart\":\"leftbottom\",\"text\":\"\"}}},\"len\":100},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":718,\"heightPx\":1047},\"dicts\":[],\"groupField\":\"laiyuan.class\",\"freeze\":\"A1\",\"dataRectWidth\":1738,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"center\"},{\"align\":\"center\",\"bgcolor\":\"\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\"},{\"bgcolor\":\"#02a274\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"bfbfbf\"],\"top\":[\"thin\",\"bfbfbf\"],\"left\":[\"thin\",\"bfbfbf\"],\"right\":[\"thin\",\"bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"bfbfbf\"],\"top\":[\"thin\",\"bfbfbf\"],\"left\":[\"thin\",\"bfbfbf\"],\"right\":[\"thin\",\"bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"font\":{\"size\":16}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"隶书\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#7f7f7f\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":true}},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"font\":{\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#f1f9f6\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#ddefe8\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":true,\"size\":9}},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"font\":{\"bold\":true,\"size\":9}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"华文中宋\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#f1f9f6\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Arial\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#f1f9f6\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8},\"bgcolor\":\"#\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#aedac8\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8},\"bgcolor\":\"#aedac8\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#aedac8\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8},\"bgcolor\":\"#aedac8\",\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8},\"bgcolor\":\"#aedac8\",\"align\":\"center\",\"format\":\"number\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8},\"bgcolor\":\"#aedac8\",\"align\":\"center\",\"format\":\"normal\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#aedac8\",\"align\":\"center\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":false,\"size\":9}},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"font\":{\"bold\":false,\"size\":9}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"color\":\"#262626\",\"bgcolor\":\"#aedac8\"},{\"font\":{\"size\":10}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10},\"bgcolor\":\"#aedac8\",\"align\":\"center\",\"format\":\"normal\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10},\"bgcolor\":\"#aedac8\",\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#aedac8\",\"font\":{\"size\":10}},{\"font\":{\"size\":10},\"bgcolor\":\"#aedac8\"},{\"bgcolor\":\"#02a274\",\"font\":{\"size\":9}},{\"bgcolor\":\"#02a274\",\"font\":{\"size\":9},\"align\":\"center\"},{\"bgcolor\":\"#02a274\",\"font\":{\"size\":9},\"align\":\"center\",\"color\":\"#ffffff\"},{\"textwrap\":true},{\"textwrap\":true,\"font\":{\"size\":9}},{\"textwrap\":true,\"font\":{\"size\":9},\"bgcolor\":\"#02a274\"},{\"textwrap\":true,\"font\":{\"size\":9},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":false,\"size\":9}},{\"color\":\"#000100\"},{\"bgcolor\":\"#02a274\",\"font\":{\"size\":9},\"align\":\"center\",\"color\":\"#000100\"},{\"textwrap\":true,\"font\":{\"size\":9},\"bgcolor\":\"#02a274\",\"color\":\"#000100\"},{\"bgcolor\":\"\",\"font\":{\"size\":9},\"align\":\"center\",\"color\":\"#000100\"},{\"textwrap\":true,\"font\":{\"size\":9},\"bgcolor\":\"\",\"color\":\"#000100\"},{\"align\":\"center\",\"bgcolor\":\"\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":false,\"size\":9}},{\"color\":\"#000100\",\"bgcolor\":\"\"},{\"textwrap\":true,\"font\":{\"size\":9},\"bgcolor\":\"\",\"color\":\"#000100\",\"align\":\"center\"},{\"font\":{\"size\":9}},{\"font\":{\"size\":9},\"align\":\"center\"},{\"textwrap\":true,\"align\":\"center\"},{\"font\":{\"size\":9},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#595959\"],\"top\":[\"thin\",\"#595959\"],\"left\":[\"thin\",\"#595959\"],\"right\":[\"thin\",\"#595959\"]}},{\"textwrap\":true,\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#595959\"],\"top\":[\"thin\",\"#595959\"],\"left\":[\"thin\",\"#595959\"],\"right\":[\"thin\",\"#595959\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#595959\"],\"top\":[\"thin\",\"#595959\"],\"left\":[\"thin\",\"#595959\"],\"right\":[\"thin\",\"#595959\"]}},{\"bgcolor\":\"\",\"font\":{\"size\":9},\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#595959\"],\"top\":[\"thin\",\"#595959\"],\"left\":[\"thin\",\"#595959\"],\"right\":[\"thin\",\"#595959\"]}},{\"textwrap\":true,\"font\":{\"size\":9},\"bgcolor\":\"\",\"color\":\"#000100\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#595959\"],\"top\":[\"thin\",\"#595959\"],\"left\":[\"thin\",\"#595959\"],\"right\":[\"thin\",\"#595959\"]}},{\"font\":{\"size\":9},\"border\":{\"bottom\":[\"thin\",\"#595959\"],\"top\":[\"thin\",\"#595959\"],\"left\":[\"thin\",\"#595959\"],\"right\":[\"thin\",\"#595959\"]}},{\"font\":{\"size\":9},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"textwrap\":true,\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"bgcolor\":\"\",\"font\":{\"size\":9},\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"textwrap\":true,\"font\":{\"size\":9},\"bgcolor\":\"\",\"color\":\"#000100\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"font\":{\"size\":9},\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"font\":{\"size\":9},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#756f6f\"],\"top\":[\"thin\",\"#756f6f\"],\"left\":[\"thin\",\"#756f6f\"],\"right\":[\"thin\",\"#756f6f\"]}},{\"textwrap\":true,\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#756f6f\"],\"top\":[\"thin\",\"#756f6f\"],\"left\":[\"thin\",\"#756f6f\"],\"right\":[\"thin\",\"#756f6f\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#756f6f\"],\"top\":[\"thin\",\"#756f6f\"],\"left\":[\"thin\",\"#756f6f\"],\"right\":[\"thin\",\"#756f6f\"]}},{\"bgcolor\":\"\",\"font\":{\"size\":9},\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#756f6f\"],\"top\":[\"thin\",\"#756f6f\"],\"left\":[\"thin\",\"#756f6f\"],\"right\":[\"thin\",\"#756f6f\"]}},{\"textwrap\":true,\"font\":{\"size\":9},\"bgcolor\":\"\",\"color\":\"#000100\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#756f6f\"],\"top\":[\"thin\",\"#756f6f\"],\"left\":[\"thin\",\"#756f6f\"],\"right\":[\"thin\",\"#756f6f\"]}},{\"font\":{\"size\":9},\"border\":{\"bottom\":[\"thin\",\"#756f6f\"],\"top\":[\"thin\",\"#756f6f\"],\"left\":[\"thin\",\"#756f6f\"],\"right\":[\"thin\",\"#756f6f\"]}},{\"align\":\"center\",\"bgcolor\":\"\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":false,\"size\":9}},{\"bgcolor\":\"\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":false,\"size\":10}},{\"align\":\"center\",\"bgcolor\":\"\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":false,\"size\":10}},{\"color\":\"#000100\",\"font\":{\"size\":10}},{\"color\":\"#000100\",\"bgcolor\":\"\",\"font\":{\"size\":10}},{\"font\":{\"size\":10},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"font\":{\"size\":10},\"align\":\"center\"},{\"textwrap\":true,\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]},\"font\":{\"size\":10}},{\"bgcolor\":\"\",\"font\":{\"size\":10},\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"textwrap\":true,\"font\":{\"size\":10},\"bgcolor\":\"\",\"color\":\"#000100\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"bgcolor\":\"\",\"font\":{\"size\":10},\"align\":\"center\",\"color\":\"#000100\"},{\"font\":{\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"color\":\"#000100\",\"bgcolor\":\"\",\"align\":\"center\"},{\"font\":{\"size\":10},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"textwrap\":true,\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"bgcolor\":\"\",\"font\":{\"size\":10},\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"textwrap\":true,\"font\":{\"size\":10},\"bgcolor\":\"\",\"color\":\"#000100\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"color\":\"#000100\",\"bgcolor\":\"\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"#\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":false,\"size\":10}},{\"color\":\"#000100\",\"font\":{\"size\":10},\"bgcolor\":\"#\"},{\"align\":\"center\",\"bgcolor\":\"#\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":false,\"size\":9}},{\"bgcolor\":\"#\"},{\"font\":{\"size\":10},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#\"},{\"font\":{\"size\":10},\"align\":\"center\",\"bgcolor\":\"#\"},{\"textwrap\":true,\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10},\"bgcolor\":\"#\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#\"},{\"align\":\"center\",\"bgcolor\":\"#\"},{\"bgcolor\":\"#\",\"font\":{\"size\":10},\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"textwrap\":true,\"font\":{\"size\":10},\"bgcolor\":\"#\",\"color\":\"#000100\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"textwrap\":true,\"font\":{\"size\":10},\"bgcolor\":\"#\",\"color\":\"#000100\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"textwrap\":true,\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]},\"font\":{\"size\":10},\"bgcolor\":\"#\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10},\"bgcolor\":\"#\"},{\"align\":\"center\",\"bgcolor\":\"#ddefe8\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":false,\"size\":10}},{\"color\":\"#000100\",\"font\":{\"size\":10},\"bgcolor\":\"#ddefe8\"},{\"align\":\"center\",\"bgcolor\":\"#ddefe8\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"bold\":false,\"size\":9}},{\"bgcolor\":\"#ddefe8\"},{\"font\":{\"size\":10},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\"},{\"font\":{\"size\":10},\"align\":\"center\",\"bgcolor\":\"#ddefe8\"},{\"textwrap\":true,\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10},\"bgcolor\":\"#ddefe8\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\"},{\"align\":\"center\",\"bgcolor\":\"#ddefe8\"},{\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":10},\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"textwrap\":true,\"font\":{\"size\":10},\"bgcolor\":\"#ddefe8\",\"color\":\"#000100\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\"},{\"textwrap\":true,\"font\":{\"size\":10},\"bgcolor\":\"#ddefe8\",\"color\":\"#000100\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"textwrap\":true,\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]},\"font\":{\"size\":10},\"bgcolor\":\"#ddefe8\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10},\"bgcolor\":\"#ddefe8\"},{\"color\":\"#000100\",\"bgcolor\":\"#fffff\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"#fffff\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#fffff\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#fffff\"},{\"textwrap\":true,\"bgcolor\":\"#fffff\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#fffff\"},{\"color\":\"#000100\",\"bgcolor\":\"#ffff\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"#ffff\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ffff\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ffff\"},{\"textwrap\":true,\"bgcolor\":\"#ffff\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ffff\"},{\"color\":\"#000100\",\"bgcolor\":\"#fff\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"#fff\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#fff\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#fff\"},{\"textwrap\":true,\"bgcolor\":\"#fff\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#fff\"},{\"color\":\"#000100\",\"bgcolor\":\"#ff\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"#ff\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ff\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ff\"},{\"textwrap\":true,\"bgcolor\":\"#ff\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ff\"},{\"color\":\"#000100\",\"bgcolor\":\"#f\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"#f\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#f\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#f\"},{\"textwrap\":true,\"bgcolor\":\"#f\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#f\"},{\"color\":\"#000100\",\"bgcolor\":\"#\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#\"},{\"textwrap\":true,\"bgcolor\":\"#\"},{\"color\":\"#000100\",\"bgcolor\":\"#ddefe8\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\"},{\"textwrap\":true,\"bgcolor\":\"#ddefe8\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9}},{\"color\":\"#000100\",\"font\":{\"size\":9},\"bgcolor\":\"#ddefe8\"},{\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":9}},{\"font\":{\"size\":9},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\"},{\"font\":{\"size\":9},\"align\":\"center\",\"bgcolor\":\"#ddefe8\"},{\"textwrap\":true,\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9},\"bgcolor\":\"#ddefe8\"},{\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":9},\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"textwrap\":true,\"font\":{\"size\":9},\"bgcolor\":\"#ddefe8\",\"color\":\"#000100\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":9}},{\"textwrap\":true,\"font\":{\"size\":9},\"bgcolor\":\"#ddefe8\",\"color\":\"#000100\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"textwrap\":true,\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]},\"font\":{\"size\":9},\"bgcolor\":\"#ddefe8\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":9}},{\"textwrap\":true,\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":9}},{\"align\":\"center\",\"bgcolor\":\"#aedac8\"},{\"bgcolor\":\"#aedac8\"},{\"bgcolor\":\"#fffff\"},{\"bgcolor\":\"#ffff\"},{\"bgcolor\":\"#fff\"},{\"bgcolor\":\"#ff\"},{\"bgcolor\":\"#f\"},{\"align\":\"center\",\"bgcolor\":\"#aedac8\",\"font\":{\"size\":8}},{\"align\":\"center\",\"bgcolor\":\"#aedac8\",\"font\":{\"size\":9}},{\"align\":\"center\",\"bgcolor\":\"#aedac8\",\"font\":{\"size\":9},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Arial\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"bgcolor\":\"#\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"bgcolor\":\"#f1f9f6\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#aedac8\",\"font\":{\"size\":9}},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"font\":{\"bold\":false,\"size\":9}},{\"bgcolor\":\"#02a274\",\"font\":{\"size\":9},\"align\":\"center\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"bgcolor\":\"\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"bgcolor\":\"aedac8\"},{\"align\":\"center\",\"bgcolor\":\"aedac8\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"bgcolor\":\"#aedac8\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"bgcolor\":\"#aedac8\",\"color\":\"#ffffff\"},{\"align\":\"center\",\"bgcolor\":\"#aedac8\",\"color\":\"#ffffff\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"bgcolor\":\"#aedac8\",\"color\":\"#ffffff\",\"font\":{\"size\":9}},{\"align\":\"center\",\"bgcolor\":\"#aedac8\",\"color\":\"#ffffff\",\"font\":{\"size\":9}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"bgcolor\":\"#aedac8\",\"color\":\"#000100\",\"font\":{\"size\":9}},{\"align\":\"center\",\"bgcolor\":\"#aedac8\",\"color\":\"#000100\",\"font\":{\"size\":9}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"bgcolor\":\"#aedac8\",\"color\":\"#000100\",\"font\":{\"size\":8}},{\"align\":\"center\",\"bgcolor\":\"#aedac8\",\"color\":\"#000100\",\"font\":{\"size\":8}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"bgcolor\":\"#\"},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"bgcolor\":\"##aedac8\"},{\"bgcolor\":\"##aedac8\"},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"bgcolor\":\"#aedac8\"},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"bgcolor\":\"#aedac8\",\"font\":{\"size\":8}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"bgcolor\":\"#aedac8\",\"font\":{\"size\":8},\"align\":\"center\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"bgcolor\":\"#aedac8\",\"font\":{\"size\":9}},{\"bgcolor\":\"#aedac8\",\"font\":{\"size\":8}},{\"bgcolor\":\"#aedac8\",\"font\":{\"size\":8},\"align\":\"left\"},{\"bgcolor\":\"#aedac8\",\"font\":{\"size\":8},\"align\":\"left\",\"valign\":\"middle\"},{\"align\":\"center\",\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"font\":{\"bold\":false,\"size\":10}},{\"bgcolor\":\"#02a274\",\"font\":{\"size\":10},\"align\":\"center\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]}},{\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":10}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"bgcolor\":\"#f1f9f6\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"bgcolor\":\"#aedac8\",\"color\":\"#000100\",\"font\":{\"size\":10}},{\"align\":\"center\",\"bgcolor\":\"#aedac8\",\"color\":\"#000100\",\"font\":{\"size\":10}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"bgcolor\":\"#aedac8\",\"font\":{\"size\":10},\"align\":\"center\"},{\"align\":\"center\",\"bgcolor\":\"#aedac8\",\"font\":{\"size\":10}},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":10}},{\"textwrap\":true,\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":10}},{\"bgcolor\":\"#aedac8\",\"font\":{\"size\":10},\"align\":\"left\",\"valign\":\"middle\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"bgcolor\":\"#f1f9f6\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"font\":{\"size\":9},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"font\":{\"size\":8}}],\"validations\":[],\"isGroup\":true,\"cols\":{\"0\":{\"width\":20},\"1\":{\"width\":84},\"2\":{\"width\":132},\"3\":{\"width\":75},\"4\":{\"width\":63},\"5\":{\"width\":59},\"6\":{\"width\":70},\"7\":{\"width\":61},\"8\":{\"width\":60},\"9\":{\"width\":75},\"10\":{\"width\":75},\"11\":{\"width\":64},\"12\":{\"width\":70},\"13\":{\"width\":63},\"14\":{\"width\":86},\"15\":{\"width\":64},\"16\":{\"width\":58},\"17\":{\"width\":63},\"18\":{\"width\":60},\"19\":{\"width\":63},\"20\":{\"width\":59},\"21\":{\"width\":73},\"22\":{\"width\":82},\"23\":{\"width\":73},\"24\":{\"width\":86},\"len\":50},\"merges\":[\"B1:X1\",\"D3:D6\",\"E5:E6\",\"F5:F6\",\"E4:F4\",\"G4:G6\",\"H4:H6\",\"I5:I6\",\"J5:K5\",\"I4:K4\",\"E3:K3\",\"L3:L6\",\"D2:L2\",\"M4:M6\",\"N5:N6\",\"O5:O6\",\"P5:P6\",\"Q5:Q6\",\"N4:Q4\",\"M3:Q3\",\"R4:R6\",\"R3:T3\",\"S4:T4\",\"S5:S6\",\"T5:T6\",\"U4:U6\",\"V4:W4\",\"V5:V6\",\"W5:W6\",\"X4:Y4\",\"X5:X6\",\"Y5:Y6\",\"U3:Y3\",\"M2:T2\",\"U2:Y2\",\"B2:B6\",\"C2:C6\",\"B8:C8\"]}', NULL, 'https://static.jeecg.com/designreport/images/jingfei_1607069843358.png', 'admin', '2020-12-03 16:54:17', 'admin', '2021-02-03 13:59:08', 0, NULL, NULL, 1, 436, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('1334457419857793024', '20201203192154', '超市各地区销售额', NULL, NULL, 'datainfo', '{\"loopBlockList\":[],\"area\":{\"sri\":1,\"sci\":26,\"eri\":4,\"eci\":28,\"width\":300,\"height\":100},\"excel_config_id\":\"1334457419857793024\",\"printConfig\":{\"paper\":\"A4\",\"width\":210,\"height\":297,\"definition\":1,\"isBackend\":false,\"marginX\":10,\"marginY\":10},\"rows\":{\"0\":{\"cells\":{\"1\":{\"text\":\"各地区商品销售额一栏表\",\"merge\":[0,18],\"style\":13}},\"height\":82},\"1\":{\"cells\":{\"1\":{\"text\":\"地区/类别/时间\",\"merge\":[1,1],\"style\":46},\"3\":{\"text\":\"2020年\",\"style\":46,\"merge\":[0,12]},\"16\":{\"text\":\"2019年\",\"style\":46,\"merge\":[0,9]}}},\"2\":{\"cells\":{\"3\":{\"text\":\"12月\",\"style\":46},\"4\":{\"text\":\"11月\",\"style\":46},\"5\":{\"text\":\"10月\",\"style\":46},\"6\":{\"text\":\"9月\",\"style\":46},\"7\":{\"text\":\"8月\",\"style\":46},\"8\":{\"text\":\"7月\",\"style\":46},\"9\":{\"text\":\"6月\",\"style\":46},\"10\":{\"text\":\"5月\",\"style\":46},\"11\":{\"text\":\"4月\",\"style\":46},\"12\":{\"text\":\"3月\",\"style\":46},\"13\":{\"text\":\"2月\",\"style\":46},\"14\":{\"text\":\"1月\",\"style\":46},\"15\":{\"text\":\"本年小计\",\"style\":46},\"16\":{\"text\":\"12月\",\"style\":46},\"17\":{\"text\":\"11月\",\"style\":46},\"18\":{\"text\":\"10月\",\"style\":46},\"19\":{\"text\":\"9月\",\"style\":46},\"20\":{\"text\":\"8月\",\"style\":46},\"21\":{\"text\":\"7月\",\"style\":46},\"22\":{\"text\":\"6月\",\"style\":46},\"23\":{\"text\":\"5月\",\"style\":46},\"24\":{\"text\":\"4月\",\"style\":46},\"25\":{\"text\":\"本年小计\",\"style\":46}}},\"3\":{\"cells\":{\"1\":{\"text\":\"#{xiaoshou.group(diqu)}\",\"style\":51,\"aggregate\":\"group\"},\"2\":{\"text\":\"#{xiaoshou.class}\",\"style\":51},\"3\":{\"text\":\"#{xiaoshou.sales_11}\",\"style\":20},\"4\":{\"text\":\"#{xiaoshou.sales_12}\",\"style\":20},\"5\":{\"text\":\"#{xiaoshou.sales_13}\",\"style\":20},\"6\":{\"text\":\"#{xiaoshou.sales_14}\",\"style\":20},\"7\":{\"text\":\"#{xiaoshou.sales_15}\",\"style\":20},\"8\":{\"text\":\"#{xiaoshou.sales_16}\",\"style\":20},\"9\":{\"text\":\"#{xiaoshou.sales_17}\",\"style\":20},\"10\":{\"text\":\"#{xiaoshou.sales_18}\",\"style\":20},\"11\":{\"text\":\"#{xiaoshou.sales_19}\",\"style\":20},\"12\":{\"text\":\"#{xiaoshou.sales_20}\",\"style\":20},\"13\":{\"text\":\"#{xiaoshou.sales_21}\",\"style\":20},\"14\":{\"text\":\"#{xiaoshou.sales_22}\",\"style\":20},\"15\":{\"style\":48,\"text\":\"=SUM(D4:O4)\"},\"16\":{\"text\":\"#{xiaoshou.sales_31}\",\"style\":20},\"17\":{\"text\":\"#{xiaoshou.sales_32}\",\"style\":20},\"18\":{\"text\":\"#{xiaoshou.sales_33}\",\"style\":20},\"19\":{\"text\":\"#{xiaoshou.sales_34}\",\"style\":20},\"20\":{\"text\":\"#{xiaoshou.sales_35}\",\"style\":20},\"21\":{\"text\":\"#{xiaoshou.sales_36}\",\"style\":20},\"22\":{\"text\":\"#{xiaoshou.sales_37}\",\"style\":20},\"23\":{\"text\":\"#{xiaoshou.sales_38}\",\"style\":20},\"24\":{\"text\":\"#{xiaoshou.sales_39}\",\"style\":20},\"25\":{\"style\":48,\"text\":\"=SUM(Q4:Y4)\"}},\"isDrag\":true},\"4\":{\"cells\":{\"1\":{\"text\":\"合计\",\"style\":52,\"rendered\":\"\",\"merge\":[0,1]},\"3\":{\"text\":\"=SUM(D4)\",\"style\":55},\"4\":{\"text\":\"=SUM(E4)\",\"style\":55},\"5\":{\"text\":\"=SUM(F4)\",\"style\":55},\"6\":{\"text\":\"=SUM(G4)\",\"style\":55},\"7\":{\"text\":\"=SUM(H4)\",\"style\":55},\"8\":{\"text\":\"=SUM(I4)\",\"style\":55},\"9\":{\"text\":\"=SUM(J4)\",\"style\":55},\"10\":{\"text\":\"=SUM(K4)\",\"style\":55},\"11\":{\"text\":\"=SUM(L4)\",\"style\":55},\"12\":{\"text\":\"=SUM(M4)\",\"style\":55},\"13\":{\"text\":\"=SUM(N4)\",\"style\":55},\"14\":{\"text\":\"=SUM(O4)\",\"style\":55},\"15\":{\"text\":\"=SUM(P4)\",\"style\":55},\"16\":{\"text\":\"=SUM(Q4)\",\"style\":55},\"17\":{\"text\":\"=SUM(R4)\",\"style\":55},\"18\":{\"text\":\"=SUM(S4)\",\"style\":55},\"19\":{\"text\":\"=SUM(T4)\",\"style\":55},\"20\":{\"text\":\"=SUM(U4)\",\"style\":55},\"21\":{\"text\":\"=SUM(V4)\",\"style\":55},\"22\":{\"text\":\"=SUM(W4)\",\"style\":55},\"23\":{\"text\":\"=SUM(X4)\",\"style\":55},\"24\":{\"text\":\"=SUM(Y4)\",\"style\":55},\"25\":{\"text\":\"=SUM(Z4)\",\"style\":55}},\"isDrag\":true},\"len\":100},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":718,\"heightPx\":1047},\"dicts\":[],\"groupField\":\"xiaoshou.diqu\",\"freeze\":\"A1\",\"dataRectWidth\":2464,\"displayConfig\":{},\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"bgcolor\":\"#\"},{\"bgcolor\":\"#d7f2f9\"},{\"bgcolor\":\"#d7f2f9\",\"align\":\"center\"},{\"align\":\"center\"},{\"align\":\"center\",\"bgcolor\":\"#\"},{\"bgcolor\":\"#d7f2f9\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"2896ea\"],\"top\":[\"thin\",\"2896ea\"],\"left\":[\"thin\",\"2896ea\"],\"right\":[\"thin\",\"2896ea\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"2896ea\"],\"top\":[\"thin\",\"2896ea\"],\"left\":[\"thin\",\"2896ea\"],\"right\":[\"thin\",\"2896ea\"]}},{\"border\":{\"bottom\":[\"thin\",\"2896ea\"],\"top\":[\"thin\",\"2896ea\"],\"left\":[\"thin\",\"2896ea\"],\"right\":[\"thin\",\"2896ea\"]}},{\"bgcolor\":\"#d7f2f9\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#2896ea\"],\"top\":[\"thin\",\"#2896ea\"],\"left\":[\"thin\",\"#2896ea\"],\"right\":[\"thin\",\"#2896ea\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#2896ea\"],\"top\":[\"thin\",\"#2896ea\"],\"left\":[\"thin\",\"#2896ea\"],\"right\":[\"thin\",\"#2896ea\"]}},{\"border\":{\"bottom\":[\"thin\",\"#2896ea\"],\"top\":[\"thin\",\"#2896ea\"],\"left\":[\"thin\",\"#2896ea\"],\"right\":[\"thin\",\"#2896ea\"]}},{\"font\":{\"bold\":true}},{\"font\":{\"bold\":true,\"size\":16}},{\"font\":{\"bold\":true,\"size\":16},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#2896ea\"],\"top\":[\"thin\",\"#2896ea\"],\"left\":[\"thin\",\"#2896ea\"],\"right\":[\"thin\",\"#2896ea\"]},\"font\":{\"size\":8}},{\"border\":{\"bottom\":[\"thin\",\"#2896ea\"],\"top\":[\"thin\",\"#2896ea\"],\"left\":[\"thin\",\"#2896ea\"],\"right\":[\"thin\",\"#2896ea\"]},\"font\":{\"size\":8},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#2896ea\"],\"top\":[\"thin\",\"#2896ea\"],\"left\":[\"thin\",\"#2896ea\"],\"right\":[\"thin\",\"#2896ea\"]},\"font\":{\"size\":8},\"align\":\"center\",\"format\":\"number\"},{\"bgcolor\":\"#5b9cd6\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#2896ea\"],\"top\":[\"thin\",\"#2896ea\"],\"left\":[\"thin\",\"#2896ea\"],\"right\":[\"thin\",\"#2896ea\"]}},{\"bgcolor\":\"#5b9cd6\"},{\"bgcolor\":\"#5b9cd6\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"font\":{\"size\":8},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"font\":{\"size\":8},\"align\":\"center\",\"format\":\"number\"},{\"bgcolor\":\"#5b9cd6\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#9cc2e6\"],\"top\":[\"thin\",\"#9cc2e6\"],\"left\":[\"thin\",\"#9cc2e6\"],\"right\":[\"thin\",\"#9cc2e6\"]}},{\"border\":{\"bottom\":[\"thin\",\"#9cc2e6\"],\"top\":[\"thin\",\"#9cc2e6\"],\"left\":[\"thin\",\"#9cc2e6\"],\"right\":[\"thin\",\"#9cc2e6\"]},\"font\":{\"size\":8},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#9cc2e6\"],\"top\":[\"thin\",\"#9cc2e6\"],\"left\":[\"thin\",\"#9cc2e6\"],\"right\":[\"thin\",\"#9cc2e6\"]},\"font\":{\"size\":8},\"align\":\"center\",\"format\":\"number\"},{\"bgcolor\":\"#5b9cd6\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#4371c6\"],\"top\":[\"thin\",\"#4371c6\"],\"left\":[\"thin\",\"#4371c6\"],\"right\":[\"thin\",\"#4371c6\"]}},{\"border\":{\"bottom\":[\"thin\",\"#4371c6\"],\"top\":[\"thin\",\"#4371c6\"],\"left\":[\"thin\",\"#4371c6\"],\"right\":[\"thin\",\"#4371c6\"]},\"font\":{\"size\":8},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#4371c6\"],\"top\":[\"thin\",\"#4371c6\"],\"left\":[\"thin\",\"#4371c6\"],\"right\":[\"thin\",\"#4371c6\"]},\"font\":{\"size\":8},\"align\":\"center\",\"format\":\"number\"},{\"bgcolor\":\"#5b9cd6\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#a5a5a5\"],\"top\":[\"thin\",\"#a5a5a5\"],\"left\":[\"thin\",\"#a5a5a5\"],\"right\":[\"thin\",\"#a5a5a5\"]}},{\"bgcolor\":\"#5b9cd6\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]},\"font\":{\"size\":8},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]},\"font\":{\"size\":8},\"align\":\"center\",\"format\":\"number\"},{\"bgcolor\":\"#5b9cd6\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#e7e5e6\"],\"top\":[\"thin\",\"#e7e5e6\"],\"left\":[\"thin\",\"#e7e5e6\"],\"right\":[\"thin\",\"#e7e5e6\"]}},{\"border\":{\"bottom\":[\"thin\",\"#e7e5e6\"],\"top\":[\"thin\",\"#e7e5e6\"],\"left\":[\"thin\",\"#e7e5e6\"],\"right\":[\"thin\",\"#e7e5e6\"]},\"font\":{\"size\":8},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#e7e5e6\"],\"top\":[\"thin\",\"#e7e5e6\"],\"left\":[\"thin\",\"#e7e5e6\"],\"right\":[\"thin\",\"#e7e5e6\"]},\"font\":{\"size\":8},\"align\":\"center\",\"format\":\"number\"},{\"bgcolor\":\"#5b9cd6\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#d0cecf\"],\"top\":[\"thin\",\"#d0cecf\"],\"left\":[\"thin\",\"#d0cecf\"],\"right\":[\"thin\",\"#d0cecf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#d0cecf\"],\"top\":[\"thin\",\"#d0cecf\"],\"left\":[\"thin\",\"#d0cecf\"],\"right\":[\"thin\",\"#d0cecf\"]},\"font\":{\"size\":8},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#d0cecf\"],\"top\":[\"thin\",\"#d0cecf\"],\"left\":[\"thin\",\"#d0cecf\"],\"right\":[\"thin\",\"#d0cecf\"]},\"font\":{\"size\":8},\"align\":\"center\",\"format\":\"number\"},{\"bgcolor\":\"#5b9cd6\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#d0cecf\"],\"top\":[\"thin\",\"#d0cecf\"],\"left\":[\"thin\",\"#d0cecf\"],\"right\":[\"thin\",\"#d0cecf\"]},\"color\":\"#ffffff\"},{\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"bgcolor\":\"#5b9cd6\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#afabac\"],\"top\":[\"thin\",\"#afabac\"],\"left\":[\"thin\",\"#afabac\"],\"right\":[\"thin\",\"#afabac\"]},\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#afabac\"],\"top\":[\"thin\",\"#afabac\"],\"left\":[\"thin\",\"#afabac\"],\"right\":[\"thin\",\"#afabac\"]},\"font\":{\"size\":8},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#afabac\"],\"top\":[\"thin\",\"#afabac\"],\"left\":[\"thin\",\"#afabac\"],\"right\":[\"thin\",\"#afabac\"]},\"font\":{\"size\":8},\"align\":\"center\",\"format\":\"number\"},{\"bgcolor\":\"#5b9cd6\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#f2f2f2\"],\"top\":[\"thin\",\"#f2f2f2\"],\"left\":[\"thin\",\"#f2f2f2\"],\"right\":[\"thin\",\"#f2f2f2\"]},\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#f2f2f2\"],\"top\":[\"thin\",\"#f2f2f2\"],\"left\":[\"thin\",\"#f2f2f2\"],\"right\":[\"thin\",\"#f2f2f2\"]},\"font\":{\"size\":8},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#f2f2f2\"],\"top\":[\"thin\",\"#f2f2f2\"],\"left\":[\"thin\",\"#f2f2f2\"],\"right\":[\"thin\",\"#f2f2f2\"]},\"font\":{\"size\":8},\"align\":\"center\",\"format\":\"number\"},{\"bgcolor\":\"#5b9cd6\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"font\":{\"size\":8},\"align\":\"center\",\"bgcolor\":\"#d7f2f9\"},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"font\":{\"size\":8},\"align\":\"center\",\"format\":\"number\",\"bgcolor\":\"#deeaf6\"},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"font\":{\"size\":8},\"align\":\"center\",\"format\":\"number\",\"bgcolor\":\"#bdd7ee\"},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"font\":{\"size\":10},\"align\":\"center\",\"bgcolor\":\"#d7f2f9\"},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"font\":{\"size\":9},\"align\":\"center\",\"bgcolor\":\"#d7f2f9\"},{\"align\":\"center\",\"bgcolor\":\"#bdd7ee\"},{\"bgcolor\":\"#bdd7ee\"},{\"bgcolor\":\"#bdd7ee\",\"format\":\"number\"},{\"bgcolor\":\"#bdd7ee\",\"format\":\"number\",\"align\":\"center\"}],\"validations\":[],\"isGroup\":true,\"cols\":{\"0\":{\"width\":21},\"1\":{\"width\":63},\"2\":{\"width\":85},\"3\":{\"width\":95},\"4\":{\"width\":83},\"5\":{\"width\":81},\"6\":{\"width\":88},\"7\":{\"width\":89},\"8\":{\"width\":87},\"9\":{\"width\":95},\"10\":{\"width\":92},\"11\":{\"width\":95},\"12\":{\"width\":96},\"13\":{\"width\":98},\"14\":{\"width\":98},\"15\":{\"width\":78},\"16\":{\"width\":110},\"17\":{\"width\":111},\"18\":{\"width\":102},\"19\":{\"width\":102},\"20\":{\"width\":114},\"21\":{\"width\":111},\"22\":{\"width\":113},\"23\":{\"width\":107},\"24\":{\"width\":115},\"25\":{\"width\":135},\"len\":49},\"merges\":[\"D2:P2\",\"B2:C3\",\"Q2:Z2\",\"B1:T1\",\"B5:C5\"]}', NULL, 'https://static.jeecg.com/designreport/images/chaoshi_1607069609875.png', 'admin', '2020-12-03 19:21:55', 'admin', '2021-07-13 05:39:05', 0, NULL, NULL, 1, 372, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('1334696790477377536', '20201204111149', '学校收入一览表', NULL, NULL, 'datainfo', '{\"loopBlockList\":[],\"area\":{\"sri\":1,\"sci\":24,\"eri\":5,\"eci\":24,\"width\":100,\"height\":138},\"excel_config_id\":\"1334696790477377536\",\"printConfig\":{\"paper\":\"A4\",\"width\":210,\"height\":297,\"definition\":1,\"isBackend\":false,\"marginX\":10,\"marginY\":10},\"rows\":{\"0\":{\"cells\":{\"1\":{\"text\":\"学校收入一览表\",\"merge\":[0,13],\"style\":25}},\"height\":71},\"1\":{\"cells\":{\"1\":{\"text\":\"校园信息\",\"merge\":[1,2],\"style\":40},\"4\":{\"text\":\"学生信息\",\"merge\":[1,2],\"style\":40},\"7\":{\"merge\":[1,5],\"style\":42,\"text\":\"收款信息\"},\"13\":{\"merge\":[0,10],\"text\":\"确认收入信息\",\"style\":43}},\"height\":23},\"2\":{\"cells\":{\"13\":{\"merge\":[0,3],\"text\":\"2020.09\",\"style\":46},\"17\":{\"merge\":[0,3],\"text\":\"2020.10\",\"style\":46},\"21\":{\"text\":\"合计\",\"style\":46,\"merge\":[0,2]}},\"height\":40},\"3\":{\"cells\":{\"1\":{\"text\":\"所属城际\",\"style\":50},\"2\":{\"text\":\"所属校园\",\"style\":50},\"3\":{\"text\":\"NC帐套\",\"style\":50},\"4\":{\"text\":\"学号\",\"style\":50},\"5\":{\"text\":\"姓名\",\"style\":50},\"6\":{\"text\":\"性质\",\"style\":50},\"7\":{\"text\":\"缴费金额\",\"style\":50},\"8\":{\"text\":\"缴费时间\",\"style\":50},\"9\":{\"text\":\"缴费性质\",\"style\":50},\"10\":{\"text\":\"缴费所属期间\",\"style\":50},\"11\":{\"text\":\"缴费月份数\",\"style\":50},\"12\":{\"text\":\"缴费方式\",\"style\":50},\"13\":{\"text\":\"全部\",\"style\":50},\"14\":{\"text\":\"学费\",\"style\":50},\"15\":{\"text\":\"餐费\",\"style\":50},\"16\":{\"text\":\"校车费\",\"style\":50},\"17\":{\"text\":\"全部\",\"style\":50},\"18\":{\"text\":\"学费\",\"style\":50},\"19\":{\"text\":\"餐费\",\"style\":50},\"20\":{\"text\":\"校车费\",\"style\":50},\"21\":{\"text\":\"全部\",\"style\":50},\"22\":{\"text\":\"学费\",\"style\":50},\"23\":{\"text\":\"餐费\",\"style\":50}}},\"4\":{\"cells\":{\"1\":{\"text\":\"#{shouru.group(city)}\",\"style\":45,\"aggregate\":\"group\"},\"2\":{\"text\":\"#{shouru.group(school)}\",\"style\":45,\"aggregate\":\"group\"},\"3\":{\"text\":\"#{shouru.group(ncnum)}\",\"style\":35,\"aggregate\":\"group\"},\"4\":{\"text\":\"#{shouru.num}\",\"style\":35},\"5\":{\"text\":\"#{shouru.name}\",\"style\":35},\"6\":{\"text\":\"#{shouru.class}\",\"style\":35},\"7\":{\"text\":\"#{shouru.pay}\",\"style\":35},\"8\":{\"text\":\"#{shouru.paytime}\",\"style\":35},\"9\":{\"text\":\"#{shouru.payclass}\",\"style\":35},\"10\":{\"text\":\"#{shouru.pay1}\",\"style\":35},\"11\":{\"text\":\"#{shouru.paymoth}\",\"style\":35},\"12\":{\"text\":\"#{shouru.pay2}\",\"style\":35},\"13\":{\"style\":33,\"text\":\"=SUM(O5:Q5)\"},\"14\":{\"text\":\"#{shouru.tuition_09}\",\"style\":35},\"15\":{\"text\":\"#{shouru.meals_09}\",\"style\":35},\"16\":{\"text\":\"#{shouru.busfee_09}\",\"style\":35},\"17\":{\"style\":33,\"text\":\"=SUM(S5:U5)\"},\"18\":{\"text\":\"#{shouru.tuition_10}\",\"style\":35},\"19\":{\"text\":\"#{shouru.meals_10}\",\"style\":35},\"20\":{\"text\":\"#{shouru.busfee_10}\",\"style\":35},\"21\":{\"style\":33,\"text\":\"=SUM(W5,X5)\"},\"22\":{\"style\":35,\"text\":\"=SUM(O5,S5)\"},\"23\":{\"style\":35,\"text\":\"=SUM(P5,T5)\"}},\"isDrag\":true,\"height\":25},\"5\":{\"cells\":{\"1\":{\"style\":66,\"text\":\"合计\"},\"2\":{\"text\":\" \",\"style\":66},\"3\":{\"style\":66,\"text\":\" \"},\"4\":{\"style\":66,\"text\":\" \"},\"5\":{\"style\":66,\"text\":\" \"},\"6\":{\"style\":66,\"text\":\" \"},\"7\":{\"style\":66,\"text\":\" \"},\"8\":{\"style\":66,\"text\":\" \"},\"9\":{\"style\":66,\"text\":\" \"},\"10\":{\"style\":66,\"text\":\" \"},\"11\":{\"style\":66,\"text\":\" \"},\"12\":{\"style\":66,\"text\":\" \"},\"13\":{\"style\":66,\"text\":\" \"},\"14\":{\"style\":66,\"text\":\" \"},\"15\":{\"style\":66,\"text\":\" \"},\"16\":{\"style\":66,\"text\":\" \"},\"17\":{\"style\":66,\"text\":\" \"},\"18\":{\"text\":\" \",\"style\":66},\"19\":{\"style\":66,\"text\":\" \"},\"20\":{\"style\":66,\"text\":\" \"},\"21\":{\"style\":15,\"text\":\"=SUM(V5)\"},\"22\":{\"style\":15,\"text\":\"=SUM(W5)\"},\"23\":{\"style\":15,\"text\":\"=SUM(X5)\"}}},\"9\":{\"cells\":{}},\"11\":{\"cells\":{}},\"len\":101},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":718,\"heightPx\":1047},\"dicts\":[],\"groupField\":\"shouru.city\",\"freeze\":\"A1\",\"dataRectWidth\":1881,\"displayConfig\":{},\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"center\"},{\"align\":\"center\",\"bgcolor\":\"#\"},{\"align\":\"center\",\"bgcolor\":\"#309fc6\"},{\"bgcolor\":\"#ffffff\"},{\"align\":\"center\",\"bgcolor\":\"#309fc6\",\"color\":\"#ffffff\"},{\"align\":\"center\",\"bgcolor\":\"#b2ddec\"},{\"align\":\"center\",\"bgcolor\":\"#309fc6\",\"color\":\"#ffffff\",\"font\":{\"size\":8}},{\"align\":\"center\",\"bgcolor\":\"#b2ddec\",\"font\":{\"size\":8}},{\"align\":\"center\",\"bgcolor\":\"#309fc6\",\"color\":\"#ffffff\",\"font\":{\"size\":9}},{\"align\":\"center\",\"bgcolor\":\"#b2ddec\",\"font\":{\"size\":9}},{\"align\":\"center\",\"bgcolor\":\"#309fc6\",\"color\":\"#ffffff\",\"font\":{\"size\":10}},{\"align\":\"center\",\"bgcolor\":\"\"},{\"align\":\"center\",\"bgcolor\":\"#309fc6\",\"color\":\"#ffffff\",\"font\":{\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"#309fc6\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"#b2ddec\",\"font\":{\"size\":9},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"#b2ddec\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"font\":{\"size\":9}},{\"align\":\"center\",\"font\":{\"size\":9}},{\"align\":\"center\",\"bgcolor\":\"#dff2f9\"},{\"bgcolor\":\"\"},{\"bgcolor\":\"#309fc6\"},{\"align\":\"center\",\"color\":\"#ffffff\"},{\"align\":\"center\",\"bgcolor\":\"#dff2f9\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"font\":{\"size\":16}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#b2ddec\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#dff2f9\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"b2ddec\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"¥b2ddec\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":8}},{\"align\":\"center\",\"bgcolor\":\"#b2ddec\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8}},{\"align\":\"center\",\"bgcolor\":\"#dff2f9\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"align\":\"center\",\"font\":{\"size\":8}},{\"align\":\"center\",\"bgcolor\":\"#dff2f9\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"align\":\"center\",\"font\":{\"size\":9}},{\"align\":\"center\",\"bgcolor\":\"\",\"color\":\"#ffffff\",\"font\":{\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"font\":{\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"bgcolor\":\"#5b9cd6\"},{\"align\":\"center\",\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"align\":\"center\",\"bgcolor\":\"#d7f2f9\",\"font\":{\"size\":9},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"#d7f2f9\",\"font\":{\"size\":8},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"#5b9cd6\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"bgcolor\":\"#5b9cd6\"},{\"align\":\"center\",\"bgcolor\":\"#bdd7ee\",\"font\":{\"size\":9},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"font\":{\"size\":8}},{\"align\":\"center\",\"bgcolor\":\"#bdd7ee\",\"font\":{\"size\":8},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"font\":{\"size\":10}},{\"align\":\"center\",\"bgcolor\":\"#bdd7ee\",\"font\":{\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"font\":{\"size\":10}},{\"align\":\"center\",\"bgcolor\":\"#d7f2f9\",\"font\":{\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"align\":\"center\",\"font\":{\"size\":10}},{\"font\":{\"size\":12}},{\"align\":\"center\",\"bgcolor\":\"#bdd7ee\",\"font\":{\"size\":12},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"font\":{\"size\":12}},{\"align\":\"center\",\"bgcolor\":\"#d7f2f9\",\"font\":{\"size\":12},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"align\":\"center\",\"font\":{\"size\":12}},{\"font\":{\"size\":10.5}},{\"align\":\"center\",\"bgcolor\":\"#bdd7ee\",\"font\":{\"size\":10.5},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"center\",\"font\":{\"size\":10.5}},{\"align\":\"center\",\"bgcolor\":\"#d7f2f9\",\"font\":{\"size\":10.5},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"align\":\"center\",\"font\":{\"size\":10.5}},{\"align\":\"left\",\"bgcolor\":\"#b2ddec\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"align\":\"left\"}],\"validations\":[],\"isGroup\":true,\"cols\":{\"0\":{\"width\":37},\"1\":{\"width\":79},\"2\":{\"width\":87},\"3\":{\"width\":79},\"4\":{\"width\":92},\"5\":{\"width\":90},\"6\":{\"width\":77},\"7\":{\"width\":83},\"8\":{\"width\":89},\"9\":{\"width\":79},\"10\":{\"width\":89},\"11\":{\"width\":84},\"12\":{\"width\":76},\"13\":{\"width\":67},\"14\":{\"width\":74},\"15\":{\"width\":69},\"16\":{\"width\":74},\"17\":{\"width\":68},\"18\":{\"width\":76},\"19\":{\"width\":79},\"20\":{\"width\":78},\"21\":{\"width\":74},\"22\":{\"width\":81},\"len\":49},\"merges\":[\"B2:D3\",\"E2:G3\",\"H2:M3\",\"N3:Q3\",\"R3:U3\",\"V3:X3\",\"N2:X2\",\"B1:O1\"]}', NULL, 'https://static.jeecg.com/designreport/images/xuexiao_1607069724407.png', 'admin', '2020-12-04 11:11:50', 'admin', '2021-07-13 05:39:04', 0, NULL, NULL, 1, 432, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('1334757703079301120', '20201204151358', '车间零件完工一览表', NULL, NULL, 'datainfo', '{\"loopBlockList\":[],\"area\":{\"sri\":7,\"sci\":2,\"eri\":7,\"eci\":2,\"width\":121,\"height\":25},\"excel_config_id\":\"1334757703079301120\",\"printConfig\":{\"paper\":\"A3\",\"width\":297,\"height\":420,\"definition\":1,\"isBackend\":false,\"marginX\":10,\"marginY\":10,\"layout\":\"landscape\"},\"rows\":{\"0\":{\"cells\":{\"1\":{\"text\":\"车间零件完工一览表\",\"merge\":[0,12],\"style\":23}},\"height\":81},\"1\":{\"cells\":{\"1\":{\"text\":\"车间\",\"style\":22},\"2\":{\"text\":\"成品名称\",\"style\":22},\"3\":{\"text\":\"半成品名称\",\"style\":22},\"4\":{\"text\":\"完工时间\",\"style\":22},\"5\":{\"text\":\"状态\",\"style\":22},\"6\":{\"text\":\"成品属性\",\"style\":22},\"7\":{\"text\":\"工单号\",\"style\":22},\"8\":{\"text\":\"工单数量\",\"style\":22},\"9\":{\"text\":\"计划数量\",\"style\":22},\"10\":{\"text\":\"完成数量\",\"style\":22},\"11\":{\"text\":\"UPH\",\"style\":22},\"12\":{\"text\":\"H/C\",\"style\":22},\"13\":{\"text\":\"计划时间\",\"style\":22},\"14\":{\"text\":\"良率\",\"style\":22},\"15\":{\"text\":\"备注\",\"style\":22}},\"height\":55},\"2\":{\"cells\":{\"1\":{\"text\":\"#{chejian.group(city)}\",\"style\":16,\"aggregate\":\"group\"},\"2\":{\"text\":\"#{chejian.finish}\",\"style\":14},\"3\":{\"text\":\"#{chejian.semifinish}\",\"style\":14},\"4\":{\"text\":\"#{chejian.time}\",\"style\":14},\"5\":{\"text\":\"#{chejian.state}\",\"style\":14},\"6\":{\"text\":\"#{chejian.attribute}\",\"style\":14},\"7\":{\"text\":\"#{chejian.num}\",\"style\":14},\"8\":{\"text\":\"#{chejian.gnum}\",\"style\":14},\"9\":{\"text\":\"#{chejian.jnum}\",\"style\":14},\"10\":{\"text\":\"#{chejian.wnum}\",\"style\":14},\"11\":{\"text\":\"#{chejian.uph}\",\"style\":14},\"12\":{\"text\":\"#{chejian.hc}\",\"style\":14},\"13\":{\"text\":\"#{chejian.jtime}\",\"style\":14},\"14\":{\"text\":\"#{chejian.yield}\",\"style\":14},\"15\":{\"text\":\"#{chejian.beizhu}\",\"style\":14}},\"isDrag\":true,\"height\":35},\"len\":100},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":718,\"heightPx\":1047},\"dicts\":[],\"groupField\":\"chejian.city\",\"freeze\":\"A1\",\"dataRectWidth\":1476,\"displayConfig\":{},\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"center\"},{\"align\":\"center\",\"bgcolor\":\"#\"},{\"align\":\"center\",\"bgcolor\":\"#309fc6\"},{\"align\":\"center\",\"bgcolor\":\"#309fc6\",\"color\":\"#ffffff\"},{\"bgcolor\":\"#309fc6\"},{\"bgcolor\":\"#309fc6\",\"color\":\"#ffffff\"},{\"align\":\"center\",\"bgcolor\":\"#309fc6\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"bgcolor\":\"#309fc6\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"font\":{\"bold\":true}},{\"font\":{\"bold\":true,\"size\":16}},{\"font\":{\"size\":9}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9}},{\"font\":{\"size\":9},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9},\"align\":\"center\",\"bgcolor\":\"#\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9},\"align\":\"center\",\"bgcolor\":\"#b2ddec\"},{\"font\":{\"size\":8}},{\"align\":\"center\",\"bgcolor\":\"#309fc6\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8}},{\"font\":{\"size\":8},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8},\"align\":\"center\",\"bgcolor\":\"#b2ddec\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8},\"align\":\"center\"},{\"align\":\"center\",\"bgcolor\":\"#309fc6\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9}},{\"font\":{\"bold\":true,\"size\":16},\"align\":\"center\"}],\"validations\":[],\"isGroup\":true,\"cols\":{\"0\":{\"width\":27},\"1\":{\"width\":106},\"2\":{\"width\":121},\"3\":{\"width\":124},\"4\":{\"width\":87},\"5\":{\"width\":76},\"6\":{\"width\":82},\"7\":{\"width\":81},\"8\":{\"width\":69},\"9\":{\"width\":76},\"10\":{\"width\":81},\"15\":{\"width\":146},\"len\":50},\"merges\":[\"B1:N1\"]}', NULL, 'https://static.jeecg.com/designreport/images/QQ截图20201216185352_1608116050060.png', 'admin', '2020-12-04 15:13:58', 'admin', '2021-07-13 05:39:02', 0, NULL, NULL, 1, 526, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('1338370016550195200', '20201214142804', '条形码报表', NULL, NULL, 'datainfo', '{\"loopBlockList\":[],\"area\":{\"sri\":3,\"sci\":4,\"eri\":3,\"eci\":4,\"width\":96,\"height\":47},\"excel_config_id\":\"1338370016550195200\",\"printConfig\":{\"paper\":\"A4\",\"width\":210,\"height\":297,\"definition\":1,\"isBackend\":false,\"marginX\":10,\"marginY\":10,\"layout\":\"portrait\"},\"rows\":{\"0\":{\"cells\":{\"1\":{\"merge\":[1,3],\"text\":\"居民身份证申领登记表\",\"style\":39},\"5\":{\"merge\":[0,2],\"text\":\"\",\"rendered\":\"\",\"display\":\"text\"},\"-1\":{\"text\":\"${tm.tp}\"}},\"height\":27},\"1\":{\"cells\":{\"5\":{\"style\":2,\"virtual\":\"ZiOFmILaRjdmVs6E\",\"rendered\":\"DnK6I7VRVFyw8dUQ\",\"display\":\"barcode\",\"text\":\"${tm.tm}\",\"merge\":[0,2]}},\"height\":52},\"2\":{\"cells\":{\"1\":{\"text\":\"受理单位(盖章)珠海市公安局\",\"merge\":[0,3],\"style\":36},\"8\":{\"text\":\"\",\"rendered\":\"\"}},\"height\":34},\"3\":{\"cells\":{\"1\":{\"text\":\"姓名\",\"style\":24},\"2\":{\"text\":\"${tm.name}\",\"style\":7,\"rendered\":\"\"},\"3\":{\"text\":\"性别\",\"style\":16},\"4\":{\"text\":\"${tm.sex}\",\"style\":7,\"isDict\":1,\"dictCode\":\"sex1\",\"rendered\":\"\"},\"5\":{\"text\":\"民族\",\"style\":16},\"6\":{\"text\":\"${tm.nation}\",\"style\":7},\"7\":{\"text\":\"${tm.tp}\",\"style\":7,\"merge\":[2,0],\"rendered\":\"ftkUSZOje4A5gVO3\",\"display\":\"img\"},\"9\":{\"text\":\"\",\"rendered\":\"\"}},\"isDrag\":true,\"height\":47},\"4\":{\"cells\":{\"1\":{\"text\":\"出生日期\",\"style\":24},\"2\":{\"text\":\"${tm.birth}\",\"style\":32,\"merge\":[0,4]},\"8\":{\"text\":\"\",\"rendered\":\"\"}},\"isDrag\":true,\"height\":51},\"5\":{\"cells\":{\"1\":{\"text\":\"常住户口所在地住址\",\"style\":21},\"2\":{\"text\":\"${tm.zhuzhi}\",\"style\":7,\"merge\":[0,4]},\"8\":{\"text\":\"\",\"rendered\":\"\",\"config\":\"\"}},\"isDrag\":true,\"height\":62},\"6\":{\"cells\":{\"1\":{\"text\":\"公民身份证\",\"style\":24},\"2\":{\"text\":\"${tm.card}\",\"style\":7,\"merge\":[0,5]}},\"isDrag\":true,\"height\":55},\"7\":{\"cells\":{\"1\":{\"text\":\"有限期限\",\"style\":24},\"2\":{\"text\":\"${tm.ydate}\",\"style\":34,\"merge\":[0,1]},\"4\":{\"text\":\"签发机关\",\"style\":24},\"5\":{\"text\":\"${tm.qfjg}\",\"style\":7,\"merge\":[0,2]}},\"isDrag\":true,\"height\":52},\"8\":{\"cells\":{\"1\":{\"text\":\"申领原因\",\"style\":24},\"2\":{\"text\":\"${tm.slyy}\",\"style\":7,\"merge\":[0,5]}},\"isDrag\":true,\"height\":55},\"9\":{\"cells\":{\"1\":{\"text\":\"受理时间\",\"style\":24},\"2\":{\"text\":\"${tm.sdate}\",\"style\":32,\"merge\":[0,1]},\"4\":{\"text\":\"受理号\",\"style\":24},\"5\":{\"text\":\"${tm.shao}\",\"style\":7,\"merge\":[0,2]}},\"isDrag\":true,\"height\":49},\"10\":{\"cells\":{\"1\":{\"text\":\"承办人\",\"style\":24},\"2\":{\"text\":\"${tm.cbr}\",\"style\":7,\"merge\":[0,1]},\"4\":{\"text\":\"受理单位领导\",\"style\":24},\"5\":{\"text\":\"${tm.sld}\",\"style\":7,\"merge\":[0,2]}},\"isDrag\":true,\"height\":42},\"11\":{\"cells\":{\"1\":{\"text\":\"申请(监护)人签名\",\"style\":21},\"2\":{\"text\":\"${tm.sr}\",\"style\":7,\"merge\":[0,1]},\"4\":{\"text\":\"申请(监护)人联系电话\",\"style\":21},\"5\":{\"text\":\"${tm.jphone}\",\"style\":7,\"merge\":[0,2]}},\"isDrag\":true,\"height\":59},\"12\":{\"cells\":{\"1\":{\"text\":\"领证人签名\",\"style\":24},\"2\":{\"text\":\"${tm.lzr}\",\"style\":7,\"merge\":[0,1]},\"4\":{\"text\":\"领证时间\",\"style\":24},\"5\":{\"text\":\"${tm.ldate}\",\"style\":32,\"merge\":[0,2]}},\"isDrag\":true,\"height\":57},\"13\":{\"cells\":{\"1\":{\"text\":\"是否通过邮政特快专递方式领取二代\",\"merge\":[0,1],\"style\":24},\"3\":{\"text\":\"${tm.sk}\",\"style\":7,\"merge\":[0,4]}},\"isDrag\":true,\"height\":50},\"14\":{\"cells\":{\"1\":{\"text\":\"投递地址\",\"style\":24},\"2\":{\"text\":\"${tm.dizhi}\",\"style\":7,\"merge\":[0,2]},\"5\":{\"text\":\"收件人\",\"style\":24},\"6\":{\"style\":7,\"text\":\" \",\"merge\":[0,1]}},\"isDrag\":true,\"height\":53},\"15\":{\"cells\":{\"1\":{\"text\":\"邮政编码\",\"style\":24},\"2\":{\"text\":\"\",\"style\":7,\"merge\":[0,1]},\"4\":{\"text\":\"备注\",\"style\":24},\"5\":{\"text\":\"\",\"style\":7,\"merge\":[0,2]}},\"isDrag\":true,\"height\":47},\"16\":{\"cells\":{\"1\":{\"merge\":[0,6],\"text\":\"公安部治安管理局治\",\"style\":31}}},\"len\":100},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":718,\"heightPx\":1047},\"dicts\":[\"sex1\",\"sex1\",\"sex1\"],\"freeze\":\"A1\",\"dataRectWidth\":704,\"displayConfig\":{},\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"font\":{\"size\":16}},{\"font\":{\"size\":16},\"align\":\"center\"},{\"align\":\"center\"},{\"textwrap\":true},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"font\":{\"name\":\"宋体\",\"size\":9}},{\"font\":{\"name\":\"宋体\",\"size\":9},\"color\":\"#3f3f3f\"},{\"font\":{\"name\":\"宋体\",\"size\":9},\"color\":\"#0c0c0c\"},{\"font\":{\"name\":\"宋体\",\"size\":9},\"color\":\"#7f7f7f\"},{\"font\":{\"name\":\"宋体\",\"size\":9},\"color\":\"#595959\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"},\"align\":\"right\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\",\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\",\"bold\":false}},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\",\"bold\":false}},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\",\"bold\":false},\"align\":\"center\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\",\"bold\":true}},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\",\"bold\":true},\"align\":\"center\"},{\"font\":{\"name\":\"宋体\",\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\",\"bold\":true},\"align\":\"right\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\",\"bold\":true},\"align\":\"center\"},{\"font\":{\"name\":\"宋体\",\"bold\":true},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"},\"align\":\"center\"},{\"font\":{\"size\":8}},{\"font\":{\"size\":8},\"align\":\"center\"},{\"font\":{\"size\":8},\"align\":\"right\"},{\"font\":{\"size\":10},\"align\":\"right\"},{\"font\":{\"size\":10},\"align\":\"right\",\"color\":\"#7f7f7f\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"},\"format\":\"date2\"},{\"format\":\"date2\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"},\"format\":\"date\"},{\"format\":\"date\"},{\"font\":{\"name\":\"宋体\",\"size\":9},\"color\":\"#595959\",\"valign\":\"bottom\"},{\"align\":\"center\",\"font\":{\"bold\":true}},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":16}},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":16},\"valign\":\"bottom\"}],\"validations\":[],\"cols\":{\"0\":{\"width\":16},\"1\":{\"width\":103},\"2\":{\"width\":156},\"3\":{\"width\":51},\"4\":{\"width\":96},\"5\":{\"width\":61},\"6\":{\"width\":106},\"7\":{\"width\":115},\"8\":{\"width\":135},\"len\":50},\"merges\":[\"B1:E2\",\"F1:H1\",\"F2:H2\",\"B3:E3\",\"H4:H6\",\"C5:G5\",\"C6:G6\",\"C7:H7\",\"C8:D8\",\"F8:H8\",\"C9:H9\",\"C10:D10\",\"F10:H10\",\"C11:D11\",\"F11:H11\",\"C12:D12\",\"F12:H12\",\"C13:D13\",\"F13:H13\",\"B14:C14\",\"D14:H14\",\"C15:E15\",\"G15:H15\",\"C16:D16\",\"F16:H16\",\"B17:H17\"]}', NULL, 'https://static.jeecg.com/designreport/images/未标题-1_1608118350039.png', 'admin', '2020-12-14 14:28:04', 'admin', '2021-07-13 05:39:00', 0, NULL, NULL, 1, 771, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('1338744112815411200', '20201215151426', '简单条件查询报表', NULL, NULL, 'datainfo', '{\"loopBlockList\":[],\"area\":false,\"printElWidth\":718,\"excel_config_id\":\"1338744112815411200\",\"printElHeight\":1047,\"rows\":{\"1\":{\"cells\":{\"1\":{\"text\":\"职务\",\"style\":51},\"2\":{\"text\":\"雇员ID\",\"style\":51},\"3\":{\"text\":\"姓名\",\"style\":51},\"4\":{\"text\":\"性别\",\"style\":51},\"5\":{\"text\":\"雇佣日期\",\"style\":51},\"6\":{\"text\":\"家庭电话\",\"style\":51},\"7\":{\"text\":\"出生日期\",\"style\":51},\"8\":{\"text\":\"户口所在地\",\"style\":51},\"9\":{\"text\":\"联系地址\",\"style\":51},\"10\":{\"text\":\"紧急联系人\",\"style\":52}},\"height\":37},\"2\":{\"cells\":{\"0\":{\"style\":18},\"1\":{\"style\":21,\"text\":\"#{jdcx.group(update_by)}\",\"aggregate\":\"group\"},\"2\":{\"style\":21,\"text\":\"#{jdcx.id}\"},\"3\":{\"style\":21,\"text\":\"#{jdcx.name}\"},\"4\":{\"style\":21,\"text\":\"#{jdcx.sex}\"},\"5\":{\"style\":24,\"text\":\"#{jdcx.gtime}\"},\"6\":{\"style\":21,\"text\":\"#{jdcx.jphone}\"},\"7\":{\"style\":24,\"text\":\"#{jdcx.birth}\"},\"8\":{\"style\":21,\"text\":\"#{jdcx.hukou}\"},\"9\":{\"style\":21,\"text\":\"#{jdcx.laddress}\"},\"10\":{\"style\":56,\"text\":\"#{jdcx.jperson}\"},\"11\":{\"style\":18},\"12\":{\"style\":18},\"13\":{\"style\":18},\"14\":{\"style\":18},\"15\":{\"style\":18},\"16\":{\"style\":18},\"17\":{\"style\":18},\"18\":{\"style\":18},\"19\":{\"style\":18},\"20\":{\"style\":18},\"21\":{\"style\":18},\"22\":{\"style\":18},\"23\":{\"style\":18},\"24\":{\"style\":18},\"25\":{\"style\":18},\"26\":{\"style\":18},\"27\":{\"style\":18},\"28\":{\"style\":18},\"29\":{\"style\":18},\"30\":{\"style\":18},\"31\":{\"style\":18},\"32\":{\"style\":18},\"33\":{\"style\":18},\"34\":{\"style\":18},\"35\":{\"style\":18},\"36\":{\"style\":18},\"37\":{\"style\":18},\"38\":{\"style\":18},\"39\":{\"style\":18},\"40\":{\"style\":18},\"41\":{\"style\":18},\"42\":{\"style\":18},\"43\":{\"style\":18},\"44\":{\"style\":18},\"45\":{\"style\":18},\"46\":{\"style\":18},\"47\":{\"style\":18},\"48\":{\"style\":18}},\"height\":34},\"3\":{\"cells\":{\"0\":{\"style\":39},\"1\":{\"style\":39},\"2\":{\"style\":39},\"3\":{\"style\":39},\"4\":{\"style\":39},\"5\":{\"style\":39},\"6\":{\"style\":39},\"7\":{\"style\":39},\"8\":{\"style\":39},\"9\":{\"style\":39},\"10\":{\"style\":39},\"11\":{\"style\":39},\"12\":{\"style\":39},\"13\":{\"style\":39},\"14\":{\"style\":39},\"15\":{\"style\":39},\"16\":{\"style\":39},\"17\":{\"style\":39},\"18\":{\"style\":39},\"19\":{\"style\":39},\"20\":{\"style\":39},\"21\":{\"style\":39},\"22\":{\"style\":39},\"23\":{\"style\":39},\"24\":{\"style\":39}}},\"4\":{\"cells\":{\"1\":{\"text\":\"备注:\",\"style\":62},\"2\":{\"style\":63,\"text\":\" \"},\"3\":{\"style\":63,\"text\":\" \"},\"4\":{\"style\":63,\"text\":\" \"},\"5\":{\"style\":63,\"text\":\" \"},\"6\":{\"style\":63,\"text\":\" \"},\"7\":{\"style\":64,\"text\":\" \"}}},\"5\":{\"cells\":{\"1\":{\"text\":\"1、支持模糊查询,需要输入 “*+字符串”或 “字符串+* ”或“*+字符串+*”,如:张* / *丽 / *亚*;\",\"style\":65,\"merge\":[0,6]}}},\"6\":{\"cells\":{\"1\":{\"text\":\"2、以上“出生日期”为时间类型;\",\"style\":65,\"merge\":[0,6]}}},\"7\":{\"cells\":{\"1\":{\"text\":\"3、以上“雇佣日期”为日期类型\",\"style\":65,\"merge\":[0,6]}}},\"8\":{\"cells\":{\"1\":{\"text\":\"4、以上“姓名”为字符串类型,支持精准查询和模糊查询;\",\"style\":67,\"merge\":[0,6]}}},\"len\":100},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":718,\"heightPx\":1047},\"dicts\":[],\"groupField\":\"jdcx.update_by\",\"freeze\":\"A1\",\"dataRectWidth\":1242,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"bgcolor\":\"#5b9cd6\"},{\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"color\":\"#ffffff\"},{\"align\":\"center\"},{\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"align\":\"center\"},{\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"align\":\"center\"},{\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#f1f9f6\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\"},{\"font\":{\"size\":8}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#f1f9f6\",\"font\":{\"size\":8}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":8}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8}},{\"font\":{\"size\":9}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#f1f9f6\",\"font\":{\"size\":9}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":9}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9}},{\"font\":{\"size\":9},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#f1f9f6\",\"font\":{\"size\":9},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":9},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":9},\"align\":\"left\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9},\"align\":\"left\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9},\"align\":\"center\",\"format\":\"date\"},{\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"name\":\"宋体\"}},{\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#f1f9f6\",\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"left\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"center\",\"format\":\"date\"},{\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#f1f9f6\",\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"left\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"center\",\"format\":\"date\"},{\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\"}},{\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#f1f9f6\",\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"left\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"format\":\"date\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"format\":\"date2\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"format\":\"normal\"},{\"align\":\"center\",\"bgcolor\":\"#5b9cd6\"},{\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"align\":\"center\",\"border\":{\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"align\":\"center\",\"font\":{\"size\":9}},{\"border\":{\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"]}},{\"border\":{\"top\":[\"thin\",\"#000100\"]}},{\"border\":{\"top\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"top\":[\"thin\",\"#000100\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"top\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"name\":\"宋体\"}},{\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9},\"align\":\"center\",\"format\":\"number\"}],\"validations\":[],\"isGroup\":true,\"cols\":{\"0\":{\"width\":40},\"1\":{\"width\":88},\"2\":{\"width\":86},\"3\":{\"width\":97},\"4\":{\"width\":67},\"5\":{\"width\":103},\"6\":{\"width\":115},\"7\":{\"width\":90},\"8\":{\"width\":239},\"9\":{\"width\":217},\"len\":50},\"merges\":[\"B6:H6\",\"B7:H7\",\"B8:H8\",\"B9:H9\"]}', NULL, 'https://static.jeecg.com/designreport/images/QQ截图20201216112919_1608089379396.png', 'admin', '2020-12-15 15:14:27', 'admin', '2021-07-13 05:38:58', 0, NULL, NULL, 1, 1059, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('1338769064067076098', '202012151514266124', '多选条件查询报表', NULL, NULL, 'datainfo', '{\"loopBlockList\":[],\"area\":{\"sri\":5,\"sci\":1,\"eri\":5,\"eci\":1,\"width\":107,\"height\":25},\"excel_config_id\":\"1338769064067076098\",\"printConfig\":{\"paper\":\"A3\",\"width\":297,\"height\":420,\"definition\":1,\"isBackend\":false,\"marginX\":10,\"marginY\":10,\"layout\":\"landscape\"},\"rows\":{\"0\":{\"cells\":{}},\"1\":{\"cells\":{\"1\":{\"text\":\"职务\",\"style\":51},\"2\":{\"text\":\"雇员ID\",\"style\":51},\"3\":{\"text\":\"姓名\",\"style\":51},\"4\":{\"style\":51,\"text\":\"性别\"},\"5\":{\"text\":\"雇佣日期\",\"style\":51},\"6\":{\"text\":\"家庭电话\",\"style\":51},\"7\":{\"text\":\"出生日期\",\"style\":51},\"8\":{\"text\":\"户口所在地\",\"style\":51},\"9\":{\"text\":\"联系地址\",\"style\":51},\"10\":{\"text\":\"紧急联系人\",\"style\":51}},\"height\":46},\"2\":{\"cells\":{\"1\":{\"text\":\"#{pop.group(update_by)}\",\"style\":53,\"aggregate\":\"group\"},\"2\":{\"text\":\"#{pop.group(id)}\",\"style\":54,\"aggregate\":\"group\"},\"3\":{\"text\":\"#{pop.group(name)}\",\"style\":54,\"aggregate\":\"group\"},\"4\":{\"text\":\"#{pop.sex}\",\"style\":55},\"5\":{\"text\":\"#{pop.gtime}\",\"style\":56},\"6\":{\"text\":\"#{pop.jphone}\",\"style\":57},\"7\":{\"text\":\"#{pop.birth}\",\"style\":56},\"8\":{\"text\":\"#{pop.hukou}\",\"style\":58},\"9\":{\"text\":\"#{pop.laddress}\",\"style\":57},\"10\":{\"text\":\"#{pop.jperson}\",\"style\":57}},\"isDrag\":true,\"height\":35},\"5\":{\"cells\":{\"2\":{\"text\":\"\"}},\"isDrag\":true},\"len\":99},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":718,\"heightPx\":1047},\"dicts\":[],\"groupField\":\"pop.update_by\",\"freeze\":\"A1\",\"dataRectWidth\":1494,\"displayConfig\":{},\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"bgcolor\":\"#5b9cd6\"},{\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"color\":\"#ffffff\"},{\"align\":\"center\"},{\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"align\":\"center\"},{\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"align\":\"center\"},{\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#f1f9f6\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\"},{\"font\":{\"size\":8}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#f1f9f6\",\"font\":{\"size\":8}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":8}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":8}},{\"font\":{\"size\":9}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#f1f9f6\",\"font\":{\"size\":9}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":9}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9}},{\"font\":{\"size\":9},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#f1f9f6\",\"font\":{\"size\":9},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":9},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":9},\"align\":\"left\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9},\"align\":\"left\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9},\"align\":\"center\",\"format\":\"date\"},{\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"name\":\"宋体\"}},{\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#f1f9f6\",\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"left\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"center\",\"format\":\"date\"},{\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#f1f9f6\",\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ddefe8\",\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"left\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"center\",\"format\":\"date\"},{\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#9cc2e6\",\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#bdd7ee\",\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#deeaf6\",\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ffffff\",\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":10,\"name\":\"宋体\"},\"align\":\"center\",\"format\":\"normal\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#deeaf6\",\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#bdd7ee\",\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ffffff\",\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"宋体\"},\"align\":\"center\",\"format\":\"normal\"},{\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\"}},{\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#deeaf6\",\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#bdd7ee\",\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#ffffff\",\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"format\":\"date\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"format\":\"normal\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"font\":{\"size\":9,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"format\":\"date2\"}],\"validations\":[],\"isGroup\":true,\"cols\":{\"0\":{\"width\":48},\"1\":{\"width\":107},\"3\":{\"width\":91},\"4\":{\"width\":142},\"5\":{\"width\":130},\"6\":{\"width\":131},\"7\":{\"width\":235},\"8\":{\"width\":230},\"9\":{\"width\":148},\"10\":{\"width\":132},\"len\":50},\"merges\":[]}', NULL, 'https://static.jeecg.com/designreport/images/QQ截图20201216185224_1608116008543.png', 'admin', '2020-12-15 16:53:13', 'admin', '2021-07-13 05:38:57', 0, NULL, NULL, 1, 907, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('1347373863746539520', '20210108104603', '实习证明', NULL, NULL, 'printinfo', '{\"loopBlockList\":[],\"area\":{\"sri\":16,\"sci\":5,\"eri\":16,\"eci\":5,\"width\":147,\"height\":25},\"excel_config_id\":\"1347373863746539520\",\"printConfig\":{\"paper\":\"A4\",\"width\":210,\"height\":297,\"definition\":1,\"isBackend\":false,\"marginX\":10,\"marginY\":10,\"layout\":\"portrait\"},\"rows\":{\"0\":{\"cells\":{\"0\":{\"text\":\"\"},\"1\":{\"text\":\"\"}}},\"1\":{\"cells\":{\"0\":{\"text\":\"\"}}},\"3\":{\"cells\":{\"2\":{\"text\":\"\",\"rendered\":\"\"}}},\"5\":{\"cells\":{},\"height\":29},\"6\":{\"cells\":{\"2\":{\"text\":\"\",\"style\":2}},\"height\":34},\"7\":{\"cells\":{\"2\":{\"merge\":[0,4],\"text\":\"实习证明\",\"style\":2}},\"height\":41},\"8\":{\"cells\":{\"1\":{\"text\":\"\",\"style\":3},\"2\":{\"text\":\"\"}}},\"9\":{\"cells\":{\"1\":{\"text\":\"\",\"style\":3},\"2\":{\"text\":\"\",\"style\":3},\"3\":{\"text\":\"\"}},\"isDrag\":true,\"height\":33},\"10\":{\"cells\":{\"2\":{\"text\":\"${tt.name}\",\"style\":11},\"3\":{\"text\":\"同学在我公司与 2020年4月1日 至 2020年5月1日 实习。\",\"style\":19,\"merge\":[0,3],\"height\":34}},\"height\":34},\"11\":{\"cells\":{},\"height\":28},\"12\":{\"cells\":{\"1\":{\"text\":\"\",\"style\":6},\"2\":{\"style\":13,\"text\":\"${tt.pingjia}\",\"merge\":[3,4],\"height\":129}},\"height\":36},\"13\":{\"cells\":{},\"height\":29},\"14\":{\"cells\":{},\"height\":33},\"15\":{\"cells\":{},\"height\":31},\"16\":{\"cells\":{}},\"17\":{\"cells\":{\"1\":{\"text\":\"\"},\"2\":{\"text\":\"特此证明!\",\"style\":12}}},\"20\":{\"cells\":{\"2\":{\"text\":\"\"},\"3\":{\"text\":\"\",\"style\":3},\"4\":{\"text\":\"\"}}},\"21\":{\"cells\":{\"4\":{\"text\":\"\"}}},\"22\":{\"cells\":{\"3\":{\"text\":\"\",\"style\":3},\"4\":{\"text\":\"证明人:\",\"style\":11},\"5\":{\"text\":\"${tt.lingdao}\",\"style\":12}}},\"23\":{\"cells\":{\"4\":{\"text\":\"\"},\"5\":{\"text\":\"${tt.shijian}\",\"style\":15}}},\"len\":100},\"dbexps\":[],\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":576,\"displayConfig\":{},\"background\":{\"path\":\"https://static.jeecg.com/designreport/images/11_1611283832037.png\",\"repeat\":\"no-repeat\",\"width\":\"\",\"height\":\"\"},\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":14}},{\"align\":\"center\",\"font\":{\"size\":16}},{\"align\":\"right\"},{\"align\":\"left\"},{\"align\":\"left\",\"valign\":\"top\"},{\"align\":\"left\",\"valign\":\"top\",\"textwrap\":true},{\"font\":{\"size\":16}},{\"align\":\"left\",\"valign\":\"top\",\"textwrap\":false},{\"textwrap\":false},{\"textwrap\":true},{\"align\":\"right\",\"font\":{\"size\":12}},{\"font\":{\"size\":12}},{\"align\":\"left\",\"valign\":\"top\",\"textwrap\":true,\"font\":{\"size\":12}},{\"textwrap\":true,\"font\":{\"size\":12}},{\"align\":\"left\",\"font\":{\"size\":12}},{\"font\":{\"size\":12},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":14}},{\"font\":{\"size\":10}},{\"textwrap\":false,\"font\":{\"size\":12}}],\"validations\":[],\"cols\":{\"0\":{\"width\":69},\"1\":{\"width\":41},\"4\":{\"width\":119},\"5\":{\"width\":147},\"6\":{\"width\":31},\"len\":50},\"merges\":[\"C8:G8\",\"D11:G11\",\"C13:G16\"]}', NULL, 'https://static.jeecg.com/designreport/images/未标题-1_1610074948259.png', 'admin', '2021-01-08 10:46:04', 'admin', '2021-07-13 05:39:21', 0, NULL, NULL, 1, 124, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('1347454742040809472', '20210108161240', '实例:年度各月份佣金收入', NULL, NULL, 'datainfo', '{\"loopBlockList\":[],\"area\":false,\"printElWidth\":718,\"excel_config_id\":\"1347454742040809472\",\"printElHeight\":1047,\"rows\":{\"1\":{\"cells\":{\"1\":{\"text\":\" \",\"virtual\":\"pZTpI3BKFw0lh6D7\"},\"2\":{\"text\":\"年度各月份佣金收入\",\"style\":23,\"merge\":[0,3],\"virtual\":\"pZTpI3BKFw0lh6D7\"},\"3\":{\"style\":24},\"4\":{\"style\":24},\"5\":{\"style\":24},\"6\":{\"text\":\" \"}},\"height\":37},\"2\":{\"cells\":{\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"}}},\"4\":{\"cells\":{\"1\":{\"text\":\"查询年度:2019\"},\"4\":{\"text\":\"查询机构:总公司\"},\"6\":{\"text\":\"单位:元\"}}},\"6\":{\"cells\":{\"1\":{\"text\":\"月份\",\"style\":12},\"2\":{\"text\":\"佣金/主营业收入\",\"style\":12},\"3\":{\"text\":\"累计\",\"style\":12},\"4\":{\"text\":\"历史最低水平\",\"style\":12},\"5\":{\"text\":\"历史平均水平\",\"style\":12},\"6\":{\"text\":\"历史最高水平\",\"style\":12}}},\"7\":{\"cells\":{\"1\":{\"text\":\"#{tmp_report_data_1.monty}\",\"style\":0},\"2\":{\"text\":\"#{tmp_report_data_1.main_income}\",\"style\":0},\"3\":{\"text\":\"#{tmp_report_data_1.total}\",\"style\":18},\"4\":{\"text\":\"#{tmp_report_data_1.his_lowest}\",\"style\":0},\"5\":{\"text\":\"#{tmp_report_data_1.his_average}\",\"style\":0},\"6\":{\"text\":\"#{tmp_report_data_1.his_highest}\",\"style\":0}},\"isDrag\":true},\"9\":{\"cells\":{\"1\":{\"merge\":[1,1]}}},\"len\":99},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":718,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":678,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"bold\":true}},{\"font\":{\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"bold\":false}},{\"font\":{\"bold\":false}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"bold\":true},\"align\":\"center\"},{\"font\":{\"bold\":true},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"bold\":true,\"size\":15},\"align\":\"center\"},{\"font\":{\"bold\":true,\"size\":15},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#01b0f1\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#33CCCC\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#33CCCC\",\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#33CCCC\",\"align\":\"left\"},{\"font\":{\"bold\":true,\"size\":16}},{\"font\":{\"bold\":true,\"size\":24}},{\"font\":{\"bold\":true,\"size\":22}},{\"font\":{\"bold\":true,\"size\":22},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"format\":\"usd\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"format\":\"rmb\"},{\"font\":{\"bold\":true,\"name\":\"黑体\"}},{\"font\":{\"bold\":true,\"name\":\"黑体\",\"size\":22}},{\"font\":{\"bold\":true,\"name\":\"宋体\",\"size\":22}},{\"font\":{\"bold\":true,\"name\":\"楷体\",\"size\":22}},{\"font\":{\"bold\":true,\"name\":\"楷体\",\"size\":22},\"align\":\"center\"},{\"align\":\"center\"}],\"validations\":[],\"cols\":{\"0\":{\"width\":29},\"1\":{\"width\":111},\"2\":{\"width\":116},\"4\":{\"width\":122},\"len\":50},\"merges\":[\"B10:C11\",\"C2:F2\"],\"imgList\":[{\"row\":1,\"col\":1,\"width\":\"148\",\"height\":\"56\",\"src\":\"https://static.jeecg.com/designreport/images/kunlunlog_1610591367645.png\",\"layer_id\":\"pZTpI3BKFw0lh6D7\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[1,1],[1,2]]}]}', NULL, NULL, 'admin', '2021-01-08 16:12:40', 'admin', '2021-07-13 05:38:55', 0, NULL, NULL, 1, 62, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('1347459370216198144', '20210108164121', '实例:来源收入统计', NULL, NULL, 'datainfo', '{\"loopBlockList\":[],\"chartList\":[{\"row\":1,\"col\":1,\"width\":\"624\",\"height\":\"281\",\"config\":\"{\\\"legend\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":\\\"12\\\"},\\\"top\\\":\\\"top\\\",\\\"left\\\":\\\"right\\\",\\\"orient\\\":\\\"vertical\\\",\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"中国石油全资(集团所属)\\\",\\\"中国石油全资(股份所属)\\\",\\\"中石油控股或有控股权\\\",\\\"中石油参股\\\",\\\"非中石油\\\"],\\\"show\\\":true},\\\"series\\\":[{\\\"isRose\\\":false,\\\"data\\\":[{\\\"name\\\":\\\"中国石油全资(集团所属)\\\",\\\"value\\\":38460270.57,\\\"itemStyle\\\":{\\\"color\\\":\\\"#E46C8A\\\"}},{\\\"name\\\":\\\"中国石油全资(股份所属)\\\",\\\"value\\\":227595.77,\\\"itemStyle\\\":{\\\"color\\\":\\\"#FCDE43\\\"}},{\\\"name\\\":\\\"中石油控股或有控股权\\\",\\\"value\\\":679926.75,\\\"itemStyle\\\":{\\\"color\\\":\\\"#01A8E1\\\"}},{\\\"name\\\":\\\"中石油参股\\\",\\\"value\\\":72062.75,\\\"itemStyle\\\":{\\\"color\\\":\\\"#99CC00\\\"}},{\\\"name\\\":\\\"非中石油\\\",\\\"value\\\":1698597.62,\\\"itemStyle\\\":{\\\"color\\\":\\\"#800080\\\"}}],\\\"isRadius\\\":false,\\\"roseType\\\":\\\"\\\",\\\"notCount\\\":false,\\\"center\\\":[320,180],\\\"name\\\":\\\"访问来源\\\",\\\"minAngle\\\":0,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"outside\\\",\\\"textStyle\\\":{\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"55%\\\",\\\"autoSort\\\":false}],\\\"tooltip\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"},\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":5,\\\"text\\\":\\\"来源收入统计\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#c23531\\\",\\\"fontWeight\\\":\\\"bolder\\\",\\\"fontSize\\\":18},\\\"left\\\":\\\"center\\\",\\\"padding\\\":[5,20,5,10]},\\\"backgroundColor\\\":\\\"#fff\\\"}\",\"url\":\"\",\"extData\":{\"dataType\":\"sql\",\"apiStatus\":\"\",\"apiUrl\":\"\",\"dataId\":\"4af57d343f1d6521b71b85097b580786\",\"axisX\":\"biz_income\",\"axisY\":\"total\",\"series\":\"\",\"yText\":\"total\",\"xText\":\"biz_income\",\"dbCode\":\"tmp_report_data_income\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartType\":\"pie.simple\",\"id\":\"\"},\"layer_id\":\"nVUy533exgQ70OPb\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[1,1],[1,2],[1,3],[1,4],[1,5],[1,6],[1,7],[1,8]]}],\"area\":{\"sri\":8,\"sci\":5,\"eri\":8,\"eci\":5,\"width\":63,\"height\":25},\"excel_config_id\":\"1347459370216198144\",\"printConfig\":{\"paper\":\"A4\",\"width\":210,\"height\":297,\"definition\":1,\"isBackend\":false,\"marginX\":10,\"marginY\":10},\"rows\":{\"1\":{\"cells\":{\"1\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"},\"2\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"},\"3\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"},\"4\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"},\"5\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"},\"6\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"},\"7\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"},\"8\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"}}},\"3\":{\"cells\":{}},\"16\":{\"cells\":{\"1\":{\"text\":\"业务来源\",\"style\":1},\"2\":{\"text\":\"保险经纪佣金费\",\"style\":1},\"3\":{\"text\":\"风险咨询费\",\"style\":1},\"4\":{\"text\":\"承保公证评估费\",\"style\":1},\"5\":{\"text\":\"保险公证费\",\"style\":1},\"6\":{\"text\":\"投标咨询费\",\"style\":1},\"7\":{\"text\":\"内控咨询费\",\"style\":1},\"8\":{\"text\":\"总计\",\"style\":1}}},\"17\":{\"cells\":{\"1\":{\"text\":\"#{tmp_report_data_income.biz_income}\",\"style\":0},\"2\":{\"text\":\"#{tmp_report_data_income.bx_jj_yongjin}\",\"style\":0},\"3\":{\"text\":\"#{tmp_report_data_income.bx_zx_money}\",\"style\":0},\"4\":{\"text\":\"#{tmp_report_data_income.chengbao_gz_money}\",\"style\":0},\"5\":{\"text\":\"#{tmp_report_data_income.bx_gg_moeny}\",\"style\":0},\"6\":{\"text\":\"#{tmp_report_data_income.tb_zx_money}\",\"style\":0},\"7\":{\"text\":\"#{tmp_report_data_income.neikong_zx_money}\",\"style\":0},\"8\":{\"text\":\"#{tmp_report_data_income.total}\",\"style\":0}},\"isDrag\":true,\"height\":24},\"len\":58},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":718,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":702,\"displayConfig\":{},\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#33CCCC\"}],\"validations\":[],\"cols\":{\"0\":{\"width\":16},\"1\":{\"width\":105},\"2\":{\"width\":119},\"3\":{\"width\":87},\"4\":{\"width\":61},\"5\":{\"width\":63},\"6\":{\"width\":60},\"7\":{\"width\":91},\"len\":50},\"merges\":[]}', NULL, NULL, 'admin', '2021-01-08 16:41:21', 'admin', '2021-07-13 05:38:53', 0, NULL, NULL, 1, 63, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('1352160857479581696', '20210121154924', 'redis', NULL, NULL, 'chartinfo', '{\"loopBlockList\":[],\"chartList\":[{\"row\":1,\"col\":7,\"width\":\"551\",\"height\":\"350\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#211F1E\\\",\\\"fontSize\\\":12}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#211E1E\\\"}},\\\"show\\\":false,\\\"name\\\":\\\"数量\\\",\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false}},\\\"xAxis\\\":{\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#171515\\\",\\\"fontSize\\\":12},\\\"rotate\\\":0,\\\"interval\\\":0},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#171515\\\"}},\\\"data\\\":[\\\"15:02:38\\\",\\\"15:02:39\\\",\\\"15:02:40\\\",\\\"15:02:41\\\",\\\"15:02:42\\\"],\\\"show\\\":true,\\\"name\\\":\\\"时间\\\"},\\\"grid\\\":{\\\"top\\\":60,\\\"left\\\":60,\\\"bottom\\\":60,\\\"right\\\":60},\\\"series\\\":[{\\\"areaStyle\\\":{\\\"color\\\":\\\"rgba(231,69,193,1)\\\",\\\"opacity\\\":0.2},\\\"data\\\":[59,59,59,59,59],\\\"showSymbol\\\":true,\\\"lineStyle\\\":{\\\"width\\\":5},\\\"symbolSize\\\":5,\\\"isArea\\\":true,\\\"name\\\":\\\"销量\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(241,71,214,1)\\\"},\\\"step\\\":false,\\\"label\\\":{\\\"show\\\":true,\\\"position\\\":\\\"top\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"line\\\",\\\"smooth\\\":true}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":18}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":0,\\\"text\\\":\\\"redis数量\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#9031C2\\\",\\\"fontWeight\\\":\\\"bolder\\\",\\\"fontSize\\\":18},\\\"left\\\":\\\"center\\\",\\\"padding\\\":[5,20,5,10]}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"d4a29dfda94357308faf62be2b94db08\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"keysSizeForReport\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartType\":\"line.area\",\"id\":\"NbjJrEsYcliaQRGO\"},\"layer_id\":\"NbjJrEsYcliaQRGO\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[1,7],[1,8],[1,9],[1,10],[1,11],[1,12]]},{\"row\":1,\"col\":1,\"width\":\"597\",\"height\":\"350\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#2692DD\\\",\\\"fontSize\\\":12}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#469BDC\\\"}},\\\"show\\\":false,\\\"name\\\":\\\"内存(kb)\\\",\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false}},\\\"xAxis\\\":{\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#00FFF2\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#398DD3\\\",\\\"fontSize\\\":12},\\\"rotate\\\":0,\\\"interval\\\":0},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#1E88D0\\\"}},\\\"data\\\":[\\\"15:02:38\\\",\\\"15:02:39\\\",\\\"15:02:40\\\",\\\"15:02:41\\\",\\\"15:02:42\\\"],\\\"show\\\":true,\\\"name\\\":\\\"时间\\\"},\\\"grid\\\":{\\\"top\\\":60,\\\"left\\\":60,\\\"bottom\\\":60,\\\"right\\\":60},\\\"series\\\":[{\\\"areaStyle\\\":{\\\"color\\\":\\\"#74BCFF\\\",\\\"opacity\\\":0.3},\\\"data\\\":[875,875,875,875,875],\\\"showSymbol\\\":true,\\\"lineStyle\\\":{\\\"width\\\":5},\\\"symbolSize\\\":5,\\\"isArea\\\":true,\\\"name\\\":\\\"销量\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#1890FF\\\"},\\\"step\\\":false,\\\"label\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"},\\\"show\\\":true,\\\"position\\\":\\\"top\\\"},\\\"type\\\":\\\"line\\\",\\\"smooth\\\":true}],\\\"tooltip\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":18},\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":5,\\\"text\\\":\\\"redis内存占用情况\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4C87E4\\\",\\\"fontWeight\\\":\\\"bolder\\\",\\\"fontSize\\\":18},\\\"left\\\":\\\"center\\\",\\\"padding\\\":[5,20,5,10]}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"6a1d22ca4c95e8fab655d3ceed43a84d\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"memoryForReport\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartType\":\"line.area\",\"id\":\"YW0FQUwafBUTagh3\"},\"layer_id\":\"YW0FQUwafBUTagh3\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[1,1],[1,2],[1,3],[1,4],[1,5],[1,6]]}],\"area\":false,\"printElWidth\":1565,\"excel_config_id\":\"1352160857479581696\",\"printElHeight\":1047,\"rows\":{\"1\":{\"cells\":{\"1\":{\"text\":\" \",\"virtual\":\"YW0FQUwafBUTagh3\",\"style\":19,\"merge\":[0,1]},\"2\":{\"text\":\" \",\"virtual\":\"YW0FQUwafBUTagh3\"},\"3\":{\"style\":19,\"virtual\":\"YW0FQUwafBUTagh3\"},\"4\":{\"style\":19,\"virtual\":\"YW0FQUwafBUTagh3\"},\"5\":{\"style\":19,\"virtual\":\"YW0FQUwafBUTagh3\"},\"6\":{\"style\":19,\"virtual\":\"YW0FQUwafBUTagh3\"},\"7\":{\"text\":\" \",\"virtual\":\"NbjJrEsYcliaQRGO\"},\"8\":{\"text\":\" \",\"virtual\":\"NbjJrEsYcliaQRGO\"},\"9\":{\"text\":\" \",\"virtual\":\"NbjJrEsYcliaQRGO\"},\"10\":{\"text\":\" \",\"virtual\":\"NbjJrEsYcliaQRGO\"},\"11\":{\"text\":\" \",\"virtual\":\"NbjJrEsYcliaQRGO\"},\"12\":{\"text\":\" \",\"virtual\":\"NbjJrEsYcliaQRGO\"}}},\"2\":{\"cells\":{\"1\":{\"style\":19},\"2\":{\"style\":19},\"3\":{\"style\":19},\"4\":{\"style\":19},\"5\":{\"style\":19},\"6\":{\"style\":19},\"7\":{\"text\":\" \"}}},\"3\":{\"cells\":{\"1\":{\"style\":19},\"2\":{\"style\":19},\"3\":{\"style\":19},\"4\":{\"style\":19},\"5\":{\"style\":19},\"6\":{\"style\":19},\"7\":{\"text\":\" \"}}},\"4\":{\"cells\":{\"1\":{\"style\":19},\"2\":{\"style\":19},\"3\":{\"style\":19},\"4\":{\"style\":19},\"5\":{\"style\":19},\"6\":{\"style\":19},\"7\":{\"text\":\" \"}}},\"5\":{\"cells\":{\"1\":{\"style\":19},\"2\":{\"style\":19},\"3\":{\"style\":19},\"4\":{\"style\":19},\"5\":{\"style\":19},\"6\":{\"style\":19},\"7\":{\"text\":\" \"}}},\"6\":{\"cells\":{\"1\":{\"style\":19},\"2\":{\"style\":19},\"3\":{\"style\":19},\"4\":{\"style\":19},\"5\":{\"style\":19},\"6\":{\"style\":19},\"7\":{\"text\":\" \"}}},\"7\":{\"cells\":{\"1\":{\"style\":19},\"2\":{\"style\":19},\"3\":{\"style\":19},\"4\":{\"style\":19},\"5\":{\"style\":19},\"6\":{\"style\":19},\"7\":{\"text\":\" \"}}},\"8\":{\"cells\":{\"1\":{\"style\":19},\"2\":{\"style\":19},\"3\":{\"style\":19},\"4\":{\"style\":19},\"5\":{\"style\":19},\"6\":{\"style\":19},\"7\":{\"text\":\" \"}}},\"9\":{\"cells\":{\"1\":{\"style\":19},\"2\":{\"style\":19},\"3\":{\"style\":19},\"4\":{\"style\":19},\"5\":{\"style\":19},\"6\":{\"style\":19},\"7\":{\"text\":\" \"}}},\"10\":{\"cells\":{\"1\":{\"style\":19},\"2\":{\"style\":19},\"3\":{\"style\":19},\"4\":{\"style\":19},\"5\":{\"style\":19},\"6\":{\"style\":19},\"7\":{\"text\":\" \"}}},\"11\":{\"cells\":{\"1\":{\"style\":19},\"2\":{\"style\":19},\"3\":{\"style\":19},\"4\":{\"style\":19},\"5\":{\"style\":19},\"6\":{\"style\":19},\"7\":{\"text\":\" \"}}},\"12\":{\"cells\":{\"1\":{\"style\":19},\"2\":{\"style\":19},\"3\":{\"style\":19},\"4\":{\"style\":19},\"5\":{\"style\":19},\"6\":{\"style\":19},\"7\":{\"text\":\" \"}}},\"13\":{\"cells\":{\"1\":{\"style\":19},\"2\":{\"style\":19},\"3\":{\"style\":19},\"4\":{\"style\":19},\"5\":{\"style\":19},\"6\":{\"style\":19},\"7\":{\"text\":\" \"}}},\"14\":{\"cells\":{\"1\":{\"style\":19},\"2\":{\"style\":19},\"3\":{\"style\":19},\"4\":{\"style\":19},\"5\":{\"style\":19},\"6\":{\"style\":19},\"7\":{\"text\":\" \"}}},\"17\":{\"cells\":{\"1\":{}}},\"18\":{\"cells\":{\"1\":{\"text\":\"redis详细信息\",\"style\":5,\"merge\":[1,1]}}},\"19\":{\"cells\":{}},\"20\":{\"cells\":{\"1\":{\"text\":\"key\",\"merge\":[0,1],\"style\":46},\"2\":{\"text\":\" \",\"style\":47},\"3\":{\"merge\":[0,1],\"style\":46,\"text\":\"value\"},\"4\":{\"text\":\" \",\"style\":47},\"5\":{\"merge\":[0,9],\"style\":46,\"text\":\"desc\"},\"6\":{\"text\":\" \",\"style\":47},\"7\":{\"text\":\" \",\"style\":47},\"8\":{\"text\":\" \",\"style\":47},\"9\":{\"text\":\" \",\"style\":47},\"10\":{\"text\":\" \",\"style\":47},\"11\":{\"text\":\" \",\"style\":47},\"12\":{\"text\":\" \",\"style\":47},\"13\":{\"text\":\" \",\"style\":47},\"14\":{\"text\":\" \",\"style\":47}}},\"21\":{\"cells\":{\"1\":{\"merge\":[0,1],\"text\":\"#{infoForReport.key}\",\"style\":52},\"2\":{\"text\":\" \",\"style\":53},\"3\":{\"merge\":[0,1],\"text\":\"#{infoForReport.value}\",\"style\":52},\"4\":{\"text\":\" \",\"style\":53},\"5\":{\"text\":\"#{infoForReport.description}\",\"style\":52,\"merge\":[0,9]}}},\"len\":98},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":1500,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"font\":{\"bold\":true}},{\"font\":{\"bold\":true},\"align\":\"center\"},{\"align\":\"center\"},{\"font\":{\"bold\":true,\"size\":18},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":18}},{\"font\":{\"bold\":true,\"size\":14},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":14}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#d8d8d8\"},{\"bgcolor\":\"#d8d8d8\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#d8d8d8\",\"align\":\"center\"},{\"bgcolor\":\"#d8d8d8\",\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#f2f2f2\",\"align\":\"center\"},{\"bgcolor\":\"#f2f2f2\",\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#a5a5a5\",\"align\":\"center\"},{\"bgcolor\":\"#a5a5a5\",\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#bfbfbf\",\"align\":\"center\"},{\"bgcolor\":\"#bfbfbf\",\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#ffffff\"},{\"bgcolor\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#f2f2f2\"},{\"bgcolor\":\"#f2f2f2\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#5b9cd6\"},{\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#deeaf6\",\"align\":\"center\"},{\"bgcolor\":\"#deeaf6\",\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#9cc2e6\"},{\"bgcolor\":\"#9cc2e6\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#93d051\",\"align\":\"center\"},{\"bgcolor\":\"#93d051\",\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#a7d08c\",\"align\":\"center\"},{\"bgcolor\":\"#a7d08c\",\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#c5e0b3\",\"align\":\"center\"},{\"bgcolor\":\"#c5e0b3\",\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#deeaf6\"},{\"bgcolor\":\"#deeaf6\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#d5dce4\"},{\"bgcolor\":\"#d5dce4\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#93d051\"},{\"bgcolor\":\"#93d051\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#756f6f\"},{\"bgcolor\":\"#756f6f\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#c5e0b3\"},{\"bgcolor\":\"#c5e0b3\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#a7d08c\"},{\"bgcolor\":\"#a7d08c\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#71ae47\"},{\"bgcolor\":\"#71ae47\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#01b0f1\"},{\"bgcolor\":\"#01b0f1\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#0170c1\"},{\"bgcolor\":\"#0170c1\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#8eaada\"},{\"bgcolor\":\"#8eaada\"}],\"validations\":[],\"cols\":{\"len\":50},\"merges\":[\"D19:E19\",\"F19:M19\",\"D20:E20\",\"F20:M20\",\"B2:C2\",\"B19:C20\",\"B22:C22\",\"D22:E22\",\"B21:C21\",\"D21:E21\",\"F21:O21\",\"F22:O22\"]}', NULL, NULL, 'admin', '2021-01-21 15:49:25', 'admin', '2021-02-03 13:58:06', 1, NULL, NULL, 0, 64, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('1cd9d574d0c42f3915046dc61d9f33bd', '202012171553133795', '企业实时报表副本3795', NULL, NULL, 'chartinfo', '{\"loopBlockList\":[],\"chartList\":[{\"row\":6,\"col\":1,\"colspan\":0,\"rowspan\":0,\"width\":\"302\",\"height\":\"337\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":0,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"data\\\":[\\\"江苏\\\",\\\"山东\\\",\\\"安徽\\\",\\\"江西\\\",\\\"河北\\\",\\\"吉林\\\",\\\"黑龙江\\\",\\\"重庆\\\",\\\"广东\\\",\\\"上海\\\",\\\"哈尔滨\\\",\\\"福建\\\",\\\"四川\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type\\\":\\\"category\\\"},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333\\\"}},\\\"show\\\":false,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type \\\":\\\"value\\\"},\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"销售额\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"grid\\\":{\\\"top\\\":20,\\\"left\\\":45,\\\"bottom\\\":16,\\\"right\\\":46},\\\"series\\\":[{\\\"barWidth\\\":13,\\\"data\\\":[100,800,1200,1700,2500,4000,5800,6500,7000,7500,8000,8800,9500],\\\"name\\\":\\\"销售额\\\",\\\"itemStyle\\\":{\\\"barBorderRadius\\\":5,\\\"color\\\":\\\"rgba(67,184,251,1)\\\"},\\\"label\\\":{\\\"show\\\":true,\\\"position\\\":\\\"right\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#689AFB\\\",\\\"fontSize\\\":\\\"10\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":2,\\\"typeData\\\":[],\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontWeight\\\":\\\"bolder\\\"}}],\\\"tooltip\\\":{\\\"show\\\":true,\\\"axisPointer\\\":{\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"top\\\":5,\\\"text\\\":\\\"销售额省份排名\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,20]}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1339491107951640577\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"xiaoshoue\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartType\":\"bar.multi.horizontal\",\"chartId\":\"pie.doughnut\"},\"layer_id\":\"IFj1lg5S5aNG1wPx\",\"offsetX\":0,\"offsetY\":0,\"backgroud\":{\"enabled\":false,\"color\":\"#fff\",\"image\":\"\"},\"virtualCellRange\":[[6,1],[6,2],[6,3],[6,4]]},{\"row\":6,\"col\":10,\"colspan\":0,\"rowspan\":0,\"width\":\"247\",\"height\":\"124\",\"config\":\"{\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"销售额\\\",\\\"其他\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"series\\\":[{\\\"isRose\\\":false,\\\"data\\\":[{\\\"name\\\":\\\"销售额\\\",\\\"value\\\":6000000,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(43,193,254,1)\\\"}},{\\\"name\\\":\\\"其他\\\",\\\"value\\\":3400879,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(42,45,76,0.59)\\\"}}],\\\"isRadius\\\":true,\\\"roseType\\\":\\\"\\\",\\\"notCount\\\":false,\\\"name\\\":\\\"访问来源\\\",\\\"minAngle\\\":0,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"outside\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"45%\\\",\\\"55%\\\"],\\\"autoSort\\\":false}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"top\\\":5,\\\"text\\\":\\\"销售进度\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,10]}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1339498906765000705\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"xsjd\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartType\":\"pie.doughnut\",\"chartId\":\"pie.doughnut\"},\"layer_id\":\"Yb2TIGEAxnvN9ITx\",\"offsetX\":0,\"offsetY\":0,\"backgroud\":{\"enabled\":false,\"color\":\"#fff\",\"image\":\"\"},\"virtualCellRange\":[[6,10],[6,11]]},{\"row\":6,\"col\":12,\"colspan\":0,\"rowspan\":0,\"width\":\"244\",\"height\":\"128\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":0,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"data\\\":[\\\"北京\\\",\\\"青岛\\\",\\\"合肥\\\",\\\"深圳\\\",\\\"石家庄\\\",\\\"重庆\\\",\\\"保定\\\",\\\"邯郸\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type\\\":\\\"category\\\"},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333\\\"}},\\\"show\\\":false,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type \\\":\\\"value\\\"},\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"销售额\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"grid\\\":{\\\"top\\\":10,\\\"left\\\":49,\\\"bottom\\\":16,\\\"right\\\":45},\\\"series\\\":[{\\\"barWidth\\\":9,\\\"data\\\":[80,500,800,1000,1200,1500,1600,2000],\\\"name\\\":\\\"销售额\\\",\\\"itemStyle\\\":{\\\"barBorderRadius\\\":0,\\\"color\\\":\\\"rgba(146,119,252,1)\\\"},\\\"label\\\":{\\\"show\\\":true,\\\"position\\\":\\\"right\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#689AFB\\\",\\\"fontSize\\\":\\\"10\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":2,\\\"typeData\\\":[],\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontWeight\\\":\\\"bolder\\\"}}],\\\"tooltip\\\":{\\\"show\\\":true,\\\"axisPointer\\\":{\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"top\\\":5,\\\"text\\\":\\\"销售额城市排名\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,20]}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1339495346077728770\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"chengshi\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartType\":\"bar.multi.horizontal\",\"chartId\":\"bar.multi.horizontal\"},\"layer_id\":\"qQHpevWlqElpRQUl\",\"offsetX\":0,\"offsetY\":0,\"backgroud\":{\"enabled\":false,\"color\":\"#fff\",\"image\":\"\"},\"virtualCellRange\":[[6,12],[6,13],[6,14]]},{\"row\":6,\"col\":15,\"colspan\":0,\"rowspan\":0,\"width\":\"230\",\"height\":\"127\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":0,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"data\\\":[\\\"北京\\\",\\\"青岛\\\",\\\"合肥\\\",\\\"深圳\\\",\\\"石家庄\\\",\\\"重庆\\\",\\\"保定\\\",\\\"邯郸\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type\\\":\\\"category\\\"},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333\\\"}},\\\"show\\\":false,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type \\\":\\\"value\\\"},\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"销售额\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"grid\\\":{\\\"top\\\":10,\\\"left\\\":49,\\\"bottom\\\":20,\\\"right\\\":48},\\\"series\\\":[{\\\"barWidth\\\":9,\\\"data\\\":[80,500,800,1000,1200,1500,1600,2000],\\\"name\\\":\\\"销售额\\\",\\\"itemStyle\\\":{\\\"barBorderRadius\\\":0,\\\"color\\\":\\\"rgba(146,119,252,1)\\\"},\\\"label\\\":{\\\"show\\\":true,\\\"position\\\":\\\"right\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#689AFB\\\",\\\"fontSize\\\":\\\"10\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":2,\\\"typeData\\\":[],\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontWeight\\\":\\\"bolder\\\"}}],\\\"tooltip\\\":{\\\"show\\\":true,\\\"axisPointer\\\":{\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"top\\\":5,\\\"text\\\":\\\"某站点用户访问来源\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#c23531\\\",\\\"fontWeight\\\":\\\"bolder\\\",\\\"fontSize\\\":18},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,20]}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1339495346077728770\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"chengshi\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartType\":\"bar.multi.horizontal\",\"chartId\":\"bar.multi.horizontal\"},\"layer_id\":\"phTmhkjHLebYlOEQ\",\"offsetX\":0,\"offsetY\":0,\"backgroud\":{\"enabled\":false,\"color\":\"#fff\",\"image\":\"\"},\"virtualCellRange\":[[6,15],[6,16],[6,17],[6,18]]},{\"row\":7,\"col\":5,\"colspan\":0,\"rowspan\":0,\"width\":\"430\",\"height\":\"293\",\"config\":\"{\\\"geo\\\":{\\\"map\\\":\\\"china\\\",\\\"zoom\\\":0.5,\\\"label\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"8\\\",\\\"show\\\":true},\\\"itemStyle\\\":{\\\"borderWidth\\\":0.5,\\\"areaColor\\\":\\\"#8284FB\\\",\\\"borderColor\\\":\\\"#000\\\"},\\\"emphasis\\\":{\\\"label\\\":{\\\"color\\\":\\\"#fff\\\"},\\\"itemStyle\\\":{\\\"areaColor\\\":\\\"#4195EF\\\"}},\\\"regions\\\":[],\\\"layoutSize\\\":600,\\\"roam\\\":true,\\\"layoutCenter\\\":[\\\"50%\\\",\\\"50%\\\"]},\\\"series\\\":[{\\\"encode\\\":{\\\"value\\\":[2]},\\\"data\\\":[{\\\"name\\\":\\\"河北\\\",\\\"value\\\":[114.502461,38.045474,279]},{\\\"name\\\":\\\"海南\\\",\\\"value\\\":[110.33119,20.031971,273]},{\\\"name\\\":\\\"山东\\\",\\\"value\\\":[117.000923,36.675807,229]},{\\\"name\\\":\\\"甘肃\\\",\\\"value\\\":[103.823557,36.058039,194]},{\\\"name\\\":\\\"宁夏\\\",\\\"value\\\":[106.278179,38.46637,193]},{\\\"name\\\":\\\"浙江\\\",\\\"value\\\":[120.153576,30.287459,177]},{\\\"name\\\":\\\"湖南\\\",\\\"value\\\":[112.982279,28.19409,119]},{\\\"name\\\":\\\"湖北\\\",\\\"value\\\":[114.298572,30.584355,79]},{\\\"name\\\":\\\"河南\\\",\\\"value\\\":[113.665412,34.757975,67]},{\\\"name\\\":\\\"北京\\\",\\\"value\\\":[116.405285,39.904989,58]},{\\\"name\\\":\\\"天津\\\",\\\"value\\\":[117.190182,39.125596,59]},{\\\"name\\\":\\\"上海\\\",\\\"value\\\":[121.472644,31.231706,63]}],\\\"name\\\":\\\"\\\",\\\"emphasis\\\":{\\\"label\\\":{\\\"show\\\":true}},\\\"itemStyle\\\":{\\\"color\\\":\\\"#FF1205\\\"},\\\"coordinateSystem\\\":\\\"geo\\\",\\\"label\\\":{\\\"formatter\\\":\\\"{b}\\\",\\\"show\\\":false,\\\"position\\\":\\\"right\\\"},\\\"type\\\":\\\"scatter\\\",\\\"symbolSize\\\":5}],\\\"chartType\\\":\\\"map\\\",\\\"tooltip\\\":{\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"top\\\":5,\\\"text\\\":\\\"主要城市空气质量\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#c23531\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,10]}}\",\"url\":\"\",\"extData\":{\"chartType\":\"map.scatter\"},\"layer_id\":\"YTri6J59av4gj1CY\",\"offsetX\":0,\"offsetY\":0,\"backgroud\":{\"enabled\":false,\"color\":\"#fff\",\"image\":\"\"},\"virtualCellRange\":[[7,5],[7,6],[7,7],[7,8]]},{\"row\":14,\"col\":12,\"colspan\":0,\"rowspan\":0,\"width\":\"244\",\"height\":\"138\",\"config\":\"{\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"销售额\\\",\\\"其他\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"series\\\":[{\\\"isRose\\\":false,\\\"data\\\":[{\\\"name\\\":\\\"销售额\\\",\\\"value\\\":6000000,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(43,193,254,1)\\\"}},{\\\"name\\\":\\\"其他\\\",\\\"value\\\":3400879,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(42,45,76,0.59)\\\"}}],\\\"isRadius\\\":true,\\\"roseType\\\":\\\"\\\",\\\"notCount\\\":false,\\\"name\\\":\\\"访问来源\\\",\\\"minAngle\\\":0,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"outside\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"50%\\\",\\\"60%\\\"],\\\"autoSort\\\":false}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"top\\\":5,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#c23531\\\",\\\"fontWeight\\\":\\\"bolder\\\",\\\"fontSize\\\":18},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,10]}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1339498906765000705\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"xsjd\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartType\":\"pie.doughnut\",\"chartId\":\"pie.doughnut\"},\"layer_id\":\"ARuuHLfjqV9l1tQD\",\"offsetX\":0,\"offsetY\":0,\"backgroud\":{\"enabled\":false,\"color\":\"#fff\",\"image\":\"\"},\"virtualCellRange\":[[14,12],[14,13],[14,14]]},{\"row\":14,\"col\":15,\"colspan\":0,\"rowspan\":0,\"width\":\"230\",\"height\":\"139\",\"config\":\"{\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"销售额\\\",\\\"其他\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"series\\\":[{\\\"isRose\\\":false,\\\"data\\\":[{\\\"name\\\":\\\"销售额\\\",\\\"value\\\":6000000,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(43,193,254,1)\\\"}},{\\\"name\\\":\\\"其他\\\",\\\"value\\\":3400879,\\\"itemStyle\\\":{\\\"color\\\":\\\"rgba(42,45,76,0.59)\\\"}}],\\\"isRadius\\\":true,\\\"roseType\\\":\\\"\\\",\\\"notCount\\\":false,\\\"name\\\":\\\"访问来源\\\",\\\"minAngle\\\":0,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"outside\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"45%\\\",\\\"55%\\\"],\\\"autoSort\\\":false}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"top\\\":5,\\\"text\\\":\\\"某站点用户访问来源\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#c23531\\\",\\\"fontWeight\\\":\\\"bolder\\\",\\\"fontSize\\\":18},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,10]}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1339498906765000705\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"xsjd\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartType\":\"pie.doughnut\",\"chartId\":\"\"},\"layer_id\":\"bcrMtWqTd2AJIjLd\",\"offsetX\":0,\"offsetY\":0,\"backgroud\":{\"enabled\":false,\"color\":\"#fff\",\"image\":\"\"},\"virtualCellRange\":[[14,15],[14,16],[14,17],[14,18]]},{\"row\":14,\"col\":10,\"colspan\":0,\"rowspan\":0,\"width\":\"244\",\"height\":\"138\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":0,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"data\\\":[\\\"北京\\\",\\\"青岛\\\",\\\"合肥\\\",\\\"深圳\\\",\\\"石家庄\\\",\\\"重庆\\\",\\\"保定\\\",\\\"邯郸\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type\\\":\\\"category\\\"},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333\\\"}},\\\"show\\\":false,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type \\\":\\\"value\\\"},\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"销售额\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":false,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"grid\\\":{\\\"top\\\":10,\\\"left\\\":49,\\\"bottom\\\":15,\\\"right\\\":45},\\\"series\\\":[{\\\"barWidth\\\":9,\\\"data\\\":[80,500,800,1000,1200,1500,1600,2000],\\\"name\\\":\\\"销售额\\\",\\\"itemStyle\\\":{\\\"barBorderRadius\\\":0,\\\"color\\\":\\\"rgba(146,119,252,1)\\\"},\\\"label\\\":{\\\"show\\\":true,\\\"position\\\":\\\"right\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#698AFB\\\",\\\"fontSize\\\":\\\"10\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":2,\\\"typeData\\\":[],\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontWeight\\\":\\\"bolder\\\"}}],\\\"tooltip\\\":{\\\"show\\\":true,\\\"axisPointer\\\":{\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"top\\\":5,\\\"text\\\":\\\"某站点用户访问来源\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#c23531\\\",\\\"fontWeight\\\":\\\"bolder\\\",\\\"fontSize\\\":18},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,20]}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1339495346077728770\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"chengshi\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartType\":\"bar.multi.horizontal\",\"chartId\":\"bar.multi.horizontal\"},\"layer_id\":\"Y1kgYOWBHIVQdSN5\",\"offsetX\":0,\"offsetY\":0,\"backgroud\":{\"enabled\":false,\"color\":\"#fff\",\"image\":\"\"},\"virtualCellRange\":[[14,10],[14,11]]},{\"row\":20,\"col\":1,\"colspan\":0,\"rowspan\":0,\"width\":\"743\",\"height\":\"150\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"name\\\":\\\"\\\",\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":0,\\\"interval\\\":0,\\\"textStyle\\\":{\\\"color\\\":\\\"#FEFEFE\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"data\\\":[\\\"2020-01-09\\\",\\\"2020-01-12\\\",\\\"2020-01-14\\\",\\\"2020-01-16\\\",\\\"2020-01-18\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"show\\\":true,\\\"name\\\":\\\"\\\",\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false}},\\\"grid\\\":{\\\"top\\\":53,\\\"left\\\":22,\\\"bottom\\\":37,\\\"right\\\":20},\\\"series\\\":[{\\\"areaStyle\\\":{\\\"color\\\":\\\"#43B8FB\\\",\\\"opacity\\\":0.7},\\\"data\\\":[2,6,7,5,6],\\\"showSymbol\\\":true,\\\"lineStyle\\\":{\\\"width\\\":2},\\\"symbolSize\\\":5,\\\"isArea\\\":true,\\\"name\\\":\\\"销量\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#43B8FB\\\"},\\\"step\\\":false,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"top\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"line\\\",\\\"smooth\\\":false}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":\\\"10\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":14,\\\"text\\\":\\\"销售额增速\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"fontSize\\\":\\\"14\\\"},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,10]}}\",\"url\":\"\",\"extData\":{\"dataType\":\"api\",\"apiStatus\":\"1\",\"dataId\":\"1339538388453195777\",\"axisX\":\"name\",\"axisY\":\"value\",\"series\":\"type\",\"yText\":\"\",\"xText\":\"\",\"dbCode\":\"zhexian\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartType\":\"line.area\",\"chartId\":\"\"},\"layer_id\":\"uChrZaHYoV04MQpT\",\"offsetX\":0,\"offsetY\":0,\"backgroud\":{\"enabled\":false,\"color\":\"#fff\",\"image\":\"\"},\"virtualCellRange\":[[20,1],[20,2],[20,3],[20,4],[20,5],[20,6],[20,7],[20,8],[20,9]]}],\"area\":{\"sri\":4,\"sci\":7,\"eri\":4,\"eci\":7,\"width\":100,\"height\":38},\"excel_config_id\":\"1cd9d574d0c42f3915046dc61d9f33bd\",\"printConfig\":{\"paper\":\"A3\",\"width\":297,\"height\":420,\"definition\":1,\"isBackend\":false,\"marginX\":10,\"marginY\":10,\"layout\":\"landscape\"},\"rows\":{\"0\":{\"cells\":{}},\"2\":{\"cells\":{\"1\":{\"merge\":[0,17],\"text\":\"企业实时销售数据\",\"style\":3}}},\"3\":{\"cells\":{},\"height\":35},\"4\":{\"cells\":{\"1\":{\"text\":\" 销售额省份排名\",\"style\":32,\"merge\":[0,1],\"virtual\":\"IFj1lg5S5aNG1wPx\"},\"2\":{\"style\":32,\"virtual\":\"IFj1lg5S5aNG1wPx\"},\"5\":{\"text\":\" 销售总额\",\"style\":69},\"10\":{\"text\":\" 销售进度\",\"style\":43},\"11\":{\"text\":\"\",\"style\":43},\"13\":{\"text\":\" 销售额城市排名\",\"style\":32,\"merge\":[0,1]},\"15\":{\"text\":\" 个人业绩排名\",\"style\":32,\"merge\":[0,1]},\"17\":{\"text\":\"\",\"style\":32,\"merge\":[0,1]}},\"height\":38},\"5\":{\"cells\":{\"1\":{\"text\":\" Sales ranking points\",\"virtual\":\"IFj1lg5S5aNG1wPx\",\"style\":62,\"merge\":[0,1]},\"5\":{\"text\":\"12436025\",\"style\":52,\"merge\":[1,0]},\"6\":{\"merge\":[1,0],\"text\":\"元\",\"style\":22},\"10\":{\"text\":\" Sales progress\",\"style\":33},\"11\":{\"text\":\"\",\"virtual\":\"Yb2TIGEAxnvN9ITx\",\"style\":33},\"13\":{\"text\":\" Sales ranking\",\"virtual\":\"qQHpevWlqElpRQUl\",\"style\":31},\"15\":{\"text\":\" Personal ranking\",\"style\":62,\"merge\":[0,1]},\"17\":{\"text\":\"\",\"style\":62,\"merge\":[0,1]}},\"height\":24},\"6\":{\"cells\":{\"1\":{\"text\":\"\",\"merge\":[0,1],\"style\":31,\"virtual\":\"IFj1lg5S5aNG1wPx\"},\"2\":{\"style\":31,\"virtual\":\"IFj1lg5S5aNG1wPx\"},\"3\":{\"text\":\" \",\"virtual\":\"IFj1lg5S5aNG1wPx\"},\"4\":{\"text\":\" \",\"virtual\":\"IFj1lg5S5aNG1wPx\"},\"10\":{\"text\":\" \",\"virtual\":\"Yb2TIGEAxnvN9ITx\"},\"11\":{\"text\":\"\",\"style\":33,\"virtual\":\"Yb2TIGEAxnvN9ITx\"},\"12\":{\"text\":\" \",\"virtual\":\"qQHpevWlqElpRQUl\"},\"13\":{\"text\":\"\",\"virtual\":\"qQHpevWlqElpRQUl\",\"style\":31},\"14\":{\"text\":\" \",\"virtual\":\"qQHpevWlqElpRQUl\"},\"15\":{\"text\":\" \",\"virtual\":\"phTmhkjHLebYlOEQ\"},\"16\":{\"text\":\" \",\"virtual\":\"phTmhkjHLebYlOEQ\"},\"17\":{\"text\":\" \",\"style\":31,\"virtual\":\"phTmhkjHLebYlOEQ\"},\"18\":{\"text\":\" \",\"virtual\":\"phTmhkjHLebYlOEQ\"}}},\"7\":{\"cells\":{\"5\":{\"style\":53,\"virtual\":\"YTri6J59av4gj1CY\"},\"6\":{\"style\":22,\"virtual\":\"YTri6J59av4gj1CY\"},\"7\":{\"text\":\" \",\"virtual\":\"YTri6J59av4gj1CY\"},\"8\":{\"text\":\" \",\"virtual\":\"YTri6J59av4gj1CY\"}}},\"8\":{\"cells\":{\"5\":{\"style\":18,\"text\":\"\",\"virtual\":\"YTri6J59av4gj1CY\"}}},\"9\":{\"cells\":{\"5\":{\"style\":21,\"text\":\"\"}}},\"10\":{\"cells\":{\"5\":{\"text\":\"\",\"style\":17}}},\"12\":{\"cells\":{\"10\":{\"text\":\" 品类销售排名\",\"style\":43},\"11\":{\"text\":\"\",\"style\":43},\"13\":{\"text\":\" 品类销售额占比\",\"style\":43,\"merge\":[0,1]},\"15\":{\"text\":\" 一季度销售季度\",\"style\":43,\"merge\":[0,1]},\"17\":{\"text\":\"\",\"style\":43,\"merge\":[0,1]}}},\"13\":{\"cells\":{\"10\":{\"text\":\" Category Sales ranking\",\"style\":31},\"11\":{\"text\":\"\",\"style\":31},\"13\":{\"text\":\" Type of Sales \",\"style\":31},\"15\":{\"text\":\" Quarterly sales progree\",\"style\":58,\"merge\":[0,1]},\"17\":{\"text\":\"\",\"style\":58,\"merge\":[0,1]}}},\"14\":{\"cells\":{\"10\":{\"text\":\" \",\"virtual\":\"Y1kgYOWBHIVQdSN5\"},\"11\":{\"text\":\" \",\"virtual\":\"Y1kgYOWBHIVQdSN5\"},\"12\":{\"text\":\" \",\"virtual\":\"ARuuHLfjqV9l1tQD\"},\"13\":{\"text\":\" \",\"virtual\":\"ARuuHLfjqV9l1tQD\"},\"14\":{\"text\":\" \",\"virtual\":\"ARuuHLfjqV9l1tQD\"},\"15\":{\"text\":\" \",\"virtual\":\"bcrMtWqTd2AJIjLd\"},\"16\":{\"text\":\" \",\"virtual\":\"bcrMtWqTd2AJIjLd\"},\"17\":{\"text\":\" \",\"virtual\":\"bcrMtWqTd2AJIjLd\"},\"18\":{\"text\":\" \",\"virtual\":\"bcrMtWqTd2AJIjLd\"}}},\"15\":{\"cells\":{},\"height\":15},\"16\":{\"cells\":{\"11\":{\"text\":\"\",\"style\":43},\"13\":{\"text\":\"\",\"style\":43,\"merge\":[0,1]},\"17\":{\"text\":\"\",\"style\":43,\"merge\":[0,1]}}},\"17\":{\"cells\":{\"11\":{\"text\":\"\",\"style\":31},\"13\":{\"text\":\"\",\"style\":31},\"17\":{\"text\":\"\",\"merge\":[0,1],\"style\":58}}},\"18\":{\"cells\":{}},\"20\":{\"cells\":{\"1\":{\"text\":\" \",\"virtual\":\"uChrZaHYoV04MQpT\"},\"2\":{\"text\":\" \",\"virtual\":\"uChrZaHYoV04MQpT\"},\"3\":{\"text\":\" \",\"virtual\":\"uChrZaHYoV04MQpT\"},\"4\":{\"text\":\" \",\"virtual\":\"uChrZaHYoV04MQpT\"},\"5\":{\"text\":\" \",\"virtual\":\"uChrZaHYoV04MQpT\"},\"6\":{\"text\":\" \",\"virtual\":\"uChrZaHYoV04MQpT\"},\"7\":{\"text\":\" \",\"virtual\":\"uChrZaHYoV04MQpT\"},\"8\":{\"text\":\" \",\"virtual\":\"uChrZaHYoV04MQpT\"},\"9\":{\"text\":\" \",\"virtual\":\"uChrZaHYoV04MQpT\"}},\"height\":39},\"22\":{\"cells\":{\"10\":{\"text\":\"企业经营指标\",\"style\":74},\"11\":{\"text\":\"1201043元\",\"style\":73},\"13\":{\"text\":\"企业经营指标\",\"style\":74},\"14\":{\"text\":\"1201043元\",\"style\":73},\"16\":{\"text\":\"企业经营指标\",\"style\":74},\"17\":{\"text\":\"1201043元\",\"style\":73}}},\"23\":{\"cells\":{\"10\":{\"text\":\"企业经营指标1\",\"style\":74},\"11\":{\"text\":\"1201043元\",\"style\":73},\"13\":{\"text\":\"企业经营指标1\",\"style\":74},\"14\":{\"text\":\"1201043元\",\"style\":73},\"16\":{\"text\":\"企业经营指标1\",\"style\":74},\"17\":{\"text\":\"1201043元\",\"style\":73}}},\"26\":{\"cells\":{},\"height\":33},\"len\":100},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":1584,\"displayConfig\":{},\"background\":{\"path\":\"https://static.jeecg.com/designreport/images/bg55_1608205385382.png\",\"repeat\":\"no-repeat\",\"width\":\"1525\",\"height\":\"700\"},\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"color\":\"#ffffff\"},{\"color\":\"#ffffff\",\"font\":{\"size\":16}},{\"color\":\"#ffffff\",\"font\":{\"size\":16},\"align\":\"center\"},{\"color\":\"#ffffff\",\"font\":{\"size\":18},\"align\":\"center\"},{\"font\":{\"size\":18}},{\"color\":\"#67b1ee\"},{\"color\":\"#67b1ee\",\"font\":{\"size\":14}},{\"color\":\"#67b1ee\",\"font\":{\"size\":12}},{\"font\":{\"size\":14}},{\"font\":{\"size\":18},\"bgcolor\":\"#ffffff\"},{\"font\":{\"size\":18},\"bgcolor\":\"#ffffff\",\"color\":\"#ffffff\"},{\"font\":{\"size\":16},\"bgcolor\":\"#ffffff\",\"color\":\"#ffffff\"},{\"color\":\"#67b1ee\",\"font\":{\"size\":12},\"align\":\"right\"},{\"font\":{\"size\":16},\"bgcolor\":\"#ffffff\",\"color\":\"#ffffff\",\"align\":\"right\"},{\"color\":\"#67b1ee\",\"font\":{\"size\":12},\"align\":\"center\"},{\"font\":{\"size\":16}},{\"font\":{\"size\":16},\"color\":\"#fe0000\"},{\"font\":{\"size\":16},\"color\":\"#fe0000\",\"align\":\"center\"},{\"color\":\"#67b1ee\",\"font\":{\"size\":12},\"align\":\"left\"},{\"align\":\"left\"},{\"align\":\"left\",\"font\":{\"size\":14}},{\"align\":\"left\",\"font\":{\"size\":14},\"color\":\"#ffffff\"},{\"font\":{\"size\":14},\"color\":\"#ffffff\"},{\"font\":{\"size\":12},\"color\":\"#ffffff\"},{\"font\":{\"size\":12,\"bold\":true},\"color\":\"#ffffff\"},{\"font\":{\"size\":12,\"bold\":false},\"color\":\"#ffffff\"},{\"font\":{\"size\":11,\"bold\":false},\"color\":\"#ffffff\"},{\"font\":{\"size\":8}},{\"font\":{\"size\":9}},{\"font\":{\"size\":9},\"color\":\"#67b1ee\"},{\"font\":{\"size\":9},\"color\":\"#67b1ee\",\"valign\":\"top\"},{\"font\":{\"size\":8},\"color\":\"#67b1ee\",\"valign\":\"top\"},{\"font\":{\"size\":11,\"bold\":false},\"color\":\"#ffffff\",\"valign\":\"bottom\"},{\"font\":{\"size\":8},\"color\":\"#67b1ee\"},{\"color\":\"#67b1ee\",\"font\":{\"size\":12},\"align\":\"left\",\"valign\":\"bottom\"},{\"align\":\"left\",\"valign\":\"bottom\"},{\"color\":\"#67b1ee\",\"font\":{\"size\":12},\"align\":\"center\",\"valign\":\"bottom\"},{\"align\":\"center\",\"valign\":\"bottom\"},{\"color\":\"#67b1ee\",\"font\":{\"size\":12},\"align\":\"left\",\"valign\":\"middle\"},{\"align\":\"left\",\"valign\":\"middle\"},{\"font\":{\"size\":11}},{\"font\":{\"size\":11},\"color\":\"#ffffff\"},{\"font\":{\"size\":11},\"color\":\"#ffffff\",\"valign\":\"middle\"},{\"font\":{\"size\":11},\"color\":\"#ffffff\",\"valign\":\"bottom\"},{\"color\":\"#ffffff\",\"font\":{\"size\":12},\"align\":\"left\",\"valign\":\"middle\"},{\"align\":\"left\",\"valign\":\"middle\",\"color\":\"#ffffff\"},{\"color\":\"#67b1ee\",\"font\":{\"size\":16}},{\"color\":\"#ffff01\",\"font\":{\"size\":16}},{\"color\":\"#ffffff\",\"font\":{\"size\":11},\"align\":\"left\",\"valign\":\"middle\"},{\"color\":\"#ffffff\",\"font\":{\"size\":14},\"align\":\"left\",\"valign\":\"middle\"},{\"color\":\"#ffff01\",\"font\":{\"size\":14},\"align\":\"left\",\"valign\":\"middle\"},{\"font\":{\"size\":14},\"color\":\"#ffff01\"},{\"color\":\"#ffff01\",\"font\":{\"size\":14},\"align\":\"right\",\"valign\":\"middle\"},{\"font\":{\"size\":14},\"color\":\"#ffff01\",\"align\":\"right\"},{\"color\":\"#ffffff\",\"valign\":\"bottom\"},{\"font\":{\"size\":8},\"bgcolor\":\"#67b1ee\"},{\"font\":{\"size\":8},\"bgcolor\":\"#ffffff\"},{\"font\":{\"size\":8},\"bgcolor\":\"#ffffff\",\"color\":\"#67b1ee\"},{\"font\":{\"size\":8},\"bgcolor\":\"#ffffff\",\"color\":\"#67b1ee\",\"valign\":\"top\"},{\"font\":{\"size\":8,\"bold\":false},\"color\":\"#ffffff\",\"valign\":\"bottom\"},{\"font\":{\"size\":8,\"bold\":false},\"color\":\"#ffffff\",\"valign\":\"top\"},{\"font\":{\"size\":8},\"valign\":\"top\"},{\"font\":{\"size\":8,\"bold\":false},\"color\":\"#67b1ee\",\"valign\":\"top\"},{\"color\":\"#ffffff\",\"font\":{\"size\":11},\"align\":\"center\",\"valign\":\"middle\"},{\"align\":\"center\"},{\"color\":\"#ffffff\",\"font\":{\"size\":11},\"align\":\"right\",\"valign\":\"middle\"},{\"align\":\"right\"},{\"color\":\"#ffffff\",\"font\":{\"size\":14},\"align\":\"right\",\"valign\":\"middle\"},{\"align\":\"right\",\"font\":{\"size\":14}},{\"color\":\"#ffffff\",\"font\":{\"size\":11},\"align\":\"left\",\"valign\":\"bottom\"},{\"color\":\"#67b1ee\",\"font\":{\"size\":11}},{\"color\":\"#67b1ee\",\"font\":{\"size\":11},\"align\":\"center\"},{\"font\":{\"size\":12}},{\"font\":{\"size\":12},\"color\":\"#ffff01\"},{\"color\":\"#67b1ee\",\"font\":{\"size\":11},\"align\":\"right\"}],\"validations\":[],\"cols\":{\"0\":{\"width\":10},\"3\":{\"width\":102},\"4\":{\"width\":9},\"5\":{\"width\":105},\"6\":{\"width\":102},\"8\":{\"width\":124},\"9\":{\"width\":14},\"10\":{\"width\":136},\"11\":{\"width\":114},\"12\":{\"width\":15},\"13\":{\"width\":113},\"14\":{\"width\":129},\"15\":{\"width\":11},\"len\":50},\"merges\":[\"B3:S3\",\"B5:C5\",\"N5:O5\",\"P5:Q5\",\"R5:S5\",\"B6:C6\",\"F6:F7\",\"G6:G7\",\"P6:Q6\",\"R6:S6\",\"B7:C7\",\"N13:O13\",\"P13:Q13\",\"R13:S13\",\"P14:Q14\",\"R14:S14\",\"N17:O17\",\"R17:S17\",\"R18:S18\"]}', NULL, 'https://static.jeecg.com/designreport/images/QQ截图20201218200943_1608293404719.png', 'admin', '2021-01-18 13:21:10', 'admin', '2021-07-14 06:27:34', 0, NULL, NULL, 0, 681, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('519c1c6f4d1f584ae8fa5b43b45acdc7', '56623333333', '销售单', '', NULL, 'printinfo', '{\"loopBlockList\":[],\"area\":false,\"excel_config_id\":\"519c1c6f4d1f584ae8fa5b43b45acdc7\",\"printConfig\":{\"paper\":\"A4\",\"width\":210,\"height\":297,\"definition\":1,\"isBackend\":false,\"marginX\":10,\"marginY\":10},\"rows\":{\"0\":{\"cells\":{\"1\":{\"text\":\"销售单\",\"style\":40,\"merge\":[0,6]}},\"height\":99},\"1\":{\"cells\":{\"1\":{\"text\":\"商品编码\",\"style\":62},\"2\":{\"text\":\"商品名称\",\"style\":62},\"3\":{\"text\":\"销售时间\",\"style\":62},\"4\":{\"text\":\"销售数量\",\"style\":62},\"5\":{\"text\":\"定价\",\"style\":62},\"6\":{\"text\":\"优惠价\",\"style\":62},\"7\":{\"text\":\"付款金额\",\"style\":62}},\"height\":39},\"2\":{\"cells\":{\"1\":{\"text\":\"#{xiaoshou.bianma}\",\"style\":61},\"2\":{\"text\":\"#{xiaoshou.cname}\",\"style\":61},\"3\":{\"text\":\"#{xiaoshou.ctime}\",\"style\":61},\"4\":{\"text\":\"#{xiaoshou.cnum}\",\"style\":61},\"5\":{\"text\":\"#{xiaoshou.cprice}\",\"style\":61},\"6\":{\"text\":\"#{xiaoshou.yprice}\",\"style\":61},\"7\":{\"text\":\"#{xiaoshou.ctotal}\",\"style\":61}},\"isDrag\":true,\"height\":35},\"3\":{\"cells\":{\"1\":{\"style\":44,\"text\":\"\"},\"5\":{\"style\":44,\"text\":\"\"},\"6\":{\"text\":\"\",\"style\":45},\"7\":{\"style\":46,\"text\":\"=SUM(H3)\"}},\"isDrag\":true,\"height\":73},\"5\":{\"cells\":{},\"isDrag\":true},\"6\":{\"cells\":{},\"isDrag\":true},\"7\":{\"cells\":{\"2\":{\"text\":\"\"}},\"isDrag\":true},\"len\":100},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":718,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":703,\"displayConfig\":{},\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"center\"},{\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#01b0f1\"],\"top\":[\"thin\",\"#01b0f1\"],\"left\":[\"thin\",\"#01b0f1\"],\"right\":[\"thin\",\"#01b0f1\"]}},{\"border\":{\"bottom\":[\"thin\",\"#01b0f1\"],\"top\":[\"thin\",\"#01b0f1\"],\"left\":[\"thin\",\"#01b0f1\"],\"right\":[\"thin\",\"#01b0f1\"]}},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#01b0f1\"],\"top\":[\"thin\",\"#01b0f1\"],\"left\":[\"thin\",\"#01b0f1\"],\"right\":[\"thin\",\"#01b0f1\"]},\"bgcolor\":\"#01b0f1\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"bgcolor\":\"#01b0f1\"},{\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"font\":{\"size\":18}},{\"align\":\"center\",\"font\":{\"size\":18,\"bold\":true}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"align\":\"center\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"bgcolor\":\"#fed964\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"bgcolor\":\"#fdc101\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#fdc101\"],\"top\":[\"thin\",\"#fdc101\"],\"left\":[\"thin\",\"#fdc101\"],\"right\":[\"thin\",\"#fdc101\"]},\"bgcolor\":\"#fdc101\"},{\"border\":{\"bottom\":[\"thin\",\"#fdc101\"],\"top\":[\"thin\",\"#fdc101\"],\"left\":[\"thin\",\"#fdc101\"],\"right\":[\"thin\",\"#fdc101\"]},\"align\":\"center\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#fdc101\"],\"top\":[\"thin\",\"#fdc101\"],\"left\":[\"thin\",\"#fdc101\"],\"right\":[\"thin\",\"#fdc101\"]},\"bgcolor\":\"#ffe59a\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#fdc101\"],\"top\":[\"thin\",\"#fdc101\"],\"left\":[\"thin\",\"#fdc101\"],\"right\":[\"thin\",\"#fdc101\"]},\"bgcolor\":\"#ffc001\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#fdc101\"],\"top\":[\"thin\",\"#fdc101\"],\"left\":[\"thin\",\"#fdc101\"],\"right\":[\"thin\",\"#fdc101\"]},\"bgcolor\":\"#fed964\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#fdc101\"],\"top\":[\"thin\",\"#fdc101\"],\"left\":[\"thin\",\"#fdc101\"],\"right\":[\"thin\",\"#fdc101\"]},\"bgcolor\":\"#ed7d31\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#fdc101\"],\"top\":[\"thin\",\"#fdc101\"],\"left\":[\"thin\",\"#fdc101\"],\"right\":[\"thin\",\"#fdc101\"]},\"bgcolor\":\"#5b9cd6\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#4371c6\"],\"top\":[\"thin\",\"#4371c6\"],\"left\":[\"thin\",\"#4371c6\"],\"right\":[\"thin\",\"#4371c6\"]},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#4371c6\"],\"top\":[\"thin\",\"#4371c6\"],\"left\":[\"thin\",\"#4371c6\"],\"right\":[\"thin\",\"#4371c6\"]},\"align\":\"center\"},{\"font\":{\"size\":8}},{\"font\":{\"size\":8},\"color\":\"#7f7f7f\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#4371c6\"],\"top\":[\"thin\",\"#4371c6\"],\"left\":[\"thin\",\"#4371c6\"],\"right\":[\"thin\",\"#4371c6\"]},\"bgcolor\":\"#9cc2e6\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"bgcolor\":\"#9cc2e6\"},{\"border\":{\"bottom\":[\"thin\",\"#4371c6\"],\"top\":[\"thin\",\"#4371c6\"],\"left\":[\"thin\",\"#4371c6\"],\"right\":[\"thin\",\"#4371c6\"]}},{\"font\":{\"bold\":true}},{\"font\":{\"bold\":true,\"size\":12}},{\"font\":{\"bold\":true,\"size\":16}},{\"font\":{\"bold\":true,\"size\":18}},{\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"align\":\"right\"},{\"align\":\"right\"},{\"align\":\"left\"},{\"align\":\"right\",\"font\":{\"size\":16}},{\"align\":\"left\",\"font\":{\"size\":16}},{\"align\":\"right\",\"font\":{\"size\":14}},{\"align\":\"left\",\"font\":{\"size\":14}},{\"align\":\"center\",\"font\":{\"size\":18,\"bold\":true,\"name\":\"宋体\"}},{\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#4371c6\"],\"top\":[\"thin\",\"#4371c6\"],\"left\":[\"thin\",\"#4371c6\"],\"right\":[\"thin\",\"#4371c6\"]},\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#4371c6\"],\"top\":[\"thin\",\"#4371c6\"],\"left\":[\"thin\",\"#4371c6\"],\"right\":[\"thin\",\"#4371c6\"]},\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"right\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"right\",\"font\":{\"size\":14,\"name\":\"宋体\"}},{\"align\":\"left\",\"font\":{\"size\":14,\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#2e75b5\"],\"top\":[\"thin\",\"#2e75b5\"],\"left\":[\"thin\",\"#2e75b5\"],\"right\":[\"thin\",\"#2e75b5\"]},\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#000100\",\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#ffff01\"],\"top\":[\"thin\",\"#ffff01\"],\"left\":[\"thin\",\"#ffff01\"],\"right\":[\"thin\",\"#ffff01\"]},\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"right\",\"font\":{\"size\":14,\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"color\":\"#000100\",\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"color\":\"#000100\",\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"color\":\"#ffffff\",\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#2e75b5\"],\"top\":[\"thin\",\"#2e75b5\"],\"left\":[\"thin\",\"#2e75b5\"],\"right\":[\"thin\",\"#2e75b5\"]},\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#4371c6\"],\"top\":[\"thin\",\"#4371c6\"],\"left\":[\"thin\",\"#4371c6\"],\"right\":[\"thin\",\"#4371c6\"]},\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#ffffff\",\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#ffffff\",\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#ffffff\",\"bgcolor\":\"#5b9cd6\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}}],\"validations\":[],\"cols\":{\"0\":{\"width\":18},\"1\":{\"width\":102},\"2\":{\"width\":132},\"3\":{\"width\":147},\"4\":{\"width\":66},\"5\":{\"width\":66},\"6\":{\"width\":84},\"7\":{\"width\":88},\"8\":{\"width\":121},\"len\":50},\"merges\":[\"B1:H1\"]}', '', 'https://static.jeecg.com/designreport/images/xiaoshou_1607310086160.png', 'jeecg', '2020-07-28 16:54:44', 'admin', '2021-07-12 12:21:30', 0, NULL, NULL, 1, 2085, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('537446834339098624', '20210401114849', 'oo', NULL, NULL, 'printinfo', '{\"loopBlockList\":[],\"area\":{\"sri\":3,\"sci\":4,\"eri\":3,\"eci\":4,\"width\":100,\"height\":25},\"excel_config_id\":\"537446834339098624\",\"printConfig\":{\"paper\":\"A4\",\"width\":210,\"height\":297,\"definition\":1,\"isBackend\":false,\"marginX\":10,\"marginY\":10},\"rows\":{\"3\":{\"cells\":{\"1\":{\"text\":\"#{pp.id}\"},\"2\":{\"text\":\"#{pp.cname}\"},\"3\":{\"text\":\"#{pp.cnum}\"},\"4\":{\"text\":\"#{pp.cprice}\"}}},\"len\":98,\"-1\":{\"cells\":{\"-1\":{\"text\":\"#{tt.id}\"}}}},\"dbexps\":[],\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":512,\"displayConfig\":{},\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[],\"validations\":[],\"cols\":{\"2\":{\"width\":109},\"3\":{\"width\":103},\"len\":50},\"merges\":[]}', NULL, NULL, 'admin', '2021-04-01 03:48:50', 'admin', '2021-04-01 05:56:45', 1, NULL, NULL, 0, 49, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('539340274106675200', '20210406171243', '333', NULL, NULL, 'printinfo', '{\"loopBlockList\":[],\"area\":false,\"excel_config_id\":\"539340274106675200\",\"printConfig\":{\"paper\":\"A4\",\"width\":210,\"height\":297,\"definition\":1,\"isBackend\":false,\"marginX\":10,\"marginY\":10},\"rows\":{\"1\":{\"cells\":{\"0\":{\"text\":\" \",\"virtual\":\"4YgDWyELjvBe4KIH\"},\"1\":{\"text\":\" \",\"virtual\":\"4YgDWyELjvBe4KIH\"},\"2\":{\"text\":\" \",\"virtual\":\"4YgDWyELjvBe4KIH\"}}},\"len\":100},\"dbexps\":[],\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":0,\"displayConfig\":{},\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[],\"validations\":[],\"cols\":{\"len\":50},\"merges\":[],\"imgList\":[{\"row\":1,\"col\":0,\"width\":\"247\",\"height\":\"213\",\"src\":\"excel_online/11_1617700358412.jpg\",\"layer_id\":\"4YgDWyELjvBe4KIH\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[1,0],[1,1],[1,2]]}]}', NULL, NULL, 'admin', '2021-04-06 09:12:44', 'admin', '2021-07-13 10:23:35', 1, NULL, NULL, 0, 4, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('53c82a76f837d5661dceec7d93afafec', '5678', '阜阳检票数查询', '', NULL, 'printinfo', '{\"loopBlockList\":[],\"area\":false,\"printElWidth\":718,\"excel_config_id\":\"53c82a76f837d5661dceec7d93afafec\",\"printElHeight\":1047,\"rows\":{\"0\":{\"cells\":{\"0\":{\"style\":58},\"1\":{\"text\":\"\",\"style\":66},\"2\":{\"style\":66},\"3\":{\"style\":67,\"merge\":[0,3],\"text\":\"阜阳火车站检票数\"},\"4\":{\"style\":67},\"5\":{\"style\":67},\"6\":{\"style\":67},\"7\":{\"style\":66},\"8\":{\"style\":66},\"9\":{\"style\":58}},\"height\":63},\"1\":{\"cells\":{\"0\":{\"style\":58},\"1\":{\"style\":66},\"2\":{\"style\":66},\"3\":{\"style\":66},\"4\":{\"style\":66},\"5\":{\"style\":66},\"6\":{\"style\":66},\"7\":{\"style\":66},\"8\":{\"style\":66},\"9\":{\"style\":58}},\"height\":20},\"2\":{\"cells\":{\"0\":{\"style\":58},\"1\":{\"text\":\"日期:\",\"style\":68},\"2\":{\"text\":\"${gongsi.tdata}\",\"style\":69},\"3\":{\"style\":66},\"4\":{\"style\":66,\"text\":\"制表人:\"},\"5\":{\"text\":\"${gongsi.gname}\",\"style\":66},\"6\":{\"style\":66},\"7\":{\"text\":\"\",\"merge\":[0,1],\"style\":70},\"8\":{\"style\":70},\"9\":{\"style\":58}},\"isDrag\":true},\"3\":{\"cells\":{\"0\":{\"style\":58},\"1\":{\"text\":\"班次\",\"merge\":[1,0],\"style\":71},\"2\":{\"text\":\"发车时间\",\"merge\":[1,0],\"style\":71},\"3\":{\"text\":\"是否放空\",\"merge\":[1,0],\"style\":71},\"4\":{\"text\":\"路线\",\"merge\":[0,1],\"style\":71},\"5\":{\"style\":72},\"6\":{\"text\":\"核载座位数\",\"merge\":[1,0],\"style\":71},\"7\":{\"merge\":[1,0],\"style\":71,\"text\":\"检票数\"},\"8\":{\"merge\":[1,0],\"style\":71,\"text\":\"实载率(%)\"},\"9\":{\"style\":58}}},\"4\":{\"cells\":{\"0\":{\"style\":58},\"1\":{\"style\":72},\"2\":{\"style\":71},\"3\":{\"style\":72},\"4\":{\"text\":\"从\",\"style\":71},\"5\":{\"text\":\"到\",\"style\":71},\"6\":{\"style\":72},\"7\":{\"style\":71},\"8\":{\"style\":72},\"9\":{\"style\":58}},\"height\":25},\"5\":{\"cells\":{\"0\":{\"style\":58},\"1\":{\"style\":73,\"text\":\"#{jianpiao.bnum}\"},\"2\":{\"style\":73,\"text\":\"#{jianpiao.ftime}\"},\"3\":{\"style\":73,\"text\":\"#{jianpiao.sfkong}\"},\"4\":{\"style\":73,\"text\":\"#{jianpiao.kaishi}\"},\"5\":{\"style\":73,\"text\":\"#{jianpiao.jieshu}\"},\"6\":{\"style\":73,\"text\":\"#{jianpiao.hezairen}\"},\"7\":{\"style\":73,\"text\":\"#{jianpiao.jpnum}\"},\"8\":{\"style\":73,\"text\":\"#{jianpiao.shihelv}\"},\"9\":{\"style\":58}},\"height\":33},\"6\":{\"cells\":{\"1\":{\"text\":\"\",\"style\":11},\"2\":{\"style\":11},\"3\":{\"style\":11},\"4\":{\"style\":11},\"5\":{\"style\":11},\"6\":{\"style\":11},\"7\":{\"style\":11},\"8\":{\"style\":11}},\"isDrag\":true},\"7\":{\"cells\":{\"1\":{\"style\":11},\"2\":{\"style\":11,\"text\":\"\"},\"3\":{\"style\":11},\"4\":{\"style\":11},\"5\":{\"style\":11},\"6\":{\"style\":11},\"7\":{\"style\":11},\"8\":{\"style\":11}}},\"8\":{\"cells\":{\"1\":{\"style\":11},\"2\":{\"style\":11},\"3\":{\"style\":11},\"4\":{\"style\":11},\"5\":{\"style\":11},\"6\":{\"style\":11},\"7\":{\"style\":11},\"8\":{\"style\":11}}},\"9\":{\"cells\":{\"1\":{\"style\":11},\"2\":{\"style\":11},\"3\":{\"style\":11},\"4\":{\"style\":11},\"5\":{\"style\":11},\"6\":{\"style\":11},\"7\":{\"style\":11},\"8\":{\"style\":11}}},\"10\":{\"cells\":{\"1\":{\"style\":11},\"2\":{\"style\":11},\"3\":{\"style\":11},\"4\":{\"style\":11},\"5\":{\"style\":11},\"6\":{\"style\":11},\"7\":{\"style\":11},\"8\":{\"style\":11}}},\"11\":{\"cells\":{\"1\":{\"style\":11},\"2\":{\"style\":11},\"3\":{\"style\":11},\"4\":{\"style\":11},\"5\":{\"style\":11},\"6\":{\"style\":11},\"7\":{\"style\":11},\"8\":{\"style\":11}}},\"12\":{\"cells\":{\"1\":{\"style\":11},\"2\":{\"style\":11},\"3\":{\"style\":11},\"4\":{\"style\":11},\"5\":{\"style\":11},\"6\":{\"style\":11},\"7\":{\"style\":11},\"8\":{\"style\":11}}},\"13\":{\"cells\":{\"1\":{\"style\":11},\"2\":{\"style\":11},\"3\":{\"style\":11},\"4\":{\"style\":11},\"5\":{\"style\":11},\"6\":{\"style\":11},\"7\":{\"style\":11},\"8\":{\"style\":11}}},\"14\":{\"cells\":{\"1\":{\"style\":11},\"2\":{\"style\":11},\"3\":{\"style\":11},\"4\":{\"style\":11},\"5\":{\"style\":11},\"6\":{\"style\":11},\"7\":{\"style\":11},\"8\":{\"style\":11}}},\"len\":96,\"-1\":{\"cells\":{\"-1\":{\"text\":\"${gongsi.id}\"}},\"isDrag\":true}},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":718,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":701,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"center\"},{\"align\":\"center\",\"border\":{\"top\":[\"thin\",\"#000\"],\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"top\":[\"thin\",\"#000\"],\"bottom\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"top\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"top\":[\"thin\",\"#000\"],\"bottom\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"top\":[\"thin\",\"#000\"],\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{},{\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"border\":{\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"]}},{\"border\":{\"top\":[\"thin\",\"#000100\"]}},{\"border\":{\"top\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"left\":[\"thin\",\"#000100\"]}},{\"border\":{\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"top\":[\"thin\",\"#7f7f7f\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"right\":[\"thin\",\"#7f7f7f\"],\"bottom\":[\"thin\",\"#7f7f7f\"]}},{\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"]}},{\"border\":{\"right\":[\"thin\",\"#7f7f7f\"]}},{\"align\":\"center\",\"font\":{\"size\":16}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true}},{\"font\":{\"bold\":true}},{\"font\":{\"bold\":false}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"bold\":true}},{\"align\":\"center\",\"font\":{\"bold\":true}},{\"align\":\"right\"},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"bold\":true},\"bgcolor\":\"#4371c6\"},{\"align\":\"center\",\"font\":{\"bold\":true},\"bgcolor\":\"#4371c6\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"bold\":false},\"bgcolor\":\"#4371c6\"},{\"align\":\"center\",\"font\":{\"bold\":false},\"bgcolor\":\"#4371c6\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"bold\":false},\"bgcolor\":\"#2e75b5\"},{\"align\":\"center\",\"font\":{\"bold\":false},\"bgcolor\":\"#2e75b5\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"bold\":false},\"bgcolor\":\"#5b9cd6\"},{\"align\":\"center\",\"font\":{\"bold\":false},\"bgcolor\":\"#5b9cd6\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"bold\":false},\"bgcolor\":\"#0170c1\"},{\"align\":\"center\",\"font\":{\"bold\":false},\"bgcolor\":\"#0170c1\"},{\"font\":{\"bold\":false},\"color\":\"#7f7f7f\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"bold\":false},\"bgcolor\":\"#9cc2e6\"},{\"align\":\"center\",\"font\":{\"bold\":false},\"bgcolor\":\"#9cc2e6\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"bold\":false},\"bgcolor\":\"#01b0f1\"},{\"align\":\"center\",\"font\":{\"bold\":false},\"bgcolor\":\"#01b0f1\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"font\":{\"bold\":false},\"bgcolor\":\"#5b9cd6\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"font\":{\"bold\":false},\"bgcolor\":\"#9cc2e6\"},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true},\"valign\":\"bottom\"},{\"align\":\"center\",\"font\":{\"size\":22,\"bold\":true},\"valign\":\"bottom\"},{\"align\":\"center\",\"font\":{\"size\":18,\"bold\":true},\"valign\":\"bottom\"},{\"font\":{\"bold\":false},\"color\":\"#7f7f7f\",\"align\":\"right\"},{\"color\":\"#7f7f7f\"},{\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"size\":18,\"bold\":true,\"name\":\"宋体\"},\"valign\":\"bottom\"},{\"font\":{\"bold\":false,\"name\":\"宋体\"},\"color\":\"#7f7f7f\",\"align\":\"right\"},{\"color\":\"#7f7f7f\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"right\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"font\":{\"bold\":false,\"name\":\"宋体\"},\"bgcolor\":\"#9cc2e6\"},{\"align\":\"center\",\"font\":{\"bold\":false,\"name\":\"宋体\"},\"bgcolor\":\"#9cc2e6\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"font\":{\"name\":\"宋体\"}},{\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"font\":{\"size\":18,\"bold\":true,\"name\":\"Microsoft YaHei\"},\"valign\":\"bottom\"},{\"font\":{\"bold\":false,\"name\":\"Microsoft YaHei\"},\"color\":\"#7f7f7f\",\"align\":\"right\"},{\"color\":\"#7f7f7f\",\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"right\",\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"font\":{\"bold\":false,\"name\":\"Microsoft YaHei\"},\"bgcolor\":\"#9cc2e6\"},{\"align\":\"center\",\"font\":{\"bold\":false,\"name\":\"Microsoft YaHei\"},\"bgcolor\":\"#9cc2e6\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"font\":{\"name\":\"Microsoft YaHei\"}}],\"validations\":[],\"cols\":{\"0\":{\"width\":17},\"1\":{\"width\":118},\"2\":{\"width\":75},\"3\":{\"width\":54},\"4\":{\"width\":95},\"5\":{\"width\":109},\"6\":{\"width\":75},\"7\":{\"width\":75},\"8\":{\"width\":83},\"9\":{\"width\":30},\"len\":50},\"merges\":[\"E4:F4\",\"B4:B5\",\"C4:C5\",\"D4:D5\",\"G4:G5\",\"H4:H5\",\"I4:I5\",\"D1:G1\",\"H3:I3\"]}', '', 'https://static.jeecg.com/designreport/images/25_1597233573577.png', 'jeecg', '2020-06-16 15:01:42', 'admin', '2021-02-03 12:11:37', 0, NULL, NULL, 1, 691, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('5485950d88c9918d03dece2ad24b4d72', '202101081612408899', '实例:年度各月份佣金收入副本8899', NULL, NULL, 'datainfo', '{\"loopBlockList\":[],\"area\":{\"sri\":11,\"sci\":7,\"eri\":11,\"eci\":7,\"width\":100,\"height\":25},\"printElWidth\":749,\"excel_config_id\":\"1347454742040809472\",\"printElHeight\":1047,\"rows\":{\"1\":{\"cells\":{\"1\":{\"text\":\" \",\"virtual\":\"pZTpI3BKFw0lh6D7\"},\"2\":{\"text\":\"年度各月份佣金收入\",\"style\":23,\"merge\":[0,3],\"virtual\":\"pZTpI3BKFw0lh6D7\"},\"3\":{\"style\":24},\"4\":{\"style\":24},\"5\":{\"style\":24},\"6\":{\"text\":\" \"}},\"height\":37},\"2\":{\"cells\":{\"1\":{\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"}}},\"4\":{\"cells\":{\"1\":{\"text\":\"查询年度:2019\"},\"4\":{\"text\":\"查询机构:总公司\"},\"6\":{\"text\":\"单位:元\"}}},\"6\":{\"cells\":{\"1\":{\"text\":\"月份\",\"style\":12},\"2\":{\"text\":\"佣金/主营业收入\",\"style\":12},\"3\":{\"text\":\"累计\",\"style\":12},\"4\":{\"text\":\"历史最低水平\",\"style\":12},\"5\":{\"text\":\"历史平均水平\",\"style\":12},\"6\":{\"text\":\"历史最高水平\",\"style\":12}}},\"7\":{\"cells\":{\"1\":{\"text\":\"#{tmp_report_data_1.monty}\",\"style\":0},\"2\":{\"text\":\"#{tmp_report_data_1.main_income}\",\"style\":0},\"3\":{\"text\":\"#{tmp_report_data_1.total}\",\"style\":18},\"4\":{\"text\":\"#{tmp_report_data_1.his_lowest}\",\"style\":0},\"5\":{\"text\":\"#{tmp_report_data_1.his_average}\",\"style\":0},\"6\":{\"text\":\"#{tmp_report_data_1.his_highest}\",\"style\":0}},\"isDrag\":true},\"9\":{\"cells\":{\"1\":{\"merge\":[1,1]}}},\"len\":99},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":703,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"bold\":true}},{\"font\":{\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"bold\":false}},{\"font\":{\"bold\":false}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"bold\":true},\"align\":\"center\"},{\"font\":{\"bold\":true},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"bold\":true,\"size\":15},\"align\":\"center\"},{\"font\":{\"bold\":true,\"size\":15},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#01b0f1\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#33CCCC\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#33CCCC\",\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#33CCCC\",\"align\":\"left\"},{\"font\":{\"bold\":true,\"size\":16}},{\"font\":{\"bold\":true,\"size\":24}},{\"font\":{\"bold\":true,\"size\":22}},{\"font\":{\"bold\":true,\"size\":22},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"format\":\"usd\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"format\":\"rmb\"},{\"font\":{\"bold\":true,\"name\":\"黑体\"}},{\"font\":{\"bold\":true,\"name\":\"黑体\",\"size\":22}},{\"font\":{\"bold\":true,\"name\":\"宋体\",\"size\":22}},{\"font\":{\"bold\":true,\"name\":\"楷体\",\"size\":22}},{\"font\":{\"bold\":true,\"name\":\"楷体\",\"size\":22},\"align\":\"center\"},{\"align\":\"center\"}],\"validations\":[],\"cols\":{\"0\":{\"width\":54},\"1\":{\"width\":111},\"2\":{\"width\":116},\"4\":{\"width\":122},\"len\":26},\"merges\":[\"B10:C11\",\"C2:F2\"],\"imgList\":[{\"row\":1,\"col\":1,\"width\":\"148\",\"height\":\"56\",\"src\":\"https://static.jeecg.com/designreport/images/kunlunlog_1610591367645.png\",\"layer_id\":\"pZTpI3BKFw0lh6D7\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[1,1],[1,2]]}]}', NULL, NULL, 'admin', '2021-01-19 10:45:44', 'admin', '2021-02-03 12:02:25', 1, NULL, NULL, 0, 43, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('570128838205493248', '20210630161541', 'ddd', NULL, NULL, 'datainfo', '{\"loopBlockList\":[],\"area\":{\"sri\":4,\"sci\":1,\"eri\":7,\"eci\":5,\"width\":500,\"height\":230},\"excel_config_id\":\"570128838205493248\",\"printConfig\":{\"paper\":\"A4\",\"width\":210,\"height\":297,\"definition\":1,\"isBackend\":false,\"marginX\":10,\"marginY\":10,\"layout\":\"portrait\"},\"rows\":{\"4\":{\"cells\":{\"1\":{\"text\":\"111\",\"style\":0},\"2\":{\"style\":0,\"text\":\" \"},\"3\":{\"style\":0,\"text\":\" \"},\"4\":{\"style\":0,\"text\":\" \"},\"5\":{\"style\":0,\"text\":\" \"}},\"height\":70},\"5\":{\"cells\":{\"1\":{\"text\":\"22\",\"style\":0},\"2\":{\"style\":0,\"text\":\" \"},\"3\":{\"style\":0,\"text\":\" \"},\"4\":{\"style\":0,\"text\":\" \"},\"5\":{\"style\":0,\"text\":\" \"}},\"height\":41},\"6\":{\"cells\":{\"1\":{\"text\":\"33\",\"style\":0},\"2\":{\"style\":0,\"text\":\" \"},\"3\":{\"style\":0,\"text\":\" \"},\"4\":{\"style\":0,\"text\":\" \"},\"5\":{\"style\":0,\"text\":\" \"}},\"height\":51},\"7\":{\"cells\":{\"1\":{\"text\":\"44\",\"style\":0},\"2\":{\"style\":0,\"text\":\" \"},\"3\":{\"style\":0,\"text\":\" \"},\"4\":{\"style\":0,\"text\":\" \"},\"5\":{\"style\":0,\"text\":\" \"}},\"height\":68},\"len\":100},\"dbexps\":[],\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":600,\"displayConfig\":{},\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}}],\"validations\":[],\"cols\":{\"len\":50},\"merges\":[]}', NULL, NULL, 'admin', '2021-06-30 08:15:42', 'admin', '2021-06-30 10:15:07', 1, NULL, NULL, 0, 4, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('574873661613404160', '202010101632520060', 'XXX有限公司员工登记表副本0060', NULL, NULL, 'printinfo', '{\"loopBlockList\":[],\"area\":{\"sri\":10,\"sci\":11,\"eri\":10,\"eci\":11,\"width\":85,\"height\":38},\"excel_config_id\":\"1314846205892759552\",\"printConfig\":{\"paper\":\"A4\",\"width\":210,\"height\":297,\"definition\":1,\"isBackend\":false,\"marginX\":10,\"marginY\":10},\"rows\":{\"0\":{\"cells\":{\"0\":{\"merge\":[0,8]},\"9\":{}},\"height\":22},\"1\":{\"cells\":{\"1\":{\"style\":87,\"text\":\" \"},\"2\":{\"style\":87,\"text\":\" \"},\"3\":{\"style\":87,\"text\":\" \"},\"4\":{\"style\":87,\"text\":\" \"},\"5\":{\"style\":87,\"text\":\" \"},\"6\":{\"style\":87,\"text\":\" \"},\"7\":{\"style\":87,\"text\":\" \"},\"8\":{\"style\":87,\"text\":\" \"}},\"height\":24},\"2\":{\"cells\":{\"0\":{\"text\":\"所在部门\",\"style\":93},\"1\":{\"text\":\"${yuangongjiben.department}\",\"style\":23,\"merge\":[0,2]},\"4\":{\"text\":\"职务\",\"style\":93},\"5\":{\"text\":\"${yuangongjiben.post}\",\"style\":23},\"6\":{\"text\":\"填写日期\",\"style\":93},\"7\":{\"text\":\"${yuangongjiben.data}\",\"style\":23,\"merge\":[0,1]}},\"isDrag\":true,\"height\":36},\"3\":{\"cells\":{\"0\":{\"text\":\"姓名\",\"style\":93},\"1\":{\"text\":\"${yuangongjiben.name}\",\"style\":23},\"2\":{\"text\":\"性别\",\"style\":93},\"3\":{\"text\":\"${yuangongjiben.sex}\",\"style\":23},\"4\":{\"text\":\"出生日期\",\"style\":93},\"5\":{\"text\":\"${yuangongjiben.birth}\",\"style\":23},\"6\":{\"text\":\"政治面貌\",\"style\":93},\"7\":{\"text\":\"${yuangongjiben.political}\",\"style\":130,\"merge\":[0,1]}},\"isDrag\":true,\"height\":33},\"4\":{\"cells\":{\"0\":{\"text\":\"机关\",\"style\":93},\"1\":{\"text\":\"${yuangongjiben.office}\",\"style\":23},\"2\":{\"style\":93,\"text\":\"民族\"},\"3\":{\"text\":\"${yuangongjiben.nation}\",\"style\":23},\"4\":{\"style\":93,\"text\":\"健康状况\"},\"5\":{\"text\":\"${yuangongjiben.health}\",\"style\":23},\"6\":{\"style\":93,\"text\":\"户籍类型\",\"virtual\":\"1KT8bnqRT4bi8Z7b\"},\"7\":{\"text\":\"${yuangongjiben.register}\",\"style\":26,\"virtual\":\"1KT8bnqRT4bi8Z7b\"},\"8\":{\"merge\":[3,0],\"height\":104,\"style\":35,\"text\":\" \",\"virtual\":\"cvkWDQVZhfJPgcS4\"}},\"isDrag\":true,\"height\":31},\"5\":{\"cells\":{\"0\":{\"text\":\"最高学历\",\"style\":93},\"1\":{\"text\":\"${yuangongjiben.education}\",\"style\":23},\"2\":{\"text\":\"所学专业\",\"style\":93},\"3\":{\"text\":\"${yuangongjiben.major}\",\"style\":23,\"merge\":[0,2]},\"6\":{\"text\":\"毕业时间\",\"style\":93},\"7\":{\"text\":\"${yuangongjiben.gdata}\",\"style\":23}},\"isDrag\":true,\"height\":35},\"6\":{\"cells\":{\"0\":{\"text\":\"电子邮箱\",\"style\":93},\"1\":{\"text\":\"${yuangongjiben.mailbox}\",\"style\":23},\"2\":{\"text\":\"手机号\",\"style\":93},\"3\":{\"text\":\"${yuangongjiben.telphone}\",\"style\":23,\"merge\":[0,2]},\"6\":{\"text\":\"家庭电话\",\"style\":93},\"7\":{\"text\":\"${yuangongjiben.homephone}\",\"style\":23}},\"isDrag\":true,\"height\":38},\"7\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"第一次参加工作时间\",\"style\":93},\"2\":{\"text\":\"${yuangongjiben.pworktime}\",\"style\":133,\"merge\":[0,2]},\"5\":{\"style\":93,\"text\":\"入职时间\"},\"6\":{\"text\":\"${yuangongjiben.entrytime}\",\"style\":24,\"merge\":[0,1]}},\"isDrag\":true,\"height\":27},\"8\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"毕业院校\",\"style\":93},\"2\":{\"text\":\"${yuangongjiben.school}\",\"style\":24,\"merge\":[0,2]},\"5\":{\"style\":93,\"text\":\"身份证号\"},\"6\":{\"text\":\"${yuangongjiben.idcard}\",\"style\":24,\"merge\":[0,2]}},\"isDrag\":true,\"height\":34},\"9\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"入党(团)时间、地点\",\"style\":94},\"2\":{\"text\":\"${yuangongjiben.entrytime}\",\"style\":24,\"merge\":[0,2]},\"5\":{\"text\":\"婚姻状况\",\"style\":93},\"6\":{\"text\":\"${yuangongjiben.marital}\",\"style\":23},\"7\":{\"text\":\"有无子女\",\"style\":93},\"8\":{\"text\":\"${yuangongjiben.children}\",\"style\":23}},\"isDrag\":true,\"height\":33},\"10\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"户口所在街道名称\",\"style\":93},\"2\":{\"text\":\"${yuangongjiben.hukoustreet}\",\"style\":24,\"merge\":[0,2]},\"5\":{\"merge\":[0,1],\"text\":\"户口所在地邮编\",\"style\":93},\"7\":{\"text\":\"${yuangongjiben.hukounum}\",\"style\":23,\"merge\":[0,1]}},\"isDrag\":true,\"height\":38},\"11\":{\"cells\":{\"0\":{\"text\":\"户口所在地地址\",\"style\":96,\"merge\":[2,1]},\"2\":{\"text\":\"${yuangongjiben.hukoudi}\",\"style\":26,\"merge\":[2,6]}},\"isDrag\":true},\"12\":{\"cells\":{}},\"13\":{\"cells\":{\"11\":{\"text\":\"\"}},\"isDrag\":true},\"14\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"现居住地址\",\"style\":98},\"2\":{\"text\":\"${yuangongjiben.currentdi}\",\"style\":26,\"merge\":[0,2]},\"5\":{\"style\":98,\"merge\":[0,1],\"text\":\"现居住地址邮编\"},\"7\":{\"text\":\"${yuangongjiben.currentnum}\",\"style\":26,\"merge\":[0,1]}},\"isDrag\":true,\"height\":33},\"15\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"是否参加社保\",\"style\":98},\"2\":{\"text\":\"${yuangongjiben.socialsecurity}\",\"style\":27,\"merge\":[0,1]},\"4\":{\"text\":\"有无公积金\",\"style\":98},\"5\":{\"text\":\"${yuangongjiben.providentfund}\",\"style\":27,\"merge\":[0,1]},\"7\":{\"text\":\"兴趣爱好\",\"style\":98},\"8\":{\"text\":\"${yuangongjiben.hobby}\",\"style\":27}},\"isDrag\":true,\"height\":34},\"16\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"参加社保类型\",\"style\":98},\"2\":{\"text\":\"${yuangongjiben.sbtype}\",\"style\":116,\"merge\":[0,6]}},\"isDrag\":true,\"height\":30},\"17\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"个人档案存放地\",\"style\":98},\"2\":{\"text\":\"${yuangongjiben.archivesdi}\",\"style\":116,\"merge\":[0,6]}},\"isDrag\":true,\"height\":33},\"18\":{\"cells\":{\"0\":{\"text\":\" \",\"style\":7},\"1\":{\"text\":\" \",\"style\":7},\"2\":{\"text\":\" \",\"style\":7},\"3\":{\"text\":\" \",\"style\":7},\"4\":{\"text\":\" \",\"style\":7},\"5\":{\"text\":\" \",\"style\":7},\"6\":{\"text\":\" \",\"style\":7},\"7\":{\"text\":\" \",\"style\":7},\"8\":{\"text\":\" \",\"style\":7}}},\"19\":{\"cells\":{\"0\":{\"merge\":[0,4],\"text\":\"学历、经历(从高中开始写)\",\"style\":99},\"5\":{\"style\":7,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":112,\"text\":\" \"}}},\"20\":{\"cells\":{\"0\":{\"text\":\"由_年_月\",\"merge\":[0,1],\"style\":36},\"2\":{\"merge\":[0,1],\"text\":\"至_年_月\",\"style\":38},\"4\":{\"merge\":[0,1],\"text\":\"就读学校\",\"style\":38},\"6\":{\"merge\":[0,1],\"text\":\"专业\",\"style\":38},\"8\":{\"text\":\"担任职务\",\"style\":38},\"9\":{\"style\":112,\"text\":\" \"}}},\"21\":{\"cells\":{\"0\":{\"style\":90,\"merge\":[0,1],\"text\":\"#{xueli.kdate}\"},\"2\":{\"style\":90,\"text\":\"#{xueli.jdate}\",\"merge\":[0,1]},\"4\":{\"style\":90,\"text\":\"#{xueli.jstudent}\",\"merge\":[0,1]},\"6\":{\"style\":90,\"text\":\"#{xueli.zhuanye}\",\"merge\":[0,1]},\"8\":{\"style\":90,\"text\":\"#{xueli.zhiwu}\"},\"9\":{\"style\":112,\"text\":\" \"}},\"isDrag\":true},\"22\":{\"cells\":{\"0\":{\"style\":7,\"text\":\" \"},\"1\":{\"style\":7,\"text\":\" \"},\"2\":{\"style\":7,\"text\":\" \"},\"3\":{\"style\":7,\"text\":\" \"},\"4\":{\"style\":7,\"text\":\" \"},\"5\":{\"style\":7,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":112,\"text\":\" \"}}},\"23\":{\"cells\":{\"0\":{\"merge\":[0,4],\"text\":\"工作经历\",\"style\":124},\"5\":{\"style\":7,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":112,\"text\":\" \"}},\"height\":27},\"24\":{\"cells\":{\"0\":{\"text\":\"由_年_月\",\"merge\":[0,1],\"style\":36},\"2\":{\"merge\":[0,1],\"text\":\"至_年_月\",\"style\":38},\"4\":{\"text\":\"工作单位及职称\",\"style\":38,\"merge\":[0,1]},\"6\":{\"merge\":[0,1],\"text\":\"证明人\",\"style\":38},\"8\":{\"text\":\"联系方式\",\"style\":38},\"9\":{\"style\":112,\"text\":\" \"}}},\"25\":{\"cells\":{\"0\":{\"text\":\"#{uu.kdate}\",\"style\":90,\"merge\":[0,1]},\"2\":{\"text\":\"#{uu.jdate}\",\"style\":90,\"merge\":[0,1]},\"4\":{\"text\":\"#{uu.jstudent}\",\"style\":90,\"merge\":[0,1]},\"6\":{\"text\":\"#{uu.zmname}\",\"style\":90,\"merge\":[0,1]},\"8\":{\"text\":\"#{uu.zmphone}\",\"style\":90},\"9\":{\"style\":112,\"text\":\" \"}},\"isDrag\":true},\"26\":{\"cells\":{\"0\":{\"style\":7,\"text\":\" \"},\"1\":{\"style\":7,\"text\":\" \"},\"2\":{\"style\":7,\"text\":\" \"},\"3\":{\"style\":7,\"text\":\" \"},\"4\":{\"style\":7,\"text\":\" \"},\"5\":{\"style\":7,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":112,\"text\":\" \"}}},\"27\":{\"cells\":{\"0\":{\"merge\":[0,4],\"text\":\"职称/资格、证书\",\"style\":125},\"5\":{\"style\":7,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":112,\"text\":\" \"}},\"height\":46},\"28\":{\"cells\":{\"0\":{\"text\":\"发证时间\",\"merge\":[0,1],\"style\":36},\"2\":{\"merge\":[0,1],\"text\":\"职称名称\",\"style\":38},\"4\":{\"text\":\"级别\",\"style\":38,\"merge\":[0,1]},\"6\":{\"text\":\"发证单位\",\"style\":38,\"merge\":[0,1]},\"8\":{\"text\":\"备注\",\"style\":38},\"9\":{\"style\":112,\"text\":\" \"}}},\"29\":{\"cells\":{\"0\":{\"text\":\"#{zhengshu.fdate}\",\"style\":90,\"merge\":[0,1]},\"2\":{\"text\":\"#{zhengshu.zcname}\",\"style\":90,\"merge\":[0,1]},\"4\":{\"text\":\"#{zhengshu.jibie}\",\"style\":90,\"merge\":[0,1]},\"6\":{\"text\":\"#{zhengshu.danwei}\",\"style\":90,\"merge\":[0,1]},\"8\":{\"text\":\"#{zhengshu.beizhu}\",\"style\":90},\"9\":{\"style\":112,\"text\":\" \"}},\"isDrag\":true},\"30\":{\"cells\":{\"0\":{\"style\":7,\"text\":\" \"},\"1\":{\"style\":7,\"text\":\" \"},\"2\":{\"style\":7,\"text\":\" \"},\"3\":{\"style\":7,\"text\":\" \"},\"4\":{\"style\":7,\"text\":\" \"},\"5\":{\"style\":7,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":112,\"text\":\" \"}}},\"31\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"家庭成员\",\"style\":125},\"2\":{\"style\":7,\"text\":\" \"},\"3\":{\"style\":7,\"text\":\" \"},\"4\":{\"style\":7,\"text\":\" \"},\"5\":{\"style\":7,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":112,\"text\":\" \"}},\"height\":42},\"32\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"姓名\",\"style\":38},\"2\":{\"merge\":[0,1],\"text\":\"关系\",\"style\":38},\"4\":{\"text\":\"年龄\",\"style\":38},\"5\":{\"text\":\"工作单位\",\"style\":38,\"merge\":[0,1]},\"7\":{\"text\":\"政治面貌\",\"style\":38},\"8\":{\"text\":\"联系方式\",\"style\":38},\"9\":{\"style\":112,\"text\":\" \"}}},\"33\":{\"cells\":{\"0\":{\"text\":\"#{jtcy.name}\",\"style\":90,\"merge\":[0,1]},\"2\":{\"text\":\"#{jtcy.guanxi}\",\"style\":90,\"merge\":[0,1]},\"4\":{\"text\":\"#{jtcy.age}\",\"style\":90},\"5\":{\"text\":\"#{jtcy.danwei}\",\"style\":90,\"merge\":[0,1]},\"7\":{\"text\":\"#{jtcy.zzmm}\",\"style\":90},\"8\":{\"text\":\"#{jtcy.phone}\",\"style\":90},\"9\":{\"style\":112,\"text\":\" \"}},\"isDrag\":true},\"34\":{\"cells\":{\"0\":{\"text\":\" \",\"style\":7},\"1\":{\"text\":\" \",\"style\":7},\"2\":{\"text\":\" \",\"style\":7},\"3\":{\"text\":\" \",\"style\":7},\"4\":{\"text\":\" \",\"style\":7},\"5\":{\"text\":\" \",\"style\":7},\"6\":{\"text\":\" \",\"style\":7},\"7\":{\"text\":\" \",\"style\":7},\"8\":{\"text\":\" \",\"style\":7},\"9\":{\"style\":112,\"text\":\" \"}}},\"35\":{\"cells\":{\"0\":{\"merge\":[0,2],\"text\":\"所获奖励\",\"style\":125},\"3\":{\"text\":\" \",\"style\":7},\"4\":{\"text\":\" \",\"style\":7},\"5\":{\"text\":\" \",\"style\":7},\"6\":{\"text\":\" \",\"style\":7},\"7\":{\"text\":\" \",\"style\":7},\"8\":{\"text\":\" \",\"style\":7},\"9\":{\"style\":112,\"text\":\" \"}},\"height\":47},\"36\":{\"cells\":{\"0\":{\"text\":\"时间\",\"style\":90,\"merge\":[0,2]},\"3\":{\"style\":90,\"text\":\"地点\",\"merge\":[0,2]},\"6\":{\"style\":90,\"text\":\"所获得的奖励名称\",\"merge\":[0,2]},\"9\":{\"style\":112,\"text\":\" \"}}},\"37\":{\"cells\":{\"0\":{\"text\":\"#{jiangli.date}\",\"style\":90,\"merge\":[0,2]},\"3\":{\"text\":\"#{jiangli.didian}\",\"style\":90,\"merge\":[0,2]},\"6\":{\"text\":\"#{jiangli.mingcheng}\",\"style\":90,\"merge\":[0,2]},\"9\":{\"style\":112,\"text\":\" \"}},\"isDrag\":true},\"len\":98},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":718,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":703,\"displayConfig\":{},\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":16}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true}},{\"align\":\"center\",\"font\":{\"name\":\"仿宋\"}},{\"font\":{\"name\":\"仿宋\"}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":12}},{\"font\":{\"name\":\"宋体\",\"size\":12}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":8}},{\"font\":{\"name\":\"宋体\",\"size\":8}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":10}},{\"font\":{\"name\":\"宋体\",\"size\":10}},{\"align\":\"center\",\"font\":{\"name\":\"隶书\",\"size\":10}},{\"font\":{\"name\":\"隶书\",\"size\":10}},{\"align\":\"center\",\"font\":{\"name\":\"华文中宋\",\"size\":10}},{\"font\":{\"name\":\"华文中宋\",\"size\":10}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\",\"size\":10}},{\"font\":{\"name\":\"Microsoft YaHei\",\"size\":10}},{\"textwrap\":true},{\"textwrap\":true,\"align\":\"center\"},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"bold\":true}},{\"font\":{\"bold\":true,\"size\":12}},{\"font\":{\"bold\":true,\"size\":10}},{\"font\":{\"bold\":true,\"size\":10},\"align\":\"center\"},{\"font\":{\"bold\":true},\"align\":\"center\"},{\"font\":{\"bold\":true,\"size\":10},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"bold\":true},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"bold\":true,\"size\":10,\"name\":\"宋体\"},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"bold\":true,\"size\":10,\"name\":\"宋体\"},\"align\":\"center\"},{\"font\":{\"bold\":true,\"name\":\"宋体\"},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"bold\":true,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true},\"border\":{\"top\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true},\"border\":{\"top\":[\"medium\",\"#000\"]}},{\"border\":{\"top\":[\"medium\",\"#000\"],\"right\":[\"medium\",\"#000\"]}},{\"border\":{\"left\":[\"medium\",\"#000\"]}},{\"border\":{\"right\":[\"medium\",\"#000\"]}},{\"border\":{\"bottom\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"]}},{\"border\":{\"bottom\":[\"medium\",\"#000\"]}},{\"border\":{\"bottom\":[\"medium\",\"#000\"],\"right\":[\"medium\",\"#000\"]}},{\"border\":{\"top\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true,\"name\":\"Microsoft YaHei\"},\"border\":{\"top\":[\"medium\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true,\"name\":\"Microsoft YaHei\"}},{\"border\":{\"top\":[\"medium\",\"#000\"],\"right\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"left\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"right\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"font\":{\"name\":\"Microsoft YaHei\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"Microsoft YaHei\"}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\"}},{\"font\":{\"name\":\"Microsoft YaHei\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\"}},{\"font\":{\"bold\":true,\"size\":10,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"bold\":true,\"size\":10,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"font\":{\"bold\":true,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"bold\":true,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"bottom\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"bottom\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"bottom\":[\"medium\",\"#000\"],\"right\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\",\"size\":8},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"Microsoft YaHei\",\"size\":8}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\",\"size\":9},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\",\"size\":8}},{\"border\":{\"top\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true,\"name\":\"宋体\"},\"border\":{\"top\":[\"medium\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true,\"name\":\"宋体\"}},{\"border\":{\"left\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":8},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":10,\"bold\":true},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"宋体\",\"size\":10,\"bold\":true},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"宋体\",\"size\":10,\"bold\":true}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"bold\":true},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"bold\":true}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"bold\":true},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"宋体\",\"bold\":true}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true,\"name\":\"宋体\"},\"border\":{\"top\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"left\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true,\"name\":\"宋体\"},\"border\":{\"top\":[\"thin\",\"#ffffff\"]}},{\"border\":{\"top\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"left\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"right\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"left\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"left\",\"font\":{\"name\":\"宋体\"}},{\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"name\":\"宋体\",\"bold\":true},\"align\":\"right\"},{\"font\":{\"name\":\"宋体\",\"bold\":true},\"align\":\"right\",\"valign\":\"bottom\"},{\"font\":{\"name\":\"宋体\",\"bold\":true},\"align\":\"left\",\"valign\":\"bottom\"},{\"font\":{\"name\":\"宋体\",\"bold\":true},\"valign\":\"bottom\"},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"name\":\"宋体\",\"size\":10,\"bold\":true},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"bold\":true},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"format\":\"datetime\"},{\"font\":{\"name\":\"宋体\",\"size\":10},\"format\":\"datetime\"},{\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"format\":\"normal\"},{\"font\":{\"name\":\"宋体\",\"size\":10},\"format\":\"normal\"}],\"validations\":[],\"cols\":{\"0\":{\"width\":73},\"1\":{\"width\":71},\"2\":{\"width\":69},\"3\":{\"width\":89},\"4\":{\"width\":64},\"5\":{\"width\":47},\"6\":{\"width\":68},\"7\":{\"width\":100},\"8\":{\"width\":103},\"9\":{\"width\":19},\"10\":{\"width\":146},\"11\":{\"width\":85},\"len\":50},\"merges\":[\"H3:I3\",\"B3:D3\",\"A2:I2\",\"D6:F6\",\"D7:F7\",\"A8:B8\",\"G8:H8\",\"A9:B9\",\"A10:B10\",\"C10:E10\",\"C8:E8\",\"C9:E9\",\"A11:B11\",\"C11:E11\",\"F11:G11\",\"H11:I11\",\"C12:I14\",\"A15:B15\",\"C15:E15\",\"F15:G15\",\"H15:I15\",\"A16:B16\",\"A17:B17\",\"A18:B18\",\"C17:I17\",\"C18:I18\",\"A20:E20\",\"A21:B21\",\"C21:D21\",\"E21:F21\",\"G21:H21\",\"A22:B22\",\"A24:E24\",\"A25:B25\",\"C25:D25\",\"G25:H25\",\"A26:B26\",\"A28:E28\",\"A29:B29\",\"C29:D29\",\"A30:B30\",\"A32:B32\",\"A33:B33\",\"C33:D33\",\"A34:B34\",\"C34:D34\",\"A36:C36\",\"C16:D16\",\"F16:G16\",\"QAAAAAACI1:JAAAAAABJ38\",\"A1:I1\",\"H4:I4\",\"G9:I9\",\"G22:H22\",\"E22:F22\",\"C22:D22\",\"C26:D26\",\"G26:H26\",\"C30:D30\",\"G30:H30\",\"E30:F30\",\"D37:F37\",\"D38:F38\",\"A38:C38\",\"A37:C37\",\"G37:I37\",\"G38:I38\",\"E29:F29\",\"G29:H29\",\"E25:F25\",\"E26:F26\",\"F33:G33\",\"F34:G34\",\"A12:B14\",\"I5:I8\"],\"imgList\":[{\"row\":4,\"col\":8,\"width\":\"101\",\"height\":\"128\",\"src\":\"https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/images/QQ截图20210115102648_1610694177544_1617244906979.png\",\"layer_id\":\"cvkWDQVZhfJPgcS4\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[4,8]]}]}', NULL, 'https://static.jeecg.com/designreport/images/1122_1607312336469.png', 'admin', '2021-07-13 10:29:32', 'admin', '2021-07-13 10:29:43', 1, NULL, NULL, 0, 0, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('574875722233016320', '202101081046035167', '实习证明副本5167', NULL, NULL, 'printinfo', '{\"loopBlockList\":[],\"area\":{\"sri\":16,\"sci\":5,\"eri\":16,\"eci\":5,\"width\":147,\"height\":25},\"excel_config_id\":\"1347373863746539520\",\"printConfig\":{\"paper\":\"A4\",\"width\":210,\"height\":297,\"definition\":1,\"isBackend\":false,\"marginX\":10,\"marginY\":10,\"layout\":\"portrait\"},\"rows\":{\"0\":{\"cells\":{\"0\":{\"text\":\"\"},\"1\":{\"text\":\"\"}}},\"1\":{\"cells\":{\"0\":{\"text\":\"\"}}},\"3\":{\"cells\":{\"2\":{\"text\":\"\",\"rendered\":\"\"}}},\"5\":{\"cells\":{},\"height\":29},\"6\":{\"cells\":{\"2\":{\"text\":\"\",\"style\":2}},\"height\":34},\"7\":{\"cells\":{\"2\":{\"merge\":[0,4],\"text\":\"实习证明\",\"style\":2}},\"height\":41},\"8\":{\"cells\":{\"1\":{\"text\":\"\",\"style\":3},\"2\":{\"text\":\"\"}}},\"9\":{\"cells\":{\"1\":{\"text\":\"\",\"style\":3},\"2\":{\"text\":\"\",\"style\":3},\"3\":{\"text\":\"\"}},\"isDrag\":true,\"height\":33},\"10\":{\"cells\":{\"2\":{\"text\":\"${tt.name}\",\"style\":11},\"3\":{\"text\":\"同学在我公司与 2020年4月1日 至 2020年5月1日 实习。\",\"style\":19,\"merge\":[0,3],\"height\":34}},\"height\":34},\"11\":{\"cells\":{},\"height\":28},\"12\":{\"cells\":{\"1\":{\"text\":\"\",\"style\":6},\"2\":{\"style\":13,\"text\":\"${tt.pingjia}\",\"merge\":[3,4],\"height\":129}},\"height\":36},\"13\":{\"cells\":{},\"height\":29},\"14\":{\"cells\":{},\"height\":33},\"15\":{\"cells\":{},\"height\":31},\"16\":{\"cells\":{}},\"17\":{\"cells\":{\"1\":{\"text\":\"\"},\"2\":{\"text\":\"特此证明!\",\"style\":12}}},\"20\":{\"cells\":{\"2\":{\"text\":\"\"},\"3\":{\"text\":\"\",\"style\":3},\"4\":{\"text\":\"\"}}},\"21\":{\"cells\":{\"4\":{\"text\":\"\"}}},\"22\":{\"cells\":{\"3\":{\"text\":\"\",\"style\":3},\"4\":{\"text\":\"证明人:\",\"style\":11},\"5\":{\"text\":\"${tt.lingdao}\",\"style\":12}}},\"23\":{\"cells\":{\"4\":{\"text\":\"\"},\"5\":{\"text\":\"${tt.shijian}\",\"style\":15}}},\"len\":100},\"dbexps\":[],\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":576,\"displayConfig\":{},\"background\":{\"path\":\"https://static.jeecg.com/designreport/images/11_1611283832037.png\",\"repeat\":\"no-repeat\",\"width\":\"\",\"height\":\"\"},\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":14}},{\"align\":\"center\",\"font\":{\"size\":16}},{\"align\":\"right\"},{\"align\":\"left\"},{\"align\":\"left\",\"valign\":\"top\"},{\"align\":\"left\",\"valign\":\"top\",\"textwrap\":true},{\"font\":{\"size\":16}},{\"align\":\"left\",\"valign\":\"top\",\"textwrap\":false},{\"textwrap\":false},{\"textwrap\":true},{\"align\":\"right\",\"font\":{\"size\":12}},{\"font\":{\"size\":12}},{\"align\":\"left\",\"valign\":\"top\",\"textwrap\":true,\"font\":{\"size\":12}},{\"textwrap\":true,\"font\":{\"size\":12}},{\"align\":\"left\",\"font\":{\"size\":12}},{\"font\":{\"size\":12},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":14}},{\"font\":{\"size\":10}},{\"textwrap\":false,\"font\":{\"size\":12}}],\"validations\":[],\"cols\":{\"0\":{\"width\":69},\"1\":{\"width\":41},\"4\":{\"width\":119},\"5\":{\"width\":147},\"6\":{\"width\":31},\"len\":50},\"merges\":[\"C8:G8\",\"D11:G11\",\"C13:G16\"]}', NULL, 'https://static.jeecg.com/designreport/images/未标题-1_1610074948259.png', 'admin', '2021-07-13 10:37:43', 'admin', '2021-07-13 10:37:54', 1, NULL, NULL, 0, 0, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('574875730525155328', '202010101632526669', 'XXX有限公司员工登记表副本6669', NULL, NULL, 'printinfo', '{\"loopBlockList\":[],\"area\":{\"sri\":10,\"sci\":11,\"eri\":10,\"eci\":11,\"width\":85,\"height\":38},\"excel_config_id\":\"1314846205892759552\",\"printConfig\":{\"paper\":\"A4\",\"width\":210,\"height\":297,\"definition\":1,\"isBackend\":false,\"marginX\":10,\"marginY\":10},\"rows\":{\"0\":{\"cells\":{\"0\":{\"merge\":[0,8]},\"9\":{}},\"height\":22},\"1\":{\"cells\":{\"1\":{\"style\":87,\"text\":\" \"},\"2\":{\"style\":87,\"text\":\" \"},\"3\":{\"style\":87,\"text\":\" \"},\"4\":{\"style\":87,\"text\":\" \"},\"5\":{\"style\":87,\"text\":\" \"},\"6\":{\"style\":87,\"text\":\" \"},\"7\":{\"style\":87,\"text\":\" \"},\"8\":{\"style\":87,\"text\":\" \"}},\"height\":24},\"2\":{\"cells\":{\"0\":{\"text\":\"所在部门\",\"style\":93},\"1\":{\"text\":\"${yuangongjiben.department}\",\"style\":23,\"merge\":[0,2]},\"4\":{\"text\":\"职务\",\"style\":93},\"5\":{\"text\":\"${yuangongjiben.post}\",\"style\":23},\"6\":{\"text\":\"填写日期\",\"style\":93},\"7\":{\"text\":\"${yuangongjiben.data}\",\"style\":23,\"merge\":[0,1]}},\"isDrag\":true,\"height\":36},\"3\":{\"cells\":{\"0\":{\"text\":\"姓名\",\"style\":93},\"1\":{\"text\":\"${yuangongjiben.name}\",\"style\":23},\"2\":{\"text\":\"性别\",\"style\":93},\"3\":{\"text\":\"${yuangongjiben.sex}\",\"style\":23},\"4\":{\"text\":\"出生日期\",\"style\":93},\"5\":{\"text\":\"${yuangongjiben.birth}\",\"style\":23},\"6\":{\"text\":\"政治面貌\",\"style\":93},\"7\":{\"text\":\"${yuangongjiben.political}\",\"style\":130,\"merge\":[0,1]}},\"isDrag\":true,\"height\":33},\"4\":{\"cells\":{\"0\":{\"text\":\"机关\",\"style\":93},\"1\":{\"text\":\"${yuangongjiben.office}\",\"style\":23},\"2\":{\"style\":93,\"text\":\"民族\"},\"3\":{\"text\":\"${yuangongjiben.nation}\",\"style\":23},\"4\":{\"style\":93,\"text\":\"健康状况\"},\"5\":{\"text\":\"${yuangongjiben.health}\",\"style\":23},\"6\":{\"style\":93,\"text\":\"户籍类型\",\"virtual\":\"1KT8bnqRT4bi8Z7b\"},\"7\":{\"text\":\"${yuangongjiben.register}\",\"style\":26,\"virtual\":\"1KT8bnqRT4bi8Z7b\"},\"8\":{\"merge\":[3,0],\"height\":104,\"style\":35,\"text\":\" \",\"virtual\":\"cvkWDQVZhfJPgcS4\"}},\"isDrag\":true,\"height\":31},\"5\":{\"cells\":{\"0\":{\"text\":\"最高学历\",\"style\":93},\"1\":{\"text\":\"${yuangongjiben.education}\",\"style\":23},\"2\":{\"text\":\"所学专业\",\"style\":93},\"3\":{\"text\":\"${yuangongjiben.major}\",\"style\":23,\"merge\":[0,2]},\"6\":{\"text\":\"毕业时间\",\"style\":93},\"7\":{\"text\":\"${yuangongjiben.gdata}\",\"style\":23}},\"isDrag\":true,\"height\":35},\"6\":{\"cells\":{\"0\":{\"text\":\"电子邮箱\",\"style\":93},\"1\":{\"text\":\"${yuangongjiben.mailbox}\",\"style\":23},\"2\":{\"text\":\"手机号\",\"style\":93},\"3\":{\"text\":\"${yuangongjiben.telphone}\",\"style\":23,\"merge\":[0,2]},\"6\":{\"text\":\"家庭电话\",\"style\":93},\"7\":{\"text\":\"${yuangongjiben.homephone}\",\"style\":23}},\"isDrag\":true,\"height\":38},\"7\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"第一次参加工作时间\",\"style\":93},\"2\":{\"text\":\"${yuangongjiben.pworktime}\",\"style\":133,\"merge\":[0,2]},\"5\":{\"style\":93,\"text\":\"入职时间\"},\"6\":{\"text\":\"${yuangongjiben.entrytime}\",\"style\":24,\"merge\":[0,1]}},\"isDrag\":true,\"height\":27},\"8\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"毕业院校\",\"style\":93},\"2\":{\"text\":\"${yuangongjiben.school}\",\"style\":24,\"merge\":[0,2]},\"5\":{\"style\":93,\"text\":\"身份证号\"},\"6\":{\"text\":\"${yuangongjiben.idcard}\",\"style\":24,\"merge\":[0,2]}},\"isDrag\":true,\"height\":34},\"9\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"入党(团)时间、地点\",\"style\":94},\"2\":{\"text\":\"${yuangongjiben.entrytime}\",\"style\":24,\"merge\":[0,2]},\"5\":{\"text\":\"婚姻状况\",\"style\":93},\"6\":{\"text\":\"${yuangongjiben.marital}\",\"style\":23},\"7\":{\"text\":\"有无子女\",\"style\":93},\"8\":{\"text\":\"${yuangongjiben.children}\",\"style\":23}},\"isDrag\":true,\"height\":33},\"10\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"户口所在街道名称\",\"style\":93},\"2\":{\"text\":\"${yuangongjiben.hukoustreet}\",\"style\":24,\"merge\":[0,2]},\"5\":{\"merge\":[0,1],\"text\":\"户口所在地邮编\",\"style\":93},\"7\":{\"text\":\"${yuangongjiben.hukounum}\",\"style\":23,\"merge\":[0,1]}},\"isDrag\":true,\"height\":38},\"11\":{\"cells\":{\"0\":{\"text\":\"户口所在地地址\",\"style\":96,\"merge\":[2,1]},\"2\":{\"text\":\"${yuangongjiben.hukoudi}\",\"style\":26,\"merge\":[2,6]}},\"isDrag\":true},\"12\":{\"cells\":{}},\"13\":{\"cells\":{\"11\":{\"text\":\"\"}},\"isDrag\":true},\"14\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"现居住地址\",\"style\":98},\"2\":{\"text\":\"${yuangongjiben.currentdi}\",\"style\":26,\"merge\":[0,2]},\"5\":{\"style\":98,\"merge\":[0,1],\"text\":\"现居住地址邮编\"},\"7\":{\"text\":\"${yuangongjiben.currentnum}\",\"style\":26,\"merge\":[0,1]}},\"isDrag\":true,\"height\":33},\"15\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"是否参加社保\",\"style\":98},\"2\":{\"text\":\"${yuangongjiben.socialsecurity}\",\"style\":27,\"merge\":[0,1]},\"4\":{\"text\":\"有无公积金\",\"style\":98},\"5\":{\"text\":\"${yuangongjiben.providentfund}\",\"style\":27,\"merge\":[0,1]},\"7\":{\"text\":\"兴趣爱好\",\"style\":98},\"8\":{\"text\":\"${yuangongjiben.hobby}\",\"style\":27}},\"isDrag\":true,\"height\":34},\"16\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"参加社保类型\",\"style\":98},\"2\":{\"text\":\"${yuangongjiben.sbtype}\",\"style\":116,\"merge\":[0,6]}},\"isDrag\":true,\"height\":30},\"17\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"个人档案存放地\",\"style\":98},\"2\":{\"text\":\"${yuangongjiben.archivesdi}\",\"style\":116,\"merge\":[0,6]}},\"isDrag\":true,\"height\":33},\"18\":{\"cells\":{\"0\":{\"text\":\" \",\"style\":7},\"1\":{\"text\":\" \",\"style\":7},\"2\":{\"text\":\" \",\"style\":7},\"3\":{\"text\":\" \",\"style\":7},\"4\":{\"text\":\" \",\"style\":7},\"5\":{\"text\":\" \",\"style\":7},\"6\":{\"text\":\" \",\"style\":7},\"7\":{\"text\":\" \",\"style\":7},\"8\":{\"text\":\" \",\"style\":7}}},\"19\":{\"cells\":{\"0\":{\"merge\":[0,4],\"text\":\"学历、经历(从高中开始写)\",\"style\":99},\"5\":{\"style\":7,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":112,\"text\":\" \"}}},\"20\":{\"cells\":{\"0\":{\"text\":\"由_年_月\",\"merge\":[0,1],\"style\":36},\"2\":{\"merge\":[0,1],\"text\":\"至_年_月\",\"style\":38},\"4\":{\"merge\":[0,1],\"text\":\"就读学校\",\"style\":38},\"6\":{\"merge\":[0,1],\"text\":\"专业\",\"style\":38},\"8\":{\"text\":\"担任职务\",\"style\":38},\"9\":{\"style\":112,\"text\":\" \"}}},\"21\":{\"cells\":{\"0\":{\"style\":90,\"merge\":[0,1],\"text\":\"#{xueli.kdate}\"},\"2\":{\"style\":90,\"text\":\"#{xueli.jdate}\",\"merge\":[0,1]},\"4\":{\"style\":90,\"text\":\"#{xueli.jstudent}\",\"merge\":[0,1]},\"6\":{\"style\":90,\"text\":\"#{xueli.zhuanye}\",\"merge\":[0,1]},\"8\":{\"style\":90,\"text\":\"#{xueli.zhiwu}\"},\"9\":{\"style\":112,\"text\":\" \"}},\"isDrag\":true},\"22\":{\"cells\":{\"0\":{\"style\":7,\"text\":\" \"},\"1\":{\"style\":7,\"text\":\" \"},\"2\":{\"style\":7,\"text\":\" \"},\"3\":{\"style\":7,\"text\":\" \"},\"4\":{\"style\":7,\"text\":\" \"},\"5\":{\"style\":7,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":112,\"text\":\" \"}}},\"23\":{\"cells\":{\"0\":{\"merge\":[0,4],\"text\":\"工作经历\",\"style\":124},\"5\":{\"style\":7,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":112,\"text\":\" \"}},\"height\":27},\"24\":{\"cells\":{\"0\":{\"text\":\"由_年_月\",\"merge\":[0,1],\"style\":36},\"2\":{\"merge\":[0,1],\"text\":\"至_年_月\",\"style\":38},\"4\":{\"text\":\"工作单位及职称\",\"style\":38,\"merge\":[0,1]},\"6\":{\"merge\":[0,1],\"text\":\"证明人\",\"style\":38},\"8\":{\"text\":\"联系方式\",\"style\":38},\"9\":{\"style\":112,\"text\":\" \"}}},\"25\":{\"cells\":{\"0\":{\"text\":\"#{uu.kdate}\",\"style\":90,\"merge\":[0,1]},\"2\":{\"text\":\"#{uu.jdate}\",\"style\":90,\"merge\":[0,1]},\"4\":{\"text\":\"#{uu.jstudent}\",\"style\":90,\"merge\":[0,1]},\"6\":{\"text\":\"#{uu.zmname}\",\"style\":90,\"merge\":[0,1]},\"8\":{\"text\":\"#{uu.zmphone}\",\"style\":90},\"9\":{\"style\":112,\"text\":\" \"}},\"isDrag\":true},\"26\":{\"cells\":{\"0\":{\"style\":7,\"text\":\" \"},\"1\":{\"style\":7,\"text\":\" \"},\"2\":{\"style\":7,\"text\":\" \"},\"3\":{\"style\":7,\"text\":\" \"},\"4\":{\"style\":7,\"text\":\" \"},\"5\":{\"style\":7,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":112,\"text\":\" \"}}},\"27\":{\"cells\":{\"0\":{\"merge\":[0,4],\"text\":\"职称/资格、证书\",\"style\":125},\"5\":{\"style\":7,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":112,\"text\":\" \"}},\"height\":46},\"28\":{\"cells\":{\"0\":{\"text\":\"发证时间\",\"merge\":[0,1],\"style\":36},\"2\":{\"merge\":[0,1],\"text\":\"职称名称\",\"style\":38},\"4\":{\"text\":\"级别\",\"style\":38,\"merge\":[0,1]},\"6\":{\"text\":\"发证单位\",\"style\":38,\"merge\":[0,1]},\"8\":{\"text\":\"备注\",\"style\":38},\"9\":{\"style\":112,\"text\":\" \"}}},\"29\":{\"cells\":{\"0\":{\"text\":\"#{zhengshu.fdate}\",\"style\":90,\"merge\":[0,1]},\"2\":{\"text\":\"#{zhengshu.zcname}\",\"style\":90,\"merge\":[0,1]},\"4\":{\"text\":\"#{zhengshu.jibie}\",\"style\":90,\"merge\":[0,1]},\"6\":{\"text\":\"#{zhengshu.danwei}\",\"style\":90,\"merge\":[0,1]},\"8\":{\"text\":\"#{zhengshu.beizhu}\",\"style\":90},\"9\":{\"style\":112,\"text\":\" \"}},\"isDrag\":true},\"30\":{\"cells\":{\"0\":{\"style\":7,\"text\":\" \"},\"1\":{\"style\":7,\"text\":\" \"},\"2\":{\"style\":7,\"text\":\" \"},\"3\":{\"style\":7,\"text\":\" \"},\"4\":{\"style\":7,\"text\":\" \"},\"5\":{\"style\":7,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":112,\"text\":\" \"}}},\"31\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"家庭成员\",\"style\":125},\"2\":{\"style\":7,\"text\":\" \"},\"3\":{\"style\":7,\"text\":\" \"},\"4\":{\"style\":7,\"text\":\" \"},\"5\":{\"style\":7,\"text\":\" \"},\"6\":{\"style\":7,\"text\":\" \"},\"7\":{\"style\":7,\"text\":\" \"},\"8\":{\"style\":7,\"text\":\" \"},\"9\":{\"style\":112,\"text\":\" \"}},\"height\":42},\"32\":{\"cells\":{\"0\":{\"merge\":[0,1],\"text\":\"姓名\",\"style\":38},\"2\":{\"merge\":[0,1],\"text\":\"关系\",\"style\":38},\"4\":{\"text\":\"年龄\",\"style\":38},\"5\":{\"text\":\"工作单位\",\"style\":38,\"merge\":[0,1]},\"7\":{\"text\":\"政治面貌\",\"style\":38},\"8\":{\"text\":\"联系方式\",\"style\":38},\"9\":{\"style\":112,\"text\":\" \"}}},\"33\":{\"cells\":{\"0\":{\"text\":\"#{jtcy.name}\",\"style\":90,\"merge\":[0,1]},\"2\":{\"text\":\"#{jtcy.guanxi}\",\"style\":90,\"merge\":[0,1]},\"4\":{\"text\":\"#{jtcy.age}\",\"style\":90},\"5\":{\"text\":\"#{jtcy.danwei}\",\"style\":90,\"merge\":[0,1]},\"7\":{\"text\":\"#{jtcy.zzmm}\",\"style\":90},\"8\":{\"text\":\"#{jtcy.phone}\",\"style\":90},\"9\":{\"style\":112,\"text\":\" \"}},\"isDrag\":true},\"34\":{\"cells\":{\"0\":{\"text\":\" \",\"style\":7},\"1\":{\"text\":\" \",\"style\":7},\"2\":{\"text\":\" \",\"style\":7},\"3\":{\"text\":\" \",\"style\":7},\"4\":{\"text\":\" \",\"style\":7},\"5\":{\"text\":\" \",\"style\":7},\"6\":{\"text\":\" \",\"style\":7},\"7\":{\"text\":\" \",\"style\":7},\"8\":{\"text\":\" \",\"style\":7},\"9\":{\"style\":112,\"text\":\" \"}}},\"35\":{\"cells\":{\"0\":{\"merge\":[0,2],\"text\":\"所获奖励\",\"style\":125},\"3\":{\"text\":\" \",\"style\":7},\"4\":{\"text\":\" \",\"style\":7},\"5\":{\"text\":\" \",\"style\":7},\"6\":{\"text\":\" \",\"style\":7},\"7\":{\"text\":\" \",\"style\":7},\"8\":{\"text\":\" \",\"style\":7},\"9\":{\"style\":112,\"text\":\" \"}},\"height\":47},\"36\":{\"cells\":{\"0\":{\"text\":\"时间\",\"style\":90,\"merge\":[0,2]},\"3\":{\"style\":90,\"text\":\"地点\",\"merge\":[0,2]},\"6\":{\"style\":90,\"text\":\"所获得的奖励名称\",\"merge\":[0,2]},\"9\":{\"style\":112,\"text\":\" \"}}},\"37\":{\"cells\":{\"0\":{\"text\":\"#{jiangli.date}\",\"style\":90,\"merge\":[0,2]},\"3\":{\"text\":\"#{jiangli.didian}\",\"style\":90,\"merge\":[0,2]},\"6\":{\"text\":\"#{jiangli.mingcheng}\",\"style\":90,\"merge\":[0,2]},\"9\":{\"style\":112,\"text\":\" \"}},\"isDrag\":true},\"len\":98},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":718,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":703,\"displayConfig\":{},\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":16}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true}},{\"align\":\"center\",\"font\":{\"name\":\"仿宋\"}},{\"font\":{\"name\":\"仿宋\"}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":12}},{\"font\":{\"name\":\"宋体\",\"size\":12}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":8}},{\"font\":{\"name\":\"宋体\",\"size\":8}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":10}},{\"font\":{\"name\":\"宋体\",\"size\":10}},{\"align\":\"center\",\"font\":{\"name\":\"隶书\",\"size\":10}},{\"font\":{\"name\":\"隶书\",\"size\":10}},{\"align\":\"center\",\"font\":{\"name\":\"华文中宋\",\"size\":10}},{\"font\":{\"name\":\"华文中宋\",\"size\":10}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\",\"size\":10}},{\"font\":{\"name\":\"Microsoft YaHei\",\"size\":10}},{\"textwrap\":true},{\"textwrap\":true,\"align\":\"center\"},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"bold\":true}},{\"font\":{\"bold\":true,\"size\":12}},{\"font\":{\"bold\":true,\"size\":10}},{\"font\":{\"bold\":true,\"size\":10},\"align\":\"center\"},{\"font\":{\"bold\":true},\"align\":\"center\"},{\"font\":{\"bold\":true,\"size\":10},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"bold\":true},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"bold\":true,\"size\":10,\"name\":\"宋体\"},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"bold\":true,\"size\":10,\"name\":\"宋体\"},\"align\":\"center\"},{\"font\":{\"bold\":true,\"name\":\"宋体\"},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"bold\":true,\"name\":\"宋体\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true},\"border\":{\"top\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true},\"border\":{\"top\":[\"medium\",\"#000\"]}},{\"border\":{\"top\":[\"medium\",\"#000\"],\"right\":[\"medium\",\"#000\"]}},{\"border\":{\"left\":[\"medium\",\"#000\"]}},{\"border\":{\"right\":[\"medium\",\"#000\"]}},{\"border\":{\"bottom\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"]}},{\"border\":{\"bottom\":[\"medium\",\"#000\"]}},{\"border\":{\"bottom\":[\"medium\",\"#000\"],\"right\":[\"medium\",\"#000\"]}},{\"border\":{\"top\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true,\"name\":\"Microsoft YaHei\"},\"border\":{\"top\":[\"medium\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true,\"name\":\"Microsoft YaHei\"}},{\"border\":{\"top\":[\"medium\",\"#000\"],\"right\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"left\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"right\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"font\":{\"name\":\"Microsoft YaHei\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"Microsoft YaHei\"}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\"}},{\"font\":{\"name\":\"Microsoft YaHei\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\"}},{\"font\":{\"bold\":true,\"size\":10,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"bold\":true,\"size\":10,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"font\":{\"bold\":true,\"name\":\"Microsoft YaHei\"},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"bold\":true,\"name\":\"Microsoft YaHei\"},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"bottom\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"bottom\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"bottom\":[\"medium\",\"#000\"],\"right\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\",\"size\":8},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"Microsoft YaHei\",\"size\":8}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\",\"size\":9},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\",\"size\":8}},{\"border\":{\"top\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true,\"name\":\"宋体\"},\"border\":{\"top\":[\"medium\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true,\"name\":\"宋体\"}},{\"border\":{\"left\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":8},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"medium\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":10,\"bold\":true},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"宋体\",\"size\":10,\"bold\":true},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"宋体\",\"size\":10,\"bold\":true}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"bold\":true},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"bold\":true}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"bold\":true},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"宋体\",\"bold\":true}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true,\"name\":\"宋体\"},\"border\":{\"top\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"left\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true,\"name\":\"宋体\"},\"border\":{\"top\":[\"thin\",\"#ffffff\"]}},{\"border\":{\"top\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"left\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"right\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"left\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"left\",\"font\":{\"name\":\"宋体\"}},{\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"name\":\"宋体\",\"bold\":true},\"align\":\"right\"},{\"font\":{\"name\":\"宋体\",\"bold\":true},\"align\":\"right\",\"valign\":\"bottom\"},{\"font\":{\"name\":\"宋体\",\"bold\":true},\"align\":\"left\",\"valign\":\"bottom\"},{\"font\":{\"name\":\"宋体\",\"bold\":true},\"valign\":\"bottom\"},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"name\":\"宋体\",\"size\":10,\"bold\":true},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"bold\":true},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"format\":\"datetime\"},{\"font\":{\"name\":\"宋体\",\"size\":10},\"format\":\"datetime\"},{\"font\":{\"name\":\"宋体\",\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"format\":\"normal\"},{\"font\":{\"name\":\"宋体\",\"size\":10},\"format\":\"normal\"}],\"validations\":[],\"cols\":{\"0\":{\"width\":73},\"1\":{\"width\":71},\"2\":{\"width\":69},\"3\":{\"width\":89},\"4\":{\"width\":64},\"5\":{\"width\":47},\"6\":{\"width\":68},\"7\":{\"width\":100},\"8\":{\"width\":103},\"9\":{\"width\":19},\"10\":{\"width\":146},\"11\":{\"width\":85},\"len\":50},\"merges\":[\"H3:I3\",\"B3:D3\",\"A2:I2\",\"D6:F6\",\"D7:F7\",\"A8:B8\",\"G8:H8\",\"A9:B9\",\"A10:B10\",\"C10:E10\",\"C8:E8\",\"C9:E9\",\"A11:B11\",\"C11:E11\",\"F11:G11\",\"H11:I11\",\"C12:I14\",\"A15:B15\",\"C15:E15\",\"F15:G15\",\"H15:I15\",\"A16:B16\",\"A17:B17\",\"A18:B18\",\"C17:I17\",\"C18:I18\",\"A20:E20\",\"A21:B21\",\"C21:D21\",\"E21:F21\",\"G21:H21\",\"A22:B22\",\"A24:E24\",\"A25:B25\",\"C25:D25\",\"G25:H25\",\"A26:B26\",\"A28:E28\",\"A29:B29\",\"C29:D29\",\"A30:B30\",\"A32:B32\",\"A33:B33\",\"C33:D33\",\"A34:B34\",\"C34:D34\",\"A36:C36\",\"C16:D16\",\"F16:G16\",\"QAAAAAACI1:JAAAAAABJ38\",\"A1:I1\",\"H4:I4\",\"G9:I9\",\"G22:H22\",\"E22:F22\",\"C22:D22\",\"C26:D26\",\"G26:H26\",\"C30:D30\",\"G30:H30\",\"E30:F30\",\"D37:F37\",\"D38:F38\",\"A38:C38\",\"A37:C37\",\"G37:I37\",\"G38:I38\",\"E29:F29\",\"G29:H29\",\"E25:F25\",\"E26:F26\",\"F33:G33\",\"F34:G34\",\"A12:B14\",\"I5:I8\"],\"imgList\":[{\"row\":4,\"col\":8,\"width\":\"101\",\"height\":\"128\",\"src\":\"https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/images/QQ截图20210115102648_1610694177544_1617244906979.png\",\"layer_id\":\"cvkWDQVZhfJPgcS4\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[4,8]]}]}', NULL, 'https://static.jeecg.com/designreport/images/1122_1607312336469.png', 'admin', '2021-07-13 10:37:45', 'admin', '2021-07-13 10:37:49', 1, NULL, NULL, 0, 0, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('575163965000249344', '20210714134509', 'ddd', NULL, NULL, 'chartinfo', '{\"loopBlockList\":[],\"chartList\":[{\"row\":-1,\"col\":6,\"colspan\":7,\"rowspan\":14,\"width\":\"650\",\"height\":\"350\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type \\\":\\\"value\\\"},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":0,\\\"interval\\\":\\\"auto\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"data\\\":[\\\"周一\\\",\\\"周二\\\",\\\"周三\\\",\\\"周四\\\",\\\"周五\\\",\\\"周六\\\",\\\"周日\\\"],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"type\\\":\\\"category\\\"},\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"直接访问\\\",\\\"邮件营销\\\",\\\"联盟广告\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"grid\\\":{\\\"top\\\":60,\\\"left\\\":60,\\\"bottom\\\":60,\\\"right\\\":60},\\\"series\\\":[{\\\"barWidth\\\":0,\\\"data\\\":[320,332,301,334,390,330,320],\\\"name\\\":\\\"直接访问\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"\\\",\\\"barBorderRadius\\\":0},\\\"label\\\":{\\\"show\\\":true,\\\"position\\\":\\\"top\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":2},{\\\"barWidth\\\":0,\\\"data\\\":[120,132,101,134,90,230,210],\\\"name\\\":\\\"邮件营销\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"\\\",\\\"barBorderRadius\\\":0},\\\"label\\\":{\\\"show\\\":true,\\\"position\\\":\\\"top\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":2},{\\\"barWidth\\\":0,\\\"data\\\":[220,182,191,234,290,330,310],\\\"name\\\":\\\"联盟广告\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"\\\",\\\"barBorderRadius\\\":0},\\\"label\\\":{\\\"show\\\":true,\\\"position\\\":\\\"top\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":2}],\\\"tooltip\\\":{\\\"show\\\":true,\\\"axisPointer\\\":{\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":18}},\\\"title\\\":{\\\"padding\\\":[5,20,5,20],\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"某站点用户访问来源\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#c23531\\\",\\\"fontSize\\\":18,\\\"fontWeight\\\":\\\"bolder\\\"}}}\",\"url\":\"\",\"extData\":{\"chartId\":\"bar.multi\",\"chartType\":\"bar.multi\"},\"layer_id\":\"x5jNAjrL8TFhuTEo\",\"offsetX\":0,\"offsetY\":0,\"backgroud\":{\"enabled\":false,\"color\":\"#fff\",\"image\":\"\"},\"virtualCellRange\":[[-1,6],[-1,7],[-1,8],[-1,9],[-1,10],[-1,11],[-1,12]]},{\"row\":0,\"col\":0,\"colspan\":6,\"rowspan\":14,\"width\":\"570\",\"height\":\"340\",\"config\":\"{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#EFEDED\\\",\\\"fontSize\\\":12}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FBF4F4\\\"}},\\\"show\\\":true,\\\"name\\\":\\\"销量\\\",\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false}},\\\"xAxis\\\":{\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"red\\\",\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"show\\\":false},\\\"axisLabel\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFAFA\\\",\\\"fontSize\\\":12},\\\"rotate\\\":0,\\\"interval\\\":\\\"auto\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FCFCFC\\\"}},\\\"data\\\":[\\\"衬衫\\\",\\\"羊毛衫\\\",\\\"雪纺衫\\\",\\\"裤子\\\",\\\"高跟鞋\\\",\\\"袜子\\\"],\\\"show\\\":true,\\\"name\\\":\\\"服饰\\\"},\\\"grid\\\":{\\\"top\\\":60,\\\"left\\\":60,\\\"bottom\\\":60,\\\"right\\\":60},\\\"series\\\":[{\\\"barWidth\\\":50,\\\"data\\\":[5,20,36,10,10,20],\\\"name\\\":\\\"销量\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#c43632\\\",\\\"barBorderRadius\\\":0},\\\"label\\\":{\\\"show\\\":true,\\\"position\\\":\\\"top\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"black\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"bar\\\",\\\"barMinHeight\\\":2}],\\\"tooltip\\\":{\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":18}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":\\\"5\\\",\\\"text\\\":\\\"某站点用户访问来源\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FCF6F6\\\",\\\"fontWeight\\\":\\\"bolder\\\",\\\"fontSize\\\":18},\\\"left\\\":\\\"left\\\",\\\"padding\\\":[5,20,5,20]}}\",\"url\":\"\",\"extData\":{\"chartId\":\"bar.simple\",\"chartType\":\"bar.simple\"},\"layer_id\":\"WPLlLTIi2vHV8ikB\",\"offsetX\":0,\"offsetY\":0,\"backgroud\":{\"enabled\":false,\"color\":\"#fff\",\"image\":\"\"},\"virtualCellRange\":[[0,0],[0,1],[0,2],[0,3],[0,4],[0,5]]},{\"row\":14,\"col\":-1,\"colspan\":7,\"rowspan\":14,\"width\":\"647\",\"height\":\"349\",\"config\":\"{\\\"radar\\\":[{\\\"indicator\\\":[{\\\"max\\\":6500,\\\"name\\\":\\\"指标一\\\"},{\\\"max\\\":6500,\\\"name\\\":\\\"指标二\\\"},{\\\"max\\\":6500,\\\"name\\\":\\\"指标三\\\"},{\\\"max\\\":6500,\\\"name\\\":\\\"指标四\\\"},{\\\"max\\\":6500,\\\"name\\\":\\\"指标五\\\"}],\\\"startAngle\\\":90,\\\"shape\\\":\\\"circle\\\",\\\"splitArea\\\":{\\\"areaStyle\\\":{\\\"color\\\":[\\\"rgba(114, 172, 209, 0.2)\\\",\\\"rgba(114, 172, 209, 0.4)\\\",\\\"rgba(114, 172, 209, 0.6)\\\",\\\"rgba(114, 172, 209, 0.8)\\\",\\\"rgba(114, 172, 209, 1)\\\"],\\\"shadowBlur\\\":10,\\\"shadowColor\\\":\\\"rgba(0, 0, 0, 0.3)\\\"}},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"gray\\\",\\\"opacity\\\":0.5}},\\\"center\\\":[320,200],\\\"name\\\":{\\\"formatter\\\":\\\"【{value}】\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#72ACD1\\\"}},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"gray\\\",\\\"opacity\\\":0.5}},\\\"splitNumber\\\":4,\\\"radius\\\":90}],\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"图一\\\",\\\"图二\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"horizontal\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"series\\\":[{\\\"data\\\":[{\\\"lineStyle\\\":{},\\\"name\\\":\\\"图一\\\",\\\"value\\\":[1000,2000,3000,4000,2000]},{\\\"lineStyle\\\":{},\\\"name\\\":\\\"图二\\\",\\\"value\\\":[5000,4000,3000,100,1500]}],\\\"name\\\":\\\"雷达图\\\",\\\"type\\\":\\\"radar\\\"}],\\\"tooltip\\\":{\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":18}},\\\"title\\\":{\\\"padding\\\":[8,20,5,20],\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"圆形雷达图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#c23531\\\",\\\"fontSize\\\":18,\\\"fontWeight\\\":\\\"bolder\\\"}}}\",\"url\":\"\",\"extData\":{\"chartId\":\"radar.custom\",\"chartType\":\"radar.basic\"},\"layer_id\":\"1goCA1os5O64qksC\",\"offsetX\":0,\"offsetY\":0,\"backgroud\":{\"enabled\":false,\"color\":\"#fff\",\"image\":\"\"},\"virtualCellRange\":[[14,-1],[14,0],[14,1],[14,2],[14,3],[14,4],[14,5]]},{\"row\":14,\"col\":6,\"colspan\":7,\"rowspan\":14,\"width\":\"650\",\"height\":\"350\",\"config\":\"{\\\"geo\\\":{\\\"regions\\\":[],\\\"layoutSize\\\":600,\\\"emphasis\\\":{\\\"itemStyle\\\":{\\\"areaColor\\\":\\\"red\\\"},\\\"label\\\":{\\\"color\\\":\\\"#fff\\\"}},\\\"itemStyle\\\":{\\\"borderColor\\\":\\\"#000\\\",\\\"areaColor\\\":\\\"#fff\\\",\\\"borderWidth\\\":0.5},\\\"zoom\\\":0.5,\\\"label\\\":{\\\"color\\\":\\\"#000\\\",\\\"show\\\":true,\\\"fontSize\\\":12},\\\"roam\\\":true,\\\"map\\\":\\\"china\\\",\\\"layoutCenter\\\":[\\\"50%\\\",\\\"50%\\\"]},\\\"series\\\":[{\\\"name\\\":\\\"地图\\\",\\\"coordinateSystem\\\":\\\"geo\\\",\\\"type\\\":\\\"map\\\"}],\\\"chartType\\\":\\\"map\\\",\\\"title\\\":{\\\"padding\\\":[5,20,5,10],\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"中国地图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#c23531\\\",\\\"fontSize\\\":18,\\\"fontWeight\\\":\\\"bolder\\\"}}}\",\"url\":\"\",\"extData\":{\"chartId\":\"map.simple\",\"chartType\":\"map.simple\"},\"layer_id\":\"yOwMM2eUbvZ7INPJ\",\"offsetX\":0,\"offsetY\":0,\"backgroud\":{\"enabled\":false,\"color\":\"#fff\",\"image\":\"\"},\"virtualCellRange\":[[14,6],[14,7],[14,8],[14,9],[14,10],[14,11],[14,12]]}],\"area\":{\"sri\":9,\"sci\":3,\"eri\":9,\"eci\":3,\"width\":100,\"height\":25},\"excel_config_id\":\"575163965000249344\",\"printConfig\":{\"paper\":\"A3\",\"width\":297,\"height\":420,\"definition\":1,\"isBackend\":false,\"marginX\":10,\"marginY\":10,\"layout\":\"landscape\"},\"rows\":{\"0\":{\"cells\":{\"0\":{\"text\":\" \",\"virtual\":\"WPLlLTIi2vHV8ikB\"},\"1\":{\"text\":\" \",\"virtual\":\"WPLlLTIi2vHV8ikB\"},\"2\":{\"text\":\" \",\"virtual\":\"WPLlLTIi2vHV8ikB\"},\"3\":{\"text\":\" \",\"virtual\":\"WPLlLTIi2vHV8ikB\"},\"4\":{\"text\":\" \",\"virtual\":\"WPLlLTIi2vHV8ikB\"},\"5\":{\"text\":\" \",\"virtual\":\"WPLlLTIi2vHV8ikB\"}}},\"14\":{\"cells\":{\"0\":{\"text\":\" \",\"virtual\":\"1goCA1os5O64qksC\"},\"1\":{\"text\":\" \",\"virtual\":\"1goCA1os5O64qksC\"},\"2\":{\"text\":\" \",\"virtual\":\"1goCA1os5O64qksC\"},\"3\":{\"text\":\" \",\"virtual\":\"1goCA1os5O64qksC\"},\"4\":{\"text\":\" \",\"virtual\":\"1goCA1os5O64qksC\"},\"5\":{\"text\":\" \",\"virtual\":\"1goCA1os5O64qksC\"},\"6\":{\"text\":\" \",\"virtual\":\"yOwMM2eUbvZ7INPJ\"},\"7\":{\"text\":\" \",\"virtual\":\"yOwMM2eUbvZ7INPJ\"},\"8\":{\"text\":\" \",\"virtual\":\"yOwMM2eUbvZ7INPJ\"},\"9\":{\"text\":\" \",\"virtual\":\"yOwMM2eUbvZ7INPJ\"},\"10\":{\"text\":\" \",\"virtual\":\"yOwMM2eUbvZ7INPJ\"},\"11\":{\"text\":\" \",\"virtual\":\"yOwMM2eUbvZ7INPJ\"},\"12\":{\"text\":\" \",\"virtual\":\"yOwMM2eUbvZ7INPJ\"},\"-1\":{\"text\":\" \",\"virtual\":\"1goCA1os5O64qksC\"}}},\"len\":100,\"-1\":{\"cells\":{\"6\":{\"text\":\" \",\"virtual\":\"x5jNAjrL8TFhuTEo\"},\"7\":{\"text\":\" \",\"virtual\":\"x5jNAjrL8TFhuTEo\"},\"8\":{\"text\":\" \",\"virtual\":\"x5jNAjrL8TFhuTEo\"},\"9\":{\"text\":\" \",\"virtual\":\"x5jNAjrL8TFhuTEo\"},\"10\":{\"text\":\" \",\"virtual\":\"x5jNAjrL8TFhuTEo\"},\"11\":{\"text\":\" \",\"virtual\":\"x5jNAjrL8TFhuTEo\"},\"12\":{\"text\":\" \",\"virtual\":\"x5jNAjrL8TFhuTEo\"}}}},\"dbexps\":[],\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":1300,\"displayConfig\":{},\"background\":{\"path\":\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/designreport/images/QQ图片20210714134925_1626241778771.png\",\"repeat\":\"no-repeat\",\"width\":\"\",\"height\":\"\"},\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[],\"validations\":[],\"cols\":{\"len\":50},\"merges\":[]}', NULL, NULL, 'admin', '2021-07-14 05:45:09', 'admin', '2021-07-14 05:59:44', 0, NULL, NULL, 0, 5, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('6059e405dd9c66a6d38e00841d2e40cc', '566777', '处方笺', '', NULL, 'printinfo', '{\"loopBlockList\":[],\"area\":{\"sri\":9,\"sci\":3,\"eri\":9,\"eci\":11,\"width\":593,\"height\":25},\"printElWidth\":718,\"excel_config_id\":\"6059e405dd9c66a6d38e00841d2e40cc\",\"printElHeight\":1047,\"rows\":{\"0\":{\"cells\":{\"3\":{\"style\":80,\"text\":\" \"}},\"height\":96},\"1\":{\"cells\":{\"1\":{\"style\":24,\"text\":\" \"},\"2\":{\"style\":25,\"text\":\" \"},\"3\":{\"style\":25,\"text\":\" \"},\"4\":{\"style\":25,\"text\":\" \"},\"5\":{\"style\":25,\"text\":\" \"},\"6\":{\"style\":25,\"text\":\" \"},\"7\":{\"style\":25,\"text\":\" \"},\"8\":{\"style\":25,\"text\":\" \"},\"9\":{\"style\":25,\"text\":\" \"},\"10\":{\"style\":25,\"text\":\" \"},\"11\":{\"style\":25,\"text\":\" \"},\"12\":{\"style\":26,\"text\":\" \"}},\"height\":18},\"2\":{\"cells\":{\"1\":{\"text\":\" \",\"style\":27},\"2\":{\"merge\":[0,9],\"text\":\"智能医学院处方笺\",\"style\":38},\"3\":{\"style\":12,\"text\":\" \"},\"4\":{\"style\":12,\"text\":\" \"},\"5\":{\"style\":12,\"text\":\" \"},\"6\":{\"style\":12,\"text\":\" \"},\"7\":{\"style\":12,\"text\":\" \"},\"8\":{\"style\":12,\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"style\":12,\"text\":\" \"},\"11\":{\"style\":12,\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"},\"13\":{\"style\":80,\"text\":\" \"}},\"height\":124},\"3\":{\"cells\":{\"1\":{\"text\":\" \",\"style\":46},\"2\":{\"merge\":[0,1],\"text\":\"姓名:\",\"style\":4},\"3\":{\"style\":4,\"text\":\" \"},\"4\":{\"text\":\"${yonghu.yphone}\"},\"5\":{\"text\":\"性别:\",\"style\":42},\"6\":{\"text\":\"${yonghu.ysex}\",\"style\":42},\"7\":{\"text\":\"年龄:\",\"style\":47},\"8\":{\"text\":\"${yonghu.yage}\"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \",\"style\":42},\"11\":{\"style\":69,\"text\":\" \",\"merge\":[0,1]},\"12\":{\"style\":43,\"text\":\" \"},\"13\":{\"style\":80,\"text\":\" \"}},\"isDrag\":true},\"4\":{\"cells\":{\"1\":{\"text\":\" \",\"style\":74},\"2\":{\"style\":4,\"merge\":[0,1],\"text\":\"单位:\"},\"3\":{\"style\":4,\"text\":\" \"},\"4\":{\"text\":\"${yonghu.danwei}\"},\"5\":{\"text\":\"电话:\"},\"6\":{\"text\":\"${yonghu.yphone}\",\"merge\":[0,5]},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"},\"15\":{\"text\":\"\"}},\"isDrag\":true,\"height\":29},\"5\":{\"cells\":{\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"merge\":[0,1],\"text\":\"初步诊断:\",\"style\":4},\"3\":{\"text\":\" \",\"style\":4},\"4\":{\"text\":\"${yonghu.yjieguo}\",\"merge\":[0,7]},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"}},\"isDrag\":true,\"height\":34},\"6\":{\"cells\":{\"1\":{\"text\":\" RP:\",\"merge\":[0,2],\"style\":79},\"2\":{\"style\":11,\"text\":\" \"},\"3\":{\"style\":11,\"text\":\" \"},\"4\":{\"style\":39,\"text\":\" \"},\"5\":{\"style\":0,\"text\":\" \"},\"6\":{\"style\":0,\"text\":\" \"},\"7\":{\"style\":0,\"text\":\" \"},\"8\":{\"style\":0,\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"style\":0,\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"},\"14\":{},\"16\":{}},\"height\":79},\"7\":{\"cells\":{\"1\":{\"text\":\".\",\"style\":48},\"2\":{\"text\":\"\",\"style\":1},\"3\":{\"text\":\"#{yaopin.name}\",\"merge\":[0,1]},\"5\":{},\"6\":{},\"7\":{\"text\":\"#{yaopin.percent}\",\"merge\":[0,1]},\"9\":{},\"10\":{},\"11\":{\"text\":\"\"},\"12\":{\"style\":28,\"text\":\" \"},\"14\":{}},\"isDrag\":true,\"height\":37},\"8\":{\"cells\":{\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"}},\"height\":27},\"9\":{\"cells\":{\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"text\":\"医嘱:\",\"style\":76},\"3\":{\"text\":\"${yonghu.yizhu}\",\"style\":6,\"merge\":[0,8]},\"12\":{\"style\":28,\"text\":\" \"}},\"isDrag\":true},\"10\":{\"cells\":{\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"text\":\"药品费\",\"style\":6,\"merge\":[0,1]},\"3\":{\"text\":\" \"},\"4\":{\"text\":\"${yonghu.yprice}\",\"style\":6},\"5\":{\"text\":\"中成药费\",\"style\":6,\"rendered\":\"\",\"merge\":[0,1]},\"7\":{\"style\":6,\"text\":\" \"},\"8\":{\"text\":\"治疗费\",\"merge\":[0,2],\"style\":6},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"style\":6,\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"}},\"isDrag\":true},\"11\":{\"cells\":{\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"text\":\"检查费\",\"style\":6,\"merge\":[0,1]},\"3\":{\"text\":\" \"},\"4\":{\"style\":6,\"text\":\" \"},\"5\":{\"text\":\"换药费\",\"style\":6,\"merge\":[0,1]},\"7\":{\"style\":6,\"text\":\" \"},\"8\":{\"merge\":[0,2],\"text\":\"诊疗费\",\"style\":6},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\"${yonghu.yzhenliao}\",\"style\":6},\"12\":{\"style\":28,\"text\":\" \"}},\"isDrag\":true},\"12\":{\"cells\":{\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"text\":\"注射费\",\"style\":6,\"merge\":[0,1]},\"3\":{\"text\":\" \"},\"4\":{\"style\":6,\"merge\":[0,3],\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"merge\":[0,2],\"text\":\"其他\",\"style\":6},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"style\":6,\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"}}},\"13\":{\"cells\":{\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"text\":\"合计\",\"style\":6,\"merge\":[0,1]},\"3\":{\"text\":\" \"},\"4\":{\"text\":\"${yonghu.ytotal}\",\"style\":6,\"merge\":[0,7]},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"}},\"isDrag\":true},\"14\":{\"cells\":{\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"},\"13\":{\"style\":80,\"text\":\" \"}},\"height\":9},\"15\":{\"cells\":{\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"text\":\"医师:\",\"style\":4,\"rendered\":\"\",\"merge\":[0,1]},\"4\":{\"text\":\"${yonghu.yishe}\",\"style\":80},\"5\":{\"style\":80,\"text\":\" \"},\"6\":{\"style\":80,\"text\":\" \"},\"7\":{\"style\":80,\"text\":\" \"},\"8\":{\"text\":\"日期:\",\"style\":4},\"9\":{\"text\":\"${yonghu.kdata}\",\"style\":80,\"merge\":[0,2]},\"12\":{\"style\":71,\"text\":\" \"},\"13\":{\"style\":80,\"text\":\" \"}},\"isDrag\":true,\"height\":43},\"16\":{\"cells\":{\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"style\":80,\"text\":\" \"},\"3\":{\"style\":80,\"text\":\" \"},\"4\":{\"style\":80,\"text\":\" \"},\"5\":{\"style\":80,\"text\":\" \"},\"6\":{\"style\":80,\"text\":\" \"},\"7\":{\"style\":80,\"text\":\" \"},\"8\":{\"style\":80,\"text\":\" \"},\"9\":{\"style\":80,\"text\":\" \"},\"10\":{\"style\":80,\"text\":\" \"},\"11\":{\"style\":80,\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"}},\"height\":17},\"17\":{\"cells\":{\"1\":{\"text\":\" \",\"style\":32},\"2\":{\"text\":\" \",\"style\":33},\"3\":{\"style\":33,\"text\":\" \"},\"4\":{\"text\":\" \",\"style\":33},\"5\":{\"text\":\" \",\"style\":33},\"6\":{\"text\":\" \",\"style\":33},\"7\":{\"text\":\" \",\"style\":33},\"8\":{\"text\":\" \",\"style\":33},\"9\":{\"text\":\" \",\"style\":33},\"10\":{\"text\":\" \",\"style\":33},\"11\":{\"text\":\" \",\"style\":33},\"12\":{\"text\":\" \",\"style\":34}}},\"18\":{\"cells\":{\"11\":{\"text\":\"\"}},\"isDrag\":true},\"len\":94,\"-1\":{\"cells\":{\"-1\":{\"text\":\"#{yaopin.key1}\"}},\"isDrag\":true},\"\":{\"cells\":{\"NaN\":{\"text\":\"\",\"rendered\":\"\"}}}},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":718,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":709,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"font\":{\"size\":12}},{\"font\":{\"size\":10}},{\"font\":{\"size\":12},\"align\":\"right\"},{\"font\":{\"size\":14}},{\"align\":\"right\"},{\"font\":{\"size\":10},\"align\":\"right\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\"},{\"font\":{\"size\":12},\"align\":\"center\"},{\"font\":{\"size\":12,\"bold\":true},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true}},{\"font\":{\"size\":14,\"bold\":true},\"align\":\"center\"},{\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":14,\"bold\":true},\"align\":\"center\",\"border\":{\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"left\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":14,\"bold\":true},\"align\":\"center\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":15},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":15}},{\"align\":\"left\"},{\"font\":{\"size\":14,\"bold\":true},\"align\":\"center\",\"border\":{\"bottom\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":true}},{\"font\":{\"size\":12,\"bold\":true},\"align\":\"center\",\"border\":{\"bottom\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thick\",\"#000\"]},\"valign\":\"bottom\"},{\"font\":{\"size\":10},\"valign\":\"bottom\"},{\"valign\":\"bottom\"},{\"align\":\"right\",\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thick\",\"#000\"]},\"valign\":\"bottom\",\"align\":\"right\"},{\"font\":{\"size\":10},\"valign\":\"bottom\",\"align\":\"right\"},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"right\"},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thick\",\"#000\"]},\"textwrap\":true},{\"font\":{\"size\":10},\"textwrap\":true},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thick\",\"#000\"]},\"textwrap\":false},{\"font\":{\"size\":10},\"textwrap\":false},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thick\",\"#000\"]},\"textwrap\":false,\"align\":\"right\"},{\"font\":{\"size\":10},\"textwrap\":false,\"align\":\"right\"},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thick\",\"#000\"]},\"textwrap\":false,\"align\":\"left\"},{\"font\":{\"size\":10},\"textwrap\":false,\"align\":\"left\"},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thick\",\"#000\"]},\"textwrap\":false,\"align\":\"center\"},{\"font\":{\"size\":10},\"textwrap\":false,\"align\":\"center\"},{\"font\":{\"size\":15},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"right\"},{\"font\":{\"size\":15},\"align\":\"right\"},{\"font\":{\"size\":15},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thin\",\"#000\"]},\"valign\":\"bottom\",\"align\":\"right\"},{\"font\":{\"size\":10},\"valign\":\"bottom\",\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thin\",\"#000\"]},\"align\":\"right\"},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thin\",\"#000\"]},\"textwrap\":false,\"align\":\"left\"},{\"font\":{\"size\":10},\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":15},\"border\":{\"left\":[\"thin\",\"#000\"]},\"align\":\"center\"},{\"align\":\"left\",\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":10},\"valign\":\"bottom\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":10},\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":10},\"align\":\"left\"},{\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"right\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"right\"},{\"font\":{\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":10},\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":15,\"bold\":true},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{},{\"font\":{\"size\":15,\"bold\":true},\"align\":\"center\"},{\"align\":\"right\",\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":14,\"bold\":true},\"align\":\"center\",\"border\":{\"bottom\":[\"thick\",\"#000\"],\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}}],\"validations\":[],\"cols\":{\"0\":{\"width\":23},\"1\":{\"width\":14},\"2\":{\"width\":56},\"3\":{\"width\":40},\"4\":{\"width\":156},\"5\":{\"width\":41},\"6\":{\"width\":18},\"7\":{\"width\":92},\"8\":{\"width\":58},\"9\":{\"width\":20},\"10\":{\"width\":20},\"11\":{\"width\":148},\"12\":{\"width\":12},\"13\":{\"width\":11},\"len\":50},\"merges\":[\"C3:E3\",\"C7:E7\",\"H3:I3\",\"H7:I7\",\"C7:E7\",\"H7:I7\",\"I11:K11\",\"I12:K12\",\"I13:K13\",\"E13:H13\",\"C11:D11\",\"C12:D12\",\"C13:D13\",\"C14:D14\",\"L4:M4\",\"C3:L3\",\"B7:D7\",\"C4:D4\",\"C5:D5\",\"E14:L14\",\"G5:L5\",\"C6:D6\",\"E6:L6\",\"D8:E8\",\"H8:I8\",\"C16:D16\",\"J16:L16\",\"F11:G11\",\"F12:G12\",\"D10:L10\"]}', '', 'https://static.jeecg.com/designreport/images/处方_1607071731580.png', 'jeecg', '2020-07-10 17:12:16', 'admin', '2021-07-12 12:25:06', 0, NULL, NULL, 1, 849, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('6d6bdcb5e820c301ea32789e3ae43c44', '1223', '供电公司抢修单', '', NULL, 'printinfo', '{\"loopBlockList\":[],\"area\":{\"sri\":14,\"sci\":8,\"eri\":14,\"eci\":8,\"width\":100,\"height\":67},\"printElWidth\":718,\"excel_config_id\":\"6d6bdcb5e820c301ea32789e3ae43c44\",\"printElHeight\":1047,\"rows\":{\"0\":{\"cells\":{},\"height\":11},\"1\":{\"cells\":{\"1\":{\"text\":\"供电公司抢修竣工单\",\"merge\":[0,5],\"style\":39},\"2\":{\"style\":39},\"3\":{\"style\":39},\"4\":{\"style\":39},\"5\":{\"style\":39},\"6\":{\"style\":39}},\"height\":56},\"2\":{\"cells\":{\"1\":{\"text\":\"填报单位:\",\"style\":26},\"2\":{\"text\":\"#{qiangxiu.danwei}\",\"style\":27},\"3\":{\"style\":27},\"4\":{\"text\":\"\",\"style\":27},\"5\":{\"text\":\"填报日期:\",\"style\":26},\"6\":{\"text\":\"#{qiangxiu.time}\",\"style\":27}}},\"3\":{\"cells\":{\"1\":{\"text\":\"填报名称:\",\"style\":26},\"2\":{\"text\":\"#{qiangxiu.ktime}\",\"style\":27},\"3\":{\"style\":27},\"4\":{\"style\":27},\"5\":{\"text\":\"项目编号:\",\"style\":26},\"6\":{\"text\":\"#{qiangxiu.wtime}\",\"style\":27}}},\"4\":{\"cells\":{\"1\":{\"style\":28},\"2\":{\"style\":28},\"3\":{\"style\":28},\"4\":{\"style\":28},\"5\":{\"style\":28},\"6\":{\"style\":28}},\"height\":10},\"5\":{\"cells\":{\"1\":{\"text\":\"项目批准核算\",\"style\":29},\"2\":{\"text\":\"#{qiangxiu.yusuan}\",\"style\":30,\"merge\":[0,4]}},\"height\":89},\"6\":{\"cells\":{\"1\":{\"text\":\"开工日期\",\"style\":32},\"2\":{\"style\":33,\"text\":\"#{qiangxiu.ktime}\",\"merge\":[0,1]},\"3\":{\"style\":28},\"4\":{\"style\":34,\"text\":\"完工日期\"},\"5\":{\"style\":33,\"merge\":[0,1],\"text\":\"#{qiangxiu.wtime}\"},\"6\":{\"style\":28}},\"height\":31},\"7\":{\"cells\":{\"1\":{\"text\":\"完工主要内容\",\"style\":32},\"2\":{\"style\":33,\"text\":\"#{qiangxiu.neirong}\",\"merge\":[0,4]}},\"height\":71},\"8\":{\"cells\":{\"1\":{\"text\":\"形成能力\",\"style\":32},\"2\":{\"style\":33,\"merge\":[0,4],\"text\":\"#{qiangxiu.nengli}\"},\"3\":{\"style\":28},\"4\":{\"style\":28},\"5\":{\"style\":28},\"6\":{\"style\":28}},\"height\":49},\"9\":{\"cells\":{\"1\":{\"text\":\"目标效益验收意见\",\"style\":32},\"2\":{\"style\":35,\"text\":\"#{qiangxiu.yijian}\",\"rendered\":\"\",\"merge\":[0,4]}},\"height\":100},\"10\":{\"cells\":{\"1\":{\"style\":37,\"text\":\" \",\"merge\":[0,3]},\"2\":{\"style\":28},\"3\":{\"style\":28},\"4\":{\"style\":28},\"5\":{\"style\":37,\"text\":\"#{qiangxiu.time1}\",\"merge\":[0,1]},\"6\":{\"style\":28}}},\"11\":{\"cells\":{\"1\":{\"text\":\"实施质量验收评价\",\"style\":32},\"2\":{\"style\":35,\"text\":\"#{qiangxiu.pingjia}\",\"merge\":[0,4]}},\"height\":99},\"12\":{\"cells\":{\"1\":{\"style\":33,\"merge\":[0,3]},\"2\":{\"style\":28},\"3\":{\"style\":28},\"4\":{\"style\":28},\"5\":{\"style\":33,\"merge\":[0,1],\"text\":\"#{qiangxiu.time1}\"},\"6\":{\"style\":28}}},\"13\":{\"cells\":{\"1\":{\"text\":\"验收总结\",\"style\":32},\"2\":{\"style\":35,\"text\":\"#{qiangxiu.zongjie}\",\"merge\":[0,4],\"rendered\":\"\"}},\"height\":80},\"14\":{\"cells\":{\"1\":{\"text\":\"责任单位意见\",\"style\":32},\"2\":{\"style\":33,\"merge\":[0,4],\"text\":\"#{qiangxiu.zongjie}\"}},\"height\":67},\"15\":{\"cells\":{\"1\":{\"text\":\"责任单位审核人\",\"style\":32},\"2\":{\"style\":33,\"merge\":[0,1],\"text\":\"#{qiangxiu.dshenhe}\"},\"3\":{\"style\":28},\"4\":{\"style\":34,\"text\":\"日期\"},\"5\":{\"style\":33,\"text\":\"#{qiangxiu.time3}\",\"merge\":[0,1]},\"6\":{\"style\":28}},\"height\":42},\"16\":{\"cells\":{\"1\":{\"text\":\"生技部审批意见\",\"style\":32},\"2\":{\"style\":33,\"text\":\"#{qiangxiu.dshenhe}\",\"merge\":[0,4]}},\"height\":107},\"17\":{\"cells\":{\"1\":{\"text\":\"生技部主任\",\"style\":32},\"2\":{\"style\":33,\"merge\":[0,1],\"text\":\"#{qiangxiu.zhuren}\"},\"3\":{\"style\":28},\"4\":{\"style\":34,\"text\":\"日期\"},\"5\":{\"style\":33,\"text\":\"#{qiangxiu.time4}\",\"merge\":[0,1]},\"6\":{\"style\":28}},\"height\":41},\"18\":{\"cells\":{\"1\":{\"style\":28},\"2\":{\"style\":28},\"3\":{\"style\":28},\"4\":{\"style\":28},\"5\":{\"style\":28},\"6\":{\"style\":28}}},\"len\":100},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":718,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":699,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#9cc2e6\"},{\"bgcolor\":\"#9cc2e6\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#ffffff\"},{\"bgcolor\":\"#ffffff\"},{\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":14}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"right\"},{\"align\":\"right\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"left\"},{\"align\":\"left\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true},{\"textwrap\":true},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":false},{\"textwrap\":false},{\"align\":\"center\",\"font\":{\"size\":18,\"bold\":true}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true}},{\"align\":\"right\",\"color\":\"#7f7f7f\"},{\"color\":\"#7f7f7f\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#ffffff\",\"font\":{\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#ffffff\",\"font\":{\"bold\":false}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"bold\":false}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"right\",\"font\":{\"bold\":true}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true,\"name\":\"宋体\"}},{\"align\":\"right\",\"color\":\"#7f7f7f\",\"font\":{\"name\":\"宋体\"}},{\"color\":\"#7f7f7f\",\"font\":{\"name\":\"宋体\"}},{\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#ffffff\",\"font\":{\"bold\":true,\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#ffffff\",\"font\":{\"name\":\"宋体\"}},{\"bgcolor\":\"#ffffff\",\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"bold\":true,\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"right\",\"font\":{\"bold\":true,\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"font\":{\"name\":\"宋体\"}},{\"textwrap\":true,\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"left\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":false,\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"size\":18,\"bold\":true,\"name\":\"宋体\"}}],\"validations\":[],\"cols\":{\"0\":{\"width\":23},\"1\":{\"width\":117},\"3\":{\"width\":108},\"4\":{\"width\":127},\"5\":{\"width\":76},\"6\":{\"width\":148},\"7\":{\"width\":13},\"len\":50},\"merges\":[\"C7:D7\",\"F7:G7\",\"B2:G2\",\"C9:G9\",\"B11:E11\",\"F11:G11\",\"B13:E13\",\"F13:G13\",\"C16:D16\",\"C18:D18\",\"F16:G16\",\"F18:G18\",\"C10:G10\",\"C8:G8\",\"C6:G6\",\"C12:G12\",\"C14:G14\",\"C15:G15\",\"C17:G17\"]}', '', 'https://static.jeecg.com/designreport/images/222_1607311944321.png', 'jeecg', '2020-07-20 19:37:54', 'admin', '2021-07-12 12:25:19', 0, NULL, NULL, 1, 178, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('6df599d933df24de007764d0e98eb105', '5667774539', '处方笺副本4539', '', NULL, 'printinfo', '{\"loopBlockList\":[],\"area\":false,\"printElWidth\":718,\"excel_config_id\":\"6df599d933df24de007764d0e98eb105\",\"printElHeight\":1047,\"rows\":{\"0\":{\"cells\":{\"3\":{\"style\":80,\"text\":\" \"}},\"height\":96},\"1\":{\"cells\":{\"1\":{\"style\":24,\"text\":\" \"},\"2\":{\"style\":25,\"text\":\" \"},\"3\":{\"style\":25,\"text\":\" \"},\"4\":{\"style\":25,\"text\":\" \"},\"5\":{\"style\":25,\"text\":\" \"},\"6\":{\"style\":25,\"text\":\" \"},\"7\":{\"style\":25,\"text\":\" \"},\"8\":{\"style\":25,\"text\":\" \"},\"9\":{\"style\":25,\"text\":\" \"},\"10\":{\"style\":25,\"text\":\" \"},\"11\":{\"style\":25,\"text\":\" \"},\"12\":{\"style\":26,\"text\":\" \"}},\"height\":18},\"2\":{\"cells\":{\"1\":{\"text\":\" \",\"style\":27},\"2\":{\"merge\":[0,9],\"text\":\"智能医学院处方笺\",\"style\":38},\"3\":{\"style\":12,\"text\":\" \"},\"4\":{\"style\":12,\"text\":\" \"},\"5\":{\"style\":12,\"text\":\" \"},\"6\":{\"style\":12,\"text\":\" \"},\"7\":{\"style\":12,\"text\":\" \"},\"8\":{\"style\":12,\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"style\":12,\"text\":\" \"},\"11\":{\"style\":12,\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"},\"13\":{\"style\":80,\"text\":\" \"}},\"height\":124},\"3\":{\"cells\":{\"1\":{\"text\":\" \",\"style\":46},\"2\":{\"merge\":[0,1],\"text\":\"姓名:\",\"style\":4},\"3\":{\"style\":4,\"text\":\" \"},\"4\":{\"text\":\"${yonghu.yphone}\"},\"5\":{\"text\":\"性别:\",\"style\":42},\"6\":{\"text\":\"${yonghu.ysex}\",\"style\":42},\"7\":{\"text\":\"年龄:\",\"style\":47},\"8\":{\"text\":\"${yonghu.yage}\"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \",\"style\":42},\"11\":{\"style\":69,\"text\":\" \",\"merge\":[0,1]},\"12\":{\"style\":43,\"text\":\" \"},\"13\":{\"style\":80,\"text\":\" \"}},\"isDrag\":true},\"4\":{\"cells\":{\"1\":{\"text\":\" \",\"style\":74},\"2\":{\"style\":4,\"merge\":[0,1],\"text\":\"单位:\"},\"3\":{\"style\":4,\"text\":\" \"},\"4\":{\"text\":\"${yonghu.danwei}\"},\"5\":{\"text\":\"电话:\"},\"6\":{\"text\":\"${yonghu.yphone}\",\"merge\":[0,5]},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"},\"15\":{\"text\":\"\"}},\"isDrag\":true,\"height\":29},\"5\":{\"cells\":{\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"merge\":[0,1],\"text\":\"初步诊断:\",\"style\":4},\"3\":{\"text\":\" \",\"style\":4},\"4\":{\"text\":\"${yonghu.yjieguo}\",\"merge\":[0,7]},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"}},\"isDrag\":true,\"height\":34},\"6\":{\"cells\":{\"1\":{\"text\":\" RP:\",\"merge\":[0,2],\"style\":79},\"2\":{\"style\":11,\"text\":\" \"},\"3\":{\"style\":11,\"text\":\" \"},\"4\":{\"style\":39,\"text\":\" \"},\"5\":{\"style\":0,\"text\":\" \"},\"6\":{\"style\":0,\"text\":\" \"},\"7\":{\"style\":0,\"text\":\" \"},\"8\":{\"style\":0,\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"style\":0,\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"},\"14\":{},\"16\":{}},\"height\":79},\"7\":{\"cells\":{\"1\":{\"text\":\".\",\"style\":48},\"2\":{\"text\":\"\",\"style\":1},\"3\":{\"text\":\"#{yaopin.name}\",\"merge\":[0,1]},\"5\":{},\"6\":{},\"7\":{\"text\":\"#{yaopin.percent}\",\"merge\":[0,1]},\"9\":{},\"10\":{},\"11\":{\"text\":\"\"},\"12\":{\"style\":28,\"text\":\" \"},\"14\":{}},\"isDrag\":true,\"height\":37},\"8\":{\"cells\":{\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"}},\"height\":27},\"9\":{\"cells\":{\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"text\":\"医嘱:\",\"style\":76},\"3\":{\"text\":\"${yonghu.yizhu}\",\"style\":6,\"merge\":[0,8]},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"}},\"isDrag\":true},\"10\":{\"cells\":{\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"text\":\"药品费\",\"style\":6,\"merge\":[0,1]},\"3\":{\"text\":\" \"},\"4\":{\"text\":\"${yonghu.yprice}\",\"style\":6},\"5\":{\"merge\":[0,1],\"text\":\"中成药费\",\"style\":6},\"6\":{\"text\":\" \"},\"7\":{\"style\":6,\"text\":\" \"},\"8\":{\"text\":\"治疗费\",\"merge\":[0,2],\"style\":6},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"style\":6,\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"}},\"isDrag\":true},\"11\":{\"cells\":{\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"text\":\"检查费\",\"style\":6,\"merge\":[0,1]},\"3\":{\"text\":\" \"},\"4\":{\"style\":6,\"text\":\" \"},\"5\":{\"merge\":[0,1],\"text\":\"换药费\",\"style\":6},\"6\":{\"text\":\" \"},\"7\":{\"style\":6,\"text\":\" \"},\"8\":{\"merge\":[0,2],\"text\":\"诊疗费\",\"style\":6},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\"${yonghu.yzhenliao}\",\"style\":6},\"12\":{\"style\":28,\"text\":\" \"}},\"isDrag\":true},\"12\":{\"cells\":{\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"text\":\"注射费\",\"style\":6,\"merge\":[0,1]},\"3\":{\"text\":\" \"},\"4\":{\"style\":6,\"merge\":[0,3],\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"merge\":[0,2],\"text\":\"其他\",\"style\":6},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"style\":6,\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"}}},\"13\":{\"cells\":{\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"text\":\"合计\",\"style\":6,\"merge\":[0,1]},\"3\":{\"text\":\" \"},\"4\":{\"text\":\"${yonghu.ytotal}\",\"style\":6,\"merge\":[0,7]},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"}},\"isDrag\":true},\"14\":{\"cells\":{\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"text\":\" \"},\"3\":{\"text\":\" \"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\" \"},\"6\":{\"text\":\" \"},\"7\":{\"text\":\" \"},\"8\":{\"text\":\" \"},\"9\":{\"text\":\" \"},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"},\"13\":{\"style\":80,\"text\":\" \"}},\"height\":9},\"15\":{\"cells\":{\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"text\":\"医师:\",\"style\":4,\"merge\":[0,1]},\"3\":{\"text\":\" \"},\"4\":{\"text\":\"${yonghu.yishe}\",\"style\":80},\"5\":{\"style\":80,\"text\":\" \"},\"6\":{\"style\":80,\"text\":\" \"},\"7\":{\"style\":80,\"text\":\" \"},\"8\":{\"text\":\"日期:\",\"style\":4},\"9\":{\"text\":\"${yonghu.kdata}\",\"style\":80,\"merge\":[0,2]},\"10\":{\"text\":\" \"},\"11\":{\"text\":\" \"},\"12\":{\"style\":71,\"text\":\" \"},\"13\":{\"style\":80,\"text\":\" \"}},\"isDrag\":true,\"height\":43},\"16\":{\"cells\":{\"1\":{\"style\":31,\"text\":\" \"},\"2\":{\"style\":80,\"text\":\" \"},\"3\":{\"style\":80,\"text\":\" \"},\"4\":{\"style\":80,\"text\":\" \"},\"5\":{\"style\":80,\"text\":\" \"},\"6\":{\"style\":80,\"text\":\" \"},\"7\":{\"style\":80,\"text\":\" \"},\"8\":{\"style\":80,\"text\":\" \"},\"9\":{\"style\":80,\"text\":\" \"},\"10\":{\"style\":80,\"text\":\" \"},\"11\":{\"style\":80,\"text\":\" \"},\"12\":{\"style\":28,\"text\":\" \"}},\"height\":17},\"17\":{\"cells\":{\"1\":{\"text\":\" \",\"style\":32},\"2\":{\"text\":\" \",\"style\":33},\"3\":{\"style\":33,\"text\":\" \"},\"4\":{\"text\":\" \",\"style\":33},\"5\":{\"text\":\" \",\"style\":33},\"6\":{\"text\":\" \",\"style\":33},\"7\":{\"text\":\" \",\"style\":33},\"8\":{\"text\":\" \",\"style\":33},\"9\":{\"text\":\" \",\"style\":33},\"10\":{\"text\":\" \",\"style\":33},\"11\":{\"text\":\" \",\"style\":33},\"12\":{\"text\":\" \",\"style\":34}}},\"18\":{\"cells\":{\"11\":{\"text\":\"\"}},\"isDrag\":true},\"len\":94,\"-1\":{\"cells\":{\"-1\":{\"text\":\"#{yaopin.key1}\"}},\"isDrag\":true},\"\":{\"cells\":{\"NaN\":{\"text\":\"\",\"rendered\":\"\"}}}},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":718,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":798,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"font\":{\"size\":12}},{\"font\":{\"size\":10}},{\"font\":{\"size\":12},\"align\":\"right\"},{\"font\":{\"size\":14}},{\"align\":\"right\"},{\"font\":{\"size\":10},\"align\":\"right\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\"},{\"font\":{\"size\":12},\"align\":\"center\"},{\"font\":{\"size\":12,\"bold\":true},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true}},{\"font\":{\"size\":14,\"bold\":true},\"align\":\"center\"},{\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":14,\"bold\":true},\"align\":\"center\",\"border\":{\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"left\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":14,\"bold\":true},\"align\":\"center\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":15},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":15}},{\"align\":\"left\"},{\"font\":{\"size\":14,\"bold\":true},\"align\":\"center\",\"border\":{\"bottom\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":true}},{\"font\":{\"size\":12,\"bold\":true},\"align\":\"center\",\"border\":{\"bottom\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thick\",\"#000\"]},\"valign\":\"bottom\"},{\"font\":{\"size\":10},\"valign\":\"bottom\"},{\"valign\":\"bottom\"},{\"align\":\"right\",\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thick\",\"#000\"]},\"valign\":\"bottom\",\"align\":\"right\"},{\"font\":{\"size\":10},\"valign\":\"bottom\",\"align\":\"right\"},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"right\"},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thick\",\"#000\"]},\"textwrap\":true},{\"font\":{\"size\":10},\"textwrap\":true},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thick\",\"#000\"]},\"textwrap\":false},{\"font\":{\"size\":10},\"textwrap\":false},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thick\",\"#000\"]},\"textwrap\":false,\"align\":\"right\"},{\"font\":{\"size\":10},\"textwrap\":false,\"align\":\"right\"},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thick\",\"#000\"]},\"textwrap\":false,\"align\":\"left\"},{\"font\":{\"size\":10},\"textwrap\":false,\"align\":\"left\"},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thick\",\"#000\"]},\"textwrap\":false,\"align\":\"center\"},{\"font\":{\"size\":10},\"textwrap\":false,\"align\":\"center\"},{\"font\":{\"size\":15},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"right\"},{\"font\":{\"size\":15},\"align\":\"right\"},{\"font\":{\"size\":15},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thin\",\"#000\"]},\"valign\":\"bottom\",\"align\":\"right\"},{\"font\":{\"size\":10},\"valign\":\"bottom\",\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thin\",\"#000\"]},\"align\":\"right\"},{\"font\":{\"size\":10},\"border\":{\"left\":[\"thin\",\"#000\"]},\"textwrap\":false,\"align\":\"left\"},{\"font\":{\"size\":10},\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":15},\"border\":{\"left\":[\"thin\",\"#000\"]},\"align\":\"center\"},{\"align\":\"left\",\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":10},\"valign\":\"bottom\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":10},\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":10},\"align\":\"left\"},{\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"right\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"right\"},{\"font\":{\"size\":10},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":10},\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":15,\"bold\":true},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{},{\"font\":{\"size\":15,\"bold\":true},\"align\":\"center\"},{\"align\":\"right\",\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":14,\"bold\":true},\"align\":\"center\",\"border\":{\"bottom\":[\"thick\",\"#000\"],\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}}],\"validations\":[],\"cols\":{\"0\":{\"width\":23},\"1\":{\"width\":14},\"2\":{\"width\":56},\"3\":{\"width\":40},\"4\":{\"width\":156},\"5\":{\"width\":41},\"6\":{\"width\":18},\"7\":{\"width\":92},\"8\":{\"width\":58},\"9\":{\"width\":20},\"10\":{\"width\":20},\"11\":{\"width\":148},\"12\":{\"width\":12},\"len\":50},\"merges\":[\"C3:E3\",\"C7:E7\",\"H3:I3\",\"H7:I7\",\"C7:E7\",\"H7:I7\",\"F11:G11\",\"I11:K11\",\"F12:G12\",\"I12:K12\",\"I13:K13\",\"E13:H13\",\"C11:D11\",\"C12:D12\",\"C13:D13\",\"C14:D14\",\"C16:D16\",\"L4:M4\",\"C3:L3\",\"B7:D7\",\"C4:D4\",\"C5:D5\",\"E14:L14\",\"J16:L16\",\"D10:L10\",\"G5:L5\",\"C6:D6\",\"E6:L6\",\"D8:E8\",\"H8:I8\"]}', '', 'https://static.jeecg.com/designreport/images/处方_1607071731580.png', 'admin', '2021-02-02 20:13:47', 'admin', '2021-07-13 10:24:42', 1, NULL, NULL, 0, 835, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('7905022412733a0c68dc7b4ef8947489', '8996445', '介绍信', '', NULL, 'printinfo', '{\"loopBlockList\":[],\"area\":{\"sri\":5,\"sci\":15,\"eri\":5,\"eci\":15,\"width\":100,\"height\":42},\"excel_config_id\":\"7905022412733a0c68dc7b4ef8947489\",\"printConfig\":{\"paper\":\"A4\",\"width\":210,\"height\":297,\"definition\":1,\"isBackend\":false,\"marginX\":10,\"marginY\":10,\"layout\":\"portrait\"},\"rows\":{\"0\":{\"cells\":{\"1\":{},\"12\":{}},\"height\":11},\"3\":{\"cells\":{\"0\":{\"text\":\"\",\"style\":46},\"1\":{\"merge\":[0,10],\"text\":\"介绍信\",\"style\":337}},\"height\":216},\"4\":{\"cells\":{\"1\":{\"text\":\"${jieshaoxin.name}\",\"style\":338,\"merge\":[0,3]},\"5\":{\"text\":\":\",\"style\":339}},\"isDrag\":true,\"height\":80},\"5\":{\"cells\":{\"1\":{\"text\":\"兹介绍我局\",\"style\":340,\"merge\":[0,5]},\"7\":{\"text\":\"${jieshaoxin.value}\",\"style\":341},\"8\":{\"text\":\"同志\",\"style\":339},\"9\":{\"text\":\"#{jieshaoxin.percent}\",\"style\":339},\"10\":{\"text\":\"人,前往你处\",\"style\":339,\"merge\":[0,1]}},\"isDrag\":true,\"height\":42},\"6\":{\"cells\":{\"1\":{\"text\":\"${jieshaoxin.shiqing}\",\"style\":342,\"merge\":[0,5]},\"15\":{\"text\":\"\"}},\"isDrag\":true,\"height\":48},\"7\":{\"cells\":{\"1\":{\"style\":343,\"text\":\"\"},\"2\":{\"style\":344,\"merge\":[0,5],\"text\":\"请予接洽并给予帮助。\"}},\"height\":56},\"10\":{\"cells\":{\"8\":{\"text\":\"\",\"style\":316,\"merge\":[0,3]}},\"height\":39},\"11\":{\"cells\":{\"8\":{\"merge\":[0,2],\"text\":\"单位盖章\",\"style\":347},\"11\":{\"merge\":[0,1],\"style\":316}},\"height\":84},\"12\":{\"cells\":{\"1\":{\"merge\":[0,2],\"text\":\"\",\"style\":317},\"4\":{\"merge\":[0,2],\"text\":\"\",\"style\":346},\"7\":{\"text\":\"(有效时间:至\",\"style\":317},\"8\":{\"text\":\"${jieshaoxin.gdata}\",\"style\":316,\"merge\":[0,2]},\"11\":{\"style\":348,\"text\":\"止)\"}},\"isDrag\":true,\"height\":30},\"13\":{\"cells\":{\"1\":{\"merge\":[8,11]}}},\"len\":83},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":718,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":694,\"displayConfig\":{},\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"left\"},{\"align\":\"left\",\"underline\":true},{\"underline\":true},{\"align\":\"center\",\"underline\":true},{\"align\":\"center\"},{\"align\":\"center\",\"underline\":false},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":16}},{\"font\":{\"size\":16}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16}},{\"align\":\"center\",\"underline\":false,\"font\":{\"size\":16}},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16}},{\"align\":\"left\",\"font\":{\"size\":16,\"bold\":true}},{\"font\":{\"size\":16,\"bold\":true}},{\"align\":\"center\",\"underline\":false,\"font\":{\"size\":16,\"bold\":true}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16,\"bold\":true}},{\"font\":{\"bold\":true}},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16,\"bold\":true}},{\"align\":\"left\",\"font\":{\"size\":16,\"bold\":false}},{\"font\":{\"size\":16,\"bold\":false}},{\"align\":\"center\",\"underline\":false,\"font\":{\"size\":16,\"bold\":false}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16,\"bold\":false}},{\"font\":{\"bold\":false}},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16,\"bold\":false}},{\"align\":\"left\",\"font\":{\"size\":16,\"bold\":false},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":16,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"underline\":false,\"font\":{\"size\":16,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16,\"bold\":false},\"color\":\"#3f3f3f\"},{\"font\":{\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16,\"bold\":false},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"underline\":false,\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\",\"align\":\"center\"},{\"font\":{\"size\":12},\"align\":\"center\"},{\"font\":{\"size\":8}},{\"font\":{\"size\":10}},{\"font\":{\"size\":10,\"bold\":true}},{\"font\":{\"size\":10,\"bold\":true},\"align\":\"center\"},{\"font\":{\"size\":18,\"bold\":true},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":18}},{\"font\":{\"size\":16,\"bold\":true},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":16}},{\"font\":{\"size\":12},\"valign\":\"bottom\"},{\"font\":{\"size\":12},\"valign\":\"middle\"},{\"font\":{\"size\":12},\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"top\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"top\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"left\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"valign\":\"middle\",\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"right\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"border\":{\"right\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"right\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"border\":{\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"left\":[\"dashed\",\"#000\"]}},{\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"font\":{\"size\":12,\"bold\":true},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true}},{\"font\":{\"size\":14,\"bold\":true},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14}},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"}},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"name\":\"Arial\"}},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Arial\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Arial\"}},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Arial\"}},{\"font\":{\"name\":\"Arial\"}},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"}},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"},\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"name\":\"Source Sans Pro\"}},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Source Sans Pro\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Source Sans Pro\"}},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"}},{\"font\":{\"name\":\"Source Sans Pro\"}},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"},\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"},\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Comic Sans MS\"}},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"name\":\"Comic Sans MS\"}},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Comic Sans MS\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Comic Sans MS\"}},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"}},{\"font\":{\"name\":\"Comic Sans MS\"}},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"},\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Comic Sans MS\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Comic Sans MS\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Comic Sans MS\"}},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"name\":\"Courier New\"}},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Courier New\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Courier New\"}},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Courier New\"}},{\"font\":{\"name\":\"Courier New\"}},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"top\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Courier New\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"top\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Arial\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"border\":{\"top\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Helvetica\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"top\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Lato\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":10,\"name\":\"Lato\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"center\"},{\"font\":{\"size\":10,\"name\":\"Lato\"},\"valign\":\"middle\",\"color\":\"#000100\"},{\"align\":\"center\",\"underline\":false,\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{},{\"font\":{\"size\":12,\"name\":\"Lato\",\"bold\":true},\"color\":\"#000100\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"bold\":true},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"right\"},{\"align\":\"right\"},{\"align\":\"right\",\"font\":{\"size\":12}},{\"align\":\"left\",\"font\":{\"size\":12}},{\"font\":{\"size\":12},\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"align\":\"center\"},{\"valign\":\"top\"},{\"valign\":\"top\",\"align\":\"center\"},{\"valign\":\"top\",\"align\":\"center\",\"font\":{\"size\":12}},{\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"right\"},{\"font\":{\"size\":14}},{\"align\":\"right\",\"font\":{\"size\":14}},{\"font\":{\"size\":14},\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":14,\"bold\":true}},{\"align\":\"right\",\"font\":{\"size\":9}},{\"font\":{\"size\":9}},{\"font\":{\"size\":9},\"align\":\"center\"},{\"font\":{\"size\":9},\"align\":\"left\"},{\"align\":\"left\",\"font\":{\"bold\":true,\"size\":14}},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14},\"valign\":\"top\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":16},\"valign\":\"top\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":18},\"valign\":\"top\"},{\"align\":\"right\",\"font\":{\"size\":10}},{\"font\":{\"size\":10},\"align\":\"center\"},{\"align\":\"left\",\"font\":{\"size\":10}},{\"align\":\"right\",\"font\":{\"size\":12},\"valign\":\"bottom\"},{\"valign\":\"bottom\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"right\",\"valign\":\"bottom\"},{\"font\":{\"size\":12},\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"align\":\"center\",\"valign\":\"bottom\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"valign\":\"bottom\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"valign\":\"bottom\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":22},\"valign\":\"top\"},{\"align\":\"right\",\"font\":{\"size\":14},\"valign\":\"bottom\"},{\"font\":{\"size\":14},\"valign\":\"bottom\"},{\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"right\",\"valign\":\"bottom\"},{\"font\":{\"size\":14},\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"align\":\"center\",\"valign\":\"bottom\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"valign\":\"bottom\"},{\"align\":\"left\",\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"valign\":\"bottom\"},{\"font\":{\"size\":14,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":14},\"align\":\"center\"},{\"valign\":\"top\",\"align\":\"center\",\"font\":{\"size\":14}},{\"align\":\"left\",\"font\":{\"size\":14}}],\"validations\":[],\"cols\":{\"0\":{\"width\":23},\"1\":{\"width\":46},\"2\":{\"width\":24},\"3\":{\"width\":15},\"4\":{\"width\":43},\"5\":{\"width\":13},\"6\":{\"width\":83},\"7\":{\"width\":256},\"8\":{\"width\":42},\"9\":{\"width\":18},\"10\":{\"width\":77},\"11\":{\"width\":54},\"12\":{\"width\":28},\"13\":{\"width\":62},\"16\":{\"width\":55},\"len\":50},\"merges\":[\"B4:L4\",\"B5:E5\",\"B6:G6\",\"K6:L6\",\"B7:G7\",\"C8:H8\",\"I11:L11\",\"I12:K12\",\"L12:M12\",\"B13:D13\",\"E13:G13\",\"I13:K13\",\"B14:M22\"]}', '', 'https://static.jeecg.com/designreport/images/介绍xin_1607072641405.png', 'jeecg', '2020-07-10 13:38:40', 'admin', '2021-07-12 12:24:47', 0, NULL, NULL, 1, 836, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('7acddbc92bc73d06c7f62ff55dfdca19', '566233333333867', '销售单副本3867', '', NULL, 'printinfo', '{\"area\":{\"sri\":6,\"sci\":7,\"eri\":6,\"eci\":7,\"width\":88,\"height\":25},\"printElWidth\":794,\"excel_config_id\":\"519c1c6f4d1f584ae8fa5b43b45acdc7\",\"printElHeight\":1047,\"rows\":{\"0\":{\"cells\":{\"1\":{\"text\":\"销售单\",\"style\":40,\"merge\":[0,6]},\"2\":{\"style\":41},\"3\":{\"style\":41},\"4\":{\"style\":41},\"5\":{\"style\":41},\"6\":{\"style\":41},\"7\":{\"style\":41}},\"height\":99},\"1\":{\"cells\":{\"1\":{\"text\":\"商品编码\",\"style\":62},\"2\":{\"text\":\"商品名称\",\"style\":62},\"3\":{\"text\":\"销售时间\",\"style\":62},\"4\":{\"text\":\"销售数量\",\"style\":62},\"5\":{\"text\":\"定价\",\"style\":62},\"6\":{\"text\":\"优惠价\",\"style\":62},\"7\":{\"text\":\"付款金额\",\"style\":62}},\"height\":39},\"2\":{\"cells\":{\"1\":{\"text\":\"#{xiaoshou.bianma}\",\"style\":61},\"2\":{\"text\":\"#{xiaoshou.cname}\",\"style\":61},\"3\":{\"text\":\"#{xiaoshou.ctime}\",\"style\":61},\"4\":{\"text\":\"#{xiaoshou.cnum}\",\"style\":61},\"5\":{\"text\":\"#{xiaoshou.cprice}\",\"style\":61},\"6\":{\"text\":\"#{xiaoshou.yprice}\",\"style\":61},\"7\":{\"text\":\"#{xiaoshou.ctotal}\",\"style\":61}},\"isDrag\":true,\"height\":35},\"3\":{\"cells\":{\"1\":{\"style\":44,\"text\":\"\"},\"2\":{\"style\":44},\"3\":{\"style\":44},\"4\":{\"style\":44},\"5\":{\"style\":44,\"text\":\"\"},\"6\":{\"text\":\"\",\"style\":45},\"7\":{\"style\":46,\"text\":\"=SUM(H3)\"}},\"isDrag\":true,\"height\":73},\"5\":{\"cells\":{},\"isDrag\":true},\"6\":{\"cells\":{},\"isDrag\":true},\"7\":{\"cells\":{\"2\":{\"text\":\"\"}},\"isDrag\":true},\"len\":100},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":754,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"center\"},{\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#01b0f1\"],\"top\":[\"thin\",\"#01b0f1\"],\"left\":[\"thin\",\"#01b0f1\"],\"right\":[\"thin\",\"#01b0f1\"]}},{\"border\":{\"bottom\":[\"thin\",\"#01b0f1\"],\"top\":[\"thin\",\"#01b0f1\"],\"left\":[\"thin\",\"#01b0f1\"],\"right\":[\"thin\",\"#01b0f1\"]}},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#01b0f1\"],\"top\":[\"thin\",\"#01b0f1\"],\"left\":[\"thin\",\"#01b0f1\"],\"right\":[\"thin\",\"#01b0f1\"]},\"bgcolor\":\"#01b0f1\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"bgcolor\":\"#01b0f1\"},{\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"font\":{\"size\":18}},{\"align\":\"center\",\"font\":{\"size\":18,\"bold\":true}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"align\":\"center\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"bgcolor\":\"#fed964\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"bgcolor\":\"#fdc101\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#fdc101\"],\"top\":[\"thin\",\"#fdc101\"],\"left\":[\"thin\",\"#fdc101\"],\"right\":[\"thin\",\"#fdc101\"]},\"bgcolor\":\"#fdc101\"},{\"border\":{\"bottom\":[\"thin\",\"#fdc101\"],\"top\":[\"thin\",\"#fdc101\"],\"left\":[\"thin\",\"#fdc101\"],\"right\":[\"thin\",\"#fdc101\"]},\"align\":\"center\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#fdc101\"],\"top\":[\"thin\",\"#fdc101\"],\"left\":[\"thin\",\"#fdc101\"],\"right\":[\"thin\",\"#fdc101\"]},\"bgcolor\":\"#ffe59a\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#fdc101\"],\"top\":[\"thin\",\"#fdc101\"],\"left\":[\"thin\",\"#fdc101\"],\"right\":[\"thin\",\"#fdc101\"]},\"bgcolor\":\"#ffc001\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#fdc101\"],\"top\":[\"thin\",\"#fdc101\"],\"left\":[\"thin\",\"#fdc101\"],\"right\":[\"thin\",\"#fdc101\"]},\"bgcolor\":\"#fed964\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#fdc101\"],\"top\":[\"thin\",\"#fdc101\"],\"left\":[\"thin\",\"#fdc101\"],\"right\":[\"thin\",\"#fdc101\"]},\"bgcolor\":\"#ed7d31\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#fdc101\"],\"top\":[\"thin\",\"#fdc101\"],\"left\":[\"thin\",\"#fdc101\"],\"right\":[\"thin\",\"#fdc101\"]},\"bgcolor\":\"#5b9cd6\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#4371c6\"],\"top\":[\"thin\",\"#4371c6\"],\"left\":[\"thin\",\"#4371c6\"],\"right\":[\"thin\",\"#4371c6\"]},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#4371c6\"],\"top\":[\"thin\",\"#4371c6\"],\"left\":[\"thin\",\"#4371c6\"],\"right\":[\"thin\",\"#4371c6\"]},\"align\":\"center\"},{\"font\":{\"size\":8}},{\"font\":{\"size\":8},\"color\":\"#7f7f7f\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#4371c6\"],\"top\":[\"thin\",\"#4371c6\"],\"left\":[\"thin\",\"#4371c6\"],\"right\":[\"thin\",\"#4371c6\"]},\"bgcolor\":\"#9cc2e6\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"bgcolor\":\"#9cc2e6\"},{\"border\":{\"bottom\":[\"thin\",\"#4371c6\"],\"top\":[\"thin\",\"#4371c6\"],\"left\":[\"thin\",\"#4371c6\"],\"right\":[\"thin\",\"#4371c6\"]}},{\"font\":{\"bold\":true}},{\"font\":{\"bold\":true,\"size\":12}},{\"font\":{\"bold\":true,\"size\":16}},{\"font\":{\"bold\":true,\"size\":18}},{\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"align\":\"right\"},{\"align\":\"right\"},{\"align\":\"left\"},{\"align\":\"right\",\"font\":{\"size\":16}},{\"align\":\"left\",\"font\":{\"size\":16}},{\"align\":\"right\",\"font\":{\"size\":14}},{\"align\":\"left\",\"font\":{\"size\":14}},{\"align\":\"center\",\"font\":{\"size\":18,\"bold\":true,\"name\":\"宋体\"}},{\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#4371c6\"],\"top\":[\"thin\",\"#4371c6\"],\"left\":[\"thin\",\"#4371c6\"],\"right\":[\"thin\",\"#4371c6\"]},\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#4371c6\"],\"top\":[\"thin\",\"#4371c6\"],\"left\":[\"thin\",\"#4371c6\"],\"right\":[\"thin\",\"#4371c6\"]},\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"right\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"right\",\"font\":{\"size\":14,\"name\":\"宋体\"}},{\"align\":\"left\",\"font\":{\"size\":14,\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#2e75b5\"],\"top\":[\"thin\",\"#2e75b5\"],\"left\":[\"thin\",\"#2e75b5\"],\"right\":[\"thin\",\"#2e75b5\"]},\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#000100\",\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#ffff01\"],\"top\":[\"thin\",\"#ffff01\"],\"left\":[\"thin\",\"#ffff01\"],\"right\":[\"thin\",\"#ffff01\"]},\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"right\",\"font\":{\"size\":14,\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"color\":\"#000100\",\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"color\":\"#000100\",\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"color\":\"#ffffff\",\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#2e75b5\"],\"top\":[\"thin\",\"#2e75b5\"],\"left\":[\"thin\",\"#2e75b5\"],\"right\":[\"thin\",\"#2e75b5\"]},\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#4371c6\"],\"top\":[\"thin\",\"#4371c6\"],\"left\":[\"thin\",\"#4371c6\"],\"right\":[\"thin\",\"#4371c6\"]},\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#ffffff\",\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]}},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"],\"top\":[\"thin\",\"#d8d8d8\"],\"left\":[\"thin\",\"#d8d8d8\"],\"right\":[\"thin\",\"#d8d8d8\"]},\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#ffffff\",\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#ffffff\",\"bgcolor\":\"#5b9cd6\",\"font\":{\"name\":\"宋体\"},\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]}}],\"validations\":[],\"cols\":{\"0\":{\"width\":31},\"1\":{\"width\":102},\"2\":{\"width\":170},\"3\":{\"width\":147},\"4\":{\"width\":66},\"5\":{\"width\":66},\"6\":{\"width\":84},\"7\":{\"width\":88},\"8\":{\"width\":121},\"len\":26},\"merges\":[\"B1:H1\"]}', '', 'https://static.jeecg.com/designreport/images/xiaoshou_1607310086160.png', 'admin', '2021-01-19 10:46:18', 'admin', '2021-02-02 19:01:02', 1, NULL, NULL, 0, 2096, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('7c02c224a2db56d0350069650033f702', '895666', '核查评估表', '', NULL, 'printinfo', '{\"loopBlockList\":[],\"area\":{\"sri\":5,\"sci\":18,\"eri\":5,\"eci\":18,\"width\":53,\"height\":46},\"printElWidth\":1399,\"excel_config_id\":\"7c02c224a2db56d0350069650033f702\",\"printElHeight\":790,\"rows\":{\"0\":{\"cells\":{\"1\":{\"text\":\"XX县(市、区)YY低保第三方核查评估汇总表\",\"merge\":[0,21],\"style\":386},\"2\":{\"style\":386},\"3\":{\"style\":386},\"4\":{\"style\":386},\"5\":{\"style\":386},\"6\":{\"style\":386},\"7\":{\"style\":386},\"8\":{\"style\":386},\"9\":{\"style\":386},\"10\":{\"style\":386},\"11\":{\"style\":386},\"12\":{\"style\":386},\"13\":{\"style\":386},\"14\":{\"style\":386},\"15\":{\"style\":386},\"16\":{\"style\":386},\"17\":{\"style\":386},\"18\":{\"style\":386},\"19\":{\"style\":386},\"20\":{\"style\":386},\"21\":{\"style\":386},\"22\":{\"style\":386}},\"height\":70},\"1\":{\"cells\":{\"1\":{\"merge\":[0,2],\"style\":403,\"text\":\" 北京市林翠社区\"},\"2\":{\"style\":398,\"text\":\" \"},\"3\":{\"style\":398,\"text\":\" \"},\"4\":{\"merge\":[0,2],\"text\":\"镇(乡、街道办事处)\",\"style\":399},\"5\":{\"style\":399},\"6\":{\"style\":399},\"7\":{\"style\":399,\"merge\":[0,7]},\"8\":{\"style\":400},\"9\":{\"style\":400},\"10\":{\"style\":400},\"11\":{\"style\":400},\"12\":{\"style\":400},\"13\":{\"style\":400},\"14\":{\"style\":400},\"15\":{\"merge\":[0,7],\"text\":\"单位:人、元、套、平方米\",\"style\":398},\"16\":{\"style\":401},\"17\":{\"style\":401},\"18\":{\"style\":401},\"19\":{\"style\":401},\"20\":{\"style\":401},\"21\":{\"style\":401},\"22\":{\"style\":401}}},\"2\":{\"cells\":{\"1\":{\"style\":114},\"2\":{\"style\":114},\"3\":{\"style\":114},\"4\":{\"style\":114},\"5\":{\"style\":114},\"6\":{\"style\":114},\"7\":{\"style\":114},\"8\":{\"style\":114},\"9\":{\"style\":114},\"10\":{\"style\":114},\"11\":{\"style\":114},\"12\":{\"style\":114},\"13\":{\"style\":114},\"14\":{\"style\":114},\"15\":{\"style\":114},\"16\":{\"style\":114},\"17\":{\"style\":114},\"18\":{\"style\":114},\"19\":{\"style\":114},\"20\":{\"style\":114},\"21\":{\"style\":114},\"22\":{\"style\":114}},\"height\":14},\"3\":{\"cells\":{\"1\":{\"style\":406,\"text\":\"村(社区)名称\",\"merge\":[1,0]},\"2\":{\"style\":407,\"text\":\"户主名称\",\"merge\":[1,0]},\"3\":{\"style\":407,\"text\":\"保障编号\",\"merge\":[1,0]},\"4\":{\"style\":408,\"text\":\"家庭人口\",\"merge\":[1,0]},\"5\":{\"style\":409,\"text\":\"家庭住址\",\"merge\":[1,0]},\"6\":{\"style\":409,\"text\":\"联系电话\",\"merge\":[1,0]},\"7\":{\"style\":408,\"text\":\"身份证号码\",\"merge\":[1,0]},\"8\":{\"style\":409,\"text\":\"原保障\",\"merge\":[0,2]},\"9\":{\"style\":377,\"text\":\" \"},\"10\":{\"style\":377,\"text\":\" \"},\"11\":{\"text\":\"核减后月人均收入\",\"style\":408,\"merge\":[1,0]},\"12\":{\"merge\":[0,5],\"text\":\"保障建议\",\"style\":410},\"13\":{\"style\":379,\"text\":\" \"},\"14\":{\"style\":379,\"text\":\" \"},\"15\":{\"style\":379,\"text\":\" \"},\"16\":{\"style\":379,\"text\":\" \"},\"17\":{\"style\":379,\"text\":\" \"},\"18\":{\"text\":\"是否新增对象\",\"style\":411,\"merge\":[1,0]},\"19\":{\"text\":\"建议取消原因\",\"style\":409,\"merge\":[0,3]},\"20\":{\"style\":377,\"text\":\" \"},\"21\":{\"style\":377,\"text\":\" \"},\"22\":{\"style\":377,\"text\":\" \"}}},\"4\":{\"cells\":{\"1\":{\"style\":381,\"text\":\" \"},\"2\":{\"style\":407,\"text\":\" \"},\"3\":{\"style\":382,\"text\":\" \"},\"4\":{\"style\":408,\"text\":\" \"},\"5\":{\"style\":377,\"text\":\" \"},\"6\":{\"style\":409,\"text\":\" \"},\"7\":{\"style\":383,\"text\":\" \"},\"8\":{\"text\":\"户数\",\"style\":412},\"9\":{\"style\":411,\"text\":\"人口\"},\"10\":{\"style\":413,\"text\":\"金额\"},\"11\":{\"style\":383,\"text\":\" \"},\"12\":{\"text\":\"保障类型\",\"style\":408},\"13\":{\"style\":413,\"text\":\"人口\"},\"14\":{\"style\":408,\"text\":\"差额补助\"},\"15\":{\"style\":408,\"text\":\"全额补助\"},\"16\":{\"style\":408,\"text\":\"增发补助\"},\"17\":{\"style\":408,\"text\":\"合计补助\"},\"18\":{\"style\":411,\"text\":\" \"},\"19\":{\"style\":408,\"text\":\"收入超标\"},\"20\":{\"style\":406,\"text\":\"机动车超标\"},\"21\":{\"style\":410,\"text\":\"死亡\"},\"22\":{\"style\":410,\"text\":\"其他\"}},\"height\":50},\"5\":{\"cells\":{\"1\":{\"text\":\"#{hecha.name}\",\"style\":414,\"rendered\":\"\"},\"2\":{\"text\":\"#{hecha.hname}\",\"style\":414},\"3\":{\"text\":\"#{hecha.num}\",\"style\":414},\"4\":{\"text\":\"#{hecha.knum}\",\"style\":414},\"5\":{\"text\":\"#{hecha.zhuzhi}\",\"style\":414},\"6\":{\"text\":\"#{hecha.phone}\",\"style\":414},\"7\":{\"text\":\"#{hecha.scard}\",\"style\":414},\"8\":{\"text\":\"#{hecha.yhnum}\",\"style\":414},\"9\":{\"text\":\"#{hecha.yren}\",\"style\":414},\"10\":{\"text\":\"#{hecha.yjine}\",\"style\":414},\"11\":{\"text\":\"#{hecha.yjine}\",\"style\":414},\"12\":{\"text\":\"#{hecha.type}\",\"style\":414},\"13\":{\"text\":\"#{hecha.rk}\",\"style\":414},\"14\":{\"text\":\"#{hecha.cbz}\",\"style\":414},\"15\":{\"text\":\"#{hecha.cbz}\",\"style\":414},\"16\":{\"text\":\"#{hecha.cbz}\",\"style\":414},\"17\":{\"text\":\"#{hecha.cbz}\",\"style\":414},\"18\":{\"text\":\"#{hecha.sf1}\",\"style\":414},\"19\":{\"text\":\"#{hecha.sf2}\",\"style\":414},\"20\":{\"text\":\"#{hecha.sf3}\",\"style\":414},\"21\":{\"text\":\"#{hecha.sf4}\",\"style\":414},\"22\":{\"text\":\"#{hecha.bz}\",\"style\":414}},\"isDrag\":true,\"height\":46},\"6\":{\"cells\":{\"1\":{\"style\":114},\"2\":{\"style\":114},\"3\":{\"style\":114},\"4\":{\"style\":114},\"5\":{\"style\":114},\"6\":{\"style\":114},\"7\":{\"style\":114},\"8\":{\"style\":114},\"9\":{\"style\":114},\"10\":{\"style\":114},\"11\":{\"style\":114},\"12\":{\"style\":114},\"13\":{\"style\":114},\"14\":{\"style\":114},\"15\":{\"style\":114},\"16\":{\"style\":114},\"17\":{\"style\":114},\"18\":{\"style\":114},\"19\":{\"style\":114},\"20\":{\"style\":114},\"21\":{\"style\":114},\"22\":{\"style\":114}},\"height\":46},\"7\":{\"cells\":{\"1\":{\"style\":114},\"2\":{\"style\":114},\"3\":{\"style\":114},\"4\":{\"style\":114},\"5\":{\"style\":114},\"6\":{\"style\":114},\"7\":{\"style\":114},\"8\":{\"style\":114},\"9\":{\"style\":114},\"10\":{\"style\":114},\"11\":{\"style\":114},\"12\":{\"style\":114},\"13\":{\"style\":114},\"14\":{\"style\":114},\"15\":{\"style\":114},\"16\":{\"style\":114},\"17\":{\"style\":114},\"18\":{\"style\":114},\"19\":{\"style\":114},\"20\":{\"style\":114},\"21\":{\"style\":114},\"22\":{\"style\":114}},\"height\":46},\"8\":{\"cells\":{\"1\":{\"text\":\"\"},\"2\":{\"style\":114},\"3\":{\"style\":114},\"4\":{\"style\":114},\"5\":{\"style\":114},\"6\":{\"style\":114},\"7\":{\"style\":114},\"8\":{\"style\":114},\"9\":{\"style\":114},\"10\":{\"style\":114},\"11\":{\"style\":114},\"12\":{\"style\":114},\"13\":{\"style\":114},\"14\":{\"style\":114},\"15\":{\"style\":114},\"16\":{\"style\":114},\"17\":{\"style\":114},\"18\":{\"style\":114},\"19\":{\"style\":114},\"20\":{\"style\":114},\"21\":{\"style\":114},\"22\":{\"style\":114}},\"isDrag\":true},\"len\":102},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":1378,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true},{\"textwrap\":true},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":false},{\"textwrap\":false},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\"},{\"textwrap\":true,\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"valign\":\"middle\"},{\"textwrap\":true,\"valign\":\"middle\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":false,\"valign\":\"middle\"},{\"textwrap\":false,\"valign\":\"middle\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"valign\":\"bottom\"},{\"textwrap\":true,\"valign\":\"bottom\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"valign\":\"top\"},{\"border\":{\"bottom\":[\"medium\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"size\":18}},{\"align\":\"center\",\"font\":{\"size\":16}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true,\"name\":\"Helvetica\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"}},{\"font\":{\"name\":\"Helvetica\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"font\":{\"name\":\"Helvetica\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Helvetica\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\",\"font\":{\"name\":\"Helvetica\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Helvetica\"}},{\"align\":\"center\",\"font\":{\"name\":\"Helvetica\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Helvetica\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Helvetica\"}},{\"textwrap\":true,\"font\":{\"name\":\"Helvetica\"}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Helvetica\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Helvetica\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Helvetica\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Helvetica\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Helvetica\"}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true,\"name\":\"Source Sans Pro\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"font\":{\"name\":\"Source Sans Pro\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"font\":{\"name\":\"Source Sans Pro\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Source Sans Pro\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\",\"font\":{\"name\":\"Source Sans Pro\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Source Sans Pro\"}},{\"align\":\"center\",\"font\":{\"name\":\"Source Sans Pro\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Source Sans Pro\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Source Sans Pro\"}},{\"textwrap\":true,\"font\":{\"name\":\"Source Sans Pro\"}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Source Sans Pro\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Source Sans Pro\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Source Sans Pro\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Source Sans Pro\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Source Sans Pro\"}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true,\"name\":\"Comic Sans MS\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Comic Sans MS\"}},{\"font\":{\"name\":\"Comic Sans MS\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"font\":{\"name\":\"Comic Sans MS\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Comic Sans MS\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\",\"font\":{\"name\":\"Comic Sans MS\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Comic Sans MS\"}},{\"align\":\"center\",\"font\":{\"name\":\"Comic Sans MS\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Comic Sans MS\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Comic Sans MS\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Comic Sans MS\"}},{\"textwrap\":true,\"font\":{\"name\":\"Comic Sans MS\"}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Comic Sans MS\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Comic Sans MS\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Comic Sans MS\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Comic Sans MS\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Comic Sans MS\"}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true,\"name\":\"Courier New\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"font\":{\"name\":\"Courier New\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"font\":{\"name\":\"Courier New\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Courier New\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\",\"font\":{\"name\":\"Courier New\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Courier New\"}},{\"align\":\"center\",\"font\":{\"name\":\"Courier New\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Courier New\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Courier New\"}},{\"textwrap\":true,\"font\":{\"name\":\"Courier New\"}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Courier New\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Courier New\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Courier New\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Courier New\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Courier New\"}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true,\"name\":\"Verdana\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Verdana\"}},{\"font\":{\"name\":\"Verdana\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"font\":{\"name\":\"Verdana\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Verdana\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\",\"font\":{\"name\":\"Verdana\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Verdana\"}},{\"align\":\"center\",\"font\":{\"name\":\"Verdana\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Verdana\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Verdana\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Verdana\"}},{\"textwrap\":true,\"font\":{\"name\":\"Verdana\"}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Verdana\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Verdana\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Verdana\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Verdana\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Verdana\"}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true,\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Lato\"}},{\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\"}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\"}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\"}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\"}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"textwrap\":true,\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"align\":\"center\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]},\"textwrap\":true,\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]},\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]},\"align\":\"center\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]},\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]},\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"textwrap\":true,\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"align\":\"center\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\"}},{\"align\":\"center\",\"valign\":\"middle\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\",\"valign\":\"middle\"},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"textwrap\":false,\"font\":{\"name\":\"Lato\"}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"textwrap\":true,\"font\":{\"name\":\"Lato\"},\"valign\":\"middle\"},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true,\"name\":\"Lato\"},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"textwrap\":true,\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"textwrap\":true,\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\"},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"top\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]},\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"valign\":\"middle\"},{\"align\":\"center\",\"border\":{\"right\":[\"thin\",\"#ffffff\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]}},{\"align\":\"center\",\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]}},{\"border\":{\"bottom\":[\"thin\",\"#ffffff\"],\"top\":[\"thin\",\"#ffffff\"],\"left\":[\"thin\",\"#ffffff\"],\"right\":[\"thin\",\"#ffffff\"]}},{\"align\":\"center\",\"valign\":\"middle\",\"border\":{\"right\":[\"thin\",\"#ffffff\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"border\":{\"right\":[\"thin\",\"#ffffff\"]}},{\"border\":{\"right\":[\"thin\",\"#ffffff\"]}},{\"align\":\"center\",\"valign\":\"middle\",\"border\":{\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"border\":{\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"border\":{\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"valign\":\"middle\",\"border\":{\"left\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"Lato\"},\"border\":{\"top\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"font\":{\"name\":\"Lato\"},\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"]}},{\"font\":{\"name\":\"Lato\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"]}},{\"font\":{\"name\":\"Lato\"},\"border\":{\"bottom\":[\"thin\",\"#000100\"]},\"align\":\"right\"},{\"font\":{\"name\":\"Lato\"},\"align\":\"right\"},{\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"valign\":\"middle\"},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#5b9cd6\",\"color\":\"#ffffff\",\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"align\":\"center\"},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#ffffff\"},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#ffffff\",\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#000100\"},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#000100\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#000100\"},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#000100\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#000100\"},{\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#000100\",\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#262626\"},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#262626\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#262626\"},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#262626\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#262626\"},{\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#f4b184\",\"color\":\"#262626\",\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#9cc2e6\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#9cc2e6\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#9cc2e6\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#9cc2e6\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#9cc2e6\",\"color\":\"#262626\"},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#9cc2e6\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#9cc2e6\",\"color\":\"#262626\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#9cc2e6\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#9cc2e6\",\"color\":\"#262626\"},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#9cc2e6\",\"color\":\"#262626\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#9cc2e6\",\"color\":\"#262626\"},{\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#9cc2e6\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#9cc2e6\",\"color\":\"#262626\",\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#262626\"},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#262626\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#262626\"},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#262626\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#262626\"},{\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#262626\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#262626\",\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\"},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\",\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#00b04e\",\"color\":\"#ffffff\",\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]},\"align\":\"center\"},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#a7d08c\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#a7d08c\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#a7d08c\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#a7d08c\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#a7d08c\",\"color\":\"#ffffff\"},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#a7d08c\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#a7d08c\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#a7d08c\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#a7d08c\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#a7d08c\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#a7d08c\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#a7d08c\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#a7d08c\",\"color\":\"#ffffff\",\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\"},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":8},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\",\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]},\"align\":\"center\",\"font\":{\"size\":8}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\"},{\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#71ae47\",\"color\":\"#ffffff\",\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\"},{\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\"},{\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#00b04e\"],\"top\":[\"thin\",\"#00b04e\"],\"left\":[\"thin\",\"#00b04e\"],\"right\":[\"thin\",\"#00b04e\"]}},{\"align\":\"center\",\"font\":{\"size\":15,\"bold\":true,\"name\":\"Lato\"}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":9},\"border\":{\"bottom\":[\"thin\",\"#000100\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":9}},{\"font\":{\"name\":\"Lato\",\"size\":9}},{\"font\":{\"size\":9}},{\"align\":\"center\",\"font\":{\"size\":9}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":9},\"border\":{\"bottom\":[\"thin\",\"#000100\"]},\"color\":\"#a5a5a5\"},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":9},\"color\":\"#a5a5a5\"},{\"font\":{\"name\":\"Lato\",\"size\":9},\"color\":\"#a5a5a5\"},{\"font\":{\"size\":9},\"color\":\"#a5a5a5\"},{\"align\":\"center\",\"font\":{\"size\":9},\"color\":\"#a5a5a5\"},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":9},\"border\":{\"bottom\":[\"thin\",\"#000100\"]},\"color\":\"#7f7f7f\"},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":9},\"color\":\"#7f7f7f\"},{\"font\":{\"name\":\"Lato\",\"size\":9},\"color\":\"#7f7f7f\"},{\"font\":{\"size\":9},\"color\":\"#7f7f7f\"},{\"align\":\"center\",\"font\":{\"size\":9},\"color\":\"#7f7f7f\"},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":9},\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]},\"color\":\"#7f7f7f\"},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":9},\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"]},\"color\":\"#7f7f7f\"},{\"border\":{\"bottom\":[\"thin\",\"#d8d8d8\"]},\"align\":\"center\",\"font\":{\"size\":8}},{\"border\":{\"bottom\":[\"thin\",\"#a5a5a5\"]},\"align\":\"center\",\"font\":{\"size\":8}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#a5a5a5\"],\"top\":[\"thin\",\"#a5a5a5\"],\"left\":[\"thin\",\"#a5a5a5\"],\"right\":[\"thin\",\"#a5a5a5\"]}},{\"textwrap\":true,\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#a5a5a5\"],\"top\":[\"thin\",\"#a5a5a5\"],\"left\":[\"thin\",\"#a5a5a5\"],\"right\":[\"thin\",\"#a5a5a5\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#a5a5a5\"],\"top\":[\"thin\",\"#a5a5a5\"],\"left\":[\"thin\",\"#a5a5a5\"],\"right\":[\"thin\",\"#a5a5a5\"]}},{\"align\":\"center\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#a5a5a5\"],\"top\":[\"thin\",\"#a5a5a5\"],\"left\":[\"thin\",\"#a5a5a5\"],\"right\":[\"thin\",\"#a5a5a5\"]}},{\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#a5a5a5\"],\"top\":[\"thin\",\"#a5a5a5\"],\"left\":[\"thin\",\"#a5a5a5\"],\"right\":[\"thin\",\"#a5a5a5\"]}},{\"textwrap\":true,\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#a5a5a5\"],\"top\":[\"thin\",\"#a5a5a5\"],\"left\":[\"thin\",\"#a5a5a5\"],\"right\":[\"thin\",\"#a5a5a5\"]}},{\"textwrap\":true,\"valign\":\"bottom\",\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#a5a5a5\"],\"top\":[\"thin\",\"#a5a5a5\"],\"left\":[\"thin\",\"#a5a5a5\"],\"right\":[\"thin\",\"#a5a5a5\"]}},{\"textwrap\":true,\"font\":{\"name\":\"Lato\",\"size\":10},\"bgcolor\":\"#02a274\",\"color\":\"#ffffff\",\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#a5a5a5\"],\"top\":[\"thin\",\"#a5a5a5\"],\"left\":[\"thin\",\"#a5a5a5\"],\"right\":[\"thin\",\"#a5a5a5\"]}},{\"border\":{\"bottom\":[\"thin\",\"#a5a5a5\"],\"top\":[\"thin\",\"#a5a5a5\"],\"left\":[\"thin\",\"#a5a5a5\"],\"right\":[\"thin\",\"#a5a5a5\"]},\"align\":\"center\",\"font\":{\"size\":8}}],\"validations\":[],\"cols\":{\"0\":{\"width\":30},\"1\":{\"width\":68},\"2\":{\"width\":86},\"3\":{\"width\":93},\"4\":{\"width\":91},\"5\":{\"width\":156},\"6\":{\"width\":95},\"7\":{\"width\":85},\"8\":{\"width\":37},\"9\":{\"width\":30},\"10\":{\"width\":43},\"11\":{\"width\":66},\"12\":{\"width\":38},\"13\":{\"width\":41},\"14\":{\"width\":54},\"15\":{\"width\":49},\"16\":{\"width\":45},\"17\":{\"width\":49},\"18\":{\"width\":53},\"19\":{\"width\":40},\"20\":{\"width\":50},\"21\":{\"width\":40},\"22\":{\"width\":39},\"len\":50},\"merges\":[\"M4:R4\",\"B4:B5\",\"C4:C5\",\"D4:D5\",\"E4:E5\",\"F4:F5\",\"G4:G5\",\"H4:H5\",\"I4:K4\",\"L4:L5\",\"S4:S5\",\"T4:W4\",\"E2:G2\",\"B2:D2\",\"B1:W1\",\"P2:W2\",\"H2:O2\"]}', '', 'https://static.jeecg.com/designreport/images/QQ截图20201207113312_1607312171402.png', 'jeecg', '2020-07-14 16:41:42', 'admin', '2021-02-03 14:01:17', 0, NULL, NULL, 1, 260, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('94b04a1ed7c17f8e96baa6d89fb90758', '3698522', '员工请假单', '', NULL, 'printinfo', '{\"area\":false,\"printElWidth\":794,\"excel_config_id\":\"94b04a1ed7c17f8e96baa6d89fb90758\",\"printElHeight\":1047,\"rows\":{\"1\":{\"cells\":{\"0\":{\"text\":\"员工请假单\",\"style\":100,\"merge\":[0,7]},\"1\":{\"style\":100},\"2\":{\"style\":100},\"3\":{\"style\":100},\"4\":{\"style\":100},\"5\":{\"style\":100},\"6\":{\"style\":100},\"7\":{\"style\":100}},\"height\":65},\"2\":{\"cells\":{\"0\":{\"text\":\"单位:北极星\",\"style\":101,\"merge\":[0,2]},\"1\":{\"style\":101},\"2\":{\"style\":101},\"3\":{\"style\":102},\"4\":{\"style\":102},\"5\":{\"style\":102},\"6\":{\"style\":102},\"7\":{\"style\":102}},\"height\":38},\"3\":{\"cells\":{\"0\":{\"text\":\"姓名\",\"style\":119},\"1\":{\"style\":119,\"text\":\" \"},\"2\":{\"text\":\"工作岗位\",\"style\":120},\"3\":{\"style\":119,\"text\":\" \"},\"4\":{\"text\":\"工作时间\",\"style\":119},\"5\":{\"style\":119,\"text\":\" \"},\"6\":{\"text\":\"出生日期\",\"style\":119},\"7\":{\"style\":119,\"text\":\" \"}}},\"4\":{\"cells\":{\"0\":{\"text\":\"请选择假类型\",\"style\":121,\"merge\":[4,0]},\"1\":{\"text\":\"年休假\",\"style\":120},\"2\":{\"style\":120,\"text\":\"病、事假\"},\"3\":{\"style\":120,\"text\":\"探亲假\"},\"4\":{\"style\":119,\"merge\":[0,1],\"text\":\"婚、丧假\"},\"5\":{\"style\":107,\"text\":\" \"},\"6\":{\"style\":119,\"merge\":[0,1],\"text\":\"生育假\"},\"7\":{\"style\":107,\"text\":\" \"}},\"height\":29},\"5\":{\"cells\":{\"0\":{\"style\":0},\"1\":{\"text\":\"1、公岭满1~9年(5天)\",\"style\":122},\"2\":{\"style\":119,\"text\":\"1、病假\"},\"3\":{\"style\":119,\"text\":\"1、未婚探父母(20天)\"},\"4\":{\"style\":119,\"merge\":[0,1],\"text\":\"1、婚假(3天)\"},\"5\":{\"style\":107,\"text\":\" \"},\"6\":{\"style\":119,\"merge\":[0,1],\"text\":\"1、流产\"},\"7\":{\"style\":107,\"text\":\" \"}},\"height\":25},\"6\":{\"cells\":{\"0\":{\"style\":0},\"1\":{\"style\":123,\"text\":\"2、公岭满10~19年(10天)\"},\"2\":{\"style\":119,\"text\":\"2、事假\"},\"3\":{\"style\":119,\"text\":\"2、已婚探父母(20天)\"},\"4\":{\"style\":119,\"merge\":[0,1],\"text\":\"2、晚婚假(13天)\"},\"5\":{\"style\":107,\"text\":\" \"},\"6\":{\"style\":119,\"merge\":[0,1],\"text\":\"2、产假\"},\"7\":{\"style\":107,\"text\":\" \"}}},\"7\":{\"cells\":{\"0\":{\"style\":0},\"1\":{\"style\":123,\"text\":\"3、公岭满20年(15天)\"},\"2\":{\"style\":119,\"text\":\" \"},\"3\":{\"style\":119,\"text\":\"3、探配偶(30天)\"},\"4\":{\"style\":119,\"merge\":[0,1],\"text\":\"3、丧假(3天)\"},\"5\":{\"style\":107,\"text\":\" \"},\"6\":{\"style\":119,\"merge\":[0,1],\"text\":\"3、哺乳假\"},\"7\":{\"style\":107,\"text\":\" \"}}},\"8\":{\"cells\":{\"0\":{\"style\":0},\"1\":{\"style\":119,\"text\":\" \"},\"2\":{\"style\":119,\"text\":\" \"},\"3\":{\"style\":119,\"text\":\"探亲地点:\",\"merge\":[0,2]},\"4\":{\"style\":107,\"text\":\" \"},\"5\":{\"style\":107,\"text\":\" \"},\"6\":{\"style\":119,\"merge\":[0,1],\"text\":\"4、陪护假\"},\"7\":{\"style\":107,\"text\":\" \"},\"8\":{\"style\":15},\"9\":{\"style\":15},\"10\":{\"style\":15},\"11\":{\"style\":15},\"12\":{\"style\":15},\"13\":{\"style\":15},\"14\":{\"style\":15},\"15\":{\"style\":15},\"16\":{\"style\":15},\"17\":{\"style\":15},\"18\":{\"style\":15},\"19\":{\"style\":15},\"20\":{\"style\":15},\"21\":{\"style\":15},\"22\":{\"style\":15},\"23\":{\"style\":5},\"24\":{\"style\":5},\"25\":{\"style\":5}}},\"9\":{\"cells\":{\"0\":{\"style\":124,\"text\":\"请假时间\"},\"1\":{\"style\":125,\"merge\":[0,6],\"text\":\"2020年02-30 至2020年02-03-30\"},\"2\":{\"style\":115,\"text\":\" \"},\"3\":{\"style\":115,\"text\":\" \"},\"4\":{\"style\":115,\"text\":\" \"},\"5\":{\"style\":115,\"text\":\" \"},\"6\":{\"style\":115,\"text\":\" \"},\"7\":{\"style\":115,\"text\":\" \"}},\"height\":46},\"10\":{\"cells\":{\"0\":{\"style\":126,\"text\":\"审批人员及意见\"},\"1\":{\"merge\":[0,6],\"style\":127,\"text\":\"同意\"},\"2\":{\"style\":118,\"text\":\" \"},\"3\":{\"style\":118,\"text\":\" \"},\"4\":{\"style\":118,\"text\":\" \"},\"5\":{\"style\":118,\"text\":\" \"},\"6\":{\"style\":118,\"text\":\" \"},\"7\":{\"style\":118,\"text\":\" \"}},\"height\":89},\"11\":{\"cells\":{\"0\":{\"text\":\"备注\",\"style\":119},\"1\":{\"style\":119,\"text\":\" \"},\"2\":{\"text\":\"请假人签名\",\"style\":119},\"3\":{\"merge\":[0,4],\"style\":119,\"text\":\" \"},\"4\":{\"style\":107,\"text\":\" \"},\"5\":{\"style\":107,\"text\":\" \"},\"6\":{\"style\":107,\"text\":\" \"},\"7\":{\"style\":107,\"text\":\" \"}},\"height\":90},\"12\":{\"cells\":{\"0\":{\"merge\":[0,7],\"style\":120,\"text\":\"请假审批表一式两份,考勤员与人力资源部门各存一份\"},\"1\":{\"style\":106,\"text\":\" \"},\"2\":{\"style\":106,\"text\":\" \"},\"3\":{\"style\":106,\"text\":\" \"},\"4\":{\"style\":106,\"text\":\" \"},\"5\":{\"style\":106,\"text\":\" \"},\"6\":{\"style\":106,\"text\":\" \"},\"7\":{\"style\":106,\"text\":\" \"}},\"height\":25},\"len\":101},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":789,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"textwrap\":true},{\"textwrap\":false},{\"textwrap\":true,\"valign\":\"middle\"},{\"textwrap\":false,\"valign\":\"middle\"},{\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"textwrap\":false,\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"textwrap\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"textwrap\":false,\"valign\":\"middle\",\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"textwrap\":false,\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"textwrap\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"left\"},{},{\"font\":{\"name\":\"Helvetica\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"}},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"}},{\"align\":\"center\",\"font\":{\"name\":\"Helvetica\"}},{\"textwrap\":false,\"valign\":\"middle\",\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"}},{\"textwrap\":false,\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"}},{\"font\":{\"name\":\"Arial\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Arial\"}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Arial\"}},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Arial\"}},{\"align\":\"center\",\"font\":{\"name\":\"Arial\"}},{\"textwrap\":false,\"valign\":\"middle\",\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Arial\"}},{\"textwrap\":false,\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Arial\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Arial\"}},{\"font\":{\"name\":\"Source Sans Pro\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"align\":\"center\",\"font\":{\"name\":\"Source Sans Pro\"}},{\"textwrap\":false,\"valign\":\"middle\",\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"textwrap\":false,\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"font\":{\"name\":\"Courier New\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"align\":\"center\",\"font\":{\"name\":\"Courier New\"}},{\"textwrap\":false,\"valign\":\"middle\",\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"textwrap\":false,\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"font\":{\"name\":\"Courier New\"},\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"name\":\"Courier New\"},\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"textwrap\":true,\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"textwrap\":true,\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"align\":\"center\"},{\"font\":{\"name\":\"Courier New\"},\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"name\":\"Courier New\",\"size\":14}},{\"align\":\"center\",\"font\":{\"size\":14}},{\"align\":\"center\",\"font\":{\"name\":\"Courier New\",\"size\":14,\"bold\":true}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true}},{\"font\":{\"name\":\"Courier New\"},\"color\":\"#7f7f7f\"},{\"color\":\"#7f7f7f\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"textwrap\":true,\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"Courier New\"},\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"textwrap\":false,\"valign\":\"middle\",\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"textwrap\":false,\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"align\":\"center\",\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"color\":\"#000100\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"color\":\"#000100\"},{\"align\":\"center\",\"color\":\"#000100\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"color\":\"#000100\"},{\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"textwrap\":true,\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"Lato\"},\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"textwrap\":false,\"valign\":\"middle\",\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"textwrap\":false,\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"align\":\"center\",\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"color\":\"#000100\",\"font\":{\"name\":\"Lato\"}},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"color\":\"#000100\",\"font\":{\"name\":\"Lato\"},\"valign\":\"middle\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"color\":\"#000100\",\"font\":{\"name\":\"Lato\"},\"valign\":\"bottom\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"color\":\"#000100\",\"font\":{\"name\":\"Lato\"},\"valign\":\"top\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\",\"valign\":\"top\"},{\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\",\"valign\":\"top\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\",\"valign\":\"middle\"},{\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\",\"valign\":\"middle\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\",\"valign\":\"bottom\"},{\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\",\"valign\":\"bottom\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\",\"textwrap\":true},{\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\",\"textwrap\":true},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\",\"textwrap\":false},{\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\",\"textwrap\":false},{\"textwrap\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"color\":\"#000100\",\"font\":{\"name\":\"Lato\"}},{\"align\":\"center\",\"font\":{\"name\":\"宋体\",\"size\":14,\"bold\":true}},{\"font\":{\"name\":\"宋体\"},\"color\":\"#7f7f7f\"},{\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\"},{\"textwrap\":true,\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"宋体\"},\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"textwrap\":false,\"valign\":\"middle\",\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\"},{\"textwrap\":false,\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"},\"align\":\"center\",\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"color\":\"#000100\",\"font\":{\"name\":\"宋体\"},\"valign\":\"top\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\",\"valign\":\"top\"},{\"align\":\"center\",\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\",\"valign\":\"top\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"color\":\"#000100\",\"font\":{\"name\":\"宋体\"},\"valign\":\"bottom\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\",\"textwrap\":false},{\"align\":\"center\",\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\",\"textwrap\":false},{\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"font\":{\"name\":\"宋体\"},\"align\":\"center\",\"color\":\"#000100\"},{\"textwrap\":false,\"valign\":\"middle\",\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\"},{\"textwrap\":false,\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"color\":\"#000100\",\"font\":{\"name\":\"宋体\"},\"valign\":\"top\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\",\"valign\":\"top\"},{\"textwrap\":true,\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"color\":\"#000100\",\"font\":{\"name\":\"宋体\"},\"valign\":\"bottom\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#262626\"],\"top\":[\"thin\",\"#262626\"],\"left\":[\"thin\",\"#262626\"],\"right\":[\"thin\",\"#262626\"]},\"font\":{\"name\":\"宋体\"},\"color\":\"#000100\",\"textwrap\":false}],\"validations\":[],\"cols\":{\"0\":{\"width\":35},\"1\":{\"width\":195},\"2\":{\"width\":77},\"3\":{\"width\":168},\"4\":{\"width\":62},\"6\":{\"width\":70},\"7\":{\"width\":82},\"len\":26},\"merges\":[\"D9:F9\",\"E5:F5\",\"E6:F6\",\"E7:F7\",\"E8:F8\",\"G5:H5\",\"G6:H6\",\"G7:H7\",\"G8:H8\",\"G9:H9\",\"B10:H10\",\"B11:H11\",\"D12:H12\",\"A13:H13\",\"A3:C3\",\"A2:H2\",\"A5:A9\"]}', '', 'https://static.jeecg.com/designreport/images/QQ截图20201207135257_1607320433681.png', 'jeecg', '2020-07-10 18:29:39', 'admin', '2021-02-03 14:01:12', 0, NULL, NULL, 1, 142, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('961455b47c0b86dc961e90b5893bff05', '56780774', '阜阳检票数查询副本0774', '', NULL, 'printinfo', '{\"area\":{\"sri\":8,\"sci\":6,\"eri\":8,\"eci\":6,\"width\":75,\"height\":25},\"printElWidth\":794,\"excel_config_id\":\"53c82a76f837d5661dceec7d93afafec\",\"printElHeight\":1047,\"rows\":{\"0\":{\"cells\":{\"0\":{\"style\":58},\"1\":{\"text\":\"\",\"style\":66},\"2\":{\"style\":66},\"3\":{\"style\":67,\"merge\":[0,3],\"text\":\"阜阳火车站检票数\"},\"4\":{\"style\":67},\"5\":{\"style\":67},\"6\":{\"style\":67},\"7\":{\"style\":66},\"8\":{\"style\":66},\"9\":{\"style\":58}},\"height\":63},\"1\":{\"cells\":{\"0\":{\"style\":58},\"1\":{\"style\":66},\"2\":{\"style\":66},\"3\":{\"style\":66},\"4\":{\"style\":66},\"5\":{\"style\":66},\"6\":{\"style\":66},\"7\":{\"style\":66},\"8\":{\"style\":66},\"9\":{\"style\":58}},\"height\":20},\"2\":{\"cells\":{\"0\":{\"style\":58},\"1\":{\"text\":\"日期:\",\"style\":68},\"2\":{\"text\":\"${gongsi.tdata}\",\"style\":69},\"3\":{\"style\":66},\"4\":{\"style\":66,\"text\":\"制表人:\"},\"5\":{\"text\":\"${gongsi.gname}\",\"style\":66},\"6\":{\"style\":66},\"7\":{\"text\":\"\",\"merge\":[0,1],\"style\":70},\"8\":{\"style\":70},\"9\":{\"style\":58}},\"isDrag\":true},\"3\":{\"cells\":{\"0\":{\"style\":58},\"1\":{\"text\":\"班次\",\"merge\":[1,0],\"style\":71},\"2\":{\"text\":\"发车时间\",\"merge\":[1,0],\"style\":71},\"3\":{\"text\":\"是否放空\",\"merge\":[1,0],\"style\":71},\"4\":{\"text\":\"路线\",\"merge\":[0,1],\"style\":71},\"5\":{\"style\":72},\"6\":{\"text\":\"核载座位数\",\"merge\":[1,0],\"style\":71},\"7\":{\"merge\":[1,0],\"style\":71,\"text\":\"检票数\"},\"8\":{\"merge\":[1,0],\"style\":71,\"text\":\"实载率(%)\"},\"9\":{\"style\":58}}},\"4\":{\"cells\":{\"0\":{\"style\":58},\"1\":{\"style\":72},\"2\":{\"style\":71},\"3\":{\"style\":72},\"4\":{\"text\":\"从\",\"style\":71},\"5\":{\"text\":\"到\",\"style\":71},\"6\":{\"style\":72},\"7\":{\"style\":71},\"8\":{\"style\":72},\"9\":{\"style\":58}},\"height\":25},\"5\":{\"cells\":{\"0\":{\"style\":58},\"1\":{\"style\":73,\"text\":\"#{jianpiao.bnum}\"},\"2\":{\"style\":73,\"text\":\"#{jianpiao.ftime}\"},\"3\":{\"style\":73,\"text\":\"#{jianpiao.sfkong}\"},\"4\":{\"style\":73,\"text\":\"#{jianpiao.kaishi}\"},\"5\":{\"style\":73,\"text\":\"#{jianpiao.jieshu}\"},\"6\":{\"style\":73,\"text\":\"#{jianpiao.hezairen}\"},\"7\":{\"style\":73,\"text\":\"#{jianpiao.jpnum}\"},\"8\":{\"style\":73,\"text\":\"#{jianpiao.shihelv}\"},\"9\":{\"style\":58}},\"height\":33},\"6\":{\"cells\":{\"1\":{\"text\":\"\",\"style\":11},\"2\":{\"style\":11},\"3\":{\"style\":11},\"4\":{\"style\":11},\"5\":{\"style\":11},\"6\":{\"style\":11},\"7\":{\"style\":11},\"8\":{\"style\":11}},\"isDrag\":true},\"7\":{\"cells\":{\"1\":{\"style\":11},\"2\":{\"style\":11,\"text\":\"\"},\"3\":{\"style\":11},\"4\":{\"style\":11},\"5\":{\"style\":11},\"6\":{\"style\":11},\"7\":{\"style\":11},\"8\":{\"style\":11}}},\"8\":{\"cells\":{\"1\":{\"style\":11},\"2\":{\"style\":11},\"3\":{\"style\":11},\"4\":{\"style\":11},\"5\":{\"style\":11},\"6\":{\"style\":11},\"7\":{\"style\":11},\"8\":{\"style\":11}}},\"9\":{\"cells\":{\"1\":{\"style\":11},\"2\":{\"style\":11},\"3\":{\"style\":11},\"4\":{\"style\":11},\"5\":{\"style\":11},\"6\":{\"style\":11},\"7\":{\"style\":11},\"8\":{\"style\":11}}},\"10\":{\"cells\":{\"1\":{\"style\":11},\"2\":{\"style\":11},\"3\":{\"style\":11},\"4\":{\"style\":11},\"5\":{\"style\":11},\"6\":{\"style\":11},\"7\":{\"style\":11},\"8\":{\"style\":11}}},\"11\":{\"cells\":{\"1\":{\"style\":11},\"2\":{\"style\":11},\"3\":{\"style\":11},\"4\":{\"style\":11},\"5\":{\"style\":11},\"6\":{\"style\":11},\"7\":{\"style\":11},\"8\":{\"style\":11}}},\"12\":{\"cells\":{\"1\":{\"style\":11},\"2\":{\"style\":11},\"3\":{\"style\":11},\"4\":{\"style\":11},\"5\":{\"style\":11},\"6\":{\"style\":11},\"7\":{\"style\":11},\"8\":{\"style\":11}}},\"13\":{\"cells\":{\"1\":{\"style\":11},\"2\":{\"style\":11},\"3\":{\"style\":11},\"4\":{\"style\":11},\"5\":{\"style\":11},\"6\":{\"style\":11},\"7\":{\"style\":11},\"8\":{\"style\":11}}},\"14\":{\"cells\":{\"1\":{\"style\":11},\"2\":{\"style\":11},\"3\":{\"style\":11},\"4\":{\"style\":11},\"5\":{\"style\":11},\"6\":{\"style\":11},\"7\":{\"style\":11},\"8\":{\"style\":11}}},\"len\":96,\"-1\":{\"cells\":{\"-1\":{\"text\":\"${gongsi.id}\"}},\"isDrag\":true}},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":737,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"center\"},{\"align\":\"center\",\"border\":{\"top\":[\"thin\",\"#000\"],\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"top\":[\"thin\",\"#000\"],\"bottom\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"top\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"top\":[\"thin\",\"#000\"],\"bottom\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"top\":[\"thin\",\"#000\"],\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{},{\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"],\"top\":[\"thin\",\"#7f7f7f\"],\"left\":[\"thin\",\"#7f7f7f\"],\"right\":[\"thin\",\"#7f7f7f\"]}},{\"border\":{\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"]}},{\"border\":{\"top\":[\"thin\",\"#000100\"]}},{\"border\":{\"top\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"left\":[\"thin\",\"#000100\"]}},{\"border\":{\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"top\":[\"thin\",\"#7f7f7f\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]}},{\"border\":{\"right\":[\"thin\",\"#7f7f7f\"],\"bottom\":[\"thin\",\"#7f7f7f\"]}},{\"border\":{\"bottom\":[\"thin\",\"#7f7f7f\"]}},{\"border\":{\"right\":[\"thin\",\"#7f7f7f\"]}},{\"align\":\"center\",\"font\":{\"size\":16}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true}},{\"font\":{\"bold\":true}},{\"font\":{\"bold\":false}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"bold\":true}},{\"align\":\"center\",\"font\":{\"bold\":true}},{\"align\":\"right\"},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"bold\":true},\"bgcolor\":\"#4371c6\"},{\"align\":\"center\",\"font\":{\"bold\":true},\"bgcolor\":\"#4371c6\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"bold\":false},\"bgcolor\":\"#4371c6\"},{\"align\":\"center\",\"font\":{\"bold\":false},\"bgcolor\":\"#4371c6\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"bold\":false},\"bgcolor\":\"#2e75b5\"},{\"align\":\"center\",\"font\":{\"bold\":false},\"bgcolor\":\"#2e75b5\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"bold\":false},\"bgcolor\":\"#5b9cd6\"},{\"align\":\"center\",\"font\":{\"bold\":false},\"bgcolor\":\"#5b9cd6\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"bold\":false},\"bgcolor\":\"#0170c1\"},{\"align\":\"center\",\"font\":{\"bold\":false},\"bgcolor\":\"#0170c1\"},{\"font\":{\"bold\":false},\"color\":\"#7f7f7f\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"bold\":false},\"bgcolor\":\"#9cc2e6\"},{\"align\":\"center\",\"font\":{\"bold\":false},\"bgcolor\":\"#9cc2e6\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000100\"],\"top\":[\"thin\",\"#000100\"],\"left\":[\"thin\",\"#000100\"],\"right\":[\"thin\",\"#000100\"]},\"font\":{\"bold\":false},\"bgcolor\":\"#01b0f1\"},{\"align\":\"center\",\"font\":{\"bold\":false},\"bgcolor\":\"#01b0f1\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"font\":{\"bold\":false},\"bgcolor\":\"#5b9cd6\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"font\":{\"bold\":false},\"bgcolor\":\"#9cc2e6\"},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true},\"valign\":\"bottom\"},{\"align\":\"center\",\"font\":{\"size\":22,\"bold\":true},\"valign\":\"bottom\"},{\"align\":\"center\",\"font\":{\"size\":18,\"bold\":true},\"valign\":\"bottom\"},{\"font\":{\"bold\":false},\"color\":\"#7f7f7f\",\"align\":\"right\"},{\"color\":\"#7f7f7f\"},{\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"size\":18,\"bold\":true,\"name\":\"宋体\"},\"valign\":\"bottom\"},{\"font\":{\"bold\":false,\"name\":\"宋体\"},\"color\":\"#7f7f7f\",\"align\":\"right\"},{\"color\":\"#7f7f7f\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"right\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"font\":{\"bold\":false,\"name\":\"宋体\"},\"bgcolor\":\"#9cc2e6\"},{\"align\":\"center\",\"font\":{\"bold\":false,\"name\":\"宋体\"},\"bgcolor\":\"#9cc2e6\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"font\":{\"name\":\"宋体\"}},{\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"font\":{\"size\":18,\"bold\":true,\"name\":\"Microsoft YaHei\"},\"valign\":\"bottom\"},{\"font\":{\"bold\":false,\"name\":\"Microsoft YaHei\"},\"color\":\"#7f7f7f\",\"align\":\"right\"},{\"color\":\"#7f7f7f\",\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"right\",\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"font\":{\"bold\":false,\"name\":\"Microsoft YaHei\"},\"bgcolor\":\"#9cc2e6\"},{\"align\":\"center\",\"font\":{\"bold\":false,\"name\":\"Microsoft YaHei\"},\"bgcolor\":\"#9cc2e6\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"font\":{\"name\":\"Microsoft YaHei\"}}],\"validations\":[],\"cols\":{\"0\":{\"width\":53},\"1\":{\"width\":118},\"2\":{\"width\":75},\"3\":{\"width\":54},\"4\":{\"width\":95},\"5\":{\"width\":109},\"6\":{\"width\":75},\"7\":{\"width\":75},\"8\":{\"width\":83},\"9\":{\"width\":30},\"len\":27},\"merges\":[\"E4:F4\",\"B4:B5\",\"C4:C5\",\"D4:D5\",\"G4:G5\",\"H4:H5\",\"I4:I5\",\"D1:G1\",\"H3:I3\"]}', '', 'https://static.jeecg.com/designreport/images/25_1597233573577.png', 'admin', '2021-01-19 10:46:45', 'admin', '2021-02-03 13:58:22', 0, NULL, NULL, 0, 697, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('9dbadaee8720767efe3164a7d018c870', '45566', '发票打印', '', NULL, 'printinfo', '{\"area\":{\"sri\":8,\"sci\":4,\"eri\":8,\"eci\":4,\"width\":100,\"height\":25},\"printElWidth\":794,\"excel_config_id\":\"9dbadaee8720767efe3164a7d018c870\",\"printElHeight\":500,\"rows\":{\"0\":{\"cells\":{\"0\":{\"text\":\"\",\"virtual\":\"RTA6TUIKs1pmgVOM\"},\"1\":{\"text\":\" \",\"virtual\":\"RTA6TUIKs1pmgVOM\"},\"2\":{\"text\":\" \",\"virtual\":\"RTA6TUIKs1pmgVOM\"},\"3\":{\"text\":\" \",\"virtual\":\"RTA6TUIKs1pmgVOM\"},\"4\":{\"text\":\" \",\"virtual\":\"RTA6TUIKs1pmgVOM\"},\"5\":{\"text\":\" \",\"virtual\":\"RTA6TUIKs1pmgVOM\"},\"6\":{\"text\":\" \",\"virtual\":\"RTA6TUIKs1pmgVOM\"},\"7\":{\"text\":\" \",\"virtual\":\"RTA6TUIKs1pmgVOM\"},\"8\":{\"text\":\" \",\"virtual\":\"RTA6TUIKs1pmgVOM\"}}},\"2\":{\"cells\":{},\"height\":11},\"3\":{\"cells\":{\"2\":{\"text\":\"\"},\"5\":{\"text\":\"\"}},\"height\":18},\"4\":{\"cells\":{\"2\":{\"text\":\"182123434\",\"style\":0},\"5\":{\"text\":\"12345678\"}},\"height\":15},\"5\":{\"cells\":{\"2\":{\"text\":\"\"}}},\"7\":{\"cells\":{}},\"8\":{\"cells\":{\"1\":{\"text\":\"餐饮\"},\"2\":{\"text\":\" A11\"},\"3\":{\"text\":\" 333 3\"},\"4\":{\"text\":\" 3 4\"},\"5\":{\"text\":\" 1\"},\"6\":{\"text\":\"3333\"}}},\"9\":{\"cells\":{\"1\":{\"text\":\"测试\"},\"2\":{\"text\":\" mmm\"},\"3\":{\"text\":\" 33 5\"}}},\"10\":{\"cells\":{},\"height\":22},\"11\":{\"cells\":{\"2\":{\"text\":\" \"},\"3\":{\"text\":\"343434\"},\"6\":{\"text\":\"3434\"}},\"height\":45},\"12\":{\"cells\":{\"4\":{\"text\":\" 刮开中奖\"}},\"height\":12},\"13\":{\"cells\":{\"2\":{\"text\":\"\"},\"4\":{\"text\":\" \"},\"5\":{\"text\":\"备注\"}},\"height\":31},\"14\":{\"cells\":{\"1\":{\"text\":\" 张三\"},\"3\":{\"text\":\"完成\"},\"4\":{\"text\":\" 李思\"}},\"height\":41},\"len\":100},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":847,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"font\":{\"size\":8}}],\"validations\":[],\"cols\":{\"0\":{\"width\":93},\"1\":{\"width\":74},\"2\":{\"width\":80},\"len\":26},\"merges\":[],\"imgList\":[{\"row\":0,\"col\":0,\"width\":\"832\",\"height\":\"480\",\"src\":\"https://static.jeecg.com/designreport/images/套打_1609313052910.png\",\"isBackend\":true,\"commonBackend\":true,\"layer_id\":\"RTA6TUIKs1pmgVOM\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[0,0],[0,1],[0,2],[0,3],[0,4],[0,5],[0,6],[0,7],[0,8]]}]}', '', 'https://static.jeecg.com/designreport/images/QQ截图20201207113651_1607312223499.png', 'jeecg', '2020-07-20 18:55:59', 'admin', '2021-02-03 13:38:49', 0, NULL, NULL, 0, 1125, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('a250846887abe01217aab173d3006489', '56663', '不动产打印', '', NULL, 'printinfo', '{\"loopBlockList\":[],\"area\":false,\"excel_config_id\":\"a250846887abe01217aab173d3006489\",\"printConfig\":{\"paper\":\"A4\",\"width\":210,\"height\":297,\"definition\":1,\"isBackend\":true,\"marginX\":10,\"marginY\":10},\"rows\":{\"0\":{\"cells\":{\"0\":{\"text\":\" \",\"virtual\":\"BJ9o6oelCr85EpT2\"},\"1\":{\"text\":\" \",\"virtual\":\"BJ9o6oelCr85EpT2\"},\"2\":{\"text\":\" \",\"virtual\":\"BJ9o6oelCr85EpT2\"},\"3\":{\"text\":\" \",\"virtual\":\"BJ9o6oelCr85EpT2\"},\"4\":{\"text\":\" \",\"virtual\":\"BJ9o6oelCr85EpT2\"},\"5\":{\"text\":\" \",\"virtual\":\"BJ9o6oelCr85EpT2\"},\"6\":{\"text\":\" \",\"virtual\":\"BJ9o6oelCr85EpT2\"},\"7\":{\"text\":\" \",\"virtual\":\"BJ9o6oelCr85EpT2\"},\"8\":{\"text\":\" \",\"virtual\":\"BJ9o6oelCr85EpT2\"},\"9\":{\"text\":\" \",\"virtual\":\"BJ9o6oelCr85EpT2\"}},\"isDrag\":true,\"height\":45},\"1\":{\"cells\":{},\"height\":23},\"2\":{\"cells\":{\"0\":{\"text\":\"\",\"style\":0},\"1\":{\"text\":\" ${budong.yname}\",\"style\":21,\"merge\":[0,2]}},\"isDrag\":true,\"height\":34},\"3\":{\"cells\":{\"1\":{\"text\":\" ${budong.chanquan}\",\"style\":0,\"merge\":[0,2]},\"5\":{\"text\":\"${budong.beizhu}\",\"merge\":[5,3]}},\"isDrag\":true,\"height\":39},\"4\":{\"cells\":{\"1\":{\"text\":\" ${budong.zhuzhi}\",\"style\":39,\"merge\":[0,2]}},\"isDrag\":true,\"height\":33},\"5\":{\"cells\":{\"1\":{\"text\":\" ${budong.danyuan}\",\"style\":0,\"merge\":[0,2]}},\"isDrag\":true,\"height\":53},\"6\":{\"cells\":{\"1\":{\"text\":\" ${budong.type}\",\"style\":0,\"merge\":[0,2]}},\"isDrag\":true,\"height\":47},\"7\":{\"cells\":{\"1\":{\"text\":\" ${budong.xtype}\",\"style\":0,\"merge\":[0,2]}},\"isDrag\":true,\"height\":38},\"8\":{\"cells\":{\"1\":{\"text\":\" ${budong.suoyou}\",\"style\":0,\"merge\":[0,2]}},\"isDrag\":true,\"height\":31},\"9\":{\"cells\":{\"1\":{\"text\":\" ${budong.mianji}\",\"style\":0,\"merge\":[0,2]}},\"isDrag\":true,\"height\":45},\"10\":{\"cells\":{\"1\":{\"text\":\" ${budong.riqi}\",\"style\":0,\"merge\":[0,2]}},\"isDrag\":true,\"height\":26},\"11\":{\"cells\":{\"1\":{\"text\":\"\",\"style\":0,\"merge\":[0,2]}},\"height\":35},\"12\":{\"cells\":{\"1\":{\"text\":\"\",\"style\":0},\"2\":{\"text\":\"${budong.chanquan}\",\"style\":0,\"merge\":[4,1]}},\"isDrag\":true},\"13\":{\"cells\":{}},\"14\":{\"cells\":{}},\"15\":{\"cells\":{}},\"16\":{\"cells\":{},\"height\":5},\"17\":{\"cells\":{\"2\":{\"text\":\"\",\"style\":0}},\"isDrag\":true,\"height\":33},\"18\":{\"cells\":{\"2\":{\"style\":0,\"text\":\"\"}}},\"len\":100,\"-1\":{\"cells\":{\"0\":{\"text\":\"#{budong.zhuzhi}\"},\"-1\":{\"text\":\"#{budong.suoyou}\"}},\"isDrag\":true}},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":1024,\"displayConfig\":{},\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"font\":{\"bold\":true}},{\"font\":{\"italic\":true}},{\"font\":{\"italic\":true,\"bold\":true}},{\"font\":{\"italic\":true,\"bold\":false}},{\"font\":{\"italic\":false,\"bold\":false}},{\"font\":{\"italic\":false,\"bold\":true}},{\"align\":\"left\"},{\"align\":\"center\"},{\"align\":\"right\"},{\"align\":\"left\",\"valign\":\"top\"},{\"align\":\"left\",\"valign\":\"top\",\"font\":{\"bold\":true}},{\"font\":{\"bold\":false}},{\"align\":\"left\",\"valign\":\"bottom\"},{\"valign\":\"bottom\"},{\"align\":\"center\",\"valign\":\"bottom\"},{\"textwrap\":true},{\"font\":{\"bold\":true},\"valign\":\"bottom\"},{\"font\":{\"italic\":false,\"bold\":true},\"valign\":\"top\"},{\"valign\":\"top\"},{\"textwrap\":true,\"font\":{\"bold\":true}},{\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"bold\":true}},{\"align\":\"left\",\"valign\":\"bottom\",\"font\":{\"bold\":true}},{\"align\":\"left\",\"valign\":\"bottom\",\"font\":{\"bold\":true,\"size\":8}},{\"font\":{\"bold\":true,\"size\":8},\"valign\":\"bottom\"},{\"align\":\"center\",\"valign\":\"bottom\",\"font\":{\"bold\":true,\"size\":8}},{\"align\":\"left\",\"valign\":\"middle\",\"font\":{\"bold\":true}},{\"align\":\"left\",\"valign\":\"middle\"},{\"font\":{\"italic\":false,\"bold\":true},\"valign\":\"bottom\"},{\"font\":{\"italic\":false,\"bold\":true},\"valign\":\"middle\"},{\"valign\":\"middle\"},{\"font\":{\"italic\":true,\"bold\":true},\"valign\":\"middle\"},{\"valign\":\"middle\",\"font\":{\"italic\":true}},{\"valign\":\"middle\",\"font\":{\"italic\":false}},{\"font\":{\"italic\":false,\"bold\":false},\"valign\":\"middle\"},{\"align\":\"center\",\"valign\":\"middle\",\"font\":{\"bold\":true,\"size\":8}},{\"font\":{\"bold\":true,\"size\":8},\"valign\":\"middle\"},{\"align\":\"left\",\"valign\":\"middle\",\"font\":{\"bold\":true,\"size\":8}},{\"align\":\"right\",\"valign\":\"middle\",\"font\":{\"bold\":true,\"size\":8}},{\"font\":{\"italic\":false,\"bold\":true},\"valign\":\"middle\",\"align\":\"center\"},{\"font\":{\"italic\":false,\"bold\":true},\"valign\":\"middle\",\"align\":\"left\"},{\"align\":\"right\",\"valign\":\"bottom\"},{\"align\":\"right\",\"valign\":\"bottom\",\"font\":{\"bold\":true,\"size\":8}},{\"align\":\"center\",\"valign\":\"middle\"}],\"validations\":[],\"cols\":{\"0\":{\"width\":107},\"1\":{\"width\":54},\"2\":{\"width\":135},\"3\":{\"width\":180},\"6\":{\"width\":123},\"8\":{\"width\":25},\"len\":50},\"merges\":[\"B1:B2\",\"B12:D12\",\"B9:D9\",\"B7:D7\",\"B6:D6\",\"B5:D5\",\"B3:D3\",\"B11:D11\",\"B8:D8\",\"B10:D10\",\"C13:D17\",\"C1:C2\",\"B4:D4\",\"F4:I9\",\"D1:D2\"],\"imgList\":[{\"row\":0,\"col\":0,\"width\":\"950\",\"height\":\"683\",\"src\":\"https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/images/38_1610456500965_1617247643815.jpg\",\"isBackend\":true,\"commonBackend\":true,\"layer_id\":\"BJ9o6oelCr85EpT2\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[0,0],[0,1],[0,2],[0,3],[0,4],[0,5],[0,6],[0,7],[0,8],[0,9]]}]}', '', 'https://static.jeecg.com/designreport/images/24_1597233568822.png', 'jeecg', '2020-07-09 10:48:22', 'admin', '2021-06-30 10:16:05', 0, NULL, NULL, 1, 1414, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('a9f068972508920cd4aab831814f0c04', '23445', '逮捕证', '', NULL, 'printinfo', '{\"loopBlockList\":[],\"area\":false,\"excel_config_id\":\"a9f068972508920cd4aab831814f0c04\",\"printConfig\":{\"paper\":\"A4\",\"width\":210,\"height\":297,\"definition\":1,\"isBackend\":false,\"marginX\":10,\"marginY\":10},\"rows\":{\"0\":{\"cells\":{\"2\":{\"text\":\"\",\"merge\":[0,9],\"style\":324},\"12\":{}},\"isDrag\":true,\"height\":55},\"1\":{\"cells\":{\"1\":{\"style\":410,\"merge\":[0,13],\"text\":\"兰州市经济侦查大队\"},\"15\":{\"style\":324,\"text\":\" \"}},\"height\":128},\"2\":{\"cells\":{\"1\":{\"style\":411,\"merge\":[0,13],\"text\":\"逮捕令\"},\"15\":{\"style\":324,\"text\":\" \"}},\"height\":41},\"3\":{\"cells\":{\"1\":{\"style\":412,\"merge\":[0,12],\"text\":\"第123459663号\"},\"14\":{\"style\":413,\"text\":\" \"}},\"height\":60},\"4\":{\"cells\":{\"1\":{\"style\":414,\"text\":\" \"},\"2\":{\"text\":\" 根据《中华人民共和国刑事诉讼法》第七十八条之规定,\",\"style\":341,\"merge\":[0,11]},\"14\":{\"style\":413,\"text\":\" \"}},\"height\":43},\"5\":{\"cells\":{\"1\":{\"style\":414,\"text\":\" \"},\"2\":{\"style\":341,\"text\":\"经\",\"merge\":[0,1]},\"4\":{\"text\":\"${pdaibu.pname}\",\"style\":342,\"merge\":[0,9]},\"14\":{\"style\":413,\"text\":\" \"}},\"isDrag\":true,\"height\":47},\"6\":{\"cells\":{\"1\":{\"style\":414,\"text\":\" \"},\"2\":{\"style\":344,\"text\":\" \",\"merge\":[0,2]},\"5\":{\"merge\":[0,3],\"text\":\"批准,兹由我局对涉嫌\",\"style\":338},\"9\":{\"text\":\"${pdaibu.shiqing}\",\"style\":347,\"merge\":[0,4]},\"14\":{\"style\":413,\"text\":\" \"}},\"isDrag\":true,\"height\":49},\"7\":{\"cells\":{\"1\":{\"style\":414,\"text\":\" \"},\"2\":{\"style\":341,\"text\":\"的\"},\"3\":{\"text\":\"${pdaibu.fname}\",\"style\":345,\"merge\":[0,1]},\"5\":{\"text\":\"(性别\",\"style\":343},\"6\":{\"text\":\"${pdaibu.fsex}\",\"style\":347,\"merge\":[0,1]},\"8\":{\"style\":346,\"text\":\"出生日期\"},\"9\":{\"text\":\"${pdaibu.cdata}\",\"style\":345,\"merge\":[0,4]},\"14\":{\"style\":413,\"text\":\" \"}},\"isDrag\":true,\"height\":51},\"8\":{\"cells\":{\"1\":{\"style\":414,\"text\":\" \"},\"2\":{\"text\":\"${pdaibu.zhuzhi}\",\"style\":345,\"merge\":[0,7]},\"10\":{\"style\":341,\"text\":\"执行逮捕,送兰州\",\"merge\":[0,3]},\"14\":{\"style\":413,\"text\":\" \"}},\"isDrag\":true,\"height\":51},\"9\":{\"cells\":{\"1\":{\"style\":414,\"text\":\" \"},\"2\":{\"style\":341,\"merge\":[0,6],\"text\":\"市经济侦查大队羁押。\"},\"9\":{\"style\":341,\"text\":\" \"},\"10\":{\"style\":341,\"merge\":[5,1],\"text\":\" \"},\"14\":{\"style\":413,\"text\":\" \"}},\"height\":57},\"10\":{\"cells\":{\"1\":{\"style\":414,\"text\":\" \"},\"4\":{\"style\":338,\"virtual\":\"DId4FGTLnP3vfp4y\",\"text\":\" \"},\"5\":{\"style\":338,\"virtual\":\"DId4FGTLnP3vfp4y\",\"text\":\" \"},\"6\":{\"style\":338,\"virtual\":\"DId4FGTLnP3vfp4y\",\"text\":\" \"},\"14\":{\"style\":413,\"text\":\" \"}},\"height\":61},\"11\":{\"cells\":{\"1\":{\"style\":414,\"text\":\" \"},\"6\":{\"style\":376,\"merge\":[0,2],\"text\":\" \"},\"14\":{\"style\":413,\"text\":\" \"}},\"height\":83},\"12\":{\"cells\":{\"1\":{\"style\":414,\"text\":\" \"},\"2\":{\"merge\":[0,6],\"style\":338,\"text\":\" \"},\"14\":{\"style\":413,\"text\":\" \"}},\"height\":14},\"13\":{\"cells\":{\"1\":{\"style\":414,\"text\":\" \"},\"2\":{\"style\":351,\"merge\":[0,5],\"text\":\" \"},\"8\":{\"style\":380,\"text\":\"公安局印\"},\"9\":{\"text\":\" \",\"virtual\":\"XefZfpEcdS3wI6Ae\"},\"10\":{\"text\":\" \",\"virtual\":\"XefZfpEcdS3wI6Ae\"},\"11\":{\"text\":\" \",\"virtual\":\"XefZfpEcdS3wI6Ae\"},\"14\":{\"style\":413,\"text\":\" \"}},\"height\":89},\"14\":{\"cells\":{\"1\":{\"style\":414,\"text\":\" \"},\"14\":{\"style\":413,\"text\":\" \"}},\"height\":21},\"15\":{\"cells\":{\"1\":{\"style\":415,\"text\":\" \"},\"2\":{\"style\":416,\"text\":\" \"},\"3\":{\"style\":417,\"text\":\" \"},\"4\":{\"style\":417,\"text\":\" \"},\"5\":{\"style\":417,\"text\":\" \"},\"6\":{\"text\":\"${pdaibu.gdata}\",\"style\":421,\"merge\":[0,6]},\"13\":{\"style\":417,\"text\":\" \"},\"14\":{\"style\":419,\"text\":\" \"}},\"isDrag\":true,\"height\":168},\"len\":88,\"-1\":{\"cells\":{\"1\":{\"text\":\"#{daibu.fdata}\"},\"-1\":{\"text\":\"#{pdaibu.shiqing}\"}},\"isDrag\":true}},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":718,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":709,\"displayConfig\":{},\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"left\"},{\"align\":\"left\",\"underline\":true},{\"underline\":true},{\"align\":\"center\",\"underline\":true},{\"align\":\"center\"},{\"align\":\"center\",\"underline\":false},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":16}},{\"font\":{\"size\":16}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16}},{\"align\":\"center\",\"underline\":false,\"font\":{\"size\":16}},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16}},{\"align\":\"left\",\"font\":{\"size\":16,\"bold\":true}},{\"font\":{\"size\":16,\"bold\":true}},{\"align\":\"center\",\"underline\":false,\"font\":{\"size\":16,\"bold\":true}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16,\"bold\":true}},{\"font\":{\"bold\":true}},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16,\"bold\":true}},{\"align\":\"left\",\"font\":{\"size\":16,\"bold\":false}},{\"font\":{\"size\":16,\"bold\":false}},{\"align\":\"center\",\"underline\":false,\"font\":{\"size\":16,\"bold\":false}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16,\"bold\":false}},{\"font\":{\"bold\":false}},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16,\"bold\":false}},{\"align\":\"left\",\"font\":{\"size\":16,\"bold\":false},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":16,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"underline\":false,\"font\":{\"size\":16,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16,\"bold\":false},\"color\":\"#3f3f3f\"},{\"font\":{\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":16,\"bold\":false},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"underline\":false,\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\",\"align\":\"center\"},{\"font\":{\"size\":12},\"align\":\"center\"},{\"font\":{\"size\":8}},{\"font\":{\"size\":10}},{\"font\":{\"size\":10,\"bold\":true}},{\"font\":{\"size\":10,\"bold\":true},\"align\":\"center\"},{\"font\":{\"size\":18,\"bold\":true},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":18}},{\"font\":{\"size\":16,\"bold\":true},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":16}},{\"font\":{\"size\":12},\"valign\":\"bottom\"},{\"font\":{\"size\":12},\"valign\":\"middle\"},{\"font\":{\"size\":12},\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"top\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"top\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"left\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"valign\":\"middle\",\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"right\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"border\":{\"right\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"right\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12},\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"border\":{\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"left\":[\"dashed\",\"#000\"]}},{\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"font\":{\"size\":12,\"bold\":true},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true}},{\"font\":{\"size\":14,\"bold\":true},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14}},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"}},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"name\":\"Arial\"}},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Arial\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Arial\"}},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Arial\"}},{\"font\":{\"name\":\"Arial\"}},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"}},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"},\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"name\":\"Source Sans Pro\"}},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Source Sans Pro\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Source Sans Pro\"}},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"}},{\"font\":{\"name\":\"Source Sans Pro\"}},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Source Sans Pro\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"name\":\"Source Sans Pro\"},\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Source Sans Pro\"}},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"},\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Comic Sans MS\"}},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"name\":\"Comic Sans MS\"}},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Comic Sans MS\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Comic Sans MS\"}},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"}},{\"font\":{\"name\":\"Comic Sans MS\"}},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Comic Sans MS\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"name\":\"Comic Sans MS\"},\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Comic Sans MS\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Comic Sans MS\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Comic Sans MS\"}},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"name\":\"Courier New\"}},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Courier New\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Courier New\"}},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Courier New\"}},{\"font\":{\"name\":\"Courier New\"}},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"}},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"top\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Courier New\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Courier New\"},\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Courier New\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"top\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Arial\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Arial\"},\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Arial\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"border\":{\"top\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Helvetica\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Helvetica\"},\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Helvetica\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"top\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Lato\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]},\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":10,\"name\":\"Lato\"},\"valign\":\"middle\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"center\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"color\":\"#000100\",\"align\":\"right\"},{\"align\":\"right\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"left\",\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"left\",\"color\":\"#000100\",\"valign\":\"top\"},{\"align\":\"left\",\"valign\":\"top\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"left\",\"color\":\"#000100\",\"valign\":\"middle\"},{\"align\":\"left\",\"valign\":\"middle\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"left\",\"color\":\"#000100\",\"valign\":\"bottom\"},{\"align\":\"left\",\"valign\":\"bottom\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\",\"valign\":\"bottom\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"left\":[\"thick\",\"#000\"]},\"align\":\"right\",\"color\":\"#000100\",\"valign\":\"bottom\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"font\":{\"size\":14,\"bold\":true,\"name\":\"Lato\"},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\",\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"right\",\"color\":\"#000100\",\"valign\":\"bottom\"},{\"align\":\"left\",\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"underline\":false,\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"color\":\"#000100\",\"align\":\"right\"},{\"font\":{\"size\":12,\"name\":\"Lato\",\"bold\":true},\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"color\":\"#000100\"},{\"border\":{\"right\":[\"thin\",\"#000\"]}},{},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"color\":\"#000100\",\"align\":\"right\"},{\"font\":{\"size\":12,\"name\":\"Lato\",\"bold\":true},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"align\":\"right\",\"color\":\"#000100\",\"valign\":\"bottom\"},{\"align\":\"center\",\"underline\":false,\"font\":{\"size\":12,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":12},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"right\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":12}},{\"align\":\"center\",\"font\":{\"bold\":false}},{\"align\":\"center\",\"font\":{\"bold\":false,\"size\":12}},{\"align\":\"center\",\"font\":{\"bold\":false,\"size\":12},\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"valign\":\"top\"},{\"font\":{\"size\":14,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"center\"},{\"font\":{\"size\":14}},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":16,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":14,\"name\":\"Lato\"},\"align\":\"right\",\"color\":\"#000100\",\"valign\":\"bottom\"},{\"align\":\"left\",\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"align\":\"center\",\"font\":{\"bold\":false,\"size\":14},\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"font\":{\"name\":\"Lato\",\"size\":14},\"color\":\"#000100\"},{\"align\":\"left\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"center\"},{\"font\":{\"size\":14},\"align\":\"center\",\"border\":{\"bottom\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"]},\"font\":{\"size\":14}},{\"align\":\"left\",\"font\":{\"size\":14}},{\"align\":\"left\",\"font\":{\"name\":\"Lato\",\"size\":14},\"color\":\"#000100\"},{\"font\":{\"size\":14,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"right\"},{\"align\":\"left\",\"valign\":\"top\",\"font\":{\"size\":14}},{\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":14,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"center\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":16,\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":14,\"name\":\"Lato\"},\"align\":\"right\",\"color\":\"#000100\",\"valign\":\"bottom\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"bold\":false,\"size\":14},\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\"},{\"border\":{\"right\":[\"thick\",\"#000\"]},\"font\":{\"size\":14}},{\"align\":\"left\",\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"name\":\"Lato\",\"size\":14},\"color\":\"#000100\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":14,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"center\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":14},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":14,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"right\",\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"right\",\"border\":{\"bottom\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":14},\"border\":{\"bottom\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"bold\":false,\"size\":14}},{\"font\":{\"size\":14},\"align\":\"center\"},{\"font\":{\"size\":14,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"center\",\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":14,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"center\",\"border\":{\"top\":[\"thick\",\"#000\"]}},{\"border\":{\"top\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"right\",\"border\":{\"bottom\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":14},\"align\":\"right\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"size\":12}},{\"font\":{\"size\":14},\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thick\",\"#000\"]},\"font\":{\"size\":12},\"align\":\"center\"},{\"align\":\"left\",\"valign\":\"middle\",\"font\":{\"size\":14}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"size\":24}},{\"font\":{\"size\":24}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"size\":22}},{\"font\":{\"size\":22}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"size\":18}},{\"font\":{\"size\":18}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"size\":18,\"bold\":true}},{\"font\":{\"size\":18,\"bold\":true}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"size\":18,\"bold\":true},\"align\":\"center\"},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"size\":18,\"bold\":false},\"align\":\"center\"},{\"font\":{\"size\":18,\"bold\":false},\"align\":\"center\"},{\"font\":{\"size\":14,\"bold\":true}},{\"border\":{\"top\":[\"thick\",\"#000\"]},\"font\":{\"size\":18,\"bold\":false},\"align\":\"center\",\"valign\":\"bottom\"},{\"font\":{\"size\":18,\"bold\":false},\"align\":\"center\",\"valign\":\"bottom\"},{\"valign\":\"bottom\"},{\"valign\":\"bottom\",\"align\":\"right\"},{\"valign\":\"bottom\",\"align\":\"right\",\"font\":{\"size\":14}},{\"font\":{\"size\":18,\"bold\":false},\"align\":\"center\",\"valign\":\"bottom\",\"border\":{\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14},\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"valign\":\"bottom\",\"align\":\"right\",\"font\":{\"size\":14},\"border\":{\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"left\",\"font\":{\"size\":14,\"bold\":false,\"name\":\"Lato\"},\"color\":\"#000100\",\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"bold\":false,\"size\":14},\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":14},\"align\":\"center\",\"border\":{\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":18,\"bold\":false},\"align\":\"center\",\"valign\":\"bottom\",\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14},\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"valign\":\"bottom\",\"align\":\"right\",\"font\":{\"size\":14},\"border\":{\"left\":[\"thick\",\"#000\"],\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":14},\"align\":\"center\",\"border\":{\"right\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":18,\"bold\":false},\"align\":\"center\",\"valign\":\"bottom\",\"border\":{\"top\":[\"thick\",\"#000\"],\"left\":[\"thick\",\"#000\"]}},{\"valign\":\"bottom\",\"align\":\"right\",\"font\":{\"size\":14},\"border\":{\"left\":[\"thick\",\"#000\"]}},{\"font\":{\"size\":18,\"bold\":false},\"align\":\"center\",\"valign\":\"bottom\",\"border\":{\"top\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"],\"right\":[\"medium\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"bold\":true,\"size\":14},\"border\":{\"left\":[\"medium\",\"#000\"],\"right\":[\"medium\",\"#000\"]}},{\"valign\":\"bottom\",\"align\":\"right\",\"font\":{\"size\":14},\"border\":{\"left\":[\"medium\",\"#000\"]}},{\"border\":{\"right\":[\"medium\",\"#000\"]}},{\"border\":{\"left\":[\"medium\",\"#000\"]}},{\"border\":{\"bottom\":[\"medium\",\"#000\"],\"left\":[\"medium\",\"#000\"]}},{\"font\":{\"size\":12,\"name\":\"Lato\"},\"color\":\"#000100\",\"align\":\"right\",\"border\":{\"bottom\":[\"medium\",\"#000\"]}},{\"border\":{\"bottom\":[\"medium\",\"#000\"]}},{\"font\":{\"size\":12},\"align\":\"center\",\"border\":{\"bottom\":[\"medium\",\"#000\"]}},{\"border\":{\"bottom\":[\"medium\",\"#000\"],\"right\":[\"medium\",\"#000\"]}},{\"align\":\"center\",\"font\":{\"bold\":false,\"size\":14},\"border\":{\"top\":[\"thin\",\"#000\"],\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"font\":{\"size\":12},\"align\":\"right\",\"border\":{\"bottom\":[\"medium\",\"#000\"]}},{\"font\":{\"size\":12},\"align\":\"right\"}],\"validations\":[],\"cols\":{\"0\":{\"width\":18},\"1\":{\"width\":21},\"2\":{\"width\":27},\"3\":{\"width\":6},\"4\":{\"width\":87},\"5\":{\"width\":51},\"6\":{\"width\":51},\"7\":{\"width\":1},\"8\":{\"width\":86},\"9\":{\"width\":163},\"10\":{\"width\":1},\"11\":{\"width\":60},\"12\":{\"width\":45},\"13\":{\"width\":49},\"14\":{\"width\":23},\"15\":{\"width\":20},\"len\":50},\"merges\":[\"D8:E8\",\"C6:D6\",\"C10:I10\",\"G8:H8\",\"C9:J9\",\"C1:L1\",\"K10:L15\",\"C13:I13\",\"C14:H14\",\"F7:I7\",\"G12:I12\",\"G16:M16\",\"B4:N4\",\"C5:N5\",\"E6:N6\",\"J7:N7\",\"C7:E7\",\"K9:N9\",\"B2:O2\",\"B3:O3\",\"J8:N8\"],\"imgList\":[{\"row\":13,\"col\":9,\"width\":\"168\",\"height\":\"158\",\"src\":\"https://static.jeecg.com/designreport/images/QQ截图20210105214919_1610075317075.png\",\"layer_id\":\"XefZfpEcdS3wI6Ae\",\"offsetX\":0,\"offsetY\":0,\"virtualCellRange\":[[13,9],[13,10],[13,11]]}]}', '', 'https://static.jeecg.com/designreport/images/逮捕令_1607070625878.png', 'jeecg', '2020-07-10 13:38:40', 'admin', '2021-04-01 03:17:16', 0, NULL, NULL, 1, 2505, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('dd482bfd6ca470a0f49d9bb4e61ec694', '202101081046034402', '实习证明副本4402', NULL, NULL, 'printinfo', '{\"area\":false,\"printElWidth\":570,\"excel_config_id\":\"1347373863746539520\",\"printElHeight\":1047,\"rows\":{\"6\":{\"cells\":{\"2\":{\"merge\":[0,1],\"text\":\"实习证明\",\"style\":2},\"3\":{\"style\":2}},\"height\":50},\"8\":{\"cells\":{\"1\":{\"text\":\"#{tt.name}\",\"style\":3},\"2\":{\"merge\":[0,2],\"text\":\"同学在我公司与 2020年4月1日 至 2020年5月1日 实习。\"}}},\"9\":{\"cells\":{\"1\":{\"text\":\"\"}},\"isDrag\":true},\"12\":{\"cells\":{\"1\":{\"merge\":[4,3],\"text\":\"#{tt.pingjia}\",\"style\":6},\"2\":{\"style\":6},\"3\":{\"style\":6},\"4\":{\"style\":6}}},\"13\":{\"cells\":{\"1\":{\"style\":6},\"2\":{\"style\":6},\"3\":{\"style\":6},\"4\":{\"style\":6}}},\"14\":{\"cells\":{\"1\":{\"style\":6},\"2\":{\"style\":6},\"3\":{\"style\":6},\"4\":{\"style\":6}}},\"15\":{\"cells\":{\"1\":{\"style\":6},\"2\":{\"style\":6},\"3\":{\"style\":6},\"4\":{\"style\":6}}},\"16\":{\"cells\":{\"1\":{\"style\":6},\"2\":{\"style\":6},\"3\":{\"style\":6},\"4\":{\"style\":6}}},\"17\":{\"cells\":{\"1\":{\"text\":\"特此证明!\"}}},\"20\":{\"cells\":{\"2\":{\"text\":\"\"},\"3\":{\"text\":\"\",\"style\":3},\"4\":{\"text\":\"\"}}},\"21\":{\"cells\":{\"4\":{\"text\":\"\"}}},\"22\":{\"cells\":{\"3\":{\"text\":\"证明人:\",\"style\":3},\"4\":{\"text\":\"#{tt.lingdao}\"}}},\"23\":{\"cells\":{\"4\":{\"text\":\"#{tt.shijian}\"}}},\"len\":100},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":487,\"background\":{\"path\":\"https://static.jeecg.com/designreport/images/report_1595906079684_1610075686629.png\",\"repeat\":\"no-repeat\",\"width\":\"\",\"height\":\"\"},\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"center\"},{\"align\":\"center\",\"font\":{\"size\":14}},{\"align\":\"center\",\"font\":{\"size\":16}},{\"align\":\"right\"},{\"align\":\"left\"},{\"align\":\"left\",\"valign\":\"top\"},{\"align\":\"left\",\"valign\":\"top\",\"textwrap\":true}],\"validations\":[],\"cols\":{\"0\":{\"width\":82},\"1\":{\"width\":86},\"4\":{\"width\":119},\"len\":26},\"merges\":[\"C7:D7\",\"C9:E9\",\"B13:E17\"]}', NULL, 'https://static.jeecg.com/designreport/images/未标题-1_1610074948259.png', 'admin', '2021-01-18 13:21:18', 'admin', '2021-02-02 19:01:05', 1, NULL, NULL, 0, 94, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('f5f275b5e28b45256ef24587ec792f0c', '202101081641215447', '实例:来源收入统计副本5447', NULL, NULL, 'datainfo', '{\"loopBlockList\":[],\"chartList\":[{\"row\":1,\"col\":1,\"colspan\":8,\"rowspan\":12,\"width\":\"675\",\"height\":\"289\",\"config\":\"{\\\"legend\\\":{\\\"padding\\\":[25,20,25,10],\\\"data\\\":[\\\"中国石油全资(集团所属)\\\",\\\"中国石油全资(股份所属)\\\",\\\"中石油控股或有控股权\\\",\\\"中石油参股\\\",\\\"非中石油\\\"],\\\"top\\\":\\\"top\\\",\\\"orient\\\":\\\"vertical\\\",\\\"left\\\":\\\"right\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#333\\\",\\\"fontSize\\\":12}},\\\"series\\\":[{\\\"isRose\\\":false,\\\"data\\\":[{\\\"name\\\":\\\"中国石油全资(集团所属)\\\",\\\"value\\\":38460270.57,\\\"itemStyle\\\":{\\\"color\\\":\\\"#E46C8A\\\"}},{\\\"name\\\":\\\"中国石油全资(股份所属)\\\",\\\"value\\\":227595.77,\\\"itemStyle\\\":{\\\"color\\\":\\\"#FCDE43\\\"}},{\\\"name\\\":\\\"中石油控股或有控股权\\\",\\\"value\\\":679926.75,\\\"itemStyle\\\":{\\\"color\\\":\\\"#01A8E1\\\"}},{\\\"name\\\":\\\"中石油参股\\\",\\\"value\\\":72062.75,\\\"itemStyle\\\":{\\\"color\\\":\\\"#99CC00\\\"}},{\\\"name\\\":\\\"非中石油\\\",\\\"value\\\":1698597.62,\\\"itemStyle\\\":{\\\"color\\\":\\\"#800080\\\"}}],\\\"isRadius\\\":false,\\\"roseType\\\":\\\"\\\",\\\"notCount\\\":false,\\\"center\\\":[320,180],\\\"name\\\":\\\"total\\\",\\\"minAngle\\\":0,\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"outside\\\",\\\"textStyle\\\":{\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bolder\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"55%\\\",\\\"autoSort\\\":false}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{b} : {c}\\\",\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#fff\\\",\\\"fontSize\\\":18}},\\\"title\\\":{\\\"show\\\":true,\\\"top\\\":5,\\\"text\\\":\\\"来源收入统计\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#c23531\\\",\\\"fontWeight\\\":\\\"bolder\\\",\\\"fontSize\\\":18},\\\"left\\\":\\\"center\\\",\\\"padding\\\":[5,20,5,10]}}\",\"url\":\"\",\"extData\":{\"dataType\":\"sql\",\"apiStatus\":\"\",\"apiUrl\":\"\",\"dataId\":\"4af57d343f1d6521b71b85097b580786\",\"axisX\":\"biz_income\",\"axisY\":\"total\",\"series\":\"\",\"yText\":\"total\",\"xText\":\"biz_income\",\"dbCode\":\"tmp_report_data_income\",\"dataId1\":\"\",\"source\":\"\",\"target\":\"\",\"isTiming\":true,\"intervalTime\":\"5\",\"chartType\":\"pie.simple\",\"id\":\"\"},\"layer_id\":\"nVUy533exgQ70OPb\",\"offsetX\":0,\"offsetY\":0,\"backgroud\":{\"enabled\":false,\"color\":\"#fff\",\"image\":\"\"},\"virtualCellRange\":[[1,1],[1,2],[1,3],[1,4],[1,5],[1,6],[1,7],[1,8]]}],\"area\":{\"sri\":15,\"sci\":14,\"eri\":15,\"eci\":14,\"width\":100,\"height\":25},\"excel_config_id\":\"f5f275b5e28b45256ef24587ec792f0c\",\"printConfig\":{\"paper\":\"A4\",\"width\":210,\"height\":297,\"definition\":1,\"isBackend\":false,\"marginX\":10,\"marginY\":10,\"layout\":\"portrait\"},\"zonedEditionList\":[],\"rows\":{\"1\":{\"cells\":{\"1\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"},\"2\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"},\"3\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"},\"4\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"},\"5\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"},\"6\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"},\"7\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"},\"8\":{\"text\":\" \",\"virtual\":\"nVUy533exgQ70OPb\"}}},\"3\":{\"cells\":{}},\"16\":{\"cells\":{\"1\":{\"text\":\"业务来源\",\"style\":1},\"2\":{\"text\":\"保险经纪佣金费\",\"style\":1},\"3\":{\"text\":\"风险咨询费\",\"style\":1},\"4\":{\"text\":\"承保公证评估费\",\"style\":1},\"5\":{\"text\":\"保险公证费\",\"style\":1},\"6\":{\"text\":\"投标咨询费\",\"style\":1},\"7\":{\"text\":\"内控咨询费\",\"style\":1},\"8\":{\"text\":\"总计\",\"style\":1}}},\"17\":{\"cells\":{\"1\":{\"text\":\"#{tmp_report_data_income.biz_income}\",\"style\":0},\"2\":{\"text\":\"#{tmp_report_data_income.bx_jj_yongjin}\",\"style\":0},\"3\":{\"text\":\"#{tmp_report_data_income.bx_zx_money}\",\"style\":0},\"4\":{\"text\":\"#{tmp_report_data_income.chengbao_gz_money}\",\"style\":0},\"5\":{\"text\":\"#{tmp_report_data_income.bx_gg_moeny}\",\"style\":0},\"6\":{\"text\":\"#{tmp_report_data_income.tb_zx_money}\",\"style\":0},\"7\":{\"text\":\"#{tmp_report_data_income.neikong_zx_money}\",\"style\":0},\"8\":{\"text\":\"#{tmp_report_data_income.total}\",\"style\":0}},\"isDrag\":true,\"height\":24},\"len\":58},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"rpbar\":{\"show\":true,\"btnList\":[]},\"freeze\":\"A1\",\"dataRectWidth\":701,\"displayConfig\":{},\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#33CCCC\"}],\"validations\":[],\"cols\":{\"0\":{\"width\":15},\"1\":{\"width\":105},\"2\":{\"width\":119},\"3\":{\"width\":87},\"4\":{\"width\":61},\"5\":{\"width\":63},\"6\":{\"width\":60},\"7\":{\"width\":91},\"len\":50},\"merges\":[]}', NULL, NULL, 'admin', '2021-01-18 13:21:14', 'admin', '2021-10-11 09:47:48', 0, NULL, NULL, 0, 104, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('f6ee801e8bdc28ba9d63f95dc65ccd79', '4556633', '采购单', '', NULL, 'printinfo', '{\"loopBlockList\":[],\"area\":false,\"excel_config_id\":\"f6ee801e8bdc28ba9d63f95dc65ccd79\",\"printConfig\":{\"paper\":\"A4\",\"width\":210,\"height\":297,\"definition\":1,\"isBackend\":false,\"marginX\":10,\"marginY\":10},\"rows\":{\"0\":{\"cells\":{\"1\":{\"text\":\"采购单\",\"style\":21,\"merge\":[0,6]}},\"height\":89},\"1\":{\"cells\":{\"1\":{\"text\":\"产品名称\",\"style\":23},\"2\":{\"text\":\"产品数量\",\"style\":23},\"3\":{\"text\":\"单价\",\"style\":23},\"4\":{\"text\":\"库存量\",\"style\":23},\"5\":{\"text\":\"库存总值\",\"style\":23},\"6\":{\"text\":\"订购量\",\"style\":23},\"7\":{\"text\":\"二次订购量\",\"style\":23}},\"height\":45},\"2\":{\"cells\":{\"1\":{\"style\":24,\"text\":\"#{caigou.cname}\"},\"2\":{\"style\":24,\"text\":\"#{caigou.cnum}\"},\"3\":{\"style\":24,\"text\":\"#{caigou.cprice}\"},\"4\":{\"style\":24,\"text\":\"#{caigou.ctotal}\"},\"5\":{\"style\":24,\"text\":\"#{caigou.tp}\"},\"6\":{\"style\":24,\"text\":\"#{caigou.dtotal}\"},\"7\":{\"style\":24,\"text\":\"#{caigou.ztotal}\"}},\"height\":26},\"5\":{\"cells\":{\"1\":{\"text\":\"\"}},\"isDrag\":true},\"6\":{\"cells\":{\"1\":{\"text\":\"\"}},\"isDrag\":true},\"7\":{\"cells\":{\"1\":{\"text\":\"\"},\"2\":{\"text\":\"\"}},\"isDrag\":true},\"len\":100},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":718,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":682,\"displayConfig\":{},\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"align\":\"center\"},{\"align\":\"center\",\"color\":\"#000100\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#01b0f1\"],\"top\":[\"thin\",\"#01b0f1\"],\"left\":[\"thin\",\"#01b0f1\"],\"right\":[\"thin\",\"#01b0f1\"]}},{\"border\":{\"bottom\":[\"thin\",\"#01b0f1\"],\"top\":[\"thin\",\"#01b0f1\"],\"left\":[\"thin\",\"#01b0f1\"],\"right\":[\"thin\",\"#01b0f1\"]}},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#01b0f1\"],\"top\":[\"thin\",\"#01b0f1\"],\"left\":[\"thin\",\"#01b0f1\"],\"right\":[\"thin\",\"#01b0f1\"]},\"bgcolor\":\"#01b0f1\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"bgcolor\":\"#01b0f1\"},{\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]}},{\"align\":\"center\",\"font\":{\"size\":18}},{\"align\":\"center\",\"font\":{\"size\":18,\"bold\":true}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true}},{\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"align\":\"center\"},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"bgcolor\":\"#9cc2e6\"},{\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true,\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#5b9cd6\"],\"top\":[\"thin\",\"#5b9cd6\"],\"left\":[\"thin\",\"#5b9cd6\"],\"right\":[\"thin\",\"#5b9cd6\"]},\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#9cc2e6\",\"font\":{\"name\":\"宋体\"}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"align\":\"center\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#000100\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#5b9cd6\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#5b9cd6\",\"font\":{\"name\":\"宋体\"}},{\"align\":\"center\",\"font\":{\"size\":16,\"bold\":true,\"name\":\"Microsoft YaHei\"}},{\"font\":{\"name\":\"Microsoft YaHei\"}},{\"align\":\"center\",\"color\":\"#ffffff\",\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"bgcolor\":\"#5b9cd6\",\"font\":{\"name\":\"Microsoft YaHei\"}},{\"border\":{\"bottom\":[\"thin\",\"#bfbfbf\"],\"top\":[\"thin\",\"#bfbfbf\"],\"left\":[\"thin\",\"#bfbfbf\"],\"right\":[\"thin\",\"#bfbfbf\"]},\"align\":\"center\",\"font\":{\"name\":\"Microsoft YaHei\"}}],\"validations\":[],\"cols\":{\"0\":{\"width\":43},\"1\":{\"width\":114},\"2\":{\"width\":109},\"3\":{\"width\":78},\"4\":{\"width\":77},\"5\":{\"width\":84},\"6\":{\"width\":82},\"7\":{\"width\":95},\"len\":50},\"merges\":[\"B1:H1\"]}', '', 'https://static.jeecg.com/designreport/images/caigou_1607310279439.png', 'jeecg', '2020-07-28 16:54:44', 'admin', '2021-04-01 03:09:41', 0, NULL, NULL, 1, 1248, NULL, NULL); +INSERT INTO `jimu_report` VALUES ('ff9bd143582a6dfed897ba8b6f93b175', '56696', '销售公司出库单', '', NULL, 'printinfo', '{\"area\":{\"sri\":4,\"sci\":0,\"eri\":4,\"eci\":0,\"width\":32,\"height\":25},\"printElWidth\":794,\"excel_config_id\":\"ff9bd143582a6dfed897ba8b6f93b175\",\"printElHeight\":800,\"rows\":{\"0\":{\"cells\":{\"0\":{\"style\":11,\"text\":\"医疗器械销售公司出货单\",\"merge\":[0,9]}},\"height\":83},\"1\":{\"cells\":{\"0\":{\"text\":\"供货单位:\",\"style\":20,\"merge\":[0,1]},\"1\":{\"style\":30},\"2\":{\"text\":\"${gongsi.gname}\",\"style\":19},\"3\":{\"style\":19},\"4\":{\"text\":\"供货日期:\",\"style\":19},\"5\":{\"text\":\"${gongsi.gdata}\",\"style\":19,\"merge\":[0,1]},\"6\":{\"style\":19},\"7\":{\"text\":\"编号:\",\"style\":20},\"8\":{\"text\":\"${gongsi.num}\",\"style\":19,\"merge\":[0,1]},\"9\":{\"style\":19}},\"isDrag\":true},\"2\":{\"cells\":{\"0\":{\"text\":\"行号\",\"style\":39},\"1\":{\"text\":\"产品代码\",\"style\":39},\"2\":{\"text\":\"产品名称\",\"style\":39},\"3\":{\"text\":\"规格型号\",\"style\":39},\"4\":{\"text\":\"单位\",\"style\":39},\"5\":{\"text\":\"实发数量\",\"style\":39},\"6\":{\"text\":\"销售单价(元)\",\"style\":39},\"7\":{\"text\":\"折扣率(%)\",\"style\":39},\"8\":{\"text\":\"销售金额(元)\",\"style\":39},\"9\":{\"text\":\"备注\",\"style\":39}}},\"3\":{\"cells\":{\"0\":{\"style\":35,\"text\":\"#{xiaoshou.id}\"},\"1\":{\"style\":35,\"text\":\"#{xiaoshou.hnum}\"},\"2\":{\"style\":35,\"text\":\"#{xiaoshou.hname}\"},\"3\":{\"style\":35,\"text\":\"#{xiaoshou.xinghao}\"},\"4\":{\"style\":35,\"text\":\"#{xiaoshou.danwei}\"},\"5\":{\"style\":35,\"text\":\"#{xiaoshou.num}\"},\"6\":{\"style\":35,\"text\":\"#{xiaoshou.danjia}\"},\"7\":{\"style\":35,\"text\":\"#{xiaoshou.zhekoulv}\"},\"8\":{\"style\":35,\"text\":\"#{xiaoshou.xiaoshoujine}\"},\"9\":{\"style\":35,\"text\":\"#{xiaoshou.xiaoshoujine}\"}}},\"4\":{\"cells\":{\"0\":{\"style\":4},\"1\":{}},\"isDrag\":true},\"len\":84,\"-1\":{\"cells\":{\"0\":{\"text\":\"#{gongsi.gdata}\"},\"-1\":{\"text\":\"#{gongsi.didian}\"}},\"isDrag\":true}},\"dbexps\":[],\"toolPrintSizeObj\":{\"printType\":\"A4\",\"widthPx\":794,\"heightPx\":1047},\"dicts\":[],\"freeze\":\"A1\",\"dataRectWidth\":794,\"background\":false,\"name\":\"sheet1\",\"autofilter\":{},\"styles\":[{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\"},{\"font\":{\"size\":16}},{\"font\":{\"size\":16},\"align\":\"center\"},{\"align\":\"center\"},{\"border\":{\"top\":[\"thin\",\"#000\"],\"bottom\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"bottom\":[\"thin\",\"#000\"]}},{\"border\":{\"top\":[\"thin\",\"#000\"],\"bottom\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]}},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"right\"},{\"align\":\"right\"},{\"align\":\"center\",\"font\":{\"size\":14}},{\"align\":\"center\",\"font\":{\"size\":14,\"bold\":true}},{\"align\":\"center\",\"font\":{\"size\":9}},{\"font\":{\"size\":9}},{\"align\":\"right\",\"font\":{\"size\":9}},{\"align\":\"center\",\"font\":{\"size\":8}},{\"font\":{\"size\":8}},{\"align\":\"right\",\"font\":{\"size\":8}},{\"align\":\"center\",\"font\":{\"size\":8},\"color\":\"#7f7f7f\"},{\"font\":{\"size\":8},\"color\":\"#7f7f7f\"},{\"align\":\"right\",\"font\":{\"size\":8},\"color\":\"#7f7f7f\"},{\"align\":\"center\",\"font\":{\"size\":8},\"color\":\"#3f3f3f\"},{\"font\":{\"size\":8},\"color\":\"#3f3f3f\"},{\"align\":\"right\",\"font\":{\"size\":8},\"color\":\"#3f3f3f\"},{\"align\":\"center\",\"font\":{\"size\":8},\"color\":\"#262626\"},{\"font\":{\"size\":8},\"color\":\"#262626\"},{\"align\":\"right\",\"font\":{\"size\":8},\"color\":\"#262626\"},{\"align\":\"center\",\"font\":{\"size\":8},\"color\":\"#0c0c0c\"},{\"font\":{\"size\":8},\"color\":\"#0c0c0c\"},{\"align\":\"right\",\"font\":{\"size\":8},\"color\":\"#0c0c0c\"},{\"align\":\"right\",\"color\":\"#7f7f7f\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"align\":\"center\",\"bgcolor\":\"#71ae47\"},{\"border\":{\"bottom\":[\"thin\",\"#000\"],\"top\":[\"thin\",\"#000\"],\"left\":[\"thin\",\"#000\"],\"right\":[\"thin\",\"#000\"]},\"bgcolor\":\"#71ae47\"},{\"border\":{\"bottom\":[\"thin\",\"#538136\"],\"top\":[\"thin\",\"#538136\"],\"left\":[\"thin\",\"#538136\"],\"right\":[\"thin\",\"#538136\"]},\"align\":\"center\",\"bgcolor\":\"#71ae47\"},{\"border\":{\"bottom\":[\"thin\",\"#538136\"],\"top\":[\"thin\",\"#538136\"],\"left\":[\"thin\",\"#538136\"],\"right\":[\"thin\",\"#538136\"]},\"bgcolor\":\"#71ae47\"},{\"border\":{\"bottom\":[\"thin\",\"#538136\"],\"top\":[\"thin\",\"#538136\"],\"left\":[\"thin\",\"#538136\"],\"right\":[\"thin\",\"#538136\"]},\"align\":\"center\"},{\"border\":{\"bottom\":[\"thin\",\"#538136\"],\"top\":[\"thin\",\"#538136\"],\"left\":[\"thin\",\"#538136\"],\"right\":[\"thin\",\"#538136\"]}},{\"border\":{\"bottom\":[\"thin\",\"#538136\"],\"top\":[\"thin\",\"#538136\"],\"left\":[\"thin\",\"#538136\"],\"right\":[\"thin\",\"#538136\"]},\"align\":\"center\",\"bgcolor\":\"#c5e0b3\"},{\"border\":{\"bottom\":[\"thin\",\"#538136\"],\"top\":[\"thin\",\"#538136\"],\"left\":[\"thin\",\"#538136\"],\"right\":[\"thin\",\"#538136\"]},\"bgcolor\":\"#c5e0b3\"},{\"border\":{\"bottom\":[\"thin\",\"#538136\"],\"top\":[\"thin\",\"#538136\"],\"left\":[\"thin\",\"#538136\"],\"right\":[\"thin\",\"#538136\"]},\"align\":\"center\",\"bgcolor\":\"#a7d08c\"},{\"border\":{\"bottom\":[\"thin\",\"#538136\"],\"top\":[\"thin\",\"#538136\"],\"left\":[\"thin\",\"#538136\"],\"right\":[\"thin\",\"#538136\"]},\"bgcolor\":\"#a7d08c\"}],\"validations\":[],\"cols\":{\"0\":{\"width\":32},\"1\":{\"width\":65},\"2\":{\"width\":115},\"3\":{\"width\":70},\"4\":{\"width\":52},\"5\":{\"width\":70},\"6\":{\"width\":93},\"7\":{\"width\":86},\"8\":{\"width\":75},\"9\":{\"width\":136},\"10\":{\"width\":81},\"len\":24},\"merges\":[\"F2:G2\",\"F2:G2\",\"I2:J2\",\"A2:B2\",\"C2:D2\",\"A2:B2\",\"A1:J1\"]}', '', 'https://static.jeecg.com/designreport/images/医疗器械_1607070355110.png', 'jeecg', '2020-06-16 11:54:02', 'admin', '2021-02-02 19:34:39', 0, NULL, NULL, 0, 764, NULL, NULL); + +-- ---------------------------- +-- Table structure for jimu_report_data_source +-- ---------------------------- +DROP TABLE IF EXISTS `jimu_report_data_source`; +CREATE TABLE `jimu_report_data_source` ( + `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '数据源名称', + `report_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '报表_id', + `code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '编码', + `remark` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + `db_type` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '数据库类型', + `db_driver` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '驱动类', + `db_url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '数据源地址', + `db_username` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户名', + `db_password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '密码', + `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期', + `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新人', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期', + `connect_times` int(1) UNSIGNED NULL DEFAULT 0 COMMENT '连接失败次数', + `tenant_id` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '多租户标识', + `type` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '类型(report:报表;drag:仪表盘)', + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_jmdatasource_report_id`(`report_id`) USING BTREE, + INDEX `idx_jmdatasource_code`(`code`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of jimu_report_data_source +-- ---------------------------- +INSERT INTO `jimu_report_data_source` VALUES ('1324261983692902402', 'jeewx', '1324261770294071296', '', NULL, 'MYSQL', 'com.mysql.jdbc.Driver', 'jdbc:mysql://127.0.0.1:3306/jeewx-boot?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8', 'root', 'root', 'jeecg', '2020-11-05 16:07:15', NULL, '2020-11-05 16:07:15', 0, NULL, 'report'); +INSERT INTO `jimu_report_data_source` VALUES ('26d21fe4f27920d2f56abc8d90a8e527', 'oracle', '1308645288868712448', '', NULL, 'ORACLE', 'oracle.jdbc.OracleDriver', 'jdbc:oracle:thin:@192.168.1.199:1521:helowin', 'jeecgbootbpm', 'jeecg196283', 'admin', '2021-01-05 19:26:24', NULL, '2021-01-05 19:26:24', 1, NULL, 'report'); +INSERT INTO `jimu_report_data_source` VALUES ('8f90daf47d15d35ca6cf420748b8b9ba', 'localhost', '1316944968992034816', '', NULL, 'MYSQL5.7', 'com.mysql.cj.jdbc.Driver', 'jdbc:mysql://127.0.0.1:3306/jeecg-boot?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8', 'root', 'root', 'admin', '2021-01-13 14:34:00', NULL, '2021-01-13 14:34:00', 0, NULL, 'report'); + +-- ---------------------------- +-- Table structure for jimu_report_db +-- ---------------------------- +DROP TABLE IF EXISTS `jimu_report_db`; +CREATE TABLE `jimu_report_db` ( + `id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'id', + `jimu_report_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '主键字段', + `create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人登录名称', + `update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人登录名称', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期', + `db_code` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '数据集编码', + `db_ch_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '数据集名字', + `db_type` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '数据源类型', + `db_table_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '数据库表名', + `db_dyn_sql` longtext CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '动态查询SQL', + `db_key` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '数据源KEY', + `tb_db_key` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '填报数据源', + `tb_db_table_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '填报数据表', + `java_type` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'java类数据集 类型(spring:springkey,class:java类名)', + `java_value` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'java类数据源 数值(bean key/java类名)', + `api_url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '请求地址', + `api_method` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '请求方法0-get,1-post', + `is_list` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0' COMMENT '是否是列表0否1是 默认0', + `is_page` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '是否作为分页,0:不分页,1:分页', + `db_source` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '数据源', + `db_source_type` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '数据库类型 MYSQL ORACLE SQLSERVER', + `json_data` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT 'json数据,直接解析json内容', + `api_convert` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'api转换器', + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_jmreportdb_db_key`(`db_key`) USING BTREE, + INDEX `idx_jimu_report_id`(`jimu_report_id`) USING BTREE, + INDEX `idx_db_source_id`(`db_source`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of jimu_report_db +-- ---------------------------- +INSERT INTO `jimu_report_db` VALUES ('1272834687525482497', '53c82a76f837d5661dceec7d93afafec', 'admin', NULL, '2021-01-04 20:42:17', '2021-01-04 20:42:17', 'jianpiao', 'jianpiao', '0', NULL, 'select * from rep_demo_jianpiao where s_id=\'${id}\'', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '1', '1', NULL, 'MYSQL', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1272858455908073473', 'ff9bd143582a6dfed897ba8b6f93b175', 'admin', NULL, '2020-12-14 16:21:09', '2020-12-14 16:21:09', 'xiaoshou', 'xiaoshou', '0', NULL, 'select * from rep_demo_xiaoshou where s_id=\'${id}\'', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '1', '1', NULL, 'MYSQL', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1273495682564534273', 'ff9bd143582a6dfed897ba8b6f93b175', 'admin', NULL, '2020-09-28 10:18:07', '2020-12-14 16:21:09', 'gongsi', 'gongsi', '0', NULL, 'select * from rep_demo_gongsi where id=\'${id}\'', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '0', '0', NULL, 'MYSQL', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1283730831482937345', '6059e405dd9c66a6d38e00841d2e40cc', 'admin', NULL, '2020-12-04 16:53:38', '2020-12-04 16:53:38', 'yaopin', 'yaopin', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/baobiao/chufangjian', '0', '0', '0', NULL, 'MYSQL', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1283957016150249473', '6059e405dd9c66a6d38e00841d2e40cc', NULL, NULL, '2020-07-17 10:49:42', NULL, 'yonghu', 'yonghu', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/baobiao/yonghu', '0', '0', NULL, NULL, 'MYSQL', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1284070508744257537', 'a250846887abe01217aab173d3006489', NULL, NULL, '2020-07-17 15:33:53', '2020-07-20 17:50:49', 'budong', 'budong', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/baobiao/budongchan', '0', '0', NULL, NULL, 'MYSQL', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1285157606524002305', 'a9f068972508920cd4aab831814f0c04', 'admin', 'admin', '2021-04-01 02:44:48', '2021-04-01 02:44:48', 'pdaibu', 'pdaibu', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/baobiao/daibu', '0', '0', '0', '', 'MYSQL', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1285164420728692737', '7905022412733a0c68dc7b4ef8947489', NULL, NULL, '2020-07-20 18:47:30', NULL, 'jieshaoxin', 'jieshaoxin', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/baobiao/jieshaoxin', '0', '0', NULL, NULL, 'MYSQL', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1285178919099637762', '6d6bdcb5e820c301ea32789e3ae43c44', NULL, NULL, '2020-07-20 19:45:06', NULL, 'qiangxiu', 'qiangxiu', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/baobiao/qiangxiu', '0', '0', NULL, NULL, 'MYSQL', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1288038655293661186', 'f6ee801e8bdc28ba9d63f95dc65ccd79', 'admin', 'admin', '2021-04-01 03:09:40', '2021-04-01 03:09:40', 'caigou', 'caigou', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/baobiao/caigou?pageNo=\'${pageNo}\'&pageSize=\'${pageSize}\'', '0', '1', '1', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1289140698221678593', '519c1c6f4d1f584ae8fa5b43b45acdc7', 'admin', 'admin', '2021-04-01 03:09:23', '2021-04-01 03:09:23', 'xiaoshou', 'xiaoshou', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/baobiao/xiaoshou?pageNo=\'${pageNo}\'&pageSize=\'${pageSize}\'', '0', '1', '1', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1290104038414721025', '53c82a76f837d5661dceec7d93afafec', 'admin', NULL, '2021-01-04 20:47:07', '2021-01-04 20:47:07', 'gongsi', 'gongsi', '0', NULL, 'select * from rep_demo_gongsi where id=\'${id}\'', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '0', '0', '', 'MYSQL', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1316987047604514817', '1314846205892759552', 'admin', NULL, '2021-01-08 10:36:58', '2021-01-08 10:36:58', 'yuangongjiben', 'yuangongjiben', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/yuangongjiben', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1316997232402231298', '1316944968992034816', 'admin', NULL, '2021-01-13 14:34:06', '2021-01-13 14:34:06', 'employee', 'employee', '0', NULL, 'select * from rep_demo_employee where id=\'${id}\'', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '1', '0', '', '', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1317006713165049858', '1314846205892759552', 'admin', NULL, '2021-01-11 14:38:14', '2021-01-11 14:38:14', 'xueli', 'xueli', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/xueli', '0', '1', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1317007979484147714', '1314846205892759552', 'admin', NULL, '2021-01-08 10:40:31', '2021-01-08 10:40:31', 'uu', 'uu', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/gongzuojingli', '0', '1', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1317009166140829698', '1314846205892759552', 'admin', NULL, '2020-10-16 15:47:09', '2021-01-05 15:33:58', 'zhengshu', 'zhengshu', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/zhengshu', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1317013474634756097', '1314846205892759552', 'admin', NULL, '2020-10-16 16:04:16', '2021-01-05 15:33:58', 'jtcy', 'jtcy', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/jtcy', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1317015169494282241', '1314846205892759552', 'admin', NULL, '2020-10-16 16:11:00', '2021-01-05 15:33:58', 'jiangli', 'jiangli', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/jiangli', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1331511745851731969', '1331503965770223616', 'admin', NULL, '2020-11-25 16:15:13', '2020-11-25 16:15:13', 'chengjiao', 'chengjiao', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/chengjiao', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1331514838211407873', '1331503965770223616', 'admin', NULL, '2020-11-25 16:27:30', '2020-11-25 16:27:30', 'cjpaihang', 'cjpaihang', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/cjpaihang', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1331514935028527106', '1331503965770223616', 'admin', NULL, '2020-11-25 16:27:54', '2020-11-25 16:27:54', 'cjjine', 'cjjine', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/cjjine', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1331872643531526146', '1331503965770223616', 'admin', NULL, '2020-11-26 16:09:18', '2020-11-26 16:09:18', 'chengjiao1', 'chengjiao1', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/chengjiao1', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1331878107552010242', '1331503965770223616', 'admin', NULL, '2020-11-26 16:31:01', '2020-11-26 16:31:01', 'zhuangxiu', 'zhuangxiu', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/zhuangxiu', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1331916030221602818', '1331503965770223616', 'admin', NULL, '2020-11-26 19:01:42', '2020-11-26 19:01:42', 'btchanquan', 'btchanquan', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/btchanquan', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1331919172472524801', '1331503965770223616', 'admin', NULL, '2020-11-26 19:14:11', '2020-11-26 19:14:11', 'huxingxiaoshou', 'huxingxiaoshou', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/huxingxiaoshou', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1331922734933987329', '1331503965770223616', 'admin', NULL, '2020-11-26 19:28:21', '2020-11-26 19:28:21', 'fangyuan', 'fangyuan', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/fangyuan', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1331926127597441025', '1331503965770223616', 'admin', NULL, '2020-11-26 19:41:49', '2020-11-26 19:41:49', 'qingkuang', 'qingkuang', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/qingkuang', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1334390762455965697', '1334378897302753280', 'admin', NULL, '2021-01-06 11:43:35', '2021-01-06 11:43:35', 'quyuxiaoshou', 'quyuxiaoshou', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/quyuxiaoshou', '0', '1', '1', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1334440263732436994', '1334420681185566722', 'admin', NULL, '2021-01-04 21:28:19', '2021-01-04 21:28:19', 'laiyuan', 'laiyuan', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/laiyuan', '0', '1', '1', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1334465135435063298', '1334457419857793024', 'admin', NULL, '2021-01-04 21:29:28', '2021-01-04 21:29:28', 'xiaoshou', 'xiaoshou', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/xiaoshou', '0', '1', '1', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1334708015269490689', '1334696790477377536', 'admin', NULL, '2021-01-04 21:30:29', '2021-01-04 21:30:29', 'shouru', 'shouru', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/shouru', '0', '1', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1334763434197200897', '1334757703079301120', 'admin', NULL, '2020-12-04 15:40:31', '2020-12-04 15:40:31', 'chejian', 'chejian', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/chejian', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('1338756341933543425', '1338744112815411200', 'admin', NULL, '2021-02-02 19:20:56', '2021-02-02 19:20:56', 'jdcx', 'jdcx', '0', NULL, 'select * from rep_demo_dxtj', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '1', '0', '', 'MYSQL', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('22f025b781ee9fe4746438621e82674f', '01a1e07ed4b12348b29d5a47ac7f0228', 'admin', NULL, '2020-12-14 16:21:09', '2020-12-14 16:21:09', 'xiaoshou', 'xiaoshou', '0', NULL, 'select * from rep_demo_xiaoshou where s_id=\'${id}\'', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '1', '1', NULL, 'MYSQL', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('2324fac242b35938678a05bbbba345e2', '7acddbc92bc73d06c7f62ff55dfdca19', 'admin', NULL, '2021-01-11 14:25:45', '2021-01-11 14:25:45', 'xiaoshou', 'xiaoshou', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/baobiao/xiaoshou?pageNo=\'${pageNo}\'&pageSize=\'${pageSize}\'', '0', '1', '1', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('28e0b01cc3e2b0d361107661527bfdff', '6df599d933df24de007764d0e98eb105', 'admin', NULL, '2020-12-04 16:53:38', '2020-12-04 16:53:38', 'yaopin', 'yaopin', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/baobiao/chufangjian', '0', '0', '0', NULL, 'MYSQL', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('4af57d343f1d6521b71b85097b580786', '1347459370216198144', 'admin', NULL, '2021-01-08 17:26:57', '2021-01-08 17:26:57', 'tmp_report_data_income', '来源收入统计', '0', NULL, 'select * from tmp_report_data_income', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '1', '1', '', 'MYSQL', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('4dc208eb92fd1a84ef7b4723251e3e51', '5485950d88c9918d03dece2ad24b4d72', 'admin', NULL, '2021-01-08 16:24:16', '2021-01-08 16:24:16', 'tmp_report_data_1', '年度佣金收入', '0', NULL, 'select monty,main_income,total,his_lowest,his_average,his_highest from tmp_report_data_1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '1', '0', '', 'MYSQL', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('537477711022567424', '537446834339098624', 'admin', 'admin', '2021-04-01 05:54:42', '2021-04-01 05:54:42', 'yy', 'yy', '0', NULL, 'select * from rep_demo_dxtj', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '1', '1', '', 'MYSQL', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('537478337278291968', '537446834339098624', 'admin', 'admin', '2021-04-01 05:54:37', '2021-04-01 05:54:37', 'tt', 'tt', '0', NULL, 'select * from SYS_DATA_LOG', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '1', '0', '26d21fe4f27920d2f56abc8d90a8e527', 'ORACLE', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('537478706314129408', '537446834339098624', 'admin', 'admin', '2021-04-01 05:56:44', '2021-04-01 05:56:44', 'pp', 'pp', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/baobiao/caigou', '0', '1', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('574873661957337088', '574873661613404160', 'admin', NULL, '2021-07-13 10:29:32', '2021-01-08 10:36:58', 'yuangongjiben', 'yuangongjiben', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/yuangongjiben', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('574873663005913088', '574873661613404160', 'admin', NULL, '2021-07-13 10:29:32', '2021-01-11 14:38:14', 'xueli', 'xueli', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/xueli', '0', '1', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('574873663161102336', '574873661613404160', 'admin', NULL, '2021-07-13 10:29:32', '2021-01-08 10:40:31', 'uu', 'uu', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/gongzuojingli', '0', '1', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('574873663341457408', '574873661613404160', 'admin', NULL, '2021-07-13 10:29:32', '2021-01-05 15:33:58', 'zhengshu', 'zhengshu', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/zhengshu', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('574873663500840960', '574873661613404160', 'admin', NULL, '2021-07-13 10:29:32', '2021-01-05 15:33:58', 'jtcy', 'jtcy', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/jtcy', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('574873663693778944', '574873661613404160', 'admin', NULL, '2021-07-13 10:29:32', '2021-01-05 15:33:58', 'jiangli', 'jiangli', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/jiangli', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('574875722388205568', '574875722233016320', 'admin', NULL, '2021-07-13 10:37:43', '2021-01-08 10:47:52', 'tt', 'tt', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/baobiao/shixi', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('574875730650984448', '574875730525155328', 'admin', NULL, '2021-07-13 10:37:45', '2021-01-08 10:36:58', 'yuangongjiben', 'yuangongjiben', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/yuangongjiben', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('574875731594702848', '574875730525155328', 'admin', NULL, '2021-07-13 10:37:45', '2021-01-11 14:38:14', 'xueli', 'xueli', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/xueli', '0', '1', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('574875731737309184', '574875730525155328', 'admin', NULL, '2021-07-13 10:37:45', '2021-01-08 10:40:31', 'uu', 'uu', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/gongzuojingli', '0', '1', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('574875731867332608', '574875730525155328', 'admin', NULL, '2021-07-13 10:37:45', '2021-01-05 15:33:58', 'zhengshu', 'zhengshu', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/zhengshu', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('574875731997356032', '574875730525155328', 'admin', NULL, '2021-07-13 10:37:45', '2021-01-05 15:33:58', 'jtcy', 'jtcy', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/jtcy', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('574875732131573760', '574875730525155328', 'admin', NULL, '2021-07-13 10:37:45', '2021-01-05 15:33:58', 'jiangli', 'jiangli', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/jiangli', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('6011955e58d89040fca52e7f962d0bf4', '961455b47c0b86dc961e90b5893bff05', 'admin', NULL, '2021-01-04 20:47:07', '2021-01-04 20:47:07', 'gongsi', 'gongsi', '0', NULL, 'select * from rep_demo_gongsi where id=\'${id}\'', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '0', '0', '', 'MYSQL', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('60b3feffadc55eb49baa5a48fdf1ff0e', '1352160857479581696', 'admin', NULL, '2021-01-29 18:36:35', '2021-01-29 18:36:35', 'infoForReport', '信息', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://localhost:8080/jeecg-boot/sys/actuator/redis/infoForReport', '0', '1', '1', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('629609c4d540cb4675e9064af8955296', '7c02c224a2db56d0350069650033f702', 'admin', NULL, '2021-02-02 19:33:09', '2021-02-02 19:33:09', 'hecha', 'hecha', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/hecha', '0', '1', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('654609e4247a0469e0b2befbc69b00f9', '1cd9d574d0c42f3915046dc61d9f33bd', 'admin', NULL, '2020-12-17 16:42:21', '2020-12-17 19:50:14', 'xiaoshoue', '销售额', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/xiaoshoue', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('6a1d22ca4c95e8fab655d3ceed43a84d', '1352160857479581696', 'admin', NULL, '2021-01-29 18:36:42', '2021-01-29 18:36:42', 'memoryForReport', '内存', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://localhost:8080/jeecg-boot/sys/actuator/redis/memoryForReport', '0', '1', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('7911bd189c2d53e182693bd599a315a2', '1cd9d574d0c42f3915046dc61d9f33bd', 'admin', NULL, '2020-12-17 16:59:12', '2020-12-17 19:50:14', 'chengshi', '城市', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/chengshi', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('7b20679054449c554cde856ef24126ab', '1347454742040809472', 'admin', NULL, '2021-01-08 16:24:16', '2021-01-08 16:24:16', 'tmp_report_data_1', '年度佣金收入', '0', NULL, 'select monty,main_income,total,his_lowest,his_average,his_highest from tmp_report_data_1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '1', '0', '', 'MYSQL', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('94bcd8202bc6bc467efd0d679dadd7bb', '1338370016550195200', 'admin', 'admin', '2021-07-12 12:15:08', '2021-07-12 12:15:08', 'tm', 'tm', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/tiaoma1', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('9b75c161322e0b7e29b3ffc84239a72c', '1cd9d574d0c42f3915046dc61d9f33bd', 'admin', NULL, '2020-12-17 17:13:21', '2020-12-17 19:50:14', 'xsjd', '销售进度', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/xsjd', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('9b7d28336b01f9a6b1a613957c3d7cda', '1338769064067076098', 'admin', NULL, '2021-02-02 19:12:55', '2021-02-02 19:12:55', 'pop', 'pop', '0', NULL, 'select * from rep_demo_dxtj', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '1', '0', '', 'MYSQL', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('a543d8dd40f4d26839b78bd604be659e', 'f5f275b5e28b45256ef24587ec792f0c', 'admin', NULL, '2021-01-08 17:26:57', '2021-01-08 17:26:57', 'tmp_report_data_income', '来源收入统计', '0', NULL, 'select * from tmp_report_data_income', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '1', '1', '', 'MYSQL', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('bbc5d5ab143d59f0beab484682361aa5', 'dd482bfd6ca470a0f49d9bb4e61ec694', 'admin', NULL, '2021-01-08 10:47:52', '2021-01-08 10:47:52', 'tt', 'tt', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/baobiao/shixi', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('c9bdb6b7ac68accfecb366718bf78f79', '01a1e07ed4b12348b29d5a47ac7f0228', 'admin', NULL, '2020-09-28 10:18:07', '2020-12-14 16:21:09', 'gongsi', 'gongsi', '0', NULL, 'select * from rep_demo_gongsi where id=\'${id}\'', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '0', '0', NULL, 'MYSQL', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('d4a29dfda94357308faf62be2b94db08', '1352160857479581696', 'admin', NULL, '2021-01-29 18:36:47', '2021-01-29 18:36:47', 'keysSizeForReport', '数量', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://localhost:8080/jeecg-boot/sys/actuator/redis/keysSizeForReport', '0', '1', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('e0fe1d693625c906c1171d7de706a47c', '6df599d933df24de007764d0e98eb105', NULL, NULL, '2020-07-17 10:49:42', NULL, 'yonghu', 'yonghu', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/baobiao/yonghu', '0', '0', NULL, NULL, 'MYSQL', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('e4cec9ff15bc0ea42f536a442a6d1335', '961455b47c0b86dc961e90b5893bff05', 'admin', NULL, '2021-01-04 20:42:17', '2021-01-04 20:42:17', 'jianpiao', 'jianpiao', '0', NULL, 'select * from rep_demo_jianpiao where s_id=\'${id}\'', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '1', '1', NULL, 'MYSQL', NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('f7649b77cfc9e0a9dacdac370cd4036b', '1347373863746539520', 'admin', NULL, '2021-01-08 10:47:52', '2021-01-08 10:47:52', 'tt', 'tt', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/baobiao/shixi', '0', '0', '0', '', NULL, NULL, NULL); +INSERT INTO `jimu_report_db` VALUES ('fb70a91730f087f8023afd88d24f9697', '1cd9d574d0c42f3915046dc61d9f33bd', 'admin', NULL, '2020-12-17 19:50:14', '2020-12-17 19:50:14', 'zhexian', 'zhexian', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'http://api.jeecg.com/mock/26/zhexian', '0', '1', '1', '', NULL, NULL, NULL); + +-- ---------------------------- +-- Table structure for jimu_report_db_field +-- ---------------------------- +DROP TABLE IF EXISTS `jimu_report_db_field`; +CREATE TABLE `jimu_report_db_field` ( + `id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'id', + `create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人登录名称', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期', + `update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人登录名称', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期', + `jimu_report_db_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '数据源ID', + `field_name` varchar(80) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '字段名', + `field_text` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '字段文本', + `widget_type` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '控件类型', + `widget_width` int(10) NULL DEFAULT NULL COMMENT '控件宽度', + `order_num` int(3) NULL DEFAULT NULL COMMENT '排序', + `search_flag` int(3) NULL DEFAULT 0 COMMENT '查询标识0否1是 默认0', + `search_mode` int(3) NULL DEFAULT NULL COMMENT '查询模式1简单2范围', + `dict_code` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '字典编码支持从表中取数据', + `search_value` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '查询默认值', + `search_format` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '查询时间格式化表达式', + `ext_json` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '参数配置', + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_jrdf_jimu_report_db_id`(`jimu_report_db_id`) USING BTREE, + INDEX `idx_dbfield_order_num`(`order_num`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of jimu_report_db_field +-- ---------------------------- +INSERT INTO `jimu_report_db_field` VALUES ('00a67b539ac15446c1bd658104e1020a', NULL, '2020-07-21 15:17:10', NULL, NULL, 'c9bdb6b7ac68accfecb366718bf78f79', 'gdata', 'gdata', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('014179e260e0adf1706c616a3ad6e552', NULL, '2021-01-08 16:10:28', NULL, NULL, '7b20679054449c554cde856ef24126ab', 'main_income', 'main_income', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('01cb1f61f836aae43bca333dbaf293be', NULL, '2021-01-11 14:38:14', NULL, NULL, '1317006713165049858', 'zhuanye', 'zhuanye', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('0470c07d386940053253fe8a8c200225', NULL, '2021-01-08 16:29:02', NULL, NULL, '4af57d343f1d6521b71b85097b580786', 'chengbao_gz_money', 'chengbao_gz_money', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('0680555456f0e579a0065c4ca5dd8d06', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'id', 'id', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('06b24135f3670ea4f4c7f554d2521a39', NULL, '2021-01-08 16:29:02', NULL, NULL, 'a543d8dd40f4d26839b78bd604be659e', 'biz_income', 'biz_income', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('08e22bbf63e81198c0d2585dce8ee8f9', NULL, '2021-02-02 19:10:15', NULL, NULL, '9b7d28336b01f9a6b1a613957c3d7cda', 'jperson', 'jperson', 'String', NULL, 9, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('0c82931edb766ad89ead9e98a998d43f', NULL, '2021-01-11 14:38:14', NULL, NULL, '1317006713165049858', 'kdate', 'kdate', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('0c9f65f5f754f1251070f51a2a19905d', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'hname', 'hname', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('0fb03c8e2330e051564f3dd1de54512f', NULL, '2021-01-11 14:38:14', NULL, NULL, '1317006713165049858', 'jstudent', 'jstudent', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('10e61155dcf655d7843ebc01cc90c8b1', NULL, '2021-01-08 16:10:28', NULL, NULL, '7b20679054449c554cde856ef24126ab', 'total', 'total', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('115c1ac01462ca1fbecb3c0a55218395', NULL, '2021-01-08 16:10:28', NULL, NULL, '7b20679054449c554cde856ef24126ab', 'his_highest', 'his_highest', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('11713370900fa3c1455cac7e8db61fe1', NULL, '2021-01-08 10:47:52', NULL, NULL, 'bbc5d5ab143d59f0beab484682361aa5', 'pingjia', 'pingjia', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('11d3a082d297adeffecd86690e28cf39', NULL, '2021-01-05 15:09:15', NULL, NULL, '2324fac242b35938678a05bbbba345e2', 'ctotal', 'ctotal', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1260eb03ab66bd12766b2102e343d280', NULL, '2021-01-21 17:07:16', NULL, NULL, '6a1d22ca4c95e8fab655d3ceed43a84d', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1272834907562864641', NULL, '2020-06-16 18:14:25', NULL, NULL, '1272834687525482497', 'id', 'id', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1272834907567058946', NULL, '2020-06-16 18:14:25', NULL, NULL, '1272834687525482497', 'bnum', 'bnum', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1272834907571253250', NULL, '2020-06-16 18:14:25', NULL, NULL, '1272834687525482497', 'ftime', 'ftime', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1272834907571253251', NULL, '2020-06-16 18:14:25', NULL, NULL, '1272834687525482497', 'sfkong', 'sfkong', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1272834907571253252', NULL, '2020-06-16 18:14:25', NULL, NULL, '1272834687525482497', 'kaishi', 'kaishi', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1272834907571253253', NULL, '2020-06-16 18:14:25', NULL, NULL, '1272834687525482497', 'jieshu', 'jieshu', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1272834907571253254', NULL, '2020-06-16 18:14:25', NULL, NULL, '1272834687525482497', 'hezairen', 'hezairen', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1272834907571253255', NULL, '2020-06-16 18:14:25', NULL, NULL, '1272834687525482497', 'jpnum', 'jpnum', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1272834907575447554', NULL, '2020-06-16 18:14:25', NULL, NULL, '1272834687525482497', 'shihelv', 'shihelv', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1283957016175415297', NULL, '2020-07-17 10:49:42', NULL, NULL, '1283957016150249473', 'yphone', 'yphone', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1283957016183803906', NULL, '2020-07-17 10:49:42', NULL, NULL, '1283957016150249473', 'yzhenliao', 'yzhenliao', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1283957016187998209', NULL, '2020-07-17 10:49:42', NULL, NULL, '1283957016150249473', 'ysex', 'ysex', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1283957016192192513', NULL, '2020-07-17 10:49:42', NULL, NULL, '1283957016150249473', 'danwei', 'danwei', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1283957016196386818', NULL, '2020-07-17 10:49:42', NULL, NULL, '1283957016150249473', 'kdata', 'kdata', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1283957016204775425', NULL, '2020-07-17 10:49:42', NULL, NULL, '1283957016150249473', 'yname', 'yname', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1283957016208969729', NULL, '2020-07-17 10:49:42', NULL, NULL, '1283957016150249473', 'yprice', 'yprice', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1283957016213164033', NULL, '2020-07-17 10:49:42', NULL, NULL, '1283957016150249473', 'ytotal', 'ytotal', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1283957016217358337', NULL, '2020-07-17 10:49:42', NULL, NULL, '1283957016150249473', 'yishe', 'yishe', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1283957016221552641', NULL, '2020-07-17 10:49:42', NULL, NULL, '1283957016150249473', 'yizhu', 'yizhu', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1283957016225746946', NULL, '2020-07-17 10:49:42', NULL, NULL, '1283957016150249473', 'yage', 'yage', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1283957016229941249', NULL, '2020-07-17 10:49:42', NULL, NULL, '1283957016150249473', 'yjieguo', 'yjieguo', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285150155649130497', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'xtype', 'xtype', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285150155686879234', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'danyuan', 'danyuan', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285150155691073538', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'chanquan', 'chanquan', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285150155695267841', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'zhuzhi', 'zhuzhi', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285150155699462145', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'fujian', 'fujian', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285150155707850754', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'didian', 'didian', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285150155707850755', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'type', 'type', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285150155712045058', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'suoyou', 'suoyou', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285150155716239361', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'name', 'name', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285150155716239362', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'bianhao', 'bianhao', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285150155720433666', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'yname', 'yname', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285150155720433667', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'riqi', 'riqi', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285150155724627969', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'beizhu', 'beizhu', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285150155728822274', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'time', 'time', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285150155728822275', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'mianji', 'mianji', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285159608326889474', 'admin', '2021-04-01 02:44:48', NULL, NULL, '1285157606524002305', 'fsex', 'fsex', 'string', NULL, NULL, 0, NULL, 'sex', NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285159608335278082', 'admin', '2021-04-01 02:44:48', NULL, NULL, '1285157606524002305', 'fname', 'fname', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285159608339472385', 'admin', '2021-04-01 02:44:48', NULL, NULL, '1285157606524002305', 'shiqing', 'shiqing', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285159608339472386', 'admin', '2021-04-01 02:44:48', NULL, NULL, '1285157606524002305', 'pname', 'pname', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285159608339472387', 'admin', '2021-04-01 02:44:48', NULL, NULL, '1285157606524002305', 'zhuzhi', 'zhuzhi', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285159608339472388', 'admin', '2021-04-01 02:44:48', NULL, NULL, '1285157606524002305', 'gdata', 'gdata', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285159608343666690', 'admin', '2021-04-01 02:44:48', NULL, NULL, '1285157606524002305', 'cdata', 'cdata', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285164420749664258', NULL, '2020-07-20 18:47:30', NULL, NULL, '1285164420728692737', 'shiqing', 'shiqing', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285164420753858561', NULL, '2020-07-20 18:47:30', NULL, NULL, '1285164420728692737', 'name', 'name', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285164420758052866', NULL, '2020-07-20 18:47:30', NULL, NULL, '1285164420728692737', 'gdata', 'gdata', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285164420758052867', NULL, '2020-07-20 18:47:30', NULL, NULL, '1285164420728692737', 'value', 'value', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285164420758052868', NULL, '2020-07-20 18:47:30', NULL, NULL, '1285164420728692737', 'percent', 'percent', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285164420762247169', NULL, '2020-07-20 18:47:30', NULL, NULL, '1285164420728692737', 'tdata', 'tdata', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919124803585', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'ktime', 'ktime', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919133192193', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'danwei', 'danwei', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919133192194', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'wtime', 'wtime', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919133192195', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'yusuan', 'yusuan', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919133192196', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'dshenhe', 'dshenhe', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919133192197', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'zhuren', 'zhuren', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919137386498', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'neirong', 'neirong', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919137386499', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'yijian', 'yijian', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919137386500', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'time1', 'time1', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919137386501', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'time2', 'time2', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919137386502', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'time3', 'time3', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919141580801', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'time4', 'time4', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919141580802', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'pingjia', 'pingjia', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919141580803', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'name', 'name', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919141580804', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'bianhao', 'bianhao', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919141580805', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'zongjie', 'zongjie', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919145775105', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'nengli', 'nengli', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285178919145775106', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'time', 'time', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285473875810967553', NULL, '2020-07-21 15:17:10', NULL, NULL, '1273495682564534273', 'id', 'id', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285473875823550466', NULL, '2020-07-21 15:17:10', NULL, NULL, '1273495682564534273', 'gname', 'gname', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285473875823550467', NULL, '2020-07-21 15:17:10', NULL, NULL, '1273495682564534273', 'gdata', 'gdata', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285473875823550468', NULL, '2020-07-21 15:17:10', NULL, NULL, '1273495682564534273', 'tdata', 'tdata', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285473875827744769', NULL, '2020-07-21 15:17:10', NULL, NULL, '1273495682564534273', 'didian', 'didian', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285473875827744770', NULL, '2020-07-21 15:17:10', NULL, NULL, '1273495682564534273', 'zhaiyao', 'zhaiyao', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1285473875827744771', NULL, '2020-07-21 15:17:10', NULL, NULL, '1273495682564534273', 'num', 'num', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288038655394324482', 'admin', '2021-04-01 03:09:40', NULL, NULL, '1288038655293661186', 'ctotal', '库存量', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288038655402713090', 'admin', '2021-04-01 03:09:40', NULL, NULL, '1288038655293661186', 'cname', '产品名称', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288038655406907393', 'admin', '2021-04-01 03:09:40', NULL, NULL, '1288038655293661186', 'cprice', '单价', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288038655411101697', 'admin', '2021-04-01 03:09:40', NULL, NULL, '1288038655293661186', 'dtotal', '订购量', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288038655411101698', 'admin', '2021-04-01 03:09:40', NULL, NULL, '1288038655293661186', 'tp', '库存总值', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288038655415296002', 'admin', '2021-04-01 03:09:40', NULL, NULL, '1288038655293661186', 'ztotal', '二次订购量', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288038655415296003', 'admin', '2021-04-01 03:09:40', NULL, NULL, '1288038655293661186', 'cnum', '产品数量', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288048290843074561', NULL, '2020-07-28 17:46:58', NULL, NULL, '1272858455908073473', 'id', 'id', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288048290847268865', NULL, '2020-07-28 17:46:58', NULL, NULL, '1272858455908073473', 'hnum', 'hnum', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288048290851463170', NULL, '2020-07-28 17:46:58', NULL, NULL, '1272858455908073473', 'hname', 'hname', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288048290851463171', NULL, '2020-07-28 17:46:58', NULL, NULL, '1272858455908073473', 'xinghao', 'xinghao', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288048290851463172', NULL, '2020-07-28 17:46:58', NULL, NULL, '1272858455908073473', 'fahuocangku', 'fahuocangku', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288048290851463173', NULL, '2020-07-28 17:46:58', NULL, NULL, '1272858455908073473', 'danwei', 'danwei', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288048290851463174', NULL, '2020-07-28 17:46:58', NULL, NULL, '1272858455908073473', 'num', 'num', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288048290851463175', NULL, '2020-07-28 17:46:58', NULL, NULL, '1272858455908073473', 'danjia', 'danjia', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288048290851463176', NULL, '2020-07-28 17:46:58', NULL, NULL, '1272858455908073473', 'zhekoulv', 'zhekoulv', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288048290855657473', NULL, '2020-07-28 17:46:58', NULL, NULL, '1272858455908073473', 'xiaoshoujine', 'xiaoshoujine', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288048290859851778', NULL, '2020-07-28 17:46:58', NULL, NULL, '1272858455908073473', 'beizhu', 'beizhu', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1288048290859851779', NULL, '2020-07-28 17:46:58', NULL, NULL, '1272858455908073473', 's_id', 's_id', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1290104038439886849', NULL, '2020-08-03 09:55:46', NULL, NULL, '1290104038414721025', 'id', 'id', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1290104038448275458', NULL, '2020-08-03 09:55:46', NULL, NULL, '1290104038414721025', 'gname', 'gname', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1290104038448275459', NULL, '2020-08-03 09:55:46', NULL, NULL, '1290104038414721025', 'gdata', 'gdata', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1290104038448275460', NULL, '2020-08-03 09:55:46', NULL, NULL, '1290104038414721025', 'tdata', 'tdata', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1290104038452469761', NULL, '2020-08-03 09:55:46', NULL, NULL, '1290104038414721025', 'didian', 'didian', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1290104038452469762', NULL, '2020-08-03 09:55:46', NULL, NULL, '1290104038414721025', 'zhaiyao', 'zhaiyao', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1290104038452469763', NULL, '2020-08-03 09:55:46', NULL, NULL, '1290104038414721025', 'num', 'num', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317007979534479361', NULL, '2020-10-16 15:42:26', NULL, NULL, '1317007979484147714', 'zmphone', 'zmphone', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317007979534479362', NULL, '2020-10-16 15:42:26', NULL, NULL, '1317007979484147714', 'jstudent', 'jstudent', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317007979534479363', NULL, '2020-10-16 15:42:26', NULL, NULL, '1317007979484147714', 'kdate', 'kdate', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317007979534479364', NULL, '2020-10-16 15:42:26', NULL, NULL, '1317007979484147714', 'jdate', 'jdate', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317007979534479365', NULL, '2020-10-16 15:42:26', NULL, NULL, '1317007979484147714', 'zmname', 'zmname', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317009166149218305', NULL, '2020-10-16 15:47:09', NULL, NULL, '1317009166140829698', 'zcname', 'zcname', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317009166149218306', NULL, '2020-10-16 15:47:09', NULL, NULL, '1317009166140829698', 'danwei', 'danwei', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317009166149218307', NULL, '2020-10-16 15:47:09', NULL, NULL, '1317009166140829698', 'fdate', 'fdate', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317009166149218308', NULL, '2020-10-16 15:47:09', NULL, NULL, '1317009166140829698', 'jibie', 'jibie', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317009166149218309', NULL, '2020-10-16 15:47:09', NULL, NULL, '1317009166140829698', 'beizhu', 'beizhu', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317013474643144706', NULL, '2020-10-16 16:04:16', NULL, NULL, '1317013474634756097', 'danwei', 'danwei', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317013474643144707', NULL, '2020-10-16 16:04:16', NULL, NULL, '1317013474634756097', 'phone', 'phone', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317013474643144708', NULL, '2020-10-16 16:04:16', NULL, NULL, '1317013474634756097', 'name', 'name', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317013474643144709', NULL, '2020-10-16 16:04:16', NULL, NULL, '1317013474634756097', 'zzmm', 'zzmm', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317013474643144710', NULL, '2020-10-16 16:04:16', NULL, NULL, '1317013474634756097', 'guanxi', 'guanxi', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317013474643144711', NULL, '2020-10-16 16:04:16', NULL, NULL, '1317013474634756097', 'age', 'age', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317015169502670849', NULL, '2020-10-16 16:11:00', NULL, NULL, '1317015169494282241', 'date', 'date', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317015169502670850', NULL, '2020-10-16 16:11:00', NULL, NULL, '1317015169494282241', 'mingcheng', 'mingcheng', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1317015169502670851', NULL, '2020-10-16 16:11:00', NULL, NULL, '1317015169494282241', 'didian', 'didian', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331511745855926274', NULL, '2020-11-25 16:15:13', NULL, NULL, '1331511745851731969', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331511745855926275', NULL, '2020-11-25 16:15:13', NULL, NULL, '1331511745851731969', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331511745855926276', NULL, '2020-11-25 16:15:13', NULL, NULL, '1331511745851731969', 'type', 'type', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331514838215602178', NULL, '2020-11-25 16:27:30', NULL, NULL, '1331514838211407873', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331514838215602179', NULL, '2020-11-25 16:27:30', NULL, NULL, '1331514838211407873', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331514838215602180', NULL, '2020-11-25 16:27:30', NULL, NULL, '1331514838211407873', 'type', 'type', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331514935032721409', NULL, '2020-11-25 16:27:54', NULL, NULL, '1331514935028527106', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331514935032721410', NULL, '2020-11-25 16:27:54', NULL, NULL, '1331514935028527106', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331514935032721411', NULL, '2020-11-25 16:27:54', NULL, NULL, '1331514935028527106', 'type', 'type', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331872643539914754', NULL, '2020-11-26 16:09:18', NULL, NULL, '1331872643531526146', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331872643539914755', NULL, '2020-11-26 16:09:18', NULL, NULL, '1331872643531526146', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331872643539914756', NULL, '2020-11-26 16:09:18', NULL, NULL, '1331872643531526146', 'type', 'type', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331878107560398849', NULL, '2020-11-26 16:31:01', NULL, NULL, '1331878107552010242', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331878107560398850', NULL, '2020-11-26 16:31:01', NULL, NULL, '1331878107552010242', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331916030229991425', NULL, '2020-11-26 19:01:42', NULL, NULL, '1331916030221602818', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331916030229991426', NULL, '2020-11-26 19:01:42', NULL, NULL, '1331916030221602818', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331916030229991427', NULL, '2020-11-26 19:01:42', NULL, NULL, '1331916030221602818', 'type', 'type', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331919172480913409', NULL, '2020-11-26 19:14:11', NULL, NULL, '1331919172472524801', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331919172480913410', NULL, '2020-11-26 19:14:11', NULL, NULL, '1331919172472524801', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331922734942375938', NULL, '2020-11-26 19:28:21', NULL, NULL, '1331922734933987329', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331922734942375939', NULL, '2020-11-26 19:28:21', NULL, NULL, '1331922734933987329', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331926127605829634', NULL, '2020-11-26 19:41:49', NULL, NULL, '1331926127597441025', 'cjl', 'cjl', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331926127605829635', NULL, '2020-11-26 19:41:49', NULL, NULL, '1331926127597441025', 'cjje', 'cjje', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331926127605829636', NULL, '2020-11-26 19:41:49', NULL, NULL, '1331926127597441025', 'xsmj', 'xsmj', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331926127605829637', NULL, '2020-11-26 19:41:49', NULL, NULL, '1331926127597441025', 'cjjj', 'cjjj', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331926127605829638', NULL, '2020-11-26 19:41:49', NULL, NULL, '1331926127597441025', 'sfyj', 'sfyj', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1331926127605829639', NULL, '2020-11-26 19:41:49', NULL, NULL, '1331926127597441025', 'ydkh', 'ydkh', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334440263740825602', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'class', 'class', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334440263740825603', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'school', 'school', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334440263740825604', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'lv', 'lv', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334440263740825605', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'renyuan_jy', 'renyuan_jy', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334440263740825606', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'richang_jy', 'richang_jy', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334440263740825607', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'biaozhun_jy', 'biaozhun_jy', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334440263740825608', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'xinxi_jy', 'xinxi_jy', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334440263740825609', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'jichubokuan_jy', 'jichubokuan_jy', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334440263740825610', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'renyuan_ct', 'renyuan_ct', 'String', NULL, 9, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334440263740825611', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'richang_ct', 'richang_ct', 'String', NULL, 10, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334440263740825612', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'xiangmu_ct', 'xiangmu_ct', 'String', NULL, 11, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334440263740825613', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'jichubokuan_ct', 'jichubokuan_ct', 'String', NULL, 12, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334440263740825614', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'xiangmu_sh', 'xiangmu_sh', 'String', NULL, 13, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334440263740825615', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'jichubokuan_sh', 'jichubokuan_sh', 'String', NULL, 14, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334440263740825616', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'diannao', 'diannao', 'String', NULL, 15, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334440263740825617', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'xiaoyuanwang', 'xiaoyuanwang', 'String', NULL, 16, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135443451905', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'diqu', 'diqu', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135443451906', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'class', 'class', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135443451907', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_11', 'sales_11', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135443451908', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_12', 'sales_12', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135443451909', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_13', 'sales_13', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135443451910', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_14', 'sales_14', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135443451911', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_15', 'sales_15', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135443451912', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_16', 'sales_16', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135443451913', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_17', 'sales_17', 'String', NULL, 9, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646210', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_18', 'sales_18', 'String', NULL, 10, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646211', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_19', 'sales_19', 'String', NULL, 11, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646212', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_20', 'sales_20', 'String', NULL, 12, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646213', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_21', 'sales_21', 'String', NULL, 13, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646214', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_22', 'sales_22', 'String', NULL, 14, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646215', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_31', 'sales_31', 'String', NULL, 15, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646216', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_32', 'sales_32', 'String', NULL, 16, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646217', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_33', 'sales_33', 'String', NULL, 17, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646218', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_34', 'sales_34', 'String', NULL, 18, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646219', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_35', 'sales_35', 'String', NULL, 19, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646220', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_36', 'sales_36', 'String', NULL, 20, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646221', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_37', 'sales_37', 'String', NULL, 21, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646222', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_38', 'sales_38', 'String', NULL, 22, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646223', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_39', 'sales_39', 'String', NULL, 23, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646224', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_40', 'sales_40', 'String', NULL, 24, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646225', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_41', 'sales_41', 'String', NULL, 25, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334465135447646226', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_42', 'sales_42', 'String', NULL, 26, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015277879297', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'city', 'city', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073601', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'school', 'school', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073602', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'ncnum', 'ncnum', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073603', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'num', 'num', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073604', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'name', 'name', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073605', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'class', 'class', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073606', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'pay', 'pay', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073607', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'paytime', 'paytime', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073608', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'payclass', 'payclass', 'String', NULL, 9, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073609', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'pay1', 'pay1', 'String', NULL, 10, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073610', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'paymoth', 'paymoth', 'String', NULL, 11, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073611', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'pay2', 'pay2', 'String', NULL, 12, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073612', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'tuition_09', 'tuition_09', 'String', NULL, 13, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073613', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'meals_09', 'meals_09', 'String', NULL, 14, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073614', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'busfee_09', 'busfee_09', 'String', NULL, 15, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073615', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'tuition_10', 'tuition_10', 'String', NULL, 16, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073616', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'meals_10', 'meals_10', 'String', NULL, 17, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334708015282073617', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'busfee_10', 'busfee_10', 'String', NULL, 18, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334764504126402561', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'city', 'city', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334764504130596866', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'finish', 'finish', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334764504130596867', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'semifinish', 'semifinish', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334764504130596868', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'time', 'time', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334764504130596869', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'state', 'state', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334764504130596870', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'attribute', 'attribute', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334764504130596871', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'num', 'num', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334764504130596872', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'gnum', 'gnum', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334764504130596873', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'jnum', 'jnum', 'String', NULL, 9, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334764504130596874', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'wnum', 'wnum', 'String', NULL, 10, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334764504130596875', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'uph', 'uph', 'String', NULL, 11, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334764504130596876', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'hc', 'hc', 'String', NULL, 12, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334764504130596877', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'jtime', 'jtime', 'String', NULL, 13, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334764504130596878', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'yield', 'yield', 'String', NULL, 14, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334764504130596879', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'beizhu', 'beizhu', 'String', NULL, 15, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334782903430754305', NULL, '2020-12-04 16:53:38', NULL, NULL, '1283730831482937345', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334782903430754306', NULL, '2020-12-04 16:53:38', NULL, NULL, '1283730831482937345', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334782903430754307', NULL, '2020-12-04 16:53:38', NULL, NULL, '1283730831482937345', 'key1', 'key1', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334782903430754308', NULL, '2020-12-04 16:53:38', NULL, NULL, '1283730831482937345', 'key2', 'key2', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334782903430754309', NULL, '2020-12-04 16:53:38', NULL, NULL, '1283730831482937345', 'key3', 'key3', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334782903430754310', NULL, '2020-12-04 16:53:38', NULL, NULL, '1283730831482937345', 'key4', 'key4', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334782903430754311', NULL, '2020-12-04 16:53:38', NULL, NULL, '1283730831482937345', 'key5', 'key5', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334782903430754312', NULL, '2020-12-04 16:53:38', NULL, NULL, '1283730831482937345', 'key6', 'key6', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334782903430754313', NULL, '2020-12-04 16:53:38', NULL, NULL, '1283730831482937345', 'key7', 'key7', 'String', NULL, 9, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1334782903430754314', NULL, '2020-12-04 16:53:38', NULL, NULL, '1283730831482937345', 'percent', 'percent', 'String', NULL, 10, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('141dc952421a55e66fcddb94adddc48b', NULL, '2021-02-02 19:10:15', NULL, NULL, '9b7d28336b01f9a6b1a613957c3d7cda', 'sex', '性别', 'String', NULL, 10, 1, 1, 'sex', NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('15eb0c90635e9b9427a6e0a2d87f31b6', NULL, '2021-01-08 16:29:02', NULL, NULL, 'a543d8dd40f4d26839b78bd604be659e', 'chengbao_gz_money', 'chengbao_gz_money', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('16cca55134a7951fe6724e5d98787498', NULL, '2021-01-05 15:09:15', NULL, NULL, '2324fac242b35938678a05bbbba345e2', 'yprice', 'yprice', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('175e76d9da7c88d8c2c0d7708b308e6c', NULL, '2020-12-04 16:53:38', NULL, NULL, '28e0b01cc3e2b0d361107661527bfdff', 'key7', 'key7', 'String', NULL, 9, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('17a278c53299d1342c56a8eb1614a44e', 'admin', '2021-04-01 03:09:23', NULL, NULL, '1289140698221678593', 'ctime', 'ctime', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('19e6fe3dc95b352d97f460648dc93e15', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'proportion_z', 'proportion_z', 'String', NULL, 23, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1a1487eb23cc0008b933537c69d51bd9', NULL, '2021-01-05 15:09:15', NULL, NULL, '2324fac242b35938678a05bbbba345e2', 'cname', 'cname', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1aee61147ee0eb946574db960bc77aec', NULL, '2021-01-08 10:47:52', NULL, NULL, 'bbc5d5ab143d59f0beab484682361aa5', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1b09540b3d8deddc06ebdbec26f6ae87', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'political', 'political', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1b6fbe11728a1c4633eeea8ffb12bc25', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'update_by', 'update_by', 'String', NULL, 30, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1c649cbddf0506464e08ae84c20ea20d', NULL, '2021-01-21 18:00:57', NULL, NULL, '60b3feffadc55eb49baa5a48fdf1ff0e', 'key', 'key', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1d21c72184f2e06ca1be3dc95fbcc259', NULL, '2021-01-11 14:38:14', NULL, NULL, '1317006713165049858', 'zhiwu', 'zhiwu', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1d4cc138f277f5d78e1fe3f5241db7f2', NULL, '2021-01-08 16:29:02', NULL, NULL, 'a543d8dd40f4d26839b78bd604be659e', 'tb_zx_money', 'tb_zx_money', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1ee3018b4d0c305e2c06f77e1e5f3c4c', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'sales_3', 'sales_3', 'String', NULL, 9, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('1fac3f8219222b8963dc6b85870ffd86', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'telphone', 'telphone', NULL, NULL, 16, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('21f7de0326129dbbbc03d64aceb4d3f7', 'admin', '2021-04-01 03:09:23', NULL, NULL, '1289140698221678593', 'yprice', 'yprice', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('2309090975648b8765ef36ff16c09270', NULL, '2020-07-17 10:49:42', NULL, NULL, 'e0fe1d693625c906c1171d7de706a47c', 'danwei', 'danwei', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('2330620c6a26ff9e2840fcdcb2fd22af', NULL, '2020-07-17 10:49:42', NULL, NULL, 'e0fe1d693625c906c1171d7de706a47c', 'yphone', 'yphone', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('240f3415fa8e7b3876c0b422d468c90d', NULL, '2020-08-03 09:55:46', NULL, NULL, '6011955e58d89040fca52e7f962d0bf4', 'gname', 'gname', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('26ee0ad4aea9dcd4604f98ea168aa1be', NULL, '2020-07-28 17:46:58', NULL, NULL, '22f025b781ee9fe4746438621e82674f', 'xiaoshoujine', 'xiaoshoujine', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('27bd70e2e4a08009edf64fac0fba5119', NULL, '2020-07-17 10:49:42', NULL, NULL, 'e0fe1d693625c906c1171d7de706a47c', 'yizhu', 'yizhu', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('284f03aead3848cf0994f71a64ce1eba', NULL, '2020-12-04 16:53:38', NULL, NULL, '28e0b01cc3e2b0d361107661527bfdff', 'key1', 'key1', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('29fcb4292d4782888e9fd0496bd8ddc8', 'admin', '2021-04-01 03:09:23', NULL, NULL, '1289140698221678593', 'id', 'id', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('2a20af47c214fc8ad9570c9c6ba585c2', NULL, '2020-07-17 10:49:42', NULL, NULL, 'e0fe1d693625c906c1171d7de706a47c', 'yzhenliao', 'yzhenliao', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('2a3b35b4830f1b1eff84a5a9bceed0b6', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'gift_z', 'gift_z', 'String', NULL, 22, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('2a613408420925ed9cf9618eb77a05cf', NULL, '2020-07-17 10:49:42', NULL, NULL, 'e0fe1d693625c906c1171d7de706a47c', 'yage', 'yage', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('2baefff331206f29a9c3bf895982473a', NULL, '2020-07-17 10:49:42', NULL, NULL, 'e0fe1d693625c906c1171d7de706a47c', 'kdata', 'kdata', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('2be25d6c7e3ac28abec99854618d0e3d', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'birthday', 'birthday', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('2f94a4be25426f3f4013c50103559969', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'sales_4', 'sales_4', 'String', NULL, 12, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('30034c384d47b0193e04b19b3068b89b', NULL, '2020-12-04 16:53:38', NULL, NULL, '28e0b01cc3e2b0d361107661527bfdff', 'key4', 'key4', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('30f8183ff4ec5a6b30724a1da7fbbed0', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'pworktime', 'pworktime', NULL, NULL, 18, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('30fc020c8d14776e96350edb479f40ac', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'zhuzhi', 'zhuzhi', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('31649efb1fbc69009bdbb41f388c7d7f', NULL, '2020-07-17 10:49:42', NULL, NULL, 'e0fe1d693625c906c1171d7de706a47c', 'ysex', 'ysex', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('31bd06f8bc201628d8c9c56b29f0621e', NULL, '2020-07-17 10:49:42', NULL, NULL, 'e0fe1d693625c906c1171d7de706a47c', 'yjieguo', 'yjieguo', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('32545e398eea7bf89791cc78dd16ab12', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'yhnum', 'yhnum', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('334ffa2aec9300ff712a1f3f3143a4cd', NULL, '2021-01-08 16:29:02', NULL, NULL, '4af57d343f1d6521b71b85097b580786', 'bx_gg_moeny', 'bx_gg_moeny', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('34c933903ddf6ba5bad588d913c487c5', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'gift_4', 'gift_4', 'String', NULL, 13, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('350be7312c299482acfe44fb086f91c1', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'sales_5', 'sales_5', 'String', NULL, 15, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('35c224f8acfb063af6828b31e31f3967', NULL, '2020-12-04 16:53:38', NULL, NULL, '28e0b01cc3e2b0d361107661527bfdff', 'percent', 'percent', 'String', NULL, 10, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('35d9204189dd1d1f142a7587f89ab46c', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'email', 'email', 'String', NULL, 18, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('37868bf0bad09f6d2084340e0b05333d', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'sf4', 'sf4', 'String', NULL, 18, 0, NULL, 'ttype', NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('38b2955e0ef75d384d0d9ff8417e4945', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'sf3', 'sf3', 'String', NULL, 17, 0, NULL, 'ttype', NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('3c2a8313af79dbecba4c5687b65a66ab', 'admin', '2021-04-01 03:09:23', NULL, NULL, '1289140698221678593', 'cnum', 'cnum', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('3c71c10a0d27796808cb201e30024fe8', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'school', 'school', 'String', NULL, 14, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('3c7597c1efa73ca9400cdc36a9a48e23', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'gift_1', 'gift_1', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('3cd9d09176d10d3225e4fe86b4538739', NULL, '2020-12-17 16:59:12', NULL, NULL, '7911bd189c2d53e182693bd599a315a2', 'type', 'type', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('3d0f4b223f7ada50a7363235ae39e675', NULL, '2020-07-28 17:46:58', NULL, NULL, '22f025b781ee9fe4746438621e82674f', 'hnum', 'hnum', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('3ec76a981ff5353d4a65052963166477', NULL, '2020-12-17 17:13:21', NULL, NULL, '9b75c161322e0b7e29b3ffc84239a72c', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('3f5a04060285392287f4e7f6d59988c6', NULL, '2020-08-03 09:55:46', NULL, NULL, '6011955e58d89040fca52e7f962d0bf4', 'tdata', 'tdata', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('3f7ce1ee2ad20770e64016384f2c1cd5', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'homephone', 'homephone', NULL, NULL, 17, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('42225abb0677e51111a8e9e7b001332c', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'yjine', 'yjine', 'String', NULL, 10, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('445c1d5a76a45fb0137425d1a51be6d7', NULL, '2021-01-08 16:10:28', NULL, NULL, '4dc208eb92fd1a84ef7b4723251e3e51', 'main_income', 'main_income', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('450316da5f9b7d8505944e16f1284a38', NULL, '2021-01-08 16:10:28', NULL, NULL, '7b20679054449c554cde856ef24126ab', 'monty', 'monty', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('467edbfc6ca934a7a4d600391ed0fb75', NULL, '2021-01-08 16:29:02', NULL, NULL, '4af57d343f1d6521b71b85097b580786', 'bx_jj_yongjin', 'bx_jj_yongjin', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('468acf3a75a559a283e8f424db3ac4a8', NULL, '2020-12-04 16:53:38', NULL, NULL, '28e0b01cc3e2b0d361107661527bfdff', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('46f68d27013cff9b09c5d059c79fbf28', NULL, '2021-02-02 19:10:15', NULL, NULL, '9b7d28336b01f9a6b1a613957c3d7cda', 'gtime', '雇佣时间', 'date', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('472e430a024d9648a7ab8a125419b161', NULL, '2021-01-05 15:09:15', NULL, NULL, '2324fac242b35938678a05bbbba345e2', 'cprice', 'cprice', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('48b03a60cab1f280d4b304da6b27dae2', NULL, '2021-01-05 15:09:15', NULL, NULL, '2324fac242b35938678a05bbbba345e2', 'ctime', 'ctime', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('4942cc4d04ac7330799ecc3fec48ac8b', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'id_card', 'id_card', 'String', NULL, 12, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('49def4afc641cb52775ff03fdba3007a', NULL, '2021-01-08 16:10:28', NULL, NULL, '7b20679054449c554cde856ef24126ab', 'his_lowest', 'his_lowest', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('49fa04e98f2ed62966d7f6141611dd7e', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'children', 'children', NULL, NULL, 24, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('49febadfe1eb3a59bfbe802d506aa590', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'data', 'data', NULL, NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('4b9e347c71a67de7a7a466b07109a101', NULL, '2020-07-21 15:17:10', NULL, NULL, 'c9bdb6b7ac68accfecb366718bf78f79', 'zhaiyao', 'zhaiyao', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('4d782de2bf10be3a79f04e8841053f00', NULL, '2021-01-08 10:47:52', NULL, NULL, 'f7649b77cfc9e0a9dacdac370cd4036b', 'pingjia', 'pingjia', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('4d7dd94ecf26b5fa69f9a1f811583340', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'address', 'address', 'String', NULL, 16, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('502a0a66b4dbf8689ed36e56ab272c2f', NULL, '2021-02-02 19:10:15', NULL, NULL, '9b7d28336b01f9a6b1a613957c3d7cda', 'birth', '出生日期', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('52444b20f2fcdfe43461a5a49079e4dc', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'health', 'health', 'String', NULL, 11, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537477711047733248', 'admin', '2021-04-01 05:54:42', NULL, NULL, '537477711022567424', 'id', 'id', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537477711056121856', 'admin', '2021-04-01 05:54:42', NULL, NULL, '537477711022567424', 'name', 'name', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537477711064510464', 'admin', '2021-04-01 05:54:42', NULL, NULL, '537477711022567424', 'gtime', 'gtime', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537477711072899072', 'admin', '2021-04-01 05:54:42', NULL, NULL, '537477711022567424', 'update_by', 'update_by', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537477711077093376', 'admin', '2021-04-01 05:54:42', NULL, NULL, '537477711022567424', 'jphone', 'jphone', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537477711085481984', 'admin', '2021-04-01 05:54:42', NULL, NULL, '537477711022567424', 'birth', 'birth', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537477711093870592', 'admin', '2021-04-01 05:54:42', NULL, NULL, '537477711022567424', 'hukou', 'hukou', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537477711102259200', 'admin', '2021-04-01 05:54:42', NULL, NULL, '537477711022567424', 'laddress', 'laddress', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537477711106453504', 'admin', '2021-04-01 05:54:42', NULL, NULL, '537477711022567424', 'jperson', 'jperson', 'String', NULL, 9, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537477711110647808', 'admin', '2021-04-01 05:54:42', NULL, NULL, '537477711022567424', 'sex', 'sex', 'String', NULL, 10, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537478337303457792', 'admin', '2021-04-01 05:54:37', NULL, NULL, '537478337278291968', 'id', 'id', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537478337320235008', 'admin', '2021-04-01 05:54:37', NULL, NULL, '537478337278291968', 'create_by', 'create_by', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537478337328623616', 'admin', '2021-04-01 05:54:37', NULL, NULL, '537478337278291968', 'create_time', 'create_time', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537478337332817920', 'admin', '2021-04-01 05:54:37', NULL, NULL, '537478337278291968', 'update_by', 'update_by', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537478337341206528', 'admin', '2021-04-01 05:54:37', NULL, NULL, '537478337278291968', 'update_time', 'update_time', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537478337349595136', 'admin', '2021-04-01 05:54:37', NULL, NULL, '537478337278291968', 'data_table', 'data_table', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537478337353789440', 'admin', '2021-04-01 05:54:37', NULL, NULL, '537478337278291968', 'data_id', 'data_id', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537478337362178048', 'admin', '2021-04-01 05:54:37', NULL, NULL, '537478337278291968', 'data_content', 'data_content', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537478337370566656', 'admin', '2021-04-01 05:54:37', NULL, NULL, '537478337278291968', 'data_version', 'data_version', 'String', NULL, 9, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537478337378955264', 'admin', '2021-04-01 05:54:37', NULL, NULL, '537478337278291968', 'rownum_', 'rownum_', 'String', NULL, 10, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537478706330906624', 'admin', '2021-04-01 05:56:44', NULL, NULL, '537478706314129408', 'id', 'id', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537478706343489536', 'admin', '2021-04-01 05:56:44', NULL, NULL, '537478706314129408', 'cname', 'cname', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537478706351878144', 'admin', '2021-04-01 05:56:44', NULL, NULL, '537478706314129408', 'cnum', 'cnum', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537478706356072448', 'admin', '2021-04-01 05:56:44', NULL, NULL, '537478706314129408', 'cprice', 'cprice', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537478706360266752', 'admin', '2021-04-01 05:56:44', NULL, NULL, '537478706314129408', 'ctotal', 'ctotal', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537478706368655360', 'admin', '2021-04-01 05:56:44', NULL, NULL, '537478706314129408', 'tp', 'tp', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537478706377043968', 'admin', '2021-04-01 05:56:44', NULL, NULL, '537478706314129408', 'dtotal', 'dtotal', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537478706381238272', 'admin', '2021-04-01 05:56:44', NULL, NULL, '537478706314129408', 'ztotal', 'ztotal', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('537478706389626880', 'admin', '2021-04-01 05:56:44', NULL, NULL, '537478706314129408', 'd_id', 'd_id', 'String', NULL, 9, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('538563757aa1a49935824ce14568f27c', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'archivesdi', 'archivesdi', NULL, NULL, 34, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('53bb8b7ef4c8d8dc9b151f07929fb587', NULL, '2020-07-28 17:46:58', NULL, NULL, '22f025b781ee9fe4746438621e82674f', 'xinghao', 'xinghao', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('5406c33ff49384c2bcad5b85a9701355', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'province', 'province', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('558e3bb304d51582f225ec1d911cb4b8', NULL, '2021-01-05 15:09:15', NULL, NULL, '2324fac242b35938678a05bbbba345e2', 'id', 'id', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574537851944955904', 'admin', '2021-07-12 12:15:09', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'name', 'name', 'String', NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574537852028841984', 'admin', '2021-07-12 12:15:09', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'sex', 'sex', 'String', NULL, 1, NULL, NULL, 'sex', NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574537852054007808', 'admin', '2021-07-12 12:15:09', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'tp', 'tp', 'String', NULL, 2, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574537852070785024', 'admin', '2021-07-12 12:15:09', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'tm', 'tm', 'String', NULL, 3, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574537852079173632', 'admin', '2021-07-12 12:15:09', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'nation', 'nation', 'String', NULL, 4, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574537852095950848', 'admin', '2021-07-12 12:15:09', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'birth', 'birth', 'String', NULL, 5, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574537852108533760', 'admin', '2021-07-12 12:15:09', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'zhuzhi', 'zhuzhi', 'String', NULL, 6, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574537852125310976', 'admin', '2021-07-12 12:15:09', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'card', 'card', 'String', NULL, 7, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574537852137893888', 'admin', '2021-07-12 12:15:09', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'ydate', 'ydate', 'String', NULL, 8, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574537852150476800', 'admin', '2021-07-12 12:15:09', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'qfjg', 'qfjg', 'String', NULL, 9, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574537852163059712', 'admin', '2021-07-12 12:15:09', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'slyy', 'slyy', 'String', NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574537852175642624', 'admin', '2021-07-12 12:15:09', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'sdate', 'sdate', 'String', NULL, 11, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574537852192419840', 'admin', '2021-07-12 12:15:09', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'shao', 'shao', 'String', NULL, 12, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574537852209197056', 'admin', '2021-07-12 12:15:09', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'cbr', 'cbr', 'String', NULL, 13, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574537852221779968', 'admin', '2021-07-12 12:15:09', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'sld', 'sld', 'String', NULL, 14, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574537852238557184', 'admin', '2021-07-12 12:15:09', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'sr', 'sr', 'String', NULL, 15, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574537852272111616', 'admin', '2021-07-12 12:15:09', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'jphone', 'jphone', 'String', NULL, 16, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574537852288888832', 'admin', '2021-07-12 12:15:09', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'lzr', 'lzr', 'String', NULL, 17, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574537852305666048', 'admin', '2021-07-12 12:15:09', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'ldate', 'ldate', 'String', NULL, 18, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574537852318248960', 'admin', '2021-07-12 12:15:09', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'sk', 'sk', 'String', NULL, 19, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574537852335026176', 'admin', '2021-07-12 12:15:09', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'dizhi', 'dizhi', 'String', NULL, 20, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662045417472', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'department', 'department', NULL, NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662129303552', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'post', 'post', NULL, NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662183829504', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'data', 'data', NULL, NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662238355456', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'name', 'name', NULL, NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662263521280', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'sex', 'sex', NULL, NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662368378880', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'birth', 'birth', NULL, NULL, 6, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662393544704', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'political', 'political', NULL, NULL, 7, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662418710528', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'office', 'office', NULL, NULL, 8, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662443876352', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'nation', 'nation', NULL, NULL, 9, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662464847872', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'health', 'health', NULL, NULL, 10, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662490013696', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'register', 'register', NULL, NULL, 11, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662510985216', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'education', 'education', NULL, NULL, 12, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662531956736', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'major', 'major', NULL, NULL, 13, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662557122560', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'gdata', 'gdata', NULL, NULL, 14, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662590676992', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'mailbox', 'mailbox', NULL, NULL, 15, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662611648512', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'telphone', 'telphone', NULL, NULL, 16, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662645202944', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'homephone', 'homephone', NULL, NULL, 17, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662661980160', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'pworktime', 'pworktime', NULL, NULL, 18, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662678757376', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'entrytime', 'entrytime', NULL, NULL, 19, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662695534592', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'school', 'school', NULL, NULL, 20, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662716506112', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'idcard', 'idcard', NULL, NULL, 21, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662733283328', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'party', 'party', NULL, NULL, 22, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662745866240', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'marital', 'marital', NULL, NULL, 23, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662762643456', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'children', 'children', NULL, NULL, 24, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662779420672', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'hukoustreet', 'hukoustreet', NULL, NULL, 25, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662796197888', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'hukounum', 'hukounum', NULL, NULL, 26, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662812975104', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'hukoudi', 'hukoudi', NULL, NULL, 27, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662829752320', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'currentdi', 'currentdi', NULL, NULL, 28, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662854918144', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'currentnum', 'currentnum', NULL, NULL, 29, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662884278272', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'socialsecurity', 'socialsecurity', NULL, NULL, 30, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662905249792', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'providentfund', 'providentfund', NULL, NULL, 31, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662926221312', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'hobby', 'hobby', NULL, NULL, 32, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662942998528', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'sbtype', 'sbtype', NULL, NULL, 33, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873662959775744', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873661957337088', 'archivesdi', 'archivesdi', NULL, NULL, 34, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873663035273216', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873663005913088', 'kdate', 'kdate', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873663052050432', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873663005913088', 'jdate', 'jdate', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873663077216256', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873663005913088', 'jstudent', 'jstudent', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873663093993472', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873663005913088', 'zhuanye', 'zhuanye', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873663114964992', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873663005913088', 'zhiwu', 'zhiwu', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873663194656768', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873663161102336', 'zmphone', 'zmphone', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873663211433984', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873663161102336', 'jstudent', 'jstudent', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873663236599808', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873663161102336', 'kdate', 'kdate', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873663261765632', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873663161102336', 'jdate', 'jdate', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873663291125760', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873663161102336', 'zmname', 'zmname', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873663370817536', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873663341457408', 'zcname', 'zcname', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873663391789056', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873663341457408', 'danwei', 'danwei', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873663408566272', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873663341457408', 'fdate', 'fdate', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873663429537792', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873663341457408', 'jibie', 'jibie', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873663450509312', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873663341457408', 'beizhu', 'beizhu', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873663538589696', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873663500840960', 'danwei', 'danwei', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873663563755520', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873663500840960', 'phone', 'phone', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873663584727040', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873663500840960', 'name', 'name', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873663609892864', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873663500840960', 'zzmm', 'zzmm', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873663626670080', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873663500840960', 'guanxi', 'guanxi', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873663656030208', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873663500840960', 'age', 'age', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873663714750464', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873663693778944', 'date', 'date', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873663731527680', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873663693778944', 'mingcheng', 'mingcheng', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574873663756693504', 'admin', '2021-07-13 10:29:32', NULL, NULL, '574873663693778944', 'didian', 'didian', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875722493063168', 'admin', '2021-07-13 10:37:43', NULL, NULL, '574875722388205568', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875722530811904', 'admin', '2021-07-13 10:37:43', NULL, NULL, '574875722388205568', 'pingjia', 'pingjia', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875722551783424', 'admin', '2021-07-13 10:37:43', NULL, NULL, '574875722388205568', 'lingdao', 'lingdao', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875722581143552', 'admin', '2021-07-13 10:37:43', NULL, NULL, '574875722388205568', 'shijian', 'shijian', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875730747453440', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'department', 'department', NULL, NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875730768424960', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'post', 'post', NULL, NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875730785202176', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'data', 'data', NULL, NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875730818756608', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'name', 'name', NULL, NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875730835533824', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'sex', 'sex', NULL, NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875730856505344', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'birth', 'birth', NULL, NULL, 6, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875730885865472', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'political', 'political', NULL, NULL, 7, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875730906836992', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'office', 'office', NULL, NULL, 8, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875730932002816', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'nation', 'nation', NULL, NULL, 9, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875730961362944', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'health', 'health', NULL, NULL, 10, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875730986528768', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'register', 'register', NULL, NULL, 11, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731011694592', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'education', 'education', NULL, NULL, 12, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731070414848', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'major', 'major', NULL, NULL, 13, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731095580672', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'gdata', 'gdata', NULL, NULL, 14, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731116552192', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'mailbox', 'mailbox', NULL, NULL, 15, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731137523712', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'telphone', 'telphone', NULL, NULL, 16, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731166883840', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'homephone', 'homephone', NULL, NULL, 17, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731187855360', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'pworktime', 'pworktime', NULL, NULL, 18, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731213021184', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'entrytime', 'entrytime', NULL, NULL, 19, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731242381312', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'school', 'school', NULL, NULL, 20, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731259158528', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'idcard', 'idcard', NULL, NULL, 21, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731280130048', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'party', 'party', NULL, NULL, 22, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731305295872', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'marital', 'marital', NULL, NULL, 23, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731326267392', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'children', 'children', NULL, NULL, 24, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731343044608', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'hukoustreet', 'hukoustreet', NULL, NULL, 25, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731364016128', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'hukounum', 'hukounum', NULL, NULL, 26, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731389181952', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'hukoudi', 'hukoudi', NULL, NULL, 27, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731414347776', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'currentdi', 'currentdi', NULL, NULL, 28, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731443707904', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'currentnum', 'currentnum', NULL, NULL, 29, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731460485120', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'socialsecurity', 'socialsecurity', NULL, NULL, 30, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731489845248', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'providentfund', 'providentfund', NULL, NULL, 31, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731506622464', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'hobby', 'hobby', NULL, NULL, 32, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731527593984', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'sbtype', 'sbtype', NULL, NULL, 33, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731548565504', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875730650984448', 'archivesdi', 'archivesdi', NULL, NULL, 34, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731619868672', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875731594702848', 'kdate', 'kdate', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731640840192', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875731594702848', 'jdate', 'jdate', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731661811712', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875731594702848', 'jstudent', 'jstudent', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731678588928', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875731594702848', 'zhuanye', 'zhuanye', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731699560448', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875731594702848', 'zhiwu', 'zhiwu', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731762475008', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875731737309184', 'zmphone', 'zmphone', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731779252224', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875731737309184', 'jstudent', 'jstudent', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731800223744', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875731737309184', 'kdate', 'kdate', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731812806656', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875731737309184', 'jdate', 'jdate', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731833778176', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875731737309184', 'zmname', 'zmname', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731892498432', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875731867332608', 'zcname', 'zcname', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731909275648', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875731867332608', 'danwei', 'danwei', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731926052864', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875731867332608', 'fdate', 'fdate', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731942830080', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875731867332608', 'jibie', 'jibie', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875731959607296', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875731867332608', 'beizhu', 'beizhu', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875732018327552', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875731997356032', 'danwei', 'danwei', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875732030910464', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875731997356032', 'phone', 'phone', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875732047687680', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875731997356032', 'name', 'name', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875732068659200', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875731997356032', 'zzmm', 'zzmm', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875732085436416', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875731997356032', 'guanxi', 'guanxi', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875732102213632', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875731997356032', 'age', 'age', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875732148350976', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875732131573760', 'date', 'date', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875732165128192', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875732131573760', 'mingcheng', 'mingcheng', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('574875732181905408', 'admin', '2021-07-13 10:37:45', NULL, NULL, '574875732131573760', 'didian', 'didian', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('57ee0e6ffe7135a943dde2408d424c97', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'proportion_1', 'proportion_1', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('589a5a4fe61fc71aa1bf45d3bd73974b', NULL, '2020-12-17 19:50:14', NULL, NULL, 'fb70a91730f087f8023afd88d24f9697', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('5a88459afcf01cc20ac5a50322b35fd6', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'hukounum', 'hukounum', NULL, NULL, 26, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('5b7f7bebf0c3951b891026e7c2ac90cb', NULL, '2020-08-03 09:55:46', NULL, NULL, '6011955e58d89040fca52e7f962d0bf4', 'didian', 'didian', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('5bc99af9cfddd240794167a6765a1517', NULL, '2021-01-08 16:29:02', NULL, NULL, '4af57d343f1d6521b71b85097b580786', 'neikong_zx_money', 'neikong_zx_money', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('5bf6aee0bd8f676a218e0210e9e6fa0e', NULL, '2020-12-17 16:59:12', NULL, NULL, '7911bd189c2d53e182693bd599a315a2', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('5cf4a1ca15691d6340e522e1831dc3ac', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'sales_6', 'sales_6', 'String', NULL, 18, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('5e4e8b7531a88f4db1a0d133de159494', NULL, '2020-08-03 09:55:46', NULL, NULL, '6011955e58d89040fca52e7f962d0bf4', 'num', 'num', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('6020e457162b86b75a2d335999ab06ec', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'nation', 'nation', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('631632bc2243018788d11d4f8348bfd2', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'socialsecurity', 'socialsecurity', NULL, NULL, 30, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('6394ea45a090ca79cfbfdbbfe2016d95', NULL, '2020-07-17 10:49:42', NULL, NULL, 'e0fe1d693625c906c1171d7de706a47c', 'yprice', 'yprice', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('64ff8b4e61a58a0ca3e34108c9bd97c0', NULL, '2021-01-08 16:29:02', NULL, NULL, 'a543d8dd40f4d26839b78bd604be659e', 'bx_gg_moeny', 'bx_gg_moeny', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('665f13c7fcebac6c35c894d885c4b344', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'proportion_6', 'proportion_6', 'String', NULL, 20, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('677bf4d6400fc465067b0d5bd6ad2a58', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'gift_2', 'gift_2', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('6a3544cc8c028e94692bb1b448620ec2', NULL, '2020-07-17 10:49:42', NULL, NULL, 'e0fe1d693625c906c1171d7de706a47c', 'yname', 'yname', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('6c2b1c9e4cfd3f6b79d0fb26fea72cec', NULL, '2020-08-03 09:55:46', NULL, NULL, '6011955e58d89040fca52e7f962d0bf4', 'zhaiyao', 'zhaiyao', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('6c8250304aa25753f64c6f4723e6d2d8', NULL, '2020-07-28 17:46:58', NULL, NULL, '22f025b781ee9fe4746438621e82674f', 'fahuocangku', 'fahuocangku', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('6d4b24ab2f685556d6161a86658329c8', NULL, '2021-01-21 16:25:09', NULL, NULL, 'd4a29dfda94357308faf62be2b94db08', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('6dae70a5323b3d517c8f13278f0e1d5f', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'proportion_5', 'proportion_5', 'String', NULL, 17, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('6ec41a06e2dee9ec8f07a894ddcaaae5', NULL, '2021-02-02 19:10:15', NULL, NULL, '9b7d28336b01f9a6b1a613957c3d7cda', 'jphone', 'jphone', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('70abaf24c413f38ff6a3c315ad8824b2', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'height', 'height', 'String', NULL, 9, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('710104c3e0541602a151d5e00fc2ee29', NULL, '2020-12-17 16:42:21', NULL, NULL, '654609e4247a0469e0b2befbc69b00f9', 'type', 'type', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('718a062a1e42276c1913c7d7836b1bee', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'hobby', 'hobby', NULL, NULL, 32, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('71cb567cd27fda05d55d80324c7b59e1', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'del_flag', 'del_flag', 'String', NULL, 32, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('729c2d2c70da0f3bc092f4aab4432244', NULL, '2020-12-17 16:42:21', NULL, NULL, '654609e4247a0469e0b2befbc69b00f9', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('732c8b168ade2e34974c9db6396df61f', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'type', 'type', 'String', NULL, 12, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('742954cf518d8026db68cc87c017ad2a', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'bz', 'bz', 'String', NULL, 19, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('765d95a760a36d0c853bec639af85302', NULL, '2021-01-05 15:09:15', NULL, NULL, '2324fac242b35938678a05bbbba345e2', 'bianma', 'bianma', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('768fb670937ab4aadde39842df36bfd3', 'admin', '2021-04-01 03:09:23', NULL, NULL, '1289140698221678593', 'cprice', 'cprice', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('79f29ea3b1c7ec966077941fdd004e4d', NULL, '2021-01-08 16:29:02', NULL, NULL, 'a543d8dd40f4d26839b78bd604be659e', 'bx_zx_money', 'bx_zx_money', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('7b794ecee6f61f64839eb1094a7c20bb', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'region', 'region', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('7c2c06cc52978c4e5665deac1784535d', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'yren', 'yren', 'String', NULL, 9, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('7df83cf21e083451a47f2f731a225a7e', NULL, '2020-07-28 17:46:58', NULL, NULL, '22f025b781ee9fe4746438621e82674f', 'num', 'num', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('7e564f212697079394030ac0563df496', NULL, '2020-06-16 18:14:25', NULL, NULL, 'e4cec9ff15bc0ea42f536a442a6d1335', 'id', 'id', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('7f5570e3056d82210d7d4e79b861560c', NULL, '2021-02-02 19:10:15', NULL, NULL, '9b7d28336b01f9a6b1a613957c3d7cda', 'laddress', 'laddress', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('80017f23232ea91ae32e4718eb10e8c3', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'proportion_4', 'proportion_4', 'String', NULL, 14, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('80b5e3fd550d9be1a8c8ea69a2a593f8', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'birth', 'birth', NULL, NULL, 6, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('81dea8f0ccba2b3530038ebcf92b36b1', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'name', 'name', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('81f2de244fa1e6b5f28419f60c4db169', NULL, '2020-06-16 18:14:25', NULL, NULL, 'e4cec9ff15bc0ea42f536a442a6d1335', 'bnum', 'bnum', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('83da395758d9bca23b2c5b9f54e79eed', NULL, '2021-01-21 16:25:09', NULL, NULL, 'd4a29dfda94357308faf62be2b94db08', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('84391d55c9bd4185c4abbc0d9a8a3f9b', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'native_place', 'native_place', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('85263a305fba4c7e7a991ed3b416e006', NULL, '2020-12-17 16:42:21', NULL, NULL, '654609e4247a0469e0b2befbc69b00f9', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('865ca077977b78934e5e82e733ef4e47', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'major', 'major', 'String', NULL, 15, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('8749d00c6c3cf873841a227a5206478a', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'sales_1', 'sales_1', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('87f43f4f5220c34a95d55ff3fa9de0c1', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'health', 'health', NULL, NULL, 10, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('8875e4280c1a62759ec4b3719b5f9566', NULL, '2021-01-08 10:47:52', NULL, NULL, 'bbc5d5ab143d59f0beab484682361aa5', 'lingdao', 'lingdao', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('88b19703dac5a5ae8c01c68101cd8b5b', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'cbz', 'cbz', 'String', NULL, 14, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('89bd5c1f5b37b82ab2d56d8c9e50a674', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'sex', 'sex', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('8a122291db744a6109a93af5d289787f', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'computer_level', 'computer_level', 'String', NULL, 22, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('8ab8d51dfb792cdc767e68d7e9370f3d', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'num', 'num', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('8bfc84f6d610581d736fcccc5f04a863', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'scard', 'scard', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('8d186f249df9e1c1c549fbdc6a0a4d77', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'currentdi', 'currentdi', NULL, NULL, 28, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('8db810062e3a19eb83fca651691b848e', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'sales_2', 'sales_2', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('8e39d42a7fad183fe75ce1a56f148db1', 'admin', '2021-04-01 03:09:23', NULL, NULL, '1289140698221678593', 'bianma', 'bianma', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('8fb12c3929ea745f94cc4a90df9d5181', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'idcard', 'idcard', NULL, NULL, 21, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('9168272dc8fa019a861f11b81bea1dc2', NULL, '2021-01-08 16:29:02', NULL, NULL, 'a543d8dd40f4d26839b78bd604be659e', 'bx_jj_yongjin', 'bx_jj_yongjin', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('9238ae757fb73c0ef546d7e0e91aa662', NULL, '2020-07-28 17:46:58', NULL, NULL, '22f025b781ee9fe4746438621e82674f', 's_id', 's_id', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('9282683fd000d19b205ad6841f0f7b6e', NULL, '2021-01-08 16:29:02', NULL, NULL, '4af57d343f1d6521b71b85097b580786', 'total', 'total', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('94fc5c2791e2e218383864b80095c89c', NULL, '2021-02-02 19:10:15', NULL, NULL, '9b7d28336b01f9a6b1a613957c3d7cda', 'id', 'id', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('95486ef4c7e0f3f3ac4ce249b1c761a1', NULL, '2020-07-28 17:46:58', NULL, NULL, '22f025b781ee9fe4746438621e82674f', 'id', 'id', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('95650b0335c6981bf0d657e11b1b2082', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'hysr', 'hysr', 'String', NULL, 11, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('9a5f78c12595cb66d3b630962f7cd7bf', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'sf1', 'sf1', 'String', NULL, 15, 0, NULL, 'ttype', NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('9b77e74bed080cbd798d223bb0177c5d', NULL, '2020-07-21 15:17:10', NULL, NULL, 'c9bdb6b7ac68accfecb366718bf78f79', 'didian', 'didian', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('9bb9b5329f79564ec030694a639ffd7f', NULL, '2021-01-08 16:29:02', NULL, NULL, '4af57d343f1d6521b71b85097b580786', 'bx_zx_money', 'bx_zx_money', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('9bf1e9bc4e887eb0816365262d0e9c8e', NULL, '2020-07-28 17:46:58', NULL, NULL, '22f025b781ee9fe4746438621e82674f', 'zhekoulv', 'zhekoulv', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('9d3986d3a32e9b4672dc2b29174749f3', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'rk', 'rk', 'String', NULL, 13, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('9d6a3a8b9cf5c659e7d752028b70da8b', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'sf2', 'sf2', 'String', NULL, 16, 0, NULL, 'ttype', NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('9ddf87596d6701eda383c3d8d7853b2b', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'education', 'education', 'String', NULL, 13, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('9e28f1951ea83b6e6dae4e3892baea90', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'positional_titles', 'positional_titles', 'String', NULL, 25, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('a15e649faa93fbae15a66f5266bd9336', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'phone', 'phone', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('a17a61990a30e0cfbe4c7169dafcd85d', NULL, '2020-07-21 15:17:10', NULL, NULL, 'c9bdb6b7ac68accfecb366718bf78f79', 'id', 'id', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('a1b7ffeb00d30e7c0a1a1f466dd1fe06', NULL, '2020-12-04 16:53:38', NULL, NULL, '28e0b01cc3e2b0d361107661527bfdff', 'key2', 'key2', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('a200ec7a67ded4302744ee7e4e156d13', NULL, '2021-01-08 16:10:28', NULL, NULL, '4dc208eb92fd1a84ef7b4723251e3e51', 'monty', 'monty', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('a2e680c356e712b43343d589539da011', NULL, '2021-01-08 10:47:52', NULL, NULL, 'f7649b77cfc9e0a9dacdac370cd4036b', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('a379ebc1ac4dd2d567eee55c403ab2a3', NULL, '2020-07-21 15:17:10', NULL, NULL, 'c9bdb6b7ac68accfecb366718bf78f79', 'gname', 'gname', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('a42eed89da67da0653650edcc1576f8c', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'currentnum', 'currentnum', NULL, NULL, 29, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('a93ce07361b9d6ec02a58cf7f6b94664', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'political', 'political', NULL, NULL, 7, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('a949c4beac3fec79e96309a6d2d8f5bb', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'entrytime', 'entrytime', NULL, NULL, 19, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('a9c7c96a412537b4da3df68ff8e93cc8', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'post', 'post', NULL, NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('a9e4bf3b458d821307e0749f6e119f8d', NULL, '2021-01-08 16:10:28', NULL, NULL, '4dc208eb92fd1a84ef7b4723251e3e51', 'total', 'total', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('aa26aca6685baef7b24189214866f370', NULL, '2021-01-21 18:00:57', NULL, NULL, '60b3feffadc55eb49baa5a48fdf1ff0e', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('ab0aabf8cc08327a4510420bd553e6c0', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'providentfund', 'providentfund', NULL, NULL, 31, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('ab4ee4418e54c4a4fef3c14ad8e98fa5', NULL, '2021-01-08 16:29:02', NULL, NULL, 'a543d8dd40f4d26839b78bd604be659e', 'neikong_zx_money', 'neikong_zx_money', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('ad0b3d410c53378134428afb1b063758', NULL, '2021-01-08 16:10:28', NULL, NULL, '4dc208eb92fd1a84ef7b4723251e3e51', 'his_average', 'his_average', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('ad146af051ba273a480223d49f59358b', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'hukoustreet', 'hukoustreet', NULL, NULL, 25, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('ad1d1fe2ee182c2d3a263a127fea041e', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'proportion_2', 'proportion_2', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('ae5ec6e56478a098b36587e93b1d8908', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'arrival_time', 'arrival_time', 'String', NULL, 24, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('aee0188ab2bf9849607f6ef34b36713e', NULL, '2020-12-17 17:13:21', NULL, NULL, '9b75c161322e0b7e29b3ffc84239a72c', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('aee106a24b11b0f8ca10bc88b62189d7', NULL, '2020-08-03 09:55:46', NULL, NULL, '6011955e58d89040fca52e7f962d0bf4', 'gdata', 'gdata', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('aee31ce5eb6271601bc4e6f8affaceb0', NULL, '2020-06-16 18:14:25', NULL, NULL, 'e4cec9ff15bc0ea42f536a442a6d1335', 'hezairen', 'hezairen', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('b14588abed341d314a08d316dfde553f', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'work_experience', 'work_experience', 'String', NULL, 27, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('b1de05c2d02cdde59c1e2a93e45964f9', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'create_time', 'create_time', 'String', NULL, 29, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('b279ab8f7d20ebbeec67f5bf2109ba22', NULL, '2021-01-08 16:10:28', NULL, NULL, '7b20679054449c554cde856ef24126ab', 'his_average', 'his_average', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('b2c01550c60da7b1babf36d8535fcaed', NULL, '2021-01-08 10:47:52', NULL, NULL, 'bbc5d5ab143d59f0beab484682361aa5', 'shijian', 'shijian', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('b3c98ed9cb9e4a234273aa4921efd545', NULL, '2020-06-16 18:14:25', NULL, NULL, 'e4cec9ff15bc0ea42f536a442a6d1335', 'jpnum', 'jpnum', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('b450669f376fa9f075ac403c7d7f2ee9', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'proportion_3', 'proportion_3', 'String', NULL, 11, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('b46d80bfe53372b6ff92a6f8e8bf38df', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'hukoudi', 'hukoudi', NULL, NULL, 27, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('b5afa6c7c63f649460d4d45b7d697098', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'zip_code', 'zip_code', 'String', NULL, 17, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('b5df568754994e67a15a8f5b8d4bc297', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'phone', 'phone', 'String', NULL, 19, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('b60fbeff0c77080cb73aa6aaf6dd8715', NULL, '2020-07-28 17:46:58', NULL, NULL, '22f025b781ee9fe4746438621e82674f', 'danjia', 'danjia', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('b6884ea117811c5161ff1eb11502cf19', NULL, '2020-07-21 15:17:10', NULL, NULL, 'c9bdb6b7ac68accfecb366718bf78f79', 'num', 'num', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('b81d3a495af538759aa6dbaf752c48db', NULL, '2020-12-04 16:53:38', NULL, NULL, '28e0b01cc3e2b0d361107661527bfdff', 'key6', 'key6', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('b863f83ac64327d86f36c8796a00f777', NULL, '2020-06-16 18:14:25', NULL, NULL, 'e4cec9ff15bc0ea42f536a442a6d1335', 'jieshu', 'jieshu', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('b8aafd56ddcf6902909722c7d2529797', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'department', 'department', NULL, NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('ba83ad8a89105b198aa49798f2940c29', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'foreign_language', 'foreign_language', 'String', NULL, 20, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('bb8db85fed8034645c5517b6283addc7', NULL, '2020-12-04 16:53:38', NULL, NULL, '28e0b01cc3e2b0d361107661527bfdff', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('bd09800edb1343880b05b65974875597', NULL, '2020-07-21 15:17:10', NULL, NULL, 'c9bdb6b7ac68accfecb366718bf78f79', 'tdata', 'tdata', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('c17be48ad3705f848acdb28cbe3bc1b7', NULL, '2020-07-28 17:46:58', NULL, NULL, '22f025b781ee9fe4746438621e82674f', 'hname', 'hname', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('c1913cffe0a0a65b8f76ef280af93038', NULL, '2021-01-08 16:29:02', NULL, NULL, '4af57d343f1d6521b71b85097b580786', 'tb_zx_money', 'tb_zx_money', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('c2b7ed56f87bc4cb95c8e1e0300e51ff', NULL, '2020-07-17 10:49:42', NULL, NULL, 'e0fe1d693625c906c1171d7de706a47c', 'ytotal', 'ytotal', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('c357b23ae68c0ee6c9dab322507dce0b', NULL, '2021-01-11 14:38:14', NULL, NULL, '1317006713165049858', 'jdate', 'jdate', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('c3b0443ebecc7152343c5ea3ef32a38f', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'graduation_time', 'graduation_time', 'String', NULL, 23, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('c3d8cd6e68c605fd6d6ac217fed5c8d4', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'weight', 'weight', 'String', NULL, 10, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('c3fe8f62ea0c6ce9990bfa22dc0265b6', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'major', 'major', NULL, NULL, 13, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('c40fe2cf7a74a6e96575f73ef5e7d205', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'nation', 'nation', NULL, NULL, 9, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('c4d6132699dcdff382c93ab10d64551a', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'education_experience', 'education_experience', 'String', NULL, 26, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('c57bd36c25b13a8149268496e54052ae', NULL, '2020-12-17 19:50:14', NULL, NULL, 'fb70a91730f087f8023afd88d24f9697', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('c5a801ff78f2ca6b1b7a03b3222fdd61', NULL, '2021-01-08 16:29:02', NULL, NULL, '4af57d343f1d6521b71b85097b580786', 'biz_income', 'biz_income', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('c6144f2ca7422a71e951abea1bce6aaf', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'education', 'education', NULL, NULL, 12, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('c6820a1e3308badb60582998805a0645', NULL, '2020-06-16 18:14:25', NULL, NULL, 'e4cec9ff15bc0ea42f536a442a6d1335', 'shihelv', 'shihelv', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('c74ee42894f54c0ebc1a64a79395aa06', NULL, '2020-12-04 16:53:38', NULL, NULL, '28e0b01cc3e2b0d361107661527bfdff', 'key3', 'key3', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('c8d1276d19bdd946e9fc18b83aacda15', 'admin', '2021-04-01 03:09:23', NULL, NULL, '1289140698221678593', 'cname', 'cname', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('c904e40b35f065cbefd0b22fd5937b38', NULL, '2021-01-21 18:00:57', NULL, NULL, '60b3feffadc55eb49baa5a48fdf1ff0e', 'description', 'description', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('c98a41c7d5edcba47273e192b9d66b9b', NULL, '2020-07-28 17:46:58', NULL, NULL, '22f025b781ee9fe4746438621e82674f', 'beizhu', 'beizhu', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('cc91f43bf975f056944b5ec19266ec9c', NULL, '2020-12-17 16:59:12', NULL, NULL, '7911bd189c2d53e182693bd599a315a2', 'value', 'value', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('ce81562be14047bcbc29c0a66782fc42', NULL, '2021-01-21 17:07:16', NULL, NULL, '6a1d22ca4c95e8fab655d3ceed43a84d', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('cec893b2241134ba9b03ed6d4edf2919', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'marital', 'marital', NULL, NULL, 23, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('cf9d32fea2f67e4b11cd2823dbbefbad', NULL, '2020-08-03 09:55:46', NULL, NULL, '6011955e58d89040fca52e7f962d0bf4', 'id', 'id', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('d076942aecee8f5197b66eb382ba1995', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'sbtype', 'sbtype', NULL, NULL, 33, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('d1d67bf8aea628bba4d28dfede489d55', NULL, '2021-01-08 16:10:28', NULL, NULL, '4dc208eb92fd1a84ef7b4723251e3e51', 'his_highest', 'his_highest', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('d3ef9876d3c56889157747be606f70fc', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'gift_6', 'gift_6', 'String', NULL, 19, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('d5b7b92023a2fb09fed9d36a4ac7b3e3', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'sales_z', 'sales_z', 'String', NULL, 21, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('d6accb7bb835271d1284d8a3dc394c1f', NULL, '2020-07-28 17:46:58', NULL, NULL, '22f025b781ee9fe4746438621e82674f', 'danwei', 'danwei', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('db503c31de99f35cbcb1f66a69f9964c', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'mailbox', 'mailbox', NULL, NULL, 15, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('dd56fbd98db5c1cda9dd77637ba1c7e6', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'create_by', 'create_by', 'String', NULL, 28, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('dfbc8bba6261dcd4ceb3da5f517a0d58', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'school', 'school', NULL, NULL, 20, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('e1fffff7030dd37d70d7b5a138046fac', NULL, '2020-12-04 16:53:38', NULL, NULL, '28e0b01cc3e2b0d361107661527bfdff', 'key5', 'key5', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('e52e7896193ad09d700599d2ef6fa8ae', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'knum', 'knum', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('e757987004087de43f1ccab14092361f', NULL, '2020-07-17 10:49:42', NULL, NULL, 'e0fe1d693625c906c1171d7de706a47c', 'yishe', 'yishe', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('e7f6104183a7b2408f72b91f4638e9e2', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'gift_3', 'gift_3', 'String', NULL, 10, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('ea6018bdbd9fb192b1d3f9e832b5d382', NULL, '2021-02-02 19:10:15', NULL, NULL, '9b7d28336b01f9a6b1a613957c3d7cda', 'name', '姓名', 'string', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('ec6c6f56c64de5f4de16166000f31d19', NULL, '2020-06-16 18:14:25', NULL, NULL, 'e4cec9ff15bc0ea42f536a442a6d1335', 'ftime', 'ftime', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('ef685270770a69bddb4f24e37eed9dc0', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'office', 'office', NULL, NULL, 8, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('efe17d82b5daaa3f95364e9afaeffd1c', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'register', 'register', NULL, NULL, 11, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('efe4e0110a61d9791e18308aed422aa7', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'name', 'name', NULL, NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('f110f1f947e0f895b552f7edd133a60a', 'admin', '2021-04-01 03:09:23', NULL, NULL, '1289140698221678593', 'ctotal', 'ctotal', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('f11af753ccbf495818e9c23c1b083ae2', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'foreign_language_level', 'foreign_language_level', 'String', NULL, 21, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('f1905f7a175f8e56afd8f6c2969582e6', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'gift_5', 'gift_5', 'String', NULL, 16, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('f192c538d9cb0dc88e537b11a37551c8', NULL, '2021-01-08 16:10:28', NULL, NULL, '4dc208eb92fd1a84ef7b4723251e3e51', 'his_lowest', 'his_lowest', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('f31715d024bad06ea8862ba383e87f5b', NULL, '2021-01-05 15:09:15', NULL, NULL, '2324fac242b35938678a05bbbba345e2', 'cnum', 'cnum', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('f3b4e31c7ff6a365c4130cbc695e2621', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'num', 'num', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('f430837a3f4c08f425bcd1de46d3a2d3', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'sex', 'sex', NULL, NULL, 5, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('f53143608c570f9886861442be87b5ff', NULL, '2021-02-02 19:10:15', NULL, NULL, '9b7d28336b01f9a6b1a613957c3d7cda', 'update_by', '职务', 'String', NULL, 4, 1, 3, 'zhiwu', NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('f82904af04e557b12dcfe3562900597c', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'gdata', 'gdata', NULL, NULL, 14, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('f9154d882408b868253ed8fb87879220', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'name', 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('f95dd09a118b93cc7884b12118448ed4', NULL, '2021-02-02 19:10:15', NULL, NULL, '9b7d28336b01f9a6b1a613957c3d7cda', 'hukou', 'hukou', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('f978117e8eda0daee2c00223f9df4b48', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'update_time', 'update_time', 'String', NULL, 31, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('f984ef26fe0a505b279a0e4a3b27201f', NULL, '2021-01-08 10:47:52', NULL, NULL, 'f7649b77cfc9e0a9dacdac370cd4036b', 'shijian', 'shijian', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('fa6fce04eaee2480faa8a14393ffe15a', NULL, '2021-01-08 16:29:02', NULL, NULL, 'a543d8dd40f4d26839b78bd604be659e', 'total', 'total', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('fac871f69237c6c25abe8c4332eabcbf', NULL, '2021-01-08 10:47:52', NULL, NULL, 'f7649b77cfc9e0a9dacdac370cd4036b', 'lingdao', 'lingdao', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('fc07c053ed0ecbfcc45041640acf6cb1', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'party', 'party', NULL, NULL, 22, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('fe3b1449ce346836f47234ca65949aea', NULL, '2020-06-16 18:14:25', NULL, NULL, 'e4cec9ff15bc0ea42f536a442a6d1335', 'sfkong', 'sfkong', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_field` VALUES ('ffb5fbe81d2cf48ca45a815c676fd9eb', NULL, '2020-06-16 18:14:25', NULL, NULL, 'e4cec9ff15bc0ea42f536a442a6d1335', 'kaishi', 'kaishi', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); + +-- ---------------------------- +-- Table structure for jimu_report_db_param +-- ---------------------------- +DROP TABLE IF EXISTS `jimu_report_db_param`; +CREATE TABLE `jimu_report_db_param` ( + `id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `jimu_report_head_id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '动态报表ID', + `param_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '参数字段', + `param_txt` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '参数文本', + `param_value` varchar(1000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '参数默认值', + `order_num` int(11) NULL DEFAULT NULL COMMENT '排序', + `create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人登录名称', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期', + `update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人登录名称', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期', + `search_flag` int(1) NULL DEFAULT NULL COMMENT '查询标识0否1是 默认0', + `widget_type` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '查询控件类型', + `search_mode` int(1) NULL DEFAULT NULL COMMENT '查询模式1简单2范围', + `dict_code` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '字典', + `search_format` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '查询时间格式化表达式', + `ext_json` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '参数配置', + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_jmrheadid`(`jimu_report_head_id`) USING BTREE, + INDEX `idx_jrdp_jimu_report_head_id`(`jimu_report_head_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of jimu_report_db_param +-- ---------------------------- +INSERT INTO `jimu_report_db_param` VALUES ('078d99565feef91904c84b42b43f5174', '1273495682564534273', 'id', 'id', '1', 1, NULL, '2020-08-03 09:55:26', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('0d91170e4546cdbebbc3e9cc7879ce79', '22f025b781ee9fe4746438621e82674f', 'id', 'id', '1', 1, NULL, '2020-07-21 15:31:51', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('1324279360203526146', '1324279359998005250', 'pageSize', 'pageSize', '10', 2, NULL, '2020-08-03 15:19:54', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('1324279360220303361', '1324279359998005250', 'pageNo', 'pageNo', '1', 1, NULL, '2020-08-03 15:19:54', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('143f8c164072ddbdeafec5c5b1466827', '1272858455908073473', 'id', 'id', '1', 1, NULL, '2020-07-21 15:31:51', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('173c869cc45b683a9cfe25826110cead', '1272834687525482497', 'id', 'id', '1', 1, NULL, '2020-08-03 09:57:08', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('1805eb351a966dc3c039b5239b6faa49', '1291310198925840385', 'sex', 'sex', '男', 2, NULL, '2020-06-08 15:21:09', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('256eb2f8582ce4d74559b1fc1e2917ca', '1291310198925840385', 'id', 'id', '111', 1, NULL, '2020-06-08 15:21:09', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('3957799c20fcc696d680cca9649897bb', 'e4cec9ff15bc0ea42f536a442a6d1335', 'id', 'id', '1', 1, NULL, '2020-08-03 09:57:08', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('3a9efc51a6b6723d5a0ddf109aacb2b5', '1288038655293661186', 'pageNo', 'pageNo', '1', 1, 'admin', '2021-04-01 03:09:40', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('3ced36c7a2cce40c667cc485bf59cd11', '1291217511962902530', 'pageSize', 'pageSize', '10', 2, NULL, '2020-08-03 15:19:54', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('49bd3f212cd6c406c8584e6bb0d9cf93', '1291549569390243841', 'pageSize', 'pageSize', '10', 2, NULL, '2020-07-30 17:26:29', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('52db6da75ea733ae741c62cc54c85d92', '6011955e58d89040fca52e7f962d0bf4', 'id', 'id', '1', 1, NULL, '2020-08-03 09:55:46', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('57165a6fe5f2b700d4ef19518de4defd', '1290104038414721025', 'id', 'id', '1', 1, NULL, '2020-08-03 09:55:46', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('7569e95c1fa73d5438aceb19c1b85ef0', '1288038655293661186', 'pageSize', 'pageSize', '20', 2, 'admin', '2021-04-01 03:09:40', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('7d7765754aadaddab91bf1257447ae73', '1291549569390243841', 'pageNo', 'pageNo', '1', 1, NULL, '2020-07-30 17:26:29', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('8bff26e0c3fe48ddd41cf8d939ad4f2c', '2324fac242b35938678a05bbbba345e2', 'pageSize', 'pageSize', '10', 2, NULL, '2020-08-03 15:19:54', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('90b22a058cc331146b548bc93f09b5cd', '1289140698221678593', 'pageSize', 'pageSize', '20', 2, 'admin', '2021-04-01 03:09:23', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('944eaee4cb7639a435aadbf2ad7469a0', '2324fac242b35938678a05bbbba345e2', 'pageNo', 'pageNo', '1', 1, NULL, '2020-08-03 15:19:54', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('a29c10ed01c6608e899e1368f2d5d7e3', '1316997232402231298', 'id', 'id', '1', 1, NULL, '2021-01-13 14:31:13', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('a803707f3383dd9f4685fadc7efa07f4', '1224643501392728065', 'sex', 'sex', '男', 2, NULL, '2020-06-08 15:21:09', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('b7c34e8a3c2804715825af4bdbcf857a', '1224643501392728065', 'id', 'id', '111', 1, NULL, '2020-06-08 15:21:09', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('d8010a4ffbe567e6117e7f59641aeb7c', '1289140698221678593', 'pageNo', 'pageNo', '1', 1, 'admin', '2021-04-01 03:09:23', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('d9d94d6b09dd074f39af96d7a4696f9a', '1291217511962902530', 'pageNo', 'pageNo', '1', 1, NULL, '2020-08-03 15:19:54', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jimu_report_db_param` VALUES ('ec09a8b27e7e9ec9dbc683fc5a38faec', 'c9bdb6b7ac68accfecb366718bf78f79', 'id', 'id', '1', 1, NULL, '2020-08-03 09:55:26', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); + +-- ---------------------------- +-- Table structure for jimu_report_link +-- ---------------------------- +DROP TABLE IF EXISTS `jimu_report_link`; +CREATE TABLE `jimu_report_link` ( + `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键id', + `report_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '积木设计器id', + `parameter` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '参数', + `eject_type` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '弹出方式(0 当前页面 1 新窗口)', + `link_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '链接名称', + `api_method` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '请求方法0-get,1-post', + `link_type` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '链接方式(0 网络报表 1 网络连接 2 图表联动)', + `api_url` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '外网api', + `link_chart_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '联动图表的ID', + `expression` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '表达式', + `requirement` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '条件', + PRIMARY KEY (`id`) USING BTREE, + INDEX `uniq_link_reportid`(`report_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '超链接配置表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for jimu_report_map +-- ---------------------------- +DROP TABLE IF EXISTS `jimu_report_map`; +CREATE TABLE `jimu_report_map` ( + `id` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键', + `label` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '地图名称', + `name` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '地图编码', + `data` longtext CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '地图数据', + `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + `del_flag` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '0表示未删除,1表示删除', + `sys_org_code` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '所属部门', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `uniq_jmreport_map_name`(`name`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '地图配置表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of jimu_report_map +-- ---------------------------- +INSERT INTO `jimu_report_map` VALUES ('1235103352843448322', '中国地图(大屏默认)', 'CHINA', '{\n \"type\": \"FeatureCollection\",\n \"features\": [\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 110000,\n \"name\": \"北京市\",\n \"center\": [\n 116.405285,\n 39.904989\n ],\n \"centroid\": [\n 116.41989,\n 40.189913\n ],\n \"childrenNum\": 16,\n \"level\": \"province\",\n \"subFeatureIndex\": 0,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 117.210024,\n 40.082262\n ],\n [\n 117.105315,\n 40.074479\n ],\n [\n 117.105315,\n 40.074479\n ],\n [\n 117.102851,\n 40.073563\n ],\n [\n 117.102235,\n 40.073105\n ],\n [\n 117.102235,\n 40.073105\n ],\n [\n 117.102851,\n 40.073563\n ],\n [\n 116.999989,\n 40.030053\n ],\n [\n 116.927924,\n 40.054788\n ],\n [\n 116.783794,\n 40.035093\n ],\n [\n 116.757925,\n 39.968176\n ],\n [\n 116.786874,\n 39.886963\n ],\n [\n 116.926076,\n 39.835524\n ],\n [\n 116.949482,\n 39.778529\n ],\n [\n 116.902055,\n 39.763813\n ],\n [\n 116.90575,\n 39.687883\n ],\n [\n 116.812128,\n 39.616018\n ],\n [\n 116.717273,\n 39.603572\n ],\n [\n 116.717273,\n 39.603572\n ],\n [\n 116.720969,\n 39.599884\n ],\n [\n 116.720969,\n 39.599884\n ],\n [\n 116.726512,\n 39.595274\n ],\n [\n 116.726512,\n 39.595274\n ],\n [\n 116.703106,\n 39.588819\n ],\n [\n 116.703106,\n 39.588819\n ],\n [\n 116.607636,\n 39.619705\n ],\n [\n 116.524484,\n 39.596657\n ],\n [\n 116.440716,\n 39.527466\n ],\n [\n 116.433325,\n 39.44296\n ],\n [\n 116.332927,\n 39.457744\n ],\n [\n 116.245464,\n 39.515466\n ],\n [\n 116.204196,\n 39.588819\n ],\n [\n 116.10195,\n 39.576368\n ],\n [\n 116.10195,\n 39.576368\n ],\n [\n 115.957204,\n 39.561147\n ],\n [\n 115.910393,\n 39.600345\n ],\n [\n 115.910393,\n 39.600345\n ],\n [\n 115.855574,\n 39.554689\n ],\n [\n 115.855574,\n 39.554689\n ],\n [\n 115.846951,\n 39.550999\n ],\n [\n 115.846951,\n 39.550999\n ],\n [\n 115.821081,\n 39.517312\n ],\n [\n 115.821081,\n 39.517312\n ],\n [\n 115.752712,\n 39.512696\n ],\n [\n 115.752712,\n 39.512696\n ],\n [\n 115.738545,\n 39.539464\n ],\n [\n 115.738545,\n 39.539925\n ],\n [\n 115.738545,\n 39.539464\n ],\n [\n 115.738545,\n 39.539925\n ],\n [\n 115.737314,\n 39.544078\n ],\n [\n 115.737314,\n 39.544078\n ],\n [\n 115.723763,\n 39.544539\n ],\n [\n 115.723763,\n 39.544539\n ],\n [\n 115.721299,\n 39.543617\n ],\n [\n 115.721299,\n 39.543617\n ],\n [\n 115.721299,\n 39.55146\n ],\n [\n 115.721299,\n 39.55146\n ],\n [\n 115.716988,\n 39.560225\n ],\n [\n 115.716988,\n 39.560225\n ],\n [\n 115.699125,\n 39.577751\n ],\n [\n 115.698509,\n 39.577751\n ],\n [\n 115.698509,\n 39.577751\n ],\n [\n 115.699125,\n 39.577751\n ],\n [\n 115.698509,\n 39.577751\n ],\n [\n 115.69543,\n 39.579135\n ],\n [\n 115.69543,\n 39.579135\n ],\n [\n 115.586408,\n 39.58928\n ],\n [\n 115.478619,\n 39.650578\n ],\n [\n 115.478619,\n 39.650578\n ],\n [\n 115.498945,\n 39.69617\n ],\n [\n 115.498945,\n 39.69617\n ],\n [\n 115.443511,\n 39.785426\n ],\n [\n 115.443511,\n 39.785426\n ],\n [\n 115.567314,\n 39.816224\n ],\n [\n 115.514344,\n 39.837821\n ],\n [\n 115.522967,\n 39.898898\n ],\n [\n 115.426264,\n 39.95029\n ],\n [\n 115.454597,\n 40.029595\n ],\n [\n 115.599343,\n 40.11979\n ],\n [\n 115.73485,\n 40.129398\n ],\n [\n 115.773038,\n 40.176044\n ],\n [\n 115.85311,\n 40.148609\n ],\n [\n 115.89869,\n 40.234536\n ],\n [\n 115.968907,\n 40.264219\n ],\n [\n 115.9184,\n 40.354103\n ],\n [\n 115.861733,\n 40.364589\n ],\n [\n 115.861733,\n 40.364589\n ],\n [\n 115.779197,\n 40.442501\n ],\n [\n 115.755792,\n 40.540333\n ],\n [\n 115.907929,\n 40.617133\n ],\n [\n 116.005247,\n 40.58397\n ],\n [\n 116.088399,\n 40.62667\n ],\n [\n 116.22021,\n 40.744181\n ],\n [\n 116.247311,\n 40.791762\n ],\n [\n 116.464738,\n 40.771827\n ],\n [\n 116.334159,\n 40.90446\n ],\n [\n 116.473977,\n 40.895867\n ],\n [\n 116.455499,\n 40.98084\n ],\n [\n 116.519557,\n 40.981292\n ],\n [\n 116.519557,\n 40.981292\n ],\n [\n 116.599013,\n 40.974516\n ],\n [\n 116.615643,\n 41.053072\n ],\n [\n 116.688324,\n 41.044499\n ],\n [\n 116.677853,\n 40.970902\n ],\n [\n 116.730208,\n 40.897676\n ],\n [\n 116.858323,\n 40.833423\n ],\n [\n 116.964881,\n 40.70972\n ],\n [\n 117.110858,\n 40.70836\n ],\n [\n 117.286401,\n 40.660719\n ],\n [\n 117.386799,\n 40.684317\n ],\n [\n 117.49582,\n 40.674334\n ],\n [\n 117.389879,\n 40.5617\n ],\n [\n 117.344299,\n 40.582152\n ],\n [\n 117.213104,\n 40.512136\n ],\n [\n 117.225423,\n 40.369148\n ],\n [\n 117.309191,\n 40.279284\n ],\n [\n 117.309807,\n 40.279284\n ],\n [\n 117.309191,\n 40.279284\n ],\n [\n 117.309807,\n 40.279284\n ],\n [\n 117.389879,\n 40.228141\n ],\n [\n 117.367089,\n 40.172387\n ],\n [\n 117.367089,\n 40.172844\n ],\n [\n 117.367089,\n 40.173301\n ],\n [\n 117.367089,\n 40.173301\n ],\n [\n 117.367089,\n 40.172844\n ],\n [\n 117.367089,\n 40.172387\n ],\n [\n 117.344299,\n 40.13443\n ],\n [\n 117.210024,\n 40.082262\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 120000,\n \"name\": \"天津市\",\n \"center\": [\n 117.190182,\n 39.125596\n ],\n \"centroid\": [\n 117.351154,\n 39.28914\n ],\n \"childrenNum\": 16,\n \"level\": \"province\",\n \"subFeatureIndex\": 1,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 117.210024,\n 40.082262\n ],\n [\n 117.344299,\n 40.13443\n ],\n [\n 117.367089,\n 40.172387\n ],\n [\n 117.367089,\n 40.172844\n ],\n [\n 117.367089,\n 40.173301\n ],\n [\n 117.367089,\n 40.173301\n ],\n [\n 117.367089,\n 40.172844\n ],\n [\n 117.367089,\n 40.172387\n ],\n [\n 117.389879,\n 40.228141\n ],\n [\n 117.450857,\n 40.252347\n ],\n [\n 117.571581,\n 40.21809\n ],\n [\n 117.652269,\n 40.12345\n ],\n [\n 117.652269,\n 40.12345\n ],\n [\n 117.651037,\n 40.122535\n ],\n [\n 117.651037,\n 40.122535\n ],\n [\n 117.71879,\n 40.082262\n ],\n [\n 117.71879,\n 40.082262\n ],\n [\n 117.75821,\n 40.073563\n ],\n [\n 117.75821,\n 40.073563\n ],\n [\n 117.782232,\n 39.968634\n ],\n [\n 117.614697,\n 39.972303\n ],\n [\n 117.589443,\n 39.997059\n ],\n [\n 117.513067,\n 39.910373\n ],\n [\n 117.513067,\n 39.910373\n ],\n [\n 117.537704,\n 39.835064\n ],\n [\n 117.537704,\n 39.835064\n ],\n [\n 117.540784,\n 39.822658\n ],\n [\n 117.540784,\n 39.822658\n ],\n [\n 117.57774,\n 39.727009\n ],\n [\n 117.644262,\n 39.702155\n ],\n [\n 117.66274,\n 39.636295\n ],\n [\n 117.619008,\n 39.603111\n ],\n [\n 117.736037,\n 39.560686\n ],\n [\n 117.736037,\n 39.560686\n ],\n [\n 117.74774,\n 39.58928\n ],\n [\n 117.866,\n 39.596657\n ],\n [\n 117.933753,\n 39.574062\n ],\n [\n 117.870311,\n 39.454972\n ],\n [\n 117.846906,\n 39.328274\n ],\n [\n 117.972557,\n 39.312536\n ],\n [\n 117.972557,\n 39.312536\n ],\n [\n 117.982412,\n 39.298647\n ],\n [\n 117.982412,\n 39.298647\n ],\n [\n 118.021833,\n 39.287071\n ],\n [\n 118.021833,\n 39.287071\n ],\n [\n 118.024296,\n 39.289386\n ],\n [\n 118.024296,\n 39.289386\n ],\n [\n 118.024912,\n 39.292164\n ],\n [\n 118.024912,\n 39.292164\n ],\n [\n 118.037231,\n 39.220353\n ],\n [\n 117.871543,\n 39.122479\n ],\n [\n 117.837667,\n 39.056999\n ],\n [\n 117.855529,\n 38.957502\n ],\n [\n 117.898029,\n 38.948661\n ],\n [\n 117.847522,\n 38.855535\n ],\n [\n 117.778536,\n 38.869046\n ],\n [\n 117.64611,\n 38.828972\n ],\n [\n 117.646725,\n 38.788875\n ],\n [\n 117.740964,\n 38.753888\n ],\n [\n 117.729261,\n 38.680127\n ],\n [\n 117.639334,\n 38.62686\n ],\n [\n 117.47919,\n 38.617043\n ],\n [\n 117.39419,\n 38.573553\n ],\n [\n 117.252524,\n 38.556711\n ],\n [\n 117.213104,\n 38.639947\n ],\n [\n 117.213104,\n 38.639947\n ],\n [\n 117.176764,\n 38.617978\n ],\n [\n 117.176764,\n 38.617978\n ],\n [\n 117.097924,\n 38.587118\n ],\n [\n 117.042489,\n 38.706279\n ],\n [\n 116.95133,\n 38.689468\n ],\n [\n 116.947634,\n 38.689468\n ],\n [\n 116.947634,\n 38.689468\n ],\n [\n 116.950714,\n 38.689468\n ],\n [\n 116.95133,\n 38.689468\n ],\n [\n 116.950714,\n 38.689468\n ],\n [\n 116.877417,\n 38.680594\n ],\n [\n 116.858939,\n 38.741289\n ],\n [\n 116.766548,\n 38.742222\n ],\n [\n 116.737599,\n 38.784677\n ],\n [\n 116.708034,\n 38.931907\n ],\n [\n 116.783179,\n 39.050959\n ],\n [\n 116.783179,\n 39.050959\n ],\n [\n 116.812744,\n 39.050959\n ],\n [\n 116.812744,\n 39.050959\n ],\n [\n 116.912526,\n 39.110873\n ],\n [\n 116.91191,\n 39.111338\n ],\n [\n 116.91191,\n 39.111338\n ],\n [\n 116.912526,\n 39.110873\n ],\n [\n 116.865714,\n 39.155428\n ],\n [\n 116.865714,\n 39.155428\n ],\n [\n 116.892816,\n 39.224061\n ],\n [\n 116.870642,\n 39.357426\n ],\n [\n 116.796113,\n 39.446656\n ],\n [\n 116.812128,\n 39.616018\n ],\n [\n 116.90575,\n 39.687883\n ],\n [\n 116.916837,\n 39.703996\n ],\n [\n 116.916837,\n 39.703996\n ],\n [\n 116.983975,\n 39.63906\n ],\n [\n 116.983975,\n 39.63906\n ],\n [\n 117.126873,\n 39.61694\n ],\n [\n 117.177996,\n 39.64551\n ],\n [\n 117.165061,\n 39.718725\n ],\n [\n 117.165061,\n 39.718725\n ],\n [\n 117.205713,\n 39.763813\n ],\n [\n 117.156438,\n 39.817603\n ],\n [\n 117.229735,\n 39.852981\n ],\n [\n 117.152126,\n 39.878239\n ],\n [\n 117.150894,\n 39.944785\n ],\n [\n 117.198322,\n 39.992933\n ],\n [\n 117.210024,\n 40.082262\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 130000,\n \"name\": \"河北省\",\n \"center\": [\n 114.502461,\n 38.045474\n ],\n \"childrenNum\": 11,\n \"level\": \"province\",\n \"subFeatureIndex\": 2,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 117.389879,\n 40.228141\n ],\n [\n 117.309807,\n 40.279284\n ],\n [\n 117.309191,\n 40.279284\n ],\n [\n 117.309807,\n 40.279284\n ],\n [\n 117.309191,\n 40.279284\n ],\n [\n 117.225423,\n 40.369148\n ],\n [\n 117.213104,\n 40.512136\n ],\n [\n 117.344299,\n 40.582152\n ],\n [\n 117.389879,\n 40.5617\n ],\n [\n 117.49582,\n 40.674334\n ],\n [\n 117.386799,\n 40.684317\n ],\n [\n 117.286401,\n 40.660719\n ],\n [\n 117.110858,\n 40.70836\n ],\n [\n 116.964881,\n 40.70972\n ],\n [\n 116.858323,\n 40.833423\n ],\n [\n 116.730208,\n 40.897676\n ],\n [\n 116.677853,\n 40.970902\n ],\n [\n 116.688324,\n 41.044499\n ],\n [\n 116.615643,\n 41.053072\n ],\n [\n 116.599013,\n 40.974516\n ],\n [\n 116.519557,\n 40.981292\n ],\n [\n 116.519557,\n 40.981292\n ],\n [\n 116.455499,\n 40.98084\n ],\n [\n 116.473977,\n 40.895867\n ],\n [\n 116.334159,\n 40.90446\n ],\n [\n 116.464738,\n 40.771827\n ],\n [\n 116.247311,\n 40.791762\n ],\n [\n 116.22021,\n 40.744181\n ],\n [\n 116.088399,\n 40.62667\n ],\n [\n 116.005247,\n 40.58397\n ],\n [\n 115.907929,\n 40.617133\n ],\n [\n 115.755792,\n 40.540333\n ],\n [\n 115.779197,\n 40.442501\n ],\n [\n 115.861733,\n 40.364589\n ],\n [\n 115.861733,\n 40.364589\n ],\n [\n 115.9184,\n 40.354103\n ],\n [\n 115.968907,\n 40.264219\n ],\n [\n 115.89869,\n 40.234536\n ],\n [\n 115.85311,\n 40.148609\n ],\n [\n 115.773038,\n 40.176044\n ],\n [\n 115.73485,\n 40.129398\n ],\n [\n 115.599343,\n 40.11979\n ],\n [\n 115.454597,\n 40.029595\n ],\n [\n 115.426264,\n 39.95029\n ],\n [\n 115.522967,\n 39.898898\n ],\n [\n 115.514344,\n 39.837821\n ],\n [\n 115.567314,\n 39.816224\n ],\n [\n 115.443511,\n 39.785426\n ],\n [\n 115.443511,\n 39.785426\n ],\n [\n 115.498945,\n 39.69617\n ],\n [\n 115.498945,\n 39.69617\n ],\n [\n 115.478619,\n 39.650578\n ],\n [\n 115.478619,\n 39.650578\n ],\n [\n 115.586408,\n 39.58928\n ],\n [\n 115.69543,\n 39.579135\n ],\n [\n 115.69543,\n 39.579135\n ],\n [\n 115.698509,\n 39.577751\n ],\n [\n 115.699125,\n 39.577751\n ],\n [\n 115.698509,\n 39.577751\n ],\n [\n 115.698509,\n 39.577751\n ],\n [\n 115.699125,\n 39.577751\n ],\n [\n 115.716988,\n 39.560225\n ],\n [\n 115.716988,\n 39.560225\n ],\n [\n 115.721299,\n 39.55146\n ],\n [\n 115.721299,\n 39.55146\n ],\n [\n 115.721299,\n 39.543617\n ],\n [\n 115.721299,\n 39.543617\n ],\n [\n 115.723763,\n 39.544539\n ],\n [\n 115.723763,\n 39.544539\n ],\n [\n 115.737314,\n 39.544078\n ],\n [\n 115.737314,\n 39.544078\n ],\n [\n 115.738545,\n 39.539925\n ],\n [\n 115.738545,\n 39.539464\n ],\n [\n 115.738545,\n 39.539925\n ],\n [\n 115.738545,\n 39.539464\n ],\n [\n 115.752712,\n 39.512696\n ],\n [\n 115.752712,\n 39.512696\n ],\n [\n 115.821081,\n 39.517312\n ],\n [\n 115.821081,\n 39.517312\n ],\n [\n 115.846951,\n 39.550999\n ],\n [\n 115.846951,\n 39.550999\n ],\n [\n 115.855574,\n 39.554689\n ],\n [\n 115.855574,\n 39.554689\n ],\n [\n 115.910393,\n 39.600345\n ],\n [\n 115.910393,\n 39.600345\n ],\n [\n 115.957204,\n 39.561147\n ],\n [\n 116.10195,\n 39.576368\n ],\n [\n 116.10195,\n 39.576368\n ],\n [\n 116.204196,\n 39.588819\n ],\n [\n 116.245464,\n 39.515466\n ],\n [\n 116.332927,\n 39.457744\n ],\n [\n 116.433325,\n 39.44296\n ],\n [\n 116.440716,\n 39.527466\n ],\n [\n 116.524484,\n 39.596657\n ],\n [\n 116.607636,\n 39.619705\n ],\n [\n 116.703106,\n 39.588819\n ],\n [\n 116.703106,\n 39.588819\n ],\n [\n 116.726512,\n 39.595274\n ],\n [\n 116.726512,\n 39.595274\n ],\n [\n 116.720969,\n 39.599884\n ],\n [\n 116.720969,\n 39.599884\n ],\n [\n 116.717273,\n 39.603572\n ],\n [\n 116.717273,\n 39.603572\n ],\n [\n 116.812128,\n 39.616018\n ],\n [\n 116.796113,\n 39.446656\n ],\n [\n 116.870642,\n 39.357426\n ],\n [\n 116.892816,\n 39.224061\n ],\n [\n 116.865714,\n 39.155428\n ],\n [\n 116.865714,\n 39.155428\n ],\n [\n 116.912526,\n 39.110873\n ],\n [\n 116.91191,\n 39.111338\n ],\n [\n 116.91191,\n 39.111338\n ],\n [\n 116.912526,\n 39.110873\n ],\n [\n 116.812744,\n 39.050959\n ],\n [\n 116.812744,\n 39.050959\n ],\n [\n 116.783179,\n 39.050959\n ],\n [\n 116.783179,\n 39.050959\n ],\n [\n 116.708034,\n 38.931907\n ],\n [\n 116.737599,\n 38.784677\n ],\n [\n 116.766548,\n 38.742222\n ],\n [\n 116.858939,\n 38.741289\n ],\n [\n 116.877417,\n 38.680594\n ],\n [\n 116.950714,\n 38.689468\n ],\n [\n 116.95133,\n 38.689468\n ],\n [\n 116.950714,\n 38.689468\n ],\n [\n 116.947634,\n 38.689468\n ],\n [\n 116.947634,\n 38.689468\n ],\n [\n 116.95133,\n 38.689468\n ],\n [\n 117.042489,\n 38.706279\n ],\n [\n 117.097924,\n 38.587118\n ],\n [\n 117.176764,\n 38.617978\n ],\n [\n 117.176764,\n 38.617978\n ],\n [\n 117.213104,\n 38.639947\n ],\n [\n 117.213104,\n 38.639947\n ],\n [\n 117.252524,\n 38.556711\n ],\n [\n 117.39419,\n 38.573553\n ],\n [\n 117.47919,\n 38.617043\n ],\n [\n 117.639334,\n 38.62686\n ],\n [\n 117.638102,\n 38.545013\n ],\n [\n 117.781,\n 38.374004\n ],\n [\n 117.937449,\n 38.387606\n ],\n [\n 117.895565,\n 38.30173\n ],\n [\n 117.808718,\n 38.228445\n ],\n [\n 117.771761,\n 38.136734\n ],\n [\n 117.70216,\n 38.075529\n ],\n [\n 117.5839,\n 38.070819\n ],\n [\n 117.513067,\n 37.94353\n ],\n [\n 117.438538,\n 37.853823\n ],\n [\n 117.34122,\n 37.863271\n ],\n [\n 117.267923,\n 37.838704\n ],\n [\n 117.093612,\n 37.849571\n ],\n [\n 117.023395,\n 37.832561\n ],\n [\n 116.788106,\n 37.843429\n ],\n [\n 116.724664,\n 37.744139\n ],\n [\n 116.433941,\n 37.47349\n ],\n [\n 116.38097,\n 37.522858\n ],\n [\n 116.379738,\n 37.521909\n ],\n [\n 116.38097,\n 37.522858\n ],\n [\n 116.379738,\n 37.521909\n ],\n [\n 116.337238,\n 37.580255\n ],\n [\n 116.291659,\n 37.557966\n ],\n [\n 116.27626,\n 37.466841\n ],\n [\n 116.240536,\n 37.489633\n ],\n [\n 116.240536,\n 37.489633\n ],\n [\n 116.226369,\n 37.428365\n ],\n [\n 116.2855,\n 37.404604\n ],\n [\n 116.236224,\n 37.361816\n ],\n [\n 116.169087,\n 37.384164\n ],\n [\n 116.051443,\n 37.367998\n ],\n [\n 115.984921,\n 37.326616\n ],\n [\n 115.969523,\n 37.239497\n ],\n [\n 115.909777,\n 37.206622\n ],\n [\n 115.868509,\n 37.076414\n ],\n [\n 115.776734,\n 36.992829\n ],\n [\n 115.79706,\n 36.968931\n ],\n [\n 115.71206,\n 36.883313\n ],\n [\n 115.683727,\n 36.808139\n ],\n [\n 115.479851,\n 36.76022\n ],\n [\n 115.365902,\n 36.622043\n ],\n [\n 115.283366,\n 36.486505\n ],\n [\n 115.308004,\n 36.461967\n ],\n [\n 115.308004,\n 36.461967\n ],\n [\n 115.366518,\n 36.308793\n ],\n [\n 115.466916,\n 36.259115\n ],\n [\n 115.466916,\n 36.259115\n ],\n [\n 115.483547,\n 36.149036\n ],\n [\n 115.312931,\n 36.088137\n ],\n [\n 115.201446,\n 36.210371\n ],\n [\n 115.201446,\n 36.210371\n ],\n [\n 115.064092,\n 36.178985\n ],\n [\n 114.996955,\n 36.06831\n ],\n [\n 114.914419,\n 36.051865\n ],\n [\n 114.912571,\n 36.140339\n ],\n [\n 114.591666,\n 36.130192\n ],\n [\n 114.345291,\n 36.255738\n ],\n [\n 114.169132,\n 36.243675\n ],\n [\n 114.169132,\n 36.243675\n ],\n [\n 114.060727,\n 36.276482\n ],\n [\n 114.055799,\n 36.330005\n ],\n [\n 113.982502,\n 36.358921\n ],\n [\n 113.911054,\n 36.314578\n ],\n [\n 113.881488,\n 36.354102\n ],\n [\n 113.819894,\n 36.330969\n ],\n [\n 113.731199,\n 36.363257\n ],\n [\n 113.708409,\n 36.423461\n ],\n [\n 113.554425,\n 36.494682\n ],\n [\n 113.588301,\n 36.562955\n ],\n [\n 113.476816,\n 36.655171\n ],\n [\n 113.499606,\n 36.740564\n ],\n [\n 113.680692,\n 36.789933\n ],\n [\n 113.696707,\n 36.882356\n ],\n [\n 113.773083,\n 36.855072\n ],\n [\n 113.76138,\n 36.956022\n ],\n [\n 113.791561,\n 36.987572\n ],\n [\n 113.758301,\n 37.075459\n ],\n [\n 113.773083,\n 37.1518\n ],\n [\n 113.832213,\n 37.167536\n ],\n [\n 113.90243,\n 37.309962\n ],\n [\n 114.014531,\n 37.424564\n ],\n [\n 114.036705,\n 37.49438\n ],\n [\n 114.123553,\n 37.60159\n ],\n [\n 114.12848,\n 37.698231\n ],\n [\n 113.993589,\n 37.706752\n ],\n [\n 114.044712,\n 37.762116\n ],\n [\n 113.976959,\n 37.816965\n ],\n [\n 113.951706,\n 37.917573\n ],\n [\n 113.872249,\n 37.990228\n ],\n [\n 113.876561,\n 38.055273\n ],\n [\n 113.810039,\n 38.112729\n ],\n [\n 113.825438,\n 38.169199\n ],\n [\n 113.720728,\n 38.174843\n ],\n [\n 113.711489,\n 38.213873\n ],\n [\n 113.570439,\n 38.237375\n ],\n [\n 113.525475,\n 38.382916\n ],\n [\n 113.583374,\n 38.459793\n ],\n [\n 113.561816,\n 38.558115\n ],\n [\n 113.612939,\n 38.646022\n ],\n [\n 113.70225,\n 38.65163\n ],\n [\n 113.720728,\n 38.713283\n ],\n [\n 113.839605,\n 38.758554\n ],\n [\n 113.855619,\n 38.828972\n ],\n [\n 113.776163,\n 38.885814\n ],\n [\n 113.76754,\n 38.959828\n ],\n [\n 113.898119,\n 39.067684\n ],\n [\n 114.050872,\n 39.135939\n ],\n [\n 114.10877,\n 39.052352\n ],\n [\n 114.345907,\n 39.075116\n ],\n [\n 114.388406,\n 39.176767\n ],\n [\n 114.47587,\n 39.216181\n ],\n [\n 114.416124,\n 39.243063\n ],\n [\n 114.480797,\n 39.350023\n ],\n [\n 114.470942,\n 39.408759\n ],\n [\n 114.568877,\n 39.574062\n ],\n [\n 114.408117,\n 39.65196\n ],\n [\n 114.395182,\n 39.867218\n ],\n [\n 114.225183,\n 39.857114\n ],\n [\n 114.17406,\n 39.897521\n ],\n [\n 114.047176,\n 39.916339\n ],\n [\n 114.021307,\n 39.992017\n ],\n [\n 113.910438,\n 40.011725\n ],\n [\n 113.956017,\n 40.031428\n ],\n [\n 113.989278,\n 40.112469\n ],\n [\n 114.044712,\n 40.05662\n ],\n [\n 114.101995,\n 40.099655\n ],\n [\n 114.073046,\n 40.168729\n ],\n [\n 114.073046,\n 40.168729\n ],\n [\n 114.235654,\n 40.198442\n ],\n [\n 114.255364,\n 40.236363\n ],\n [\n 114.46971,\n 40.267872\n ],\n [\n 114.530688,\n 40.344983\n ],\n [\n 114.446305,\n 40.372795\n ],\n [\n 114.31203,\n 40.372795\n ],\n [\n 114.267066,\n 40.474369\n ],\n [\n 114.283081,\n 40.590785\n ],\n [\n 114.209168,\n 40.629848\n ],\n [\n 114.134639,\n 40.737381\n ],\n [\n 114.044712,\n 40.83116\n ],\n [\n 114.073661,\n 40.857412\n ],\n [\n 113.973263,\n 40.983099\n ],\n [\n 113.819279,\n 41.097726\n ],\n [\n 113.920293,\n 41.172081\n ],\n [\n 113.996669,\n 41.192345\n ],\n [\n 113.927068,\n 41.326829\n ],\n [\n 113.94493,\n 41.39105\n ],\n [\n 113.871017,\n 41.41349\n ],\n [\n 113.930764,\n 41.485693\n ],\n [\n 114.100147,\n 41.537218\n ],\n [\n 114.230726,\n 41.513477\n ],\n [\n 114.203009,\n 41.793334\n ],\n [\n 114.34837,\n 41.947049\n ],\n [\n 114.510978,\n 41.973299\n ],\n [\n 114.466015,\n 42.038656\n ],\n [\n 114.510978,\n 42.111047\n ],\n [\n 114.765361,\n 42.118593\n ],\n [\n 114.828803,\n 42.147434\n ],\n [\n 114.9021,\n 42.015544\n ],\n [\n 114.922426,\n 41.824999\n ],\n [\n 114.866991,\n 41.803147\n ],\n [\n 114.899636,\n 41.756299\n ],\n [\n 114.895325,\n 41.636567\n ],\n [\n 114.862064,\n 41.603915\n ],\n [\n 115.0992,\n 41.624045\n ],\n [\n 115.252569,\n 41.579303\n ],\n [\n 115.376989,\n 41.602126\n ],\n [\n 115.319091,\n 41.691546\n ],\n [\n 115.654162,\n 41.829011\n ],\n [\n 115.811226,\n 41.912328\n ],\n [\n 115.916552,\n 41.945269\n ],\n [\n 116.016334,\n 41.777273\n ],\n [\n 116.09887,\n 41.776381\n ],\n [\n 116.122892,\n 41.861995\n ],\n [\n 116.194341,\n 41.861995\n ],\n [\n 116.233145,\n 41.941263\n ],\n [\n 116.310137,\n 41.997316\n ],\n [\n 116.409303,\n 41.994203\n ],\n [\n 116.386514,\n 41.952389\n ],\n [\n 116.510933,\n 41.974189\n ],\n [\n 116.560209,\n 41.928356\n ],\n [\n 116.727744,\n 41.951054\n ],\n [\n 116.879881,\n 42.018211\n ],\n [\n 116.890352,\n 42.092846\n ],\n [\n 116.789338,\n 42.200202\n ],\n [\n 116.907598,\n 42.191337\n ],\n [\n 116.886656,\n 42.366641\n ],\n [\n 116.910062,\n 42.394928\n ],\n [\n 116.910062,\n 42.394928\n ],\n [\n 116.927308,\n 42.40509\n ],\n [\n 116.927308,\n 42.40509\n ],\n [\n 116.929156,\n 42.407741\n ],\n [\n 116.929156,\n 42.408182\n ],\n [\n 116.929156,\n 42.407741\n ],\n [\n 116.929156,\n 42.408182\n ],\n [\n 116.936547,\n 42.410833\n ],\n [\n 116.936547,\n 42.410833\n ],\n [\n 116.944555,\n 42.415251\n ],\n [\n 116.944555,\n 42.415251\n ],\n [\n 116.976583,\n 42.427618\n ],\n [\n 116.976583,\n 42.427618\n ],\n [\n 116.984591,\n 42.427176\n ],\n [\n 116.984591,\n 42.427176\n ],\n [\n 116.993214,\n 42.425851\n ],\n [\n 116.993214,\n 42.425851\n ],\n [\n 116.995678,\n 42.426734\n ],\n [\n 116.995678,\n 42.426734\n ],\n [\n 117.001837,\n 42.432476\n ],\n [\n 117.001837,\n 42.432476\n ],\n [\n 117.004301,\n 42.432476\n ],\n [\n 117.004301,\n 42.432476\n ],\n [\n 117.005533,\n 42.4338\n ],\n [\n 117.005533,\n 42.4338\n ],\n [\n 117.133648,\n 42.470443\n ],\n [\n 117.133648,\n 42.470443\n ],\n [\n 117.147815,\n 42.470443\n ],\n [\n 117.147815,\n 42.470443\n ],\n [\n 117.264227,\n 42.476621\n ],\n [\n 117.264227,\n 42.476621\n ],\n [\n 117.412669,\n 42.472649\n ],\n [\n 117.387415,\n 42.517648\n ],\n [\n 117.387415,\n 42.517648\n ],\n [\n 117.43669,\n 42.584205\n ],\n [\n 117.516146,\n 42.599622\n ],\n [\n 117.516146,\n 42.599622\n ],\n [\n 117.687377,\n 42.582884\n ],\n [\n 117.779768,\n 42.618558\n ],\n [\n 117.874007,\n 42.510151\n ],\n [\n 118.019369,\n 42.39537\n ],\n [\n 118.060021,\n 42.298083\n ],\n [\n 117.977485,\n 42.229892\n ],\n [\n 118.109296,\n 42.165176\n ],\n [\n 118.097593,\n 42.105277\n ],\n [\n 118.155491,\n 42.081301\n ],\n [\n 118.119767,\n 42.034656\n ],\n [\n 118.194296,\n 42.031545\n ],\n [\n 118.212774,\n 42.081301\n ],\n [\n 118.297157,\n 42.048876\n ],\n [\n 118.237411,\n 42.023101\n ],\n [\n 118.313788,\n 41.987977\n ],\n [\n 118.268824,\n 41.930136\n ],\n [\n 118.340273,\n 41.872688\n ],\n [\n 118.29223,\n 41.772811\n ],\n [\n 118.165962,\n 41.813405\n ],\n [\n 118.130854,\n 41.74246\n ],\n [\n 118.214006,\n 41.641933\n ],\n [\n 118.230636,\n 41.581989\n ],\n [\n 118.307012,\n 41.569008\n ],\n [\n 118.271904,\n 41.471349\n ],\n [\n 118.348896,\n 41.428296\n ],\n [\n 118.35136,\n 41.337163\n ],\n [\n 118.519511,\n 41.353783\n ],\n [\n 118.677192,\n 41.350639\n ],\n [\n 118.741866,\n 41.324133\n ],\n [\n 118.843496,\n 41.374439\n ],\n [\n 118.890923,\n 41.300764\n ],\n [\n 118.96422,\n 41.309303\n ],\n [\n 119.197661,\n 41.282781\n ],\n [\n 119.239545,\n 41.314696\n ],\n [\n 119.2494,\n 41.279634\n ],\n [\n 119.126212,\n 41.138744\n ],\n [\n 119.037516,\n 41.067509\n ],\n [\n 118.96422,\n 41.079236\n ],\n [\n 118.951901,\n 41.01832\n ],\n [\n 119.013495,\n 41.007485\n ],\n [\n 118.977154,\n 40.959155\n ],\n [\n 118.977154,\n 40.959155\n ],\n [\n 118.90201,\n 40.960963\n ],\n [\n 118.849039,\n 40.800821\n ],\n [\n 118.911249,\n 40.776811\n ],\n [\n 119.054147,\n 40.664804\n ],\n [\n 119.184726,\n 40.680233\n ],\n [\n 119.162552,\n 40.599872\n ],\n [\n 119.30237,\n 40.530329\n ],\n [\n 119.571536,\n 40.540333\n ],\n [\n 119.598637,\n 40.465266\n ],\n [\n 119.586934,\n 40.37553\n ],\n [\n 119.642369,\n 40.291151\n ],\n [\n 119.625123,\n 40.224029\n ],\n [\n 119.745847,\n 40.208038\n ],\n [\n 119.736608,\n 40.10469\n ],\n [\n 119.779723,\n 40.049293\n ],\n [\n 119.779723,\n 40.049293\n ],\n [\n 119.780339,\n 40.047002\n ],\n [\n 119.780339,\n 40.047002\n ],\n [\n 119.817296,\n 40.049751\n ],\n [\n 119.817296,\n 40.049751\n ],\n [\n 119.848093,\n 40.020432\n ],\n [\n 119.848093,\n 40.020432\n ],\n [\n 119.845629,\n 40.000726\n ],\n [\n 119.845629,\n 40.000726\n ],\n [\n 119.854252,\n 39.988349\n ],\n [\n 119.791426,\n 39.952124\n ],\n [\n 119.540739,\n 39.88834\n ],\n [\n 119.536427,\n 39.808871\n ],\n [\n 119.466826,\n 39.810709\n ],\n [\n 119.357805,\n 39.721946\n ],\n [\n 119.269726,\n 39.498385\n ],\n [\n 119.314689,\n 39.412457\n ],\n [\n 119.190885,\n 39.368528\n ],\n [\n 119.096031,\n 39.242136\n ],\n [\n 118.948821,\n 39.138259\n ],\n [\n 118.955597,\n 39.176303\n ],\n [\n 118.76096,\n 39.133618\n ],\n [\n 118.637156,\n 39.157284\n ],\n [\n 118.533062,\n 39.090907\n ],\n [\n 118.604511,\n 38.971458\n ],\n [\n 118.491178,\n 38.909097\n ],\n [\n 118.377845,\n 38.971923\n ],\n [\n 118.366143,\n 39.016101\n ],\n [\n 118.225092,\n 39.034694\n ],\n [\n 118.120999,\n 39.186043\n ],\n [\n 118.037231,\n 39.220353\n ],\n [\n 118.024912,\n 39.292164\n ],\n [\n 118.024912,\n 39.292164\n ],\n [\n 118.024296,\n 39.289386\n ],\n [\n 118.024296,\n 39.289386\n ],\n [\n 118.021833,\n 39.287071\n ],\n [\n 118.021833,\n 39.287071\n ],\n [\n 117.982412,\n 39.298647\n ],\n [\n 117.982412,\n 39.298647\n ],\n [\n 117.972557,\n 39.312536\n ],\n [\n 117.972557,\n 39.312536\n ],\n [\n 117.846906,\n 39.328274\n ],\n [\n 117.870311,\n 39.454972\n ],\n [\n 117.933753,\n 39.574062\n ],\n [\n 117.866,\n 39.596657\n ],\n [\n 117.74774,\n 39.58928\n ],\n [\n 117.736037,\n 39.560686\n ],\n [\n 117.736037,\n 39.560686\n ],\n [\n 117.619008,\n 39.603111\n ],\n [\n 117.66274,\n 39.636295\n ],\n [\n 117.644262,\n 39.702155\n ],\n [\n 117.57774,\n 39.727009\n ],\n [\n 117.540784,\n 39.822658\n ],\n [\n 117.540784,\n 39.822658\n ],\n [\n 117.537704,\n 39.835064\n ],\n [\n 117.537704,\n 39.835064\n ],\n [\n 117.513067,\n 39.910373\n ],\n [\n 117.513067,\n 39.910373\n ],\n [\n 117.589443,\n 39.997059\n ],\n [\n 117.614697,\n 39.972303\n ],\n [\n 117.782232,\n 39.968634\n ],\n [\n 117.75821,\n 40.073563\n ],\n [\n 117.75821,\n 40.073563\n ],\n [\n 117.71879,\n 40.082262\n ],\n [\n 117.71879,\n 40.082262\n ],\n [\n 117.651037,\n 40.122535\n ],\n [\n 117.651037,\n 40.122535\n ],\n [\n 117.652269,\n 40.12345\n ],\n [\n 117.652269,\n 40.12345\n ],\n [\n 117.571581,\n 40.21809\n ],\n [\n 117.450857,\n 40.252347\n ],\n [\n 117.389879,\n 40.228141\n ]\n ]\n ],\n [\n [\n [\n 116.90575,\n 39.687883\n ],\n [\n 116.902055,\n 39.763813\n ],\n [\n 116.949482,\n 39.778529\n ],\n [\n 116.926076,\n 39.835524\n ],\n [\n 116.786874,\n 39.886963\n ],\n [\n 116.757925,\n 39.968176\n ],\n [\n 116.783794,\n 40.035093\n ],\n [\n 116.927924,\n 40.054788\n ],\n [\n 116.999989,\n 40.030053\n ],\n [\n 117.102851,\n 40.073563\n ],\n [\n 117.102235,\n 40.073105\n ],\n [\n 117.102235,\n 40.073105\n ],\n [\n 117.102851,\n 40.073563\n ],\n [\n 117.105315,\n 40.074479\n ],\n [\n 117.105315,\n 40.074479\n ],\n [\n 117.210024,\n 40.082262\n ],\n [\n 117.198322,\n 39.992933\n ],\n [\n 117.150894,\n 39.944785\n ],\n [\n 117.152126,\n 39.878239\n ],\n [\n 117.229735,\n 39.852981\n ],\n [\n 117.156438,\n 39.817603\n ],\n [\n 117.205713,\n 39.763813\n ],\n [\n 117.165061,\n 39.718725\n ],\n [\n 117.165061,\n 39.718725\n ],\n [\n 117.177996,\n 39.64551\n ],\n [\n 117.126873,\n 39.61694\n ],\n [\n 116.983975,\n 39.63906\n ],\n [\n 116.983975,\n 39.63906\n ],\n [\n 116.916837,\n 39.703996\n ],\n [\n 116.916837,\n 39.703996\n ],\n [\n 116.90575,\n 39.687883\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 140000,\n \"name\": \"山西省\",\n \"center\": [\n 112.549248,\n 37.857014\n ],\n \"centroid\": [\n 112.305144,\n 37.619053\n ],\n \"childrenNum\": 11,\n \"level\": \"province\",\n \"subFeatureIndex\": 3,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 113.731199,\n 36.363257\n ],\n [\n 113.716417,\n 36.262492\n ],\n [\n 113.651743,\n 36.172224\n ],\n [\n 113.694859,\n 36.026707\n ],\n [\n 113.637576,\n 35.98847\n ],\n [\n 113.656671,\n 35.836792\n ],\n [\n 113.604316,\n 35.797008\n ],\n [\n 113.578446,\n 35.63378\n ],\n [\n 113.485439,\n 35.520879\n ],\n [\n 113.31236,\n 35.481424\n ],\n [\n 113.298194,\n 35.427325\n ],\n [\n 113.189789,\n 35.449261\n ],\n [\n 113.126347,\n 35.332197\n ],\n [\n 112.997,\n 35.362455\n ],\n [\n 112.992072,\n 35.296068\n ],\n [\n 112.911384,\n 35.24673\n ],\n [\n 112.818377,\n 35.258457\n ],\n [\n 112.766022,\n 35.203718\n ],\n [\n 112.628052,\n 35.263342\n ],\n [\n 112.637291,\n 35.225716\n ],\n [\n 112.513487,\n 35.218384\n ],\n [\n 112.058924,\n 35.279951\n ],\n [\n 112.078634,\n 35.219362\n ],\n [\n 112.062004,\n 35.055937\n ],\n [\n 111.900012,\n 35.079933\n ],\n [\n 111.66965,\n 34.988319\n ],\n [\n 111.570484,\n 34.843094\n ],\n [\n 111.346282,\n 34.831798\n ],\n [\n 111.232949,\n 34.789551\n ],\n [\n 111.148566,\n 34.80773\n ],\n [\n 111.118385,\n 34.756622\n ],\n [\n 110.966248,\n 34.70499\n ],\n [\n 110.929907,\n 34.731548\n ],\n [\n 110.883712,\n 34.642498\n ],\n [\n 110.749437,\n 34.652342\n ],\n [\n 110.710017,\n 34.605078\n ],\n [\n 110.533242,\n 34.583406\n ],\n [\n 110.474728,\n 34.617389\n ],\n [\n 110.379257,\n 34.600646\n ],\n [\n 110.310272,\n 34.608033\n ],\n [\n 110.241287,\n 34.682361\n ],\n [\n 110.232664,\n 34.803308\n ],\n [\n 110.257301,\n 34.93487\n ],\n [\n 110.325671,\n 35.014785\n ],\n [\n 110.39404,\n 35.271647\n ],\n [\n 110.45009,\n 35.327803\n ],\n [\n 110.477808,\n 35.413672\n ],\n [\n 110.525851,\n 35.44195\n ],\n [\n 110.609619,\n 35.632321\n ],\n [\n 110.57759,\n 35.701346\n ],\n [\n 110.549257,\n 35.877527\n ],\n [\n 110.511684,\n 35.879951\n ],\n [\n 110.447011,\n 36.164495\n ],\n [\n 110.474112,\n 36.248018\n ],\n [\n 110.45933,\n 36.330969\n ],\n [\n 110.503677,\n 36.487948\n ],\n [\n 110.496902,\n 36.582175\n ],\n [\n 110.394656,\n 36.676768\n ],\n [\n 110.447011,\n 36.737687\n ],\n [\n 110.416214,\n 36.790892\n ],\n [\n 110.425453,\n 36.960325\n ],\n [\n 110.382953,\n 37.021975\n ],\n [\n 110.444547,\n 37.007164\n ],\n [\n 110.53509,\n 37.137969\n ],\n [\n 110.690307,\n 37.287115\n ],\n [\n 110.695234,\n 37.34945\n ],\n [\n 110.630561,\n 37.373228\n ],\n [\n 110.644111,\n 37.435017\n ],\n [\n 110.745125,\n 37.450693\n ],\n [\n 110.795017,\n 37.566029\n ],\n [\n 110.796248,\n 37.66319\n ],\n [\n 110.706321,\n 37.705332\n ],\n [\n 110.758676,\n 37.744139\n ],\n [\n 110.663821,\n 37.803256\n ],\n [\n 110.59422,\n 37.921821\n ],\n [\n 110.522771,\n 37.954853\n ],\n [\n 110.501213,\n 38.031713\n ],\n [\n 110.509221,\n 38.192245\n ],\n [\n 110.565887,\n 38.215283\n ],\n [\n 110.57759,\n 38.297035\n ],\n [\n 110.661358,\n 38.308773\n ],\n [\n 110.746973,\n 38.366029\n ],\n [\n 110.77777,\n 38.44105\n ],\n [\n 110.874473,\n 38.453702\n ],\n [\n 110.920052,\n 38.581973\n ],\n [\n 110.880016,\n 38.618446\n ],\n [\n 111.009363,\n 38.847614\n ],\n [\n 110.980414,\n 38.970063\n ],\n [\n 111.138711,\n 39.064897\n ],\n [\n 111.163348,\n 39.152644\n ],\n [\n 111.247732,\n 39.302351\n ],\n [\n 111.125776,\n 39.366678\n ],\n [\n 111.171971,\n 39.42355\n ],\n [\n 111.337043,\n 39.420777\n ],\n [\n 111.418963,\n 39.500232\n ],\n [\n 111.462079,\n 39.626157\n ],\n [\n 111.502115,\n 39.663015\n ],\n [\n 111.646245,\n 39.644128\n ],\n [\n 111.783599,\n 39.588819\n ],\n [\n 111.842729,\n 39.620166\n ],\n [\n 111.93204,\n 39.61233\n ],\n [\n 111.970229,\n 39.79646\n ],\n [\n 112.28559,\n 40.197985\n ],\n [\n 112.310227,\n 40.256457\n ],\n [\n 112.456205,\n 40.300278\n ],\n [\n 112.6299,\n 40.235906\n ],\n [\n 112.72845,\n 40.168272\n ],\n [\n 112.844863,\n 40.203926\n ],\n [\n 112.892906,\n 40.326284\n ],\n [\n 113.251382,\n 40.413352\n ],\n [\n 113.316056,\n 40.319898\n ],\n [\n 113.559968,\n 40.348631\n ],\n [\n 113.794641,\n 40.518049\n ],\n [\n 113.855619,\n 40.457071\n ],\n [\n 113.948626,\n 40.514865\n ],\n [\n 114.061959,\n 40.528964\n ],\n [\n 114.041633,\n 40.608503\n ],\n [\n 114.074277,\n 40.723325\n ],\n [\n 114.134639,\n 40.737381\n ],\n [\n 114.209168,\n 40.629848\n ],\n [\n 114.283081,\n 40.590785\n ],\n [\n 114.267066,\n 40.474369\n ],\n [\n 114.31203,\n 40.372795\n ],\n [\n 114.446305,\n 40.372795\n ],\n [\n 114.530688,\n 40.344983\n ],\n [\n 114.46971,\n 40.267872\n ],\n [\n 114.255364,\n 40.236363\n ],\n [\n 114.235654,\n 40.198442\n ],\n [\n 114.073046,\n 40.168729\n ],\n [\n 114.073046,\n 40.168729\n ],\n [\n 114.101995,\n 40.099655\n ],\n [\n 114.044712,\n 40.05662\n ],\n [\n 113.989278,\n 40.112469\n ],\n [\n 113.956017,\n 40.031428\n ],\n [\n 113.910438,\n 40.011725\n ],\n [\n 114.021307,\n 39.992017\n ],\n [\n 114.047176,\n 39.916339\n ],\n [\n 114.17406,\n 39.897521\n ],\n [\n 114.225183,\n 39.857114\n ],\n [\n 114.395182,\n 39.867218\n ],\n [\n 114.408117,\n 39.65196\n ],\n [\n 114.568877,\n 39.574062\n ],\n [\n 114.470942,\n 39.408759\n ],\n [\n 114.480797,\n 39.350023\n ],\n [\n 114.416124,\n 39.243063\n ],\n [\n 114.47587,\n 39.216181\n ],\n [\n 114.388406,\n 39.176767\n ],\n [\n 114.345907,\n 39.075116\n ],\n [\n 114.10877,\n 39.052352\n ],\n [\n 114.050872,\n 39.135939\n ],\n [\n 113.898119,\n 39.067684\n ],\n [\n 113.76754,\n 38.959828\n ],\n [\n 113.776163,\n 38.885814\n ],\n [\n 113.855619,\n 38.828972\n ],\n [\n 113.839605,\n 38.758554\n ],\n [\n 113.720728,\n 38.713283\n ],\n [\n 113.70225,\n 38.65163\n ],\n [\n 113.612939,\n 38.646022\n ],\n [\n 113.561816,\n 38.558115\n ],\n [\n 113.583374,\n 38.459793\n ],\n [\n 113.525475,\n 38.382916\n ],\n [\n 113.570439,\n 38.237375\n ],\n [\n 113.711489,\n 38.213873\n ],\n [\n 113.720728,\n 38.174843\n ],\n [\n 113.825438,\n 38.169199\n ],\n [\n 113.810039,\n 38.112729\n ],\n [\n 113.876561,\n 38.055273\n ],\n [\n 113.872249,\n 37.990228\n ],\n [\n 113.951706,\n 37.917573\n ],\n [\n 113.976959,\n 37.816965\n ],\n [\n 114.044712,\n 37.762116\n ],\n [\n 113.993589,\n 37.706752\n ],\n [\n 114.12848,\n 37.698231\n ],\n [\n 114.123553,\n 37.60159\n ],\n [\n 114.036705,\n 37.49438\n ],\n [\n 114.014531,\n 37.424564\n ],\n [\n 113.90243,\n 37.309962\n ],\n [\n 113.832213,\n 37.167536\n ],\n [\n 113.773083,\n 37.1518\n ],\n [\n 113.758301,\n 37.075459\n ],\n [\n 113.791561,\n 36.987572\n ],\n [\n 113.76138,\n 36.956022\n ],\n [\n 113.773083,\n 36.855072\n ],\n [\n 113.696707,\n 36.882356\n ],\n [\n 113.680692,\n 36.789933\n ],\n [\n 113.499606,\n 36.740564\n ],\n [\n 113.476816,\n 36.655171\n ],\n [\n 113.588301,\n 36.562955\n ],\n [\n 113.554425,\n 36.494682\n ],\n [\n 113.708409,\n 36.423461\n ],\n [\n 113.731199,\n 36.363257\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 150000,\n \"name\": \"内蒙古自治区\",\n \"center\": [\n 111.670801,\n 40.818311\n ],\n \"centroid\": [\n 114.059024,\n 44.315561\n ],\n \"childrenNum\": 12,\n \"level\": \"province\",\n \"subFeatureIndex\": 4,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 123.703873,\n 43.370824\n ],\n [\n 123.664453,\n 43.264606\n ],\n [\n 123.666916,\n 43.179585\n ],\n [\n 123.572678,\n 43.0035\n ],\n [\n 123.515395,\n 43.027561\n ],\n [\n 123.515395,\n 43.027561\n ],\n [\n 123.474743,\n 43.04243\n ],\n [\n 123.259165,\n 42.992997\n ],\n [\n 123.18402,\n 42.926002\n ],\n [\n 123.169853,\n 42.859811\n ],\n [\n 123.227752,\n 42.831735\n ],\n [\n 123.058368,\n 42.768957\n ],\n [\n 122.887137,\n 42.770275\n ],\n [\n 122.831087,\n 42.722381\n ],\n [\n 122.786123,\n 42.756218\n ],\n [\n 122.786123,\n 42.756218\n ],\n [\n 122.732536,\n 42.786524\n ],\n [\n 122.624747,\n 42.773349\n ],\n [\n 122.563769,\n 42.826031\n ],\n [\n 122.436886,\n 42.843142\n ],\n [\n 122.35127,\n 42.830419\n ],\n [\n 122.374676,\n 42.774667\n ],\n [\n 122.457212,\n 42.774227\n ],\n [\n 122.395002,\n 42.683687\n ],\n [\n 122.338951,\n 42.670051\n ],\n [\n 122.203445,\n 42.731171\n ],\n [\n 122.20406,\n 42.683687\n ],\n [\n 122.071634,\n 42.711391\n ],\n [\n 121.940438,\n 42.688525\n ],\n [\n 121.904714,\n 42.569666\n ],\n [\n 121.66573,\n 42.437333\n ],\n [\n 121.604752,\n 42.494271\n ],\n [\n 121.388557,\n 42.475297\n ],\n [\n 121.304789,\n 42.435567\n ],\n [\n 121.304789,\n 42.435567\n ],\n [\n 121.285079,\n 42.387857\n ],\n [\n 121.068884,\n 42.252483\n ],\n [\n 120.933378,\n 42.279493\n ],\n [\n 120.79048,\n 42.218372\n ],\n [\n 120.745516,\n 42.223689\n ],\n [\n 120.624792,\n 42.154532\n ],\n [\n 120.58414,\n 42.167394\n ],\n [\n 120.466496,\n 42.105277\n ],\n [\n 120.456641,\n 42.016433\n ],\n [\n 120.373489,\n 41.994648\n ],\n [\n 120.188707,\n 41.848179\n ],\n [\n 120.096316,\n 41.696907\n ],\n [\n 120.035954,\n 41.708075\n ],\n [\n 120.051968,\n 41.775935\n ],\n [\n 119.989759,\n 41.898969\n ],\n [\n 119.837622,\n 42.135455\n ],\n [\n 119.846861,\n 42.21527\n ],\n [\n 119.744615,\n 42.211725\n ],\n [\n 119.541971,\n 42.292329\n ],\n [\n 119.572152,\n 42.359568\n ],\n [\n 119.502551,\n 42.387857\n ],\n [\n 119.415703,\n 42.309588\n ],\n [\n 119.284508,\n 42.265325\n ],\n [\n 119.237697,\n 42.201088\n ],\n [\n 119.315921,\n 42.119037\n ],\n [\n 119.384906,\n 42.089738\n ],\n [\n 119.324544,\n 41.969296\n ],\n [\n 119.334399,\n 41.869569\n ],\n [\n 119.294363,\n 41.775935\n ],\n [\n 119.307914,\n 41.657581\n ],\n [\n 119.415703,\n 41.590044\n ],\n [\n 119.361501,\n 41.56498\n ],\n [\n 119.405848,\n 41.508548\n ],\n [\n 119.376283,\n 41.422015\n ],\n [\n 119.30545,\n 41.402271\n ],\n [\n 119.326392,\n 41.329525\n ],\n [\n 119.239545,\n 41.314696\n ],\n [\n 119.197661,\n 41.282781\n ],\n [\n 118.96422,\n 41.309303\n ],\n [\n 118.890923,\n 41.300764\n ],\n [\n 118.843496,\n 41.374439\n ],\n [\n 118.741866,\n 41.324133\n ],\n [\n 118.677192,\n 41.350639\n ],\n [\n 118.519511,\n 41.353783\n ],\n [\n 118.35136,\n 41.337163\n ],\n [\n 118.348896,\n 41.428296\n ],\n [\n 118.271904,\n 41.471349\n ],\n [\n 118.307012,\n 41.569008\n ],\n [\n 118.230636,\n 41.581989\n ],\n [\n 118.214006,\n 41.641933\n ],\n [\n 118.130854,\n 41.74246\n ],\n [\n 118.165962,\n 41.813405\n ],\n [\n 118.29223,\n 41.772811\n ],\n [\n 118.340273,\n 41.872688\n ],\n [\n 118.268824,\n 41.930136\n ],\n [\n 118.313788,\n 41.987977\n ],\n [\n 118.237411,\n 42.023101\n ],\n [\n 118.297157,\n 42.048876\n ],\n [\n 118.212774,\n 42.081301\n ],\n [\n 118.194296,\n 42.031545\n ],\n [\n 118.119767,\n 42.034656\n ],\n [\n 118.155491,\n 42.081301\n ],\n [\n 118.097593,\n 42.105277\n ],\n [\n 118.109296,\n 42.165176\n ],\n [\n 117.977485,\n 42.229892\n ],\n [\n 118.060021,\n 42.298083\n ],\n [\n 118.019369,\n 42.39537\n ],\n [\n 117.874007,\n 42.510151\n ],\n [\n 117.779768,\n 42.618558\n ],\n [\n 117.687377,\n 42.582884\n ],\n [\n 117.516146,\n 42.599622\n ],\n [\n 117.516146,\n 42.599622\n ],\n [\n 117.43669,\n 42.584205\n ],\n [\n 117.387415,\n 42.517648\n ],\n [\n 117.387415,\n 42.517648\n ],\n [\n 117.412669,\n 42.472649\n ],\n [\n 117.264227,\n 42.476621\n ],\n [\n 117.264227,\n 42.476621\n ],\n [\n 117.147815,\n 42.470443\n ],\n [\n 117.147815,\n 42.470443\n ],\n [\n 117.133648,\n 42.470443\n ],\n [\n 117.133648,\n 42.470443\n ],\n [\n 117.005533,\n 42.4338\n ],\n [\n 117.005533,\n 42.4338\n ],\n [\n 117.004301,\n 42.432476\n ],\n [\n 117.004301,\n 42.432476\n ],\n [\n 117.001837,\n 42.432476\n ],\n [\n 117.001837,\n 42.432476\n ],\n [\n 116.995678,\n 42.426734\n ],\n [\n 116.995678,\n 42.426734\n ],\n [\n 116.993214,\n 42.425851\n ],\n [\n 116.993214,\n 42.425851\n ],\n [\n 116.984591,\n 42.427176\n ],\n [\n 116.984591,\n 42.427176\n ],\n [\n 116.976583,\n 42.427618\n ],\n [\n 116.976583,\n 42.427618\n ],\n [\n 116.944555,\n 42.415251\n ],\n [\n 116.944555,\n 42.415251\n ],\n [\n 116.936547,\n 42.410833\n ],\n [\n 116.936547,\n 42.410833\n ],\n [\n 116.929156,\n 42.408182\n ],\n [\n 116.929156,\n 42.407741\n ],\n [\n 116.929156,\n 42.408182\n ],\n [\n 116.929156,\n 42.407741\n ],\n [\n 116.927308,\n 42.40509\n ],\n [\n 116.927308,\n 42.40509\n ],\n [\n 116.910062,\n 42.394928\n ],\n [\n 116.910062,\n 42.394928\n ],\n [\n 116.886656,\n 42.366641\n ],\n [\n 116.907598,\n 42.191337\n ],\n [\n 116.789338,\n 42.200202\n ],\n [\n 116.890352,\n 42.092846\n ],\n [\n 116.879881,\n 42.018211\n ],\n [\n 116.727744,\n 41.951054\n ],\n [\n 116.560209,\n 41.928356\n ],\n [\n 116.510933,\n 41.974189\n ],\n [\n 116.386514,\n 41.952389\n ],\n [\n 116.409303,\n 41.994203\n ],\n [\n 116.310137,\n 41.997316\n ],\n [\n 116.233145,\n 41.941263\n ],\n [\n 116.194341,\n 41.861995\n ],\n [\n 116.122892,\n 41.861995\n ],\n [\n 116.09887,\n 41.776381\n ],\n [\n 116.016334,\n 41.777273\n ],\n [\n 115.916552,\n 41.945269\n ],\n [\n 115.811226,\n 41.912328\n ],\n [\n 115.654162,\n 41.829011\n ],\n [\n 115.319091,\n 41.691546\n ],\n [\n 115.376989,\n 41.602126\n ],\n [\n 115.252569,\n 41.579303\n ],\n [\n 115.0992,\n 41.624045\n ],\n [\n 114.862064,\n 41.603915\n ],\n [\n 114.895325,\n 41.636567\n ],\n [\n 114.899636,\n 41.756299\n ],\n [\n 114.866991,\n 41.803147\n ],\n [\n 114.922426,\n 41.824999\n ],\n [\n 114.9021,\n 42.015544\n ],\n [\n 114.828803,\n 42.147434\n ],\n [\n 114.765361,\n 42.118593\n ],\n [\n 114.510978,\n 42.111047\n ],\n [\n 114.466015,\n 42.038656\n ],\n [\n 114.510978,\n 41.973299\n ],\n [\n 114.34837,\n 41.947049\n ],\n [\n 114.203009,\n 41.793334\n ],\n [\n 114.230726,\n 41.513477\n ],\n [\n 114.100147,\n 41.537218\n ],\n [\n 113.930764,\n 41.485693\n ],\n [\n 113.871017,\n 41.41349\n ],\n [\n 113.94493,\n 41.39105\n ],\n [\n 113.927068,\n 41.326829\n ],\n [\n 113.996669,\n 41.192345\n ],\n [\n 113.920293,\n 41.172081\n ],\n [\n 113.819279,\n 41.097726\n ],\n [\n 113.973263,\n 40.983099\n ],\n [\n 114.073661,\n 40.857412\n ],\n [\n 114.044712,\n 40.83116\n ],\n [\n 114.134639,\n 40.737381\n ],\n [\n 114.074277,\n 40.723325\n ],\n [\n 114.041633,\n 40.608503\n ],\n [\n 114.061959,\n 40.528964\n ],\n [\n 113.948626,\n 40.514865\n ],\n [\n 113.855619,\n 40.457071\n ],\n [\n 113.794641,\n 40.518049\n ],\n [\n 113.559968,\n 40.348631\n ],\n [\n 113.316056,\n 40.319898\n ],\n [\n 113.251382,\n 40.413352\n ],\n [\n 112.892906,\n 40.326284\n ],\n [\n 112.844863,\n 40.203926\n ],\n [\n 112.72845,\n 40.168272\n ],\n [\n 112.6299,\n 40.235906\n ],\n [\n 112.456205,\n 40.300278\n ],\n [\n 112.310227,\n 40.256457\n ],\n [\n 112.28559,\n 40.197985\n ],\n [\n 111.970229,\n 39.79646\n ],\n [\n 111.93204,\n 39.61233\n ],\n [\n 111.842729,\n 39.620166\n ],\n [\n 111.783599,\n 39.588819\n ],\n [\n 111.646245,\n 39.644128\n ],\n [\n 111.502115,\n 39.663015\n ],\n [\n 111.462079,\n 39.626157\n ],\n [\n 111.418963,\n 39.500232\n ],\n [\n 111.337043,\n 39.420777\n ],\n [\n 111.171971,\n 39.42355\n ],\n [\n 111.125776,\n 39.366678\n ],\n [\n 111.064182,\n 39.400899\n ],\n [\n 111.148566,\n 39.531619\n ],\n [\n 111.134399,\n 39.586513\n ],\n [\n 110.892335,\n 39.509927\n ],\n [\n 110.740198,\n 39.351874\n ],\n [\n 110.702626,\n 39.27364\n ],\n [\n 110.604075,\n 39.277345\n ],\n [\n 110.528315,\n 39.380091\n ],\n [\n 110.434692,\n 39.381016\n ],\n [\n 110.39096,\n 39.31161\n ],\n [\n 110.243751,\n 39.42355\n ],\n [\n 110.146432,\n 39.455434\n ],\n [\n 110.217881,\n 39.28105\n ],\n [\n 109.961035,\n 39.191608\n ],\n [\n 109.665384,\n 38.981691\n ],\n [\n 109.683862,\n 38.935631\n ],\n [\n 109.624116,\n 38.854603\n ],\n [\n 109.549587,\n 38.805662\n ],\n [\n 109.511399,\n 38.833633\n ],\n [\n 109.404226,\n 38.720752\n ],\n [\n 109.338936,\n 38.70161\n ],\n [\n 109.367269,\n 38.627328\n ],\n [\n 109.276726,\n 38.623121\n ],\n [\n 109.178792,\n 38.520675\n ],\n [\n 109.051908,\n 38.432146\n ],\n [\n 108.938575,\n 38.207291\n ],\n [\n 108.963829,\n 38.155085\n ],\n [\n 109.069155,\n 38.091071\n ],\n [\n 109.017416,\n 37.969949\n ],\n [\n 108.938575,\n 37.920877\n ],\n [\n 108.871438,\n 38.027471\n ],\n [\n 108.797525,\n 38.047735\n ],\n [\n 108.82709,\n 37.989285\n ],\n [\n 108.798141,\n 37.93362\n ],\n [\n 108.799989,\n 37.783871\n ],\n [\n 108.777815,\n 37.683554\n ],\n [\n 108.611512,\n 37.65419\n ],\n [\n 108.532671,\n 37.690656\n ],\n [\n 108.440896,\n 37.654663\n ],\n [\n 108.304158,\n 37.638556\n ],\n [\n 108.219158,\n 37.661295\n ],\n [\n 108.134159,\n 37.621971\n ],\n [\n 108.025137,\n 37.649926\n ],\n [\n 107.982022,\n 37.787181\n ],\n [\n 107.65003,\n 37.864688\n ],\n [\n 107.49235,\n 37.944945\n ],\n [\n 107.419669,\n 37.940699\n ],\n [\n 107.438147,\n 37.992586\n ],\n [\n 107.329742,\n 38.087774\n ],\n [\n 107.19054,\n 38.154144\n ],\n [\n 107.014997,\n 38.120261\n ],\n [\n 106.768621,\n 38.174843\n ],\n [\n 106.546883,\n 38.269794\n ],\n [\n 106.482825,\n 38.319571\n ],\n [\n 106.601702,\n 38.392295\n ],\n [\n 106.647897,\n 38.470569\n ],\n [\n 106.66268,\n 38.601614\n ],\n [\n 106.709491,\n 38.718885\n ],\n [\n 106.954019,\n 38.941215\n ],\n [\n 106.96757,\n 39.054676\n ],\n [\n 106.859164,\n 39.107623\n ],\n [\n 106.795723,\n 39.214327\n ],\n [\n 106.806809,\n 39.318554\n ],\n [\n 106.751375,\n 39.381478\n ],\n [\n 106.683622,\n 39.357426\n ],\n [\n 106.602318,\n 39.375466\n ],\n [\n 106.506231,\n 39.269934\n ],\n [\n 106.402753,\n 39.291701\n ],\n [\n 106.284493,\n 39.270397\n ],\n [\n 106.283877,\n 39.14522\n ],\n [\n 106.145907,\n 39.153108\n ],\n [\n 106.096631,\n 39.08487\n ],\n [\n 106.060907,\n 38.968667\n ],\n [\n 105.97098,\n 38.909097\n ],\n [\n 106.003625,\n 38.874636\n ],\n [\n 105.897683,\n 38.788875\n ],\n [\n 105.90569,\n 38.731488\n ],\n [\n 105.852719,\n 38.641349\n ],\n [\n 105.874277,\n 38.593197\n ],\n [\n 105.821307,\n 38.366967\n ],\n [\n 105.86627,\n 38.296565\n ],\n [\n 105.775111,\n 38.186601\n ],\n [\n 105.780655,\n 38.084949\n ],\n [\n 105.840401,\n 38.003902\n ],\n [\n 105.799749,\n 37.940227\n ],\n [\n 105.80406,\n 37.861854\n ],\n [\n 105.760944,\n 37.799947\n ],\n [\n 105.622974,\n 37.778669\n ],\n [\n 105.598952,\n 37.699178\n ],\n [\n 105.315004,\n 37.702018\n ],\n [\n 105.111128,\n 37.633818\n ],\n [\n 105.024281,\n 37.579781\n ],\n [\n 104.866601,\n 37.566503\n ],\n [\n 104.801311,\n 37.538516\n ],\n [\n 104.419429,\n 37.511943\n ],\n [\n 104.407726,\n 37.464467\n ],\n [\n 104.287002,\n 37.42789\n ],\n [\n 104.183524,\n 37.406981\n ],\n [\n 103.948235,\n 37.564606\n ],\n [\n 103.676606,\n 37.783871\n ],\n [\n 103.401897,\n 37.861854\n ],\n [\n 103.362477,\n 38.037368\n ],\n [\n 103.369868,\n 38.089658\n ],\n [\n 103.53494,\n 38.156497\n ],\n [\n 103.507838,\n 38.281068\n ],\n [\n 103.416063,\n 38.404956\n ],\n [\n 103.85954,\n 38.64462\n ],\n [\n 104.044322,\n 38.895128\n ],\n [\n 104.168125,\n 38.940285\n ],\n [\n 104.207546,\n 39.083941\n ],\n [\n 104.177364,\n 39.15218\n ],\n [\n 104.047401,\n 39.297721\n ],\n [\n 104.091133,\n 39.418466\n ],\n [\n 103.964865,\n 39.455434\n ],\n [\n 103.839214,\n 39.460516\n ],\n [\n 103.595302,\n 39.386565\n ],\n [\n 103.344615,\n 39.331514\n ],\n [\n 103.007696,\n 39.09973\n ],\n [\n 102.601792,\n 39.172129\n ],\n [\n 102.45335,\n 39.25511\n ],\n [\n 102.280887,\n 39.190217\n ],\n [\n 101.830636,\n 39.093229\n ],\n [\n 101.926106,\n 39.000758\n ],\n [\n 102.075164,\n 38.891403\n ],\n [\n 101.941505,\n 38.808926\n ],\n [\n 101.777049,\n 38.660507\n ],\n [\n 101.679115,\n 38.690869\n ],\n [\n 101.601506,\n 38.6549\n ],\n [\n 101.562702,\n 38.712816\n ],\n [\n 101.307087,\n 38.802865\n ],\n [\n 101.334189,\n 38.848545\n ],\n [\n 101.24303,\n 38.86066\n ],\n [\n 101.198682,\n 38.943077\n ],\n [\n 101.228863,\n 39.02075\n ],\n [\n 101.117378,\n 38.97518\n ],\n [\n 100.969553,\n 38.9468\n ],\n [\n 100.961545,\n 39.005873\n ],\n [\n 100.835278,\n 39.025863\n ],\n [\n 100.864227,\n 39.106695\n ],\n [\n 100.842669,\n 39.199955\n ],\n [\n 100.842053,\n 39.405523\n ],\n [\n 100.619699,\n 39.38749\n ],\n [\n 100.498975,\n 39.400437\n ],\n [\n 100.500823,\n 39.4813\n ],\n [\n 100.326512,\n 39.509003\n ],\n [\n 100.314193,\n 39.606799\n ],\n [\n 100.250135,\n 39.68512\n ],\n [\n 100.128179,\n 39.702155\n ],\n [\n 100.040716,\n 39.756913\n ],\n [\n 99.904593,\n 39.785886\n ],\n [\n 99.822058,\n 39.85987\n ],\n [\n 99.672384,\n 39.887881\n ],\n [\n 99.488218,\n 39.875943\n ],\n [\n 99.927383,\n 40.063947\n ],\n [\n 100.002528,\n 40.197528\n ],\n [\n 100.169447,\n 40.277458\n ],\n [\n 100.169447,\n 40.541242\n ],\n [\n 100.242744,\n 40.618495\n ],\n [\n 100.237201,\n 40.716977\n ],\n [\n 100.107853,\n 40.875511\n ],\n [\n 100.057346,\n 40.908077\n ],\n [\n 99.673,\n 40.932943\n ],\n [\n 99.565827,\n 40.846551\n ],\n [\n 99.174705,\n 40.858317\n ],\n [\n 99.172858,\n 40.747354\n ],\n [\n 99.102025,\n 40.676603\n ],\n [\n 99.041662,\n 40.693844\n ],\n [\n 98.984996,\n 40.782701\n ],\n [\n 98.790975,\n 40.705185\n ],\n [\n 98.801446,\n 40.609411\n ],\n [\n 98.689345,\n 40.691576\n ],\n [\n 98.668403,\n 40.772734\n ],\n [\n 98.569853,\n 40.746901\n ],\n [\n 98.627751,\n 40.677965\n ],\n [\n 98.344419,\n 40.568518\n ],\n [\n 98.333332,\n 40.918929\n ],\n [\n 98.25018,\n 40.939271\n ],\n [\n 97.971776,\n 41.097726\n ],\n [\n 97.629314,\n 41.440407\n ],\n [\n 97.613915,\n 41.477176\n ],\n [\n 97.84674,\n 41.656687\n ],\n [\n 97.307177,\n 42.565259\n ],\n [\n 97.172903,\n 42.795305\n ],\n [\n 98.195362,\n 42.653331\n ],\n [\n 98.546447,\n 42.638368\n ],\n [\n 99.503001,\n 42.568344\n ],\n [\n 99.969267,\n 42.648051\n ],\n [\n 100.272309,\n 42.636167\n ],\n [\n 100.32528,\n 42.689845\n ],\n [\n 100.826655,\n 42.67533\n ],\n [\n 101.23995,\n 42.59698\n ],\n [\n 101.581796,\n 42.525145\n ],\n [\n 101.803534,\n 42.503534\n ],\n [\n 102.070236,\n 42.232107\n ],\n [\n 102.449039,\n 42.143885\n ],\n [\n 102.540814,\n 42.162072\n ],\n [\n 102.712045,\n 42.152757\n ],\n [\n 103.021862,\n 42.02799\n ],\n [\n 103.418527,\n 41.882489\n ],\n [\n 103.868779,\n 41.802701\n ],\n [\n 104.080046,\n 41.804931\n ],\n [\n 104.530298,\n 41.874916\n ],\n [\n 104.524138,\n 41.662051\n ],\n [\n 104.68613,\n 41.64551\n ],\n [\n 104.923267,\n 41.654005\n ],\n [\n 105.009498,\n 41.583331\n ],\n [\n 105.230621,\n 41.750942\n ],\n [\n 105.291599,\n 41.750049\n ],\n [\n 105.74185,\n 41.949274\n ],\n [\n 106.01348,\n 42.03199\n ],\n [\n 106.619564,\n 42.243625\n ],\n [\n 106.785867,\n 42.291444\n ],\n [\n 107.051337,\n 42.319322\n ],\n [\n 107.269996,\n 42.363547\n ],\n [\n 107.303872,\n 42.4126\n ],\n [\n 107.46648,\n 42.458967\n ],\n [\n 107.57427,\n 42.413042\n ],\n [\n 107.939522,\n 42.403764\n ],\n [\n 108.022058,\n 42.433359\n ],\n [\n 108.238252,\n 42.460291\n ],\n [\n 108.298614,\n 42.438216\n ],\n [\n 108.532671,\n 42.443073\n ],\n [\n 108.845569,\n 42.395811\n ],\n [\n 109.026039,\n 42.458525\n ],\n [\n 109.291509,\n 42.435567\n ],\n [\n 109.544044,\n 42.472208\n ],\n [\n 109.683862,\n 42.559089\n ],\n [\n 109.906216,\n 42.635727\n ],\n [\n 110.108244,\n 42.642769\n ],\n [\n 110.139657,\n 42.67489\n ],\n [\n 110.437156,\n 42.781254\n ],\n [\n 110.469801,\n 42.839194\n ],\n [\n 110.631177,\n 42.936078\n ],\n [\n 110.736502,\n 43.089639\n ],\n [\n 110.769763,\n 43.099251\n ],\n [\n 111.02045,\n 43.329926\n ],\n [\n 111.183674,\n 43.396045\n ],\n [\n 111.354289,\n 43.436029\n ],\n [\n 111.456535,\n 43.49422\n ],\n [\n 111.564325,\n 43.490314\n ],\n [\n 111.79407,\n 43.67192\n ],\n [\n 111.951135,\n 43.693122\n ],\n [\n 111.959758,\n 43.8232\n ],\n [\n 111.870447,\n 43.940071\n ],\n [\n 111.773128,\n 44.010686\n ],\n [\n 111.662875,\n 44.061012\n ],\n [\n 111.559397,\n 44.171408\n ],\n [\n 111.507042,\n 44.294019\n ],\n [\n 111.415883,\n 44.357368\n ],\n [\n 111.478709,\n 44.488982\n ],\n [\n 111.569868,\n 44.576418\n ],\n [\n 111.560629,\n 44.647124\n ],\n [\n 111.624687,\n 44.778509\n ],\n [\n 111.764505,\n 44.969314\n ],\n [\n 111.889541,\n 45.045459\n ],\n [\n 112.002874,\n 45.090675\n ],\n [\n 112.113743,\n 45.072931\n ],\n [\n 112.438959,\n 45.071663\n ],\n [\n 112.540589,\n 45.001054\n ],\n [\n 112.599719,\n 44.93078\n ],\n [\n 112.850406,\n 44.840484\n ],\n [\n 112.937869,\n 44.84006\n ],\n [\n 113.11526,\n 44.799741\n ],\n [\n 113.503918,\n 44.77766\n ],\n [\n 113.631417,\n 44.745372\n ],\n [\n 113.907358,\n 44.915105\n ],\n [\n 114.065038,\n 44.931204\n ],\n [\n 114.19069,\n 45.036581\n ],\n [\n 114.347139,\n 45.119392\n ],\n [\n 114.519602,\n 45.283812\n ],\n [\n 114.551014,\n 45.387699\n ],\n [\n 114.745035,\n 45.438521\n ],\n [\n 114.974165,\n 45.377193\n ],\n [\n 115.153403,\n 45.395682\n ],\n [\n 115.36467,\n 45.392321\n ],\n [\n 115.699741,\n 45.459509\n ],\n [\n 115.936878,\n 45.632987\n ],\n [\n 116.035428,\n 45.68526\n ],\n [\n 116.17463,\n 45.688604\n ],\n [\n 116.286731,\n 45.775056\n ],\n [\n 116.288579,\n 45.838869\n ],\n [\n 116.243,\n 45.875956\n ],\n [\n 116.271949,\n 45.966692\n ],\n [\n 116.414231,\n 46.13404\n ],\n [\n 116.439484,\n 46.137771\n ],\n [\n 116.585462,\n 46.292199\n ],\n [\n 116.745606,\n 46.327743\n ],\n [\n 116.826294,\n 46.380602\n ],\n [\n 117.097308,\n 46.35707\n ],\n [\n 117.372017,\n 46.360373\n ],\n [\n 117.392343,\n 46.463093\n ],\n [\n 117.447777,\n 46.528172\n ],\n [\n 117.42006,\n 46.582071\n ],\n [\n 117.49582,\n 46.600574\n ],\n [\n 117.622704,\n 46.596052\n ],\n [\n 117.704008,\n 46.516645\n ],\n [\n 117.870927,\n 46.549985\n ],\n [\n 117.914659,\n 46.607973\n ],\n [\n 118.04647,\n 46.631398\n ],\n [\n 118.124078,\n 46.678216\n ],\n [\n 118.192448,\n 46.682731\n ],\n [\n 118.316252,\n 46.739347\n ],\n [\n 118.446831,\n 46.704482\n ],\n [\n 118.586033,\n 46.692992\n ],\n [\n 118.639004,\n 46.721302\n ],\n [\n 118.788061,\n 46.687246\n ],\n [\n 118.845343,\n 46.771731\n ],\n [\n 118.914329,\n 46.775009\n ],\n [\n 118.912481,\n 46.733196\n ],\n [\n 119.011647,\n 46.745498\n ],\n [\n 119.123132,\n 46.642901\n ],\n [\n 119.26295,\n 46.649062\n ],\n [\n 119.374435,\n 46.60304\n ],\n [\n 119.431718,\n 46.638793\n ],\n [\n 119.656535,\n 46.625645\n ],\n [\n 119.677477,\n 46.584539\n ],\n [\n 119.783419,\n 46.626056\n ],\n [\n 119.8136,\n 46.668363\n ],\n [\n 119.911534,\n 46.669595\n ],\n [\n 119.93494,\n 46.712688\n ],\n [\n 119.928781,\n 46.903933\n ],\n [\n 119.859795,\n 46.917013\n ],\n [\n 119.795122,\n 47.01297\n ],\n [\n 119.806825,\n 47.054973\n ],\n [\n 119.716282,\n 47.195829\n ],\n [\n 119.56784,\n 47.24825\n ],\n [\n 119.559833,\n 47.303053\n ],\n [\n 119.487152,\n 47.329419\n ],\n [\n 119.353493,\n 47.43192\n ],\n [\n 119.365812,\n 47.477232\n ],\n [\n 119.152081,\n 47.540685\n ],\n [\n 119.134219,\n 47.664539\n ],\n [\n 118.773278,\n 47.771213\n ],\n [\n 118.568171,\n 47.992315\n ],\n [\n 118.424041,\n 48.014734\n ],\n [\n 118.299621,\n 48.005127\n ],\n [\n 118.231252,\n 48.043943\n ],\n [\n 117.96147,\n 48.011132\n ],\n [\n 117.813645,\n 48.016335\n ],\n [\n 117.493357,\n 47.758343\n ],\n [\n 117.384335,\n 47.641162\n ],\n [\n 117.094844,\n 47.823865\n ],\n [\n 116.879265,\n 47.893718\n ],\n [\n 116.669846,\n 47.890509\n ],\n [\n 116.453035,\n 47.837522\n ],\n [\n 116.26579,\n 47.876866\n ],\n [\n 116.111189,\n 47.811812\n ],\n [\n 115.939342,\n 47.683071\n ],\n [\n 115.580249,\n 47.921793\n ],\n [\n 115.529126,\n 48.155029\n ],\n [\n 115.822929,\n 48.2595\n ],\n [\n 115.799523,\n 48.514993\n ],\n [\n 115.83032,\n 48.560156\n ],\n [\n 116.077928,\n 48.822412\n ],\n [\n 116.048363,\n 48.873598\n ],\n [\n 116.717889,\n 49.847388\n ],\n [\n 116.736367,\n 49.847388\n ],\n [\n 117.068974,\n 49.695524\n ],\n [\n 117.278394,\n 49.636272\n ],\n [\n 117.485349,\n 49.633172\n ],\n [\n 117.809333,\n 49.521049\n ],\n [\n 117.867848,\n 49.592853\n ],\n [\n 117.980565,\n 49.621158\n ],\n [\n 118.084658,\n 49.618057\n ],\n [\n 118.122231,\n 49.669586\n ],\n [\n 118.205998,\n 49.684686\n ],\n [\n 118.225708,\n 49.734211\n ],\n [\n 118.388316,\n 49.786004\n ],\n [\n 118.395092,\n 49.819601\n ],\n [\n 118.49549,\n 49.843144\n ],\n [\n 118.485635,\n 49.86706\n ],\n [\n 118.574946,\n 49.931423\n ],\n [\n 118.741866,\n 49.946441\n ],\n [\n 118.929111,\n 49.989545\n ],\n [\n 119.092335,\n 49.986082\n ],\n [\n 119.163168,\n 50.027613\n ],\n [\n 119.190269,\n 50.087538\n ],\n [\n 119.243856,\n 50.078324\n ],\n [\n 119.360269,\n 50.196441\n ],\n [\n 119.319001,\n 50.220948\n ],\n [\n 119.358421,\n 50.358949\n ],\n [\n 119.259871,\n 50.345205\n ],\n [\n 119.125596,\n 50.389095\n ],\n [\n 119.250631,\n 50.448568\n ],\n [\n 119.28266,\n 50.604899\n ],\n [\n 119.361501,\n 50.632611\n ],\n [\n 119.383674,\n 50.682301\n ],\n [\n 119.450196,\n 50.695569\n ],\n [\n 119.506862,\n 50.764118\n ],\n [\n 119.491464,\n 50.879026\n ],\n [\n 119.633746,\n 51.010218\n ],\n [\n 119.726137,\n 51.050105\n ],\n [\n 119.788346,\n 51.16656\n ],\n [\n 119.760629,\n 51.21231\n ],\n [\n 119.944795,\n 51.366848\n ],\n [\n 120.002693,\n 51.459396\n ],\n [\n 119.985447,\n 51.505227\n ],\n [\n 120.051968,\n 51.553245\n ],\n [\n 120.035338,\n 51.586343\n ],\n [\n 120.087077,\n 51.678076\n ],\n [\n 120.172693,\n 51.679931\n ],\n [\n 120.363634,\n 51.789982\n ],\n [\n 120.398742,\n 51.832153\n ],\n [\n 120.480046,\n 51.855072\n ],\n [\n 120.481278,\n 51.885735\n ],\n [\n 120.656821,\n 51.92634\n ],\n [\n 120.719031,\n 52.014438\n ],\n [\n 120.68577,\n 52.036896\n ],\n [\n 120.747364,\n 52.076996\n ],\n [\n 120.786784,\n 52.157824\n ],\n [\n 120.7449,\n 52.206984\n ],\n [\n 120.755371,\n 52.258287\n ],\n [\n 120.627256,\n 52.324161\n ],\n [\n 120.62356,\n 52.361081\n ],\n [\n 120.688234,\n 52.427531\n ],\n [\n 120.689466,\n 52.516098\n ],\n [\n 120.727654,\n 52.529568\n ],\n [\n 120.467728,\n 52.644076\n ],\n [\n 120.40367,\n 52.617929\n ],\n [\n 120.287873,\n 52.623378\n ],\n [\n 120.196714,\n 52.579043\n ],\n [\n 120.049505,\n 52.598672\n ],\n [\n 120.035338,\n 52.646255\n ],\n [\n 120.071063,\n 52.706113\n ],\n [\n 120.038418,\n 52.780006\n ],\n [\n 120.222584,\n 52.842934\n ],\n [\n 120.350699,\n 52.906131\n ],\n [\n 120.455409,\n 53.011376\n ],\n [\n 120.549647,\n 53.076125\n ],\n [\n 120.643886,\n 53.106667\n ],\n [\n 120.736277,\n 53.204615\n ],\n [\n 120.840371,\n 53.24724\n ],\n [\n 120.882871,\n 53.294472\n ],\n [\n 121.129246,\n 53.277303\n ],\n [\n 121.285695,\n 53.291253\n ],\n [\n 121.347289,\n 53.327003\n ],\n [\n 121.499426,\n 53.337008\n ],\n [\n 121.612143,\n 53.260484\n ],\n [\n 121.679896,\n 53.240437\n ],\n [\n 121.665114,\n 53.170556\n ],\n [\n 121.754425,\n 53.146519\n ],\n [\n 121.817867,\n 53.061744\n ],\n [\n 121.785838,\n 53.018575\n ],\n [\n 121.715621,\n 52.998054\n ],\n [\n 121.66265,\n 52.912626\n ],\n [\n 121.610295,\n 52.892416\n ],\n [\n 121.591201,\n 52.824499\n ],\n [\n 121.476636,\n 52.772043\n ],\n [\n 121.373158,\n 52.683268\n ],\n [\n 121.182217,\n 52.599399\n ],\n [\n 121.325731,\n 52.572498\n ],\n [\n 121.416274,\n 52.499346\n ],\n [\n 121.519136,\n 52.456709\n ],\n [\n 121.63986,\n 52.444311\n ],\n [\n 121.714389,\n 52.317944\n ],\n [\n 121.841272,\n 52.282818\n ],\n [\n 121.94783,\n 52.298555\n ],\n [\n 122.091344,\n 52.427167\n ],\n [\n 122.168952,\n 52.513549\n ],\n [\n 122.207756,\n 52.469103\n ],\n [\n 122.310618,\n 52.475299\n ],\n [\n 122.342031,\n 52.41403\n ],\n [\n 122.484313,\n 52.341711\n ],\n [\n 122.478153,\n 52.29636\n ],\n [\n 122.585943,\n 52.266344\n ],\n [\n 122.76087,\n 52.26671\n ],\n [\n 122.769493,\n 52.179843\n ],\n [\n 122.629059,\n 52.136529\n ],\n [\n 122.683877,\n 51.974649\n ],\n [\n 122.726377,\n 51.978704\n ],\n [\n 122.706051,\n 51.890166\n ],\n [\n 122.771957,\n 51.779619\n ],\n [\n 122.749167,\n 51.746661\n ],\n [\n 122.85634,\n 51.606786\n ],\n [\n 122.854492,\n 51.477659\n ],\n [\n 122.903768,\n 51.415384\n ],\n [\n 122.965977,\n 51.387015\n ],\n [\n 122.978296,\n 51.331346\n ],\n [\n 123.058984,\n 51.321999\n ],\n [\n 123.294273,\n 51.25427\n ],\n [\n 123.465504,\n 51.287212\n ],\n [\n 123.736517,\n 50.974064\n ],\n [\n 123.825829,\n 50.813669\n ],\n [\n 124.076516,\n 50.564249\n ],\n [\n 123.983509,\n 50.510249\n ],\n [\n 124.005067,\n 50.434469\n ],\n [\n 123.920067,\n 50.37307\n ],\n [\n 123.800575,\n 50.455806\n ],\n [\n 123.777785,\n 50.344441\n ],\n [\n 123.870792,\n 50.270307\n ],\n [\n 123.878799,\n 50.208696\n ],\n [\n 123.953944,\n 50.186865\n ],\n [\n 124.007531,\n 50.219417\n ],\n [\n 124.061733,\n 50.199122\n ],\n [\n 124.103001,\n 50.238555\n ],\n [\n 124.189233,\n 50.216737\n ],\n [\n 124.278544,\n 50.231284\n ],\n [\n 124.32474,\n 50.178436\n ],\n [\n 124.368471,\n 50.258068\n ],\n [\n 124.36416,\n 50.360857\n ],\n [\n 124.43992,\n 50.388713\n ],\n [\n 124.499666,\n 50.397868\n ],\n [\n 124.504594,\n 50.342532\n ],\n [\n 124.578507,\n 50.294777\n ],\n [\n 124.619774,\n 50.229753\n ],\n [\n 124.575427,\n 50.179585\n ],\n [\n 124.508289,\n 50.162723\n ],\n [\n 124.604992,\n 50.070644\n ],\n [\n 124.680752,\n 50.031841\n ],\n [\n 124.650571,\n 49.99493\n ],\n [\n 124.66597,\n 49.868217\n ],\n [\n 124.730644,\n 49.817671\n ],\n [\n 124.74173,\n 49.761274\n ],\n [\n 124.824266,\n 49.849703\n ],\n [\n 124.972708,\n 49.834654\n ],\n [\n 124.935135,\n 49.866675\n ],\n [\n 124.977635,\n 49.900601\n ],\n [\n 125.095896,\n 49.795661\n ],\n [\n 125.177815,\n 49.829637\n ],\n [\n 125.222779,\n 49.799137\n ],\n [\n 125.219699,\n 49.669199\n ],\n [\n 125.132236,\n 49.671909\n ],\n [\n 125.234482,\n 49.592077\n ],\n [\n 125.228323,\n 49.486857\n ],\n [\n 125.264047,\n 49.461585\n ],\n [\n 125.261583,\n 49.318656\n ],\n [\n 125.219699,\n 49.188999\n ],\n [\n 125.117453,\n 49.126\n ],\n [\n 124.906802,\n 49.183915\n ],\n [\n 124.807636,\n 49.108769\n ],\n [\n 124.808252,\n 49.020563\n ],\n [\n 124.709086,\n 48.920406\n ],\n [\n 124.697383,\n 48.841711\n ],\n [\n 124.653651,\n 48.777089\n ],\n [\n 124.579122,\n 48.596574\n ],\n [\n 124.520608,\n 48.556196\n ],\n [\n 124.555717,\n 48.467805\n ],\n [\n 124.507674,\n 48.445584\n ],\n [\n 124.51876,\n 48.378068\n ],\n [\n 124.579738,\n 48.304095\n ],\n [\n 124.578507,\n 48.251931\n ],\n [\n 124.463942,\n 48.097518\n ],\n [\n 124.467637,\n 48.178972\n ],\n [\n 124.418978,\n 48.181765\n ],\n [\n 124.404812,\n 48.264679\n ],\n [\n 124.317964,\n 48.347856\n ],\n [\n 124.314269,\n 48.503894\n ],\n [\n 124.25945,\n 48.536391\n ],\n [\n 124.25945,\n 48.536391\n ],\n [\n 124.07898,\n 48.436058\n ],\n [\n 123.873256,\n 48.281006\n ],\n [\n 123.746373,\n 48.19772\n ],\n [\n 123.537569,\n 48.021938\n ],\n [\n 123.300432,\n 47.953861\n ],\n [\n 123.228983,\n 47.840735\n ],\n [\n 123.166158,\n 47.783677\n ],\n [\n 122.855108,\n 47.677432\n ],\n [\n 122.763333,\n 47.613338\n ],\n [\n 122.59395,\n 47.547551\n ],\n [\n 122.543443,\n 47.495427\n ],\n [\n 122.507103,\n 47.401555\n ],\n [\n 122.418407,\n 47.350503\n ],\n [\n 122.556378,\n 47.17265\n ],\n [\n 122.679566,\n 47.094092\n ],\n [\n 122.845869,\n 47.046819\n ],\n [\n 122.778116,\n 47.00277\n ],\n [\n 122.796594,\n 46.938261\n ],\n [\n 122.895144,\n 46.960317\n ],\n [\n 122.906847,\n 46.807372\n ],\n [\n 123.026339,\n 46.718841\n ],\n [\n 123.163694,\n 46.740167\n ],\n [\n 123.221592,\n 46.850355\n ],\n [\n 123.309056,\n 46.86222\n ],\n [\n 123.374345,\n 46.837668\n ],\n [\n 123.404526,\n 46.935401\n ],\n [\n 123.52833,\n 46.944797\n ],\n [\n 123.483366,\n 46.845854\n ],\n [\n 123.562823,\n 46.825797\n ],\n [\n 123.576989,\n 46.891259\n ],\n [\n 123.625648,\n 46.84749\n ],\n [\n 123.631808,\n 46.728685\n ],\n [\n 123.603475,\n 46.689299\n ],\n [\n 123.366338,\n 46.677805\n ],\n [\n 123.276411,\n 46.660972\n ],\n [\n 123.228368,\n 46.58824\n ],\n [\n 123.18094,\n 46.614138\n ],\n [\n 123.04605,\n 46.617426\n ],\n [\n 123.002318,\n 46.574257\n ],\n [\n 123.011557,\n 46.43506\n ],\n [\n 123.178476,\n 46.247944\n ],\n [\n 123.102716,\n 46.172172\n ],\n [\n 123.112571,\n 46.129894\n ],\n [\n 123.04605,\n 46.10003\n ],\n [\n 122.792898,\n 46.073056\n ],\n [\n 122.828623,\n 45.912185\n ],\n [\n 122.752246,\n 45.834701\n ],\n [\n 122.792283,\n 45.766291\n ],\n [\n 122.741775,\n 45.70532\n ],\n [\n 122.671558,\n 45.700723\n ],\n [\n 122.640761,\n 45.7713\n ],\n [\n 122.555146,\n 45.821359\n ],\n [\n 122.504639,\n 45.787157\n ],\n [\n 122.496016,\n 45.858041\n ],\n [\n 122.446125,\n 45.916764\n ],\n [\n 122.362357,\n 45.917597\n ],\n [\n 122.372828,\n 45.855957\n ],\n [\n 122.258879,\n 45.794666\n ],\n [\n 122.200981,\n 45.85679\n ],\n [\n 122.091344,\n 45.881787\n ],\n [\n 122.040221,\n 45.95879\n ],\n [\n 121.84312,\n 46.02447\n ],\n [\n 121.762432,\n 45.999538\n ],\n [\n 121.809243,\n 45.96087\n ],\n [\n 121.817251,\n 45.875539\n ],\n [\n 121.754425,\n 45.795084\n ],\n [\n 121.644172,\n 45.752516\n ],\n [\n 121.713773,\n 45.701977\n ],\n [\n 121.811091,\n 45.686932\n ],\n [\n 121.867142,\n 45.719942\n ],\n [\n 121.949062,\n 45.711169\n ],\n [\n 122.003264,\n 45.623363\n ],\n [\n 121.966308,\n 45.596157\n ],\n [\n 122.02359,\n 45.490137\n ],\n [\n 122.163408,\n 45.443979\n ],\n [\n 122.147394,\n 45.295598\n ],\n [\n 122.239169,\n 45.276234\n ],\n [\n 122.22993,\n 45.20672\n ],\n [\n 122.143082,\n 45.183108\n ],\n [\n 122.109822,\n 45.142186\n ],\n [\n 122.119677,\n 45.068705\n ],\n [\n 122.074713,\n 45.006553\n ],\n [\n 122.079025,\n 44.914258\n ],\n [\n 122.04946,\n 44.912987\n ],\n [\n 122.114749,\n 44.776386\n ],\n [\n 122.161561,\n 44.728371\n ],\n [\n 122.103046,\n 44.673935\n ],\n [\n 122.13138,\n 44.577697\n ],\n [\n 122.196053,\n 44.559794\n ],\n [\n 122.228082,\n 44.480017\n ],\n [\n 122.28598,\n 44.477883\n ],\n [\n 122.291524,\n 44.310291\n ],\n [\n 122.271198,\n 44.255463\n ],\n [\n 122.319241,\n 44.232745\n ],\n [\n 122.483697,\n 44.237032\n ],\n [\n 122.676486,\n 44.28631\n ],\n [\n 122.76087,\n 44.369772\n ],\n [\n 122.85634,\n 44.398422\n ],\n [\n 123.025108,\n 44.492823\n ],\n [\n 123.125506,\n 44.509466\n ],\n [\n 123.128585,\n 44.366778\n ],\n [\n 123.196955,\n 44.34496\n ],\n [\n 123.323838,\n 44.179991\n ],\n [\n 123.386664,\n 44.161966\n ],\n [\n 123.32815,\n 44.083795\n ],\n [\n 123.332461,\n 44.028326\n ],\n [\n 123.400831,\n 43.979264\n ],\n [\n 123.52525,\n 43.695718\n ],\n [\n 123.5117,\n 43.59267\n ],\n [\n 123.439019,\n 43.577501\n ],\n [\n 123.439019,\n 43.577501\n ],\n [\n 123.304744,\n 43.551055\n ],\n [\n 123.315831,\n 43.49205\n ],\n [\n 123.382968,\n 43.46904\n ],\n [\n 123.419925,\n 43.409955\n ],\n [\n 123.486446,\n 43.445587\n ],\n [\n 123.608402,\n 43.366474\n ],\n [\n 123.703873,\n 43.370824\n ]\n ]\n ],\n [\n [\n [\n 124.076516,\n 50.564249\n ],\n [\n 123.825829,\n 50.813669\n ],\n [\n 123.736517,\n 50.974064\n ],\n [\n 123.465504,\n 51.287212\n ],\n [\n 123.661989,\n 51.319008\n ],\n [\n 123.711264,\n 51.398216\n ],\n [\n 123.842459,\n 51.367595\n ],\n [\n 123.926227,\n 51.300681\n ],\n [\n 124.071588,\n 51.320878\n ],\n [\n 124.128255,\n 51.347419\n ],\n [\n 124.239124,\n 51.344429\n ],\n [\n 124.271769,\n 51.308162\n ],\n [\n 124.406659,\n 51.271867\n ],\n [\n 124.43684,\n 51.353772\n ],\n [\n 124.490427,\n 51.380294\n ],\n [\n 124.58713,\n 51.363486\n ],\n [\n 124.62655,\n 51.327608\n ],\n [\n 124.693687,\n 51.332842\n ],\n [\n 124.783614,\n 51.392243\n ],\n [\n 124.864302,\n 51.379547\n ],\n [\n 124.942527,\n 51.447465\n ],\n [\n 124.928976,\n 51.498523\n ],\n [\n 125.047236,\n 51.529801\n ],\n [\n 125.098975,\n 51.658408\n ],\n [\n 125.130388,\n 51.635389\n ],\n [\n 125.35151,\n 51.623876\n ],\n [\n 125.567089,\n 51.455668\n ],\n [\n 125.567089,\n 51.455668\n ],\n [\n 125.595422,\n 51.416877\n ],\n [\n 125.595422,\n 51.416877\n ],\n [\n 125.597886,\n 51.414638\n ],\n [\n 125.597886,\n 51.414638\n ],\n [\n 125.600966,\n 51.413518\n ],\n [\n 125.600966,\n 51.413518\n ],\n [\n 125.623756,\n 51.387762\n ],\n [\n 125.623756,\n 51.387762\n ],\n [\n 125.63977,\n 51.372451\n ],\n [\n 125.63977,\n 51.372451\n ],\n [\n 125.668103,\n 51.347419\n ],\n [\n 125.668103,\n 51.347419\n ],\n [\n 125.670567,\n 51.34555\n ],\n [\n 125.670567,\n 51.34555\n ],\n [\n 125.743248,\n 51.275984\n ],\n [\n 125.743248,\n 51.275984\n ],\n [\n 125.756798,\n 51.227675\n ],\n [\n 125.840566,\n 51.220555\n ],\n [\n 125.878138,\n 51.159431\n ],\n [\n 126.059225,\n 51.043711\n ],\n [\n 126.033971,\n 51.010971\n ],\n [\n 126.073391,\n 50.963514\n ],\n [\n 125.890457,\n 50.805729\n ],\n [\n 125.758646,\n 50.746706\n ],\n [\n 125.825784,\n 50.703906\n ],\n [\n 125.787595,\n 50.677373\n ],\n [\n 125.829479,\n 50.561589\n ],\n [\n 125.740784,\n 50.523184\n ],\n [\n 125.632379,\n 50.443996\n ],\n [\n 125.590495,\n 50.452378\n ],\n [\n 125.519662,\n 50.315795\n ],\n [\n 125.466075,\n 50.297452\n ],\n [\n 125.448829,\n 50.216354\n ],\n [\n 125.334264,\n 50.165023\n ],\n [\n 125.258504,\n 50.103659\n ],\n [\n 125.294228,\n 50.029151\n ],\n [\n 125.231402,\n 49.957606\n ],\n [\n 125.239409,\n 49.844687\n ],\n [\n 125.177815,\n 49.829637\n ],\n [\n 125.095896,\n 49.795661\n ],\n [\n 124.977635,\n 49.900601\n ],\n [\n 124.935135,\n 49.866675\n ],\n [\n 124.972708,\n 49.834654\n ],\n [\n 124.824266,\n 49.849703\n ],\n [\n 124.74173,\n 49.761274\n ],\n [\n 124.730644,\n 49.817671\n ],\n [\n 124.66597,\n 49.868217\n ],\n [\n 124.650571,\n 49.99493\n ],\n [\n 124.680752,\n 50.031841\n ],\n [\n 124.604992,\n 50.070644\n ],\n [\n 124.508289,\n 50.162723\n ],\n [\n 124.575427,\n 50.179585\n ],\n [\n 124.619774,\n 50.229753\n ],\n [\n 124.578507,\n 50.294777\n ],\n [\n 124.504594,\n 50.342532\n ],\n [\n 124.499666,\n 50.397868\n ],\n [\n 124.43992,\n 50.388713\n ],\n [\n 124.43992,\n 50.539919\n ],\n [\n 124.322892,\n 50.532693\n ],\n [\n 124.289015,\n 50.553226\n ],\n [\n 124.076516,\n 50.564249\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 210000,\n \"name\": \"辽宁省\",\n \"center\": [\n 123.429096,\n 41.796767\n ],\n \"centroid\": [\n 122.606135,\n 41.300702\n ],\n \"childrenNum\": 14,\n \"level\": \"province\",\n \"subFeatureIndex\": 5,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 119.239545,\n 41.314696\n ],\n [\n 119.326392,\n 41.329525\n ],\n [\n 119.30545,\n 41.402271\n ],\n [\n 119.376283,\n 41.422015\n ],\n [\n 119.405848,\n 41.508548\n ],\n [\n 119.361501,\n 41.56498\n ],\n [\n 119.415703,\n 41.590044\n ],\n [\n 119.307914,\n 41.657581\n ],\n [\n 119.294363,\n 41.775935\n ],\n [\n 119.334399,\n 41.869569\n ],\n [\n 119.324544,\n 41.969296\n ],\n [\n 119.384906,\n 42.089738\n ],\n [\n 119.315921,\n 42.119037\n ],\n [\n 119.237697,\n 42.201088\n ],\n [\n 119.284508,\n 42.265325\n ],\n [\n 119.415703,\n 42.309588\n ],\n [\n 119.502551,\n 42.387857\n ],\n [\n 119.572152,\n 42.359568\n ],\n [\n 119.541971,\n 42.292329\n ],\n [\n 119.744615,\n 42.211725\n ],\n [\n 119.846861,\n 42.21527\n ],\n [\n 119.837622,\n 42.135455\n ],\n [\n 119.989759,\n 41.898969\n ],\n [\n 120.051968,\n 41.775935\n ],\n [\n 120.035954,\n 41.708075\n ],\n [\n 120.096316,\n 41.696907\n ],\n [\n 120.188707,\n 41.848179\n ],\n [\n 120.373489,\n 41.994648\n ],\n [\n 120.456641,\n 42.016433\n ],\n [\n 120.466496,\n 42.105277\n ],\n [\n 120.58414,\n 42.167394\n ],\n [\n 120.624792,\n 42.154532\n ],\n [\n 120.745516,\n 42.223689\n ],\n [\n 120.79048,\n 42.218372\n ],\n [\n 120.933378,\n 42.279493\n ],\n [\n 121.068884,\n 42.252483\n ],\n [\n 121.285079,\n 42.387857\n ],\n [\n 121.304789,\n 42.435567\n ],\n [\n 121.304789,\n 42.435567\n ],\n [\n 121.388557,\n 42.475297\n ],\n [\n 121.604752,\n 42.494271\n ],\n [\n 121.66573,\n 42.437333\n ],\n [\n 121.904714,\n 42.569666\n ],\n [\n 121.940438,\n 42.688525\n ],\n [\n 122.071634,\n 42.711391\n ],\n [\n 122.20406,\n 42.683687\n ],\n [\n 122.203445,\n 42.731171\n ],\n [\n 122.338951,\n 42.670051\n ],\n [\n 122.395002,\n 42.683687\n ],\n [\n 122.457212,\n 42.774227\n ],\n [\n 122.374676,\n 42.774667\n ],\n [\n 122.35127,\n 42.830419\n ],\n [\n 122.436886,\n 42.843142\n ],\n [\n 122.563769,\n 42.826031\n ],\n [\n 122.624747,\n 42.773349\n ],\n [\n 122.732536,\n 42.786524\n ],\n [\n 122.786123,\n 42.756218\n ],\n [\n 122.786123,\n 42.756218\n ],\n [\n 122.831087,\n 42.722381\n ],\n [\n 122.887137,\n 42.770275\n ],\n [\n 123.058368,\n 42.768957\n ],\n [\n 123.227752,\n 42.831735\n ],\n [\n 123.169853,\n 42.859811\n ],\n [\n 123.18402,\n 42.926002\n ],\n [\n 123.259165,\n 42.992997\n ],\n [\n 123.474743,\n 43.04243\n ],\n [\n 123.515395,\n 43.027561\n ],\n [\n 123.515395,\n 43.027561\n ],\n [\n 123.572678,\n 43.0035\n ],\n [\n 123.666916,\n 43.179585\n ],\n [\n 123.664453,\n 43.264606\n ],\n [\n 123.703873,\n 43.370824\n ],\n [\n 123.710032,\n 43.417344\n ],\n [\n 123.791952,\n 43.491182\n ],\n [\n 123.87264,\n 43.451234\n ],\n [\n 123.84985,\n 43.415606\n ],\n [\n 123.896046,\n 43.361689\n ],\n [\n 124.032784,\n 43.280724\n ],\n [\n 124.098074,\n 43.29292\n ],\n [\n 124.114704,\n 43.247175\n ],\n [\n 124.226805,\n 43.241945\n ],\n [\n 124.226805,\n 43.241945\n ],\n [\n 124.282856,\n 43.230176\n ],\n [\n 124.284088,\n 43.166058\n ],\n [\n 124.425754,\n 43.076092\n ],\n [\n 124.333363,\n 42.997373\n ],\n [\n 124.422674,\n 42.975927\n ],\n [\n 124.431913,\n 42.930821\n ],\n [\n 124.369087,\n 42.882613\n ],\n [\n 124.435609,\n 42.88086\n ],\n [\n 124.454703,\n 42.823836\n ],\n [\n 124.514449,\n 42.873406\n ],\n [\n 124.514449,\n 42.873406\n ],\n [\n 124.539086,\n 42.867266\n ],\n [\n 124.659195,\n 42.972862\n ],\n [\n 124.686912,\n 43.051176\n ],\n [\n 124.785462,\n 43.117161\n ],\n [\n 124.896331,\n 43.129826\n ],\n [\n 124.840897,\n 43.032372\n ],\n [\n 124.869846,\n 42.988183\n ],\n [\n 124.859375,\n 42.822959\n ],\n [\n 124.897563,\n 42.787841\n ],\n [\n 124.975171,\n 42.802768\n ],\n [\n 124.996113,\n 42.745234\n ],\n [\n 124.996113,\n 42.745234\n ],\n [\n 124.968396,\n 42.72282\n ],\n [\n 125.038613,\n 42.615476\n ],\n [\n 125.097127,\n 42.62252\n ],\n [\n 125.068794,\n 42.499564\n ],\n [\n 125.186439,\n 42.428059\n ],\n [\n 125.175352,\n 42.308261\n ],\n [\n 125.29854,\n 42.290116\n ],\n [\n 125.305931,\n 42.146103\n ],\n [\n 125.353358,\n 42.178923\n ],\n [\n 125.490097,\n 42.136343\n ],\n [\n 125.369989,\n 42.003096\n ],\n [\n 125.291764,\n 41.958618\n ],\n [\n 125.299156,\n 41.872243\n ],\n [\n 125.299156,\n 41.872243\n ],\n [\n 125.297308,\n 41.861995\n ],\n [\n 125.297308,\n 41.861995\n ],\n [\n 125.29238,\n 41.83971\n ],\n [\n 125.29238,\n 41.83971\n ],\n [\n 125.29238,\n 41.83971\n ],\n [\n 125.319482,\n 41.777273\n ],\n [\n 125.319482,\n 41.777273\n ],\n [\n 125.323793,\n 41.771026\n ],\n [\n 125.323793,\n 41.771026\n ],\n [\n 125.325025,\n 41.670097\n ],\n [\n 125.450677,\n 41.674119\n ],\n [\n 125.450061,\n 41.598099\n ],\n [\n 125.534444,\n 41.478073\n ],\n [\n 125.547995,\n 41.401373\n ],\n [\n 125.637306,\n 41.34435\n ],\n [\n 125.646545,\n 41.264344\n ],\n [\n 125.758646,\n 41.232404\n ],\n [\n 125.737088,\n 41.179737\n ],\n [\n 125.791291,\n 41.167577\n ],\n [\n 125.712451,\n 41.095471\n ],\n [\n 125.726617,\n 41.055328\n ],\n [\n 125.674879,\n 40.974516\n ],\n [\n 125.589263,\n 40.931135\n ],\n [\n 125.707523,\n 40.866915\n ],\n [\n 125.544915,\n 40.72922\n ],\n [\n 125.49564,\n 40.728767\n ],\n [\n 125.422343,\n 40.635297\n ],\n [\n 125.279445,\n 40.655273\n ],\n [\n 125.018287,\n 40.53624\n ],\n [\n 124.985642,\n 40.475279\n ],\n [\n 124.897563,\n 40.47892\n ],\n [\n 124.851368,\n 40.427017\n ],\n [\n 124.74481,\n 40.375074\n ],\n [\n 124.718325,\n 40.319441\n ],\n [\n 124.62039,\n 40.290695\n ],\n [\n 124.388797,\n 40.113384\n ],\n [\n 124.38079,\n 40.108808\n ],\n [\n 124.336442,\n 40.049751\n ],\n [\n 124.372167,\n 40.021348\n ],\n [\n 124.239124,\n 39.927352\n ],\n [\n 124.173218,\n 39.841496\n ],\n [\n 124.144885,\n 39.745413\n ],\n [\n 124.103001,\n 39.823577\n ],\n [\n 124.002603,\n 39.800137\n ],\n [\n 123.828908,\n 39.831389\n ],\n [\n 123.697097,\n 39.807032\n ],\n [\n 123.665684,\n 39.831389\n ],\n [\n 123.612714,\n 39.77485\n ],\n [\n 123.536337,\n 39.788644\n ],\n [\n 123.392823,\n 39.723787\n ],\n [\n 123.383584,\n 39.766572\n ],\n [\n 123.274563,\n 39.753693\n ],\n [\n 123.253005,\n 39.689724\n ],\n [\n 123.010941,\n 39.655184\n ],\n [\n 122.972753,\n 39.594813\n ],\n [\n 122.85634,\n 39.606799\n ],\n [\n 122.808913,\n 39.559764\n ],\n [\n 122.581631,\n 39.464211\n ],\n [\n 122.489856,\n 39.403673\n ],\n [\n 122.412864,\n 39.411995\n ],\n [\n 122.274893,\n 39.322257\n ],\n [\n 122.242865,\n 39.267618\n ],\n [\n 122.117213,\n 39.213863\n ],\n [\n 122.167104,\n 39.158676\n ],\n [\n 122.048228,\n 39.101123\n ],\n [\n 121.963228,\n 39.030046\n ],\n [\n 121.864062,\n 39.037018\n ],\n [\n 121.920728,\n 38.969598\n ],\n [\n 121.863446,\n 38.942611\n ],\n [\n 121.790149,\n 39.022609\n ],\n [\n 121.671273,\n 39.010057\n ],\n [\n 121.655874,\n 38.9468\n ],\n [\n 121.719316,\n 38.92027\n ],\n [\n 121.708845,\n 38.872772\n ],\n [\n 121.565331,\n 38.875101\n ],\n [\n 121.509897,\n 38.817784\n ],\n [\n 121.359608,\n 38.822446\n ],\n [\n 121.259825,\n 38.786543\n ],\n [\n 121.198848,\n 38.721686\n ],\n [\n 121.13479,\n 38.72402\n ],\n [\n 121.128014,\n 38.958897\n ],\n [\n 121.204391,\n 38.941215\n ],\n [\n 121.341129,\n 38.980761\n ],\n [\n 121.370695,\n 39.060251\n ],\n [\n 121.508049,\n 39.034229\n ],\n [\n 121.68236,\n 39.117837\n ],\n [\n 121.604136,\n 39.166098\n ],\n [\n 121.598592,\n 39.279198\n ],\n [\n 121.668193,\n 39.276419\n ],\n [\n 121.723628,\n 39.367603\n ],\n [\n 121.621382,\n 39.32596\n ],\n [\n 121.474788,\n 39.296332\n ],\n [\n 121.432904,\n 39.357426\n ],\n [\n 121.246891,\n 39.421702\n ],\n [\n 121.304173,\n 39.481762\n ],\n [\n 121.224717,\n 39.51962\n ],\n [\n 121.297398,\n 39.605877\n ],\n [\n 121.450151,\n 39.625235\n ],\n [\n 121.501274,\n 39.706758\n ],\n [\n 121.45939,\n 39.747713\n ],\n [\n 121.530223,\n 39.851603\n ],\n [\n 121.626925,\n 39.882831\n ],\n [\n 121.699606,\n 39.937445\n ],\n [\n 121.76428,\n 39.933316\n ],\n [\n 121.82341,\n 40.036467\n ],\n [\n 121.884388,\n 40.053415\n ],\n [\n 122.01004,\n 40.149067\n ],\n [\n 121.940438,\n 40.2423\n ],\n [\n 122.02667,\n 40.245041\n ],\n [\n 122.040221,\n 40.322178\n ],\n [\n 122.198517,\n 40.382367\n ],\n [\n 122.245944,\n 40.519868\n ],\n [\n 122.133843,\n 40.614408\n ],\n [\n 122.148626,\n 40.671612\n ],\n [\n 122.06609,\n 40.648464\n ],\n [\n 121.951525,\n 40.680687\n ],\n [\n 121.934279,\n 40.798103\n ],\n [\n 121.852359,\n 40.821199\n ],\n [\n 121.816019,\n 40.894962\n ],\n [\n 121.682976,\n 40.829802\n ],\n [\n 121.526527,\n 40.851529\n ],\n [\n 121.499426,\n 40.880035\n ],\n [\n 121.335586,\n 40.900842\n ],\n [\n 121.23642,\n 40.851077\n ],\n [\n 121.126167,\n 40.869177\n ],\n [\n 121.086747,\n 40.798103\n ],\n [\n 120.991276,\n 40.744181\n ],\n [\n 121.033776,\n 40.70972\n ],\n [\n 120.8299,\n 40.671158\n ],\n [\n 120.822509,\n 40.593966\n ],\n [\n 120.72827,\n 40.539423\n ],\n [\n 120.674683,\n 40.471183\n ],\n [\n 120.616169,\n 40.457071\n ],\n [\n 120.599539,\n 40.355471\n ],\n [\n 120.537329,\n 40.325372\n ],\n [\n 120.523778,\n 40.256914\n ],\n [\n 120.465264,\n 40.178787\n ],\n [\n 120.371641,\n 40.174673\n ],\n [\n 120.273091,\n 40.127111\n ],\n [\n 119.955882,\n 40.046544\n ],\n [\n 119.913998,\n 39.988349\n ],\n [\n 119.854252,\n 39.988349\n ],\n [\n 119.845629,\n 40.000726\n ],\n [\n 119.845629,\n 40.000726\n ],\n [\n 119.848093,\n 40.020432\n ],\n [\n 119.848093,\n 40.020432\n ],\n [\n 119.817296,\n 40.049751\n ],\n [\n 119.817296,\n 40.049751\n ],\n [\n 119.780339,\n 40.047002\n ],\n [\n 119.780339,\n 40.047002\n ],\n [\n 119.779723,\n 40.049293\n ],\n [\n 119.779723,\n 40.049293\n ],\n [\n 119.736608,\n 40.10469\n ],\n [\n 119.745847,\n 40.208038\n ],\n [\n 119.625123,\n 40.224029\n ],\n [\n 119.642369,\n 40.291151\n ],\n [\n 119.586934,\n 40.37553\n ],\n [\n 119.598637,\n 40.465266\n ],\n [\n 119.571536,\n 40.540333\n ],\n [\n 119.30237,\n 40.530329\n ],\n [\n 119.162552,\n 40.599872\n ],\n [\n 119.184726,\n 40.680233\n ],\n [\n 119.054147,\n 40.664804\n ],\n [\n 118.911249,\n 40.776811\n ],\n [\n 118.849039,\n 40.800821\n ],\n [\n 118.90201,\n 40.960963\n ],\n [\n 118.977154,\n 40.959155\n ],\n [\n 118.977154,\n 40.959155\n ],\n [\n 119.013495,\n 41.007485\n ],\n [\n 118.951901,\n 41.01832\n ],\n [\n 118.96422,\n 41.079236\n ],\n [\n 119.037516,\n 41.067509\n ],\n [\n 119.126212,\n 41.138744\n ],\n [\n 119.2494,\n 41.279634\n ],\n [\n 119.239545,\n 41.314696\n ]\n ]\n ],\n [\n [\n [\n 122.969057,\n 39.513158\n ],\n [\n 122.978912,\n 39.561609\n ],\n [\n 123.036194,\n 39.533004\n ],\n [\n 122.969057,\n 39.513158\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 220000,\n \"name\": \"吉林省\",\n \"center\": [\n 125.3245,\n 43.886841\n ],\n \"centroid\": [\n 126.171246,\n 43.703944\n ],\n \"childrenNum\": 9,\n \"level\": \"province\",\n \"subFeatureIndex\": 6,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 125.707523,\n 40.866915\n ],\n [\n 125.589263,\n 40.931135\n ],\n [\n 125.674879,\n 40.974516\n ],\n [\n 125.726617,\n 41.055328\n ],\n [\n 125.712451,\n 41.095471\n ],\n [\n 125.791291,\n 41.167577\n ],\n [\n 125.737088,\n 41.179737\n ],\n [\n 125.758646,\n 41.232404\n ],\n [\n 125.646545,\n 41.264344\n ],\n [\n 125.637306,\n 41.34435\n ],\n [\n 125.547995,\n 41.401373\n ],\n [\n 125.534444,\n 41.478073\n ],\n [\n 125.450061,\n 41.598099\n ],\n [\n 125.450677,\n 41.674119\n ],\n [\n 125.325025,\n 41.670097\n ],\n [\n 125.323793,\n 41.771026\n ],\n [\n 125.323793,\n 41.771026\n ],\n [\n 125.319482,\n 41.777273\n ],\n [\n 125.319482,\n 41.777273\n ],\n [\n 125.29238,\n 41.83971\n ],\n [\n 125.29238,\n 41.83971\n ],\n [\n 125.29238,\n 41.83971\n ],\n [\n 125.297308,\n 41.861995\n ],\n [\n 125.297308,\n 41.861995\n ],\n [\n 125.299156,\n 41.872243\n ],\n [\n 125.299156,\n 41.872243\n ],\n [\n 125.291764,\n 41.958618\n ],\n [\n 125.369989,\n 42.003096\n ],\n [\n 125.490097,\n 42.136343\n ],\n [\n 125.353358,\n 42.178923\n ],\n [\n 125.305931,\n 42.146103\n ],\n [\n 125.29854,\n 42.290116\n ],\n [\n 125.175352,\n 42.308261\n ],\n [\n 125.186439,\n 42.428059\n ],\n [\n 125.068794,\n 42.499564\n ],\n [\n 125.097127,\n 42.62252\n ],\n [\n 125.038613,\n 42.615476\n ],\n [\n 124.968396,\n 42.72282\n ],\n [\n 124.996113,\n 42.745234\n ],\n [\n 124.996113,\n 42.745234\n ],\n [\n 124.975171,\n 42.802768\n ],\n [\n 124.897563,\n 42.787841\n ],\n [\n 124.859375,\n 42.822959\n ],\n [\n 124.869846,\n 42.988183\n ],\n [\n 124.840897,\n 43.032372\n ],\n [\n 124.896331,\n 43.129826\n ],\n [\n 124.785462,\n 43.117161\n ],\n [\n 124.686912,\n 43.051176\n ],\n [\n 124.659195,\n 42.972862\n ],\n [\n 124.539086,\n 42.867266\n ],\n [\n 124.514449,\n 42.873406\n ],\n [\n 124.514449,\n 42.873406\n ],\n [\n 124.454703,\n 42.823836\n ],\n [\n 124.435609,\n 42.88086\n ],\n [\n 124.369087,\n 42.882613\n ],\n [\n 124.431913,\n 42.930821\n ],\n [\n 124.422674,\n 42.975927\n ],\n [\n 124.333363,\n 42.997373\n ],\n [\n 124.425754,\n 43.076092\n ],\n [\n 124.284088,\n 43.166058\n ],\n [\n 124.282856,\n 43.230176\n ],\n [\n 124.226805,\n 43.241945\n ],\n [\n 124.226805,\n 43.241945\n ],\n [\n 124.114704,\n 43.247175\n ],\n [\n 124.098074,\n 43.29292\n ],\n [\n 124.032784,\n 43.280724\n ],\n [\n 123.896046,\n 43.361689\n ],\n [\n 123.84985,\n 43.415606\n ],\n [\n 123.87264,\n 43.451234\n ],\n [\n 123.791952,\n 43.491182\n ],\n [\n 123.710032,\n 43.417344\n ],\n [\n 123.703873,\n 43.370824\n ],\n [\n 123.608402,\n 43.366474\n ],\n [\n 123.486446,\n 43.445587\n ],\n [\n 123.419925,\n 43.409955\n ],\n [\n 123.382968,\n 43.46904\n ],\n [\n 123.315831,\n 43.49205\n ],\n [\n 123.304744,\n 43.551055\n ],\n [\n 123.439019,\n 43.577501\n ],\n [\n 123.439019,\n 43.577501\n ],\n [\n 123.5117,\n 43.59267\n ],\n [\n 123.52525,\n 43.695718\n ],\n [\n 123.400831,\n 43.979264\n ],\n [\n 123.332461,\n 44.028326\n ],\n [\n 123.32815,\n 44.083795\n ],\n [\n 123.386664,\n 44.161966\n ],\n [\n 123.323838,\n 44.179991\n ],\n [\n 123.196955,\n 44.34496\n ],\n [\n 123.128585,\n 44.366778\n ],\n [\n 123.125506,\n 44.509466\n ],\n [\n 123.025108,\n 44.492823\n ],\n [\n 122.85634,\n 44.398422\n ],\n [\n 122.76087,\n 44.369772\n ],\n [\n 122.676486,\n 44.28631\n ],\n [\n 122.483697,\n 44.237032\n ],\n [\n 122.319241,\n 44.232745\n ],\n [\n 122.271198,\n 44.255463\n ],\n [\n 122.291524,\n 44.310291\n ],\n [\n 122.28598,\n 44.477883\n ],\n [\n 122.228082,\n 44.480017\n ],\n [\n 122.196053,\n 44.559794\n ],\n [\n 122.13138,\n 44.577697\n ],\n [\n 122.103046,\n 44.673935\n ],\n [\n 122.161561,\n 44.728371\n ],\n [\n 122.114749,\n 44.776386\n ],\n [\n 122.04946,\n 44.912987\n ],\n [\n 122.079025,\n 44.914258\n ],\n [\n 122.074713,\n 45.006553\n ],\n [\n 122.119677,\n 45.068705\n ],\n [\n 122.109822,\n 45.142186\n ],\n [\n 122.143082,\n 45.183108\n ],\n [\n 122.22993,\n 45.20672\n ],\n [\n 122.239169,\n 45.276234\n ],\n [\n 122.147394,\n 45.295598\n ],\n [\n 122.163408,\n 45.443979\n ],\n [\n 122.02359,\n 45.490137\n ],\n [\n 121.966308,\n 45.596157\n ],\n [\n 122.003264,\n 45.623363\n ],\n [\n 121.949062,\n 45.711169\n ],\n [\n 121.867142,\n 45.719942\n ],\n [\n 121.811091,\n 45.686932\n ],\n [\n 121.713773,\n 45.701977\n ],\n [\n 121.644172,\n 45.752516\n ],\n [\n 121.754425,\n 45.795084\n ],\n [\n 121.817251,\n 45.875539\n ],\n [\n 121.809243,\n 45.96087\n ],\n [\n 121.762432,\n 45.999538\n ],\n [\n 121.84312,\n 46.02447\n ],\n [\n 122.040221,\n 45.95879\n ],\n [\n 122.091344,\n 45.881787\n ],\n [\n 122.200981,\n 45.85679\n ],\n [\n 122.258879,\n 45.794666\n ],\n [\n 122.372828,\n 45.855957\n ],\n [\n 122.362357,\n 45.917597\n ],\n [\n 122.446125,\n 45.916764\n ],\n [\n 122.496016,\n 45.858041\n ],\n [\n 122.504639,\n 45.787157\n ],\n [\n 122.555146,\n 45.821359\n ],\n [\n 122.640761,\n 45.7713\n ],\n [\n 122.671558,\n 45.700723\n ],\n [\n 122.741775,\n 45.70532\n ],\n [\n 122.792283,\n 45.766291\n ],\n [\n 122.752246,\n 45.834701\n ],\n [\n 122.828623,\n 45.912185\n ],\n [\n 122.792898,\n 46.073056\n ],\n [\n 123.04605,\n 46.10003\n ],\n [\n 123.112571,\n 46.129894\n ],\n [\n 123.102716,\n 46.172172\n ],\n [\n 123.178476,\n 46.247944\n ],\n [\n 123.248078,\n 46.273178\n ],\n [\n 123.319527,\n 46.253736\n ],\n [\n 123.319527,\n 46.253736\n ],\n [\n 123.373113,\n 46.223112\n ],\n [\n 123.498765,\n 46.259528\n ],\n [\n 123.565902,\n 46.22601\n ],\n [\n 123.610866,\n 46.252909\n ],\n [\n 123.779633,\n 46.264078\n ],\n [\n 123.896046,\n 46.303774\n ],\n [\n 123.982893,\n 46.22601\n ],\n [\n 123.99398,\n 46.101275\n ],\n [\n 124.040176,\n 46.019484\n ],\n [\n 123.970574,\n 45.971267\n ],\n [\n 123.996444,\n 45.907189\n ],\n [\n 124.061118,\n 45.886369\n ],\n [\n 124.064813,\n 45.797586\n ],\n [\n 124.009379,\n 45.78215\n ],\n [\n 124.13811,\n 45.68735\n ],\n [\n 124.129487,\n 45.637589\n ],\n [\n 124.273001,\n 45.584014\n ],\n [\n 124.287783,\n 45.539191\n ],\n [\n 124.354305,\n 45.546734\n ],\n [\n 124.398652,\n 45.44062\n ],\n [\n 124.480572,\n 45.456151\n ],\n [\n 124.544014,\n 45.412066\n ],\n [\n 124.625318,\n 45.437262\n ],\n [\n 124.886476,\n 45.442719\n ],\n [\n 124.923433,\n 45.541286\n ],\n [\n 124.961005,\n 45.49517\n ],\n [\n 125.025678,\n 45.493492\n ],\n [\n 125.06941,\n 45.384757\n ],\n [\n 125.248649,\n 45.417526\n ],\n [\n 125.347815,\n 45.395262\n ],\n [\n 125.398322,\n 45.416686\n ],\n [\n 125.424807,\n 45.485523\n ],\n [\n 125.497488,\n 45.469161\n ],\n [\n 125.628067,\n 45.522006\n ],\n [\n 125.687813,\n 45.51404\n ],\n [\n 125.716146,\n 45.421725\n ],\n [\n 125.697052,\n 45.349447\n ],\n [\n 125.760494,\n 45.291389\n ],\n [\n 125.915095,\n 45.196602\n ],\n [\n 126.166398,\n 45.133323\n ],\n [\n 126.321615,\n 45.178891\n ],\n [\n 126.428172,\n 45.2358\n ],\n [\n 126.567375,\n 45.252651\n ],\n [\n 126.831613,\n 45.146406\n ],\n [\n 126.96404,\n 45.132056\n ],\n [\n 126.968351,\n 45.074621\n ],\n [\n 127.085995,\n 44.944757\n ],\n [\n 127.021938,\n 44.899002\n ],\n [\n 126.984366,\n 44.823936\n ],\n [\n 127.037336,\n 44.72157\n ],\n [\n 127.049039,\n 44.567041\n ],\n [\n 127.094003,\n 44.615189\n ],\n [\n 127.182082,\n 44.644144\n ],\n [\n 127.392733,\n 44.632223\n ],\n [\n 127.557189,\n 44.575566\n ],\n [\n 127.536247,\n 44.522266\n ],\n [\n 127.463566,\n 44.484713\n ],\n [\n 127.50853,\n 44.437312\n ],\n [\n 127.483892,\n 44.401842\n ],\n [\n 127.483892,\n 44.401842\n ],\n [\n 127.623095,\n 44.277743\n ],\n [\n 127.591066,\n 44.227601\n ],\n [\n 127.681609,\n 44.167116\n ],\n [\n 127.724109,\n 44.196723\n ],\n [\n 127.729036,\n 44.098836\n ],\n [\n 127.862079,\n 44.063162\n ],\n [\n 128.059796,\n 44.110007\n ],\n [\n 128.089977,\n 44.132342\n ],\n [\n 128.101679,\n 44.290593\n ],\n [\n 128.049941,\n 44.349239\n ],\n [\n 128.190375,\n 44.367206\n ],\n [\n 128.211317,\n 44.431757\n ],\n [\n 128.373309,\n 44.51416\n ],\n [\n 128.46262,\n 44.433894\n ],\n [\n 128.481714,\n 44.375332\n ],\n [\n 128.450301,\n 44.203157\n ],\n [\n 128.574721,\n 44.047682\n ],\n [\n 128.584576,\n 43.990887\n ],\n [\n 128.644938,\n 43.936193\n ],\n [\n 128.636315,\n 43.891366\n ],\n [\n 128.723778,\n 43.894816\n ],\n [\n 128.760734,\n 43.857724\n ],\n [\n 128.719467,\n 43.816724\n ],\n [\n 128.877763,\n 43.540213\n ],\n [\n 128.949212,\n 43.55409\n ],\n [\n 129.014501,\n 43.523295\n ],\n [\n 129.230696,\n 43.59527\n ],\n [\n 129.211602,\n 43.784336\n ],\n [\n 129.406855,\n 43.819314\n ],\n [\n 129.467833,\n 43.874548\n ],\n [\n 129.742542,\n 43.875841\n ],\n [\n 129.784426,\n 43.964623\n ],\n [\n 129.869425,\n 44.005521\n ],\n [\n 129.869425,\n 44.005521\n ],\n [\n 129.880512,\n 44.000357\n ],\n [\n 129.880512,\n 44.000357\n ],\n [\n 129.98091,\n 44.014128\n ],\n [\n 130.017251,\n 43.962039\n ],\n [\n 130.027106,\n 43.851684\n ],\n [\n 130.079461,\n 43.835285\n ],\n [\n 130.079461,\n 43.835285\n ],\n [\n 130.189098,\n 43.940501\n ],\n [\n 130.260547,\n 43.948256\n ],\n [\n 130.353554,\n 44.050262\n ],\n [\n 130.338155,\n 43.949979\n ],\n [\n 130.338155,\n 43.949979\n ],\n [\n 130.383119,\n 43.906025\n ],\n [\n 130.380039,\n 43.783904\n ],\n [\n 130.423771,\n 43.742853\n ],\n [\n 130.4133,\n 43.652009\n ],\n [\n 130.488444,\n 43.655905\n ],\n [\n 130.823515,\n 43.502901\n ],\n [\n 130.841378,\n 43.454274\n ],\n [\n 130.907283,\n 43.434291\n ],\n [\n 131.026775,\n 43.508542\n ],\n [\n 131.134565,\n 43.428643\n ],\n [\n 131.134565,\n 43.428643\n ],\n [\n 131.294093,\n 43.469909\n ],\n [\n 131.304564,\n 43.502033\n ],\n [\n 131.314419,\n 43.392567\n ],\n [\n 131.275615,\n 43.369084\n ],\n [\n 131.255289,\n 43.265041\n ],\n [\n 131.206014,\n 43.23715\n ],\n [\n 131.218332,\n 43.146853\n ],\n [\n 131.171521,\n 43.069536\n ],\n [\n 131.102536,\n 43.021\n ],\n [\n 131.151195,\n 42.968485\n ],\n [\n 131.114855,\n 42.915048\n ],\n [\n 131.034167,\n 42.929069\n ],\n [\n 131.045869,\n 42.866828\n ],\n [\n 130.949167,\n 42.876913\n ],\n [\n 130.890653,\n 42.852793\n ],\n [\n 130.801957,\n 42.879544\n ],\n [\n 130.784095,\n 42.842265\n ],\n [\n 130.666451,\n 42.847968\n ],\n [\n 130.40714,\n 42.731611\n ],\n [\n 130.464423,\n 42.688525\n ],\n [\n 130.586995,\n 42.67621\n ],\n [\n 130.633806,\n 42.603586\n ],\n [\n 130.570364,\n 42.557327\n ],\n [\n 130.558661,\n 42.496035\n ],\n [\n 130.482285,\n 42.626483\n ],\n [\n 130.388046,\n 42.603145\n ],\n [\n 130.242069,\n 42.738643\n ],\n [\n 130.265474,\n 42.904092\n ],\n [\n 130.10225,\n 42.922935\n ],\n [\n 130.144134,\n 42.976365\n ],\n [\n 129.994461,\n 42.980304\n ],\n [\n 129.98707,\n 42.977678\n ],\n [\n 129.939642,\n 43.01225\n ],\n [\n 129.899606,\n 43.002187\n ],\n [\n 129.85957,\n 42.966295\n ],\n [\n 129.858338,\n 42.964544\n ],\n [\n 129.839244,\n 42.879983\n ],\n [\n 129.835549,\n 42.866828\n ],\n [\n 129.821382,\n 42.854109\n ],\n [\n 129.816454,\n 42.851039\n ],\n [\n 129.7641,\n 42.716227\n ],\n [\n 129.764716,\n 42.713149\n ],\n [\n 129.776418,\n 42.69908\n ],\n [\n 129.794281,\n 42.684127\n ],\n [\n 129.741926,\n 42.580681\n ],\n [\n 129.748701,\n 42.470884\n ],\n [\n 129.704354,\n 42.427176\n ],\n [\n 129.612579,\n 42.436892\n ],\n [\n 129.601492,\n 42.42276\n ],\n [\n 129.546057,\n 42.361336\n ],\n [\n 129.452434,\n 42.440866\n ],\n [\n 129.344029,\n 42.451462\n ],\n [\n 129.239935,\n 42.36841\n ],\n [\n 129.231928,\n 42.36001\n ],\n [\n 129.260261,\n 42.335689\n ],\n [\n 129.183269,\n 42.262225\n ],\n [\n 129.215914,\n 42.20818\n ],\n [\n 129.120443,\n 42.142111\n ],\n [\n 128.954755,\n 42.083966\n ],\n [\n 128.930734,\n 42.014211\n ],\n [\n 128.737945,\n 42.050209\n ],\n [\n 128.70222,\n 42.020434\n ],\n [\n 128.60675,\n 42.030212\n ],\n [\n 128.569177,\n 41.996426\n ],\n [\n 128.466316,\n 42.020878\n ],\n [\n 128.090593,\n 42.022656\n ],\n [\n 128.033926,\n 42.000428\n ],\n [\n 128.106607,\n 41.950164\n ],\n [\n 128.112766,\n 41.79378\n ],\n [\n 128.171897,\n 41.713882\n ],\n [\n 128.278454,\n 41.658922\n ],\n [\n 128.317258,\n 41.593177\n ],\n [\n 128.242114,\n 41.501827\n ],\n [\n 128.203309,\n 41.411246\n ],\n [\n 128.113998,\n 41.364561\n ],\n [\n 127.932296,\n 41.446686\n ],\n [\n 127.850376,\n 41.422912\n ],\n [\n 127.636645,\n 41.41349\n ],\n [\n 127.547334,\n 41.477176\n ],\n [\n 127.40998,\n 41.463278\n ],\n [\n 127.294183,\n 41.48659\n ],\n [\n 127.283096,\n 41.513925\n ],\n [\n 127.115561,\n 41.540353\n ],\n [\n 127.179618,\n 41.599888\n ],\n [\n 127.039184,\n 41.671884\n ],\n [\n 127.051503,\n 41.744693\n ],\n [\n 126.943714,\n 41.772365\n ],\n [\n 126.931395,\n 41.812959\n ],\n [\n 126.808207,\n 41.748264\n ],\n [\n 126.798968,\n 41.697354\n ],\n [\n 126.726903,\n 41.751389\n ],\n [\n 126.688099,\n 41.674119\n ],\n [\n 126.608643,\n 41.670543\n ],\n [\n 126.569838,\n 41.621809\n ],\n [\n 126.497158,\n 41.406758\n ],\n [\n 126.539041,\n 41.366806\n ],\n [\n 126.435564,\n 41.351088\n ],\n [\n 126.322847,\n 41.231054\n ],\n [\n 126.293282,\n 41.17073\n ],\n [\n 126.157775,\n 41.091413\n ],\n [\n 126.031507,\n 40.927067\n ],\n [\n 125.959442,\n 40.881845\n ],\n [\n 125.875059,\n 40.90853\n ],\n [\n 125.817161,\n 40.866915\n ],\n [\n 125.785132,\n 40.895867\n ],\n [\n 125.707523,\n 40.866915\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 230000,\n \"name\": \"黑龙江省\",\n \"center\": [\n 126.642464,\n 45.756967\n ],\n \"centroid\": [\n 127.693002,\n 48.040469\n ],\n \"childrenNum\": 13,\n \"level\": \"province\",\n \"subFeatureIndex\": 7,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 123.319527,\n 46.253736\n ],\n [\n 123.319527,\n 46.253736\n ],\n [\n 123.248078,\n 46.273178\n ],\n [\n 123.178476,\n 46.247944\n ],\n [\n 123.011557,\n 46.43506\n ],\n [\n 123.002318,\n 46.574257\n ],\n [\n 123.04605,\n 46.617426\n ],\n [\n 123.18094,\n 46.614138\n ],\n [\n 123.228368,\n 46.58824\n ],\n [\n 123.276411,\n 46.660972\n ],\n [\n 123.366338,\n 46.677805\n ],\n [\n 123.603475,\n 46.689299\n ],\n [\n 123.631808,\n 46.728685\n ],\n [\n 123.625648,\n 46.84749\n ],\n [\n 123.576989,\n 46.891259\n ],\n [\n 123.562823,\n 46.825797\n ],\n [\n 123.483366,\n 46.845854\n ],\n [\n 123.52833,\n 46.944797\n ],\n [\n 123.404526,\n 46.935401\n ],\n [\n 123.374345,\n 46.837668\n ],\n [\n 123.309056,\n 46.86222\n ],\n [\n 123.221592,\n 46.850355\n ],\n [\n 123.163694,\n 46.740167\n ],\n [\n 123.026339,\n 46.718841\n ],\n [\n 122.906847,\n 46.807372\n ],\n [\n 122.895144,\n 46.960317\n ],\n [\n 122.796594,\n 46.938261\n ],\n [\n 122.778116,\n 47.00277\n ],\n [\n 122.845869,\n 47.046819\n ],\n [\n 122.679566,\n 47.094092\n ],\n [\n 122.556378,\n 47.17265\n ],\n [\n 122.418407,\n 47.350503\n ],\n [\n 122.507103,\n 47.401555\n ],\n [\n 122.543443,\n 47.495427\n ],\n [\n 122.59395,\n 47.547551\n ],\n [\n 122.763333,\n 47.613338\n ],\n [\n 122.855108,\n 47.677432\n ],\n [\n 123.166158,\n 47.783677\n ],\n [\n 123.228983,\n 47.840735\n ],\n [\n 123.300432,\n 47.953861\n ],\n [\n 123.537569,\n 48.021938\n ],\n [\n 123.746373,\n 48.19772\n ],\n [\n 123.873256,\n 48.281006\n ],\n [\n 124.07898,\n 48.436058\n ],\n [\n 124.25945,\n 48.536391\n ],\n [\n 124.25945,\n 48.536391\n ],\n [\n 124.314269,\n 48.503894\n ],\n [\n 124.317964,\n 48.347856\n ],\n [\n 124.404812,\n 48.264679\n ],\n [\n 124.418978,\n 48.181765\n ],\n [\n 124.467637,\n 48.178972\n ],\n [\n 124.463942,\n 48.097518\n ],\n [\n 124.578507,\n 48.251931\n ],\n [\n 124.579738,\n 48.304095\n ],\n [\n 124.51876,\n 48.378068\n ],\n [\n 124.507674,\n 48.445584\n ],\n [\n 124.555717,\n 48.467805\n ],\n [\n 124.520608,\n 48.556196\n ],\n [\n 124.579122,\n 48.596574\n ],\n [\n 124.653651,\n 48.777089\n ],\n [\n 124.697383,\n 48.841711\n ],\n [\n 124.709086,\n 48.920406\n ],\n [\n 124.808252,\n 49.020563\n ],\n [\n 124.807636,\n 49.108769\n ],\n [\n 124.906802,\n 49.183915\n ],\n [\n 125.117453,\n 49.126\n ],\n [\n 125.219699,\n 49.188999\n ],\n [\n 125.261583,\n 49.318656\n ],\n [\n 125.264047,\n 49.461585\n ],\n [\n 125.228323,\n 49.486857\n ],\n [\n 125.234482,\n 49.592077\n ],\n [\n 125.132236,\n 49.671909\n ],\n [\n 125.219699,\n 49.669199\n ],\n [\n 125.222779,\n 49.799137\n ],\n [\n 125.177815,\n 49.829637\n ],\n [\n 125.239409,\n 49.844687\n ],\n [\n 125.231402,\n 49.957606\n ],\n [\n 125.294228,\n 50.029151\n ],\n [\n 125.258504,\n 50.103659\n ],\n [\n 125.334264,\n 50.165023\n ],\n [\n 125.448829,\n 50.216354\n ],\n [\n 125.466075,\n 50.297452\n ],\n [\n 125.519662,\n 50.315795\n ],\n [\n 125.590495,\n 50.452378\n ],\n [\n 125.632379,\n 50.443996\n ],\n [\n 125.740784,\n 50.523184\n ],\n [\n 125.829479,\n 50.561589\n ],\n [\n 125.787595,\n 50.677373\n ],\n [\n 125.825784,\n 50.703906\n ],\n [\n 125.758646,\n 50.746706\n ],\n [\n 125.890457,\n 50.805729\n ],\n [\n 126.073391,\n 50.963514\n ],\n [\n 126.033971,\n 51.010971\n ],\n [\n 126.059225,\n 51.043711\n ],\n [\n 125.878138,\n 51.159431\n ],\n [\n 125.840566,\n 51.220555\n ],\n [\n 125.756798,\n 51.227675\n ],\n [\n 125.743248,\n 51.275984\n ],\n [\n 125.743248,\n 51.275984\n ],\n [\n 125.670567,\n 51.34555\n ],\n [\n 125.670567,\n 51.34555\n ],\n [\n 125.668103,\n 51.347419\n ],\n [\n 125.668103,\n 51.347419\n ],\n [\n 125.63977,\n 51.372451\n ],\n [\n 125.63977,\n 51.372451\n ],\n [\n 125.623756,\n 51.387762\n ],\n [\n 125.623756,\n 51.387762\n ],\n [\n 125.600966,\n 51.413518\n ],\n [\n 125.600966,\n 51.413518\n ],\n [\n 125.597886,\n 51.414638\n ],\n [\n 125.597886,\n 51.414638\n ],\n [\n 125.595422,\n 51.416877\n ],\n [\n 125.595422,\n 51.416877\n ],\n [\n 125.567089,\n 51.455668\n ],\n [\n 125.567089,\n 51.455668\n ],\n [\n 125.35151,\n 51.623876\n ],\n [\n 125.130388,\n 51.635389\n ],\n [\n 125.098975,\n 51.658408\n ],\n [\n 125.047236,\n 51.529801\n ],\n [\n 124.928976,\n 51.498523\n ],\n [\n 124.942527,\n 51.447465\n ],\n [\n 124.864302,\n 51.379547\n ],\n [\n 124.783614,\n 51.392243\n ],\n [\n 124.693687,\n 51.332842\n ],\n [\n 124.62655,\n 51.327608\n ],\n [\n 124.58713,\n 51.363486\n ],\n [\n 124.490427,\n 51.380294\n ],\n [\n 124.43684,\n 51.353772\n ],\n [\n 124.406659,\n 51.271867\n ],\n [\n 124.271769,\n 51.308162\n ],\n [\n 124.239124,\n 51.344429\n ],\n [\n 124.128255,\n 51.347419\n ],\n [\n 124.071588,\n 51.320878\n ],\n [\n 123.926227,\n 51.300681\n ],\n [\n 123.842459,\n 51.367595\n ],\n [\n 123.711264,\n 51.398216\n ],\n [\n 123.661989,\n 51.319008\n ],\n [\n 123.465504,\n 51.287212\n ],\n [\n 123.294273,\n 51.25427\n ],\n [\n 123.058984,\n 51.321999\n ],\n [\n 122.978296,\n 51.331346\n ],\n [\n 122.965977,\n 51.387015\n ],\n [\n 122.903768,\n 51.415384\n ],\n [\n 122.854492,\n 51.477659\n ],\n [\n 122.85634,\n 51.606786\n ],\n [\n 122.749167,\n 51.746661\n ],\n [\n 122.771957,\n 51.779619\n ],\n [\n 122.706051,\n 51.890166\n ],\n [\n 122.726377,\n 51.978704\n ],\n [\n 122.683877,\n 51.974649\n ],\n [\n 122.629059,\n 52.136529\n ],\n [\n 122.769493,\n 52.179843\n ],\n [\n 122.76087,\n 52.26671\n ],\n [\n 122.585943,\n 52.266344\n ],\n [\n 122.478153,\n 52.29636\n ],\n [\n 122.484313,\n 52.341711\n ],\n [\n 122.342031,\n 52.41403\n ],\n [\n 122.310618,\n 52.475299\n ],\n [\n 122.207756,\n 52.469103\n ],\n [\n 122.168952,\n 52.513549\n ],\n [\n 122.091344,\n 52.427167\n ],\n [\n 121.94783,\n 52.298555\n ],\n [\n 121.841272,\n 52.282818\n ],\n [\n 121.714389,\n 52.317944\n ],\n [\n 121.63986,\n 52.444311\n ],\n [\n 121.519136,\n 52.456709\n ],\n [\n 121.416274,\n 52.499346\n ],\n [\n 121.325731,\n 52.572498\n ],\n [\n 121.182217,\n 52.599399\n ],\n [\n 121.373158,\n 52.683268\n ],\n [\n 121.476636,\n 52.772043\n ],\n [\n 121.591201,\n 52.824499\n ],\n [\n 121.610295,\n 52.892416\n ],\n [\n 121.66265,\n 52.912626\n ],\n [\n 121.715621,\n 52.998054\n ],\n [\n 121.785838,\n 53.018575\n ],\n [\n 121.817867,\n 53.061744\n ],\n [\n 121.754425,\n 53.146519\n ],\n [\n 121.665114,\n 53.170556\n ],\n [\n 121.679896,\n 53.240437\n ],\n [\n 121.612143,\n 53.260484\n ],\n [\n 121.499426,\n 53.337008\n ],\n [\n 121.596128,\n 53.352368\n ],\n [\n 121.697758,\n 53.392705\n ],\n [\n 121.754425,\n 53.389494\n ],\n [\n 121.875765,\n 53.426587\n ],\n [\n 122.111054,\n 53.426944\n ],\n [\n 122.161561,\n 53.468635\n ],\n [\n 122.227466,\n 53.461868\n ],\n [\n 122.350038,\n 53.50566\n ],\n [\n 122.435038,\n 53.444766\n ],\n [\n 122.608117,\n 53.46543\n ],\n [\n 122.894528,\n 53.462936\n ],\n [\n 123.052209,\n 53.506727\n ],\n [\n 123.137209,\n 53.498186\n ],\n [\n 123.274563,\n 53.563269\n ],\n [\n 123.454417,\n 53.536608\n ],\n [\n 123.510468,\n 53.509218\n ],\n [\n 123.517243,\n 53.558293\n ],\n [\n 123.569598,\n 53.505304\n ],\n [\n 123.58746,\n 53.546919\n ],\n [\n 123.668764,\n 53.533763\n ],\n [\n 123.698329,\n 53.498542\n ],\n [\n 123.865249,\n 53.489644\n ],\n [\n 124.058038,\n 53.404121\n ],\n [\n 124.125791,\n 53.348082\n ],\n [\n 124.239124,\n 53.379501\n ],\n [\n 124.327819,\n 53.332006\n ],\n [\n 124.375863,\n 53.259053\n ],\n [\n 124.435609,\n 53.223962\n ],\n [\n 124.563108,\n 53.201389\n ],\n [\n 124.683832,\n 53.206406\n ],\n [\n 124.734339,\n 53.146519\n ],\n [\n 124.832889,\n 53.145083\n ],\n [\n 124.87231,\n 53.099123\n ],\n [\n 124.887708,\n 53.164458\n ],\n [\n 124.970244,\n 53.194221\n ],\n [\n 125.195062,\n 53.198522\n ],\n [\n 125.315786,\n 53.145083\n ],\n [\n 125.503647,\n 53.095171\n ],\n [\n 125.530749,\n 53.050956\n ],\n [\n 125.613901,\n 53.083313\n ],\n [\n 125.684118,\n 53.008136\n ],\n [\n 125.742632,\n 52.993733\n ],\n [\n 125.737704,\n 52.945087\n ],\n [\n 125.665023,\n 52.913348\n ],\n [\n 125.678574,\n 52.860999\n ],\n [\n 125.772197,\n 52.89783\n ],\n [\n 125.855349,\n 52.866418\n ],\n [\n 125.985312,\n 52.758648\n ],\n [\n 126.058609,\n 52.798098\n ],\n [\n 126.115275,\n 52.757924\n ],\n [\n 126.045058,\n 52.738366\n ],\n [\n 126.061688,\n 52.673473\n ],\n [\n 125.995783,\n 52.675287\n ],\n [\n 125.968682,\n 52.630279\n ],\n [\n 126.030891,\n 52.576135\n ],\n [\n 126.066616,\n 52.60376\n ],\n [\n 126.213209,\n 52.5252\n ],\n [\n 126.205202,\n 52.466187\n ],\n [\n 126.266796,\n 52.475664\n ],\n [\n 126.353644,\n 52.389207\n ],\n [\n 126.327774,\n 52.310628\n ],\n [\n 126.4331,\n 52.298555\n ],\n [\n 126.300673,\n 52.220915\n ],\n [\n 126.34502,\n 52.192315\n ],\n [\n 126.499005,\n 52.160394\n ],\n [\n 126.563679,\n 52.119266\n ],\n [\n 126.514404,\n 52.037264\n ],\n [\n 126.450962,\n 52.027693\n ],\n [\n 126.462665,\n 51.948473\n ],\n [\n 126.510092,\n 51.922281\n ],\n [\n 126.622809,\n 51.777397\n ],\n [\n 126.734294,\n 51.711454\n ],\n [\n 126.741069,\n 51.642073\n ],\n [\n 126.69549,\n 51.578536\n ],\n [\n 126.837156,\n 51.536128\n ],\n [\n 126.784185,\n 51.44821\n ],\n [\n 126.908605,\n 51.407174\n ],\n [\n 126.930163,\n 51.359376\n ],\n [\n 126.837156,\n 51.345177\n ],\n [\n 126.841468,\n 51.258763\n ],\n [\n 126.92154,\n 51.259512\n ],\n [\n 126.887047,\n 51.321999\n ],\n [\n 126.978822,\n 51.329477\n ],\n [\n 126.976358,\n 51.291702\n ],\n [\n 126.899982,\n 51.200689\n ],\n [\n 126.922772,\n 51.061764\n ],\n [\n 127.143894,\n 50.91035\n ],\n [\n 127.236285,\n 50.781524\n ],\n [\n 127.295415,\n 50.755035\n ],\n [\n 127.294799,\n 50.663721\n ],\n [\n 127.370559,\n 50.581349\n ],\n [\n 127.293567,\n 50.46571\n ],\n [\n 127.3644,\n 50.43828\n ],\n [\n 127.332371,\n 50.340623\n ],\n [\n 127.371791,\n 50.296688\n ],\n [\n 127.603385,\n 50.23932\n ],\n [\n 127.58737,\n 50.137802\n ],\n [\n 127.501755,\n 50.056817\n ],\n [\n 127.495595,\n 49.994545\n ],\n [\n 127.543638,\n 49.944131\n ],\n [\n 127.531936,\n 49.825777\n ],\n [\n 127.563964,\n 49.793343\n ],\n [\n 127.660051,\n 49.77905\n ],\n [\n 127.677913,\n 49.697846\n ],\n [\n 127.815268,\n 49.594017\n ],\n [\n 127.897804,\n 49.578889\n ],\n [\n 128.001281,\n 49.592465\n ],\n [\n 128.070882,\n 49.55677\n ],\n [\n 128.185447,\n 49.539301\n ],\n [\n 128.287077,\n 49.566473\n ],\n [\n 128.343128,\n 49.545125\n ],\n [\n 128.389939,\n 49.590138\n ],\n [\n 128.537764,\n 49.604487\n ],\n [\n 128.715155,\n 49.56492\n ],\n [\n 128.744104,\n 49.594792\n ],\n [\n 128.813089,\n 49.558323\n ],\n [\n 128.754575,\n 49.506676\n ],\n [\n 128.792147,\n 49.473251\n ],\n [\n 128.871604,\n 49.492298\n ],\n [\n 129.013886,\n 49.457307\n ],\n [\n 129.055769,\n 49.382188\n ],\n [\n 129.143849,\n 49.357253\n ],\n [\n 129.215298,\n 49.398935\n ],\n [\n 129.320623,\n 49.358422\n ],\n [\n 129.379138,\n 49.366995\n ],\n [\n 129.390224,\n 49.432799\n ],\n [\n 129.448739,\n 49.441359\n ],\n [\n 129.546057,\n 49.395041\n ],\n [\n 129.562687,\n 49.299541\n ],\n [\n 129.604571,\n 49.278858\n ],\n [\n 129.714209,\n 49.296029\n ],\n [\n 129.761636,\n 49.257384\n ],\n [\n 129.753629,\n 49.208547\n ],\n [\n 129.847867,\n 49.181177\n ],\n [\n 129.866962,\n 49.114252\n ],\n [\n 129.913157,\n 49.108377\n ],\n [\n 129.937179,\n 49.04057\n ],\n [\n 130.020946,\n 49.020955\n ],\n [\n 130.059135,\n 48.978954\n ],\n [\n 130.211272,\n 48.901137\n ],\n [\n 130.245148,\n 48.866514\n ],\n [\n 130.471198,\n 48.905464\n ],\n [\n 130.501995,\n 48.86612\n ],\n [\n 130.680617,\n 48.881074\n ],\n [\n 130.689856,\n 48.849586\n ],\n [\n 130.622103,\n 48.783792\n ],\n [\n 130.538335,\n 48.612004\n ],\n [\n 130.605473,\n 48.5942\n ],\n [\n 130.620871,\n 48.495964\n ],\n [\n 130.767465,\n 48.507858\n ],\n [\n 130.740363,\n 48.425339\n ],\n [\n 130.845073,\n 48.296533\n ],\n [\n 130.769313,\n 48.23121\n ],\n [\n 130.765617,\n 48.189344\n ],\n [\n 130.673842,\n 48.128278\n ],\n [\n 130.699711,\n 48.044344\n ],\n [\n 130.891269,\n 47.927006\n ],\n [\n 130.961486,\n 47.827882\n ],\n [\n 130.966413,\n 47.732996\n ],\n [\n 131.029855,\n 47.694752\n ],\n [\n 131.115471,\n 47.689919\n ],\n [\n 131.273767,\n 47.739032\n ],\n [\n 131.456085,\n 47.747079\n ],\n [\n 131.543548,\n 47.735813\n ],\n [\n 131.59036,\n 47.660912\n ],\n [\n 131.695685,\n 47.709248\n ],\n [\n 131.825649,\n 47.677432\n ],\n [\n 131.970394,\n 47.671388\n ],\n [\n 132.000575,\n 47.712066\n ],\n [\n 132.086191,\n 47.703208\n ],\n [\n 132.272205,\n 47.718507\n ],\n [\n 132.371987,\n 47.76518\n ],\n [\n 132.469305,\n 47.726154\n ],\n [\n 132.570319,\n 47.720922\n ],\n [\n 132.599268,\n 47.792521\n ],\n [\n 132.687348,\n 47.885293\n ],\n [\n 132.661478,\n 47.944643\n ],\n [\n 132.723072,\n 47.963076\n ],\n [\n 132.819159,\n 47.937028\n ],\n [\n 132.883216,\n 48.002325\n ],\n [\n 132.992238,\n 48.035142\n ],\n [\n 133.041513,\n 48.102313\n ],\n [\n 133.15423,\n 48.137063\n ],\n [\n 133.302055,\n 48.103112\n ],\n [\n 133.407997,\n 48.124684\n ],\n [\n 133.536728,\n 48.117494\n ],\n [\n 133.59709,\n 48.194928\n ],\n [\n 133.693177,\n 48.186951\n ],\n [\n 133.740604,\n 48.25472\n ],\n [\n 134.0689,\n 48.338311\n ],\n [\n 134.131109,\n 48.335527\n ],\n [\n 134.20379,\n 48.38244\n ],\n [\n 134.350384,\n 48.378466\n ],\n [\n 134.501905,\n 48.418986\n ],\n [\n 134.696542,\n 48.407072\n ],\n [\n 134.820961,\n 48.376081\n ],\n [\n 134.927519,\n 48.451537\n ],\n [\n 135.09567,\n 48.437646\n ],\n [\n 135.082736,\n 48.396346\n ],\n [\n 134.864077,\n 48.332345\n ],\n [\n 134.679295,\n 48.256314\n ],\n [\n 134.67252,\n 48.170593\n ],\n [\n 134.632484,\n 48.099516\n ],\n [\n 134.551796,\n 48.032742\n ],\n [\n 134.607846,\n 47.909362\n ],\n [\n 134.660201,\n 47.900538\n ],\n [\n 134.678679,\n 47.819446\n ],\n [\n 134.772918,\n 47.763572\n ],\n [\n 134.779694,\n 47.716091\n ],\n [\n 134.684223,\n 47.631889\n ],\n [\n 134.685455,\n 47.603253\n ],\n [\n 134.576434,\n 47.519273\n ],\n [\n 134.568426,\n 47.478445\n ],\n [\n 134.493898,\n 47.446894\n ],\n [\n 134.339297,\n 47.43961\n ],\n [\n 134.177305,\n 47.32658\n ],\n [\n 134.156979,\n 47.248656\n ],\n [\n 134.230276,\n 47.182411\n ],\n [\n 134.222268,\n 47.105496\n ],\n [\n 134.142812,\n 47.093277\n ],\n [\n 134.042414,\n 46.886761\n ],\n [\n 134.011001,\n 46.637971\n ],\n [\n 133.919842,\n 46.596052\n ],\n [\n 133.852089,\n 46.449903\n ],\n [\n 133.950023,\n 46.394634\n ],\n [\n 133.876726,\n 46.362438\n ],\n [\n 133.922922,\n 46.330635\n ],\n [\n 133.904444,\n 46.25084\n ],\n [\n 133.83977,\n 46.202825\n ],\n [\n 133.706111,\n 46.163056\n ],\n [\n 133.745531,\n 46.075547\n ],\n [\n 133.676546,\n 45.942982\n ],\n [\n 133.616184,\n 45.943398\n ],\n [\n 133.576148,\n 45.870957\n ],\n [\n 133.51209,\n 45.886785\n ],\n [\n 133.470822,\n 45.838035\n ],\n [\n 133.484373,\n 45.738737\n ],\n [\n 133.445569,\n 45.70532\n ],\n [\n 133.491764,\n 45.672301\n ],\n [\n 133.371656,\n 45.576895\n ],\n [\n 133.21028,\n 45.516975\n ],\n [\n 133.141295,\n 45.427605\n ],\n [\n 133.095715,\n 45.246753\n ],\n [\n 133.138215,\n 45.178469\n ],\n [\n 133.103107,\n 45.107147\n ],\n [\n 132.945426,\n 45.020512\n ],\n [\n 132.867202,\n 45.061944\n ],\n [\n 132.394161,\n 45.163706\n ],\n [\n 132.025829,\n 45.250545\n ],\n [\n 131.93159,\n 45.288442\n ],\n [\n 131.917423,\n 45.339354\n ],\n [\n 131.82996,\n 45.31159\n ],\n [\n 131.79362,\n 45.211778\n ],\n [\n 131.721555,\n 45.234536\n ],\n [\n 131.650722,\n 45.159909\n ],\n [\n 131.695685,\n 45.132056\n ],\n [\n 131.632244,\n 45.074621\n ],\n [\n 131.484418,\n 44.995553\n ],\n [\n 131.464708,\n 44.963388\n ],\n [\n 131.355687,\n 44.98963\n ],\n [\n 131.274999,\n 44.919766\n ],\n [\n 131.16105,\n 44.948145\n ],\n [\n 131.090217,\n 44.924426\n ],\n [\n 131.07913,\n 44.881623\n ],\n [\n 130.967029,\n 44.854059\n ],\n [\n 131.016304,\n 44.789551\n ],\n [\n 131.064348,\n 44.787003\n ],\n [\n 131.111775,\n 44.71009\n ],\n [\n 131.310723,\n 44.046392\n ],\n [\n 131.263912,\n 44.030047\n ],\n [\n 131.267608,\n 43.938778\n ],\n [\n 131.211557,\n 43.826221\n ],\n [\n 131.244818,\n 43.604369\n ],\n [\n 131.20047,\n 43.531971\n ],\n [\n 131.304564,\n 43.502033\n ],\n [\n 131.294093,\n 43.469909\n ],\n [\n 131.134565,\n 43.428643\n ],\n [\n 131.134565,\n 43.428643\n ],\n [\n 131.026775,\n 43.508542\n ],\n [\n 130.907283,\n 43.434291\n ],\n [\n 130.841378,\n 43.454274\n ],\n [\n 130.823515,\n 43.502901\n ],\n [\n 130.488444,\n 43.655905\n ],\n [\n 130.4133,\n 43.652009\n ],\n [\n 130.423771,\n 43.742853\n ],\n [\n 130.380039,\n 43.783904\n ],\n [\n 130.383119,\n 43.906025\n ],\n [\n 130.338155,\n 43.949979\n ],\n [\n 130.338155,\n 43.949979\n ],\n [\n 130.353554,\n 44.050262\n ],\n [\n 130.260547,\n 43.948256\n ],\n [\n 130.189098,\n 43.940501\n ],\n [\n 130.079461,\n 43.835285\n ],\n [\n 130.079461,\n 43.835285\n ],\n [\n 130.027106,\n 43.851684\n ],\n [\n 130.017251,\n 43.962039\n ],\n [\n 129.98091,\n 44.014128\n ],\n [\n 129.880512,\n 44.000357\n ],\n [\n 129.880512,\n 44.000357\n ],\n [\n 129.869425,\n 44.005521\n ],\n [\n 129.869425,\n 44.005521\n ],\n [\n 129.784426,\n 43.964623\n ],\n [\n 129.742542,\n 43.875841\n ],\n [\n 129.467833,\n 43.874548\n ],\n [\n 129.406855,\n 43.819314\n ],\n [\n 129.211602,\n 43.784336\n ],\n [\n 129.230696,\n 43.59527\n ],\n [\n 129.014501,\n 43.523295\n ],\n [\n 128.949212,\n 43.55409\n ],\n [\n 128.877763,\n 43.540213\n ],\n [\n 128.719467,\n 43.816724\n ],\n [\n 128.760734,\n 43.857724\n ],\n [\n 128.723778,\n 43.894816\n ],\n [\n 128.636315,\n 43.891366\n ],\n [\n 128.644938,\n 43.936193\n ],\n [\n 128.584576,\n 43.990887\n ],\n [\n 128.574721,\n 44.047682\n ],\n [\n 128.450301,\n 44.203157\n ],\n [\n 128.481714,\n 44.375332\n ],\n [\n 128.46262,\n 44.433894\n ],\n [\n 128.373309,\n 44.51416\n ],\n [\n 128.211317,\n 44.431757\n ],\n [\n 128.190375,\n 44.367206\n ],\n [\n 128.049941,\n 44.349239\n ],\n [\n 128.101679,\n 44.290593\n ],\n [\n 128.089977,\n 44.132342\n ],\n [\n 128.059796,\n 44.110007\n ],\n [\n 127.862079,\n 44.063162\n ],\n [\n 127.729036,\n 44.098836\n ],\n [\n 127.724109,\n 44.196723\n ],\n [\n 127.681609,\n 44.167116\n ],\n [\n 127.591066,\n 44.227601\n ],\n [\n 127.623095,\n 44.277743\n ],\n [\n 127.483892,\n 44.401842\n ],\n [\n 127.483892,\n 44.401842\n ],\n [\n 127.50853,\n 44.437312\n ],\n [\n 127.463566,\n 44.484713\n ],\n [\n 127.536247,\n 44.522266\n ],\n [\n 127.557189,\n 44.575566\n ],\n [\n 127.392733,\n 44.632223\n ],\n [\n 127.182082,\n 44.644144\n ],\n [\n 127.094003,\n 44.615189\n ],\n [\n 127.049039,\n 44.567041\n ],\n [\n 127.037336,\n 44.72157\n ],\n [\n 126.984366,\n 44.823936\n ],\n [\n 127.021938,\n 44.899002\n ],\n [\n 127.085995,\n 44.944757\n ],\n [\n 126.968351,\n 45.074621\n ],\n [\n 126.96404,\n 45.132056\n ],\n [\n 126.831613,\n 45.146406\n ],\n [\n 126.567375,\n 45.252651\n ],\n [\n 126.428172,\n 45.2358\n ],\n [\n 126.321615,\n 45.178891\n ],\n [\n 126.166398,\n 45.133323\n ],\n [\n 125.915095,\n 45.196602\n ],\n [\n 125.760494,\n 45.291389\n ],\n [\n 125.697052,\n 45.349447\n ],\n [\n 125.716146,\n 45.421725\n ],\n [\n 125.687813,\n 45.51404\n ],\n [\n 125.628067,\n 45.522006\n ],\n [\n 125.497488,\n 45.469161\n ],\n [\n 125.424807,\n 45.485523\n ],\n [\n 125.398322,\n 45.416686\n ],\n [\n 125.347815,\n 45.395262\n ],\n [\n 125.248649,\n 45.417526\n ],\n [\n 125.06941,\n 45.384757\n ],\n [\n 125.025678,\n 45.493492\n ],\n [\n 124.961005,\n 45.49517\n ],\n [\n 124.923433,\n 45.541286\n ],\n [\n 124.886476,\n 45.442719\n ],\n [\n 124.625318,\n 45.437262\n ],\n [\n 124.544014,\n 45.412066\n ],\n [\n 124.480572,\n 45.456151\n ],\n [\n 124.398652,\n 45.44062\n ],\n [\n 124.354305,\n 45.546734\n ],\n [\n 124.287783,\n 45.539191\n ],\n [\n 124.273001,\n 45.584014\n ],\n [\n 124.129487,\n 45.637589\n ],\n [\n 124.13811,\n 45.68735\n ],\n [\n 124.009379,\n 45.78215\n ],\n [\n 124.064813,\n 45.797586\n ],\n [\n 124.061118,\n 45.886369\n ],\n [\n 123.996444,\n 45.907189\n ],\n [\n 123.970574,\n 45.971267\n ],\n [\n 124.040176,\n 46.019484\n ],\n [\n 123.99398,\n 46.101275\n ],\n [\n 123.982893,\n 46.22601\n ],\n [\n 123.896046,\n 46.303774\n ],\n [\n 123.779633,\n 46.264078\n ],\n [\n 123.610866,\n 46.252909\n ],\n [\n 123.565902,\n 46.22601\n ],\n [\n 123.498765,\n 46.259528\n ],\n [\n 123.373113,\n 46.223112\n ],\n [\n 123.319527,\n 46.253736\n ]\n ]\n ],\n [\n [\n [\n 124.43992,\n 50.388713\n ],\n [\n 124.36416,\n 50.360857\n ],\n [\n 124.368471,\n 50.258068\n ],\n [\n 124.32474,\n 50.178436\n ],\n [\n 124.278544,\n 50.231284\n ],\n [\n 124.189233,\n 50.216737\n ],\n [\n 124.103001,\n 50.238555\n ],\n [\n 124.061733,\n 50.199122\n ],\n [\n 124.007531,\n 50.219417\n ],\n [\n 123.953944,\n 50.186865\n ],\n [\n 123.878799,\n 50.208696\n ],\n [\n 123.870792,\n 50.270307\n ],\n [\n 123.777785,\n 50.344441\n ],\n [\n 123.800575,\n 50.455806\n ],\n [\n 123.920067,\n 50.37307\n ],\n [\n 124.005067,\n 50.434469\n ],\n [\n 123.983509,\n 50.510249\n ],\n [\n 124.076516,\n 50.564249\n ],\n [\n 124.289015,\n 50.553226\n ],\n [\n 124.322892,\n 50.532693\n ],\n [\n 124.43992,\n 50.539919\n ],\n [\n 124.43992,\n 50.388713\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 310000,\n \"name\": \"上海市\",\n \"center\": [\n 121.472644,\n 31.231706\n ],\n \"centroid\": [\n 121.438732,\n 31.072508\n ],\n \"childrenNum\": 16,\n \"level\": \"province\",\n \"subFeatureIndex\": 8,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 121.970004,\n 30.789217\n ],\n [\n 121.943518,\n 30.77688\n ],\n [\n 121.904714,\n 30.814399\n ],\n [\n 121.601056,\n 30.805149\n ],\n [\n 121.426129,\n 30.730089\n ],\n [\n 121.362071,\n 30.679673\n ],\n [\n 121.274608,\n 30.677615\n ],\n [\n 121.217942,\n 30.785105\n ],\n [\n 121.123087,\n 30.778936\n ],\n [\n 121.097218,\n 30.85704\n ],\n [\n 120.989428,\n 30.833924\n ],\n [\n 120.991892,\n 31.00793\n ],\n [\n 120.901349,\n 31.017673\n ],\n [\n 120.881023,\n 31.134513\n ],\n [\n 121.076892,\n 31.158581\n ],\n [\n 121.063341,\n 31.268088\n ],\n [\n 121.150188,\n 31.275247\n ],\n [\n 121.106457,\n 31.364697\n ],\n [\n 121.173594,\n 31.448956\n ],\n [\n 121.25613,\n 31.478047\n ],\n [\n 121.25613,\n 31.478047\n ],\n [\n 121.302325,\n 31.498966\n ],\n [\n 121.302325,\n 31.498966\n ],\n [\n 121.343593,\n 31.512229\n ],\n [\n 121.520984,\n 31.394835\n ],\n [\n 121.713773,\n 31.308992\n ],\n [\n 121.946598,\n 31.065861\n ],\n [\n 121.990945,\n 30.968434\n ],\n [\n 121.970004,\n 30.789217\n ]\n ]\n ],\n [\n [\n [\n 121.371926,\n 31.553028\n ],\n [\n 121.145261,\n 31.753699\n ],\n [\n 121.200079,\n 31.835066\n ],\n [\n 121.323267,\n 31.86861\n ],\n [\n 121.43352,\n 31.768452\n ],\n [\n 121.715005,\n 31.673788\n ],\n [\n 121.974931,\n 31.617249\n ],\n [\n 121.995873,\n 31.493354\n ],\n [\n 121.890547,\n 31.428537\n ],\n [\n 121.819098,\n 31.438237\n ],\n [\n 121.547469,\n 31.531101\n ],\n [\n 121.434136,\n 31.59024\n ],\n [\n 121.371926,\n 31.553028\n ]\n ]\n ],\n [\n [\n [\n 121.74149,\n 31.345792\n ],\n [\n 121.509897,\n 31.482639\n ],\n [\n 121.742106,\n 31.407091\n ],\n [\n 121.74149,\n 31.345792\n ]\n ]\n ],\n [\n [\n [\n 121.844352,\n 31.294678\n ],\n [\n 121.792613,\n 31.377468\n ],\n [\n 121.914569,\n 31.343236\n ],\n [\n 121.844352,\n 31.294678\n ]\n ]\n ],\n [\n [\n [\n 121.943518,\n 31.215397\n ],\n [\n 122.008808,\n 31.221026\n ],\n [\n 121.995873,\n 31.160629\n ],\n [\n 121.943518,\n 31.215397\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 320000,\n \"name\": \"江苏省\",\n \"center\": [\n 118.767413,\n 32.041544\n ],\n \"centroid\": [\n 119.48196,\n 32.985864\n ],\n \"childrenNum\": 13,\n \"level\": \"province\",\n \"subFeatureIndex\": 9,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 121.974931,\n 31.617249\n ],\n [\n 121.715005,\n 31.673788\n ],\n [\n 121.43352,\n 31.768452\n ],\n [\n 121.323267,\n 31.86861\n ],\n [\n 121.200079,\n 31.835066\n ],\n [\n 121.145261,\n 31.753699\n ],\n [\n 121.371926,\n 31.553028\n ],\n [\n 121.343593,\n 31.512229\n ],\n [\n 121.302325,\n 31.498966\n ],\n [\n 121.302325,\n 31.498966\n ],\n [\n 121.25613,\n 31.478047\n ],\n [\n 121.25613,\n 31.478047\n ],\n [\n 121.173594,\n 31.448956\n ],\n [\n 121.106457,\n 31.364697\n ],\n [\n 121.150188,\n 31.275247\n ],\n [\n 121.063341,\n 31.268088\n ],\n [\n 121.076892,\n 31.158581\n ],\n [\n 120.881023,\n 31.134513\n ],\n [\n 120.901349,\n 31.017673\n ],\n [\n 120.698089,\n 30.970999\n ],\n [\n 120.713487,\n 30.885286\n ],\n [\n 120.589068,\n 30.854472\n ],\n [\n 120.504684,\n 30.757858\n ],\n [\n 120.423996,\n 30.900689\n ],\n [\n 120.35809,\n 30.88734\n ],\n [\n 120.371025,\n 30.948424\n ],\n [\n 120.226279,\n 30.926356\n ],\n [\n 120.13512,\n 30.941752\n ],\n [\n 120.001461,\n 31.026902\n ],\n [\n 119.919542,\n 31.170868\n ],\n [\n 119.678093,\n 31.168308\n ],\n [\n 119.623891,\n 31.130416\n ],\n [\n 119.460051,\n 31.156533\n ],\n [\n 119.388602,\n 31.194415\n ],\n [\n 119.388602,\n 31.194415\n ],\n [\n 119.379979,\n 31.269622\n ],\n [\n 119.267878,\n 31.250698\n ],\n [\n 119.199508,\n 31.293655\n ],\n [\n 119.075089,\n 31.232282\n ],\n [\n 118.781286,\n 31.239956\n ],\n [\n 118.728931,\n 31.281384\n ],\n [\n 118.745561,\n 31.37287\n ],\n [\n 118.853967,\n 31.39841\n ],\n [\n 118.876756,\n 31.532631\n ],\n [\n 118.873061,\n 31.53569\n ],\n [\n 118.858278,\n 31.624382\n ],\n [\n 118.804691,\n 31.618268\n ],\n [\n 118.77451,\n 31.682444\n ],\n [\n 118.736938,\n 31.634061\n ],\n [\n 118.643931,\n 31.65138\n ],\n [\n 118.697518,\n 31.709935\n ],\n [\n 118.638388,\n 31.759295\n ],\n [\n 118.552772,\n 31.729275\n ],\n [\n 118.481939,\n 31.778117\n ],\n [\n 118.504729,\n 31.841674\n ],\n [\n 118.363679,\n 31.930581\n ],\n [\n 118.400019,\n 32.077724\n ],\n [\n 118.499801,\n 32.1203\n ],\n [\n 118.522591,\n 32.188178\n ],\n [\n 118.642083,\n 32.208937\n ],\n [\n 118.69567,\n 32.31721\n ],\n [\n 118.69259,\n 32.463224\n ],\n [\n 118.592192,\n 32.481396\n ],\n [\n 118.563859,\n 32.56363\n ],\n [\n 118.719076,\n 32.614042\n ],\n [\n 118.719076,\n 32.614042\n ],\n [\n 118.92172,\n 32.557074\n ],\n [\n 118.922336,\n 32.557074\n ],\n [\n 118.92172,\n 32.557074\n ],\n [\n 118.922336,\n 32.557074\n ],\n [\n 118.978386,\n 32.504106\n ],\n [\n 119.041212,\n 32.515207\n ],\n [\n 119.084944,\n 32.452622\n ],\n [\n 119.22045,\n 32.57674\n ],\n [\n 119.184726,\n 32.825465\n ],\n [\n 119.104038,\n 32.82647\n ],\n [\n 118.995017,\n 32.958604\n ],\n [\n 118.849039,\n 32.956596\n ],\n [\n 118.811467,\n 32.854622\n ],\n [\n 118.74125,\n 32.850601\n ],\n [\n 118.756648,\n 32.737433\n ],\n [\n 118.707373,\n 32.720319\n ],\n [\n 118.375382,\n 32.718809\n ],\n [\n 118.250346,\n 32.84859\n ],\n [\n 118.2331,\n 32.914414\n ],\n [\n 118.293462,\n 32.947056\n ],\n [\n 118.244803,\n 32.998256\n ],\n [\n 118.221397,\n 33.182228\n ],\n [\n 118.038463,\n 33.134642\n ],\n [\n 117.939297,\n 33.262813\n ],\n [\n 117.971941,\n 33.277821\n ],\n [\n 118.050782,\n 33.492148\n ],\n [\n 118.108064,\n 33.475181\n ],\n [\n 118.112376,\n 33.617302\n ],\n [\n 118.16781,\n 33.66313\n ],\n [\n 118.116071,\n 33.767645\n ],\n [\n 117.901724,\n 33.719883\n ],\n [\n 117.805638,\n 33.736304\n ],\n [\n 117.752667,\n 33.711422\n ],\n [\n 117.758826,\n 33.885445\n ],\n [\n 117.715095,\n 33.879485\n ],\n [\n 117.629479,\n 34.028872\n ],\n [\n 117.575892,\n 33.982744\n ],\n [\n 117.514914,\n 34.061097\n ],\n [\n 117.410205,\n 34.026888\n ],\n [\n 117.352922,\n 34.089842\n ],\n [\n 117.192778,\n 34.068532\n ],\n [\n 117.025243,\n 34.167106\n ],\n [\n 117.04988,\n 34.242321\n ],\n [\n 116.971656,\n 34.279409\n ],\n [\n 116.969192,\n 34.387613\n ],\n [\n 116.828142,\n 34.389094\n ],\n [\n 116.774555,\n 34.452764\n ],\n [\n 116.574991,\n 34.488773\n ],\n [\n 116.595933,\n 34.510469\n ],\n [\n 116.491839,\n 34.57109\n ],\n [\n 116.429629,\n 34.652834\n ],\n [\n 116.374195,\n 34.640036\n ],\n [\n 116.408071,\n 34.85095\n ],\n [\n 116.445028,\n 34.89562\n ],\n [\n 116.677853,\n 34.939285\n ],\n [\n 116.821983,\n 34.929475\n ],\n [\n 116.966728,\n 34.875497\n ],\n [\n 117.000605,\n 34.793482\n ],\n [\n 117.088069,\n 34.702039\n ],\n [\n 117.07575,\n 34.637575\n ],\n [\n 117.137344,\n 34.633144\n ],\n [\n 117.175532,\n 34.47003\n ],\n [\n 117.242669,\n 34.445856\n ],\n [\n 117.301184,\n 34.557294\n ],\n [\n 117.301184,\n 34.557294\n ],\n [\n 117.322125,\n 34.566656\n ],\n [\n 117.322125,\n 34.566656\n ],\n [\n 117.32151,\n 34.566656\n ],\n [\n 117.32151,\n 34.566656\n ],\n [\n 117.322125,\n 34.574046\n ],\n [\n 117.322125,\n 34.574046\n ],\n [\n 117.402813,\n 34.569612\n ],\n [\n 117.465023,\n 34.484827\n ],\n [\n 117.592523,\n 34.462631\n ],\n [\n 117.684298,\n 34.547439\n ],\n [\n 117.801942,\n 34.51885\n ],\n [\n 117.793935,\n 34.65185\n ],\n [\n 117.902956,\n 34.644467\n ],\n [\n 117.951615,\n 34.678424\n ],\n [\n 118.084042,\n 34.655788\n ],\n [\n 118.079115,\n 34.569612\n ],\n [\n 118.185056,\n 34.543989\n ],\n [\n 118.132702,\n 34.483348\n ],\n [\n 118.177665,\n 34.453257\n ],\n [\n 118.179513,\n 34.379218\n ],\n [\n 118.290382,\n 34.424637\n ],\n [\n 118.404947,\n 34.427598\n ],\n [\n 118.440671,\n 34.527724\n ],\n [\n 118.424657,\n 34.595228\n ],\n [\n 118.460997,\n 34.65628\n ],\n [\n 118.601431,\n 34.714336\n ],\n [\n 118.690127,\n 34.678424\n ],\n [\n 118.783749,\n 34.723188\n ],\n [\n 118.719076,\n 34.745315\n ],\n [\n 118.772047,\n 34.794464\n ],\n [\n 118.860742,\n 34.94419\n ],\n [\n 118.865053,\n 35.029974\n ],\n [\n 118.928495,\n 35.051039\n ],\n [\n 119.114509,\n 35.054958\n ],\n [\n 119.137915,\n 35.09609\n ],\n [\n 119.286972,\n 35.11518\n ],\n [\n 119.306066,\n 35.076506\n ],\n [\n 119.238929,\n 35.04908\n ],\n [\n 119.202588,\n 34.890222\n ],\n [\n 119.238313,\n 34.799378\n ],\n [\n 119.378747,\n 34.764487\n ],\n [\n 119.459435,\n 34.770876\n ],\n [\n 119.50871,\n 34.729089\n ],\n [\n 119.465594,\n 34.673012\n ],\n [\n 119.582623,\n 34.598676\n ],\n [\n 119.781571,\n 34.515892\n ],\n [\n 119.811752,\n 34.48532\n ],\n [\n 119.962657,\n 34.458684\n ],\n [\n 120.311895,\n 34.307091\n ],\n [\n 120.367329,\n 34.091328\n ],\n [\n 120.583524,\n 33.668608\n ],\n [\n 120.651277,\n 33.575937\n ],\n [\n 120.741205,\n 33.337826\n ],\n [\n 120.821893,\n 33.298327\n ],\n [\n 120.90566,\n 33.030366\n ],\n [\n 120.929682,\n 32.876232\n ],\n [\n 120.974646,\n 32.874724\n ],\n [\n 120.966638,\n 32.770141\n ],\n [\n 120.900733,\n 32.72334\n ],\n [\n 120.916131,\n 32.642261\n ],\n [\n 121.153268,\n 32.529333\n ],\n [\n 121.352216,\n 32.47433\n ],\n [\n 121.425513,\n 32.430909\n ],\n [\n 121.472941,\n 32.138034\n ],\n [\n 121.524063,\n 32.137528\n ],\n [\n 121.759352,\n 32.059471\n ],\n [\n 121.856055,\n 31.95546\n ],\n [\n 121.970004,\n 31.719096\n ],\n [\n 121.974931,\n 31.617249\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 330000,\n \"name\": \"浙江省\",\n \"center\": [\n 120.153576,\n 30.287459\n ],\n \"centroid\": [\n 120.109522,\n 29.181876\n ],\n \"childrenNum\": 11,\n \"level\": \"province\",\n \"subFeatureIndex\": 10,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 120.461568,\n 27.14259\n ],\n [\n 120.401206,\n 27.211253\n ],\n [\n 120.430155,\n 27.258601\n ],\n [\n 120.34146,\n 27.39946\n ],\n [\n 120.26262,\n 27.432921\n ],\n [\n 120.13512,\n 27.420175\n ],\n [\n 120.052584,\n 27.338886\n ],\n [\n 120.007005,\n 27.376084\n ],\n [\n 119.843165,\n 27.300611\n ],\n [\n 119.770484,\n 27.305928\n ],\n [\n 119.685485,\n 27.438762\n ],\n [\n 119.70889,\n 27.514141\n ],\n [\n 119.630666,\n 27.582574\n ],\n [\n 119.644217,\n 27.663684\n ],\n [\n 119.501319,\n 27.649905\n ],\n [\n 119.474833,\n 27.539079\n ],\n [\n 119.376899,\n 27.534835\n ],\n [\n 119.267878,\n 27.421237\n ],\n [\n 119.194581,\n 27.418582\n ],\n [\n 118.983314,\n 27.498751\n ],\n [\n 118.903858,\n 27.462125\n ],\n [\n 118.869365,\n 27.54014\n ],\n [\n 118.913713,\n 27.61651\n ],\n [\n 118.818242,\n 27.916697\n ],\n [\n 118.730163,\n 27.970611\n ],\n [\n 118.719076,\n 28.063576\n ],\n [\n 118.802228,\n 28.117416\n ],\n [\n 118.771431,\n 28.188634\n ],\n [\n 118.802228,\n 28.240303\n ],\n [\n 118.700598,\n 28.310912\n ],\n [\n 118.674728,\n 28.271398\n ],\n [\n 118.587881,\n 28.28299\n ],\n [\n 118.444367,\n 28.25348\n ],\n [\n 118.433896,\n 28.288786\n ],\n [\n 118.486867,\n 28.328821\n ],\n [\n 118.432048,\n 28.402003\n ],\n [\n 118.472084,\n 28.482497\n ],\n [\n 118.426505,\n 28.532447\n ],\n [\n 118.425273,\n 28.537177\n ],\n [\n 118.426505,\n 28.532447\n ],\n [\n 118.425273,\n 28.537177\n ],\n [\n 118.421577,\n 28.540331\n ],\n [\n 118.421577,\n 28.541908\n ],\n [\n 118.423425,\n 28.587626\n ],\n [\n 118.423425,\n 28.587626\n ],\n [\n 118.431432,\n 28.679528\n ],\n [\n 118.379077,\n 28.785509\n ],\n [\n 118.379077,\n 28.785509\n ],\n [\n 118.306396,\n 28.823782\n ],\n [\n 118.270056,\n 28.918619\n ],\n [\n 118.111144,\n 28.997671\n ],\n [\n 118.111144,\n 28.997671\n ],\n [\n 118.037847,\n 29.097054\n ],\n [\n 118.027992,\n 29.168132\n ],\n [\n 118.077883,\n 29.290836\n ],\n [\n 118.136397,\n 29.284052\n ],\n [\n 118.20723,\n 29.346135\n ],\n [\n 118.193064,\n 29.395149\n ],\n [\n 118.316252,\n 29.422774\n ],\n [\n 118.310708,\n 29.49623\n ],\n [\n 118.496106,\n 29.519662\n ],\n [\n 118.500417,\n 29.575877\n ],\n [\n 118.573714,\n 29.638302\n ],\n [\n 118.644547,\n 29.641942\n ],\n [\n 118.744945,\n 29.738621\n ],\n [\n 118.755416,\n 29.845586\n ],\n [\n 118.894619,\n 29.93792\n ],\n [\n 118.902626,\n 30.029133\n ],\n [\n 118.847807,\n 30.163208\n ],\n [\n 118.929727,\n 30.202515\n ],\n [\n 118.880452,\n 30.31518\n ],\n [\n 118.954365,\n 30.360106\n ],\n [\n 119.06277,\n 30.304849\n ],\n [\n 119.201356,\n 30.290901\n ],\n [\n 119.246936,\n 30.341002\n ],\n [\n 119.36766,\n 30.384885\n ],\n [\n 119.326392,\n 30.532906\n ],\n [\n 119.237081,\n 30.54682\n ],\n [\n 119.238929,\n 30.60915\n ],\n [\n 119.312225,\n 30.620993\n ],\n [\n 119.386754,\n 30.685333\n ],\n [\n 119.416935,\n 30.642101\n ],\n [\n 119.482841,\n 30.70437\n ],\n [\n 119.479761,\n 30.772253\n ],\n [\n 119.575847,\n 30.829814\n ],\n [\n 119.585702,\n 30.976642\n ],\n [\n 119.633746,\n 31.019724\n ],\n [\n 119.623891,\n 31.130416\n ],\n [\n 119.678093,\n 31.168308\n ],\n [\n 119.919542,\n 31.170868\n ],\n [\n 120.001461,\n 31.026902\n ],\n [\n 120.13512,\n 30.941752\n ],\n [\n 120.226279,\n 30.926356\n ],\n [\n 120.371025,\n 30.948424\n ],\n [\n 120.35809,\n 30.88734\n ],\n [\n 120.423996,\n 30.900689\n ],\n [\n 120.504684,\n 30.757858\n ],\n [\n 120.589068,\n 30.854472\n ],\n [\n 120.713487,\n 30.885286\n ],\n [\n 120.698089,\n 30.970999\n ],\n [\n 120.901349,\n 31.017673\n ],\n [\n 120.991892,\n 31.00793\n ],\n [\n 120.989428,\n 30.833924\n ],\n [\n 121.097218,\n 30.85704\n ],\n [\n 121.123087,\n 30.778936\n ],\n [\n 121.217942,\n 30.785105\n ],\n [\n 121.274608,\n 30.677615\n ],\n [\n 121.058413,\n 30.563823\n ],\n [\n 121.225333,\n 30.404496\n ],\n [\n 121.328195,\n 30.397271\n ],\n [\n 121.497578,\n 30.258864\n ],\n [\n 121.632469,\n 30.072119\n ],\n [\n 121.721164,\n 29.992865\n ],\n [\n 121.78399,\n 29.993383\n ],\n [\n 121.919497,\n 29.920808\n ],\n [\n 121.968156,\n 29.956584\n ],\n [\n 122.00696,\n 29.891764\n ],\n [\n 122.140003,\n 29.901619\n ],\n [\n 122.10243,\n 29.859597\n ],\n [\n 121.997721,\n 29.759919\n ],\n [\n 121.937359,\n 29.748491\n ],\n [\n 121.833265,\n 29.653382\n ],\n [\n 121.966308,\n 29.635702\n ],\n [\n 122.000185,\n 29.582642\n ],\n [\n 121.968772,\n 29.515497\n ],\n [\n 121.993409,\n 29.451954\n ],\n [\n 121.937975,\n 29.384201\n ],\n [\n 121.986634,\n 29.15507\n ],\n [\n 121.966308,\n 29.053128\n ],\n [\n 121.884388,\n 29.105419\n ],\n [\n 121.780294,\n 29.109601\n ],\n [\n 121.767975,\n 29.166565\n ],\n [\n 121.660186,\n 29.118487\n ],\n [\n 121.774751,\n 28.864138\n ],\n [\n 121.668193,\n 28.873046\n ],\n [\n 121.704534,\n 28.816443\n ],\n [\n 121.689135,\n 28.719415\n ],\n [\n 121.540694,\n 28.655379\n ],\n [\n 121.634317,\n 28.56293\n ],\n [\n 121.687287,\n 28.40095\n ],\n [\n 121.627541,\n 28.251899\n ],\n [\n 121.499426,\n 28.306171\n ],\n [\n 121.373774,\n 28.133246\n ],\n [\n 121.288159,\n 28.144854\n ],\n [\n 121.261057,\n 28.034533\n ],\n [\n 121.140949,\n 28.031364\n ],\n [\n 121.108304,\n 28.13905\n ],\n [\n 121.059029,\n 28.096305\n ],\n [\n 120.991892,\n 27.95\n ],\n [\n 121.05595,\n 27.900306\n ],\n [\n 121.162507,\n 27.90718\n ],\n [\n 121.152652,\n 27.810376\n ],\n [\n 121.153268,\n 27.809847\n ],\n [\n 121.149572,\n 27.801908\n ],\n [\n 121.149572,\n 27.801379\n ],\n [\n 121.149572,\n 27.80085\n ],\n [\n 121.13479,\n 27.787088\n ],\n [\n 121.134174,\n 27.787088\n ],\n [\n 121.152036,\n 27.815139\n ],\n [\n 121.027616,\n 27.832601\n ],\n [\n 120.942001,\n 27.896605\n ],\n [\n 120.797871,\n 27.779677\n ],\n [\n 120.634647,\n 27.577271\n ],\n [\n 120.703016,\n 27.478581\n ],\n [\n 120.673451,\n 27.369708\n ],\n [\n 120.572437,\n 27.313903\n ],\n [\n 120.544104,\n 27.154303\n ],\n [\n 120.461568,\n 27.14259\n ]\n ]\n ],\n [\n [\n [\n 122.301379,\n 29.942068\n ],\n [\n 122.163408,\n 29.988201\n ],\n [\n 122.038989,\n 29.989756\n ],\n [\n 121.991561,\n 30.075743\n ],\n [\n 121.990945,\n 30.076261\n ],\n [\n 121.952757,\n 30.183898\n ],\n [\n 122.152938,\n 30.113015\n ],\n [\n 122.293988,\n 30.100075\n ],\n [\n 122.347574,\n 30.014109\n ],\n [\n 122.301379,\n 29.942068\n ]\n ]\n ],\n [\n [\n [\n 122.100583,\n 30.304333\n ],\n [\n 122.228082,\n 30.329641\n ],\n [\n 122.22993,\n 30.232503\n ],\n [\n 122.058083,\n 30.291934\n ],\n [\n 122.100583,\n 30.304333\n ]\n ]\n ],\n [\n [\n [\n 122.317393,\n 30.249561\n ],\n [\n 122.40732,\n 30.272817\n ],\n [\n 122.397465,\n 30.225266\n ],\n [\n 122.317393,\n 30.249561\n ]\n ]\n ],\n [\n [\n [\n 122.435038,\n 29.906287\n ],\n [\n 122.391922,\n 29.831573\n ],\n [\n 122.327248,\n 29.922883\n ],\n [\n 122.411632,\n 29.951918\n ],\n [\n 122.435038,\n 29.906287\n ]\n ]\n ],\n [\n [\n [\n 122.353734,\n 30.464339\n ],\n [\n 122.423335,\n 30.408624\n ],\n [\n 122.281669,\n 30.418944\n ],\n [\n 122.277973,\n 30.471558\n ],\n [\n 122.353734,\n 30.464339\n ]\n ]\n ],\n [\n [\n [\n 122.303843,\n 29.832611\n ],\n [\n 122.310002,\n 29.766671\n ],\n [\n 122.221307,\n 29.832611\n ],\n [\n 122.303843,\n 29.832611\n ]\n ]\n ],\n [\n [\n [\n 122.13138,\n 29.673659\n ],\n [\n 122.047612,\n 29.719396\n ],\n [\n 122.130148,\n 29.79056\n ],\n [\n 122.200981,\n 29.711082\n ],\n [\n 122.192358,\n 29.655462\n ],\n [\n 122.13138,\n 29.673659\n ]\n ]\n ],\n [\n [\n [\n 121.943518,\n 30.77688\n ],\n [\n 121.970004,\n 30.789217\n ],\n [\n 122.011271,\n 30.669381\n ],\n [\n 121.968156,\n 30.68842\n ],\n [\n 121.943518,\n 30.77688\n ]\n ]\n ],\n [\n [\n [\n 121.874533,\n 29.964878\n ],\n [\n 121.835113,\n 29.992865\n ],\n [\n 121.855439,\n 30.085062\n ],\n [\n 121.924424,\n 30.052441\n ],\n [\n 121.933047,\n 29.994938\n ],\n [\n 121.874533,\n 29.964878\n ]\n ]\n ],\n [\n [\n [\n 122.155401,\n 29.97058\n ],\n [\n 122.154169,\n 29.971098\n ],\n [\n 122.152322,\n 29.971098\n ],\n [\n 122.163408,\n 29.988201\n ],\n [\n 122.155401,\n 29.97058\n ]\n ]\n ],\n [\n [\n [\n 121.136638,\n 27.948414\n ],\n [\n 121.041783,\n 27.943657\n ],\n [\n 121.0695,\n 27.984349\n ],\n [\n 121.136638,\n 27.948414\n ]\n ]\n ],\n [\n [\n [\n 121.134174,\n 27.786029\n ],\n [\n 121.134174,\n 27.787088\n ],\n [\n 121.13479,\n 27.787088\n ],\n [\n 121.134174,\n 27.786029\n ]\n ]\n ],\n [\n [\n [\n 122.152322,\n 29.971098\n ],\n [\n 122.154169,\n 29.971098\n ],\n [\n 122.155401,\n 29.97058\n ],\n [\n 122.152322,\n 29.971098\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 340000,\n \"name\": \"安徽省\",\n \"center\": [\n 117.283042,\n 31.86119\n ],\n \"centroid\": [\n 117.226894,\n 31.849585\n ],\n \"childrenNum\": 16,\n \"level\": \"province\",\n \"subFeatureIndex\": 11,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 115.5088,\n 32.468777\n ],\n [\n 115.409018,\n 32.549005\n ],\n [\n 115.304924,\n 32.553039\n ],\n [\n 115.20083,\n 32.591864\n ],\n [\n 115.183584,\n 32.665937\n ],\n [\n 115.197135,\n 32.85613\n ],\n [\n 115.139237,\n 32.897837\n ],\n [\n 114.943368,\n 32.935005\n ],\n [\n 114.883006,\n 32.990227\n ],\n [\n 114.925506,\n 33.016821\n ],\n [\n 114.902716,\n 33.129632\n ],\n [\n 114.966158,\n 33.147167\n ],\n [\n 115.042534,\n 33.08653\n ],\n [\n 115.168186,\n 33.088535\n ],\n [\n 115.301229,\n 33.141657\n ],\n [\n 115.365286,\n 33.335826\n ],\n [\n 115.312931,\n 33.376307\n ],\n [\n 115.345576,\n 33.503125\n ],\n [\n 115.421953,\n 33.556992\n ],\n [\n 115.639995,\n 33.584909\n ],\n [\n 115.563003,\n 33.771624\n ],\n [\n 115.614126,\n 33.775603\n ],\n [\n 115.629524,\n 33.871536\n ],\n [\n 115.546988,\n 33.875014\n ],\n [\n 115.60735,\n 34.030359\n ],\n [\n 115.736082,\n 34.076957\n ],\n [\n 115.877132,\n 34.003083\n ],\n [\n 115.95782,\n 34.007547\n ],\n [\n 116.00032,\n 33.964881\n ],\n [\n 115.987385,\n 33.900842\n ],\n [\n 116.05945,\n 33.861103\n ],\n [\n 116.074232,\n 33.781571\n ],\n [\n 116.155536,\n 33.709929\n ],\n [\n 116.263326,\n 33.729835\n ],\n [\n 116.316297,\n 33.771127\n ],\n [\n 116.437021,\n 33.801461\n ],\n [\n 116.437637,\n 33.846694\n ],\n [\n 116.64336,\n 33.896869\n ],\n [\n 116.648288,\n 33.973317\n ],\n [\n 116.575607,\n 34.069028\n ],\n [\n 116.575607,\n 34.069028\n ],\n [\n 116.530643,\n 34.107183\n ],\n [\n 116.565752,\n 34.173541\n ],\n [\n 116.516477,\n 34.296217\n ],\n [\n 116.409303,\n 34.273971\n ],\n [\n 116.409303,\n 34.273971\n ],\n [\n 116.26271,\n 34.375762\n ],\n [\n 116.213435,\n 34.382181\n ],\n [\n 116.162312,\n 34.459178\n ],\n [\n 116.204196,\n 34.508497\n ],\n [\n 116.196804,\n 34.576017\n ],\n [\n 116.240536,\n 34.552367\n ],\n [\n 116.281188,\n 34.60754\n ],\n [\n 116.374195,\n 34.640036\n ],\n [\n 116.429629,\n 34.652834\n ],\n [\n 116.491839,\n 34.57109\n ],\n [\n 116.595933,\n 34.510469\n ],\n [\n 116.574991,\n 34.488773\n ],\n [\n 116.774555,\n 34.452764\n ],\n [\n 116.828142,\n 34.389094\n ],\n [\n 116.969192,\n 34.387613\n ],\n [\n 116.971656,\n 34.279409\n ],\n [\n 117.04988,\n 34.242321\n ],\n [\n 117.025243,\n 34.167106\n ],\n [\n 117.192778,\n 34.068532\n ],\n [\n 117.352922,\n 34.089842\n ],\n [\n 117.410205,\n 34.026888\n ],\n [\n 117.514914,\n 34.061097\n ],\n [\n 117.575892,\n 33.982744\n ],\n [\n 117.629479,\n 34.028872\n ],\n [\n 117.715095,\n 33.879485\n ],\n [\n 117.758826,\n 33.885445\n ],\n [\n 117.752667,\n 33.711422\n ],\n [\n 117.805638,\n 33.736304\n ],\n [\n 117.901724,\n 33.719883\n ],\n [\n 118.116071,\n 33.767645\n ],\n [\n 118.16781,\n 33.66313\n ],\n [\n 118.112376,\n 33.617302\n ],\n [\n 118.108064,\n 33.475181\n ],\n [\n 118.050782,\n 33.492148\n ],\n [\n 117.971941,\n 33.277821\n ],\n [\n 117.939297,\n 33.262813\n ],\n [\n 118.038463,\n 33.134642\n ],\n [\n 118.221397,\n 33.182228\n ],\n [\n 118.244803,\n 32.998256\n ],\n [\n 118.293462,\n 32.947056\n ],\n [\n 118.2331,\n 32.914414\n ],\n [\n 118.250346,\n 32.84859\n ],\n [\n 118.375382,\n 32.718809\n ],\n [\n 118.707373,\n 32.720319\n ],\n [\n 118.756648,\n 32.737433\n ],\n [\n 118.74125,\n 32.850601\n ],\n [\n 118.811467,\n 32.854622\n ],\n [\n 118.849039,\n 32.956596\n ],\n [\n 118.995017,\n 32.958604\n ],\n [\n 119.104038,\n 32.82647\n ],\n [\n 119.184726,\n 32.825465\n ],\n [\n 119.22045,\n 32.57674\n ],\n [\n 119.084944,\n 32.452622\n ],\n [\n 119.041212,\n 32.515207\n ],\n [\n 118.978386,\n 32.504106\n ],\n [\n 118.922336,\n 32.557074\n ],\n [\n 118.92172,\n 32.557074\n ],\n [\n 118.922336,\n 32.557074\n ],\n [\n 118.92172,\n 32.557074\n ],\n [\n 118.719076,\n 32.614042\n ],\n [\n 118.719076,\n 32.614042\n ],\n [\n 118.563859,\n 32.56363\n ],\n [\n 118.592192,\n 32.481396\n ],\n [\n 118.69259,\n 32.463224\n ],\n [\n 118.69567,\n 32.31721\n ],\n [\n 118.642083,\n 32.208937\n ],\n [\n 118.522591,\n 32.188178\n ],\n [\n 118.499801,\n 32.1203\n ],\n [\n 118.400019,\n 32.077724\n ],\n [\n 118.363679,\n 31.930581\n ],\n [\n 118.504729,\n 31.841674\n ],\n [\n 118.481939,\n 31.778117\n ],\n [\n 118.552772,\n 31.729275\n ],\n [\n 118.638388,\n 31.759295\n ],\n [\n 118.697518,\n 31.709935\n ],\n [\n 118.643931,\n 31.65138\n ],\n [\n 118.736938,\n 31.634061\n ],\n [\n 118.77451,\n 31.682444\n ],\n [\n 118.804691,\n 31.618268\n ],\n [\n 118.858278,\n 31.624382\n ],\n [\n 118.873061,\n 31.53569\n ],\n [\n 118.866285,\n 31.527021\n ],\n [\n 118.870597,\n 31.526001\n ],\n [\n 118.876756,\n 31.532631\n ],\n [\n 118.853967,\n 31.39841\n ],\n [\n 118.745561,\n 31.37287\n ],\n [\n 118.728931,\n 31.281384\n ],\n [\n 118.781286,\n 31.239956\n ],\n [\n 119.075089,\n 31.232282\n ],\n [\n 119.199508,\n 31.293655\n ],\n [\n 119.267878,\n 31.250698\n ],\n [\n 119.379979,\n 31.269622\n ],\n [\n 119.388602,\n 31.194415\n ],\n [\n 119.388602,\n 31.194415\n ],\n [\n 119.460051,\n 31.156533\n ],\n [\n 119.623891,\n 31.130416\n ],\n [\n 119.633746,\n 31.019724\n ],\n [\n 119.585702,\n 30.976642\n ],\n [\n 119.575847,\n 30.829814\n ],\n [\n 119.479761,\n 30.772253\n ],\n [\n 119.482841,\n 30.70437\n ],\n [\n 119.416935,\n 30.642101\n ],\n [\n 119.386754,\n 30.685333\n ],\n [\n 119.312225,\n 30.620993\n ],\n [\n 119.238929,\n 30.60915\n ],\n [\n 119.237081,\n 30.54682\n ],\n [\n 119.326392,\n 30.532906\n ],\n [\n 119.36766,\n 30.384885\n ],\n [\n 119.246936,\n 30.341002\n ],\n [\n 119.201356,\n 30.290901\n ],\n [\n 119.06277,\n 30.304849\n ],\n [\n 118.954365,\n 30.360106\n ],\n [\n 118.880452,\n 30.31518\n ],\n [\n 118.929727,\n 30.202515\n ],\n [\n 118.847807,\n 30.163208\n ],\n [\n 118.902626,\n 30.029133\n ],\n [\n 118.894619,\n 29.93792\n ],\n [\n 118.755416,\n 29.845586\n ],\n [\n 118.744945,\n 29.738621\n ],\n [\n 118.644547,\n 29.641942\n ],\n [\n 118.573714,\n 29.638302\n ],\n [\n 118.500417,\n 29.575877\n ],\n [\n 118.496106,\n 29.519662\n ],\n [\n 118.310708,\n 29.49623\n ],\n [\n 118.316252,\n 29.422774\n ],\n [\n 118.193064,\n 29.395149\n ],\n [\n 118.136397,\n 29.419125\n ],\n [\n 118.134549,\n 29.508728\n ],\n [\n 118.008282,\n 29.578479\n ],\n [\n 117.872775,\n 29.547774\n ],\n [\n 117.807486,\n 29.573796\n ],\n [\n 117.707703,\n 29.548815\n ],\n [\n 117.647957,\n 29.614897\n ],\n [\n 117.545711,\n 29.594089\n ],\n [\n 117.532161,\n 29.651822\n ],\n [\n 117.453936,\n 29.688214\n ],\n [\n 117.455168,\n 29.749011\n ],\n [\n 117.384335,\n 29.84351\n ],\n [\n 117.29256,\n 29.822749\n ],\n [\n 117.246365,\n 29.915104\n ],\n [\n 117.17738,\n 29.921846\n ],\n [\n 117.073286,\n 29.832092\n ],\n [\n 117.136728,\n 29.7755\n ],\n [\n 117.112706,\n 29.712121\n ],\n [\n 116.780715,\n 29.570153\n ],\n [\n 116.651983,\n 29.637262\n ],\n [\n 116.677237,\n 29.66898\n ],\n [\n 116.694483,\n 29.672099\n ],\n [\n 116.694483,\n 29.672099\n ],\n [\n 116.717273,\n 29.690813\n ],\n [\n 116.710498,\n 29.69705\n ],\n [\n 116.709882,\n 29.69757\n ],\n [\n 116.706186,\n 29.69809\n ],\n [\n 116.698795,\n 29.707964\n ],\n [\n 116.684012,\n 29.72823\n ],\n [\n 116.789954,\n 29.795233\n ],\n [\n 116.882961,\n 29.89332\n ],\n [\n 116.900207,\n 29.949326\n ],\n [\n 116.83307,\n 29.957621\n ],\n [\n 116.747454,\n 30.057101\n ],\n [\n 116.666766,\n 30.076779\n ],\n [\n 116.586078,\n 30.046226\n ],\n [\n 116.552201,\n 29.909918\n ],\n [\n 116.473361,\n 29.89747\n ],\n [\n 116.26271,\n 29.782251\n ],\n [\n 116.207891,\n 29.82742\n ],\n [\n 116.13521,\n 29.819634\n ],\n [\n 116.127203,\n 29.899544\n ],\n [\n 116.073616,\n 29.970061\n ],\n [\n 116.091479,\n 30.036385\n ],\n [\n 116.065609,\n 30.204584\n ],\n [\n 115.985537,\n 30.290901\n ],\n [\n 115.903001,\n 30.313631\n ],\n [\n 115.921479,\n 30.416364\n ],\n [\n 115.876516,\n 30.582368\n ],\n [\n 115.819234,\n 30.59782\n ],\n [\n 115.762567,\n 30.685848\n ],\n [\n 115.782893,\n 30.751687\n ],\n [\n 115.851262,\n 30.756829\n ],\n [\n 115.865429,\n 30.864231\n ],\n [\n 115.976298,\n 30.931488\n ],\n [\n 116.071769,\n 30.956633\n ],\n [\n 116.058834,\n 31.012545\n ],\n [\n 115.938726,\n 31.047409\n ],\n [\n 115.869125,\n 31.147828\n ],\n [\n 115.763799,\n 31.118123\n ],\n [\n 115.700973,\n 31.201068\n ],\n [\n 115.646155,\n 31.209768\n ],\n [\n 115.559307,\n 31.160117\n ],\n [\n 115.516191,\n 31.263485\n ],\n [\n 115.457677,\n 31.281384\n ],\n [\n 115.442279,\n 31.346303\n ],\n [\n 115.372062,\n 31.349368\n ],\n [\n 115.373909,\n 31.405559\n ],\n [\n 115.371446,\n 31.495905\n ],\n [\n 115.496481,\n 31.674297\n ],\n [\n 115.660937,\n 31.760822\n ],\n [\n 115.767495,\n 31.787272\n ],\n [\n 115.816154,\n 31.762348\n ],\n [\n 115.909777,\n 31.791849\n ],\n [\n 115.893146,\n 31.833033\n ],\n [\n 115.931334,\n 31.994541\n ],\n [\n 115.941805,\n 32.166402\n ],\n [\n 115.912856,\n 32.227666\n ],\n [\n 115.899306,\n 32.391005\n ],\n [\n 115.845719,\n 32.501583\n ],\n [\n 115.789052,\n 32.468777\n ],\n [\n 115.706517,\n 32.494014\n ],\n [\n 115.667712,\n 32.409696\n ],\n [\n 115.567314,\n 32.421819\n ],\n [\n 115.509416,\n 32.466758\n ],\n [\n 115.510648,\n 32.467768\n ],\n [\n 115.510648,\n 32.468272\n ],\n [\n 115.510648,\n 32.468777\n ],\n [\n 115.5088,\n 32.468777\n ]\n ]\n ],\n [\n [\n [\n 116.717273,\n 29.690813\n ],\n [\n 116.694483,\n 29.672099\n ],\n [\n 116.694483,\n 29.672099\n ],\n [\n 116.677237,\n 29.66898\n ],\n [\n 116.684012,\n 29.72823\n ],\n [\n 116.698795,\n 29.707964\n ],\n [\n 116.706186,\n 29.69809\n ],\n [\n 116.709882,\n 29.69757\n ],\n [\n 116.710498,\n 29.69705\n ],\n [\n 116.709882,\n 29.69757\n ],\n [\n 116.717273,\n 29.690813\n ]\n ]\n ],\n [\n [\n [\n 118.873061,\n 31.53569\n ],\n [\n 118.876756,\n 31.532631\n ],\n [\n 118.870597,\n 31.526001\n ],\n [\n 118.866285,\n 31.527021\n ],\n [\n 118.873061,\n 31.53569\n ]\n ]\n ],\n [\n [\n [\n 115.510648,\n 32.468777\n ],\n [\n 115.510648,\n 32.468272\n ],\n [\n 115.510648,\n 32.467768\n ],\n [\n 115.509416,\n 32.466758\n ],\n [\n 115.5088,\n 32.468777\n ],\n [\n 115.510648,\n 32.468777\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 350000,\n \"name\": \"福建省\",\n \"center\": [\n 119.306239,\n 26.075302\n ],\n \"centroid\": [\n 118.005928,\n 26.070282\n ],\n \"childrenNum\": 9,\n \"level\": \"province\",\n \"subFeatureIndex\": 12,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 120.461568,\n 27.14259\n ],\n [\n 120.393199,\n 27.081343\n ],\n [\n 120.287257,\n 27.094128\n ],\n [\n 120.29588,\n 27.035519\n ],\n [\n 120.231823,\n 26.907006\n ],\n [\n 120.117258,\n 26.916609\n ],\n [\n 120.047041,\n 26.824809\n ],\n [\n 120.1382,\n 26.79704\n ],\n [\n 120.165917,\n 26.73133\n ],\n [\n 120.110483,\n 26.692848\n ],\n [\n 120.1382,\n 26.637775\n ],\n [\n 119.967585,\n 26.597657\n ],\n [\n 119.896136,\n 26.516306\n ],\n [\n 119.827767,\n 26.524872\n ],\n [\n 119.851788,\n 26.595516\n ],\n [\n 119.949107,\n 26.624404\n ],\n [\n 120.052584,\n 26.786892\n ],\n [\n 119.942947,\n 26.784756\n ],\n [\n 119.86965,\n 26.642588\n ],\n [\n 119.83023,\n 26.69071\n ],\n [\n 119.711354,\n 26.686433\n ],\n [\n 119.665159,\n 26.725986\n ],\n [\n 119.577695,\n 26.622264\n ],\n [\n 119.788346,\n 26.58321\n ],\n [\n 119.876426,\n 26.359867\n ],\n [\n 119.962657,\n 26.373269\n ],\n [\n 119.8986,\n 26.308388\n ],\n [\n 119.841317,\n 26.322333\n ],\n [\n 119.668854,\n 26.256887\n ],\n [\n 119.604181,\n 26.168853\n ],\n [\n 119.668854,\n 26.025924\n ],\n [\n 119.723673,\n 26.011406\n ],\n [\n 119.688564,\n 25.897892\n ],\n [\n 119.632514,\n 25.884436\n ],\n [\n 119.635594,\n 25.746011\n ],\n [\n 119.601101,\n 25.683479\n ],\n [\n 119.472986,\n 25.662448\n ],\n [\n 119.586934,\n 25.592317\n ],\n [\n 119.634362,\n 25.475161\n ],\n [\n 119.716898,\n 25.550758\n ],\n [\n 119.716898,\n 25.551838\n ],\n [\n 119.683637,\n 25.592856\n ],\n [\n 119.785883,\n 25.667841\n ],\n [\n 119.790194,\n 25.614439\n ],\n [\n 119.883817,\n 25.54644\n ],\n [\n 119.812368,\n 25.523225\n ],\n [\n 119.864107,\n 25.479482\n ],\n [\n 119.764325,\n 25.433562\n ],\n [\n 119.773564,\n 25.395732\n ],\n [\n 119.646064,\n 25.460576\n ],\n [\n 119.649144,\n 25.34275\n ],\n [\n 119.549362,\n 25.367082\n ],\n [\n 119.48592,\n 25.364919\n ],\n [\n 119.490232,\n 25.447069\n ],\n [\n 119.438493,\n 25.412487\n ],\n [\n 119.452044,\n 25.490824\n ],\n [\n 119.36458,\n 25.521065\n ],\n [\n 119.354725,\n 25.427077\n ],\n [\n 119.288204,\n 25.410865\n ],\n [\n 119.256175,\n 25.488664\n ],\n [\n 119.14469,\n 25.388165\n ],\n [\n 119.299291,\n 25.32869\n ],\n [\n 119.380595,\n 25.250247\n ],\n [\n 119.293131,\n 25.23347\n ],\n [\n 119.26911,\n 25.15984\n ],\n [\n 119.131755,\n 25.223187\n ],\n [\n 119.165632,\n 25.145217\n ],\n [\n 119.119436,\n 25.012447\n ],\n [\n 119.107118,\n 25.075327\n ],\n [\n 119.035669,\n 25.125717\n ],\n [\n 119.081248,\n 25.218856\n ],\n [\n 118.989473,\n 25.202075\n ],\n [\n 118.996864,\n 25.266481\n ],\n [\n 118.911249,\n 25.241589\n ],\n [\n 118.981466,\n 25.19612\n ],\n [\n 118.975923,\n 25.118133\n ],\n [\n 118.868133,\n 25.082372\n ],\n [\n 118.928495,\n 25.025459\n ],\n [\n 119.02335,\n 25.04877\n ],\n [\n 118.989473,\n 24.973944\n ],\n [\n 119.032589,\n 24.962011\n ],\n [\n 119.032589,\n 24.961468\n ],\n [\n 118.918024,\n 24.924034\n ],\n [\n 118.96114,\n 24.871933\n ],\n [\n 118.86259,\n 24.886589\n ],\n [\n 118.650707,\n 24.808949\n ],\n [\n 118.786213,\n 24.776358\n ],\n [\n 118.703677,\n 24.665485\n ],\n [\n 118.675344,\n 24.57628\n ],\n [\n 118.558316,\n 24.512602\n ],\n [\n 118.557084,\n 24.573016\n ],\n [\n 118.444367,\n 24.614907\n ],\n [\n 118.355056,\n 24.534376\n ],\n [\n 118.242955,\n 24.512602\n ],\n [\n 118.134549,\n 24.575736\n ],\n [\n 118.12531,\n 24.571927\n ],\n [\n 118.048934,\n 24.418385\n ],\n [\n 118.088354,\n 24.409123\n ],\n [\n 118.158571,\n 24.270111\n ],\n [\n 118.001507,\n 24.176805\n ],\n [\n 117.762522,\n 23.88718\n ],\n [\n 117.671979,\n 23.877879\n ],\n [\n 117.612849,\n 23.71364\n ],\n [\n 117.500132,\n 23.703232\n ],\n [\n 117.463791,\n 23.58539\n ],\n [\n 117.387415,\n 23.555228\n ],\n [\n 117.192778,\n 23.561809\n ],\n [\n 117.192778,\n 23.629799\n ],\n [\n 117.053576,\n 23.696657\n ],\n [\n 117.012308,\n 23.855446\n ],\n [\n 116.980279,\n 23.881709\n ],\n [\n 116.981511,\n 23.999282\n ],\n [\n 116.939627,\n 24.033713\n ],\n [\n 116.9347,\n 24.127123\n ],\n [\n 116.998757,\n 24.178988\n ],\n [\n 116.933468,\n 24.21992\n ],\n [\n 116.903903,\n 24.369888\n ],\n [\n 116.860787,\n 24.462507\n ],\n [\n 116.789338,\n 24.50988\n ],\n [\n 116.761005,\n 24.58281\n ],\n [\n 116.815207,\n 24.655154\n ],\n [\n 116.778867,\n 24.680165\n ],\n [\n 116.597165,\n 24.65461\n ],\n [\n 116.525716,\n 24.604572\n ],\n [\n 116.486912,\n 24.71876\n ],\n [\n 116.44626,\n 24.714412\n ],\n [\n 116.376659,\n 24.820353\n ],\n [\n 116.245464,\n 24.793197\n ],\n [\n 116.18079,\n 24.87519\n ],\n [\n 116.068073,\n 24.849675\n ],\n [\n 116.014486,\n 24.905584\n ],\n [\n 115.89253,\n 24.937056\n ],\n [\n 115.873436,\n 25.020038\n ],\n [\n 115.928255,\n 25.050396\n ],\n [\n 115.880212,\n 25.092126\n ],\n [\n 115.855574,\n 25.209654\n ],\n [\n 115.929487,\n 25.234553\n ],\n [\n 116.008327,\n 25.319496\n ],\n [\n 116.005247,\n 25.490284\n ],\n [\n 116.063145,\n 25.563173\n ],\n [\n 116.067457,\n 25.703967\n ],\n [\n 116.18079,\n 25.774571\n ],\n [\n 116.131515,\n 25.82413\n ],\n [\n 116.176478,\n 25.893048\n ],\n [\n 116.258398,\n 25.902736\n ],\n [\n 116.36434,\n 25.960312\n ],\n [\n 116.383434,\n 26.029687\n ],\n [\n 116.489375,\n 26.113529\n ],\n [\n 116.471513,\n 26.175296\n ],\n [\n 116.396985,\n 26.166168\n ],\n [\n 116.412999,\n 26.298197\n ],\n [\n 116.519557,\n 26.410251\n ],\n [\n 116.601476,\n 26.372733\n ],\n [\n 116.610716,\n 26.477216\n ],\n [\n 116.539267,\n 26.559129\n ],\n [\n 116.566368,\n 26.650075\n ],\n [\n 116.516477,\n 26.69071\n ],\n [\n 116.557745,\n 26.774073\n ],\n [\n 116.548506,\n 26.839758\n ],\n [\n 116.679085,\n 26.978479\n ],\n [\n 116.910062,\n 27.034453\n ],\n [\n 117.05296,\n 27.100519\n ],\n [\n 117.043721,\n 27.139928\n ],\n [\n 117.171836,\n 27.290509\n ],\n [\n 117.100387,\n 27.338886\n ],\n [\n 117.133032,\n 27.4223\n ],\n [\n 117.084989,\n 27.564011\n ],\n [\n 117.01662,\n 27.563481\n ],\n [\n 117.040641,\n 27.670043\n ],\n [\n 117.096692,\n 27.626582\n ],\n [\n 117.118865,\n 27.694416\n ],\n [\n 117.204481,\n 27.683819\n ],\n [\n 117.296872,\n 27.764854\n ],\n [\n 117.27901,\n 27.870161\n ],\n [\n 117.341836,\n 27.855879\n ],\n [\n 117.52169,\n 27.982236\n ],\n [\n 117.608537,\n 27.863814\n ],\n [\n 117.740348,\n 27.800321\n ],\n [\n 117.78716,\n 27.896076\n ],\n [\n 117.856145,\n 27.945772\n ],\n [\n 117.999043,\n 27.991218\n ],\n [\n 118.096977,\n 27.96744\n ],\n [\n 118.155491,\n 28.061992\n ],\n [\n 118.356288,\n 28.091555\n ],\n [\n 118.37415,\n 28.188106\n ],\n [\n 118.314404,\n 28.22238\n ],\n [\n 118.433896,\n 28.288786\n ],\n [\n 118.444367,\n 28.25348\n ],\n [\n 118.587881,\n 28.28299\n ],\n [\n 118.674728,\n 28.271398\n ],\n [\n 118.700598,\n 28.310912\n ],\n [\n 118.802228,\n 28.240303\n ],\n [\n 118.771431,\n 28.188634\n ],\n [\n 118.802228,\n 28.117416\n ],\n [\n 118.719076,\n 28.063576\n ],\n [\n 118.730163,\n 27.970611\n ],\n [\n 118.818242,\n 27.916697\n ],\n [\n 118.913713,\n 27.61651\n ],\n [\n 118.869365,\n 27.54014\n ],\n [\n 118.903858,\n 27.462125\n ],\n [\n 118.983314,\n 27.498751\n ],\n [\n 119.194581,\n 27.418582\n ],\n [\n 119.267878,\n 27.421237\n ],\n [\n 119.376899,\n 27.534835\n ],\n [\n 119.474833,\n 27.539079\n ],\n [\n 119.501319,\n 27.649905\n ],\n [\n 119.644217,\n 27.663684\n ],\n [\n 119.630666,\n 27.582574\n ],\n [\n 119.70889,\n 27.514141\n ],\n [\n 119.685485,\n 27.438762\n ],\n [\n 119.770484,\n 27.305928\n ],\n [\n 119.843165,\n 27.300611\n ],\n [\n 120.007005,\n 27.376084\n ],\n [\n 120.052584,\n 27.338886\n ],\n [\n 120.13512,\n 27.420175\n ],\n [\n 120.26262,\n 27.432921\n ],\n [\n 120.34146,\n 27.39946\n ],\n [\n 120.430155,\n 27.258601\n ],\n [\n 120.401206,\n 27.211253\n ],\n [\n 120.461568,\n 27.14259\n ]\n ]\n ],\n [\n [\n [\n 118.412338,\n 24.514235\n ],\n [\n 118.477012,\n 24.437452\n ],\n [\n 118.335962,\n 24.385148\n ],\n [\n 118.316252,\n 24.487557\n ],\n [\n 118.374766,\n 24.458695\n ],\n [\n 118.412338,\n 24.514235\n ]\n ]\n ],\n [\n [\n [\n 119.532116,\n 25.203158\n ],\n [\n 119.549362,\n 25.162007\n ],\n [\n 119.444036,\n 25.202075\n ],\n [\n 119.473601,\n 25.259988\n ],\n [\n 119.532116,\n 25.203158\n ]\n ]\n ],\n [\n [\n [\n 118.079115,\n 24.444533\n ],\n [\n 118.093281,\n 24.540907\n ],\n [\n 118.142557,\n 24.561588\n ],\n [\n 118.20723,\n 24.487012\n ],\n [\n 118.143173,\n 24.421109\n ],\n [\n 118.079115,\n 24.444533\n ]\n ]\n ],\n [\n [\n [\n 119.737224,\n 26.646332\n ],\n [\n 119.668238,\n 26.628683\n ],\n [\n 119.673782,\n 26.681087\n ],\n [\n 119.737224,\n 26.646332\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 360000,\n \"name\": \"江西省\",\n \"center\": [\n 115.892151,\n 28.676493\n ],\n \"centroid\": [\n 115.732937,\n 27.636129\n ],\n \"childrenNum\": 11,\n \"level\": \"province\",\n \"subFeatureIndex\": 13,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 113.94185,\n 29.047374\n ],\n [\n 113.952321,\n 29.092871\n ],\n [\n 114.061959,\n 29.204176\n ],\n [\n 114.252284,\n 29.234985\n ],\n [\n 114.259059,\n 29.344049\n ],\n [\n 114.519602,\n 29.325271\n ],\n [\n 114.660652,\n 29.393585\n ],\n [\n 114.759818,\n 29.363345\n ],\n [\n 114.931049,\n 29.422252\n ],\n [\n 114.860216,\n 29.475917\n ],\n [\n 114.940904,\n 29.494147\n ],\n [\n 115.00065,\n 29.572235\n ],\n [\n 115.154019,\n 29.51029\n ],\n [\n 115.142316,\n 29.651822\n ],\n [\n 115.359127,\n 29.646623\n ],\n [\n 115.471844,\n 29.742777\n ],\n [\n 115.511264,\n 29.839877\n ],\n [\n 115.667712,\n 29.850257\n ],\n [\n 115.837096,\n 29.748491\n ],\n [\n 115.965827,\n 29.724593\n ],\n [\n 116.13521,\n 29.819634\n ],\n [\n 116.207891,\n 29.82742\n ],\n [\n 116.26271,\n 29.782251\n ],\n [\n 116.473361,\n 29.89747\n ],\n [\n 116.552201,\n 29.909918\n ],\n [\n 116.586078,\n 30.046226\n ],\n [\n 116.666766,\n 30.076779\n ],\n [\n 116.747454,\n 30.057101\n ],\n [\n 116.83307,\n 29.957621\n ],\n [\n 116.900207,\n 29.949326\n ],\n [\n 116.882961,\n 29.89332\n ],\n [\n 116.789954,\n 29.795233\n ],\n [\n 116.684012,\n 29.72823\n ],\n [\n 116.677237,\n 29.66898\n ],\n [\n 116.651983,\n 29.637262\n ],\n [\n 116.780715,\n 29.570153\n ],\n [\n 117.112706,\n 29.712121\n ],\n [\n 117.136728,\n 29.7755\n ],\n [\n 117.073286,\n 29.832092\n ],\n [\n 117.17738,\n 29.921846\n ],\n [\n 117.246365,\n 29.915104\n ],\n [\n 117.29256,\n 29.822749\n ],\n [\n 117.384335,\n 29.84351\n ],\n [\n 117.455168,\n 29.749011\n ],\n [\n 117.453936,\n 29.688214\n ],\n [\n 117.532161,\n 29.651822\n ],\n [\n 117.545711,\n 29.594089\n ],\n [\n 117.647957,\n 29.614897\n ],\n [\n 117.707703,\n 29.548815\n ],\n [\n 117.807486,\n 29.573796\n ],\n [\n 117.872775,\n 29.547774\n ],\n [\n 118.008282,\n 29.578479\n ],\n [\n 118.134549,\n 29.508728\n ],\n [\n 118.136397,\n 29.419125\n ],\n [\n 118.193064,\n 29.395149\n ],\n [\n 118.20723,\n 29.346135\n ],\n [\n 118.136397,\n 29.284052\n ],\n [\n 118.077883,\n 29.290836\n ],\n [\n 118.027992,\n 29.168132\n ],\n [\n 118.037847,\n 29.097054\n ],\n [\n 118.111144,\n 28.997671\n ],\n [\n 118.111144,\n 28.997671\n ],\n [\n 118.270056,\n 28.918619\n ],\n [\n 118.306396,\n 28.823782\n ],\n [\n 118.379077,\n 28.785509\n ],\n [\n 118.379077,\n 28.785509\n ],\n [\n 118.431432,\n 28.679528\n ],\n [\n 118.423425,\n 28.587626\n ],\n [\n 118.423425,\n 28.587626\n ],\n [\n 118.421577,\n 28.541908\n ],\n [\n 118.421577,\n 28.540331\n ],\n [\n 118.425273,\n 28.537177\n ],\n [\n 118.426505,\n 28.532447\n ],\n [\n 118.425273,\n 28.537177\n ],\n [\n 118.426505,\n 28.532447\n ],\n [\n 118.472084,\n 28.482497\n ],\n [\n 118.432048,\n 28.402003\n ],\n [\n 118.486867,\n 28.328821\n ],\n [\n 118.433896,\n 28.288786\n ],\n [\n 118.314404,\n 28.22238\n ],\n [\n 118.37415,\n 28.188106\n ],\n [\n 118.356288,\n 28.091555\n ],\n [\n 118.155491,\n 28.061992\n ],\n [\n 118.096977,\n 27.96744\n ],\n [\n 117.999043,\n 27.991218\n ],\n [\n 117.856145,\n 27.945772\n ],\n [\n 117.78716,\n 27.896076\n ],\n [\n 117.740348,\n 27.800321\n ],\n [\n 117.608537,\n 27.863814\n ],\n [\n 117.52169,\n 27.982236\n ],\n [\n 117.341836,\n 27.855879\n ],\n [\n 117.27901,\n 27.870161\n ],\n [\n 117.296872,\n 27.764854\n ],\n [\n 117.204481,\n 27.683819\n ],\n [\n 117.118865,\n 27.694416\n ],\n [\n 117.096692,\n 27.626582\n ],\n [\n 117.040641,\n 27.670043\n ],\n [\n 117.01662,\n 27.563481\n ],\n [\n 117.084989,\n 27.564011\n ],\n [\n 117.133032,\n 27.4223\n ],\n [\n 117.100387,\n 27.338886\n ],\n [\n 117.171836,\n 27.290509\n ],\n [\n 117.043721,\n 27.139928\n ],\n [\n 117.05296,\n 27.100519\n ],\n [\n 116.910062,\n 27.034453\n ],\n [\n 116.679085,\n 26.978479\n ],\n [\n 116.548506,\n 26.839758\n ],\n [\n 116.557745,\n 26.774073\n ],\n [\n 116.516477,\n 26.69071\n ],\n [\n 116.566368,\n 26.650075\n ],\n [\n 116.539267,\n 26.559129\n ],\n [\n 116.610716,\n 26.477216\n ],\n [\n 116.601476,\n 26.372733\n ],\n [\n 116.519557,\n 26.410251\n ],\n [\n 116.412999,\n 26.298197\n ],\n [\n 116.396985,\n 26.166168\n ],\n [\n 116.471513,\n 26.175296\n ],\n [\n 116.489375,\n 26.113529\n ],\n [\n 116.383434,\n 26.029687\n ],\n [\n 116.36434,\n 25.960312\n ],\n [\n 116.258398,\n 25.902736\n ],\n [\n 116.176478,\n 25.893048\n ],\n [\n 116.131515,\n 25.82413\n ],\n [\n 116.18079,\n 25.774571\n ],\n [\n 116.067457,\n 25.703967\n ],\n [\n 116.063145,\n 25.563173\n ],\n [\n 116.005247,\n 25.490284\n ],\n [\n 116.008327,\n 25.319496\n ],\n [\n 115.929487,\n 25.234553\n ],\n [\n 115.855574,\n 25.209654\n ],\n [\n 115.880212,\n 25.092126\n ],\n [\n 115.928255,\n 25.050396\n ],\n [\n 115.873436,\n 25.020038\n ],\n [\n 115.89253,\n 24.937056\n ],\n [\n 115.907313,\n 24.880075\n ],\n [\n 115.822313,\n 24.90884\n ],\n [\n 115.756408,\n 24.749192\n ],\n [\n 115.845103,\n 24.563221\n ],\n [\n 115.688038,\n 24.545261\n ],\n [\n 115.67264,\n 24.604028\n ],\n [\n 115.573474,\n 24.617083\n ],\n [\n 115.556227,\n 24.682883\n ],\n [\n 115.412714,\n 24.792654\n ],\n [\n 115.358511,\n 24.735064\n ],\n [\n 115.308004,\n 24.758429\n ],\n [\n 115.095505,\n 24.674184\n ],\n [\n 115.056701,\n 24.703541\n ],\n [\n 114.909491,\n 24.661679\n ],\n [\n 114.868839,\n 24.562132\n ],\n [\n 114.729637,\n 24.608924\n ],\n [\n 114.704999,\n 24.526211\n ],\n [\n 114.664963,\n 24.583898\n ],\n [\n 114.589819,\n 24.537642\n ],\n [\n 114.534384,\n 24.558867\n ],\n [\n 114.428443,\n 24.486468\n ],\n [\n 114.391486,\n 24.562677\n ],\n [\n 114.308334,\n 24.574104\n ],\n [\n 114.258443,\n 24.641558\n ],\n [\n 114.169132,\n 24.689407\n ],\n [\n 114.27261,\n 24.700279\n ],\n [\n 114.33482,\n 24.747562\n ],\n [\n 114.403189,\n 24.877361\n ],\n [\n 114.395798,\n 24.951161\n ],\n [\n 114.506051,\n 24.999975\n ],\n [\n 114.561485,\n 25.077495\n ],\n [\n 114.640326,\n 25.073702\n ],\n [\n 114.735796,\n 25.121925\n ],\n [\n 114.679746,\n 25.194495\n ],\n [\n 114.743188,\n 25.274597\n ],\n [\n 114.63663,\n 25.324364\n ],\n [\n 114.535616,\n 25.41681\n ],\n [\n 114.381015,\n 25.31571\n ],\n [\n 114.31511,\n 25.338424\n ],\n [\n 114.262755,\n 25.29191\n ],\n [\n 114.13156,\n 25.30922\n ],\n [\n 114.039785,\n 25.250789\n ],\n [\n 114.051488,\n 25.348699\n ],\n [\n 113.94493,\n 25.441667\n ],\n [\n 113.983118,\n 25.599332\n ],\n [\n 113.913517,\n 25.701272\n ],\n [\n 113.971416,\n 25.835979\n ],\n [\n 114.028082,\n 25.893586\n ],\n [\n 114.007756,\n 26.007104\n ],\n [\n 114.044096,\n 26.076452\n ],\n [\n 114.237501,\n 26.152204\n ],\n [\n 114.181451,\n 26.214489\n ],\n [\n 114.088444,\n 26.168316\n ],\n [\n 113.944314,\n 26.16402\n ],\n [\n 114.029314,\n 26.266545\n ],\n [\n 114.030546,\n 26.376485\n ],\n [\n 114.085364,\n 26.4065\n ],\n [\n 114.073046,\n 26.480965\n ],\n [\n 114.106306,\n 26.576254\n ],\n [\n 113.915365,\n 26.613706\n ],\n [\n 113.860546,\n 26.663978\n ],\n [\n 113.834677,\n 26.803983\n ],\n [\n 113.927068,\n 26.949149\n ],\n [\n 113.821126,\n 27.037651\n ],\n [\n 113.779242,\n 27.137265\n ],\n [\n 113.848844,\n 27.225087\n ],\n [\n 113.872865,\n 27.385116\n ],\n [\n 113.616635,\n 27.345264\n ],\n [\n 113.632033,\n 27.405303\n ],\n [\n 113.583374,\n 27.524754\n ],\n [\n 113.607395,\n 27.625522\n ],\n [\n 113.763228,\n 27.799262\n ],\n [\n 113.729967,\n 27.887086\n ],\n [\n 113.752141,\n 27.933614\n ],\n [\n 113.864242,\n 28.004954\n ],\n [\n 113.914133,\n 27.991218\n ],\n [\n 114.047176,\n 28.05724\n ],\n [\n 113.992357,\n 28.161207\n ],\n [\n 114.107538,\n 28.182833\n ],\n [\n 114.25598,\n 28.323554\n ],\n [\n 114.252284,\n 28.395687\n ],\n [\n 114.172212,\n 28.432524\n ],\n [\n 114.218407,\n 28.484601\n ],\n [\n 114.08598,\n 28.558201\n ],\n [\n 114.157429,\n 28.761384\n ],\n [\n 114.152502,\n 28.83479\n ],\n [\n 114.076741,\n 28.834266\n ],\n [\n 114.008988,\n 28.955273\n ],\n [\n 113.966488,\n 28.945326\n ],\n [\n 113.94185,\n 29.047374\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 370000,\n \"name\": \"山东省\",\n \"center\": [\n 117.000923,\n 36.675807\n ],\n \"centroid\": [\n 118.186283,\n 36.374485\n ],\n \"childrenNum\": 17,\n \"level\": \"province\",\n \"subFeatureIndex\": 14,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 121.362071,\n 37.634292\n ],\n [\n 121.4791,\n 37.474914\n ],\n [\n 121.565331,\n 37.440242\n ],\n [\n 121.635548,\n 37.49438\n ],\n [\n 121.66573,\n 37.47349\n ],\n [\n 121.923808,\n 37.473015\n ],\n [\n 122.08888,\n 37.554171\n ],\n [\n 122.166488,\n 37.439292\n ],\n [\n 122.234857,\n 37.469216\n ],\n [\n 122.284133,\n 37.426464\n ],\n [\n 122.41656,\n 37.414585\n ],\n [\n 122.487393,\n 37.434541\n ],\n [\n 122.553914,\n 37.406981\n ],\n [\n 122.670942,\n 37.429315\n ],\n [\n 122.573624,\n 37.296159\n ],\n [\n 122.629059,\n 37.194708\n ],\n [\n 122.581015,\n 37.147508\n ],\n [\n 122.505871,\n 37.149892\n ],\n [\n 122.467067,\n 37.03726\n ],\n [\n 122.575472,\n 37.054452\n ],\n [\n 122.532356,\n 36.901497\n ],\n [\n 122.344495,\n 36.828257\n ],\n [\n 122.174495,\n 36.842623\n ],\n [\n 122.141235,\n 36.93833\n ],\n [\n 122.051923,\n 36.904846\n ],\n [\n 122.008808,\n 36.962238\n ],\n [\n 121.767975,\n 36.874698\n ],\n [\n 121.762432,\n 36.846454\n ],\n [\n 121.627541,\n 36.795683\n ],\n [\n 121.647867,\n 36.723301\n ],\n [\n 121.492035,\n 36.789933\n ],\n [\n 121.454462,\n 36.75255\n ],\n [\n 121.209318,\n 36.671489\n ],\n [\n 121.028848,\n 36.573046\n ],\n [\n 120.847146,\n 36.618682\n ],\n [\n 120.983269,\n 36.546133\n ],\n [\n 120.890878,\n 36.373375\n ],\n [\n 120.828668,\n 36.466779\n ],\n [\n 120.759683,\n 36.462448\n ],\n [\n 120.694393,\n 36.390234\n ],\n [\n 120.7449,\n 36.330969\n ],\n [\n 120.66298,\n 36.331933\n ],\n [\n 120.712255,\n 36.126809\n ],\n [\n 120.478199,\n 36.091522\n ],\n [\n 120.343308,\n 36.04219\n ],\n [\n 120.290337,\n 36.061539\n ],\n [\n 120.362402,\n 36.19637\n ],\n [\n 120.181316,\n 36.204095\n ],\n [\n 120.108635,\n 36.127292\n ],\n [\n 120.241062,\n 36.047995\n ],\n [\n 120.213345,\n 35.998152\n ],\n [\n 120.292801,\n 36.017512\n ],\n [\n 120.262004,\n 35.965712\n ],\n [\n 120.062439,\n 35.870739\n ],\n [\n 120.011317,\n 35.713006\n ],\n [\n 119.926317,\n 35.759631\n ],\n [\n 119.923237,\n 35.635238\n ],\n [\n 119.718129,\n 35.615785\n ],\n [\n 119.665775,\n 35.57005\n ],\n [\n 119.543819,\n 35.347815\n ],\n [\n 119.411392,\n 35.231581\n ],\n [\n 119.373819,\n 35.078464\n ],\n [\n 119.306066,\n 35.076506\n ],\n [\n 119.286972,\n 35.11518\n ],\n [\n 119.137915,\n 35.09609\n ],\n [\n 119.114509,\n 35.054958\n ],\n [\n 118.928495,\n 35.051039\n ],\n [\n 118.865053,\n 35.029974\n ],\n [\n 118.860742,\n 34.94419\n ],\n [\n 118.772047,\n 34.794464\n ],\n [\n 118.719076,\n 34.745315\n ],\n [\n 118.783749,\n 34.723188\n ],\n [\n 118.690127,\n 34.678424\n ],\n [\n 118.601431,\n 34.714336\n ],\n [\n 118.460997,\n 34.65628\n ],\n [\n 118.424657,\n 34.595228\n ],\n [\n 118.440671,\n 34.527724\n ],\n [\n 118.404947,\n 34.427598\n ],\n [\n 118.290382,\n 34.424637\n ],\n [\n 118.179513,\n 34.379218\n ],\n [\n 118.177665,\n 34.453257\n ],\n [\n 118.132702,\n 34.483348\n ],\n [\n 118.185056,\n 34.543989\n ],\n [\n 118.079115,\n 34.569612\n ],\n [\n 118.084042,\n 34.655788\n ],\n [\n 117.951615,\n 34.678424\n ],\n [\n 117.902956,\n 34.644467\n ],\n [\n 117.793935,\n 34.65185\n ],\n [\n 117.801942,\n 34.51885\n ],\n [\n 117.684298,\n 34.547439\n ],\n [\n 117.592523,\n 34.462631\n ],\n [\n 117.465023,\n 34.484827\n ],\n [\n 117.402813,\n 34.569612\n ],\n [\n 117.322125,\n 34.574046\n ],\n [\n 117.322125,\n 34.574046\n ],\n [\n 117.32151,\n 34.566656\n ],\n [\n 117.32151,\n 34.566656\n ],\n [\n 117.322125,\n 34.566656\n ],\n [\n 117.322125,\n 34.566656\n ],\n [\n 117.301184,\n 34.557294\n ],\n [\n 117.301184,\n 34.557294\n ],\n [\n 117.242669,\n 34.445856\n ],\n [\n 117.175532,\n 34.47003\n ],\n [\n 117.137344,\n 34.633144\n ],\n [\n 117.07575,\n 34.637575\n ],\n [\n 117.088069,\n 34.702039\n ],\n [\n 117.000605,\n 34.793482\n ],\n [\n 116.966728,\n 34.875497\n ],\n [\n 116.821983,\n 34.929475\n ],\n [\n 116.677853,\n 34.939285\n ],\n [\n 116.445028,\n 34.89562\n ],\n [\n 116.408071,\n 34.85095\n ],\n [\n 116.374195,\n 34.640036\n ],\n [\n 116.281188,\n 34.60754\n ],\n [\n 116.240536,\n 34.552367\n ],\n [\n 116.196804,\n 34.576017\n ],\n [\n 116.134594,\n 34.559758\n ],\n [\n 116.101334,\n 34.605571\n ],\n [\n 115.83032,\n 34.562714\n ],\n [\n 115.697278,\n 34.594243\n ],\n [\n 115.667096,\n 34.557294\n ],\n [\n 115.515575,\n 34.582421\n ],\n [\n 115.461373,\n 34.637083\n ],\n [\n 115.42688,\n 34.805273\n ],\n [\n 115.317243,\n 34.859297\n ],\n [\n 115.256265,\n 34.845549\n ],\n [\n 115.251953,\n 34.906416\n ],\n [\n 115.189128,\n 34.914757\n ],\n [\n 115.12815,\n 35.004493\n ],\n [\n 115.028983,\n 34.97165\n ],\n [\n 114.923658,\n 34.968709\n ],\n [\n 114.824492,\n 35.012335\n ],\n [\n 114.883006,\n 35.098537\n ],\n [\n 114.841738,\n 35.151389\n ],\n [\n 114.932281,\n 35.197362\n ],\n [\n 114.929817,\n 35.248196\n ],\n [\n 115.02036,\n 35.364406\n ],\n [\n 115.093657,\n 35.41611\n ],\n [\n 115.237171,\n 35.422937\n ],\n [\n 115.357895,\n 35.498475\n ],\n [\n 115.383148,\n 35.569076\n ],\n [\n 115.48601,\n 35.710091\n ],\n [\n 115.693582,\n 35.75429\n ],\n [\n 115.773654,\n 35.854252\n ],\n [\n 115.875284,\n 35.859102\n ],\n [\n 115.911624,\n 35.960385\n ],\n [\n 116.048979,\n 35.970071\n ],\n [\n 116.099486,\n 36.111826\n ],\n [\n 115.989849,\n 36.045576\n ],\n [\n 115.646155,\n 35.920663\n ],\n [\n 115.496481,\n 35.885283\n ],\n [\n 115.498329,\n 35.897401\n ],\n [\n 115.503257,\n 35.91194\n ],\n [\n 115.503257,\n 35.91194\n ],\n [\n 115.487242,\n 35.903702\n ],\n [\n 115.473692,\n 35.896917\n ],\n [\n 115.473692,\n 35.896917\n ],\n [\n 115.467532,\n 35.889646\n ],\n [\n 115.467532,\n 35.889646\n ],\n [\n 115.464452,\n 35.882859\n ],\n [\n 115.464452,\n 35.88092\n ],\n [\n 115.464452,\n 35.882859\n ],\n [\n 115.463837,\n 35.882859\n ],\n [\n 115.464452,\n 35.88092\n ],\n [\n 115.463837,\n 35.88092\n ],\n [\n 115.463837,\n 35.882859\n ],\n [\n 115.463837,\n 35.88092\n ],\n [\n 115.460141,\n 35.86783\n ],\n [\n 115.363438,\n 35.78002\n ],\n [\n 115.335105,\n 35.796522\n ],\n [\n 115.362822,\n 35.972008\n ],\n [\n 115.447822,\n 36.012672\n ],\n [\n 115.483547,\n 36.149036\n ],\n [\n 115.466916,\n 36.259115\n ],\n [\n 115.466916,\n 36.259115\n ],\n [\n 115.366518,\n 36.308793\n ],\n [\n 115.308004,\n 36.461967\n ],\n [\n 115.308004,\n 36.461967\n ],\n [\n 115.283366,\n 36.486505\n ],\n [\n 115.365902,\n 36.622043\n ],\n [\n 115.479851,\n 36.76022\n ],\n [\n 115.683727,\n 36.808139\n ],\n [\n 115.71206,\n 36.883313\n ],\n [\n 115.79706,\n 36.968931\n ],\n [\n 115.776734,\n 36.992829\n ],\n [\n 115.868509,\n 37.076414\n ],\n [\n 115.909777,\n 37.206622\n ],\n [\n 115.969523,\n 37.239497\n ],\n [\n 115.984921,\n 37.326616\n ],\n [\n 116.051443,\n 37.367998\n ],\n [\n 116.169087,\n 37.384164\n ],\n [\n 116.236224,\n 37.361816\n ],\n [\n 116.2855,\n 37.404604\n ],\n [\n 116.226369,\n 37.428365\n ],\n [\n 116.240536,\n 37.489633\n ],\n [\n 116.240536,\n 37.489633\n ],\n [\n 116.27626,\n 37.466841\n ],\n [\n 116.291659,\n 37.557966\n ],\n [\n 116.337238,\n 37.580255\n ],\n [\n 116.379738,\n 37.521909\n ],\n [\n 116.38097,\n 37.522858\n ],\n [\n 116.379738,\n 37.521909\n ],\n [\n 116.38097,\n 37.522858\n ],\n [\n 116.433941,\n 37.47349\n ],\n [\n 116.724664,\n 37.744139\n ],\n [\n 116.788106,\n 37.843429\n ],\n [\n 117.023395,\n 37.832561\n ],\n [\n 117.093612,\n 37.849571\n ],\n [\n 117.267923,\n 37.838704\n ],\n [\n 117.34122,\n 37.863271\n ],\n [\n 117.438538,\n 37.853823\n ],\n [\n 117.513067,\n 37.94353\n ],\n [\n 117.5839,\n 38.070819\n ],\n [\n 117.70216,\n 38.075529\n ],\n [\n 117.771761,\n 38.136734\n ],\n [\n 117.808718,\n 38.228445\n ],\n [\n 117.895565,\n 38.30173\n ],\n [\n 117.997811,\n 38.211992\n ],\n [\n 118.045238,\n 38.207761\n ],\n [\n 118.143788,\n 38.297035\n ],\n [\n 118.07234,\n 38.170139\n ],\n [\n 118.331034,\n 38.124968\n ],\n [\n 118.504729,\n 38.114141\n ],\n [\n 118.552156,\n 38.055744\n ],\n [\n 118.607591,\n 38.129204\n ],\n [\n 118.726467,\n 38.154144\n ],\n [\n 118.853967,\n 38.155085\n ],\n [\n 118.974075,\n 38.094367\n ],\n [\n 119.004872,\n 37.992114\n ],\n [\n 119.110813,\n 37.921349\n ],\n [\n 119.12806,\n 37.814601\n ],\n [\n 119.217371,\n 37.810347\n ],\n [\n 119.259871,\n 37.702492\n ],\n [\n 119.080016,\n 37.696337\n ],\n [\n 118.99748,\n 37.632396\n ],\n [\n 118.939582,\n 37.527129\n ],\n [\n 118.983314,\n 37.349926\n ],\n [\n 119.054147,\n 37.254738\n ],\n [\n 119.12806,\n 37.254738\n ],\n [\n 119.298675,\n 37.197567\n ],\n [\n 119.329472,\n 37.115548\n ],\n [\n 119.489616,\n 37.13463\n ],\n [\n 119.566608,\n 37.100755\n ],\n [\n 119.744615,\n 37.135107\n ],\n [\n 119.89244,\n 37.263786\n ],\n [\n 119.843781,\n 37.376557\n ],\n [\n 120.144359,\n 37.482036\n ],\n [\n 120.246605,\n 37.556543\n ],\n [\n 120.215192,\n 37.621023\n ],\n [\n 120.272475,\n 37.636661\n ],\n [\n 120.227511,\n 37.693497\n ],\n [\n 120.367945,\n 37.697758\n ],\n [\n 120.466496,\n 37.757858\n ],\n [\n 120.595227,\n 37.767318\n ],\n [\n 120.733197,\n 37.833506\n ],\n [\n 120.938305,\n 37.821219\n ],\n [\n 121.037471,\n 37.718585\n ],\n [\n 121.136022,\n 37.723318\n ],\n [\n 121.153884,\n 37.613914\n ],\n [\n 121.217326,\n 37.582626\n ],\n [\n 121.354064,\n 37.595901\n ],\n [\n 121.362071,\n 37.634292\n ]\n ]\n ],\n [\n [\n [\n 115.498329,\n 35.897401\n ],\n [\n 115.496481,\n 35.885283\n ],\n [\n 115.460141,\n 35.86783\n ],\n [\n 115.463837,\n 35.88092\n ],\n [\n 115.463837,\n 35.882859\n ],\n [\n 115.463837,\n 35.88092\n ],\n [\n 115.464452,\n 35.88092\n ],\n [\n 115.463837,\n 35.882859\n ],\n [\n 115.464452,\n 35.882859\n ],\n [\n 115.464452,\n 35.88092\n ],\n [\n 115.464452,\n 35.882859\n ],\n [\n 115.467532,\n 35.889646\n ],\n [\n 115.467532,\n 35.889646\n ],\n [\n 115.473692,\n 35.896917\n ],\n [\n 115.473692,\n 35.896917\n ],\n [\n 115.487242,\n 35.903702\n ],\n [\n 115.498329,\n 35.897401\n ]\n ]\n ],\n [\n [\n [\n 121.487723,\n 37.578833\n ],\n [\n 121.487723,\n 37.577884\n ],\n [\n 121.487107,\n 37.577884\n ],\n [\n 121.485875,\n 37.578359\n ],\n [\n 121.485875,\n 37.578833\n ],\n [\n 121.487723,\n 37.578833\n ]\n ]\n ],\n [\n [\n [\n 121.487723,\n 37.578833\n ],\n [\n 121.488339,\n 37.578833\n ],\n [\n 121.488339,\n 37.578833\n ],\n [\n 121.487723,\n 37.57741\n ],\n [\n 121.487723,\n 37.577884\n ],\n [\n 121.487723,\n 37.578833\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 410000,\n \"name\": \"河南省\",\n \"center\": [\n 113.665412,\n 34.757975\n ],\n \"centroid\": [\n 113.619918,\n 33.902738\n ],\n \"childrenNum\": 18,\n \"level\": \"province\",\n \"subFeatureIndex\": 15,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 116.196804,\n 34.576017\n ],\n [\n 116.204196,\n 34.508497\n ],\n [\n 116.162312,\n 34.459178\n ],\n [\n 116.213435,\n 34.382181\n ],\n [\n 116.26271,\n 34.375762\n ],\n [\n 116.409303,\n 34.273971\n ],\n [\n 116.409303,\n 34.273971\n ],\n [\n 116.516477,\n 34.296217\n ],\n [\n 116.565752,\n 34.173541\n ],\n [\n 116.530643,\n 34.107183\n ],\n [\n 116.575607,\n 34.069028\n ],\n [\n 116.575607,\n 34.069028\n ],\n [\n 116.648288,\n 33.973317\n ],\n [\n 116.64336,\n 33.896869\n ],\n [\n 116.437637,\n 33.846694\n ],\n [\n 116.437021,\n 33.801461\n ],\n [\n 116.316297,\n 33.771127\n ],\n [\n 116.263326,\n 33.729835\n ],\n [\n 116.155536,\n 33.709929\n ],\n [\n 116.074232,\n 33.781571\n ],\n [\n 116.05945,\n 33.861103\n ],\n [\n 115.987385,\n 33.900842\n ],\n [\n 116.00032,\n 33.964881\n ],\n [\n 115.95782,\n 34.007547\n ],\n [\n 115.877132,\n 34.003083\n ],\n [\n 115.736082,\n 34.076957\n ],\n [\n 115.60735,\n 34.030359\n ],\n [\n 115.546988,\n 33.875014\n ],\n [\n 115.629524,\n 33.871536\n ],\n [\n 115.614126,\n 33.775603\n ],\n [\n 115.563003,\n 33.771624\n ],\n [\n 115.639995,\n 33.584909\n ],\n [\n 115.421953,\n 33.556992\n ],\n [\n 115.345576,\n 33.503125\n ],\n [\n 115.312931,\n 33.376307\n ],\n [\n 115.365286,\n 33.335826\n ],\n [\n 115.301229,\n 33.141657\n ],\n [\n 115.168186,\n 33.088535\n ],\n [\n 115.042534,\n 33.08653\n ],\n [\n 114.966158,\n 33.147167\n ],\n [\n 114.902716,\n 33.129632\n ],\n [\n 114.925506,\n 33.016821\n ],\n [\n 114.883006,\n 32.990227\n ],\n [\n 114.943368,\n 32.935005\n ],\n [\n 115.139237,\n 32.897837\n ],\n [\n 115.197135,\n 32.85613\n ],\n [\n 115.183584,\n 32.665937\n ],\n [\n 115.20083,\n 32.591864\n ],\n [\n 115.304924,\n 32.553039\n ],\n [\n 115.409018,\n 32.549005\n ],\n [\n 115.5088,\n 32.468777\n ],\n [\n 115.509416,\n 32.466758\n ],\n [\n 115.567314,\n 32.421819\n ],\n [\n 115.667712,\n 32.409696\n ],\n [\n 115.706517,\n 32.494014\n ],\n [\n 115.789052,\n 32.468777\n ],\n [\n 115.845719,\n 32.501583\n ],\n [\n 115.899306,\n 32.391005\n ],\n [\n 115.912856,\n 32.227666\n ],\n [\n 115.941805,\n 32.166402\n ],\n [\n 115.931334,\n 31.994541\n ],\n [\n 115.893146,\n 31.833033\n ],\n [\n 115.909777,\n 31.791849\n ],\n [\n 115.816154,\n 31.762348\n ],\n [\n 115.767495,\n 31.787272\n ],\n [\n 115.660937,\n 31.760822\n ],\n [\n 115.496481,\n 31.674297\n ],\n [\n 115.371446,\n 31.495905\n ],\n [\n 115.373909,\n 31.405559\n ],\n [\n 115.301229,\n 31.384109\n ],\n [\n 115.22054,\n 31.426494\n ],\n [\n 115.235323,\n 31.556597\n ],\n [\n 115.12507,\n 31.598904\n ],\n [\n 115.088729,\n 31.507638\n ],\n [\n 115.024056,\n 31.528551\n ],\n [\n 114.830035,\n 31.458654\n ],\n [\n 114.778912,\n 31.5209\n ],\n [\n 114.696376,\n 31.526001\n ],\n [\n 114.641558,\n 31.582085\n ],\n [\n 114.560869,\n 31.561185\n ],\n [\n 114.549783,\n 31.642721\n ],\n [\n 114.586123,\n 31.762348\n ],\n [\n 114.448769,\n 31.728257\n ],\n [\n 114.292936,\n 31.752173\n ],\n [\n 114.195002,\n 31.850315\n ],\n [\n 114.135871,\n 31.843707\n ],\n [\n 114.088444,\n 31.781677\n ],\n [\n 113.988662,\n 31.750138\n ],\n [\n 113.954785,\n 31.856413\n ],\n [\n 113.838373,\n 31.854889\n ],\n [\n 113.791561,\n 32.036142\n ],\n [\n 113.728735,\n 32.0833\n ],\n [\n 113.783554,\n 32.186153\n ],\n [\n 113.749677,\n 32.272196\n ],\n [\n 113.761996,\n 32.268149\n ],\n [\n 113.757069,\n 32.29243\n ],\n [\n 113.758301,\n 32.296476\n ],\n [\n 113.752757,\n 32.388478\n ],\n [\n 113.664062,\n 32.422324\n ],\n [\n 113.624642,\n 32.361191\n ],\n [\n 113.425693,\n 32.269161\n ],\n [\n 113.211962,\n 32.431919\n ],\n [\n 113.118956,\n 32.375846\n ],\n [\n 113.025949,\n 32.425354\n ],\n [\n 112.992072,\n 32.378373\n ],\n [\n 112.860877,\n 32.395552\n ],\n [\n 112.733993,\n 32.363718\n ],\n [\n 112.729066,\n 32.366245\n ],\n [\n 112.544284,\n 32.403635\n ],\n [\n 112.451893,\n 32.344511\n ],\n [\n 112.390915,\n 32.371298\n ],\n [\n 112.328089,\n 32.321761\n ],\n [\n 112.228923,\n 32.385447\n ],\n [\n 112.014576,\n 32.450098\n ],\n [\n 111.948671,\n 32.517225\n ],\n [\n 111.890157,\n 32.503097\n ],\n [\n 111.640701,\n 32.634703\n ],\n [\n 111.577875,\n 32.593376\n ],\n [\n 111.380159,\n 32.828984\n ],\n [\n 111.293311,\n 32.859145\n ],\n [\n 111.242804,\n 32.930486\n ],\n [\n 111.273601,\n 32.971656\n ],\n [\n 111.238493,\n 33.040899\n ],\n [\n 111.151029,\n 33.053438\n ],\n [\n 111.179363,\n 33.115601\n ],\n [\n 111.056791,\n 33.192743\n ],\n [\n 111.032769,\n 33.209265\n ],\n [\n 110.984726,\n 33.255308\n ],\n [\n 111.025994,\n 33.330327\n ],\n [\n 110.996429,\n 33.435745\n ],\n [\n 111.02661,\n 33.474183\n ],\n [\n 111.02661,\n 33.478675\n ],\n [\n 111.00382,\n 33.578429\n ],\n [\n 110.877552,\n 33.635238\n ],\n [\n 110.782698,\n 33.795494\n ],\n [\n 110.587445,\n 33.887929\n ],\n [\n 110.669365,\n 33.939072\n ],\n [\n 110.590525,\n 34.096778\n ],\n [\n 110.642264,\n 34.16067\n ],\n [\n 110.43962,\n 34.24331\n ],\n [\n 110.426685,\n 34.275454\n ],\n [\n 110.503677,\n 34.337234\n ],\n [\n 110.403279,\n 34.43352\n ],\n [\n 110.403279,\n 34.43352\n ],\n [\n 110.360779,\n 34.516878\n ],\n [\n 110.379257,\n 34.600646\n ],\n [\n 110.474728,\n 34.617389\n ],\n [\n 110.533242,\n 34.583406\n ],\n [\n 110.710017,\n 34.605078\n ],\n [\n 110.749437,\n 34.652342\n ],\n [\n 110.883712,\n 34.642498\n ],\n [\n 110.929907,\n 34.731548\n ],\n [\n 110.966248,\n 34.70499\n ],\n [\n 111.118385,\n 34.756622\n ],\n [\n 111.148566,\n 34.80773\n ],\n [\n 111.232949,\n 34.789551\n ],\n [\n 111.346282,\n 34.831798\n ],\n [\n 111.570484,\n 34.843094\n ],\n [\n 111.66965,\n 34.988319\n ],\n [\n 111.900012,\n 35.079933\n ],\n [\n 112.062004,\n 35.055937\n ],\n [\n 112.078634,\n 35.219362\n ],\n [\n 112.058924,\n 35.279951\n ],\n [\n 112.513487,\n 35.218384\n ],\n [\n 112.637291,\n 35.225716\n ],\n [\n 112.628052,\n 35.263342\n ],\n [\n 112.766022,\n 35.203718\n ],\n [\n 112.818377,\n 35.258457\n ],\n [\n 112.911384,\n 35.24673\n ],\n [\n 112.992072,\n 35.296068\n ],\n [\n 112.997,\n 35.362455\n ],\n [\n 113.126347,\n 35.332197\n ],\n [\n 113.189789,\n 35.449261\n ],\n [\n 113.298194,\n 35.427325\n ],\n [\n 113.31236,\n 35.481424\n ],\n [\n 113.485439,\n 35.520879\n ],\n [\n 113.578446,\n 35.63378\n ],\n [\n 113.604316,\n 35.797008\n ],\n [\n 113.656671,\n 35.836792\n ],\n [\n 113.637576,\n 35.98847\n ],\n [\n 113.694859,\n 36.026707\n ],\n [\n 113.651743,\n 36.172224\n ],\n [\n 113.716417,\n 36.262492\n ],\n [\n 113.731199,\n 36.363257\n ],\n [\n 113.819894,\n 36.330969\n ],\n [\n 113.881488,\n 36.354102\n ],\n [\n 113.911054,\n 36.314578\n ],\n [\n 113.982502,\n 36.358921\n ],\n [\n 114.055799,\n 36.330005\n ],\n [\n 114.060727,\n 36.276482\n ],\n [\n 114.169132,\n 36.243675\n ],\n [\n 114.169132,\n 36.243675\n ],\n [\n 114.345291,\n 36.255738\n ],\n [\n 114.591666,\n 36.130192\n ],\n [\n 114.912571,\n 36.140339\n ],\n [\n 114.914419,\n 36.051865\n ],\n [\n 114.996955,\n 36.06831\n ],\n [\n 115.064092,\n 36.178985\n ],\n [\n 115.201446,\n 36.210371\n ],\n [\n 115.201446,\n 36.210371\n ],\n [\n 115.312931,\n 36.088137\n ],\n [\n 115.483547,\n 36.149036\n ],\n [\n 115.447822,\n 36.012672\n ],\n [\n 115.362822,\n 35.972008\n ],\n [\n 115.335105,\n 35.796522\n ],\n [\n 115.363438,\n 35.78002\n ],\n [\n 115.460141,\n 35.86783\n ],\n [\n 115.496481,\n 35.885283\n ],\n [\n 115.646155,\n 35.920663\n ],\n [\n 115.989849,\n 36.045576\n ],\n [\n 116.099486,\n 36.111826\n ],\n [\n 116.048979,\n 35.970071\n ],\n [\n 115.911624,\n 35.960385\n ],\n [\n 115.875284,\n 35.859102\n ],\n [\n 115.773654,\n 35.854252\n ],\n [\n 115.693582,\n 35.75429\n ],\n [\n 115.48601,\n 35.710091\n ],\n [\n 115.383148,\n 35.569076\n ],\n [\n 115.357895,\n 35.498475\n ],\n [\n 115.237171,\n 35.422937\n ],\n [\n 115.093657,\n 35.41611\n ],\n [\n 115.02036,\n 35.364406\n ],\n [\n 114.929817,\n 35.248196\n ],\n [\n 114.932281,\n 35.197362\n ],\n [\n 114.841738,\n 35.151389\n ],\n [\n 114.883006,\n 35.098537\n ],\n [\n 114.824492,\n 35.012335\n ],\n [\n 114.923658,\n 34.968709\n ],\n [\n 115.028983,\n 34.97165\n ],\n [\n 115.12815,\n 35.004493\n ],\n [\n 115.189128,\n 34.914757\n ],\n [\n 115.251953,\n 34.906416\n ],\n [\n 115.256265,\n 34.845549\n ],\n [\n 115.317243,\n 34.859297\n ],\n [\n 115.42688,\n 34.805273\n ],\n [\n 115.461373,\n 34.637083\n ],\n [\n 115.515575,\n 34.582421\n ],\n [\n 115.667096,\n 34.557294\n ],\n [\n 115.697278,\n 34.594243\n ],\n [\n 115.83032,\n 34.562714\n ],\n [\n 116.101334,\n 34.605571\n ],\n [\n 116.134594,\n 34.559758\n ],\n [\n 116.196804,\n 34.576017\n ]\n ]\n ],\n [\n [\n [\n 115.498329,\n 35.897401\n ],\n [\n 115.487242,\n 35.903702\n ],\n [\n 115.503257,\n 35.91194\n ],\n [\n 115.503257,\n 35.91194\n ],\n [\n 115.498329,\n 35.897401\n ]\n ]\n ],\n [\n [\n [\n 113.749677,\n 32.272196\n ],\n [\n 113.758301,\n 32.296476\n ],\n [\n 113.757069,\n 32.29243\n ],\n [\n 113.761996,\n 32.268149\n ],\n [\n 113.749677,\n 32.272196\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 420000,\n \"name\": \"湖北省\",\n \"center\": [\n 114.298572,\n 30.584355\n ],\n \"centroid\": [\n 112.271042,\n 30.98802\n ],\n \"childrenNum\": 17,\n \"level\": \"province\",\n \"subFeatureIndex\": 16,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 109.232378,\n 29.119533\n ],\n [\n 109.110422,\n 29.215143\n ],\n [\n 109.11227,\n 29.360737\n ],\n [\n 108.919481,\n 29.326314\n ],\n [\n 108.927488,\n 29.435281\n ],\n [\n 108.880677,\n 29.442576\n ],\n [\n 108.91209,\n 29.571714\n ],\n [\n 108.844337,\n 29.658582\n ],\n [\n 108.785822,\n 29.633622\n ],\n [\n 108.690968,\n 29.689773\n ],\n [\n 108.666946,\n 29.842472\n ],\n [\n 108.602273,\n 29.865824\n ],\n [\n 108.504338,\n 29.707964\n ],\n [\n 108.437201,\n 29.741218\n ],\n [\n 108.424266,\n 29.816\n ],\n [\n 108.371295,\n 29.841434\n ],\n [\n 108.516041,\n 29.885539\n ],\n [\n 108.542526,\n 29.998047\n ],\n [\n 108.513577,\n 30.057619\n ],\n [\n 108.56778,\n 30.157517\n ],\n [\n 108.581947,\n 30.255763\n ],\n [\n 108.460606,\n 30.35959\n ],\n [\n 108.402092,\n 30.376626\n ],\n [\n 108.42673,\n 30.492184\n ],\n [\n 108.56778,\n 30.468464\n ],\n [\n 108.688504,\n 30.587519\n ],\n [\n 108.743939,\n 30.494762\n ],\n [\n 108.808612,\n 30.491153\n ],\n [\n 108.971836,\n 30.627686\n ],\n [\n 109.114734,\n 30.64416\n ],\n [\n 109.09256,\n 30.578762\n ],\n [\n 109.103647,\n 30.565883\n ],\n [\n 109.143683,\n 30.521052\n ],\n [\n 109.299516,\n 30.630775\n ],\n [\n 109.36111,\n 30.550942\n ],\n [\n 109.35495,\n 30.487028\n ],\n [\n 109.435638,\n 30.59576\n ],\n [\n 109.590855,\n 30.693566\n ],\n [\n 109.780564,\n 30.848822\n ],\n [\n 109.893897,\n 30.899662\n ],\n [\n 110.008462,\n 30.883746\n ],\n [\n 110.082375,\n 30.799496\n ],\n [\n 110.172918,\n 30.978694\n ],\n [\n 110.135961,\n 30.986902\n ],\n [\n 110.119947,\n 31.088409\n ],\n [\n 110.189548,\n 31.129391\n ],\n [\n 110.140273,\n 31.390238\n ],\n [\n 110.054042,\n 31.410666\n ],\n [\n 109.946252,\n 31.506108\n ],\n [\n 109.848934,\n 31.552008\n ],\n [\n 109.719586,\n 31.555067\n ],\n [\n 109.76455,\n 31.602981\n ],\n [\n 109.731289,\n 31.700263\n ],\n [\n 109.585928,\n 31.726731\n ],\n [\n 109.638282,\n 31.811172\n ],\n [\n 109.584696,\n 31.900617\n ],\n [\n 109.631507,\n 31.962059\n ],\n [\n 109.590855,\n 32.012807\n ],\n [\n 109.621652,\n 32.106617\n ],\n [\n 109.592703,\n 32.219568\n ],\n [\n 109.495385,\n 32.300522\n ],\n [\n 109.502776,\n 32.389489\n ],\n [\n 109.575457,\n 32.506629\n ],\n [\n 109.637051,\n 32.540935\n ],\n [\n 109.631507,\n 32.599929\n ],\n [\n 109.726978,\n 32.608498\n ],\n [\n 109.816905,\n 32.577244\n ],\n [\n 109.910528,\n 32.592872\n ],\n [\n 110.017701,\n 32.546987\n ],\n [\n 110.085454,\n 32.613034\n ],\n [\n 110.153824,\n 32.593376\n ],\n [\n 110.206179,\n 32.633191\n ],\n [\n 110.156903,\n 32.683061\n ],\n [\n 110.159367,\n 32.767122\n ],\n [\n 110.10886,\n 32.82999\n ],\n [\n 109.988752,\n 32.886281\n ],\n [\n 109.76455,\n 32.909391\n ],\n [\n 109.794731,\n 33.066977\n ],\n [\n 109.688174,\n 33.116603\n ],\n [\n 109.576073,\n 33.110088\n ],\n [\n 109.438718,\n 33.152177\n ],\n [\n 109.537268,\n 33.2438\n ],\n [\n 109.619804,\n 33.27532\n ],\n [\n 109.732521,\n 33.231288\n ],\n [\n 109.852013,\n 33.247803\n ],\n [\n 110.031252,\n 33.191742\n ],\n [\n 110.164911,\n 33.209265\n ],\n [\n 110.218497,\n 33.163197\n ],\n [\n 110.468569,\n 33.181226\n ],\n [\n 110.54125,\n 33.255809\n ],\n [\n 110.59422,\n 33.168706\n ],\n [\n 110.702626,\n 33.097057\n ],\n [\n 110.745741,\n 33.147167\n ],\n [\n 110.824582,\n 33.158188\n ],\n [\n 110.984726,\n 33.255308\n ],\n [\n 111.032769,\n 33.209265\n ],\n [\n 111.037081,\n 33.187235\n ],\n [\n 111.031537,\n 33.17722\n ],\n [\n 111.056791,\n 33.192743\n ],\n [\n 111.179363,\n 33.115601\n ],\n [\n 111.151029,\n 33.053438\n ],\n [\n 111.238493,\n 33.040899\n ],\n [\n 111.273601,\n 32.971656\n ],\n [\n 111.242804,\n 32.930486\n ],\n [\n 111.293311,\n 32.859145\n ],\n [\n 111.380159,\n 32.828984\n ],\n [\n 111.577875,\n 32.593376\n ],\n [\n 111.640701,\n 32.634703\n ],\n [\n 111.890157,\n 32.503097\n ],\n [\n 111.948671,\n 32.517225\n ],\n [\n 112.014576,\n 32.450098\n ],\n [\n 112.228923,\n 32.385447\n ],\n [\n 112.328089,\n 32.321761\n ],\n [\n 112.390915,\n 32.371298\n ],\n [\n 112.451893,\n 32.344511\n ],\n [\n 112.544284,\n 32.403635\n ],\n [\n 112.729066,\n 32.366245\n ],\n [\n 112.730914,\n 32.363212\n ],\n [\n 112.732146,\n 32.362707\n ],\n [\n 112.733993,\n 32.363718\n ],\n [\n 112.860877,\n 32.395552\n ],\n [\n 112.992072,\n 32.378373\n ],\n [\n 113.025949,\n 32.425354\n ],\n [\n 113.118956,\n 32.375846\n ],\n [\n 113.211962,\n 32.431919\n ],\n [\n 113.425693,\n 32.269161\n ],\n [\n 113.624642,\n 32.361191\n ],\n [\n 113.664062,\n 32.422324\n ],\n [\n 113.752757,\n 32.388478\n ],\n [\n 113.758301,\n 32.296476\n ],\n [\n 113.749677,\n 32.272196\n ],\n [\n 113.783554,\n 32.186153\n ],\n [\n 113.728735,\n 32.0833\n ],\n [\n 113.791561,\n 32.036142\n ],\n [\n 113.838373,\n 31.854889\n ],\n [\n 113.954785,\n 31.856413\n ],\n [\n 113.988662,\n 31.750138\n ],\n [\n 114.088444,\n 31.781677\n ],\n [\n 114.135871,\n 31.843707\n ],\n [\n 114.195002,\n 31.850315\n ],\n [\n 114.292936,\n 31.752173\n ],\n [\n 114.448769,\n 31.728257\n ],\n [\n 114.586123,\n 31.762348\n ],\n [\n 114.549783,\n 31.642721\n ],\n [\n 114.560869,\n 31.561185\n ],\n [\n 114.641558,\n 31.582085\n ],\n [\n 114.696376,\n 31.526001\n ],\n [\n 114.778912,\n 31.5209\n ],\n [\n 114.830035,\n 31.458654\n ],\n [\n 115.024056,\n 31.528551\n ],\n [\n 115.088729,\n 31.507638\n ],\n [\n 115.12507,\n 31.598904\n ],\n [\n 115.235323,\n 31.556597\n ],\n [\n 115.22054,\n 31.426494\n ],\n [\n 115.301229,\n 31.384109\n ],\n [\n 115.373909,\n 31.405559\n ],\n [\n 115.372062,\n 31.349368\n ],\n [\n 115.442279,\n 31.346303\n ],\n [\n 115.457677,\n 31.281384\n ],\n [\n 115.516191,\n 31.263485\n ],\n [\n 115.559307,\n 31.160117\n ],\n [\n 115.646155,\n 31.209768\n ],\n [\n 115.700973,\n 31.201068\n ],\n [\n 115.763799,\n 31.118123\n ],\n [\n 115.869125,\n 31.147828\n ],\n [\n 115.938726,\n 31.047409\n ],\n [\n 116.058834,\n 31.012545\n ],\n [\n 116.071769,\n 30.956633\n ],\n [\n 115.976298,\n 30.931488\n ],\n [\n 115.865429,\n 30.864231\n ],\n [\n 115.851262,\n 30.756829\n ],\n [\n 115.782893,\n 30.751687\n ],\n [\n 115.762567,\n 30.685848\n ],\n [\n 115.819234,\n 30.59782\n ],\n [\n 115.876516,\n 30.582368\n ],\n [\n 115.921479,\n 30.416364\n ],\n [\n 115.903001,\n 30.313631\n ],\n [\n 115.985537,\n 30.290901\n ],\n [\n 116.065609,\n 30.204584\n ],\n [\n 116.091479,\n 30.036385\n ],\n [\n 116.073616,\n 29.970061\n ],\n [\n 116.127203,\n 29.899544\n ],\n [\n 116.13521,\n 29.819634\n ],\n [\n 115.965827,\n 29.724593\n ],\n [\n 115.837096,\n 29.748491\n ],\n [\n 115.667712,\n 29.850257\n ],\n [\n 115.511264,\n 29.839877\n ],\n [\n 115.471844,\n 29.742777\n ],\n [\n 115.359127,\n 29.646623\n ],\n [\n 115.142316,\n 29.651822\n ],\n [\n 115.154019,\n 29.51029\n ],\n [\n 115.00065,\n 29.572235\n ],\n [\n 114.940904,\n 29.494147\n ],\n [\n 114.860216,\n 29.475917\n ],\n [\n 114.931049,\n 29.422252\n ],\n [\n 114.759818,\n 29.363345\n ],\n [\n 114.660652,\n 29.393585\n ],\n [\n 114.519602,\n 29.325271\n ],\n [\n 114.259059,\n 29.344049\n ],\n [\n 114.252284,\n 29.234985\n ],\n [\n 114.061959,\n 29.204176\n ],\n [\n 113.952321,\n 29.092871\n ],\n [\n 113.94185,\n 29.047374\n ],\n [\n 113.877793,\n 29.035343\n ],\n [\n 113.816199,\n 29.105419\n ],\n [\n 113.749677,\n 29.060973\n ],\n [\n 113.66283,\n 29.1697\n ],\n [\n 113.689931,\n 29.230808\n ],\n [\n 113.606779,\n 29.253779\n ],\n [\n 113.686236,\n 29.392021\n ],\n [\n 113.753373,\n 29.43997\n ],\n [\n 113.630801,\n 29.523307\n ],\n [\n 113.736743,\n 29.576918\n ],\n [\n 113.664678,\n 29.683536\n ],\n [\n 113.547033,\n 29.675219\n ],\n [\n 113.566127,\n 29.846105\n ],\n [\n 113.37765,\n 29.703287\n ],\n [\n 113.145441,\n 29.449349\n ],\n [\n 113.078304,\n 29.438407\n ],\n [\n 113.057362,\n 29.522265\n ],\n [\n 112.950188,\n 29.472792\n ],\n [\n 112.912,\n 29.607095\n ],\n [\n 113.004391,\n 29.692892\n ],\n [\n 113.020405,\n 29.772384\n ],\n [\n 112.937869,\n 29.783809\n ],\n [\n 112.939101,\n 29.768229\n ],\n [\n 112.926782,\n 29.763036\n ],\n [\n 112.861493,\n 29.78329\n ],\n [\n 112.79374,\n 29.736023\n ],\n [\n 112.788812,\n 29.681457\n ],\n [\n 112.687182,\n 29.592528\n ],\n [\n 112.439574,\n 29.633622\n ],\n [\n 112.369973,\n 29.542048\n ],\n [\n 112.281278,\n 29.536842\n ],\n [\n 112.303452,\n 29.585244\n ],\n [\n 112.111279,\n 29.659622\n ],\n [\n 112.07617,\n 29.740179\n ],\n [\n 111.95483,\n 29.796791\n ],\n [\n 111.962222,\n 29.837282\n ],\n [\n 111.862439,\n 29.856484\n ],\n [\n 111.807005,\n 29.904213\n ],\n [\n 111.723853,\n 29.909399\n ],\n [\n 111.723853,\n 29.909399\n ],\n [\n 111.709686,\n 29.897988\n ],\n [\n 111.709686,\n 29.897988\n ],\n [\n 111.39063,\n 29.914585\n ],\n [\n 111.244036,\n 30.039492\n ],\n [\n 110.929907,\n 30.063316\n ],\n [\n 110.924364,\n 30.111463\n ],\n [\n 110.746973,\n 30.113015\n ],\n [\n 110.712481,\n 30.033277\n ],\n [\n 110.650887,\n 30.077814\n ],\n [\n 110.497518,\n 30.05503\n ],\n [\n 110.557264,\n 29.988201\n ],\n [\n 110.498134,\n 29.910955\n ],\n [\n 110.60038,\n 29.839877\n ],\n [\n 110.642264,\n 29.777578\n ],\n [\n 110.507373,\n 29.691853\n ],\n [\n 110.360779,\n 29.635702\n ],\n [\n 110.219729,\n 29.746413\n ],\n [\n 110.113788,\n 29.789521\n ],\n [\n 110.02386,\n 29.769788\n ],\n [\n 109.869876,\n 29.774462\n ],\n [\n 109.775637,\n 29.755244\n ],\n [\n 109.714043,\n 29.673139\n ],\n [\n 109.717739,\n 29.614897\n ],\n [\n 109.516326,\n 29.62582\n ],\n [\n 109.458428,\n 29.513414\n ],\n [\n 109.343863,\n 29.369602\n ],\n [\n 109.352487,\n 29.284574\n ],\n [\n 109.258248,\n 29.21932\n ],\n [\n 109.274262,\n 29.122146\n ],\n [\n 109.232378,\n 29.119533\n ]\n ]\n ],\n [\n [\n [\n 113.020405,\n 29.772384\n ],\n [\n 112.926782,\n 29.692372\n ],\n [\n 112.926782,\n 29.763036\n ],\n [\n 112.939101,\n 29.768229\n ],\n [\n 112.937869,\n 29.783809\n ],\n [\n 113.020405,\n 29.772384\n ]\n ]\n ],\n [\n [\n [\n 111.032769,\n 33.209265\n ],\n [\n 111.056791,\n 33.192743\n ],\n [\n 111.031537,\n 33.17722\n ],\n [\n 111.037081,\n 33.187235\n ],\n [\n 111.032769,\n 33.209265\n ]\n ]\n ],\n [\n [\n [\n 109.106111,\n 30.57052\n ],\n [\n 109.09872,\n 30.579277\n ],\n [\n 109.100567,\n 30.580823\n ],\n [\n 109.106727,\n 30.572066\n ],\n [\n 109.106111,\n 30.57052\n ]\n ]\n ],\n [\n [\n [\n 112.732146,\n 32.362707\n ],\n [\n 112.730914,\n 32.363212\n ],\n [\n 112.729066,\n 32.366245\n ],\n [\n 112.733993,\n 32.363718\n ],\n [\n 112.732146,\n 32.362707\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 430000,\n \"name\": \"湖南省\",\n \"center\": [\n 112.982279,\n 28.19409\n ],\n \"centroid\": [\n 111.754313,\n 27.655081\n ],\n \"childrenNum\": 14,\n \"level\": \"province\",\n \"subFeatureIndex\": 17,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 109.965962,\n 26.195699\n ],\n [\n 110.017701,\n 26.343246\n ],\n [\n 109.932701,\n 26.476145\n ],\n [\n 109.856325,\n 26.465433\n ],\n [\n 109.892665,\n 26.525408\n ],\n [\n 109.82676,\n 26.605681\n ],\n [\n 109.946252,\n 26.685899\n ],\n [\n 109.838463,\n 26.72759\n ],\n [\n 109.821216,\n 26.781017\n ],\n [\n 109.652449,\n 26.76232\n ],\n [\n 109.660456,\n 26.709419\n ],\n [\n 109.590855,\n 26.686433\n ],\n [\n 109.529261,\n 26.740414\n ],\n [\n 109.548971,\n 26.737208\n ],\n [\n 109.548971,\n 26.737208\n ],\n [\n 109.528029,\n 26.744689\n ],\n [\n 109.52187,\n 26.748964\n ],\n [\n 109.504624,\n 26.805051\n ],\n [\n 109.500928,\n 26.828546\n ],\n [\n 109.486761,\n 26.895267\n ],\n [\n 109.555131,\n 26.947015\n ],\n [\n 109.520022,\n 27.058433\n ],\n [\n 109.454733,\n 27.069622\n ],\n [\n 109.472595,\n 27.135136\n ],\n [\n 109.415928,\n 27.15377\n ],\n [\n 109.267487,\n 27.128746\n ],\n [\n 109.164625,\n 27.065893\n ],\n [\n 109.07901,\n 27.115965\n ],\n [\n 108.87575,\n 26.999273\n ],\n [\n 108.791366,\n 27.084539\n ],\n [\n 108.878829,\n 27.106378\n ],\n [\n 108.907162,\n 27.2054\n ],\n [\n 109.040821,\n 27.276151\n ],\n [\n 109.142451,\n 27.418051\n ],\n [\n 109.202197,\n 27.449913\n ],\n [\n 109.300132,\n 27.423893\n ],\n [\n 109.303211,\n 27.475396\n ],\n [\n 109.461508,\n 27.567724\n ],\n [\n 109.470747,\n 27.68011\n ],\n [\n 109.332777,\n 27.782853\n ],\n [\n 109.345711,\n 27.840537\n ],\n [\n 109.30198,\n 27.956342\n ],\n [\n 109.378972,\n 28.032948\n ],\n [\n 109.298284,\n 28.036117\n ],\n [\n 109.340168,\n 28.190216\n ],\n [\n 109.388211,\n 28.268236\n ],\n [\n 109.27303,\n 28.310386\n ],\n [\n 109.274262,\n 28.494592\n ],\n [\n 109.321074,\n 28.581322\n ],\n [\n 109.304443,\n 28.623871\n ],\n [\n 109.201581,\n 28.598133\n ],\n [\n 109.2989,\n 28.747221\n ],\n [\n 109.241002,\n 28.776594\n ],\n [\n 109.235458,\n 28.882476\n ],\n [\n 109.319842,\n 29.042667\n ],\n [\n 109.232378,\n 29.119533\n ],\n [\n 109.274262,\n 29.122146\n ],\n [\n 109.258248,\n 29.21932\n ],\n [\n 109.352487,\n 29.284574\n ],\n [\n 109.343863,\n 29.369602\n ],\n [\n 109.458428,\n 29.513414\n ],\n [\n 109.516326,\n 29.62582\n ],\n [\n 109.717739,\n 29.614897\n ],\n [\n 109.714043,\n 29.673139\n ],\n [\n 109.775637,\n 29.755244\n ],\n [\n 109.869876,\n 29.774462\n ],\n [\n 110.02386,\n 29.769788\n ],\n [\n 110.113788,\n 29.789521\n ],\n [\n 110.219729,\n 29.746413\n ],\n [\n 110.360779,\n 29.635702\n ],\n [\n 110.507373,\n 29.691853\n ],\n [\n 110.642264,\n 29.777578\n ],\n [\n 110.60038,\n 29.839877\n ],\n [\n 110.498134,\n 29.910955\n ],\n [\n 110.557264,\n 29.988201\n ],\n [\n 110.497518,\n 30.05503\n ],\n [\n 110.650887,\n 30.077814\n ],\n [\n 110.712481,\n 30.033277\n ],\n [\n 110.746973,\n 30.113015\n ],\n [\n 110.924364,\n 30.111463\n ],\n [\n 110.929907,\n 30.063316\n ],\n [\n 111.244036,\n 30.039492\n ],\n [\n 111.39063,\n 29.914585\n ],\n [\n 111.709686,\n 29.897988\n ],\n [\n 111.709686,\n 29.897988\n ],\n [\n 111.723853,\n 29.909399\n ],\n [\n 111.723853,\n 29.909399\n ],\n [\n 111.807005,\n 29.904213\n ],\n [\n 111.862439,\n 29.856484\n ],\n [\n 111.962222,\n 29.837282\n ],\n [\n 111.95483,\n 29.796791\n ],\n [\n 112.07617,\n 29.740179\n ],\n [\n 112.111279,\n 29.659622\n ],\n [\n 112.303452,\n 29.585244\n ],\n [\n 112.281278,\n 29.536842\n ],\n [\n 112.369973,\n 29.542048\n ],\n [\n 112.439574,\n 29.633622\n ],\n [\n 112.687182,\n 29.592528\n ],\n [\n 112.788812,\n 29.681457\n ],\n [\n 112.79374,\n 29.736023\n ],\n [\n 112.861493,\n 29.78329\n ],\n [\n 112.926782,\n 29.763036\n ],\n [\n 112.926782,\n 29.692372\n ],\n [\n 113.020405,\n 29.772384\n ],\n [\n 113.004391,\n 29.692892\n ],\n [\n 112.912,\n 29.607095\n ],\n [\n 112.950188,\n 29.472792\n ],\n [\n 113.057362,\n 29.522265\n ],\n [\n 113.078304,\n 29.438407\n ],\n [\n 113.145441,\n 29.449349\n ],\n [\n 113.37765,\n 29.703287\n ],\n [\n 113.566127,\n 29.846105\n ],\n [\n 113.547033,\n 29.675219\n ],\n [\n 113.664678,\n 29.683536\n ],\n [\n 113.736743,\n 29.576918\n ],\n [\n 113.630801,\n 29.523307\n ],\n [\n 113.753373,\n 29.43997\n ],\n [\n 113.686236,\n 29.392021\n ],\n [\n 113.606779,\n 29.253779\n ],\n [\n 113.689931,\n 29.230808\n ],\n [\n 113.66283,\n 29.1697\n ],\n [\n 113.749677,\n 29.060973\n ],\n [\n 113.816199,\n 29.105419\n ],\n [\n 113.877793,\n 29.035343\n ],\n [\n 113.94185,\n 29.047374\n ],\n [\n 113.966488,\n 28.945326\n ],\n [\n 114.008988,\n 28.955273\n ],\n [\n 114.076741,\n 28.834266\n ],\n [\n 114.152502,\n 28.83479\n ],\n [\n 114.157429,\n 28.761384\n ],\n [\n 114.08598,\n 28.558201\n ],\n [\n 114.218407,\n 28.484601\n ],\n [\n 114.172212,\n 28.432524\n ],\n [\n 114.252284,\n 28.395687\n ],\n [\n 114.25598,\n 28.323554\n ],\n [\n 114.107538,\n 28.182833\n ],\n [\n 113.992357,\n 28.161207\n ],\n [\n 114.047176,\n 28.05724\n ],\n [\n 113.914133,\n 27.991218\n ],\n [\n 113.864242,\n 28.004954\n ],\n [\n 113.752141,\n 27.933614\n ],\n [\n 113.729967,\n 27.887086\n ],\n [\n 113.763228,\n 27.799262\n ],\n [\n 113.607395,\n 27.625522\n ],\n [\n 113.583374,\n 27.524754\n ],\n [\n 113.632033,\n 27.405303\n ],\n [\n 113.616635,\n 27.345264\n ],\n [\n 113.872865,\n 27.385116\n ],\n [\n 113.848844,\n 27.225087\n ],\n [\n 113.779242,\n 27.137265\n ],\n [\n 113.821126,\n 27.037651\n ],\n [\n 113.927068,\n 26.949149\n ],\n [\n 113.834677,\n 26.803983\n ],\n [\n 113.860546,\n 26.663978\n ],\n [\n 113.915365,\n 26.613706\n ],\n [\n 114.106306,\n 26.576254\n ],\n [\n 114.073046,\n 26.480965\n ],\n [\n 114.085364,\n 26.4065\n ],\n [\n 114.030546,\n 26.376485\n ],\n [\n 114.029314,\n 26.266545\n ],\n [\n 113.944314,\n 26.16402\n ],\n [\n 114.088444,\n 26.168316\n ],\n [\n 114.181451,\n 26.214489\n ],\n [\n 114.237501,\n 26.152204\n ],\n [\n 114.044096,\n 26.076452\n ],\n [\n 114.007756,\n 26.007104\n ],\n [\n 114.028082,\n 25.893586\n ],\n [\n 113.971416,\n 25.835979\n ],\n [\n 113.913517,\n 25.701272\n ],\n [\n 113.983118,\n 25.599332\n ],\n [\n 113.94493,\n 25.441667\n ],\n [\n 113.887032,\n 25.436804\n ],\n [\n 113.822974,\n 25.331935\n ],\n [\n 113.753373,\n 25.362756\n ],\n [\n 113.611707,\n 25.326527\n ],\n [\n 113.611707,\n 25.326527\n ],\n [\n 113.535946,\n 25.368704\n ],\n [\n 113.449715,\n 25.359512\n ],\n [\n 113.373338,\n 25.402758\n ],\n [\n 113.311129,\n 25.490284\n ],\n [\n 113.248919,\n 25.514045\n ],\n [\n 113.11834,\n 25.445449\n ],\n [\n 113.080151,\n 25.3833\n ],\n [\n 112.900297,\n 25.311383\n ],\n [\n 112.867036,\n 25.249706\n ],\n [\n 112.992688,\n 25.247\n ],\n [\n 113.034572,\n 25.198285\n ],\n [\n 112.96805,\n 25.141426\n ],\n [\n 113.018557,\n 25.082914\n ],\n [\n 112.979137,\n 25.034133\n ],\n [\n 113.011782,\n 24.946279\n ],\n [\n 112.871348,\n 24.895816\n ],\n [\n 112.780805,\n 24.896901\n ],\n [\n 112.712436,\n 25.083456\n ],\n [\n 112.660081,\n 25.132759\n ],\n [\n 112.414937,\n 25.142509\n ],\n [\n 112.369357,\n 25.189081\n ],\n [\n 112.3053,\n 25.157132\n ],\n [\n 112.187039,\n 25.182584\n ],\n [\n 112.155626,\n 25.026544\n ],\n [\n 112.119902,\n 24.963638\n ],\n [\n 112.175337,\n 24.92729\n ],\n [\n 112.171025,\n 24.86379\n ],\n [\n 112.097112,\n 24.826327\n ],\n [\n 112.024431,\n 24.739955\n ],\n [\n 111.951135,\n 24.769839\n ],\n [\n 111.68936,\n 24.778531\n ],\n [\n 111.570484,\n 24.644821\n ],\n [\n 111.431282,\n 24.687776\n ],\n [\n 111.479325,\n 24.797543\n ],\n [\n 111.470086,\n 24.928917\n ],\n [\n 111.43313,\n 24.97991\n ],\n [\n 111.435593,\n 25.09321\n ],\n [\n 111.321645,\n 25.10513\n ],\n [\n 111.274833,\n 25.151175\n ],\n [\n 111.200921,\n 25.074786\n ],\n [\n 111.101754,\n 25.035218\n ],\n [\n 111.100522,\n 24.945736\n ],\n [\n 110.991501,\n 24.924034\n ],\n [\n 110.951465,\n 25.043891\n ],\n [\n 110.998892,\n 25.161465\n ],\n [\n 111.112841,\n 25.217232\n ],\n [\n 111.103602,\n 25.284877\n ],\n [\n 111.301319,\n 25.450851\n ],\n [\n 111.343202,\n 25.602569\n ],\n [\n 111.30871,\n 25.72014\n ],\n [\n 111.442369,\n 25.771877\n ],\n [\n 111.43313,\n 25.84621\n ],\n [\n 111.49226,\n 25.868824\n ],\n [\n 111.346282,\n 25.906504\n ],\n [\n 111.252043,\n 25.864517\n ],\n [\n 111.189834,\n 25.953318\n ],\n [\n 111.267442,\n 26.058716\n ],\n [\n 111.279761,\n 26.271911\n ],\n [\n 111.204616,\n 26.307852\n ],\n [\n 111.092515,\n 26.306779\n ],\n [\n 110.94469,\n 26.373805\n ],\n [\n 110.939146,\n 26.28425\n ],\n [\n 110.76114,\n 26.248838\n ],\n [\n 110.612083,\n 26.333594\n ],\n [\n 110.555416,\n 26.286396\n ],\n [\n 110.516612,\n 26.186035\n ],\n [\n 110.373098,\n 26.08935\n ],\n [\n 110.325671,\n 25.975373\n ],\n [\n 110.257301,\n 25.961388\n ],\n [\n 110.201251,\n 26.066241\n ],\n [\n 110.165527,\n 26.023773\n ],\n [\n 110.065128,\n 26.051191\n ],\n [\n 110.099005,\n 26.16939\n ],\n [\n 109.965962,\n 26.195699\n ]\n ]\n ],\n [\n [\n [\n 109.48245,\n 26.029687\n ],\n [\n 109.449805,\n 26.101709\n ],\n [\n 109.486761,\n 26.148445\n ],\n [\n 109.486761,\n 26.148445\n ],\n [\n 109.439334,\n 26.238641\n ],\n [\n 109.466435,\n 26.314288\n ],\n [\n 109.340784,\n 26.264399\n ],\n [\n 109.285965,\n 26.296052\n ],\n [\n 109.326001,\n 26.427398\n ],\n [\n 109.407305,\n 26.532902\n ],\n [\n 109.35495,\n 26.693383\n ],\n [\n 109.454117,\n 26.761252\n ],\n [\n 109.52187,\n 26.748964\n ],\n [\n 109.528029,\n 26.744689\n ],\n [\n 109.529261,\n 26.740414\n ],\n [\n 109.590855,\n 26.686433\n ],\n [\n 109.660456,\n 26.709419\n ],\n [\n 109.652449,\n 26.76232\n ],\n [\n 109.821216,\n 26.781017\n ],\n [\n 109.838463,\n 26.72759\n ],\n [\n 109.946252,\n 26.685899\n ],\n [\n 109.82676,\n 26.605681\n ],\n [\n 109.892665,\n 26.525408\n ],\n [\n 109.856325,\n 26.465433\n ],\n [\n 109.932701,\n 26.476145\n ],\n [\n 110.017701,\n 26.343246\n ],\n [\n 109.965962,\n 26.195699\n ],\n [\n 109.906832,\n 26.143611\n ],\n [\n 109.864332,\n 26.027537\n ],\n [\n 109.783028,\n 25.988282\n ],\n [\n 109.806434,\n 25.874746\n ],\n [\n 109.685094,\n 25.880129\n ],\n [\n 109.730057,\n 25.989895\n ],\n [\n 109.635203,\n 26.047428\n ],\n [\n 109.513247,\n 25.997962\n ],\n [\n 109.48245,\n 26.029687\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 440000,\n \"name\": \"广东省\",\n \"center\": [\n 113.280637,\n 23.125178\n ],\n \"centroid\": [\n 113.429877,\n 23.334664\n ],\n \"childrenNum\": 22,\n \"level\": \"province\",\n \"subFeatureIndex\": 18,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 109.785492,\n 21.457116\n ],\n [\n 109.742992,\n 21.61629\n ],\n [\n 109.898209,\n 21.649661\n ],\n [\n 109.940709,\n 21.734723\n ],\n [\n 109.94502,\n 21.844172\n ],\n [\n 110.051578,\n 21.856945\n ],\n [\n 110.119947,\n 21.901918\n ],\n [\n 110.200019,\n 21.898587\n ],\n [\n 110.200019,\n 21.898587\n ],\n [\n 110.388497,\n 21.89026\n ],\n [\n 110.355236,\n 22.061709\n ],\n [\n 110.355236,\n 22.061709\n ],\n [\n 110.350924,\n 22.072799\n ],\n [\n 110.350924,\n 22.072799\n ],\n [\n 110.414366,\n 22.20858\n ],\n [\n 110.488895,\n 22.144863\n ],\n [\n 110.560344,\n 22.196393\n ],\n [\n 110.629329,\n 22.149296\n ],\n [\n 110.646575,\n 22.222982\n ],\n [\n 110.725415,\n 22.295522\n ],\n [\n 110.785777,\n 22.294415\n ],\n [\n 110.711249,\n 22.369684\n ],\n [\n 110.778386,\n 22.585304\n ],\n [\n 111.055559,\n 22.648268\n ],\n [\n 111.056791,\n 22.72776\n ],\n [\n 111.202152,\n 22.740452\n ],\n [\n 111.358601,\n 22.889362\n ],\n [\n 111.363528,\n 22.968713\n ],\n [\n 111.433746,\n 23.036456\n ],\n [\n 111.377695,\n 23.082149\n ],\n [\n 111.388782,\n 23.210337\n ],\n [\n 111.353673,\n 23.28895\n ],\n [\n 111.399869,\n 23.469638\n ],\n [\n 111.479941,\n 23.532738\n ],\n [\n 111.487332,\n 23.62651\n ],\n [\n 111.615448,\n 23.639117\n ],\n [\n 111.667187,\n 23.718023\n ],\n [\n 111.621607,\n 23.725692\n ],\n [\n 111.664723,\n 23.83465\n ],\n [\n 111.8107,\n 23.806735\n ],\n [\n 111.812548,\n 23.887727\n ],\n [\n 111.940664,\n 23.987803\n ],\n [\n 111.878454,\n 24.110195\n ],\n [\n 111.877838,\n 24.229196\n ],\n [\n 111.939432,\n 24.230287\n ],\n [\n 112.029975,\n 24.297925\n ],\n [\n 112.057692,\n 24.387327\n ],\n [\n 111.985011,\n 24.467953\n ],\n [\n 112.007185,\n 24.534376\n ],\n [\n 111.937584,\n 24.595323\n ],\n [\n 111.961606,\n 24.720934\n ],\n [\n 112.024431,\n 24.739955\n ],\n [\n 112.097112,\n 24.826327\n ],\n [\n 112.171025,\n 24.86379\n ],\n [\n 112.175337,\n 24.92729\n ],\n [\n 112.119902,\n 24.963638\n ],\n [\n 112.155626,\n 25.026544\n ],\n [\n 112.187039,\n 25.182584\n ],\n [\n 112.3053,\n 25.157132\n ],\n [\n 112.369357,\n 25.189081\n ],\n [\n 112.414937,\n 25.142509\n ],\n [\n 112.660081,\n 25.132759\n ],\n [\n 112.712436,\n 25.083456\n ],\n [\n 112.780805,\n 24.896901\n ],\n [\n 112.871348,\n 24.895816\n ],\n [\n 113.011782,\n 24.946279\n ],\n [\n 112.979137,\n 25.034133\n ],\n [\n 113.018557,\n 25.082914\n ],\n [\n 112.96805,\n 25.141426\n ],\n [\n 113.034572,\n 25.198285\n ],\n [\n 112.992688,\n 25.247\n ],\n [\n 112.867036,\n 25.249706\n ],\n [\n 112.900297,\n 25.311383\n ],\n [\n 113.080151,\n 25.3833\n ],\n [\n 113.11834,\n 25.445449\n ],\n [\n 113.248919,\n 25.514045\n ],\n [\n 113.311129,\n 25.490284\n ],\n [\n 113.373338,\n 25.402758\n ],\n [\n 113.449715,\n 25.359512\n ],\n [\n 113.535946,\n 25.368704\n ],\n [\n 113.611707,\n 25.326527\n ],\n [\n 113.611707,\n 25.326527\n ],\n [\n 113.753373,\n 25.362756\n ],\n [\n 113.822974,\n 25.331935\n ],\n [\n 113.887032,\n 25.436804\n ],\n [\n 113.94493,\n 25.441667\n ],\n [\n 114.051488,\n 25.348699\n ],\n [\n 114.039785,\n 25.250789\n ],\n [\n 114.13156,\n 25.30922\n ],\n [\n 114.262755,\n 25.29191\n ],\n [\n 114.31511,\n 25.338424\n ],\n [\n 114.381015,\n 25.31571\n ],\n [\n 114.535616,\n 25.41681\n ],\n [\n 114.63663,\n 25.324364\n ],\n [\n 114.743188,\n 25.274597\n ],\n [\n 114.679746,\n 25.194495\n ],\n [\n 114.735796,\n 25.121925\n ],\n [\n 114.640326,\n 25.073702\n ],\n [\n 114.561485,\n 25.077495\n ],\n [\n 114.506051,\n 24.999975\n ],\n [\n 114.395798,\n 24.951161\n ],\n [\n 114.403189,\n 24.877361\n ],\n [\n 114.33482,\n 24.747562\n ],\n [\n 114.27261,\n 24.700279\n ],\n [\n 114.169132,\n 24.689407\n ],\n [\n 114.258443,\n 24.641558\n ],\n [\n 114.308334,\n 24.574104\n ],\n [\n 114.391486,\n 24.562677\n ],\n [\n 114.428443,\n 24.486468\n ],\n [\n 114.534384,\n 24.558867\n ],\n [\n 114.589819,\n 24.537642\n ],\n [\n 114.664963,\n 24.583898\n ],\n [\n 114.704999,\n 24.526211\n ],\n [\n 114.729637,\n 24.608924\n ],\n [\n 114.868839,\n 24.562132\n ],\n [\n 114.909491,\n 24.661679\n ],\n [\n 115.056701,\n 24.703541\n ],\n [\n 115.095505,\n 24.674184\n ],\n [\n 115.308004,\n 24.758429\n ],\n [\n 115.358511,\n 24.735064\n ],\n [\n 115.412714,\n 24.792654\n ],\n [\n 115.556227,\n 24.682883\n ],\n [\n 115.573474,\n 24.617083\n ],\n [\n 115.67264,\n 24.604028\n ],\n [\n 115.688038,\n 24.545261\n ],\n [\n 115.845103,\n 24.563221\n ],\n [\n 115.756408,\n 24.749192\n ],\n [\n 115.822313,\n 24.90884\n ],\n [\n 115.907313,\n 24.880075\n ],\n [\n 115.89253,\n 24.937056\n ],\n [\n 116.014486,\n 24.905584\n ],\n [\n 116.068073,\n 24.849675\n ],\n [\n 116.18079,\n 24.87519\n ],\n [\n 116.245464,\n 24.793197\n ],\n [\n 116.376659,\n 24.820353\n ],\n [\n 116.44626,\n 24.714412\n ],\n [\n 116.486912,\n 24.71876\n ],\n [\n 116.525716,\n 24.604572\n ],\n [\n 116.597165,\n 24.65461\n ],\n [\n 116.778867,\n 24.680165\n ],\n [\n 116.815207,\n 24.655154\n ],\n [\n 116.761005,\n 24.58281\n ],\n [\n 116.789338,\n 24.50988\n ],\n [\n 116.860787,\n 24.462507\n ],\n [\n 116.903903,\n 24.369888\n ],\n [\n 116.933468,\n 24.21992\n ],\n [\n 116.998757,\n 24.178988\n ],\n [\n 116.9347,\n 24.127123\n ],\n [\n 116.939627,\n 24.033713\n ],\n [\n 116.981511,\n 23.999282\n ],\n [\n 116.980279,\n 23.881709\n ],\n [\n 117.012308,\n 23.855446\n ],\n [\n 117.053576,\n 23.696657\n ],\n [\n 117.192778,\n 23.629799\n ],\n [\n 117.192778,\n 23.561809\n ],\n [\n 117.054192,\n 23.542064\n ],\n [\n 117.01046,\n 23.502564\n ],\n [\n 116.921765,\n 23.53219\n ],\n [\n 116.874953,\n 23.447683\n ],\n [\n 116.874338,\n 23.447683\n ],\n [\n 116.871258,\n 23.416391\n ],\n [\n 116.871874,\n 23.415842\n ],\n [\n 116.782563,\n 23.313679\n ],\n [\n 116.806584,\n 23.200989\n ],\n [\n 116.74499,\n 23.215286\n ],\n [\n 116.550969,\n 23.109668\n ],\n [\n 116.576839,\n 23.014429\n ],\n [\n 116.50539,\n 22.930696\n ],\n [\n 116.382818,\n 22.919124\n ],\n [\n 116.317528,\n 22.952736\n ],\n [\n 116.226985,\n 22.914715\n ],\n [\n 116.106877,\n 22.817685\n ],\n [\n 116.073616,\n 22.8425\n ],\n [\n 115.883291,\n 22.785142\n ],\n [\n 115.796444,\n 22.739349\n ],\n [\n 115.788437,\n 22.809964\n ],\n [\n 115.654162,\n 22.865657\n ],\n [\n 115.542677,\n 22.76142\n ],\n [\n 115.606119,\n 22.754799\n ],\n [\n 115.57409,\n 22.650477\n ],\n [\n 115.471844,\n 22.697956\n ],\n [\n 115.381301,\n 22.684156\n ],\n [\n 115.338185,\n 22.776867\n ],\n [\n 115.230396,\n 22.776867\n ],\n [\n 115.236555,\n 22.825406\n ],\n [\n 115.054853,\n 22.777419\n ],\n [\n 115.04007,\n 22.712307\n ],\n [\n 114.87623,\n 22.589724\n ],\n [\n 114.747499,\n 22.581437\n ],\n [\n 114.728405,\n 22.651029\n ],\n [\n 114.749963,\n 22.764179\n ],\n [\n 114.709927,\n 22.7879\n ],\n [\n 114.512826,\n 22.655446\n ],\n [\n 114.603369,\n 22.63888\n ],\n [\n 114.559022,\n 22.583094\n ],\n [\n 114.616304,\n 22.54276\n ],\n [\n 114.611377,\n 22.481959\n ],\n [\n 114.485109,\n 22.446572\n ],\n [\n 114.467863,\n 22.533365\n ],\n [\n 114.41058,\n 22.599667\n ],\n [\n 114.232574,\n 22.539997\n ],\n [\n 114.185762,\n 22.551601\n ],\n [\n 114.185762,\n 22.551601\n ],\n [\n 114.045944,\n 22.502413\n ],\n [\n 114.044096,\n 22.502413\n ],\n [\n 114.031778,\n 22.504071\n ],\n [\n 113.959097,\n 22.505177\n ],\n [\n 113.891959,\n 22.442701\n ],\n [\n 113.733663,\n 22.73659\n ],\n [\n 113.678228,\n 22.726104\n ],\n [\n 113.740438,\n 22.53447\n ],\n [\n 113.631417,\n 22.475877\n ],\n [\n 113.669605,\n 22.416154\n ],\n [\n 113.558736,\n 22.213012\n ],\n [\n 113.553809,\n 22.107727\n ],\n [\n 113.442324,\n 22.009575\n ],\n [\n 113.330223,\n 21.961861\n ],\n [\n 113.246455,\n 21.880266\n ],\n [\n 113.091854,\n 22.065591\n ],\n [\n 113.032724,\n 22.072799\n ],\n [\n 113.037652,\n 21.935223\n ],\n [\n 112.944645,\n 21.84195\n ],\n [\n 112.795587,\n 21.923567\n ],\n [\n 112.651458,\n 21.761954\n ],\n [\n 112.523342,\n 21.760842\n ],\n [\n 112.439574,\n 21.803624\n ],\n [\n 112.415553,\n 21.734723\n ],\n [\n 112.24001,\n 21.701371\n ],\n [\n 112.192583,\n 21.78918\n ],\n [\n 112.036134,\n 21.761398\n ],\n [\n 111.951135,\n 21.671904\n ],\n [\n 112.026895,\n 21.633533\n ],\n [\n 111.811316,\n 21.558985\n ],\n [\n 111.810084,\n 21.604609\n ],\n [\n 111.693672,\n 21.590144\n ],\n [\n 111.677658,\n 21.52949\n ],\n [\n 111.382623,\n 21.495534\n ],\n [\n 111.257587,\n 21.413675\n ],\n [\n 111.28284,\n 21.485513\n ],\n [\n 111.061102,\n 21.44932\n ],\n [\n 110.929291,\n 21.375792\n ],\n [\n 110.799328,\n 21.374678\n ],\n [\n 110.626249,\n 21.215797\n ],\n [\n 110.422373,\n 21.190695\n ],\n [\n 110.388497,\n 21.125968\n ],\n [\n 110.296722,\n 21.093594\n ],\n [\n 110.180925,\n 20.981905\n ],\n [\n 110.201251,\n 20.867337\n ],\n [\n 110.390344,\n 20.820367\n ],\n [\n 110.392192,\n 20.682727\n ],\n [\n 110.466105,\n 20.680488\n ],\n [\n 110.548025,\n 20.477715\n ],\n [\n 110.545561,\n 20.42726\n ],\n [\n 110.452554,\n 20.311151\n ],\n [\n 110.349076,\n 20.258958\n ],\n [\n 110.118099,\n 20.219661\n ],\n [\n 110.082375,\n 20.258958\n ],\n [\n 109.910528,\n 20.224152\n ],\n [\n 109.916071,\n 20.316762\n ],\n [\n 109.861252,\n 20.376789\n ],\n [\n 109.888354,\n 20.475473\n ],\n [\n 109.839695,\n 20.489485\n ],\n [\n 109.793499,\n 20.61554\n ],\n [\n 109.74484,\n 20.62114\n ],\n [\n 109.730057,\n 20.719667\n ],\n [\n 109.654913,\n 20.903673\n ],\n [\n 109.674623,\n 21.136572\n ],\n [\n 109.763934,\n 21.226395\n ],\n [\n 109.757775,\n 21.346816\n ],\n [\n 109.868644,\n 21.365763\n ],\n [\n 109.894513,\n 21.44208\n ],\n [\n 109.785492,\n 21.457116\n ]\n ]\n ],\n [\n [\n [\n 117.100387,\n 23.401566\n ],\n [\n 116.946402,\n 23.421881\n ],\n [\n 117.129336,\n 23.483358\n ],\n [\n 117.100387,\n 23.401566\n ]\n ]\n ],\n [\n [\n [\n 112.853486,\n 21.74028\n ],\n [\n 112.804826,\n 21.686361\n ],\n [\n 112.817145,\n 21.590144\n ],\n [\n 112.730914,\n 21.613509\n ],\n [\n 112.782037,\n 21.665788\n ],\n [\n 112.70566,\n 21.679133\n ],\n [\n 112.831312,\n 21.77529\n ],\n [\n 112.853486,\n 21.74028\n ]\n ]\n ],\n [\n [\n [\n 112.625588,\n 21.616847\n ],\n [\n 112.535045,\n 21.628527\n ],\n [\n 112.663776,\n 21.714157\n ],\n [\n 112.625588,\n 21.616847\n ]\n ]\n ],\n [\n [\n [\n 110.495054,\n 21.075171\n ],\n [\n 110.560344,\n 21.061213\n ],\n [\n 110.535706,\n 20.923235\n ],\n [\n 110.47288,\n 20.983022\n ],\n [\n 110.347845,\n 20.984698\n ],\n [\n 110.201251,\n 20.938324\n ],\n [\n 110.211106,\n 20.986933\n ],\n [\n 110.305961,\n 21.088012\n ],\n [\n 110.495054,\n 21.075171\n ]\n ]\n ],\n [\n [\n [\n 110.501829,\n 21.142711\n ],\n [\n 110.431612,\n 21.181211\n ],\n [\n 110.634256,\n 21.21022\n ],\n [\n 110.582517,\n 21.094711\n ],\n [\n 110.501829,\n 21.142711\n ]\n ]\n ],\n [\n [\n [\n 116.769628,\n 20.771704\n ],\n [\n 116.88604,\n 20.77562\n ],\n [\n 116.934084,\n 20.67657\n ],\n [\n 116.862635,\n 20.588657\n ],\n [\n 116.749302,\n 20.600979\n ],\n [\n 116.849084,\n 20.62842\n ],\n [\n 116.87249,\n 20.738134\n ],\n [\n 116.769628,\n 20.771704\n ]\n ]\n ],\n [\n [\n [\n 110.598532,\n 20.857273\n ],\n [\n 110.548641,\n 20.908703\n ],\n [\n 110.584365,\n 20.948941\n ],\n [\n 110.646575,\n 20.917087\n ],\n [\n 110.598532,\n 20.857273\n ]\n ]\n ],\n [\n [\n [\n 115.943037,\n 21.097502\n ],\n [\n 116.044051,\n 21.11034\n ],\n [\n 116.067457,\n 21.040552\n ],\n [\n 115.989233,\n 21.035526\n ],\n [\n 115.943037,\n 21.097502\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 450000,\n \"name\": \"广西壮族自治区\",\n \"center\": [\n 108.320004,\n 22.82402\n ],\n \"centroid\": [\n 108.794237,\n 23.833575\n ],\n \"childrenNum\": 14,\n \"level\": \"province\",\n \"subFeatureIndex\": 19,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 112.024431,\n 24.739955\n ],\n [\n 111.961606,\n 24.720934\n ],\n [\n 111.937584,\n 24.595323\n ],\n [\n 112.007185,\n 24.534376\n ],\n [\n 111.985011,\n 24.467953\n ],\n [\n 112.057692,\n 24.387327\n ],\n [\n 112.029975,\n 24.297925\n ],\n [\n 111.939432,\n 24.230287\n ],\n [\n 111.877838,\n 24.229196\n ],\n [\n 111.878454,\n 24.110195\n ],\n [\n 111.940664,\n 23.987803\n ],\n [\n 111.812548,\n 23.887727\n ],\n [\n 111.8107,\n 23.806735\n ],\n [\n 111.664723,\n 23.83465\n ],\n [\n 111.621607,\n 23.725692\n ],\n [\n 111.667187,\n 23.718023\n ],\n [\n 111.615448,\n 23.639117\n ],\n [\n 111.487332,\n 23.62651\n ],\n [\n 111.479941,\n 23.532738\n ],\n [\n 111.399869,\n 23.469638\n ],\n [\n 111.353673,\n 23.28895\n ],\n [\n 111.388782,\n 23.210337\n ],\n [\n 111.377695,\n 23.082149\n ],\n [\n 111.433746,\n 23.036456\n ],\n [\n 111.363528,\n 22.968713\n ],\n [\n 111.358601,\n 22.889362\n ],\n [\n 111.202152,\n 22.740452\n ],\n [\n 111.056791,\n 22.72776\n ],\n [\n 111.055559,\n 22.648268\n ],\n [\n 110.778386,\n 22.585304\n ],\n [\n 110.711249,\n 22.369684\n ],\n [\n 110.785777,\n 22.294415\n ],\n [\n 110.725415,\n 22.295522\n ],\n [\n 110.646575,\n 22.222982\n ],\n [\n 110.629329,\n 22.149296\n ],\n [\n 110.560344,\n 22.196393\n ],\n [\n 110.488895,\n 22.144863\n ],\n [\n 110.414366,\n 22.20858\n ],\n [\n 110.350924,\n 22.072799\n ],\n [\n 110.350924,\n 22.072799\n ],\n [\n 110.355236,\n 22.061709\n ],\n [\n 110.355236,\n 22.061709\n ],\n [\n 110.388497,\n 21.89026\n ],\n [\n 110.200019,\n 21.898587\n ],\n [\n 110.200019,\n 21.898587\n ],\n [\n 110.119947,\n 21.901918\n ],\n [\n 110.051578,\n 21.856945\n ],\n [\n 109.94502,\n 21.844172\n ],\n [\n 109.940709,\n 21.734723\n ],\n [\n 109.898209,\n 21.649661\n ],\n [\n 109.742992,\n 21.61629\n ],\n [\n 109.785492,\n 21.457116\n ],\n [\n 109.704188,\n 21.462684\n ],\n [\n 109.612413,\n 21.55676\n ],\n [\n 109.540964,\n 21.466025\n ],\n [\n 109.245929,\n 21.425929\n ],\n [\n 109.138756,\n 21.389163\n ],\n [\n 109.042669,\n 21.464355\n ],\n [\n 109.150459,\n 21.523924\n ],\n [\n 109.142451,\n 21.56455\n ],\n [\n 108.937959,\n 21.589588\n ],\n [\n 108.881293,\n 21.627415\n ],\n [\n 108.74517,\n 21.599046\n ],\n [\n 108.710062,\n 21.646881\n ],\n [\n 108.591802,\n 21.677465\n ],\n [\n 108.479085,\n 21.546743\n ],\n [\n 108.338651,\n 21.541177\n ],\n [\n 108.230245,\n 21.49108\n ],\n [\n 108.235173,\n 21.60294\n ],\n [\n 108.106441,\n 21.508895\n ],\n [\n 108.030681,\n 21.546186\n ],\n [\n 107.956768,\n 21.535055\n ],\n [\n 107.860066,\n 21.651886\n ],\n [\n 107.546553,\n 21.58625\n ],\n [\n 107.46956,\n 21.659671\n ],\n [\n 107.388256,\n 21.594039\n ],\n [\n 107.310648,\n 21.733611\n ],\n [\n 107.247206,\n 21.703039\n ],\n [\n 107.088294,\n 21.805291\n ],\n [\n 107.011917,\n 21.826399\n ],\n [\n 107.05996,\n 21.915241\n ],\n [\n 106.999598,\n 21.947433\n ],\n [\n 106.73844,\n 22.007911\n ],\n [\n 106.681158,\n 21.995152\n ],\n [\n 106.717498,\n 22.074463\n ],\n [\n 106.673151,\n 22.182543\n ],\n [\n 106.7021,\n 22.206918\n ],\n [\n 106.663296,\n 22.330948\n ],\n [\n 106.562282,\n 22.34589\n ],\n [\n 106.562282,\n 22.462608\n ],\n [\n 106.61402,\n 22.601876\n ],\n [\n 106.710723,\n 22.57536\n ],\n [\n 106.768621,\n 22.739349\n ],\n [\n 106.841302,\n 22.799484\n ],\n [\n 106.606013,\n 22.925737\n ],\n [\n 106.366413,\n 22.857939\n ],\n [\n 106.286957,\n 22.86676\n ],\n [\n 106.206885,\n 22.978629\n ],\n [\n 106.019639,\n 22.990747\n ],\n [\n 105.994385,\n 22.93786\n ],\n [\n 105.893987,\n 22.936758\n ],\n [\n 105.724604,\n 23.062332\n ],\n [\n 105.574931,\n 23.066186\n ],\n [\n 105.542902,\n 23.18449\n ],\n [\n 105.531815,\n 23.248275\n ],\n [\n 105.694423,\n 23.363122\n ],\n [\n 105.699966,\n 23.401566\n ],\n [\n 105.815763,\n 23.506953\n ],\n [\n 105.89214,\n 23.525058\n ],\n [\n 105.999929,\n 23.447683\n ],\n [\n 106.141595,\n 23.569487\n ],\n [\n 106.120653,\n 23.605129\n ],\n [\n 106.157609,\n 23.724048\n ],\n [\n 106.136667,\n 23.795238\n ],\n [\n 106.192102,\n 23.824798\n ],\n [\n 106.04982,\n 24.089986\n ],\n [\n 105.933407,\n 24.123847\n ],\n [\n 105.89214,\n 24.040271\n ],\n [\n 105.704278,\n 24.066497\n ],\n [\n 105.649459,\n 24.033167\n ],\n [\n 105.628518,\n 24.126577\n ],\n [\n 105.529967,\n 24.129308\n ],\n [\n 105.481924,\n 24.018958\n ],\n [\n 105.320548,\n 24.116202\n ],\n [\n 105.260186,\n 24.061033\n ],\n [\n 105.20044,\n 24.105279\n ],\n [\n 105.229389,\n 24.165888\n ],\n [\n 105.164715,\n 24.288109\n ],\n [\n 105.188121,\n 24.346995\n ],\n [\n 105.063085,\n 24.429281\n ],\n [\n 105.063085,\n 24.429281\n ],\n [\n 104.979933,\n 24.412937\n ],\n [\n 104.83642,\n 24.446712\n ],\n [\n 104.72863,\n 24.446167\n ],\n [\n 104.70892,\n 24.321372\n ],\n [\n 104.610986,\n 24.376973\n ],\n [\n 104.492109,\n 24.656241\n ],\n [\n 104.529682,\n 24.73126\n ],\n [\n 104.63316,\n 24.65896\n ],\n [\n 104.743413,\n 24.621978\n ],\n [\n 104.841963,\n 24.676359\n ],\n [\n 104.899245,\n 24.752996\n ],\n [\n 105.03352,\n 24.787765\n ],\n [\n 105.077868,\n 24.918065\n ],\n [\n 105.082179,\n 24.915895\n ],\n [\n 105.096346,\n 24.928375\n ],\n [\n 105.09573,\n 24.928375\n ],\n [\n 105.198592,\n 24.995095\n ],\n [\n 105.265729,\n 24.930003\n ],\n [\n 105.365511,\n 24.943566\n ],\n [\n 105.445584,\n 24.918608\n ],\n [\n 105.500402,\n 24.807862\n ],\n [\n 105.70551,\n 24.768752\n ],\n [\n 105.827466,\n 24.702997\n ],\n [\n 105.942031,\n 24.724738\n ],\n [\n 106.023335,\n 24.632313\n ],\n [\n 106.045508,\n 24.681796\n ],\n [\n 106.173008,\n 24.760059\n ],\n [\n 106.206269,\n 24.851304\n ],\n [\n 106.146522,\n 24.948449\n ],\n [\n 106.215508,\n 24.982079\n ],\n [\n 106.304819,\n 24.973944\n ],\n [\n 106.590615,\n 25.087791\n ],\n [\n 106.684238,\n 25.178252\n ],\n [\n 106.732281,\n 25.162548\n ],\n [\n 106.900432,\n 25.194495\n ],\n [\n 106.912751,\n 25.243212\n ],\n [\n 107.013765,\n 25.275138\n ],\n [\n 107.012533,\n 25.353024\n ],\n [\n 106.963874,\n 25.437884\n ],\n [\n 107.066736,\n 25.509186\n ],\n [\n 107.064272,\n 25.559395\n ],\n [\n 107.228728,\n 25.604728\n ],\n [\n 107.336517,\n 25.461116\n ],\n [\n 107.318039,\n 25.401677\n ],\n [\n 107.420901,\n 25.393029\n ],\n [\n 107.432604,\n 25.289205\n ],\n [\n 107.481263,\n 25.300024\n ],\n [\n 107.472024,\n 25.213984\n ],\n [\n 107.599523,\n 25.250789\n ],\n [\n 107.659885,\n 25.316251\n ],\n [\n 107.700537,\n 25.193954\n ],\n [\n 107.741805,\n 25.239965\n ],\n [\n 107.841587,\n 25.115966\n ],\n [\n 108.001732,\n 25.196661\n ],\n [\n 108.115065,\n 25.210195\n ],\n [\n 108.152021,\n 25.324364\n ],\n [\n 108.142782,\n 25.390867\n ],\n [\n 108.348506,\n 25.536183\n ],\n [\n 108.418723,\n 25.443287\n ],\n [\n 108.471693,\n 25.458955\n ],\n [\n 108.625062,\n 25.308138\n ],\n [\n 108.6072,\n 25.491904\n ],\n [\n 108.68912,\n 25.623072\n ],\n [\n 108.763649,\n 25.637097\n ],\n [\n 108.781511,\n 25.554537\n ],\n [\n 108.949046,\n 25.557236\n ],\n [\n 109.025423,\n 25.512426\n ],\n [\n 109.088249,\n 25.550758\n ],\n [\n 109.030966,\n 25.629545\n ],\n [\n 109.07901,\n 25.720679\n ],\n [\n 109.000785,\n 25.73631\n ],\n [\n 108.953974,\n 25.686714\n ],\n [\n 108.953974,\n 25.686714\n ],\n [\n 108.896076,\n 25.71421\n ],\n [\n 108.989698,\n 25.778881\n ],\n [\n 109.143683,\n 25.795044\n ],\n [\n 109.147995,\n 25.7417\n ],\n [\n 109.3414,\n 25.732537\n ],\n [\n 109.339552,\n 25.834363\n ],\n [\n 109.435022,\n 25.933411\n ],\n [\n 109.408537,\n 25.967305\n ],\n [\n 109.48245,\n 26.029687\n ],\n [\n 109.513247,\n 25.997962\n ],\n [\n 109.635203,\n 26.047428\n ],\n [\n 109.730057,\n 25.989895\n ],\n [\n 109.685094,\n 25.880129\n ],\n [\n 109.806434,\n 25.874746\n ],\n [\n 109.783028,\n 25.988282\n ],\n [\n 109.864332,\n 26.027537\n ],\n [\n 109.906832,\n 26.143611\n ],\n [\n 109.965962,\n 26.195699\n ],\n [\n 110.099005,\n 26.16939\n ],\n [\n 110.065128,\n 26.051191\n ],\n [\n 110.165527,\n 26.023773\n ],\n [\n 110.201251,\n 26.066241\n ],\n [\n 110.257301,\n 25.961388\n ],\n [\n 110.325671,\n 25.975373\n ],\n [\n 110.373098,\n 26.08935\n ],\n [\n 110.516612,\n 26.186035\n ],\n [\n 110.555416,\n 26.286396\n ],\n [\n 110.612083,\n 26.333594\n ],\n [\n 110.76114,\n 26.248838\n ],\n [\n 110.939146,\n 26.28425\n ],\n [\n 110.94469,\n 26.373805\n ],\n [\n 111.092515,\n 26.306779\n ],\n [\n 111.204616,\n 26.307852\n ],\n [\n 111.279761,\n 26.271911\n ],\n [\n 111.267442,\n 26.058716\n ],\n [\n 111.189834,\n 25.953318\n ],\n [\n 111.252043,\n 25.864517\n ],\n [\n 111.346282,\n 25.906504\n ],\n [\n 111.49226,\n 25.868824\n ],\n [\n 111.43313,\n 25.84621\n ],\n [\n 111.442369,\n 25.771877\n ],\n [\n 111.30871,\n 25.72014\n ],\n [\n 111.343202,\n 25.602569\n ],\n [\n 111.301319,\n 25.450851\n ],\n [\n 111.103602,\n 25.284877\n ],\n [\n 111.112841,\n 25.217232\n ],\n [\n 110.998892,\n 25.161465\n ],\n [\n 110.951465,\n 25.043891\n ],\n [\n 110.991501,\n 24.924034\n ],\n [\n 111.100522,\n 24.945736\n ],\n [\n 111.101754,\n 25.035218\n ],\n [\n 111.200921,\n 25.074786\n ],\n [\n 111.274833,\n 25.151175\n ],\n [\n 111.321645,\n 25.10513\n ],\n [\n 111.435593,\n 25.09321\n ],\n [\n 111.43313,\n 24.97991\n ],\n [\n 111.470086,\n 24.928917\n ],\n [\n 111.479325,\n 24.797543\n ],\n [\n 111.431282,\n 24.687776\n ],\n [\n 111.570484,\n 24.644821\n ],\n [\n 111.68936,\n 24.778531\n ],\n [\n 111.951135,\n 24.769839\n ],\n [\n 112.024431,\n 24.739955\n ]\n ]\n ],\n [\n [\n [\n 105.082179,\n 24.915895\n ],\n [\n 105.077868,\n 24.918065\n ],\n [\n 105.09573,\n 24.928375\n ],\n [\n 105.096346,\n 24.928375\n ],\n [\n 105.082179,\n 24.915895\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 460000,\n \"name\": \"海南省\",\n \"center\": [\n 110.33119,\n 20.031971\n ],\n \"centroid\": [\n 109.754777,\n 19.189617\n ],\n \"childrenNum\": 19,\n \"level\": \"province\",\n \"subFeatureIndex\": 20,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 109.231147,\n 19.863293\n ],\n [\n 109.300748,\n 19.917868\n ],\n [\n 109.498464,\n 19.873422\n ],\n [\n 109.585312,\n 19.98817\n ],\n [\n 109.712195,\n 20.017406\n ],\n [\n 109.76147,\n 19.981422\n ],\n [\n 109.965346,\n 19.993792\n ],\n [\n 110.106396,\n 20.026963\n ],\n [\n 110.144585,\n 20.074176\n ],\n [\n 110.291178,\n 20.056754\n ],\n [\n 110.318279,\n 20.109015\n ],\n [\n 110.526467,\n 20.0753\n ],\n [\n 110.562191,\n 20.109577\n ],\n [\n 110.717408,\n 20.148901\n ],\n [\n 110.744509,\n 20.074176\n ],\n [\n 110.871393,\n 20.011784\n ],\n [\n 110.969327,\n 20.010097\n ],\n [\n 111.071573,\n 19.629025\n ],\n [\n 110.920668,\n 19.552926\n ],\n [\n 110.844292,\n 19.450278\n ],\n [\n 110.729727,\n 19.378611\n ],\n [\n 110.619474,\n 19.152118\n ],\n [\n 110.578206,\n 18.78489\n ],\n [\n 110.499366,\n 18.751466\n ],\n [\n 110.495054,\n 18.65002\n ],\n [\n 110.329366,\n 18.64265\n ],\n [\n 110.246215,\n 18.609764\n ],\n [\n 110.117483,\n 18.507666\n ],\n [\n 110.090382,\n 18.399262\n ],\n [\n 110.022629,\n 18.360083\n ],\n [\n 109.919767,\n 18.375415\n ],\n [\n 109.785492,\n 18.339639\n ],\n [\n 109.749767,\n 18.193617\n ],\n [\n 109.584696,\n 18.143589\n ],\n [\n 109.355566,\n 18.215216\n ],\n [\n 109.287813,\n 18.264655\n ],\n [\n 109.138756,\n 18.268064\n ],\n [\n 109.117814,\n 18.322032\n ],\n [\n 108.944735,\n 18.31408\n ],\n [\n 108.888068,\n 18.412319\n ],\n [\n 108.68912,\n 18.447513\n ],\n [\n 108.644772,\n 18.486672\n ],\n [\n 108.663866,\n 18.673261\n ],\n [\n 108.593033,\n 18.809246\n ],\n [\n 108.637997,\n 18.920785\n ],\n [\n 108.591186,\n 19.14477\n ],\n [\n 108.609048,\n 19.276417\n ],\n [\n 108.663866,\n 19.374095\n ],\n [\n 108.765496,\n 19.401187\n ],\n [\n 109.048829,\n 19.620007\n ],\n [\n 109.169553,\n 19.736628\n ],\n [\n 109.159082,\n 19.790684\n ],\n [\n 109.231147,\n 19.863293\n ]\n ]\n ],\n [\n [\n [\n 113.896887,\n 7.607259\n ],\n [\n 114.029314,\n 7.670119\n ],\n [\n 114.211632,\n 7.786918\n ],\n [\n 114.268298,\n 7.870496\n ],\n [\n 114.414892,\n 7.952872\n ],\n [\n 114.540543,\n 7.945761\n ],\n [\n 114.540543,\n 7.862199\n ],\n [\n 114.419819,\n 7.765577\n ],\n [\n 114.368696,\n 7.63869\n ],\n [\n 114.157429,\n 7.56159\n ],\n [\n 113.98743,\n 7.536085\n ],\n [\n 113.896887,\n 7.607259\n ]\n ]\n ],\n [\n [\n [\n 111.660411,\n 16.258092\n ],\n [\n 111.606825,\n 16.17766\n ],\n [\n 111.569252,\n 16.195472\n ],\n [\n 111.660411,\n 16.258092\n ]\n ]\n ],\n [\n [\n [\n 113.976959,\n 8.872658\n ],\n [\n 114.060111,\n 8.816493\n ],\n [\n 114.037321,\n 8.781016\n ],\n [\n 113.976959,\n 8.872658\n ]\n ]\n ],\n [\n [\n [\n 112.067547,\n 16.319543\n ],\n [\n 111.97454,\n 16.323563\n ],\n [\n 112.047221,\n 16.360309\n ],\n [\n 112.067547,\n 16.319543\n ]\n ]\n ],\n [\n [\n [\n 115.837712,\n 9.709358\n ],\n [\n 115.925791,\n 9.7813\n ],\n [\n 115.901153,\n 9.671021\n ],\n [\n 115.837712,\n 9.709358\n ]\n ]\n ],\n [\n [\n [\n 109.463972,\n 7.344453\n ],\n [\n 109.536037,\n 7.448882\n ],\n [\n 109.653065,\n 7.559218\n ],\n [\n 109.72205,\n 7.575825\n ],\n [\n 109.904984,\n 7.551507\n ],\n [\n 109.938861,\n 7.504647\n ],\n [\n 109.791651,\n 7.524815\n ],\n [\n 109.654297,\n 7.479138\n ],\n [\n 109.513247,\n 7.320122\n ],\n [\n 109.463972,\n 7.344453\n ]\n ]\n ],\n [\n [\n [\n 112.527654,\n 16.058099\n ],\n [\n 112.607726,\n 16.066724\n ],\n [\n 112.570154,\n 16.010945\n ],\n [\n 112.448814,\n 16.005194\n ],\n [\n 112.527654,\n 16.058099\n ]\n ]\n ],\n [\n [\n [\n 114.469095,\n 10.83618\n ],\n [\n 114.587355,\n 10.90904\n ],\n [\n 114.565181,\n 10.836767\n ],\n [\n 114.469095,\n 10.83618\n ]\n ]\n ],\n [\n [\n [\n 112.383524,\n 16.266134\n ],\n [\n 112.528886,\n 16.318395\n ],\n [\n 112.538741,\n 16.289107\n ],\n [\n 112.383524,\n 16.266134\n ]\n ]\n ],\n [\n [\n [\n 116.48876,\n 10.395704\n ],\n [\n 116.514629,\n 10.349208\n ],\n [\n 116.637817,\n 10.3651\n ],\n [\n 116.566368,\n 10.304472\n ],\n [\n 116.467202,\n 10.309182\n ],\n [\n 116.48876,\n 10.395704\n ]\n ]\n ],\n [\n [\n [\n 115.16757,\n 8.386402\n ],\n [\n 115.315395,\n 8.356213\n ],\n [\n 115.285214,\n 8.314772\n ],\n [\n 115.18112,\n 8.345557\n ],\n [\n 115.16757,\n 8.386402\n ]\n ]\n ],\n [\n [\n [\n 109.936397,\n 7.848566\n ],\n [\n 109.953027,\n 7.888869\n ],\n [\n 110.078063,\n 7.949317\n ],\n [\n 110.050346,\n 7.846195\n ],\n [\n 109.988136,\n 7.812408\n ],\n [\n 109.936397,\n 7.848566\n ]\n ]\n ],\n [\n [\n [\n 114.696992,\n 11.004203\n ],\n [\n 114.766593,\n 11.110489\n ],\n [\n 114.793079,\n 11.076435\n ],\n [\n 114.696992,\n 11.004203\n ]\n ]\n ],\n [\n [\n [\n 110.459946,\n 8.116389\n ],\n [\n 110.568351,\n 8.172657\n ],\n [\n 110.554184,\n 8.09388\n ],\n [\n 110.471032,\n 8.071962\n ],\n [\n 110.459946,\n 8.116389\n ]\n ]\n ],\n [\n [\n [\n 117.266691,\n 10.691581\n ],\n [\n 117.369553,\n 10.742727\n ],\n [\n 117.404661,\n 10.671002\n ],\n [\n 117.266691,\n 10.691581\n ]\n ]\n ],\n [\n [\n [\n 113.80696,\n 19.223319\n ],\n [\n 113.920293,\n 19.223319\n ],\n [\n 113.874097,\n 19.151553\n ],\n [\n 113.80696,\n 19.223319\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 500000,\n \"name\": \"重庆市\",\n \"center\": [\n 106.504962,\n 29.533155\n ],\n \"centroid\": [\n 107.88398,\n 30.067321\n ],\n \"childrenNum\": 38,\n \"level\": \"province\",\n \"subFeatureIndex\": 21,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 109.09256,\n 30.578762\n ],\n [\n 109.114734,\n 30.64416\n ],\n [\n 108.971836,\n 30.627686\n ],\n [\n 108.808612,\n 30.491153\n ],\n [\n 108.743939,\n 30.494762\n ],\n [\n 108.688504,\n 30.587519\n ],\n [\n 108.56778,\n 30.468464\n ],\n [\n 108.42673,\n 30.492184\n ],\n [\n 108.402092,\n 30.376626\n ],\n [\n 108.460606,\n 30.35959\n ],\n [\n 108.581947,\n 30.255763\n ],\n [\n 108.56778,\n 30.157517\n ],\n [\n 108.513577,\n 30.057619\n ],\n [\n 108.542526,\n 29.998047\n ],\n [\n 108.516041,\n 29.885539\n ],\n [\n 108.371295,\n 29.841434\n ],\n [\n 108.424266,\n 29.816\n ],\n [\n 108.437201,\n 29.741218\n ],\n [\n 108.504338,\n 29.707964\n ],\n [\n 108.602273,\n 29.865824\n ],\n [\n 108.666946,\n 29.842472\n ],\n [\n 108.690968,\n 29.689773\n ],\n [\n 108.785822,\n 29.633622\n ],\n [\n 108.844337,\n 29.658582\n ],\n [\n 108.91209,\n 29.571714\n ],\n [\n 108.880677,\n 29.442576\n ],\n [\n 108.927488,\n 29.435281\n ],\n [\n 108.919481,\n 29.326314\n ],\n [\n 109.11227,\n 29.360737\n ],\n [\n 109.110422,\n 29.215143\n ],\n [\n 109.232378,\n 29.119533\n ],\n [\n 109.319842,\n 29.042667\n ],\n [\n 109.235458,\n 28.882476\n ],\n [\n 109.241002,\n 28.776594\n ],\n [\n 109.2989,\n 28.747221\n ],\n [\n 109.201581,\n 28.598133\n ],\n [\n 109.304443,\n 28.623871\n ],\n [\n 109.321074,\n 28.581322\n ],\n [\n 109.274262,\n 28.494592\n ],\n [\n 109.191726,\n 28.470927\n ],\n [\n 109.152306,\n 28.349885\n ],\n [\n 109.081473,\n 28.249264\n ],\n [\n 109.086401,\n 28.184942\n ],\n [\n 109.026655,\n 28.220271\n ],\n [\n 109.006329,\n 28.163317\n ],\n [\n 108.922561,\n 28.217635\n ],\n [\n 108.772888,\n 28.21289\n ],\n [\n 108.726692,\n 28.282463\n ],\n [\n 108.764881,\n 28.306698\n ],\n [\n 108.779663,\n 28.425158\n ],\n [\n 108.710678,\n 28.500902\n ],\n [\n 108.640461,\n 28.457251\n ],\n [\n 108.688504,\n 28.422527\n ],\n [\n 108.668178,\n 28.334614\n ],\n [\n 108.611512,\n 28.324607\n ],\n [\n 108.577019,\n 28.534024\n ],\n [\n 108.636149,\n 28.621245\n ],\n [\n 108.565316,\n 28.662204\n ],\n [\n 108.471077,\n 28.627548\n ],\n [\n 108.332491,\n 28.679528\n ],\n [\n 108.385462,\n 28.772398\n ],\n [\n 108.352817,\n 28.815395\n ],\n [\n 108.350353,\n 28.933282\n ],\n [\n 108.268433,\n 29.089734\n ],\n [\n 108.256115,\n 29.040574\n ],\n [\n 108.068253,\n 29.086597\n ],\n [\n 108.024521,\n 29.038482\n ],\n [\n 107.930899,\n 29.035343\n ],\n [\n 107.867457,\n 28.960508\n ],\n [\n 107.784921,\n 29.04842\n ],\n [\n 107.810791,\n 29.138348\n ],\n [\n 107.751044,\n 29.199997\n ],\n [\n 107.701769,\n 29.142006\n ],\n [\n 107.589052,\n 29.149845\n ],\n [\n 107.570574,\n 29.218276\n ],\n [\n 107.486806,\n 29.174402\n ],\n [\n 107.404271,\n 29.187984\n ],\n [\n 107.412894,\n 29.095485\n ],\n [\n 107.36485,\n 29.010753\n ],\n [\n 107.441227,\n 28.943755\n ],\n [\n 107.383945,\n 28.848417\n ],\n [\n 107.219489,\n 28.772923\n ],\n [\n 107.191156,\n 28.888763\n ],\n [\n 107.057497,\n 28.895049\n ],\n [\n 106.983584,\n 28.851561\n ],\n [\n 106.986664,\n 28.793899\n ],\n [\n 106.986664,\n 28.793899\n ],\n [\n 106.926302,\n 28.809104\n ],\n [\n 106.824056,\n 28.756139\n ],\n [\n 106.883186,\n 28.69265\n ],\n [\n 106.866556,\n 28.624397\n ],\n [\n 106.73844,\n 28.554522\n ],\n [\n 106.7446,\n 28.465667\n ],\n [\n 106.632499,\n 28.503531\n ],\n [\n 106.564745,\n 28.485127\n ],\n [\n 106.63681,\n 28.623346\n ],\n [\n 106.562897,\n 28.753516\n ],\n [\n 106.45326,\n 28.816968\n ],\n [\n 106.504999,\n 28.662204\n ],\n [\n 106.484057,\n 28.530344\n ],\n [\n 106.395978,\n 28.570287\n ],\n [\n 106.37442,\n 28.525613\n ],\n [\n 106.304203,\n 28.650653\n ],\n [\n 106.248152,\n 28.829024\n ],\n [\n 106.173008,\n 28.92019\n ],\n [\n 106.048588,\n 28.906573\n ],\n [\n 106.043661,\n 28.954226\n ],\n [\n 105.970364,\n 28.966267\n ],\n [\n 105.88906,\n 28.909716\n ],\n [\n 105.762176,\n 28.991391\n ],\n [\n 105.693807,\n 29.267351\n ],\n [\n 105.518264,\n 29.264219\n ],\n [\n 105.427721,\n 29.316924\n ],\n [\n 105.428337,\n 29.417562\n ],\n [\n 105.380294,\n 29.456643\n ],\n [\n 105.380294,\n 29.456643\n ],\n [\n 105.324859,\n 29.448828\n ],\n [\n 105.289751,\n 29.552979\n ],\n [\n 105.38399,\n 29.67002\n ],\n [\n 105.476996,\n 29.674699\n ],\n [\n 105.575547,\n 29.745374\n ],\n [\n 105.619894,\n 29.846624\n ],\n [\n 105.709206,\n 29.840396\n ],\n [\n 105.70243,\n 29.924957\n ],\n [\n 105.753553,\n 30.018254\n ],\n [\n 105.687648,\n 30.038974\n ],\n [\n 105.582938,\n 30.123884\n ],\n [\n 105.582938,\n 30.127507\n ],\n [\n 105.580474,\n 30.129577\n ],\n [\n 105.574315,\n 30.130611\n ],\n [\n 105.56138,\n 30.183898\n ],\n [\n 105.571235,\n 30.17976\n ],\n [\n 105.642684,\n 30.186484\n ],\n [\n 105.624822,\n 30.275917\n ],\n [\n 105.720292,\n 30.252662\n ],\n [\n 105.720292,\n 30.252662\n ],\n [\n 105.714749,\n 30.322927\n ],\n [\n 105.792357,\n 30.427199\n ],\n [\n 105.881053,\n 30.387465\n ],\n [\n 106.031958,\n 30.373529\n ],\n [\n 106.10587,\n 30.310531\n ],\n [\n 106.17116,\n 30.306399\n ],\n [\n 106.180399,\n 30.23302\n ],\n [\n 106.256776,\n 30.19631\n ],\n [\n 106.262935,\n 30.211306\n ],\n [\n 106.428623,\n 30.254729\n ],\n [\n 106.451412,\n 30.307949\n ],\n [\n 106.451412,\n 30.307949\n ],\n [\n 106.610941,\n 30.292451\n ],\n [\n 106.610941,\n 30.292451\n ],\n [\n 106.612789,\n 30.235605\n ],\n [\n 106.612789,\n 30.235605\n ],\n [\n 106.612173,\n 30.235605\n ],\n [\n 106.612173,\n 30.235605\n ],\n [\n 106.611557,\n 30.235605\n ],\n [\n 106.612173,\n 30.235605\n ],\n [\n 106.611557,\n 30.235605\n ],\n [\n 106.677462,\n 30.157\n ],\n [\n 106.726121,\n 30.033277\n ],\n [\n 106.825904,\n 30.031205\n ],\n [\n 106.825904,\n 30.031205\n ],\n [\n 106.913367,\n 30.025506\n ],\n [\n 106.974345,\n 30.082992\n ],\n [\n 106.976193,\n 30.083509\n ],\n [\n 106.980504,\n 30.085062\n ],\n [\n 106.981736,\n 30.085062\n ],\n [\n 107.053801,\n 30.043636\n ],\n [\n 107.054417,\n 30.041046\n ],\n [\n 107.055649,\n 30.040528\n ],\n [\n 107.058113,\n 30.043118\n ],\n [\n 107.221337,\n 30.213891\n ],\n [\n 107.359923,\n 30.456087\n ],\n [\n 107.516987,\n 30.644675\n ],\n [\n 107.424597,\n 30.740889\n ],\n [\n 107.514524,\n 30.854986\n ],\n [\n 107.645103,\n 30.821079\n ],\n [\n 107.739957,\n 30.884259\n ],\n [\n 107.763979,\n 30.816968\n ],\n [\n 107.85329,\n 30.793842\n ],\n [\n 107.994956,\n 30.90839\n ],\n [\n 107.943833,\n 30.989466\n ],\n [\n 108.053471,\n 31.040745\n ],\n [\n 108.009123,\n 31.10839\n ],\n [\n 108.083652,\n 31.185713\n ],\n [\n 108.095354,\n 31.268088\n ],\n [\n 108.185898,\n 31.337104\n ],\n [\n 108.153869,\n 31.371338\n ],\n [\n 108.216079,\n 31.410666\n ],\n [\n 108.191441,\n 31.492333\n ],\n [\n 108.34173,\n 31.509679\n ],\n [\n 108.391621,\n 31.593298\n ],\n [\n 108.517889,\n 31.665131\n ],\n [\n 108.535135,\n 31.757769\n ],\n [\n 108.343578,\n 31.860987\n ],\n [\n 108.259194,\n 31.966628\n ],\n [\n 108.373759,\n 32.077217\n ],\n [\n 108.447672,\n 32.07164\n ],\n [\n 108.369447,\n 32.173493\n ],\n [\n 108.509882,\n 32.201343\n ],\n [\n 108.67249,\n 32.104083\n ],\n [\n 108.734084,\n 32.106617\n ],\n [\n 108.902235,\n 31.984899\n ],\n [\n 108.988466,\n 31.979317\n ],\n [\n 109.164009,\n 31.877247\n ],\n [\n 109.195422,\n 31.817782\n ],\n [\n 109.273646,\n 31.801003\n ],\n [\n 109.281654,\n 31.717061\n ],\n [\n 109.585928,\n 31.726731\n ],\n [\n 109.731289,\n 31.700263\n ],\n [\n 109.76455,\n 31.602981\n ],\n [\n 109.719586,\n 31.555067\n ],\n [\n 109.848934,\n 31.552008\n ],\n [\n 109.946252,\n 31.506108\n ],\n [\n 110.054042,\n 31.410666\n ],\n [\n 110.140273,\n 31.390238\n ],\n [\n 110.189548,\n 31.129391\n ],\n [\n 110.119947,\n 31.088409\n ],\n [\n 110.135961,\n 30.986902\n ],\n [\n 110.172918,\n 30.978694\n ],\n [\n 110.082375,\n 30.799496\n ],\n [\n 110.008462,\n 30.883746\n ],\n [\n 109.893897,\n 30.899662\n ],\n [\n 109.780564,\n 30.848822\n ],\n [\n 109.590855,\n 30.693566\n ],\n [\n 109.435638,\n 30.59576\n ],\n [\n 109.35495,\n 30.487028\n ],\n [\n 109.36111,\n 30.550942\n ],\n [\n 109.299516,\n 30.630775\n ],\n [\n 109.143683,\n 30.521052\n ],\n [\n 109.103647,\n 30.565883\n ],\n [\n 109.106111,\n 30.57052\n ],\n [\n 109.106727,\n 30.572066\n ],\n [\n 109.108575,\n 30.576702\n ],\n [\n 109.102415,\n 30.580308\n ],\n [\n 109.100567,\n 30.580823\n ],\n [\n 109.09872,\n 30.579277\n ],\n [\n 109.09256,\n 30.578762\n ]\n ]\n ],\n [\n [\n [\n 105.574315,\n 30.130611\n ],\n [\n 105.580474,\n 30.129577\n ],\n [\n 105.582938,\n 30.127507\n ],\n [\n 105.582938,\n 30.123884\n ],\n [\n 105.574315,\n 30.130611\n ]\n ]\n ],\n [\n [\n [\n 109.09256,\n 30.578762\n ],\n [\n 109.09872,\n 30.579277\n ],\n [\n 109.106111,\n 30.57052\n ],\n [\n 109.103647,\n 30.565883\n ],\n [\n 109.09256,\n 30.578762\n ]\n ]\n ],\n [\n [\n [\n 109.102415,\n 30.580308\n ],\n [\n 109.108575,\n 30.576702\n ],\n [\n 109.106727,\n 30.572066\n ],\n [\n 109.100567,\n 30.580823\n ],\n [\n 109.102415,\n 30.580308\n ]\n ]\n ],\n [\n [\n [\n 107.053801,\n 30.043636\n ],\n [\n 107.058113,\n 30.043118\n ],\n [\n 107.055649,\n 30.040528\n ],\n [\n 107.054417,\n 30.041046\n ],\n [\n 107.053801,\n 30.043636\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 510000,\n \"name\": \"四川省\",\n \"center\": [\n 104.065735,\n 30.659462\n ],\n \"centroid\": [\n 102.693438,\n 30.674548\n ],\n \"childrenNum\": 21,\n \"level\": \"province\",\n \"subFeatureIndex\": 22,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 105.720292,\n 30.252662\n ],\n [\n 105.720292,\n 30.252662\n ],\n [\n 105.624822,\n 30.275917\n ],\n [\n 105.642684,\n 30.186484\n ],\n [\n 105.571235,\n 30.17976\n ],\n [\n 105.56138,\n 30.188035\n ],\n [\n 105.558916,\n 30.18545\n ],\n [\n 105.56138,\n 30.183898\n ],\n [\n 105.574315,\n 30.130611\n ],\n [\n 105.582938,\n 30.123884\n ],\n [\n 105.687648,\n 30.038974\n ],\n [\n 105.753553,\n 30.018254\n ],\n [\n 105.70243,\n 29.924957\n ],\n [\n 105.709206,\n 29.840396\n ],\n [\n 105.619894,\n 29.846624\n ],\n [\n 105.575547,\n 29.745374\n ],\n [\n 105.476996,\n 29.674699\n ],\n [\n 105.38399,\n 29.67002\n ],\n [\n 105.289751,\n 29.552979\n ],\n [\n 105.324859,\n 29.448828\n ],\n [\n 105.380294,\n 29.456643\n ],\n [\n 105.380294,\n 29.456643\n ],\n [\n 105.428337,\n 29.417562\n ],\n [\n 105.427721,\n 29.316924\n ],\n [\n 105.518264,\n 29.264219\n ],\n [\n 105.693807,\n 29.267351\n ],\n [\n 105.762176,\n 28.991391\n ],\n [\n 105.88906,\n 28.909716\n ],\n [\n 105.970364,\n 28.966267\n ],\n [\n 106.043661,\n 28.954226\n ],\n [\n 106.048588,\n 28.906573\n ],\n [\n 106.173008,\n 28.92019\n ],\n [\n 106.248152,\n 28.829024\n ],\n [\n 106.304203,\n 28.650653\n ],\n [\n 106.37442,\n 28.525613\n ],\n [\n 106.330688,\n 28.481971\n ],\n [\n 106.2925,\n 28.537177\n ],\n [\n 106.103407,\n 28.636476\n ],\n [\n 105.966668,\n 28.76086\n ],\n [\n 105.891524,\n 28.672179\n ],\n [\n 105.884748,\n 28.594981\n ],\n [\n 105.749242,\n 28.614943\n ],\n [\n 105.683952,\n 28.535601\n ],\n [\n 105.62359,\n 28.518253\n ],\n [\n 105.639604,\n 28.32408\n ],\n [\n 105.730147,\n 28.271925\n ],\n [\n 105.826234,\n 28.304064\n ],\n [\n 105.88906,\n 28.238722\n ],\n [\n 105.860111,\n 28.165955\n ],\n [\n 105.975907,\n 28.107917\n ],\n [\n 106.126812,\n 28.16701\n ],\n [\n 106.206885,\n 28.134302\n ],\n [\n 106.328225,\n 27.952643\n ],\n [\n 106.304819,\n 27.899249\n ],\n [\n 106.343007,\n 27.821489\n ],\n [\n 106.193334,\n 27.754265\n ],\n [\n 106.120653,\n 27.779677\n ],\n [\n 106.023335,\n 27.746851\n ],\n [\n 105.78435,\n 27.719312\n ],\n [\n 105.62359,\n 27.666333\n ],\n [\n 105.605112,\n 27.715605\n ],\n [\n 105.508409,\n 27.769089\n ],\n [\n 105.353809,\n 27.74897\n ],\n [\n 105.308229,\n 27.705011\n ],\n [\n 105.273736,\n 27.795028\n ],\n [\n 105.308229,\n 27.810376\n ],\n [\n 105.308229,\n 27.810376\n ],\n [\n 105.244171,\n 27.823077\n ],\n [\n 105.233084,\n 27.895547\n ],\n [\n 105.284823,\n 27.935729\n ],\n [\n 105.270657,\n 27.99703\n ],\n [\n 105.186273,\n 27.995445\n ],\n [\n 105.186889,\n 28.0546\n ],\n [\n 105.05939,\n 28.097889\n ],\n [\n 104.872144,\n 27.905594\n ],\n [\n 104.743413,\n 27.901892\n ],\n [\n 104.573413,\n 27.840537\n ],\n [\n 104.40095,\n 27.952114\n ],\n [\n 104.354139,\n 28.019744\n ],\n [\n 104.44653,\n 28.112666\n ],\n [\n 104.44961,\n 28.269817\n ],\n [\n 104.384936,\n 28.329874\n ],\n [\n 104.314103,\n 28.306698\n ],\n [\n 104.254357,\n 28.408844\n ],\n [\n 104.261748,\n 28.537177\n ],\n [\n 104.318415,\n 28.538229\n ],\n [\n 104.425588,\n 28.626497\n ],\n [\n 104.314719,\n 28.615468\n ],\n [\n 104.12501,\n 28.637526\n ],\n [\n 103.940844,\n 28.606013\n ],\n [\n 103.844757,\n 28.660104\n ],\n [\n 103.838598,\n 28.587101\n ],\n [\n 103.781931,\n 28.525613\n ],\n [\n 103.877402,\n 28.311966\n ],\n [\n 103.721569,\n 28.201817\n ],\n [\n 103.639649,\n 28.261912\n ],\n [\n 103.573128,\n 28.230815\n ],\n [\n 103.471498,\n 28.123221\n ],\n [\n 103.430846,\n 28.044039\n ],\n [\n 103.488128,\n 28.03242\n ],\n [\n 103.515846,\n 27.965326\n ],\n [\n 103.487512,\n 27.795028\n ],\n [\n 103.29226,\n 27.632943\n ],\n [\n 103.295955,\n 27.568785\n ],\n [\n 103.222043,\n 27.566133\n ],\n [\n 103.111789,\n 27.401054\n ],\n [\n 102.989833,\n 27.368114\n ],\n [\n 102.941174,\n 27.405303\n ],\n [\n 102.882044,\n 27.293168\n ],\n [\n 102.913457,\n 27.133538\n ],\n [\n 102.870957,\n 27.026992\n ],\n [\n 102.898674,\n 26.908073\n ],\n [\n 102.991681,\n 26.775675\n ],\n [\n 103.018783,\n 26.593911\n ],\n [\n 103.056971,\n 26.525943\n ],\n [\n 102.989833,\n 26.483108\n ],\n [\n 102.998457,\n 26.371661\n ],\n [\n 102.739762,\n 26.268691\n ],\n [\n 102.674473,\n 26.205363\n ],\n [\n 102.60056,\n 26.250448\n ],\n [\n 102.638748,\n 26.307852\n ],\n [\n 102.567915,\n 26.36362\n ],\n [\n 102.392372,\n 26.296588\n ],\n [\n 102.349257,\n 26.244545\n ],\n [\n 102.245163,\n 26.212341\n ],\n [\n 102.107808,\n 26.068391\n ],\n [\n 102.005562,\n 26.091499\n ],\n [\n 102.005562,\n 26.091499\n ],\n [\n 101.917483,\n 26.108156\n ],\n [\n 101.86328,\n 26.052266\n ],\n [\n 101.799223,\n 26.109231\n ],\n [\n 101.807846,\n 26.156501\n ],\n [\n 101.690202,\n 26.241861\n ],\n [\n 101.630455,\n 26.224687\n ],\n [\n 101.586724,\n 26.279422\n ],\n [\n 101.660636,\n 26.346999\n ],\n [\n 101.636615,\n 26.395245\n ],\n [\n 101.506652,\n 26.499708\n ],\n [\n 101.458608,\n 26.495424\n ],\n [\n 101.400094,\n 26.605146\n ],\n [\n 101.451833,\n 26.600867\n ],\n [\n 101.453065,\n 26.692848\n ],\n [\n 101.512195,\n 26.756443\n ],\n [\n 101.389623,\n 26.723314\n ],\n [\n 101.357594,\n 26.770868\n ],\n [\n 101.399478,\n 26.841893\n ],\n [\n 101.267667,\n 26.902737\n ],\n [\n 101.264587,\n 26.955549\n ],\n [\n 101.136472,\n 27.023794\n ],\n [\n 101.170349,\n 27.195821\n ],\n [\n 101.057016,\n 27.20061\n ],\n [\n 101.021907,\n 27.332508\n ],\n [\n 100.936908,\n 27.469026\n ],\n [\n 100.848212,\n 27.670573\n ],\n [\n 100.782307,\n 27.691767\n ],\n [\n 100.707162,\n 27.80085\n ],\n [\n 100.681293,\n 27.923041\n ],\n [\n 100.633866,\n 27.915111\n ],\n [\n 100.54517,\n 27.809318\n ],\n [\n 100.442924,\n 27.866459\n ],\n [\n 100.327744,\n 27.720372\n ],\n [\n 100.295099,\n 27.869633\n ],\n [\n 100.210715,\n 27.877037\n ],\n [\n 100.196549,\n 27.936257\n ],\n [\n 100.086296,\n 28.030836\n ],\n [\n 100.033941,\n 28.184942\n ],\n [\n 100.157129,\n 28.210254\n ],\n [\n 100.176223,\n 28.324607\n ],\n [\n 100.054267,\n 28.376737\n ],\n [\n 100.073977,\n 28.42621\n ],\n [\n 99.990209,\n 28.476712\n ],\n [\n 99.987129,\n 28.524561\n ],\n [\n 99.793724,\n 28.699473\n ],\n [\n 99.733362,\n 28.719415\n ],\n [\n 99.717964,\n 28.846321\n ],\n [\n 99.625573,\n 28.814871\n ],\n [\n 99.615718,\n 28.741975\n ],\n [\n 99.532566,\n 28.681628\n ],\n [\n 99.463581,\n 28.549266\n ],\n [\n 99.403219,\n 28.546638\n ],\n [\n 99.437095,\n 28.398318\n ],\n [\n 99.374886,\n 28.181778\n ],\n [\n 99.306516,\n 28.227652\n ],\n [\n 99.280647,\n 28.298269\n ],\n [\n 99.174705,\n 28.402003\n ],\n [\n 99.183944,\n 28.588677\n ],\n [\n 99.126662,\n 28.699473\n ],\n [\n 99.103872,\n 28.842128\n ],\n [\n 99.132206,\n 28.948467\n ],\n [\n 99.113727,\n 29.221409\n ],\n [\n 99.075539,\n 29.314316\n ],\n [\n 99.052133,\n 29.563908\n ],\n [\n 98.993003,\n 29.656502\n ],\n [\n 99.0238,\n 29.846105\n ],\n [\n 99.068148,\n 29.93118\n ],\n [\n 99.044742,\n 30.079885\n ],\n [\n 98.989308,\n 30.151826\n ],\n [\n 98.907388,\n 30.698196\n ],\n [\n 98.957895,\n 30.765056\n ],\n [\n 98.901844,\n 30.785105\n ],\n [\n 98.774345,\n 30.907877\n ],\n [\n 98.806374,\n 30.995621\n ],\n [\n 98.736772,\n 31.049459\n ],\n [\n 98.709671,\n 31.118635\n ],\n [\n 98.602498,\n 31.192367\n ],\n [\n 98.64007,\n 31.337615\n ],\n [\n 98.691809,\n 31.333016\n ],\n [\n 98.773113,\n 31.249163\n ],\n [\n 98.88583,\n 31.376446\n ],\n [\n 98.837787,\n 31.436705\n ],\n [\n 98.713367,\n 31.510189\n ],\n [\n 98.553839,\n 31.656473\n ],\n [\n 98.543983,\n 31.718588\n ],\n [\n 98.414636,\n 31.832525\n ],\n [\n 98.434962,\n 32.007734\n ],\n [\n 98.301919,\n 32.12334\n ],\n [\n 98.218768,\n 32.234752\n ],\n [\n 98.218768,\n 32.342489\n ],\n [\n 97.937283,\n 32.484425\n ],\n [\n 97.730944,\n 32.527315\n ],\n [\n 97.543698,\n 32.621602\n ],\n [\n 97.42359,\n 32.704713\n ],\n [\n 97.386018,\n 32.779196\n ],\n [\n 97.373699,\n 32.956094\n ],\n [\n 97.523988,\n 32.988721\n ],\n [\n 97.542466,\n 33.036385\n ],\n [\n 97.487648,\n 33.10658\n ],\n [\n 97.487648,\n 33.168205\n ],\n [\n 97.576343,\n 33.221779\n ],\n [\n 97.621306,\n 33.334327\n ],\n [\n 97.676125,\n 33.340825\n ],\n [\n 97.753733,\n 33.410277\n ],\n [\n 97.625618,\n 33.461705\n ],\n [\n 97.552321,\n 33.465698\n ],\n [\n 97.52522,\n 33.575937\n ],\n [\n 97.415583,\n 33.605343\n ],\n [\n 97.435293,\n 33.680558\n ],\n [\n 97.388481,\n 33.884452\n ],\n [\n 97.458698,\n 33.886935\n ],\n [\n 97.660111,\n 33.956444\n ],\n [\n 97.70261,\n 34.036805\n ],\n [\n 97.665654,\n 34.126997\n ],\n [\n 97.834421,\n 34.208186\n ],\n [\n 97.937283,\n 34.196804\n ],\n [\n 97.937283,\n 34.196804\n ],\n [\n 98.051848,\n 34.115604\n ],\n [\n 98.21076,\n 34.078444\n ],\n [\n 98.401702,\n 34.08786\n ],\n [\n 98.440506,\n 33.981255\n ],\n [\n 98.406629,\n 33.867065\n ],\n [\n 98.462064,\n 33.849178\n ],\n [\n 98.539056,\n 33.746752\n ],\n [\n 98.6567,\n 33.647193\n ],\n [\n 98.61728,\n 33.63723\n ],\n [\n 98.648077,\n 33.549014\n ],\n [\n 98.742316,\n 33.477677\n ],\n [\n 98.734309,\n 33.409278\n ],\n [\n 98.779272,\n 33.37181\n ],\n [\n 98.759562,\n 33.277321\n ],\n [\n 98.858728,\n 33.150674\n ],\n [\n 99.002242,\n 33.08252\n ],\n [\n 99.179633,\n 33.044912\n ],\n [\n 99.235067,\n 32.982197\n ],\n [\n 99.268328,\n 32.878744\n ],\n [\n 99.385973,\n 32.900349\n ],\n [\n 99.558436,\n 32.839039\n ],\n [\n 99.607711,\n 32.780705\n ],\n [\n 99.763543,\n 32.778693\n ],\n [\n 99.788181,\n 32.956596\n ],\n [\n 99.854086,\n 32.945048\n ],\n [\n 99.877492,\n 33.045915\n ],\n [\n 99.956332,\n 32.948061\n ],\n [\n 100.038252,\n 32.928979\n ],\n [\n 100.123252,\n 32.837028\n ],\n [\n 100.139266,\n 32.724346\n ],\n [\n 100.088143,\n 32.668959\n ],\n [\n 100.208252,\n 32.606482\n ],\n [\n 100.258759,\n 32.742466\n ],\n [\n 100.339447,\n 32.719313\n ],\n [\n 100.399809,\n 32.756556\n ],\n [\n 100.516837,\n 32.630168\n ],\n [\n 100.54517,\n 32.569681\n ],\n [\n 100.645568,\n 32.526306\n ],\n [\n 100.690532,\n 32.678025\n ],\n [\n 100.93198,\n 32.600433\n ],\n [\n 101.075494,\n 32.683061\n ],\n [\n 101.157414,\n 32.661404\n ],\n [\n 101.22332,\n 32.725856\n ],\n [\n 101.237486,\n 32.824962\n ],\n [\n 101.124153,\n 32.909893\n ],\n [\n 101.129081,\n 32.989725\n ],\n [\n 101.183899,\n 32.984204\n ],\n [\n 101.169733,\n 33.100566\n ],\n [\n 101.11553,\n 33.194746\n ],\n [\n 101.183283,\n 33.270317\n ],\n [\n 101.297232,\n 33.262313\n ],\n [\n 101.393935,\n 33.157687\n ],\n [\n 101.405022,\n 33.225783\n ],\n [\n 101.486326,\n 33.227285\n ],\n [\n 101.625528,\n 33.100566\n ],\n [\n 101.739477,\n 33.265815\n ],\n [\n 101.64955,\n 33.323328\n ],\n [\n 101.695745,\n 33.433748\n ],\n [\n 101.769658,\n 33.447728\n ],\n [\n 101.769042,\n 33.538541\n ],\n [\n 101.844186,\n 33.602353\n ],\n [\n 101.907012,\n 33.542032\n ],\n [\n 101.9452,\n 33.437742\n ],\n [\n 101.885454,\n 33.380804\n ],\n [\n 101.878063,\n 33.315829\n ],\n [\n 101.769658,\n 33.268816\n ],\n [\n 101.841723,\n 33.184731\n ],\n [\n 101.865744,\n 33.103072\n ],\n [\n 101.935345,\n 33.186734\n ],\n [\n 102.08933,\n 33.204759\n ],\n [\n 102.112736,\n 33.287324\n ],\n [\n 102.217446,\n 33.248303\n ],\n [\n 102.186649,\n 33.332327\n ],\n [\n 102.264873,\n 33.417269\n ],\n [\n 102.396684,\n 33.40678\n ],\n [\n 102.462589,\n 33.449724\n ],\n [\n 102.440416,\n 33.57494\n ],\n [\n 102.33817,\n 33.614313\n ],\n [\n 102.342481,\n 33.725357\n ],\n [\n 102.299981,\n 33.782566\n ],\n [\n 102.239619,\n 33.788036\n ],\n [\n 102.234076,\n 33.870046\n ],\n [\n 102.136142,\n 33.965377\n ],\n [\n 102.237772,\n 33.963392\n ],\n [\n 102.315996,\n 33.994154\n ],\n [\n 102.391756,\n 33.970836\n ],\n [\n 102.437336,\n 34.087364\n ],\n [\n 102.471213,\n 34.072993\n ],\n [\n 102.655994,\n 34.113623\n ],\n [\n 102.599328,\n 34.145321\n ],\n [\n 102.798276,\n 34.272982\n ],\n [\n 102.911609,\n 34.313022\n ],\n [\n 102.978747,\n 34.249246\n ],\n [\n 102.973203,\n 34.205217\n ],\n [\n 103.124108,\n 34.16166\n ],\n [\n 103.178927,\n 34.079931\n ],\n [\n 103.119797,\n 34.034822\n ],\n [\n 103.124108,\n 33.968354\n ],\n [\n 103.181391,\n 33.900842\n ],\n [\n 103.153057,\n 33.814884\n ],\n [\n 103.279325,\n 33.806433\n ],\n [\n 103.349542,\n 33.74327\n ],\n [\n 103.525085,\n 33.798975\n ],\n [\n 103.520157,\n 33.678566\n ],\n [\n 103.626099,\n 33.727347\n ],\n [\n 103.778236,\n 33.658648\n ],\n [\n 103.871243,\n 33.68255\n ],\n [\n 104.046169,\n 33.686533\n ],\n [\n 104.168741,\n 33.611821\n ],\n [\n 104.155191,\n 33.542531\n ],\n [\n 104.22048,\n 33.404782\n ],\n [\n 104.292545,\n 33.336326\n ],\n [\n 104.432979,\n 33.325828\n ],\n [\n 104.303632,\n 33.304328\n ],\n [\n 104.378161,\n 33.109086\n ],\n [\n 104.337509,\n 33.038392\n ],\n [\n 104.426204,\n 33.0108\n ],\n [\n 104.378161,\n 32.953081\n ],\n [\n 104.288234,\n 32.94304\n ],\n [\n 104.294393,\n 32.83552\n ],\n [\n 104.363994,\n 32.822448\n ],\n [\n 104.458849,\n 32.748504\n ],\n [\n 104.582653,\n 32.722333\n ],\n [\n 104.643015,\n 32.661908\n ],\n [\n 104.739717,\n 32.635711\n ],\n [\n 104.845659,\n 32.653848\n ],\n [\n 104.881999,\n 32.600938\n ],\n [\n 105.026745,\n 32.650322\n ],\n [\n 105.111128,\n 32.59388\n ],\n [\n 105.347033,\n 32.682558\n ],\n [\n 105.455439,\n 32.737433\n ],\n [\n 105.391381,\n 32.835017\n ],\n [\n 105.414171,\n 32.921948\n ],\n [\n 105.49917,\n 32.911902\n ],\n [\n 105.563844,\n 32.72485\n ],\n [\n 105.596489,\n 32.699175\n ],\n [\n 105.719061,\n 32.759575\n ],\n [\n 105.822538,\n 32.770141\n ],\n [\n 105.825002,\n 32.824962\n ],\n [\n 106.025798,\n 32.85814\n ],\n [\n 106.093552,\n 32.823956\n ],\n [\n 106.07261,\n 32.764103\n ],\n [\n 106.076305,\n 32.753537\n ],\n [\n 106.17424,\n 32.697664\n ],\n [\n 106.347935,\n 32.670974\n ],\n [\n 106.421231,\n 32.616562\n ],\n [\n 106.585687,\n 32.688097\n ],\n [\n 106.663296,\n 32.690615\n ],\n [\n 106.733513,\n 32.739446\n ],\n [\n 106.82344,\n 32.705217\n ],\n [\n 107.066736,\n 32.708741\n ],\n [\n 107.108004,\n 32.600938\n ],\n [\n 107.080286,\n 32.542448\n ],\n [\n 107.127098,\n 32.482406\n ],\n [\n 107.263836,\n 32.403129\n ],\n [\n 107.313727,\n 32.489976\n ],\n [\n 107.382097,\n 32.54043\n ],\n [\n 107.436299,\n 32.529837\n ],\n [\n 107.456625,\n 32.417778\n ],\n [\n 107.533002,\n 32.383426\n ],\n [\n 107.680211,\n 32.398078\n ],\n [\n 107.707929,\n 32.331873\n ],\n [\n 107.75474,\n 32.338445\n ],\n [\n 107.812022,\n 32.24791\n ],\n [\n 107.979558,\n 32.14614\n ],\n [\n 108.070717,\n 32.233234\n ],\n [\n 108.179122,\n 32.222099\n ],\n [\n 108.251187,\n 32.273208\n ],\n [\n 108.312781,\n 32.232222\n ],\n [\n 108.46923,\n 32.270173\n ],\n [\n 108.509882,\n 32.201343\n ],\n [\n 108.369447,\n 32.173493\n ],\n [\n 108.447672,\n 32.07164\n ],\n [\n 108.373759,\n 32.077217\n ],\n [\n 108.259194,\n 31.966628\n ],\n [\n 108.343578,\n 31.860987\n ],\n [\n 108.535135,\n 31.757769\n ],\n [\n 108.517889,\n 31.665131\n ],\n [\n 108.391621,\n 31.593298\n ],\n [\n 108.34173,\n 31.509679\n ],\n [\n 108.191441,\n 31.492333\n ],\n [\n 108.216079,\n 31.410666\n ],\n [\n 108.153869,\n 31.371338\n ],\n [\n 108.185898,\n 31.337104\n ],\n [\n 108.095354,\n 31.268088\n ],\n [\n 108.083652,\n 31.185713\n ],\n [\n 108.009123,\n 31.10839\n ],\n [\n 108.053471,\n 31.040745\n ],\n [\n 107.943833,\n 30.989466\n ],\n [\n 107.994956,\n 30.90839\n ],\n [\n 107.85329,\n 30.793842\n ],\n [\n 107.763979,\n 30.816968\n ],\n [\n 107.739957,\n 30.884259\n ],\n [\n 107.645103,\n 30.821079\n ],\n [\n 107.514524,\n 30.854986\n ],\n [\n 107.424597,\n 30.740889\n ],\n [\n 107.516987,\n 30.644675\n ],\n [\n 107.359923,\n 30.456087\n ],\n [\n 107.221337,\n 30.213891\n ],\n [\n 107.058113,\n 30.043118\n ],\n [\n 107.053801,\n 30.043636\n ],\n [\n 106.981736,\n 30.085062\n ],\n [\n 106.980504,\n 30.087651\n ],\n [\n 106.980504,\n 30.087651\n ],\n [\n 106.980504,\n 30.085062\n ],\n [\n 106.978041,\n 30.087133\n ],\n [\n 106.978041,\n 30.087651\n ],\n [\n 106.978041,\n 30.087133\n ],\n [\n 106.978041,\n 30.087651\n ],\n [\n 106.978041,\n 30.087133\n ],\n [\n 106.976193,\n 30.083509\n ],\n [\n 106.976193,\n 30.087651\n ],\n [\n 106.976193,\n 30.087651\n ],\n [\n 106.974345,\n 30.082992\n ],\n [\n 106.913367,\n 30.025506\n ],\n [\n 106.825904,\n 30.031205\n ],\n [\n 106.825904,\n 30.031205\n ],\n [\n 106.726121,\n 30.033277\n ],\n [\n 106.677462,\n 30.157\n ],\n [\n 106.611557,\n 30.235605\n ],\n [\n 106.612173,\n 30.235605\n ],\n [\n 106.611557,\n 30.235605\n ],\n [\n 106.612173,\n 30.235605\n ],\n [\n 106.612173,\n 30.235605\n ],\n [\n 106.612789,\n 30.235605\n ],\n [\n 106.612789,\n 30.235605\n ],\n [\n 106.610941,\n 30.292451\n ],\n [\n 106.610941,\n 30.292451\n ],\n [\n 106.451412,\n 30.307949\n ],\n [\n 106.451412,\n 30.307949\n ],\n [\n 106.428623,\n 30.254729\n ],\n [\n 106.262935,\n 30.211306\n ],\n [\n 106.261703,\n 30.205101\n ],\n [\n 106.260471,\n 30.204067\n ],\n [\n 106.256776,\n 30.19631\n ],\n [\n 106.180399,\n 30.23302\n ],\n [\n 106.17116,\n 30.306399\n ],\n [\n 106.10587,\n 30.310531\n ],\n [\n 106.031958,\n 30.373529\n ],\n [\n 105.881053,\n 30.387465\n ],\n [\n 105.792357,\n 30.427199\n ],\n [\n 105.714749,\n 30.322927\n ],\n [\n 105.720292,\n 30.252662\n ]\n ]\n ],\n [\n [\n [\n 106.262935,\n 30.211306\n ],\n [\n 106.256776,\n 30.19631\n ],\n [\n 106.260471,\n 30.204067\n ],\n [\n 106.261703,\n 30.205101\n ],\n [\n 106.262935,\n 30.211306\n ]\n ]\n ],\n [\n [\n [\n 105.571235,\n 30.17976\n ],\n [\n 105.56138,\n 30.183898\n ],\n [\n 105.558916,\n 30.18545\n ],\n [\n 105.56138,\n 30.188035\n ],\n [\n 105.571235,\n 30.17976\n ]\n ]\n ],\n [\n [\n [\n 106.981736,\n 30.085062\n ],\n [\n 106.980504,\n 30.085062\n ],\n [\n 106.980504,\n 30.087651\n ],\n [\n 106.981736,\n 30.085062\n ]\n ]\n ],\n [\n [\n [\n 106.980504,\n 30.085062\n ],\n [\n 106.976193,\n 30.083509\n ],\n [\n 106.978041,\n 30.087133\n ],\n [\n 106.980504,\n 30.085062\n ]\n ]\n ],\n [\n [\n [\n 106.976193,\n 30.083509\n ],\n [\n 106.974345,\n 30.082992\n ],\n [\n 106.976193,\n 30.087651\n ],\n [\n 106.976193,\n 30.083509\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 520000,\n \"name\": \"贵州省\",\n \"center\": [\n 106.713478,\n 26.578343\n ],\n \"centroid\": [\n 106.88108,\n 26.826362\n ],\n \"childrenNum\": 9,\n \"level\": \"province\",\n \"subFeatureIndex\": 23,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 109.52187,\n 26.748964\n ],\n [\n 109.454117,\n 26.761252\n ],\n [\n 109.35495,\n 26.693383\n ],\n [\n 109.407305,\n 26.532902\n ],\n [\n 109.326001,\n 26.427398\n ],\n [\n 109.285965,\n 26.296052\n ],\n [\n 109.340784,\n 26.264399\n ],\n [\n 109.466435,\n 26.314288\n ],\n [\n 109.439334,\n 26.238641\n ],\n [\n 109.486761,\n 26.148445\n ],\n [\n 109.486761,\n 26.148445\n ],\n [\n 109.449805,\n 26.101709\n ],\n [\n 109.48245,\n 26.029687\n ],\n [\n 109.408537,\n 25.967305\n ],\n [\n 109.435022,\n 25.933411\n ],\n [\n 109.339552,\n 25.834363\n ],\n [\n 109.3414,\n 25.732537\n ],\n [\n 109.147995,\n 25.7417\n ],\n [\n 109.143683,\n 25.795044\n ],\n [\n 108.989698,\n 25.778881\n ],\n [\n 108.896076,\n 25.71421\n ],\n [\n 108.953974,\n 25.686714\n ],\n [\n 108.953974,\n 25.686714\n ],\n [\n 109.000785,\n 25.73631\n ],\n [\n 109.07901,\n 25.720679\n ],\n [\n 109.030966,\n 25.629545\n ],\n [\n 109.088249,\n 25.550758\n ],\n [\n 109.025423,\n 25.512426\n ],\n [\n 108.949046,\n 25.557236\n ],\n [\n 108.781511,\n 25.554537\n ],\n [\n 108.763649,\n 25.637097\n ],\n [\n 108.68912,\n 25.623072\n ],\n [\n 108.6072,\n 25.491904\n ],\n [\n 108.625062,\n 25.308138\n ],\n [\n 108.471693,\n 25.458955\n ],\n [\n 108.418723,\n 25.443287\n ],\n [\n 108.348506,\n 25.536183\n ],\n [\n 108.142782,\n 25.390867\n ],\n [\n 108.152021,\n 25.324364\n ],\n [\n 108.115065,\n 25.210195\n ],\n [\n 108.001732,\n 25.196661\n ],\n [\n 107.841587,\n 25.115966\n ],\n [\n 107.741805,\n 25.239965\n ],\n [\n 107.700537,\n 25.193954\n ],\n [\n 107.659885,\n 25.316251\n ],\n [\n 107.599523,\n 25.250789\n ],\n [\n 107.472024,\n 25.213984\n ],\n [\n 107.481263,\n 25.300024\n ],\n [\n 107.432604,\n 25.289205\n ],\n [\n 107.420901,\n 25.393029\n ],\n [\n 107.318039,\n 25.401677\n ],\n [\n 107.336517,\n 25.461116\n ],\n [\n 107.228728,\n 25.604728\n ],\n [\n 107.064272,\n 25.559395\n ],\n [\n 107.066736,\n 25.509186\n ],\n [\n 106.963874,\n 25.437884\n ],\n [\n 107.012533,\n 25.353024\n ],\n [\n 107.013765,\n 25.275138\n ],\n [\n 106.912751,\n 25.243212\n ],\n [\n 106.900432,\n 25.194495\n ],\n [\n 106.732281,\n 25.162548\n ],\n [\n 106.684238,\n 25.178252\n ],\n [\n 106.590615,\n 25.087791\n ],\n [\n 106.304819,\n 24.973944\n ],\n [\n 106.215508,\n 24.982079\n ],\n [\n 106.146522,\n 24.948449\n ],\n [\n 106.206269,\n 24.851304\n ],\n [\n 106.173008,\n 24.760059\n ],\n [\n 106.045508,\n 24.681796\n ],\n [\n 106.023335,\n 24.632313\n ],\n [\n 105.942031,\n 24.724738\n ],\n [\n 105.827466,\n 24.702997\n ],\n [\n 105.70551,\n 24.768752\n ],\n [\n 105.500402,\n 24.807862\n ],\n [\n 105.445584,\n 24.918608\n ],\n [\n 105.365511,\n 24.943566\n ],\n [\n 105.265729,\n 24.930003\n ],\n [\n 105.198592,\n 24.995095\n ],\n [\n 105.09573,\n 24.928375\n ],\n [\n 105.077868,\n 24.918065\n ],\n [\n 105.03352,\n 24.787765\n ],\n [\n 104.899245,\n 24.752996\n ],\n [\n 104.841963,\n 24.676359\n ],\n [\n 104.743413,\n 24.621978\n ],\n [\n 104.63316,\n 24.65896\n ],\n [\n 104.529682,\n 24.73126\n ],\n [\n 104.539537,\n 24.813836\n ],\n [\n 104.713232,\n 24.996179\n ],\n [\n 104.667652,\n 25.05961\n ],\n [\n 104.750804,\n 25.215067\n ],\n [\n 104.822869,\n 25.17013\n ],\n [\n 104.816094,\n 25.262152\n ],\n [\n 104.639935,\n 25.298942\n ],\n [\n 104.646094,\n 25.356809\n ],\n [\n 104.543232,\n 25.400597\n ],\n [\n 104.556783,\n 25.524845\n ],\n [\n 104.434827,\n 25.47246\n ],\n [\n 104.420661,\n 25.585301\n ],\n [\n 104.332581,\n 25.598792\n ],\n [\n 104.309791,\n 25.648964\n ],\n [\n 104.328886,\n 25.760561\n ],\n [\n 104.373233,\n 25.731459\n ],\n [\n 104.441602,\n 25.869362\n ],\n [\n 104.414501,\n 25.909733\n ],\n [\n 104.499501,\n 26.070541\n ],\n [\n 104.592508,\n 26.317506\n ],\n [\n 104.683667,\n 26.377557\n ],\n [\n 104.554935,\n 26.590701\n ],\n [\n 104.487798,\n 26.579465\n ],\n [\n 104.421276,\n 26.712091\n ],\n [\n 104.354139,\n 26.621194\n ],\n [\n 104.120082,\n 26.636705\n ],\n [\n 104.052329,\n 26.507204\n ],\n [\n 103.865699,\n 26.512023\n ],\n [\n 103.764685,\n 26.584816\n ],\n [\n 103.773308,\n 26.716901\n ],\n [\n 103.705555,\n 26.794904\n ],\n [\n 103.779468,\n 26.874454\n ],\n [\n 103.77454,\n 26.951815\n ],\n [\n 103.675374,\n 27.051506\n ],\n [\n 103.638418,\n 27.013133\n ],\n [\n 103.624251,\n 27.112237\n ],\n [\n 103.711714,\n 27.14259\n ],\n [\n 103.903271,\n 27.347921\n ],\n [\n 103.932221,\n 27.444072\n ],\n [\n 104.015372,\n 27.429204\n ],\n [\n 104.01722,\n 27.383523\n ],\n [\n 104.113307,\n 27.338354\n ],\n [\n 104.174285,\n 27.262856\n ],\n [\n 104.363378,\n 27.467964\n ],\n [\n 104.497653,\n 27.411677\n ],\n [\n 104.546312,\n 27.330382\n ],\n [\n 104.609754,\n 27.306991\n ],\n [\n 104.808702,\n 27.35483\n ],\n [\n 104.871528,\n 27.291041\n ],\n [\n 105.067397,\n 27.418051\n ],\n [\n 105.184425,\n 27.393085\n ],\n [\n 105.260186,\n 27.514672\n ],\n [\n 105.232469,\n 27.546506\n ],\n [\n 105.305149,\n 27.612799\n ],\n [\n 105.308229,\n 27.705011\n ],\n [\n 105.353809,\n 27.74897\n ],\n [\n 105.508409,\n 27.769089\n ],\n [\n 105.605112,\n 27.715605\n ],\n [\n 105.62359,\n 27.666333\n ],\n [\n 105.78435,\n 27.719312\n ],\n [\n 106.023335,\n 27.746851\n ],\n [\n 106.120653,\n 27.779677\n ],\n [\n 106.193334,\n 27.754265\n ],\n [\n 106.343007,\n 27.821489\n ],\n [\n 106.304819,\n 27.899249\n ],\n [\n 106.328225,\n 27.952643\n ],\n [\n 106.206885,\n 28.134302\n ],\n [\n 106.126812,\n 28.16701\n ],\n [\n 105.975907,\n 28.107917\n ],\n [\n 105.860111,\n 28.165955\n ],\n [\n 105.88906,\n 28.238722\n ],\n [\n 105.826234,\n 28.304064\n ],\n [\n 105.730147,\n 28.271925\n ],\n [\n 105.639604,\n 28.32408\n ],\n [\n 105.62359,\n 28.518253\n ],\n [\n 105.683952,\n 28.535601\n ],\n [\n 105.749242,\n 28.614943\n ],\n [\n 105.884748,\n 28.594981\n ],\n [\n 105.891524,\n 28.672179\n ],\n [\n 105.966668,\n 28.76086\n ],\n [\n 106.103407,\n 28.636476\n ],\n [\n 106.2925,\n 28.537177\n ],\n [\n 106.330688,\n 28.481971\n ],\n [\n 106.37442,\n 28.525613\n ],\n [\n 106.395978,\n 28.570287\n ],\n [\n 106.484057,\n 28.530344\n ],\n [\n 106.504999,\n 28.662204\n ],\n [\n 106.45326,\n 28.816968\n ],\n [\n 106.562897,\n 28.753516\n ],\n [\n 106.63681,\n 28.623346\n ],\n [\n 106.564745,\n 28.485127\n ],\n [\n 106.632499,\n 28.503531\n ],\n [\n 106.7446,\n 28.465667\n ],\n [\n 106.73844,\n 28.554522\n ],\n [\n 106.866556,\n 28.624397\n ],\n [\n 106.883186,\n 28.69265\n ],\n [\n 106.824056,\n 28.756139\n ],\n [\n 106.926302,\n 28.809104\n ],\n [\n 106.986664,\n 28.793899\n ],\n [\n 106.986664,\n 28.793899\n ],\n [\n 106.983584,\n 28.851561\n ],\n [\n 107.057497,\n 28.895049\n ],\n [\n 107.191156,\n 28.888763\n ],\n [\n 107.219489,\n 28.772923\n ],\n [\n 107.383945,\n 28.848417\n ],\n [\n 107.441227,\n 28.943755\n ],\n [\n 107.36485,\n 29.010753\n ],\n [\n 107.412894,\n 29.095485\n ],\n [\n 107.404271,\n 29.187984\n ],\n [\n 107.486806,\n 29.174402\n ],\n [\n 107.570574,\n 29.218276\n ],\n [\n 107.589052,\n 29.149845\n ],\n [\n 107.701769,\n 29.142006\n ],\n [\n 107.751044,\n 29.199997\n ],\n [\n 107.810791,\n 29.138348\n ],\n [\n 107.784921,\n 29.04842\n ],\n [\n 107.867457,\n 28.960508\n ],\n [\n 107.930899,\n 29.035343\n ],\n [\n 108.024521,\n 29.038482\n ],\n [\n 108.068253,\n 29.086597\n ],\n [\n 108.256115,\n 29.040574\n ],\n [\n 108.268433,\n 29.089734\n ],\n [\n 108.350353,\n 28.933282\n ],\n [\n 108.352817,\n 28.815395\n ],\n [\n 108.385462,\n 28.772398\n ],\n [\n 108.332491,\n 28.679528\n ],\n [\n 108.471077,\n 28.627548\n ],\n [\n 108.565316,\n 28.662204\n ],\n [\n 108.636149,\n 28.621245\n ],\n [\n 108.577019,\n 28.534024\n ],\n [\n 108.611512,\n 28.324607\n ],\n [\n 108.668178,\n 28.334614\n ],\n [\n 108.688504,\n 28.422527\n ],\n [\n 108.640461,\n 28.457251\n ],\n [\n 108.710678,\n 28.500902\n ],\n [\n 108.779663,\n 28.425158\n ],\n [\n 108.764881,\n 28.306698\n ],\n [\n 108.726692,\n 28.282463\n ],\n [\n 108.772888,\n 28.21289\n ],\n [\n 108.922561,\n 28.217635\n ],\n [\n 109.006329,\n 28.163317\n ],\n [\n 109.026655,\n 28.220271\n ],\n [\n 109.086401,\n 28.184942\n ],\n [\n 109.081473,\n 28.249264\n ],\n [\n 109.152306,\n 28.349885\n ],\n [\n 109.191726,\n 28.470927\n ],\n [\n 109.274262,\n 28.494592\n ],\n [\n 109.27303,\n 28.310386\n ],\n [\n 109.388211,\n 28.268236\n ],\n [\n 109.340168,\n 28.190216\n ],\n [\n 109.298284,\n 28.036117\n ],\n [\n 109.378972,\n 28.032948\n ],\n [\n 109.30198,\n 27.956342\n ],\n [\n 109.345711,\n 27.840537\n ],\n [\n 109.332777,\n 27.782853\n ],\n [\n 109.470747,\n 27.68011\n ],\n [\n 109.461508,\n 27.567724\n ],\n [\n 109.303211,\n 27.475396\n ],\n [\n 109.300132,\n 27.423893\n ],\n [\n 109.202197,\n 27.449913\n ],\n [\n 109.142451,\n 27.418051\n ],\n [\n 109.040821,\n 27.276151\n ],\n [\n 108.907162,\n 27.2054\n ],\n [\n 108.878829,\n 27.106378\n ],\n [\n 108.791366,\n 27.084539\n ],\n [\n 108.87575,\n 26.999273\n ],\n [\n 109.07901,\n 27.115965\n ],\n [\n 109.164625,\n 27.065893\n ],\n [\n 109.267487,\n 27.128746\n ],\n [\n 109.415928,\n 27.15377\n ],\n [\n 109.472595,\n 27.135136\n ],\n [\n 109.454733,\n 27.069622\n ],\n [\n 109.520022,\n 27.058433\n ],\n [\n 109.555131,\n 26.947015\n ],\n [\n 109.486761,\n 26.895267\n ],\n [\n 109.500928,\n 26.828546\n ],\n [\n 109.481218,\n 26.838156\n ],\n [\n 109.473211,\n 26.828546\n ],\n [\n 109.504624,\n 26.805051\n ],\n [\n 109.52187,\n 26.748964\n ]\n ]\n ],\n [\n [\n [\n 109.529261,\n 26.740414\n ],\n [\n 109.528029,\n 26.744689\n ],\n [\n 109.548971,\n 26.737208\n ],\n [\n 109.548971,\n 26.737208\n ],\n [\n 109.529261,\n 26.740414\n ]\n ]\n ],\n [\n [\n [\n 109.500928,\n 26.828546\n ],\n [\n 109.504624,\n 26.805051\n ],\n [\n 109.473211,\n 26.828546\n ],\n [\n 109.481218,\n 26.838156\n ],\n [\n 109.500928,\n 26.828546\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 530000,\n \"name\": \"云南省\",\n \"center\": [\n 102.712251,\n 25.040609\n ],\n \"centroid\": [\n 101.485108,\n 25.008649\n ],\n \"childrenNum\": 16,\n \"level\": \"province\",\n \"subFeatureIndex\": 24,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 105.542902,\n 23.18449\n ],\n [\n 105.445584,\n 23.292797\n ],\n [\n 105.372903,\n 23.317525\n ],\n [\n 105.325475,\n 23.390034\n ],\n [\n 105.238012,\n 23.264217\n ],\n [\n 105.093266,\n 23.260919\n ],\n [\n 104.886311,\n 23.169088\n ],\n [\n 104.804391,\n 23.110218\n ],\n [\n 104.860441,\n 22.970917\n ],\n [\n 104.737869,\n 22.825957\n ],\n [\n 104.579573,\n 22.84636\n ],\n [\n 104.375697,\n 22.690228\n ],\n [\n 104.272219,\n 22.738245\n ],\n [\n 104.274067,\n 22.828163\n ],\n [\n 104.117618,\n 22.808861\n ],\n [\n 104.045553,\n 22.728312\n ],\n [\n 104.009213,\n 22.51789\n ],\n [\n 103.964249,\n 22.502966\n ],\n [\n 103.825047,\n 22.615685\n ],\n [\n 103.642113,\n 22.795071\n ],\n [\n 103.566969,\n 22.698508\n ],\n [\n 103.53494,\n 22.594143\n ],\n [\n 103.436389,\n 22.697404\n ],\n [\n 103.441317,\n 22.753144\n ],\n [\n 103.323057,\n 22.807758\n ],\n [\n 103.283021,\n 22.678635\n ],\n [\n 103.195557,\n 22.648268\n ],\n [\n 103.183854,\n 22.557679\n ],\n [\n 103.081608,\n 22.506835\n ],\n [\n 103.079761,\n 22.448784\n ],\n [\n 102.930703,\n 22.482512\n ],\n [\n 102.880196,\n 22.586961\n ],\n [\n 102.688639,\n 22.700164\n ],\n [\n 102.603024,\n 22.731623\n ],\n [\n 102.570379,\n 22.700164\n ],\n [\n 102.510633,\n 22.774661\n ],\n [\n 102.384365,\n 22.679739\n ],\n [\n 102.420706,\n 22.636119\n ],\n [\n 102.322771,\n 22.554364\n ],\n [\n 102.25625,\n 22.457631\n ],\n [\n 102.270416,\n 22.419472\n ],\n [\n 102.046214,\n 22.457631\n ],\n [\n 101.907628,\n 22.43717\n ],\n [\n 101.862665,\n 22.389048\n ],\n [\n 101.76473,\n 22.506282\n ],\n [\n 101.672339,\n 22.474772\n ],\n [\n 101.625528,\n 22.282789\n ],\n [\n 101.547304,\n 22.237936\n ],\n [\n 101.596579,\n 22.160933\n ],\n [\n 101.573789,\n 22.114933\n ],\n [\n 101.626144,\n 22.006247\n ],\n [\n 101.606434,\n 21.967965\n ],\n [\n 101.701288,\n 21.938553\n ],\n [\n 101.777049,\n 21.826954\n ],\n [\n 101.747484,\n 21.730276\n ],\n [\n 101.780129,\n 21.640763\n ],\n [\n 101.754875,\n 21.585137\n ],\n [\n 101.745636,\n 21.29721\n ],\n [\n 101.833715,\n 21.252606\n ],\n [\n 101.76473,\n 21.147733\n ],\n [\n 101.672339,\n 21.195158\n ],\n [\n 101.605818,\n 21.172285\n ],\n [\n 101.604586,\n 21.229741\n ],\n [\n 101.532521,\n 21.252606\n ],\n [\n 101.387775,\n 21.225837\n ],\n [\n 101.290457,\n 21.178422\n ],\n [\n 101.222088,\n 21.234203\n ],\n [\n 101.244877,\n 21.302227\n ],\n [\n 101.142631,\n 21.409218\n ],\n [\n 101.194986,\n 21.425372\n ],\n [\n 101.209153,\n 21.557316\n ],\n [\n 101.117378,\n 21.689141\n ],\n [\n 101.123537,\n 21.771956\n ],\n [\n 101.015132,\n 21.70693\n ],\n [\n 100.870386,\n 21.672461\n ],\n [\n 100.730568,\n 21.518914\n ],\n [\n 100.558105,\n 21.450434\n ],\n [\n 100.48296,\n 21.459343\n ],\n [\n 100.437381,\n 21.532829\n ],\n [\n 100.351765,\n 21.52949\n ],\n [\n 100.247056,\n 21.463798\n ],\n [\n 100.199628,\n 21.512791\n ],\n [\n 100.126948,\n 21.508338\n ],\n [\n 100.107853,\n 21.585137\n ],\n [\n 100.169447,\n 21.663564\n ],\n [\n 100.095535,\n 21.704151\n ],\n [\n 99.991441,\n 21.703595\n ],\n [\n 99.944014,\n 21.821955\n ],\n [\n 99.999448,\n 21.970184\n ],\n [\n 99.972347,\n 22.052837\n ],\n [\n 99.871333,\n 22.0667\n ],\n [\n 99.870101,\n 22.029544\n ],\n [\n 99.486987,\n 22.12879\n ],\n [\n 99.400139,\n 22.099966\n ],\n [\n 99.220901,\n 22.111053\n ],\n [\n 99.156227,\n 22.160933\n ],\n [\n 99.235683,\n 22.250673\n ],\n [\n 99.282495,\n 22.401219\n ],\n [\n 99.381661,\n 22.503519\n ],\n [\n 99.385973,\n 22.57094\n ],\n [\n 99.31514,\n 22.737693\n ],\n [\n 99.385973,\n 22.761972\n ],\n [\n 99.457421,\n 22.84636\n ],\n [\n 99.456806,\n 22.932901\n ],\n [\n 99.563363,\n 22.925737\n ],\n [\n 99.517168,\n 23.006719\n ],\n [\n 99.528255,\n 23.065635\n ],\n [\n 99.3484,\n 23.128927\n ],\n [\n 99.255393,\n 23.077746\n ],\n [\n 99.106336,\n 23.086552\n ],\n [\n 98.889525,\n 23.209238\n ],\n [\n 98.936953,\n 23.309833\n ],\n [\n 98.872279,\n 23.484456\n ],\n [\n 98.826084,\n 23.470187\n ],\n [\n 98.808221,\n 23.547549\n ],\n [\n 98.877823,\n 23.59197\n ],\n [\n 98.786048,\n 23.781551\n ],\n [\n 98.669019,\n 23.800713\n ],\n [\n 98.701664,\n 23.834103\n ],\n [\n 98.701048,\n 23.946251\n ],\n [\n 98.899996,\n 24.109102\n ],\n [\n 98.875975,\n 24.150056\n ],\n [\n 98.716446,\n 24.12767\n ],\n [\n 98.611737,\n 24.08507\n ],\n [\n 98.550759,\n 24.125485\n ],\n [\n 98.360434,\n 24.097087\n ],\n [\n 98.225543,\n 24.113471\n ],\n [\n 98.110978,\n 24.092171\n ],\n [\n 97.902175,\n 24.01404\n ],\n [\n 97.894168,\n 23.973589\n ],\n [\n 97.769748,\n 23.933126\n ],\n [\n 97.711234,\n 23.861465\n ],\n [\n 97.5283,\n 23.926563\n ],\n [\n 97.634241,\n 24.046828\n ],\n [\n 97.730944,\n 24.113471\n ],\n [\n 97.729712,\n 24.227013\n ],\n [\n 97.767284,\n 24.258656\n ],\n [\n 97.658879,\n 24.326279\n ],\n [\n 97.716161,\n 24.358987\n ],\n [\n 97.669966,\n 24.452703\n ],\n [\n 97.531995,\n 24.43146\n ],\n [\n 97.570799,\n 24.602396\n ],\n [\n 97.570183,\n 24.766579\n ],\n [\n 97.701379,\n 24.842617\n ],\n [\n 97.764204,\n 24.824155\n ],\n [\n 97.785762,\n 24.875733\n ],\n [\n 97.716777,\n 24.978283\n ],\n [\n 97.839349,\n 25.27081\n ],\n [\n 97.914494,\n 25.211278\n ],\n [\n 98.014892,\n 25.305433\n ],\n [\n 98.06971,\n 25.311924\n ],\n [\n 98.15779,\n 25.457334\n ],\n [\n 98.131304,\n 25.510266\n ],\n [\n 98.189818,\n 25.569111\n ],\n [\n 98.170724,\n 25.620374\n ],\n [\n 98.247717,\n 25.607965\n ],\n [\n 98.314854,\n 25.543201\n ],\n [\n 98.402317,\n 25.593936\n ],\n [\n 98.457752,\n 25.68294\n ],\n [\n 98.476846,\n 25.777265\n ],\n [\n 98.553839,\n 25.845672\n ],\n [\n 98.640686,\n 25.798815\n ],\n [\n 98.704744,\n 25.852133\n ],\n [\n 98.686881,\n 25.925877\n ],\n [\n 98.614201,\n 25.968919\n ],\n [\n 98.575396,\n 26.118364\n ],\n [\n 98.634527,\n 26.145759\n ],\n [\n 98.662244,\n 26.0872\n ],\n [\n 98.735541,\n 26.183351\n ],\n [\n 98.672715,\n 26.240251\n ],\n [\n 98.733693,\n 26.350753\n ],\n [\n 98.753403,\n 26.559129\n ],\n [\n 98.781736,\n 26.62066\n ],\n [\n 98.746012,\n 26.697125\n ],\n [\n 98.757098,\n 26.87819\n ],\n [\n 98.732461,\n 27.002472\n ],\n [\n 98.765722,\n 27.050973\n ],\n [\n 98.712135,\n 27.077081\n ],\n [\n 98.696121,\n 27.211253\n ],\n [\n 98.734309,\n 27.35111\n ],\n [\n 98.706591,\n 27.362269\n ],\n [\n 98.674563,\n 27.582044\n ],\n [\n 98.583404,\n 27.571437\n ],\n [\n 98.444201,\n 27.665274\n ],\n [\n 98.429419,\n 27.548628\n ],\n [\n 98.317318,\n 27.519448\n ],\n [\n 98.278514,\n 27.659974\n ],\n [\n 98.234166,\n 27.690707\n ],\n [\n 98.222463,\n 27.812493\n ],\n [\n 98.169492,\n 27.851118\n ],\n [\n 98.205217,\n 27.88973\n ],\n [\n 98.133152,\n 27.99069\n ],\n [\n 98.160253,\n 28.101056\n ],\n [\n 98.139311,\n 28.142216\n ],\n [\n 98.168876,\n 28.204454\n ],\n [\n 98.266195,\n 28.24083\n ],\n [\n 98.208913,\n 28.35831\n ],\n [\n 98.301303,\n 28.384633\n ],\n [\n 98.37768,\n 28.246101\n ],\n [\n 98.389383,\n 28.114777\n ],\n [\n 98.428803,\n 28.10475\n ],\n [\n 98.559382,\n 28.182833\n ],\n [\n 98.626519,\n 28.165427\n ],\n [\n 98.712135,\n 28.229233\n ],\n [\n 98.752787,\n 28.333561\n ],\n [\n 98.677026,\n 28.463563\n ],\n [\n 98.627751,\n 28.487756\n ],\n [\n 98.638222,\n 28.55242\n ],\n [\n 98.594491,\n 28.667979\n ],\n [\n 98.683802,\n 28.739877\n ],\n [\n 98.652389,\n 28.816968\n ],\n [\n 98.657932,\n 28.93014\n ],\n [\n 98.765722,\n 29.006044\n ],\n [\n 98.815613,\n 28.948991\n ],\n [\n 98.828547,\n 28.820113\n ],\n [\n 98.912931,\n 28.800715\n ],\n [\n 98.972677,\n 28.832693\n ],\n [\n 98.917243,\n 28.888239\n ],\n [\n 98.925866,\n 28.978306\n ],\n [\n 99.009018,\n 29.031158\n ],\n [\n 98.967134,\n 29.128418\n ],\n [\n 98.976373,\n 29.204698\n ],\n [\n 99.113727,\n 29.221409\n ],\n [\n 99.132206,\n 28.948467\n ],\n [\n 99.103872,\n 28.842128\n ],\n [\n 99.126662,\n 28.699473\n ],\n [\n 99.183944,\n 28.588677\n ],\n [\n 99.174705,\n 28.402003\n ],\n [\n 99.280647,\n 28.298269\n ],\n [\n 99.306516,\n 28.227652\n ],\n [\n 99.374886,\n 28.181778\n ],\n [\n 99.437095,\n 28.398318\n ],\n [\n 99.403219,\n 28.546638\n ],\n [\n 99.463581,\n 28.549266\n ],\n [\n 99.532566,\n 28.681628\n ],\n [\n 99.615718,\n 28.741975\n ],\n [\n 99.625573,\n 28.814871\n ],\n [\n 99.717964,\n 28.846321\n ],\n [\n 99.733362,\n 28.719415\n ],\n [\n 99.793724,\n 28.699473\n ],\n [\n 99.987129,\n 28.524561\n ],\n [\n 99.990209,\n 28.476712\n ],\n [\n 100.073977,\n 28.42621\n ],\n [\n 100.054267,\n 28.376737\n ],\n [\n 100.176223,\n 28.324607\n ],\n [\n 100.157129,\n 28.210254\n ],\n [\n 100.033941,\n 28.184942\n ],\n [\n 100.086296,\n 28.030836\n ],\n [\n 100.196549,\n 27.936257\n ],\n [\n 100.210715,\n 27.877037\n ],\n [\n 100.295099,\n 27.869633\n ],\n [\n 100.327744,\n 27.720372\n ],\n [\n 100.442924,\n 27.866459\n ],\n [\n 100.54517,\n 27.809318\n ],\n [\n 100.633866,\n 27.915111\n ],\n [\n 100.681293,\n 27.923041\n ],\n [\n 100.707162,\n 27.80085\n ],\n [\n 100.782307,\n 27.691767\n ],\n [\n 100.848212,\n 27.670573\n ],\n [\n 100.936908,\n 27.469026\n ],\n [\n 101.021907,\n 27.332508\n ],\n [\n 101.057016,\n 27.20061\n ],\n [\n 101.170349,\n 27.195821\n ],\n [\n 101.136472,\n 27.023794\n ],\n [\n 101.264587,\n 26.955549\n ],\n [\n 101.267667,\n 26.902737\n ],\n [\n 101.399478,\n 26.841893\n ],\n [\n 101.357594,\n 26.770868\n ],\n [\n 101.389623,\n 26.723314\n ],\n [\n 101.512195,\n 26.756443\n ],\n [\n 101.453065,\n 26.692848\n ],\n [\n 101.451833,\n 26.600867\n ],\n [\n 101.400094,\n 26.605146\n ],\n [\n 101.458608,\n 26.495424\n ],\n [\n 101.506652,\n 26.499708\n ],\n [\n 101.636615,\n 26.395245\n ],\n [\n 101.660636,\n 26.346999\n ],\n [\n 101.586724,\n 26.279422\n ],\n [\n 101.630455,\n 26.224687\n ],\n [\n 101.690202,\n 26.241861\n ],\n [\n 101.807846,\n 26.156501\n ],\n [\n 101.799223,\n 26.109231\n ],\n [\n 101.86328,\n 26.052266\n ],\n [\n 101.917483,\n 26.108156\n ],\n [\n 102.005562,\n 26.091499\n ],\n [\n 102.005562,\n 26.091499\n ],\n [\n 102.107808,\n 26.068391\n ],\n [\n 102.245163,\n 26.212341\n ],\n [\n 102.349257,\n 26.244545\n ],\n [\n 102.392372,\n 26.296588\n ],\n [\n 102.567915,\n 26.36362\n ],\n [\n 102.638748,\n 26.307852\n ],\n [\n 102.60056,\n 26.250448\n ],\n [\n 102.674473,\n 26.205363\n ],\n [\n 102.739762,\n 26.268691\n ],\n [\n 102.998457,\n 26.371661\n ],\n [\n 102.989833,\n 26.483108\n ],\n [\n 103.056971,\n 26.525943\n ],\n [\n 103.018783,\n 26.593911\n ],\n [\n 102.991681,\n 26.775675\n ],\n [\n 102.898674,\n 26.908073\n ],\n [\n 102.870957,\n 27.026992\n ],\n [\n 102.913457,\n 27.133538\n ],\n [\n 102.882044,\n 27.293168\n ],\n [\n 102.941174,\n 27.405303\n ],\n [\n 102.989833,\n 27.368114\n ],\n [\n 103.111789,\n 27.401054\n ],\n [\n 103.222043,\n 27.566133\n ],\n [\n 103.295955,\n 27.568785\n ],\n [\n 103.29226,\n 27.632943\n ],\n [\n 103.487512,\n 27.795028\n ],\n [\n 103.515846,\n 27.965326\n ],\n [\n 103.488128,\n 28.03242\n ],\n [\n 103.430846,\n 28.044039\n ],\n [\n 103.471498,\n 28.123221\n ],\n [\n 103.573128,\n 28.230815\n ],\n [\n 103.639649,\n 28.261912\n ],\n [\n 103.721569,\n 28.201817\n ],\n [\n 103.877402,\n 28.311966\n ],\n [\n 103.781931,\n 28.525613\n ],\n [\n 103.838598,\n 28.587101\n ],\n [\n 103.844757,\n 28.660104\n ],\n [\n 103.940844,\n 28.606013\n ],\n [\n 104.12501,\n 28.637526\n ],\n [\n 104.314719,\n 28.615468\n ],\n [\n 104.425588,\n 28.626497\n ],\n [\n 104.318415,\n 28.538229\n ],\n [\n 104.261748,\n 28.537177\n ],\n [\n 104.254357,\n 28.408844\n ],\n [\n 104.314103,\n 28.306698\n ],\n [\n 104.384936,\n 28.329874\n ],\n [\n 104.44961,\n 28.269817\n ],\n [\n 104.44653,\n 28.112666\n ],\n [\n 104.354139,\n 28.019744\n ],\n [\n 104.40095,\n 27.952114\n ],\n [\n 104.573413,\n 27.840537\n ],\n [\n 104.743413,\n 27.901892\n ],\n [\n 104.872144,\n 27.905594\n ],\n [\n 105.05939,\n 28.097889\n ],\n [\n 105.186889,\n 28.0546\n ],\n [\n 105.186273,\n 27.995445\n ],\n [\n 105.270657,\n 27.99703\n ],\n [\n 105.284823,\n 27.935729\n ],\n [\n 105.233084,\n 27.895547\n ],\n [\n 105.244171,\n 27.823077\n ],\n [\n 105.308229,\n 27.810376\n ],\n [\n 105.308229,\n 27.810376\n ],\n [\n 105.273736,\n 27.795028\n ],\n [\n 105.308229,\n 27.705011\n ],\n [\n 105.305149,\n 27.612799\n ],\n [\n 105.232469,\n 27.546506\n ],\n [\n 105.260186,\n 27.514672\n ],\n [\n 105.184425,\n 27.393085\n ],\n [\n 105.067397,\n 27.418051\n ],\n [\n 104.871528,\n 27.291041\n ],\n [\n 104.808702,\n 27.35483\n ],\n [\n 104.609754,\n 27.306991\n ],\n [\n 104.546312,\n 27.330382\n ],\n [\n 104.497653,\n 27.411677\n ],\n [\n 104.363378,\n 27.467964\n ],\n [\n 104.174285,\n 27.262856\n ],\n [\n 104.113307,\n 27.338354\n ],\n [\n 104.01722,\n 27.383523\n ],\n [\n 104.015372,\n 27.429204\n ],\n [\n 103.932221,\n 27.444072\n ],\n [\n 103.903271,\n 27.347921\n ],\n [\n 103.711714,\n 27.14259\n ],\n [\n 103.624251,\n 27.112237\n ],\n [\n 103.638418,\n 27.013133\n ],\n [\n 103.675374,\n 27.051506\n ],\n [\n 103.77454,\n 26.951815\n ],\n [\n 103.779468,\n 26.874454\n ],\n [\n 103.705555,\n 26.794904\n ],\n [\n 103.773308,\n 26.716901\n ],\n [\n 103.764685,\n 26.584816\n ],\n [\n 103.865699,\n 26.512023\n ],\n [\n 104.052329,\n 26.507204\n ],\n [\n 104.120082,\n 26.636705\n ],\n [\n 104.354139,\n 26.621194\n ],\n [\n 104.421276,\n 26.712091\n ],\n [\n 104.487798,\n 26.579465\n ],\n [\n 104.554935,\n 26.590701\n ],\n [\n 104.683667,\n 26.377557\n ],\n [\n 104.592508,\n 26.317506\n ],\n [\n 104.499501,\n 26.070541\n ],\n [\n 104.414501,\n 25.909733\n ],\n [\n 104.441602,\n 25.869362\n ],\n [\n 104.373233,\n 25.731459\n ],\n [\n 104.328886,\n 25.760561\n ],\n [\n 104.309791,\n 25.648964\n ],\n [\n 104.332581,\n 25.598792\n ],\n [\n 104.420661,\n 25.585301\n ],\n [\n 104.434827,\n 25.47246\n ],\n [\n 104.556783,\n 25.524845\n ],\n [\n 104.543232,\n 25.400597\n ],\n [\n 104.646094,\n 25.356809\n ],\n [\n 104.639935,\n 25.298942\n ],\n [\n 104.816094,\n 25.262152\n ],\n [\n 104.822869,\n 25.17013\n ],\n [\n 104.750804,\n 25.215067\n ],\n [\n 104.667652,\n 25.05961\n ],\n [\n 104.713232,\n 24.996179\n ],\n [\n 104.539537,\n 24.813836\n ],\n [\n 104.529682,\n 24.73126\n ],\n [\n 104.492109,\n 24.656241\n ],\n [\n 104.610986,\n 24.376973\n ],\n [\n 104.70892,\n 24.321372\n ],\n [\n 104.72863,\n 24.446167\n ],\n [\n 104.83642,\n 24.446712\n ],\n [\n 104.979933,\n 24.412937\n ],\n [\n 105.063085,\n 24.429281\n ],\n [\n 105.063085,\n 24.429281\n ],\n [\n 105.188121,\n 24.346995\n ],\n [\n 105.164715,\n 24.288109\n ],\n [\n 105.229389,\n 24.165888\n ],\n [\n 105.20044,\n 24.105279\n ],\n [\n 105.260186,\n 24.061033\n ],\n [\n 105.320548,\n 24.116202\n ],\n [\n 105.481924,\n 24.018958\n ],\n [\n 105.529967,\n 24.129308\n ],\n [\n 105.628518,\n 24.126577\n ],\n [\n 105.649459,\n 24.033167\n ],\n [\n 105.704278,\n 24.066497\n ],\n [\n 105.89214,\n 24.040271\n ],\n [\n 105.933407,\n 24.123847\n ],\n [\n 106.04982,\n 24.089986\n ],\n [\n 106.192102,\n 23.824798\n ],\n [\n 106.136667,\n 23.795238\n ],\n [\n 106.157609,\n 23.724048\n ],\n [\n 106.120653,\n 23.605129\n ],\n [\n 106.141595,\n 23.569487\n ],\n [\n 105.999929,\n 23.447683\n ],\n [\n 105.89214,\n 23.525058\n ],\n [\n 105.815763,\n 23.506953\n ],\n [\n 105.699966,\n 23.401566\n ],\n [\n 105.694423,\n 23.363122\n ],\n [\n 105.531815,\n 23.248275\n ],\n [\n 105.542902,\n 23.18449\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 540000,\n \"name\": \"西藏自治区\",\n \"center\": [\n 91.132212,\n 29.660361\n ],\n \"centroid\": [\n 88.388277,\n 31.56375\n ],\n \"childrenNum\": 7,\n \"level\": \"province\",\n \"subFeatureIndex\": 25,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 79.039649,\n 34.33427\n ],\n [\n 79.0107,\n 34.399956\n ],\n [\n 79.161605,\n 34.441416\n ],\n [\n 79.229358,\n 34.413778\n ],\n [\n 79.504683,\n 34.454737\n ],\n [\n 79.675914,\n 34.451284\n ],\n [\n 79.801566,\n 34.478909\n ],\n [\n 79.906892,\n 34.683837\n ],\n [\n 79.947544,\n 34.820993\n ],\n [\n 80.034391,\n 34.902\n ],\n [\n 80.031311,\n 35.034384\n ],\n [\n 80.118159,\n 35.066222\n ],\n [\n 80.23026,\n 35.147476\n ],\n [\n 80.257977,\n 35.20323\n ],\n [\n 80.362687,\n 35.209096\n ],\n [\n 80.268448,\n 35.294114\n ],\n [\n 80.321419,\n 35.386848\n ],\n [\n 80.412578,\n 35.433663\n ],\n [\n 80.516672,\n 35.392214\n ],\n [\n 80.65649,\n 35.394165\n ],\n [\n 80.689135,\n 35.33903\n ],\n [\n 80.844351,\n 35.345375\n ],\n [\n 81.026053,\n 35.312181\n ],\n [\n 81.031597,\n 35.380506\n ],\n [\n 81.09935,\n 35.407333\n ],\n [\n 81.219458,\n 35.319016\n ],\n [\n 81.362356,\n 35.354647\n ],\n [\n 81.494167,\n 35.292161\n ],\n [\n 81.513261,\n 35.235002\n ],\n [\n 81.675253,\n 35.233536\n ],\n [\n 81.736847,\n 35.262365\n ],\n [\n 81.927789,\n 35.271158\n ],\n [\n 82.05344,\n 35.350255\n ],\n [\n 82.033114,\n 35.450236\n ],\n [\n 82.328149,\n 35.559342\n ],\n [\n 82.336156,\n 35.651284\n ],\n [\n 82.424852,\n 35.713006\n ],\n [\n 82.628727,\n 35.692114\n ],\n [\n 82.731589,\n 35.63767\n ],\n [\n 82.788872,\n 35.684824\n ],\n [\n 82.960719,\n 35.671702\n ],\n [\n 82.998907,\n 35.484348\n ],\n [\n 83.067892,\n 35.462908\n ],\n [\n 83.127022,\n 35.398554\n ],\n [\n 83.242203,\n 35.420011\n ],\n [\n 83.451006,\n 35.38197\n ],\n [\n 83.622238,\n 35.335614\n ],\n [\n 83.677672,\n 35.360991\n ],\n [\n 83.885244,\n 35.367334\n ],\n [\n 84.005968,\n 35.422449\n ],\n [\n 84.095895,\n 35.362943\n ],\n [\n 84.1618,\n 35.359039\n ],\n [\n 84.335495,\n 35.414647\n ],\n [\n 84.45314,\n 35.473141\n ],\n [\n 84.448828,\n 35.55058\n ],\n [\n 84.729081,\n 35.613353\n ],\n [\n 85.053065,\n 35.751862\n ],\n [\n 85.159006,\n 35.745549\n ],\n [\n 85.271107,\n 35.788757\n ],\n [\n 85.372121,\n 35.701346\n ],\n [\n 85.613569,\n 35.652257\n ],\n [\n 85.65299,\n 35.731465\n ],\n [\n 85.811286,\n 35.779049\n ],\n [\n 85.949256,\n 35.779049\n ],\n [\n 86.060125,\n 35.846008\n ],\n [\n 86.132806,\n 35.979271\n ],\n [\n 86.199944,\n 36.032513\n ],\n [\n 86.187625,\n 36.131158\n ],\n [\n 86.392733,\n 36.206992\n ],\n [\n 86.515305,\n 36.205543\n ],\n [\n 86.701318,\n 36.245122\n ],\n [\n 86.746282,\n 36.291916\n ],\n [\n 86.862078,\n 36.300114\n ],\n [\n 86.887332,\n 36.262492\n ],\n [\n 86.996353,\n 36.308793\n ],\n [\n 87.149106,\n 36.29722\n ],\n [\n 87.193454,\n 36.349283\n ],\n [\n 87.306787,\n 36.363739\n ],\n [\n 87.361605,\n 36.419128\n ],\n [\n 87.460155,\n 36.409498\n ],\n [\n 87.470626,\n 36.354102\n ],\n [\n 87.570409,\n 36.342536\n ],\n [\n 87.731785,\n 36.384936\n ],\n [\n 87.949211,\n 36.401312\n ],\n [\n 87.983088,\n 36.437903\n ],\n [\n 88.134609,\n 36.427313\n ],\n [\n 88.241782,\n 36.468704\n ],\n [\n 88.365586,\n 36.457636\n ],\n [\n 88.470912,\n 36.482175\n ],\n [\n 88.573158,\n 36.461005\n ],\n [\n 88.623665,\n 36.389271\n ],\n [\n 88.783809,\n 36.291916\n ],\n [\n 88.802903,\n 36.337717\n ],\n [\n 88.926091,\n 36.364221\n ],\n [\n 88.964279,\n 36.318917\n ],\n [\n 89.10225,\n 36.281305\n ],\n [\n 89.127503,\n 36.249465\n ],\n [\n 89.232213,\n 36.295774\n ],\n [\n 89.287647,\n 36.235954\n ],\n [\n 89.375727,\n 36.228231\n ],\n [\n 89.490291,\n 36.150969\n ],\n [\n 89.711414,\n 36.092972\n ],\n [\n 89.638117,\n 36.04993\n ],\n [\n 89.476125,\n 36.021868\n ],\n [\n 89.418843,\n 36.04606\n ],\n [\n 89.429929,\n 35.916302\n ],\n [\n 89.549422,\n 35.858132\n ],\n [\n 89.801957,\n 35.847948\n ],\n [\n 89.747138,\n 35.751862\n ],\n [\n 89.765616,\n 35.599732\n ],\n [\n 89.700327,\n 35.537435\n ],\n [\n 89.744058,\n 35.479963\n ],\n [\n 89.68616,\n 35.414647\n ],\n [\n 89.497067,\n 35.361479\n ],\n [\n 89.532175,\n 35.285323\n ],\n [\n 89.449639,\n 35.226693\n ],\n [\n 89.513081,\n 35.139158\n ],\n [\n 89.593153,\n 35.104412\n ],\n [\n 89.560509,\n 34.938794\n ],\n [\n 89.654747,\n 34.883351\n ],\n [\n 89.707102,\n 34.919663\n ],\n [\n 89.821667,\n 34.902981\n ],\n [\n 89.867862,\n 34.810677\n ],\n [\n 89.799493,\n 34.74384\n ],\n [\n 89.732356,\n 34.732039\n ],\n [\n 89.72558,\n 34.660709\n ],\n [\n 89.798877,\n 34.628714\n ],\n [\n 89.823515,\n 34.455231\n ],\n [\n 89.801957,\n 34.390575\n ],\n [\n 89.872174,\n 34.335752\n ],\n [\n 89.825362,\n 34.293746\n ],\n [\n 89.818587,\n 34.174037\n ],\n [\n 89.655979,\n 34.096778\n ],\n [\n 89.635037,\n 34.0492\n ],\n [\n 89.691704,\n 33.957933\n ],\n [\n 89.795181,\n 33.865575\n ],\n [\n 89.837065,\n 33.869052\n ],\n [\n 89.933768,\n 33.796986\n ],\n [\n 89.907282,\n 33.74128\n ],\n [\n 90.008296,\n 33.688026\n ],\n [\n 89.984275,\n 33.61232\n ],\n [\n 90.01076,\n 33.553501\n ],\n [\n 90.080977,\n 33.530561\n ],\n [\n 90.092064,\n 33.469691\n ],\n [\n 90.246665,\n 33.42426\n ],\n [\n 90.332896,\n 33.310829\n ],\n [\n 90.405577,\n 33.260311\n ],\n [\n 90.486881,\n 33.266815\n ],\n [\n 90.70554,\n 33.135645\n ],\n [\n 90.805938,\n 33.114599\n ],\n [\n 91.001807,\n 33.116102\n ],\n [\n 91.001807,\n 33.116102\n ],\n [\n 91.134849,\n 33.073495\n ],\n [\n 91.262349,\n 33.141156\n ],\n [\n 91.436044,\n 33.065974\n ],\n [\n 91.49887,\n 33.109086\n ],\n [\n 91.58079,\n 33.039395\n ],\n [\n 91.785281,\n 32.944044\n ],\n [\n 91.896766,\n 32.907884\n ],\n [\n 91.955897,\n 32.820437\n ],\n [\n 92.145606,\n 32.885779\n ],\n [\n 92.227526,\n 32.820939\n ],\n [\n 92.198577,\n 32.755046\n ],\n [\n 92.255243,\n 32.720823\n ],\n [\n 92.355641,\n 32.764606\n ],\n [\n 92.63651,\n 32.720319\n ],\n [\n 92.686401,\n 32.765109\n ],\n [\n 92.877342,\n 32.697161\n ],\n [\n 93.019624,\n 32.737433\n ],\n [\n 93.069515,\n 32.626137\n ],\n [\n 93.239514,\n 32.662411\n ],\n [\n 93.385492,\n 32.525297\n ],\n [\n 93.4631,\n 32.556065\n ],\n [\n 93.516687,\n 32.475844\n ],\n [\n 93.618933,\n 32.522775\n ],\n [\n 93.654657,\n 32.57321\n ],\n [\n 93.820345,\n 32.549509\n ],\n [\n 93.861613,\n 32.466253\n ],\n [\n 93.958931,\n 32.484929\n ],\n [\n 94.136322,\n 32.433939\n ],\n [\n 94.196684,\n 32.516216\n ],\n [\n 94.371611,\n 32.524793\n ],\n [\n 94.395016,\n 32.594385\n ],\n [\n 94.53853,\n 32.599425\n ],\n [\n 94.614291,\n 32.673492\n ],\n [\n 94.772587,\n 32.555057\n ],\n [\n 94.80708,\n 32.486444\n ],\n [\n 94.889616,\n 32.472311\n ],\n [\n 94.912405,\n 32.415758\n ],\n [\n 94.985086,\n 32.421819\n ],\n [\n 95.081789,\n 32.384942\n ],\n [\n 95.218527,\n 32.397067\n ],\n [\n 95.261643,\n 32.348049\n ],\n [\n 95.096571,\n 32.322267\n ],\n [\n 95.10581,\n 32.259042\n ],\n [\n 95.241317,\n 32.32075\n ],\n [\n 95.26965,\n 32.194761\n ],\n [\n 95.312766,\n 32.148673\n ],\n [\n 95.406389,\n 32.182102\n ],\n [\n 95.454432,\n 32.062006\n ],\n [\n 95.360809,\n 31.959013\n ],\n [\n 95.439649,\n 31.831508\n ],\n [\n 95.546823,\n 31.739961\n ],\n [\n 95.618272,\n 31.783712\n ],\n [\n 95.779648,\n 31.74912\n ],\n [\n 95.825227,\n 31.681935\n ],\n [\n 95.89914,\n 31.817273\n ],\n [\n 95.982908,\n 31.816765\n ],\n [\n 96.041422,\n 31.734364\n ],\n [\n 96.135661,\n 31.702299\n ],\n [\n 96.160298,\n 31.600943\n ],\n [\n 96.204646,\n 31.598904\n ],\n [\n 96.252689,\n 31.69619\n ],\n [\n 96.176313,\n 31.777608\n ],\n [\n 96.253921,\n 31.929566\n ],\n [\n 96.389428,\n 31.919917\n ],\n [\n 96.468268,\n 31.769978\n ],\n [\n 96.576057,\n 31.712989\n ],\n [\n 96.616093,\n 31.736908\n ],\n [\n 96.775006,\n 31.673788\n ],\n [\n 96.840295,\n 31.720623\n ],\n [\n 96.760223,\n 31.856922\n ],\n [\n 96.81073,\n 31.894521\n ],\n [\n 96.722651,\n 32.013314\n ],\n [\n 96.894498,\n 32.013822\n ],\n [\n 97.008447,\n 32.067076\n ],\n [\n 97.130403,\n 32.04375\n ],\n [\n 97.308409,\n 32.074682\n ],\n [\n 97.264062,\n 32.183621\n ],\n [\n 97.299786,\n 32.294959\n ],\n [\n 97.371235,\n 32.273208\n ],\n [\n 97.424822,\n 32.323278\n ],\n [\n 97.387865,\n 32.427374\n ],\n [\n 97.341054,\n 32.441009\n ],\n [\n 97.388481,\n 32.501583\n ],\n [\n 97.334895,\n 32.514198\n ],\n [\n 97.448843,\n 32.586823\n ],\n [\n 97.472249,\n 32.54497\n ],\n [\n 97.670582,\n 32.517225\n ],\n [\n 97.730944,\n 32.527315\n ],\n [\n 97.937283,\n 32.484425\n ],\n [\n 98.218768,\n 32.342489\n ],\n [\n 98.218768,\n 32.234752\n ],\n [\n 98.301919,\n 32.12334\n ],\n [\n 98.434962,\n 32.007734\n ],\n [\n 98.414636,\n 31.832525\n ],\n [\n 98.543983,\n 31.718588\n ],\n [\n 98.553839,\n 31.656473\n ],\n [\n 98.713367,\n 31.510189\n ],\n [\n 98.837787,\n 31.436705\n ],\n [\n 98.88583,\n 31.376446\n ],\n [\n 98.773113,\n 31.249163\n ],\n [\n 98.691809,\n 31.333016\n ],\n [\n 98.64007,\n 31.337615\n ],\n [\n 98.602498,\n 31.192367\n ],\n [\n 98.709671,\n 31.118635\n ],\n [\n 98.736772,\n 31.049459\n ],\n [\n 98.806374,\n 30.995621\n ],\n [\n 98.774345,\n 30.907877\n ],\n [\n 98.901844,\n 30.785105\n ],\n [\n 98.957895,\n 30.765056\n ],\n [\n 98.907388,\n 30.698196\n ],\n [\n 98.989308,\n 30.151826\n ],\n [\n 99.044742,\n 30.079885\n ],\n [\n 99.068148,\n 29.93118\n ],\n [\n 99.0238,\n 29.846105\n ],\n [\n 98.993003,\n 29.656502\n ],\n [\n 99.052133,\n 29.563908\n ],\n [\n 99.075539,\n 29.314316\n ],\n [\n 99.113727,\n 29.221409\n ],\n [\n 98.976373,\n 29.204698\n ],\n [\n 98.967134,\n 29.128418\n ],\n [\n 99.009018,\n 29.031158\n ],\n [\n 98.925866,\n 28.978306\n ],\n [\n 98.917243,\n 28.888239\n ],\n [\n 98.972677,\n 28.832693\n ],\n [\n 98.912931,\n 28.800715\n ],\n [\n 98.828547,\n 28.820113\n ],\n [\n 98.815613,\n 28.948991\n ],\n [\n 98.765722,\n 29.006044\n ],\n [\n 98.657932,\n 28.93014\n ],\n [\n 98.652389,\n 28.816968\n ],\n [\n 98.683802,\n 28.739877\n ],\n [\n 98.594491,\n 28.667979\n ],\n [\n 98.638222,\n 28.55242\n ],\n [\n 98.627751,\n 28.487756\n ],\n [\n 98.677026,\n 28.463563\n ],\n [\n 98.752787,\n 28.333561\n ],\n [\n 98.712135,\n 28.229233\n ],\n [\n 98.626519,\n 28.165427\n ],\n [\n 98.559382,\n 28.182833\n ],\n [\n 98.428803,\n 28.10475\n ],\n [\n 98.389383,\n 28.114777\n ],\n [\n 98.37768,\n 28.246101\n ],\n [\n 98.301303,\n 28.384633\n ],\n [\n 98.208913,\n 28.35831\n ],\n [\n 98.266195,\n 28.24083\n ],\n [\n 98.168876,\n 28.204454\n ],\n [\n 98.139311,\n 28.142216\n ],\n [\n 98.090036,\n 28.195489\n ],\n [\n 98.03337,\n 28.187052\n ],\n [\n 98.020435,\n 28.25348\n ],\n [\n 97.907718,\n 28.363575\n ],\n [\n 97.801161,\n 28.326714\n ],\n [\n 97.738335,\n 28.396213\n ],\n [\n 97.737103,\n 28.465667\n ],\n [\n 97.68598,\n 28.51983\n ],\n [\n 97.569567,\n 28.541382\n ],\n [\n 97.506126,\n 28.471453\n ],\n [\n 97.485184,\n 28.386212\n ],\n [\n 97.518445,\n 28.327767\n ],\n [\n 97.460546,\n 28.268236\n ],\n [\n 97.42359,\n 28.297742\n ],\n [\n 97.350909,\n 28.23714\n ],\n [\n 97.321344,\n 28.054071\n ],\n [\n 97.413119,\n 28.013406\n ],\n [\n 97.386634,\n 27.882855\n ],\n [\n 97.303482,\n 27.913525\n ],\n [\n 97.062649,\n 27.742615\n ],\n [\n 97.049099,\n 27.814081\n ],\n [\n 96.972722,\n 27.861169\n ],\n [\n 96.849534,\n 27.874393\n ],\n [\n 96.784245,\n 27.9315\n ],\n [\n 96.690622,\n 27.948943\n ],\n [\n 96.572978,\n 28.058296\n ],\n [\n 96.499681,\n 28.067271\n ],\n [\n 96.46334,\n 28.143271\n ],\n [\n 96.398667,\n 28.118471\n ],\n [\n 96.297037,\n 28.141161\n ],\n [\n 96.275479,\n 28.228179\n ],\n [\n 95.989067,\n 28.198126\n ],\n [\n 95.874502,\n 28.297742\n ],\n [\n 95.674322,\n 28.254007\n ],\n [\n 95.371896,\n 28.110028\n ],\n [\n 95.28628,\n 27.939957\n ],\n [\n 95.015267,\n 27.828897\n ],\n [\n 94.88592,\n 27.743145\n ],\n [\n 94.524979,\n 27.596362\n ],\n [\n 94.277372,\n 27.580983\n ],\n [\n 93.970634,\n 27.305396\n ],\n [\n 93.849294,\n 27.168676\n ],\n [\n 93.841903,\n 27.045645\n ],\n [\n 93.56781,\n 26.937948\n ],\n [\n 93.232739,\n 26.907006\n ],\n [\n 93.111399,\n 26.880325\n ],\n [\n 92.909371,\n 26.914475\n ],\n [\n 92.802813,\n 26.895267\n ],\n [\n 92.682089,\n 26.948082\n ],\n [\n 92.57122,\n 26.946482\n ],\n [\n 92.404916,\n 26.902737\n ],\n [\n 92.109265,\n 26.854705\n ],\n [\n 92.124664,\n 26.959815\n ],\n [\n 92.043976,\n 27.052572\n ],\n [\n 92.032273,\n 27.168144\n ],\n [\n 92.125896,\n 27.27296\n ],\n [\n 92.010715,\n 27.474866\n ],\n [\n 91.839484,\n 27.489728\n ],\n [\n 91.753868,\n 27.462656\n ],\n [\n 91.585101,\n 27.54014\n ],\n [\n 91.570934,\n 27.650965\n ],\n [\n 91.642383,\n 27.766442\n ],\n [\n 91.611586,\n 27.891316\n ],\n [\n 91.486551,\n 27.937314\n ],\n [\n 91.464993,\n 28.002841\n ],\n [\n 91.309776,\n 28.057768\n ],\n [\n 91.251878,\n 27.970611\n ],\n [\n 91.162567,\n 27.968497\n ],\n [\n 91.113292,\n 27.846357\n ],\n [\n 90.96485,\n 27.900306\n ],\n [\n 90.96177,\n 27.9537\n ],\n [\n 90.896481,\n 27.9463\n ],\n [\n 90.802242,\n 28.040342\n ],\n [\n 90.701844,\n 28.076246\n ],\n [\n 90.591591,\n 28.021329\n ],\n [\n 90.513983,\n 28.061992\n ],\n [\n 90.384019,\n 28.060936\n ],\n [\n 90.296556,\n 28.15435\n ],\n [\n 90.231882,\n 28.144854\n ],\n [\n 90.124709,\n 28.190743\n ],\n [\n 90.03355,\n 28.13694\n ],\n [\n 89.976268,\n 28.189161\n ],\n [\n 89.906051,\n 28.180723\n ],\n [\n 89.789638,\n 28.24083\n ],\n [\n 89.720037,\n 28.170175\n ],\n [\n 89.605472,\n 28.161735\n ],\n [\n 89.461958,\n 28.031892\n ],\n [\n 89.375727,\n 27.875979\n ],\n [\n 89.238988,\n 27.796616\n ],\n [\n 89.184786,\n 27.673752\n ],\n [\n 89.131815,\n 27.633474\n ],\n [\n 89.163228,\n 27.574619\n ],\n [\n 89.095474,\n 27.471681\n ],\n [\n 89.182938,\n 27.373959\n ],\n [\n 89.077612,\n 27.287319\n ],\n [\n 89.057286,\n 27.234663\n ],\n [\n 88.975982,\n 27.217106\n ],\n [\n 88.911924,\n 27.274024\n ],\n [\n 88.920548,\n 27.325598\n ],\n [\n 88.809063,\n 27.405834\n ],\n [\n 88.770874,\n 27.567724\n ],\n [\n 88.852178,\n 27.671103\n ],\n [\n 88.888519,\n 27.846886\n ],\n [\n 88.842939,\n 28.006539\n ],\n [\n 88.764099,\n 28.068327\n ],\n [\n 88.67602,\n 28.068327\n ],\n [\n 88.645223,\n 28.111083\n ],\n [\n 88.565151,\n 28.083109\n ],\n [\n 88.554064,\n 28.027667\n ],\n [\n 88.478919,\n 28.034005\n ],\n [\n 88.401311,\n 27.976952\n ],\n [\n 88.254101,\n 27.939429\n ],\n [\n 88.156783,\n 27.957928\n ],\n [\n 88.111819,\n 27.864872\n ],\n [\n 87.826639,\n 27.927799\n ],\n [\n 87.727473,\n 27.802967\n ],\n [\n 87.590119,\n 27.848473\n ],\n [\n 87.45954,\n 27.82096\n ],\n [\n 87.420735,\n 27.859053\n ],\n [\n 87.364069,\n 27.824135\n ],\n [\n 87.280917,\n 27.845299\n ],\n [\n 87.227946,\n 27.813022\n ],\n [\n 87.118309,\n 27.840537\n ],\n [\n 87.035157,\n 27.9463\n ],\n [\n 86.935375,\n 27.955285\n ],\n [\n 86.864542,\n 28.022385\n ],\n [\n 86.756753,\n 28.032948\n ],\n [\n 86.700086,\n 28.101583\n ],\n [\n 86.647732,\n 28.069383\n ],\n [\n 86.568891,\n 28.103167\n ],\n [\n 86.514689,\n 27.954757\n ],\n [\n 86.450015,\n 27.908766\n ],\n [\n 86.231972,\n 27.97431\n ],\n [\n 86.19132,\n 28.16701\n ],\n [\n 86.082915,\n 28.01816\n ],\n [\n 86.125415,\n 27.923041\n ],\n [\n 86.053966,\n 27.900306\n ],\n [\n 85.949256,\n 27.937314\n ],\n [\n 85.980053,\n 27.984349\n ],\n [\n 85.901213,\n 28.053543\n ],\n [\n 85.854402,\n 28.172284\n ],\n [\n 85.753388,\n 28.227652\n ],\n [\n 85.720743,\n 28.371999\n ],\n [\n 85.682555,\n 28.375684\n ],\n [\n 85.650526,\n 28.283517\n ],\n [\n 85.526106,\n 28.324607\n ],\n [\n 85.415853,\n 28.321447\n ],\n [\n 85.272339,\n 28.282463\n ],\n [\n 85.209513,\n 28.338827\n ],\n [\n 85.113427,\n 28.34462\n ],\n [\n 85.108499,\n 28.461459\n ],\n [\n 85.189803,\n 28.545062\n ],\n [\n 85.195963,\n 28.623871\n ],\n [\n 85.126361,\n 28.675854\n ],\n [\n 85.05676,\n 28.674279\n ],\n [\n 84.981616,\n 28.586576\n ],\n [\n 84.857196,\n 28.56766\n ],\n [\n 84.698284,\n 28.633325\n ],\n [\n 84.650856,\n 28.714692\n ],\n [\n 84.483321,\n 28.735155\n ],\n [\n 84.408176,\n 28.854182\n ],\n [\n 84.234481,\n 28.889287\n ],\n [\n 84.248648,\n 29.030635\n ],\n [\n 84.194445,\n 29.044759\n ],\n [\n 84.20738,\n 29.118487\n ],\n [\n 84.116837,\n 29.286661\n ],\n [\n 84.002272,\n 29.291358\n ],\n [\n 83.917273,\n 29.324749\n ],\n [\n 83.727563,\n 29.244383\n ],\n [\n 83.656114,\n 29.167088\n ],\n [\n 83.548941,\n 29.201042\n ],\n [\n 83.266841,\n 29.571194\n ],\n [\n 83.12887,\n 29.62374\n ],\n [\n 83.088834,\n 29.605014\n ],\n [\n 82.9484,\n 29.704846\n ],\n [\n 82.830756,\n 29.687694\n ],\n [\n 82.703872,\n 29.847662\n ],\n [\n 82.6238,\n 29.834687\n ],\n [\n 82.560974,\n 29.955547\n ],\n [\n 82.498148,\n 29.947771\n ],\n [\n 82.412533,\n 30.012037\n ],\n [\n 82.246845,\n 30.071601\n ],\n [\n 82.17786,\n 30.067976\n ],\n [\n 82.207425,\n 30.143548\n ],\n [\n 82.114418,\n 30.226816\n ],\n [\n 82.104563,\n 30.346682\n ],\n [\n 81.99123,\n 30.322927\n ],\n [\n 81.872354,\n 30.373012\n ],\n [\n 81.759021,\n 30.385401\n ],\n [\n 81.63029,\n 30.446802\n ],\n [\n 81.566232,\n 30.428747\n ],\n [\n 81.555761,\n 30.369399\n ],\n [\n 81.406704,\n 30.40398\n ],\n [\n 81.427646,\n 30.305366\n ],\n [\n 81.393769,\n 30.199413\n ],\n [\n 81.335871,\n 30.150791\n ],\n [\n 81.269349,\n 30.153378\n ],\n [\n 81.293371,\n 30.094899\n ],\n [\n 81.225618,\n 30.005301\n ],\n [\n 81.131995,\n 30.016181\n ],\n [\n 81.034677,\n 30.246977\n ],\n [\n 80.81725,\n 30.321378\n ],\n [\n 80.719316,\n 30.414816\n ],\n [\n 80.633084,\n 30.458665\n ],\n [\n 80.549316,\n 30.448866\n ],\n [\n 80.322035,\n 30.564338\n ],\n [\n 80.214245,\n 30.585974\n ],\n [\n 80.124934,\n 30.558671\n ],\n [\n 80.04363,\n 30.603485\n ],\n [\n 79.970333,\n 30.685848\n ],\n [\n 79.961094,\n 30.771225\n ],\n [\n 79.890877,\n 30.854986\n ],\n [\n 79.835443,\n 30.850876\n ],\n [\n 79.75845,\n 30.93662\n ],\n [\n 79.668523,\n 30.980233\n ],\n [\n 79.59769,\n 30.925843\n ],\n [\n 79.505915,\n 31.027415\n ],\n [\n 79.427075,\n 31.018186\n ],\n [\n 79.421531,\n 31.067399\n ],\n [\n 79.316206,\n 31.017673\n ],\n [\n 79.33222,\n 30.96946\n ],\n [\n 79.227511,\n 30.94945\n ],\n [\n 79.181931,\n 31.015622\n ],\n [\n 79.0957,\n 30.993057\n ],\n [\n 79.010084,\n 31.044333\n ],\n [\n 78.997765,\n 31.159093\n ],\n [\n 78.865338,\n 31.313082\n ],\n [\n 78.841933,\n 31.288542\n ],\n [\n 78.755085,\n 31.3555\n ],\n [\n 78.792041,\n 31.436195\n ],\n [\n 78.729832,\n 31.478047\n ],\n [\n 78.740303,\n 31.532631\n ],\n [\n 78.845628,\n 31.610115\n ],\n [\n 78.763092,\n 31.668696\n ],\n [\n 78.706426,\n 31.778626\n ],\n [\n 78.654071,\n 31.821849\n ],\n [\n 78.739687,\n 31.885376\n ],\n [\n 78.762476,\n 31.946829\n ],\n [\n 78.599868,\n 32.024982\n ],\n [\n 78.519796,\n 32.123847\n ],\n [\n 78.469905,\n 32.127901\n ],\n [\n 78.430485,\n 32.211975\n ],\n [\n 78.511173,\n 32.308108\n ],\n [\n 78.458818,\n 32.379889\n ],\n [\n 78.472985,\n 32.435454\n ],\n [\n 78.395377,\n 32.530342\n ],\n [\n 78.518564,\n 32.605978\n ],\n [\n 78.628202,\n 32.630168\n ],\n [\n 78.741534,\n 32.703706\n ],\n [\n 78.781571,\n 32.607994\n ],\n [\n 78.760629,\n 32.56363\n ],\n [\n 78.81052,\n 32.436464\n ],\n [\n 78.970664,\n 32.331873\n ],\n [\n 79.005772,\n 32.375341\n ],\n [\n 79.103091,\n 32.369782\n ],\n [\n 79.135736,\n 32.472311\n ],\n [\n 79.252148,\n 32.51672\n ],\n [\n 79.308199,\n 32.596905\n ],\n [\n 79.27309,\n 32.678025\n ],\n [\n 79.301423,\n 32.728877\n ],\n [\n 79.224431,\n 32.784729\n ],\n [\n 79.255844,\n 32.942537\n ],\n [\n 79.162837,\n 33.011804\n ],\n [\n 79.139431,\n 33.117606\n ],\n [\n 79.162221,\n 33.166202\n ],\n [\n 79.072294,\n 33.228286\n ],\n [\n 79.022403,\n 33.323328\n ],\n [\n 78.84686,\n 33.421264\n ],\n [\n 78.74215,\n 33.553501\n ],\n [\n 78.755085,\n 33.623281\n ],\n [\n 78.692259,\n 33.676575\n ],\n [\n 78.779723,\n 33.732323\n ],\n [\n 78.758165,\n 33.791019\n ],\n [\n 78.744614,\n 33.980759\n ],\n [\n 78.656535,\n 34.030359\n ],\n [\n 78.661462,\n 34.086868\n ],\n [\n 78.750158,\n 34.092815\n ],\n [\n 78.793273,\n 34.132445\n ],\n [\n 78.9257,\n 34.155719\n ],\n [\n 78.981751,\n 34.318458\n ],\n [\n 79.039649,\n 34.33427\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 610000,\n \"name\": \"陕西省\",\n \"center\": [\n 108.948024,\n 34.263161\n ],\n \"centroid\": [\n 108.887567,\n 35.263665\n ],\n \"childrenNum\": 10,\n \"level\": \"province\",\n \"subFeatureIndex\": 26,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 107.288474,\n 37.00812\n ],\n [\n 107.288474,\n 37.00812\n ],\n [\n 107.268764,\n 37.099324\n ],\n [\n 107.336517,\n 37.165628\n ],\n [\n 107.257677,\n 37.337082\n ],\n [\n 107.284162,\n 37.482036\n ],\n [\n 107.342061,\n 37.515265\n ],\n [\n 107.348836,\n 37.608226\n ],\n [\n 107.484959,\n 37.706279\n ],\n [\n 107.499125,\n 37.7659\n ],\n [\n 107.620465,\n 37.775832\n ],\n [\n 107.65003,\n 37.864688\n ],\n [\n 107.982022,\n 37.787181\n ],\n [\n 108.025137,\n 37.649926\n ],\n [\n 108.134159,\n 37.621971\n ],\n [\n 108.219158,\n 37.661295\n ],\n [\n 108.304158,\n 37.638556\n ],\n [\n 108.440896,\n 37.654663\n ],\n [\n 108.532671,\n 37.690656\n ],\n [\n 108.611512,\n 37.65419\n ],\n [\n 108.777815,\n 37.683554\n ],\n [\n 108.799989,\n 37.783871\n ],\n [\n 108.798141,\n 37.93362\n ],\n [\n 108.82709,\n 37.989285\n ],\n [\n 108.797525,\n 38.047735\n ],\n [\n 108.871438,\n 38.027471\n ],\n [\n 108.938575,\n 37.920877\n ],\n [\n 109.017416,\n 37.969949\n ],\n [\n 109.069155,\n 38.091071\n ],\n [\n 108.963829,\n 38.155085\n ],\n [\n 108.938575,\n 38.207291\n ],\n [\n 109.051908,\n 38.432146\n ],\n [\n 109.178792,\n 38.520675\n ],\n [\n 109.276726,\n 38.623121\n ],\n [\n 109.367269,\n 38.627328\n ],\n [\n 109.338936,\n 38.70161\n ],\n [\n 109.404226,\n 38.720752\n ],\n [\n 109.511399,\n 38.833633\n ],\n [\n 109.549587,\n 38.805662\n ],\n [\n 109.624116,\n 38.854603\n ],\n [\n 109.683862,\n 38.935631\n ],\n [\n 109.665384,\n 38.981691\n ],\n [\n 109.961035,\n 39.191608\n ],\n [\n 110.217881,\n 39.28105\n ],\n [\n 110.146432,\n 39.455434\n ],\n [\n 110.243751,\n 39.42355\n ],\n [\n 110.39096,\n 39.31161\n ],\n [\n 110.434692,\n 39.381016\n ],\n [\n 110.528315,\n 39.380091\n ],\n [\n 110.604075,\n 39.277345\n ],\n [\n 110.702626,\n 39.27364\n ],\n [\n 110.740198,\n 39.351874\n ],\n [\n 110.892335,\n 39.509927\n ],\n [\n 111.134399,\n 39.586513\n ],\n [\n 111.148566,\n 39.531619\n ],\n [\n 111.064182,\n 39.400899\n ],\n [\n 111.125776,\n 39.366678\n ],\n [\n 111.247732,\n 39.302351\n ],\n [\n 111.163348,\n 39.152644\n ],\n [\n 111.138711,\n 39.064897\n ],\n [\n 110.980414,\n 38.970063\n ],\n [\n 111.009363,\n 38.847614\n ],\n [\n 110.880016,\n 38.618446\n ],\n [\n 110.920052,\n 38.581973\n ],\n [\n 110.874473,\n 38.453702\n ],\n [\n 110.77777,\n 38.44105\n ],\n [\n 110.746973,\n 38.366029\n ],\n [\n 110.661358,\n 38.308773\n ],\n [\n 110.57759,\n 38.297035\n ],\n [\n 110.565887,\n 38.215283\n ],\n [\n 110.509221,\n 38.192245\n ],\n [\n 110.501213,\n 38.031713\n ],\n [\n 110.522771,\n 37.954853\n ],\n [\n 110.59422,\n 37.921821\n ],\n [\n 110.663821,\n 37.803256\n ],\n [\n 110.758676,\n 37.744139\n ],\n [\n 110.706321,\n 37.705332\n ],\n [\n 110.796248,\n 37.66319\n ],\n [\n 110.795017,\n 37.566029\n ],\n [\n 110.745125,\n 37.450693\n ],\n [\n 110.644111,\n 37.435017\n ],\n [\n 110.630561,\n 37.373228\n ],\n [\n 110.695234,\n 37.34945\n ],\n [\n 110.690307,\n 37.287115\n ],\n [\n 110.53509,\n 37.137969\n ],\n [\n 110.444547,\n 37.007164\n ],\n [\n 110.382953,\n 37.021975\n ],\n [\n 110.425453,\n 36.960325\n ],\n [\n 110.416214,\n 36.790892\n ],\n [\n 110.447011,\n 36.737687\n ],\n [\n 110.394656,\n 36.676768\n ],\n [\n 110.496902,\n 36.582175\n ],\n [\n 110.503677,\n 36.487948\n ],\n [\n 110.45933,\n 36.330969\n ],\n [\n 110.474112,\n 36.248018\n ],\n [\n 110.447011,\n 36.164495\n ],\n [\n 110.511684,\n 35.879951\n ],\n [\n 110.549257,\n 35.877527\n ],\n [\n 110.57759,\n 35.701346\n ],\n [\n 110.609619,\n 35.632321\n ],\n [\n 110.525851,\n 35.44195\n ],\n [\n 110.477808,\n 35.413672\n ],\n [\n 110.45009,\n 35.327803\n ],\n [\n 110.39404,\n 35.271647\n ],\n [\n 110.325671,\n 35.014785\n ],\n [\n 110.257301,\n 34.93487\n ],\n [\n 110.232664,\n 34.803308\n ],\n [\n 110.241287,\n 34.682361\n ],\n [\n 110.310272,\n 34.608033\n ],\n [\n 110.379257,\n 34.600646\n ],\n [\n 110.360779,\n 34.516878\n ],\n [\n 110.403279,\n 34.43352\n ],\n [\n 110.403279,\n 34.43352\n ],\n [\n 110.503677,\n 34.337234\n ],\n [\n 110.426685,\n 34.275454\n ],\n [\n 110.43962,\n 34.24331\n ],\n [\n 110.642264,\n 34.16067\n ],\n [\n 110.590525,\n 34.096778\n ],\n [\n 110.669365,\n 33.939072\n ],\n [\n 110.587445,\n 33.887929\n ],\n [\n 110.782698,\n 33.795494\n ],\n [\n 110.877552,\n 33.635238\n ],\n [\n 111.00382,\n 33.578429\n ],\n [\n 111.02661,\n 33.478675\n ],\n [\n 111.022914,\n 33.475181\n ],\n [\n 111.022914,\n 33.474682\n ],\n [\n 111.02661,\n 33.474183\n ],\n [\n 110.996429,\n 33.435745\n ],\n [\n 111.025994,\n 33.330327\n ],\n [\n 110.984726,\n 33.255308\n ],\n [\n 110.824582,\n 33.158188\n ],\n [\n 110.745741,\n 33.147167\n ],\n [\n 110.702626,\n 33.097057\n ],\n [\n 110.59422,\n 33.168706\n ],\n [\n 110.54125,\n 33.255809\n ],\n [\n 110.468569,\n 33.181226\n ],\n [\n 110.218497,\n 33.163197\n ],\n [\n 110.164911,\n 33.209265\n ],\n [\n 110.031252,\n 33.191742\n ],\n [\n 109.852013,\n 33.247803\n ],\n [\n 109.732521,\n 33.231288\n ],\n [\n 109.619804,\n 33.27532\n ],\n [\n 109.537268,\n 33.2438\n ],\n [\n 109.438718,\n 33.152177\n ],\n [\n 109.576073,\n 33.110088\n ],\n [\n 109.688174,\n 33.116603\n ],\n [\n 109.794731,\n 33.066977\n ],\n [\n 109.76455,\n 32.909391\n ],\n [\n 109.988752,\n 32.886281\n ],\n [\n 110.10886,\n 32.82999\n ],\n [\n 110.159367,\n 32.767122\n ],\n [\n 110.156903,\n 32.683061\n ],\n [\n 110.206179,\n 32.633191\n ],\n [\n 110.153824,\n 32.593376\n ],\n [\n 110.085454,\n 32.613034\n ],\n [\n 110.017701,\n 32.546987\n ],\n [\n 109.910528,\n 32.592872\n ],\n [\n 109.816905,\n 32.577244\n ],\n [\n 109.726978,\n 32.608498\n ],\n [\n 109.631507,\n 32.599929\n ],\n [\n 109.637051,\n 32.540935\n ],\n [\n 109.575457,\n 32.506629\n ],\n [\n 109.502776,\n 32.389489\n ],\n [\n 109.495385,\n 32.300522\n ],\n [\n 109.592703,\n 32.219568\n ],\n [\n 109.621652,\n 32.106617\n ],\n [\n 109.590855,\n 32.012807\n ],\n [\n 109.631507,\n 31.962059\n ],\n [\n 109.584696,\n 31.900617\n ],\n [\n 109.638282,\n 31.811172\n ],\n [\n 109.585928,\n 31.726731\n ],\n [\n 109.281654,\n 31.717061\n ],\n [\n 109.273646,\n 31.801003\n ],\n [\n 109.195422,\n 31.817782\n ],\n [\n 109.164009,\n 31.877247\n ],\n [\n 108.988466,\n 31.979317\n ],\n [\n 108.902235,\n 31.984899\n ],\n [\n 108.734084,\n 32.106617\n ],\n [\n 108.67249,\n 32.104083\n ],\n [\n 108.509882,\n 32.201343\n ],\n [\n 108.46923,\n 32.270173\n ],\n [\n 108.312781,\n 32.232222\n ],\n [\n 108.251187,\n 32.273208\n ],\n [\n 108.179122,\n 32.222099\n ],\n [\n 108.070717,\n 32.233234\n ],\n [\n 107.979558,\n 32.14614\n ],\n [\n 107.812022,\n 32.24791\n ],\n [\n 107.75474,\n 32.338445\n ],\n [\n 107.707929,\n 32.331873\n ],\n [\n 107.680211,\n 32.398078\n ],\n [\n 107.533002,\n 32.383426\n ],\n [\n 107.456625,\n 32.417778\n ],\n [\n 107.436299,\n 32.529837\n ],\n [\n 107.382097,\n 32.54043\n ],\n [\n 107.313727,\n 32.489976\n ],\n [\n 107.263836,\n 32.403129\n ],\n [\n 107.127098,\n 32.482406\n ],\n [\n 107.080286,\n 32.542448\n ],\n [\n 107.108004,\n 32.600938\n ],\n [\n 107.066736,\n 32.708741\n ],\n [\n 106.82344,\n 32.705217\n ],\n [\n 106.733513,\n 32.739446\n ],\n [\n 106.663296,\n 32.690615\n ],\n [\n 106.585687,\n 32.688097\n ],\n [\n 106.421231,\n 32.616562\n ],\n [\n 106.347935,\n 32.670974\n ],\n [\n 106.17424,\n 32.697664\n ],\n [\n 106.076305,\n 32.753537\n ],\n [\n 106.076305,\n 32.758065\n ],\n [\n 106.076921,\n 32.764103\n ],\n [\n 106.07261,\n 32.764103\n ],\n [\n 106.093552,\n 32.823956\n ],\n [\n 106.025798,\n 32.85814\n ],\n [\n 105.825002,\n 32.824962\n ],\n [\n 105.822538,\n 32.770141\n ],\n [\n 105.719061,\n 32.759575\n ],\n [\n 105.596489,\n 32.699175\n ],\n [\n 105.563844,\n 32.72485\n ],\n [\n 105.49917,\n 32.911902\n ],\n [\n 105.590329,\n 32.876734\n ],\n [\n 105.735691,\n 32.905372\n ],\n [\n 105.917393,\n 32.993739\n ],\n [\n 105.930944,\n 33.177721\n ],\n [\n 105.965436,\n 33.204759\n ],\n [\n 105.862574,\n 33.234291\n ],\n [\n 105.74801,\n 33.298827\n ],\n [\n 105.723372,\n 33.390796\n ],\n [\n 105.82993,\n 33.382802\n ],\n [\n 105.842248,\n 33.490152\n ],\n [\n 105.956197,\n 33.612818\n ],\n [\n 106.129276,\n 33.604347\n ],\n [\n 106.187174,\n 33.54652\n ],\n [\n 106.303587,\n 33.604347\n ],\n [\n 106.447101,\n 33.613316\n ],\n [\n 106.456956,\n 33.533055\n ],\n [\n 106.54134,\n 33.513103\n ],\n [\n 106.58076,\n 33.575937\n ],\n [\n 106.539492,\n 33.691013\n ],\n [\n 106.480362,\n 33.715403\n ],\n [\n 106.461883,\n 33.789528\n ],\n [\n 106.493296,\n 33.846197\n ],\n [\n 106.41076,\n 33.906304\n ],\n [\n 106.474202,\n 33.970836\n ],\n [\n 106.501919,\n 34.104706\n ],\n [\n 106.585071,\n 34.149282\n ],\n [\n 106.526557,\n 34.291768\n ],\n [\n 106.663912,\n 34.24331\n ],\n [\n 106.717498,\n 34.369342\n ],\n [\n 106.624491,\n 34.410323\n ],\n [\n 106.610325,\n 34.454244\n ],\n [\n 106.455108,\n 34.531667\n ],\n [\n 106.334384,\n 34.517864\n ],\n [\n 106.314058,\n 34.578973\n ],\n [\n 106.419384,\n 34.643482\n ],\n [\n 106.505615,\n 34.74679\n ],\n [\n 106.575216,\n 34.769893\n ],\n [\n 106.493296,\n 34.941247\n ],\n [\n 106.494528,\n 35.005964\n ],\n [\n 106.494528,\n 35.005964\n ],\n [\n 106.5746,\n 35.089236\n ],\n [\n 106.710723,\n 35.100495\n ],\n [\n 106.838222,\n 35.079933\n ],\n [\n 106.901664,\n 35.094621\n ],\n [\n 107.08275,\n 35.024095\n ],\n [\n 107.089526,\n 34.976553\n ],\n [\n 107.189308,\n 34.893166\n ],\n [\n 107.252134,\n 34.880896\n ],\n [\n 107.286626,\n 34.931927\n ],\n [\n 107.523763,\n 34.909851\n ],\n [\n 107.561951,\n 34.966747\n ],\n [\n 107.634016,\n 34.950565\n ],\n [\n 107.804631,\n 34.95694\n ],\n [\n 107.863761,\n 34.996161\n ],\n [\n 107.757204,\n 35.076016\n ],\n [\n 107.686371,\n 35.217895\n ],\n [\n 107.651878,\n 35.239889\n ],\n [\n 107.745501,\n 35.311693\n ],\n [\n 107.867457,\n 35.256014\n ],\n [\n 108.049159,\n 35.254059\n ],\n [\n 108.174811,\n 35.305345\n ],\n [\n 108.2401,\n 35.256014\n ],\n [\n 108.352817,\n 35.285812\n ],\n [\n 108.48894,\n 35.275066\n ],\n [\n 108.614591,\n 35.32878\n ],\n [\n 108.631222,\n 35.418548\n ],\n [\n 108.618287,\n 35.556908\n ],\n [\n 108.539447,\n 35.605569\n ],\n [\n 108.517273,\n 35.715921\n ],\n [\n 108.524664,\n 35.839703\n ],\n [\n 108.498179,\n 35.876072\n ],\n [\n 108.588722,\n 35.950214\n ],\n [\n 108.656475,\n 35.952636\n ],\n [\n 108.712526,\n 36.13889\n ],\n [\n 108.646004,\n 36.25429\n ],\n [\n 108.651548,\n 36.384936\n ],\n [\n 108.618903,\n 36.434052\n ],\n [\n 108.510498,\n 36.474478\n ],\n [\n 108.495099,\n 36.422498\n ],\n [\n 108.407636,\n 36.458117\n ],\n [\n 108.340498,\n 36.55911\n ],\n [\n 108.262274,\n 36.549497\n ],\n [\n 108.194521,\n 36.625405\n ],\n [\n 108.163724,\n 36.563916\n ],\n [\n 108.007891,\n 36.61628\n ],\n [\n 108.004811,\n 36.683006\n ],\n [\n 107.939522,\n 36.655651\n ],\n [\n 107.907493,\n 36.751591\n ],\n [\n 107.720863,\n 36.802391\n ],\n [\n 107.540393,\n 36.828736\n ],\n [\n 107.478183,\n 36.908674\n ],\n [\n 107.310032,\n 36.912501\n ],\n [\n 107.288474,\n 37.00812\n ]\n ]\n ],\n [\n [\n [\n 106.076305,\n 32.753537\n ],\n [\n 106.07261,\n 32.764103\n ],\n [\n 106.076921,\n 32.764103\n ],\n [\n 106.076305,\n 32.758065\n ],\n [\n 106.076305,\n 32.753537\n ]\n ]\n ],\n [\n [\n [\n 111.022914,\n 33.474682\n ],\n [\n 111.022914,\n 33.475181\n ],\n [\n 111.02661,\n 33.478675\n ],\n [\n 111.02661,\n 33.474183\n ],\n [\n 111.022914,\n 33.474682\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 620000,\n \"name\": \"甘肃省\",\n \"center\": [\n 103.823557,\n 36.058039\n ],\n \"childrenNum\": 14,\n \"level\": \"province\",\n \"subFeatureIndex\": 27,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 106.494528,\n 35.005964\n ],\n [\n 106.494528,\n 35.005964\n ],\n [\n 106.493296,\n 34.941247\n ],\n [\n 106.575216,\n 34.769893\n ],\n [\n 106.505615,\n 34.74679\n ],\n [\n 106.419384,\n 34.643482\n ],\n [\n 106.314058,\n 34.578973\n ],\n [\n 106.334384,\n 34.517864\n ],\n [\n 106.455108,\n 34.531667\n ],\n [\n 106.610325,\n 34.454244\n ],\n [\n 106.624491,\n 34.410323\n ],\n [\n 106.717498,\n 34.369342\n ],\n [\n 106.663912,\n 34.24331\n ],\n [\n 106.526557,\n 34.291768\n ],\n [\n 106.585071,\n 34.149282\n ],\n [\n 106.501919,\n 34.104706\n ],\n [\n 106.474202,\n 33.970836\n ],\n [\n 106.41076,\n 33.906304\n ],\n [\n 106.493296,\n 33.846197\n ],\n [\n 106.461883,\n 33.789528\n ],\n [\n 106.480362,\n 33.715403\n ],\n [\n 106.539492,\n 33.691013\n ],\n [\n 106.58076,\n 33.575937\n ],\n [\n 106.54134,\n 33.513103\n ],\n [\n 106.456956,\n 33.533055\n ],\n [\n 106.447101,\n 33.613316\n ],\n [\n 106.303587,\n 33.604347\n ],\n [\n 106.187174,\n 33.54652\n ],\n [\n 106.129276,\n 33.604347\n ],\n [\n 105.956197,\n 33.612818\n ],\n [\n 105.842248,\n 33.490152\n ],\n [\n 105.82993,\n 33.382802\n ],\n [\n 105.723372,\n 33.390796\n ],\n [\n 105.74801,\n 33.298827\n ],\n [\n 105.862574,\n 33.234291\n ],\n [\n 105.965436,\n 33.204759\n ],\n [\n 105.930944,\n 33.177721\n ],\n [\n 105.917393,\n 32.993739\n ],\n [\n 105.735691,\n 32.905372\n ],\n [\n 105.590329,\n 32.876734\n ],\n [\n 105.49917,\n 32.911902\n ],\n [\n 105.414171,\n 32.921948\n ],\n [\n 105.391381,\n 32.835017\n ],\n [\n 105.455439,\n 32.737433\n ],\n [\n 105.347033,\n 32.682558\n ],\n [\n 105.111128,\n 32.59388\n ],\n [\n 105.026745,\n 32.650322\n ],\n [\n 104.881999,\n 32.600938\n ],\n [\n 104.845659,\n 32.653848\n ],\n [\n 104.739717,\n 32.635711\n ],\n [\n 104.643015,\n 32.661908\n ],\n [\n 104.582653,\n 32.722333\n ],\n [\n 104.458849,\n 32.748504\n ],\n [\n 104.363994,\n 32.822448\n ],\n [\n 104.294393,\n 32.83552\n ],\n [\n 104.288234,\n 32.94304\n ],\n [\n 104.378161,\n 32.953081\n ],\n [\n 104.426204,\n 33.0108\n ],\n [\n 104.337509,\n 33.038392\n ],\n [\n 104.378161,\n 33.109086\n ],\n [\n 104.303632,\n 33.304328\n ],\n [\n 104.432979,\n 33.325828\n ],\n [\n 104.292545,\n 33.336326\n ],\n [\n 104.22048,\n 33.404782\n ],\n [\n 104.155191,\n 33.542531\n ],\n [\n 104.168741,\n 33.611821\n ],\n [\n 104.046169,\n 33.686533\n ],\n [\n 103.871243,\n 33.68255\n ],\n [\n 103.778236,\n 33.658648\n ],\n [\n 103.626099,\n 33.727347\n ],\n [\n 103.520157,\n 33.678566\n ],\n [\n 103.525085,\n 33.798975\n ],\n [\n 103.349542,\n 33.74327\n ],\n [\n 103.279325,\n 33.806433\n ],\n [\n 103.153057,\n 33.814884\n ],\n [\n 103.181391,\n 33.900842\n ],\n [\n 103.124108,\n 33.968354\n ],\n [\n 103.119797,\n 34.034822\n ],\n [\n 103.178927,\n 34.079931\n ],\n [\n 103.124108,\n 34.16166\n ],\n [\n 102.973203,\n 34.205217\n ],\n [\n 102.978747,\n 34.249246\n ],\n [\n 102.911609,\n 34.313022\n ],\n [\n 102.798276,\n 34.272982\n ],\n [\n 102.599328,\n 34.145321\n ],\n [\n 102.655994,\n 34.113623\n ],\n [\n 102.471213,\n 34.072993\n ],\n [\n 102.437336,\n 34.087364\n ],\n [\n 102.391756,\n 33.970836\n ],\n [\n 102.315996,\n 33.994154\n ],\n [\n 102.237772,\n 33.963392\n ],\n [\n 102.136142,\n 33.965377\n ],\n [\n 102.234076,\n 33.870046\n ],\n [\n 102.239619,\n 33.788036\n ],\n [\n 102.299981,\n 33.782566\n ],\n [\n 102.342481,\n 33.725357\n ],\n [\n 102.33817,\n 33.614313\n ],\n [\n 102.440416,\n 33.57494\n ],\n [\n 102.462589,\n 33.449724\n ],\n [\n 102.396684,\n 33.40678\n ],\n [\n 102.264873,\n 33.417269\n ],\n [\n 102.186649,\n 33.332327\n ],\n [\n 102.217446,\n 33.248303\n ],\n [\n 102.112736,\n 33.287324\n ],\n [\n 102.08933,\n 33.204759\n ],\n [\n 101.935345,\n 33.186734\n ],\n [\n 101.865744,\n 33.103072\n ],\n [\n 101.841723,\n 33.184731\n ],\n [\n 101.769658,\n 33.268816\n ],\n [\n 101.878063,\n 33.315829\n ],\n [\n 101.885454,\n 33.380804\n ],\n [\n 101.9452,\n 33.437742\n ],\n [\n 101.907012,\n 33.542032\n ],\n [\n 101.844186,\n 33.602353\n ],\n [\n 101.769042,\n 33.538541\n ],\n [\n 101.735781,\n 33.49614\n ],\n [\n 101.622448,\n 33.502127\n ],\n [\n 101.582412,\n 33.675081\n ],\n [\n 101.501724,\n 33.70296\n ],\n [\n 101.385312,\n 33.644702\n ],\n [\n 101.238718,\n 33.685039\n ],\n [\n 101.166653,\n 33.660142\n ],\n [\n 101.191907,\n 33.786047\n ],\n [\n 101.153718,\n 33.844706\n ],\n [\n 100.999118,\n 33.889419\n ],\n [\n 100.806329,\n 34.155224\n ],\n [\n 100.764445,\n 34.178987\n ],\n [\n 100.821727,\n 34.317469\n ],\n [\n 100.895024,\n 34.375268\n ],\n [\n 100.986799,\n 34.374774\n ],\n [\n 101.054552,\n 34.322905\n ],\n [\n 101.235022,\n 34.325376\n ],\n [\n 101.331109,\n 34.245289\n ],\n [\n 101.530057,\n 34.21066\n ],\n [\n 101.622448,\n 34.178492\n ],\n [\n 101.736397,\n 34.079931\n ],\n [\n 101.84665,\n 34.150272\n ],\n [\n 101.955055,\n 34.10966\n ],\n [\n 101.965526,\n 34.167601\n ],\n [\n 102.062229,\n 34.227976\n ],\n [\n 102.067772,\n 34.293746\n ],\n [\n 102.149692,\n 34.271993\n ],\n [\n 102.189728,\n 34.355018\n ],\n [\n 102.237156,\n 34.343163\n ],\n [\n 102.237772,\n 34.343163\n ],\n [\n 102.237156,\n 34.343163\n ],\n [\n 102.237772,\n 34.343163\n ],\n [\n 102.210054,\n 34.399462\n ],\n [\n 102.210054,\n 34.399462\n ],\n [\n 102.155852,\n 34.507511\n ],\n [\n 102.003715,\n 34.538074\n ],\n [\n 101.919947,\n 34.621821\n ],\n [\n 101.917483,\n 34.875497\n ],\n [\n 102.048062,\n 34.910832\n ],\n [\n 102.094874,\n 34.986848\n ],\n [\n 102.218677,\n 35.058386\n ],\n [\n 102.29567,\n 35.071609\n ],\n [\n 102.310452,\n 35.128883\n ],\n [\n 102.402227,\n 35.191006\n ],\n [\n 102.370814,\n 35.262854\n ],\n [\n 102.279655,\n 35.304857\n ],\n [\n 102.317228,\n 35.433663\n ],\n [\n 102.407155,\n 35.408308\n ],\n [\n 102.447807,\n 35.437563\n ],\n [\n 102.504473,\n 35.583189\n ],\n [\n 102.742226,\n 35.495065\n ],\n [\n 102.808747,\n 35.560315\n ],\n [\n 102.686175,\n 35.772253\n ],\n [\n 102.78411,\n 35.862496\n ],\n [\n 102.955957,\n 35.861041\n ],\n [\n 102.971971,\n 35.995247\n ],\n [\n 102.882044,\n 36.082335\n ],\n [\n 102.941174,\n 36.105058\n ],\n [\n 102.98737,\n 36.193956\n ],\n [\n 103.068058,\n 36.203612\n ],\n [\n 103.024326,\n 36.257185\n ],\n [\n 102.830305,\n 36.358439\n ],\n [\n 102.832153,\n 36.357957\n ],\n [\n 102.831537,\n 36.360848\n ],\n [\n 102.830305,\n 36.362294\n ],\n [\n 102.769943,\n 36.472072\n ],\n [\n 102.761936,\n 36.568721\n ],\n [\n 102.606719,\n 36.682526\n ],\n [\n 102.704654,\n 36.792329\n ],\n [\n 102.587009,\n 36.869912\n ],\n [\n 102.56114,\n 36.919676\n ],\n [\n 102.450271,\n 36.968453\n ],\n [\n 102.506321,\n 37.019108\n ],\n [\n 102.488459,\n 37.079278\n ],\n [\n 102.642444,\n 37.099801\n ],\n [\n 102.599944,\n 37.174687\n ],\n [\n 102.457662,\n 37.24807\n ],\n [\n 102.428097,\n 37.308534\n ],\n [\n 102.19712,\n 37.420287\n ],\n [\n 102.102881,\n 37.48441\n ],\n [\n 102.130598,\n 37.544684\n ],\n [\n 102.035743,\n 37.627184\n ],\n [\n 102.036359,\n 37.684974\n ],\n [\n 101.946432,\n 37.728051\n ],\n [\n 101.815853,\n 37.65419\n ],\n [\n 101.791832,\n 37.695864\n ],\n [\n 101.659405,\n 37.733256\n ],\n [\n 101.597195,\n 37.828308\n ],\n [\n 101.459224,\n 37.866105\n ],\n [\n 101.362522,\n 37.791437\n ],\n [\n 101.150639,\n 37.876969\n ],\n [\n 100.887633,\n 38.050562\n ],\n [\n 100.93814,\n 38.160261\n ],\n [\n 100.825423,\n 38.158849\n ],\n [\n 100.74843,\n 38.239724\n ],\n [\n 100.619083,\n 38.265567\n ],\n [\n 100.546402,\n 38.246773\n ],\n [\n 100.474953,\n 38.289052\n ],\n [\n 100.318505,\n 38.329428\n ],\n [\n 100.261222,\n 38.366498\n ],\n [\n 100.24028,\n 38.441519\n ],\n [\n 100.064122,\n 38.518802\n ],\n [\n 100.001296,\n 38.466821\n ],\n [\n 100.093071,\n 38.4073\n ],\n [\n 100.157744,\n 38.309712\n ],\n [\n 100.182998,\n 38.221864\n ],\n [\n 100.126332,\n 38.231735\n ],\n [\n 99.937238,\n 38.34163\n ],\n [\n 99.826985,\n 38.370251\n ],\n [\n 99.65945,\n 38.449017\n ],\n [\n 99.555972,\n 38.520207\n ],\n [\n 99.50916,\n 38.608628\n ],\n [\n 99.450646,\n 38.60442\n ],\n [\n 99.361951,\n 38.718418\n ],\n [\n 99.222133,\n 38.788875\n ],\n [\n 99.068764,\n 38.896991\n ],\n [\n 99.1088,\n 38.946334\n ],\n [\n 98.951735,\n 38.987737\n ],\n [\n 98.816845,\n 39.085799\n ],\n [\n 98.743548,\n 39.086728\n ],\n [\n 98.584635,\n 38.930046\n ],\n [\n 98.457752,\n 38.952849\n ],\n [\n 98.383839,\n 39.029581\n ],\n [\n 98.280977,\n 39.027257\n ],\n [\n 98.251412,\n 38.891403\n ],\n [\n 98.094964,\n 38.786077\n ],\n [\n 98.009348,\n 38.859262\n ],\n [\n 97.828878,\n 38.930046\n ],\n [\n 97.701379,\n 38.963085\n ],\n [\n 97.679205,\n 39.010522\n ],\n [\n 97.371235,\n 39.14058\n ],\n [\n 97.220946,\n 39.192999\n ],\n [\n 96.962867,\n 39.198564\n ],\n [\n 97.012142,\n 39.141972\n ],\n [\n 96.969643,\n 39.097873\n ],\n [\n 96.940693,\n 38.907701\n ],\n [\n 96.983809,\n 38.869046\n ],\n [\n 97.009063,\n 38.702544\n ],\n [\n 97.057722,\n 38.672654\n ],\n [\n 97.055874,\n 38.5946\n ],\n [\n 96.975802,\n 38.559519\n ],\n [\n 96.7941,\n 38.60816\n ],\n [\n 96.780549,\n 38.504289\n ],\n [\n 96.6666,\n 38.483684\n ],\n [\n 96.698013,\n 38.422302\n ],\n [\n 96.626564,\n 38.356177\n ],\n [\n 96.665369,\n 38.230325\n ],\n [\n 96.46334,\n 38.27778\n ],\n [\n 96.335841,\n 38.246303\n ],\n [\n 96.313051,\n 38.162142\n ],\n [\n 96.221892,\n 38.148969\n ],\n [\n 96.109175,\n 38.187072\n ],\n [\n 96.063596,\n 38.172962\n ],\n [\n 95.856024,\n 38.284355\n ],\n [\n 95.83693,\n 38.343977\n ],\n [\n 95.702039,\n 38.400736\n ],\n [\n 95.51849,\n 38.295156\n ],\n [\n 95.320157,\n 38.32051\n ],\n [\n 95.261027,\n 38.301261\n ],\n [\n 95.121825,\n 38.417615\n ],\n [\n 94.973999,\n 38.430271\n ],\n [\n 94.810775,\n 38.385261\n ],\n [\n 94.67958,\n 38.387137\n ],\n [\n 94.527443,\n 38.36556\n ],\n [\n 94.511429,\n 38.445268\n ],\n [\n 94.370379,\n 38.762753\n ],\n [\n 93.885018,\n 38.720752\n ],\n [\n 93.800019,\n 38.750622\n ],\n [\n 93.769838,\n 38.821047\n ],\n [\n 93.884403,\n 38.826175\n ],\n [\n 93.729186,\n 38.92446\n ],\n [\n 93.453245,\n 38.915615\n ],\n [\n 93.274007,\n 38.89606\n ],\n [\n 93.179152,\n 38.923994\n ],\n [\n 93.198246,\n 39.045847\n ],\n [\n 93.131725,\n 39.108088\n ],\n [\n 93.142196,\n 39.160531\n ],\n [\n 92.978356,\n 39.143364\n ],\n [\n 92.938936,\n 39.169809\n ],\n [\n 92.866871,\n 39.138723\n ],\n [\n 92.489916,\n 39.09973\n ],\n [\n 92.41046,\n 39.038412\n ],\n [\n 92.366728,\n 39.059322\n ],\n [\n 92.339011,\n 39.236575\n ],\n [\n 92.52564,\n 39.368528\n ],\n [\n 92.639589,\n 39.514543\n ],\n [\n 92.745531,\n 39.868137\n ],\n [\n 92.796654,\n 40.15364\n ],\n [\n 92.906907,\n 40.310773\n ],\n [\n 92.928465,\n 40.572609\n ],\n [\n 93.506216,\n 40.648464\n ],\n [\n 93.760599,\n 40.664804\n ],\n [\n 93.820961,\n 40.793574\n ],\n [\n 93.809874,\n 40.879583\n ],\n [\n 94.01067,\n 41.114857\n ],\n [\n 94.184365,\n 41.268392\n ],\n [\n 94.534219,\n 41.50586\n ],\n [\n 94.750413,\n 41.538114\n ],\n [\n 94.861898,\n 41.668309\n ],\n [\n 95.135991,\n 41.772811\n ],\n [\n 95.29552,\n 41.569456\n ],\n [\n 95.39407,\n 41.693333\n ],\n [\n 95.57146,\n 41.796011\n ],\n [\n 95.677402,\n 41.830795\n ],\n [\n 95.855408,\n 41.849516\n ],\n [\n 96.038342,\n 41.924794\n ],\n [\n 96.117183,\n 41.985753\n ],\n [\n 96.13874,\n 42.054207\n ],\n [\n 96.077147,\n 42.149652\n ],\n [\n 96.178161,\n 42.217929\n ],\n [\n 96.040806,\n 42.3264\n ],\n [\n 96.06606,\n 42.414367\n ],\n [\n 95.978596,\n 42.436892\n ],\n [\n 96.02356,\n 42.54234\n ],\n [\n 96.103632,\n 42.604026\n ],\n [\n 96.386348,\n 42.727655\n ],\n [\n 96.742361,\n 42.757096\n ],\n [\n 96.968411,\n 42.756218\n ],\n [\n 97.172903,\n 42.795305\n ],\n [\n 97.307177,\n 42.565259\n ],\n [\n 97.84674,\n 41.656687\n ],\n [\n 97.613915,\n 41.477176\n ],\n [\n 97.629314,\n 41.440407\n ],\n [\n 97.971776,\n 41.097726\n ],\n [\n 98.25018,\n 40.939271\n ],\n [\n 98.333332,\n 40.918929\n ],\n [\n 98.344419,\n 40.568518\n ],\n [\n 98.627751,\n 40.677965\n ],\n [\n 98.569853,\n 40.746901\n ],\n [\n 98.668403,\n 40.772734\n ],\n [\n 98.689345,\n 40.691576\n ],\n [\n 98.801446,\n 40.609411\n ],\n [\n 98.790975,\n 40.705185\n ],\n [\n 98.984996,\n 40.782701\n ],\n [\n 99.041662,\n 40.693844\n ],\n [\n 99.102025,\n 40.676603\n ],\n [\n 99.172858,\n 40.747354\n ],\n [\n 99.174705,\n 40.858317\n ],\n [\n 99.565827,\n 40.846551\n ],\n [\n 99.673,\n 40.932943\n ],\n [\n 100.057346,\n 40.908077\n ],\n [\n 100.107853,\n 40.875511\n ],\n [\n 100.237201,\n 40.716977\n ],\n [\n 100.242744,\n 40.618495\n ],\n [\n 100.169447,\n 40.541242\n ],\n [\n 100.169447,\n 40.277458\n ],\n [\n 100.002528,\n 40.197528\n ],\n [\n 99.927383,\n 40.063947\n ],\n [\n 99.488218,\n 39.875943\n ],\n [\n 99.672384,\n 39.887881\n ],\n [\n 99.822058,\n 39.85987\n ],\n [\n 99.904593,\n 39.785886\n ],\n [\n 100.040716,\n 39.756913\n ],\n [\n 100.128179,\n 39.702155\n ],\n [\n 100.250135,\n 39.68512\n ],\n [\n 100.314193,\n 39.606799\n ],\n [\n 100.326512,\n 39.509003\n ],\n [\n 100.500823,\n 39.4813\n ],\n [\n 100.498975,\n 39.400437\n ],\n [\n 100.619699,\n 39.38749\n ],\n [\n 100.842053,\n 39.405523\n ],\n [\n 100.842669,\n 39.199955\n ],\n [\n 100.864227,\n 39.106695\n ],\n [\n 100.835278,\n 39.025863\n ],\n [\n 100.961545,\n 39.005873\n ],\n [\n 100.969553,\n 38.9468\n ],\n [\n 101.117378,\n 38.97518\n ],\n [\n 101.228863,\n 39.02075\n ],\n [\n 101.198682,\n 38.943077\n ],\n [\n 101.24303,\n 38.86066\n ],\n [\n 101.334189,\n 38.848545\n ],\n [\n 101.307087,\n 38.802865\n ],\n [\n 101.562702,\n 38.712816\n ],\n [\n 101.601506,\n 38.6549\n ],\n [\n 101.679115,\n 38.690869\n ],\n [\n 101.777049,\n 38.660507\n ],\n [\n 101.941505,\n 38.808926\n ],\n [\n 102.075164,\n 38.891403\n ],\n [\n 101.926106,\n 39.000758\n ],\n [\n 101.830636,\n 39.093229\n ],\n [\n 102.280887,\n 39.190217\n ],\n [\n 102.45335,\n 39.25511\n ],\n [\n 102.601792,\n 39.172129\n ],\n [\n 103.007696,\n 39.09973\n ],\n [\n 103.344615,\n 39.331514\n ],\n [\n 103.595302,\n 39.386565\n ],\n [\n 103.839214,\n 39.460516\n ],\n [\n 103.964865,\n 39.455434\n ],\n [\n 104.091133,\n 39.418466\n ],\n [\n 104.047401,\n 39.297721\n ],\n [\n 104.177364,\n 39.15218\n ],\n [\n 104.207546,\n 39.083941\n ],\n [\n 104.168125,\n 38.940285\n ],\n [\n 104.044322,\n 38.895128\n ],\n [\n 103.85954,\n 38.64462\n ],\n [\n 103.416063,\n 38.404956\n ],\n [\n 103.507838,\n 38.281068\n ],\n [\n 103.53494,\n 38.156497\n ],\n [\n 103.369868,\n 38.089658\n ],\n [\n 103.362477,\n 38.037368\n ],\n [\n 103.401897,\n 37.861854\n ],\n [\n 103.676606,\n 37.783871\n ],\n [\n 103.948235,\n 37.564606\n ],\n [\n 104.183524,\n 37.406981\n ],\n [\n 104.287002,\n 37.42789\n ],\n [\n 104.437907,\n 37.445943\n ],\n [\n 104.679971,\n 37.407931\n ],\n [\n 104.713848,\n 37.32947\n ],\n [\n 104.632544,\n 37.299015\n ],\n [\n 104.600515,\n 37.242831\n ],\n [\n 104.638087,\n 37.201857\n ],\n [\n 104.775442,\n 37.246641\n ],\n [\n 104.85613,\n 37.211864\n ],\n [\n 104.95468,\n 37.040125\n ],\n [\n 105.165331,\n 36.995218\n ],\n [\n 105.190585,\n 36.886185\n ],\n [\n 105.244787,\n 36.894798\n ],\n [\n 105.334714,\n 36.800953\n ],\n [\n 105.319932,\n 36.742961\n ],\n [\n 105.218302,\n 36.730494\n ],\n [\n 105.22015,\n 36.631167\n ],\n [\n 105.281744,\n 36.522575\n ],\n [\n 105.319932,\n 36.536038\n ],\n [\n 105.398156,\n 36.430683\n ],\n [\n 105.401236,\n 36.370002\n ],\n [\n 105.473301,\n 36.298185\n ],\n [\n 105.460366,\n 36.223887\n ],\n [\n 105.513337,\n 36.150003\n ],\n [\n 105.343954,\n 36.033965\n ],\n [\n 105.333483,\n 35.887707\n ],\n [\n 105.392613,\n 35.865405\n ],\n [\n 105.481924,\n 35.727094\n ],\n [\n 105.570003,\n 35.716407\n ],\n [\n 105.671017,\n 35.749434\n ],\n [\n 105.754785,\n 35.730494\n ],\n [\n 105.690727,\n 35.698431\n ],\n [\n 105.847176,\n 35.490681\n ],\n [\n 105.868734,\n 35.53987\n ],\n [\n 106.015943,\n 35.52234\n ],\n [\n 106.070762,\n 35.491655\n ],\n [\n 106.057827,\n 35.488245\n ],\n [\n 105.897683,\n 35.451698\n ],\n [\n 105.894603,\n 35.413672\n ],\n [\n 106.054132,\n 35.449261\n ],\n [\n 106.061523,\n 35.457547\n ],\n [\n 106.064603,\n 35.431225\n ],\n [\n 106.073226,\n 35.421474\n ],\n [\n 106.079385,\n 35.427325\n ],\n [\n 106.107102,\n 35.364894\n ],\n [\n 106.174856,\n 35.438538\n ],\n [\n 106.319601,\n 35.265296\n ],\n [\n 106.472354,\n 35.310716\n ],\n [\n 106.503767,\n 35.415135\n ],\n [\n 106.440941,\n 35.526723\n ],\n [\n 106.476666,\n 35.580756\n ],\n [\n 106.434782,\n 35.688712\n ],\n [\n 106.501304,\n 35.737779\n ],\n [\n 106.501304,\n 35.735836\n ],\n [\n 106.503767,\n 35.736322\n ],\n [\n 106.504383,\n 35.738265\n ],\n [\n 106.737208,\n 35.689198\n ],\n [\n 106.86594,\n 35.737779\n ],\n [\n 106.92199,\n 35.803316\n ],\n [\n 106.849925,\n 35.887707\n ],\n [\n 106.950939,\n 36.004444\n ],\n [\n 106.957715,\n 36.091522\n ],\n [\n 106.858548,\n 36.206992\n ],\n [\n 106.858548,\n 36.206992\n ],\n [\n 106.599238,\n 36.274552\n ],\n [\n 106.599238,\n 36.274552\n ],\n [\n 106.505615,\n 36.265869\n ],\n [\n 106.488369,\n 36.400348\n ],\n [\n 106.521014,\n 36.479289\n ],\n [\n 106.401521,\n 36.546133\n ],\n [\n 106.471738,\n 36.581214\n ],\n [\n 106.519782,\n 36.708912\n ],\n [\n 106.519782,\n 36.708912\n ],\n [\n 106.589383,\n 36.750153\n ],\n [\n 106.631883,\n 36.723301\n ],\n [\n 106.658368,\n 36.811972\n ],\n [\n 106.595542,\n 36.940243\n ],\n [\n 106.666991,\n 37.01672\n ],\n [\n 106.605397,\n 37.127475\n ],\n [\n 106.750143,\n 37.098847\n ],\n [\n 106.777244,\n 37.156569\n ],\n [\n 106.777244,\n 37.156569\n ],\n [\n 106.891193,\n 37.098369\n ],\n [\n 107.030395,\n 37.140831\n ],\n [\n 107.095685,\n 37.115548\n ],\n [\n 107.180685,\n 37.143692\n ],\n [\n 107.268764,\n 37.099324\n ],\n [\n 107.288474,\n 37.00812\n ],\n [\n 107.288474,\n 37.00812\n ],\n [\n 107.310032,\n 36.912501\n ],\n [\n 107.478183,\n 36.908674\n ],\n [\n 107.540393,\n 36.828736\n ],\n [\n 107.720863,\n 36.802391\n ],\n [\n 107.907493,\n 36.751591\n ],\n [\n 107.939522,\n 36.655651\n ],\n [\n 108.004811,\n 36.683006\n ],\n [\n 108.007891,\n 36.61628\n ],\n [\n 108.163724,\n 36.563916\n ],\n [\n 108.194521,\n 36.625405\n ],\n [\n 108.262274,\n 36.549497\n ],\n [\n 108.340498,\n 36.55911\n ],\n [\n 108.407636,\n 36.458117\n ],\n [\n 108.495099,\n 36.422498\n ],\n [\n 108.510498,\n 36.474478\n ],\n [\n 108.618903,\n 36.434052\n ],\n [\n 108.651548,\n 36.384936\n ],\n [\n 108.646004,\n 36.25429\n ],\n [\n 108.712526,\n 36.13889\n ],\n [\n 108.656475,\n 35.952636\n ],\n [\n 108.588722,\n 35.950214\n ],\n [\n 108.498179,\n 35.876072\n ],\n [\n 108.524664,\n 35.839703\n ],\n [\n 108.517273,\n 35.715921\n ],\n [\n 108.539447,\n 35.605569\n ],\n [\n 108.618287,\n 35.556908\n ],\n [\n 108.631222,\n 35.418548\n ],\n [\n 108.614591,\n 35.32878\n ],\n [\n 108.48894,\n 35.275066\n ],\n [\n 108.352817,\n 35.285812\n ],\n [\n 108.2401,\n 35.256014\n ],\n [\n 108.174811,\n 35.305345\n ],\n [\n 108.049159,\n 35.254059\n ],\n [\n 107.867457,\n 35.256014\n ],\n [\n 107.745501,\n 35.311693\n ],\n [\n 107.651878,\n 35.239889\n ],\n [\n 107.686371,\n 35.217895\n ],\n [\n 107.757204,\n 35.076016\n ],\n [\n 107.863761,\n 34.996161\n ],\n [\n 107.804631,\n 34.95694\n ],\n [\n 107.634016,\n 34.950565\n ],\n [\n 107.561951,\n 34.966747\n ],\n [\n 107.523763,\n 34.909851\n ],\n [\n 107.286626,\n 34.931927\n ],\n [\n 107.252134,\n 34.880896\n ],\n [\n 107.189308,\n 34.893166\n ],\n [\n 107.089526,\n 34.976553\n ],\n [\n 107.08275,\n 35.024095\n ],\n [\n 106.901664,\n 35.094621\n ],\n [\n 106.838222,\n 35.079933\n ],\n [\n 106.710723,\n 35.100495\n ],\n [\n 106.5746,\n 35.089236\n ],\n [\n 106.494528,\n 35.005964\n ]\n ]\n ],\n [\n [\n [\n 106.070762,\n 35.491655\n ],\n [\n 106.078153,\n 35.489707\n ],\n [\n 106.078153,\n 35.489707\n ],\n [\n 106.071994,\n 35.463395\n ],\n [\n 106.061523,\n 35.457547\n ],\n [\n 106.054132,\n 35.449261\n ],\n [\n 106.057827,\n 35.488245\n ],\n [\n 106.070762,\n 35.491655\n ]\n ]\n ],\n [\n [\n [\n 106.073226,\n 35.421474\n ],\n [\n 106.064603,\n 35.431225\n ],\n [\n 106.061523,\n 35.457547\n ],\n [\n 106.071994,\n 35.463395\n ],\n [\n 106.06953,\n 35.458034\n ],\n [\n 106.071378,\n 35.449261\n ],\n [\n 106.079385,\n 35.427325\n ],\n [\n 106.073226,\n 35.421474\n ]\n ]\n ],\n [\n [\n [\n 102.831537,\n 36.360848\n ],\n [\n 102.832153,\n 36.357957\n ],\n [\n 102.830305,\n 36.358439\n ],\n [\n 102.830305,\n 36.362294\n ],\n [\n 102.831537,\n 36.360848\n ]\n ]\n ],\n [\n [\n [\n 106.503767,\n 35.736322\n ],\n [\n 106.501304,\n 35.735836\n ],\n [\n 106.501304,\n 35.737779\n ],\n [\n 106.504383,\n 35.738265\n ],\n [\n 106.503767,\n 35.736322\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 630000,\n \"name\": \"青海省\",\n \"center\": [\n 101.778916,\n 36.623178\n ],\n \"centroid\": [\n 96.043531,\n 35.726402\n ],\n \"childrenNum\": 8,\n \"level\": \"province\",\n \"subFeatureIndex\": 28,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 91.001807,\n 33.116102\n ],\n [\n 91.001807,\n 33.116102\n ],\n [\n 90.805938,\n 33.114599\n ],\n [\n 90.70554,\n 33.135645\n ],\n [\n 90.486881,\n 33.266815\n ],\n [\n 90.405577,\n 33.260311\n ],\n [\n 90.332896,\n 33.310829\n ],\n [\n 90.246665,\n 33.42426\n ],\n [\n 90.092064,\n 33.469691\n ],\n [\n 90.080977,\n 33.530561\n ],\n [\n 90.01076,\n 33.553501\n ],\n [\n 89.984275,\n 33.61232\n ],\n [\n 90.008296,\n 33.688026\n ],\n [\n 89.907282,\n 33.74128\n ],\n [\n 89.933768,\n 33.796986\n ],\n [\n 89.837065,\n 33.869052\n ],\n [\n 89.795181,\n 33.865575\n ],\n [\n 89.691704,\n 33.957933\n ],\n [\n 89.635037,\n 34.0492\n ],\n [\n 89.655979,\n 34.096778\n ],\n [\n 89.818587,\n 34.174037\n ],\n [\n 89.825362,\n 34.293746\n ],\n [\n 89.872174,\n 34.335752\n ],\n [\n 89.801957,\n 34.390575\n ],\n [\n 89.823515,\n 34.455231\n ],\n [\n 89.798877,\n 34.628714\n ],\n [\n 89.72558,\n 34.660709\n ],\n [\n 89.732356,\n 34.732039\n ],\n [\n 89.799493,\n 34.74384\n ],\n [\n 89.867862,\n 34.810677\n ],\n [\n 89.821667,\n 34.902981\n ],\n [\n 89.707102,\n 34.919663\n ],\n [\n 89.654747,\n 34.883351\n ],\n [\n 89.560509,\n 34.938794\n ],\n [\n 89.593153,\n 35.104412\n ],\n [\n 89.513081,\n 35.139158\n ],\n [\n 89.449639,\n 35.226693\n ],\n [\n 89.532175,\n 35.285323\n ],\n [\n 89.497067,\n 35.361479\n ],\n [\n 89.68616,\n 35.414647\n ],\n [\n 89.744058,\n 35.479963\n ],\n [\n 89.700327,\n 35.537435\n ],\n [\n 89.765616,\n 35.599732\n ],\n [\n 89.747138,\n 35.751862\n ],\n [\n 89.801957,\n 35.847948\n ],\n [\n 89.549422,\n 35.858132\n ],\n [\n 89.429929,\n 35.916302\n ],\n [\n 89.418843,\n 36.04606\n ],\n [\n 89.476125,\n 36.021868\n ],\n [\n 89.638117,\n 36.04993\n ],\n [\n 89.711414,\n 36.092972\n ],\n [\n 89.941159,\n 36.067343\n ],\n [\n 89.937463,\n 36.130675\n ],\n [\n 89.999057,\n 36.169809\n ],\n [\n 90.028006,\n 36.25815\n ],\n [\n 90.145651,\n 36.238849\n ],\n [\n 90.128405,\n 36.208923\n ],\n [\n 90.234962,\n 36.161597\n ],\n [\n 90.430215,\n 36.133091\n ],\n [\n 90.526917,\n 36.148553\n ],\n [\n 90.66304,\n 36.134058\n ],\n [\n 90.776373,\n 36.086203\n ],\n [\n 90.841046,\n 36.01848\n ],\n [\n 90.922966,\n 36.029126\n ],\n [\n 90.979017,\n 36.106992\n ],\n [\n 91.09235,\n 36.088621\n ],\n [\n 91.124994,\n 36.115693\n ],\n [\n 91.07264,\n 36.299149\n ],\n [\n 91.026444,\n 36.323738\n ],\n [\n 91.05293,\n 36.432608\n ],\n [\n 91.035683,\n 36.529788\n ],\n [\n 90.7388,\n 36.58746\n ],\n [\n 90.720938,\n 36.708912\n ],\n [\n 90.735105,\n 36.827778\n ],\n [\n 90.853981,\n 36.915371\n ],\n [\n 90.983944,\n 36.913458\n ],\n [\n 91.181045,\n 37.025318\n ],\n [\n 91.303617,\n 37.01242\n ],\n [\n 91.280211,\n 37.163721\n ],\n [\n 91.1909,\n 37.205669\n ],\n [\n 91.192132,\n 37.27807\n ],\n [\n 91.134849,\n 37.32614\n ],\n [\n 91.099741,\n 37.447843\n ],\n [\n 91.057241,\n 37.483936\n ],\n [\n 90.958075,\n 37.477763\n ],\n [\n 90.863836,\n 37.534246\n ],\n [\n 90.882314,\n 37.575513\n ],\n [\n 90.776373,\n 37.6504\n ],\n [\n 90.519526,\n 37.73089\n ],\n [\n 90.516446,\n 38.207291\n ],\n [\n 90.530613,\n 38.32004\n ],\n [\n 90.361846,\n 38.300322\n ],\n [\n 90.352607,\n 38.233615\n ],\n [\n 90.280542,\n 38.238315\n ],\n [\n 90.137644,\n 38.340692\n ],\n [\n 90.111774,\n 38.477595\n ],\n [\n 90.315034,\n 38.501948\n ],\n [\n 90.424671,\n 38.492114\n ],\n [\n 90.463476,\n 38.556711\n ],\n [\n 90.610685,\n 38.596003\n ],\n [\n 90.619308,\n 38.664245\n ],\n [\n 90.831191,\n 38.667982\n ],\n [\n 91.307928,\n 38.751089\n ],\n [\n 91.446515,\n 38.813588\n ],\n [\n 91.87952,\n 38.884417\n ],\n [\n 91.966368,\n 38.930976\n ],\n [\n 92.173323,\n 38.960758\n ],\n [\n 92.263866,\n 39.002153\n ],\n [\n 92.38459,\n 39.000758\n ],\n [\n 92.41046,\n 39.038412\n ],\n [\n 92.489916,\n 39.09973\n ],\n [\n 92.866871,\n 39.138723\n ],\n [\n 92.938936,\n 39.169809\n ],\n [\n 92.978356,\n 39.143364\n ],\n [\n 93.142196,\n 39.160531\n ],\n [\n 93.131725,\n 39.108088\n ],\n [\n 93.198246,\n 39.045847\n ],\n [\n 93.179152,\n 38.923994\n ],\n [\n 93.274007,\n 38.89606\n ],\n [\n 93.453245,\n 38.915615\n ],\n [\n 93.729186,\n 38.92446\n ],\n [\n 93.884403,\n 38.826175\n ],\n [\n 93.769838,\n 38.821047\n ],\n [\n 93.800019,\n 38.750622\n ],\n [\n 93.885018,\n 38.720752\n ],\n [\n 94.370379,\n 38.762753\n ],\n [\n 94.511429,\n 38.445268\n ],\n [\n 94.527443,\n 38.36556\n ],\n [\n 94.67958,\n 38.387137\n ],\n [\n 94.810775,\n 38.385261\n ],\n [\n 94.973999,\n 38.430271\n ],\n [\n 95.121825,\n 38.417615\n ],\n [\n 95.261027,\n 38.301261\n ],\n [\n 95.320157,\n 38.32051\n ],\n [\n 95.51849,\n 38.295156\n ],\n [\n 95.702039,\n 38.400736\n ],\n [\n 95.83693,\n 38.343977\n ],\n [\n 95.856024,\n 38.284355\n ],\n [\n 96.063596,\n 38.172962\n ],\n [\n 96.109175,\n 38.187072\n ],\n [\n 96.221892,\n 38.148969\n ],\n [\n 96.313051,\n 38.162142\n ],\n [\n 96.335841,\n 38.246303\n ],\n [\n 96.46334,\n 38.27778\n ],\n [\n 96.665369,\n 38.230325\n ],\n [\n 96.626564,\n 38.356177\n ],\n [\n 96.698013,\n 38.422302\n ],\n [\n 96.6666,\n 38.483684\n ],\n [\n 96.780549,\n 38.504289\n ],\n [\n 96.7941,\n 38.60816\n ],\n [\n 96.975802,\n 38.559519\n ],\n [\n 97.055874,\n 38.5946\n ],\n [\n 97.057722,\n 38.672654\n ],\n [\n 97.009063,\n 38.702544\n ],\n [\n 96.983809,\n 38.869046\n ],\n [\n 96.940693,\n 38.907701\n ],\n [\n 96.969643,\n 39.097873\n ],\n [\n 97.012142,\n 39.141972\n ],\n [\n 96.962867,\n 39.198564\n ],\n [\n 97.220946,\n 39.192999\n ],\n [\n 97.371235,\n 39.14058\n ],\n [\n 97.679205,\n 39.010522\n ],\n [\n 97.701379,\n 38.963085\n ],\n [\n 97.828878,\n 38.930046\n ],\n [\n 98.009348,\n 38.859262\n ],\n [\n 98.094964,\n 38.786077\n ],\n [\n 98.251412,\n 38.891403\n ],\n [\n 98.280977,\n 39.027257\n ],\n [\n 98.383839,\n 39.029581\n ],\n [\n 98.457752,\n 38.952849\n ],\n [\n 98.584635,\n 38.930046\n ],\n [\n 98.743548,\n 39.086728\n ],\n [\n 98.816845,\n 39.085799\n ],\n [\n 98.951735,\n 38.987737\n ],\n [\n 99.1088,\n 38.946334\n ],\n [\n 99.068764,\n 38.896991\n ],\n [\n 99.222133,\n 38.788875\n ],\n [\n 99.361951,\n 38.718418\n ],\n [\n 99.450646,\n 38.60442\n ],\n [\n 99.50916,\n 38.608628\n ],\n [\n 99.555972,\n 38.520207\n ],\n [\n 99.65945,\n 38.449017\n ],\n [\n 99.826985,\n 38.370251\n ],\n [\n 99.937238,\n 38.34163\n ],\n [\n 100.126332,\n 38.231735\n ],\n [\n 100.182998,\n 38.221864\n ],\n [\n 100.157744,\n 38.309712\n ],\n [\n 100.093071,\n 38.4073\n ],\n [\n 100.001296,\n 38.466821\n ],\n [\n 100.064122,\n 38.518802\n ],\n [\n 100.24028,\n 38.441519\n ],\n [\n 100.261222,\n 38.366498\n ],\n [\n 100.318505,\n 38.329428\n ],\n [\n 100.474953,\n 38.289052\n ],\n [\n 100.546402,\n 38.246773\n ],\n [\n 100.619083,\n 38.265567\n ],\n [\n 100.74843,\n 38.239724\n ],\n [\n 100.825423,\n 38.158849\n ],\n [\n 100.93814,\n 38.160261\n ],\n [\n 100.887633,\n 38.050562\n ],\n [\n 101.150639,\n 37.876969\n ],\n [\n 101.362522,\n 37.791437\n ],\n [\n 101.459224,\n 37.866105\n ],\n [\n 101.597195,\n 37.828308\n ],\n [\n 101.659405,\n 37.733256\n ],\n [\n 101.791832,\n 37.695864\n ],\n [\n 101.815853,\n 37.65419\n ],\n [\n 101.946432,\n 37.728051\n ],\n [\n 102.036359,\n 37.684974\n ],\n [\n 102.035743,\n 37.627184\n ],\n [\n 102.130598,\n 37.544684\n ],\n [\n 102.102881,\n 37.48441\n ],\n [\n 102.19712,\n 37.420287\n ],\n [\n 102.428097,\n 37.308534\n ],\n [\n 102.457662,\n 37.24807\n ],\n [\n 102.599944,\n 37.174687\n ],\n [\n 102.642444,\n 37.099801\n ],\n [\n 102.488459,\n 37.079278\n ],\n [\n 102.506321,\n 37.019108\n ],\n [\n 102.450271,\n 36.968453\n ],\n [\n 102.56114,\n 36.919676\n ],\n [\n 102.587009,\n 36.869912\n ],\n [\n 102.704654,\n 36.792329\n ],\n [\n 102.606719,\n 36.682526\n ],\n [\n 102.761936,\n 36.568721\n ],\n [\n 102.769943,\n 36.472072\n ],\n [\n 102.830305,\n 36.362294\n ],\n [\n 102.830305,\n 36.358439\n ],\n [\n 103.024326,\n 36.257185\n ],\n [\n 103.068058,\n 36.203612\n ],\n [\n 102.98737,\n 36.193956\n ],\n [\n 102.941174,\n 36.105058\n ],\n [\n 102.882044,\n 36.082335\n ],\n [\n 102.971971,\n 35.995247\n ],\n [\n 102.955957,\n 35.861041\n ],\n [\n 102.78411,\n 35.862496\n ],\n [\n 102.686175,\n 35.772253\n ],\n [\n 102.808747,\n 35.560315\n ],\n [\n 102.742226,\n 35.495065\n ],\n [\n 102.504473,\n 35.583189\n ],\n [\n 102.447807,\n 35.437563\n ],\n [\n 102.407155,\n 35.408308\n ],\n [\n 102.317228,\n 35.433663\n ],\n [\n 102.279655,\n 35.304857\n ],\n [\n 102.370814,\n 35.262854\n ],\n [\n 102.402227,\n 35.191006\n ],\n [\n 102.310452,\n 35.128883\n ],\n [\n 102.29567,\n 35.071609\n ],\n [\n 102.218677,\n 35.058386\n ],\n [\n 102.094874,\n 34.986848\n ],\n [\n 102.048062,\n 34.910832\n ],\n [\n 101.917483,\n 34.875497\n ],\n [\n 101.919947,\n 34.621821\n ],\n [\n 102.003715,\n 34.538074\n ],\n [\n 102.155852,\n 34.507511\n ],\n [\n 102.210054,\n 34.399462\n ],\n [\n 102.210054,\n 34.399462\n ],\n [\n 102.237772,\n 34.343163\n ],\n [\n 102.237156,\n 34.343163\n ],\n [\n 102.237772,\n 34.343163\n ],\n [\n 102.237156,\n 34.343163\n ],\n [\n 102.189728,\n 34.355018\n ],\n [\n 102.149692,\n 34.271993\n ],\n [\n 102.067772,\n 34.293746\n ],\n [\n 102.062229,\n 34.227976\n ],\n [\n 101.965526,\n 34.167601\n ],\n [\n 101.955055,\n 34.10966\n ],\n [\n 101.84665,\n 34.150272\n ],\n [\n 101.736397,\n 34.079931\n ],\n [\n 101.622448,\n 34.178492\n ],\n [\n 101.530057,\n 34.21066\n ],\n [\n 101.331109,\n 34.245289\n ],\n [\n 101.235022,\n 34.325376\n ],\n [\n 101.054552,\n 34.322905\n ],\n [\n 100.986799,\n 34.374774\n ],\n [\n 100.895024,\n 34.375268\n ],\n [\n 100.821727,\n 34.317469\n ],\n [\n 100.764445,\n 34.178987\n ],\n [\n 100.806329,\n 34.155224\n ],\n [\n 100.999118,\n 33.889419\n ],\n [\n 101.153718,\n 33.844706\n ],\n [\n 101.191907,\n 33.786047\n ],\n [\n 101.166653,\n 33.660142\n ],\n [\n 101.238718,\n 33.685039\n ],\n [\n 101.385312,\n 33.644702\n ],\n [\n 101.501724,\n 33.70296\n ],\n [\n 101.582412,\n 33.675081\n ],\n [\n 101.622448,\n 33.502127\n ],\n [\n 101.735781,\n 33.49614\n ],\n [\n 101.769042,\n 33.538541\n ],\n [\n 101.769658,\n 33.447728\n ],\n [\n 101.695745,\n 33.433748\n ],\n [\n 101.64955,\n 33.323328\n ],\n [\n 101.739477,\n 33.265815\n ],\n [\n 101.625528,\n 33.100566\n ],\n [\n 101.486326,\n 33.227285\n ],\n [\n 101.405022,\n 33.225783\n ],\n [\n 101.393935,\n 33.157687\n ],\n [\n 101.297232,\n 33.262313\n ],\n [\n 101.183283,\n 33.270317\n ],\n [\n 101.11553,\n 33.194746\n ],\n [\n 101.169733,\n 33.100566\n ],\n [\n 101.183899,\n 32.984204\n ],\n [\n 101.129081,\n 32.989725\n ],\n [\n 101.124153,\n 32.909893\n ],\n [\n 101.237486,\n 32.824962\n ],\n [\n 101.22332,\n 32.725856\n ],\n [\n 101.157414,\n 32.661404\n ],\n [\n 101.075494,\n 32.683061\n ],\n [\n 100.93198,\n 32.600433\n ],\n [\n 100.690532,\n 32.678025\n ],\n [\n 100.645568,\n 32.526306\n ],\n [\n 100.54517,\n 32.569681\n ],\n [\n 100.516837,\n 32.630168\n ],\n [\n 100.399809,\n 32.756556\n ],\n [\n 100.339447,\n 32.719313\n ],\n [\n 100.258759,\n 32.742466\n ],\n [\n 100.208252,\n 32.606482\n ],\n [\n 100.088143,\n 32.668959\n ],\n [\n 100.139266,\n 32.724346\n ],\n [\n 100.123252,\n 32.837028\n ],\n [\n 100.038252,\n 32.928979\n ],\n [\n 99.956332,\n 32.948061\n ],\n [\n 99.877492,\n 33.045915\n ],\n [\n 99.854086,\n 32.945048\n ],\n [\n 99.788181,\n 32.956596\n ],\n [\n 99.763543,\n 32.778693\n ],\n [\n 99.607711,\n 32.780705\n ],\n [\n 99.558436,\n 32.839039\n ],\n [\n 99.385973,\n 32.900349\n ],\n [\n 99.268328,\n 32.878744\n ],\n [\n 99.235067,\n 32.982197\n ],\n [\n 99.179633,\n 33.044912\n ],\n [\n 99.002242,\n 33.08252\n ],\n [\n 98.858728,\n 33.150674\n ],\n [\n 98.759562,\n 33.277321\n ],\n [\n 98.779272,\n 33.37181\n ],\n [\n 98.734309,\n 33.409278\n ],\n [\n 98.742316,\n 33.477677\n ],\n [\n 98.648077,\n 33.549014\n ],\n [\n 98.61728,\n 33.63723\n ],\n [\n 98.6567,\n 33.647193\n ],\n [\n 98.539056,\n 33.746752\n ],\n [\n 98.462064,\n 33.849178\n ],\n [\n 98.406629,\n 33.867065\n ],\n [\n 98.440506,\n 33.981255\n ],\n [\n 98.401702,\n 34.08786\n ],\n [\n 98.21076,\n 34.078444\n ],\n [\n 98.051848,\n 34.115604\n ],\n [\n 97.937283,\n 34.196804\n ],\n [\n 97.937283,\n 34.196804\n ],\n [\n 97.834421,\n 34.208186\n ],\n [\n 97.665654,\n 34.126997\n ],\n [\n 97.70261,\n 34.036805\n ],\n [\n 97.660111,\n 33.956444\n ],\n [\n 97.458698,\n 33.886935\n ],\n [\n 97.388481,\n 33.884452\n ],\n [\n 97.435293,\n 33.680558\n ],\n [\n 97.415583,\n 33.605343\n ],\n [\n 97.52522,\n 33.575937\n ],\n [\n 97.552321,\n 33.465698\n ],\n [\n 97.625618,\n 33.461705\n ],\n [\n 97.753733,\n 33.410277\n ],\n [\n 97.676125,\n 33.340825\n ],\n [\n 97.621306,\n 33.334327\n ],\n [\n 97.576343,\n 33.221779\n ],\n [\n 97.487648,\n 33.168205\n ],\n [\n 97.487648,\n 33.10658\n ],\n [\n 97.542466,\n 33.036385\n ],\n [\n 97.523988,\n 32.988721\n ],\n [\n 97.373699,\n 32.956094\n ],\n [\n 97.386018,\n 32.779196\n ],\n [\n 97.42359,\n 32.704713\n ],\n [\n 97.543698,\n 32.621602\n ],\n [\n 97.730944,\n 32.527315\n ],\n [\n 97.670582,\n 32.517225\n ],\n [\n 97.472249,\n 32.54497\n ],\n [\n 97.448843,\n 32.586823\n ],\n [\n 97.334895,\n 32.514198\n ],\n [\n 97.388481,\n 32.501583\n ],\n [\n 97.341054,\n 32.441009\n ],\n [\n 97.387865,\n 32.427374\n ],\n [\n 97.424822,\n 32.323278\n ],\n [\n 97.371235,\n 32.273208\n ],\n [\n 97.299786,\n 32.294959\n ],\n [\n 97.264062,\n 32.183621\n ],\n [\n 97.308409,\n 32.074682\n ],\n [\n 97.130403,\n 32.04375\n ],\n [\n 97.008447,\n 32.067076\n ],\n [\n 96.894498,\n 32.013822\n ],\n [\n 96.722651,\n 32.013314\n ],\n [\n 96.81073,\n 31.894521\n ],\n [\n 96.760223,\n 31.856922\n ],\n [\n 96.840295,\n 31.720623\n ],\n [\n 96.775006,\n 31.673788\n ],\n [\n 96.616093,\n 31.736908\n ],\n [\n 96.576057,\n 31.712989\n ],\n [\n 96.468268,\n 31.769978\n ],\n [\n 96.389428,\n 31.919917\n ],\n [\n 96.253921,\n 31.929566\n ],\n [\n 96.176313,\n 31.777608\n ],\n [\n 96.252689,\n 31.69619\n ],\n [\n 96.204646,\n 31.598904\n ],\n [\n 96.160298,\n 31.600943\n ],\n [\n 96.135661,\n 31.702299\n ],\n [\n 96.041422,\n 31.734364\n ],\n [\n 95.982908,\n 31.816765\n ],\n [\n 95.89914,\n 31.817273\n ],\n [\n 95.825227,\n 31.681935\n ],\n [\n 95.779648,\n 31.74912\n ],\n [\n 95.618272,\n 31.783712\n ],\n [\n 95.546823,\n 31.739961\n ],\n [\n 95.439649,\n 31.831508\n ],\n [\n 95.360809,\n 31.959013\n ],\n [\n 95.454432,\n 32.062006\n ],\n [\n 95.406389,\n 32.182102\n ],\n [\n 95.312766,\n 32.148673\n ],\n [\n 95.26965,\n 32.194761\n ],\n [\n 95.241317,\n 32.32075\n ],\n [\n 95.10581,\n 32.259042\n ],\n [\n 95.096571,\n 32.322267\n ],\n [\n 95.261643,\n 32.348049\n ],\n [\n 95.218527,\n 32.397067\n ],\n [\n 95.081789,\n 32.384942\n ],\n [\n 94.985086,\n 32.421819\n ],\n [\n 94.912405,\n 32.415758\n ],\n [\n 94.889616,\n 32.472311\n ],\n [\n 94.80708,\n 32.486444\n ],\n [\n 94.772587,\n 32.555057\n ],\n [\n 94.614291,\n 32.673492\n ],\n [\n 94.53853,\n 32.599425\n ],\n [\n 94.395016,\n 32.594385\n ],\n [\n 94.371611,\n 32.524793\n ],\n [\n 94.196684,\n 32.516216\n ],\n [\n 94.136322,\n 32.433939\n ],\n [\n 93.958931,\n 32.484929\n ],\n [\n 93.861613,\n 32.466253\n ],\n [\n 93.820345,\n 32.549509\n ],\n [\n 93.654657,\n 32.57321\n ],\n [\n 93.618933,\n 32.522775\n ],\n [\n 93.516687,\n 32.475844\n ],\n [\n 93.4631,\n 32.556065\n ],\n [\n 93.385492,\n 32.525297\n ],\n [\n 93.239514,\n 32.662411\n ],\n [\n 93.069515,\n 32.626137\n ],\n [\n 93.019624,\n 32.737433\n ],\n [\n 92.877342,\n 32.697161\n ],\n [\n 92.686401,\n 32.765109\n ],\n [\n 92.63651,\n 32.720319\n ],\n [\n 92.355641,\n 32.764606\n ],\n [\n 92.255243,\n 32.720823\n ],\n [\n 92.198577,\n 32.755046\n ],\n [\n 92.227526,\n 32.820939\n ],\n [\n 92.145606,\n 32.885779\n ],\n [\n 91.955897,\n 32.820437\n ],\n [\n 91.896766,\n 32.907884\n ],\n [\n 91.785281,\n 32.944044\n ],\n [\n 91.58079,\n 33.039395\n ],\n [\n 91.49887,\n 33.109086\n ],\n [\n 91.436044,\n 33.065974\n ],\n [\n 91.262349,\n 33.141156\n ],\n [\n 91.134849,\n 33.073495\n ],\n [\n 91.001807,\n 33.116102\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 640000,\n \"name\": \"宁夏回族自治区\",\n \"center\": [\n 106.278179,\n 38.46637\n ],\n \"centroid\": [\n 106.169867,\n 37.291331\n ],\n \"childrenNum\": 5,\n \"level\": \"province\",\n \"subFeatureIndex\": 29,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 106.06953,\n 35.458034\n ],\n [\n 106.071994,\n 35.463395\n ],\n [\n 106.078153,\n 35.489707\n ],\n [\n 106.078153,\n 35.489707\n ],\n [\n 106.070762,\n 35.491655\n ],\n [\n 106.015943,\n 35.52234\n ],\n [\n 105.868734,\n 35.53987\n ],\n [\n 105.847176,\n 35.490681\n ],\n [\n 105.690727,\n 35.698431\n ],\n [\n 105.754785,\n 35.730494\n ],\n [\n 105.671017,\n 35.749434\n ],\n [\n 105.570003,\n 35.716407\n ],\n [\n 105.481924,\n 35.727094\n ],\n [\n 105.392613,\n 35.865405\n ],\n [\n 105.333483,\n 35.887707\n ],\n [\n 105.343954,\n 36.033965\n ],\n [\n 105.513337,\n 36.150003\n ],\n [\n 105.460366,\n 36.223887\n ],\n [\n 105.473301,\n 36.298185\n ],\n [\n 105.401236,\n 36.370002\n ],\n [\n 105.398156,\n 36.430683\n ],\n [\n 105.319932,\n 36.536038\n ],\n [\n 105.281744,\n 36.522575\n ],\n [\n 105.22015,\n 36.631167\n ],\n [\n 105.218302,\n 36.730494\n ],\n [\n 105.319932,\n 36.742961\n ],\n [\n 105.334714,\n 36.800953\n ],\n [\n 105.244787,\n 36.894798\n ],\n [\n 105.190585,\n 36.886185\n ],\n [\n 105.165331,\n 36.995218\n ],\n [\n 104.95468,\n 37.040125\n ],\n [\n 104.85613,\n 37.211864\n ],\n [\n 104.775442,\n 37.246641\n ],\n [\n 104.638087,\n 37.201857\n ],\n [\n 104.600515,\n 37.242831\n ],\n [\n 104.632544,\n 37.299015\n ],\n [\n 104.713848,\n 37.32947\n ],\n [\n 104.679971,\n 37.407931\n ],\n [\n 104.437907,\n 37.445943\n ],\n [\n 104.287002,\n 37.42789\n ],\n [\n 104.407726,\n 37.464467\n ],\n [\n 104.419429,\n 37.511943\n ],\n [\n 104.801311,\n 37.538516\n ],\n [\n 104.866601,\n 37.566503\n ],\n [\n 105.024281,\n 37.579781\n ],\n [\n 105.111128,\n 37.633818\n ],\n [\n 105.315004,\n 37.702018\n ],\n [\n 105.598952,\n 37.699178\n ],\n [\n 105.622974,\n 37.778669\n ],\n [\n 105.760944,\n 37.799947\n ],\n [\n 105.80406,\n 37.861854\n ],\n [\n 105.799749,\n 37.940227\n ],\n [\n 105.840401,\n 38.003902\n ],\n [\n 105.780655,\n 38.084949\n ],\n [\n 105.775111,\n 38.186601\n ],\n [\n 105.86627,\n 38.296565\n ],\n [\n 105.821307,\n 38.366967\n ],\n [\n 105.874277,\n 38.593197\n ],\n [\n 105.852719,\n 38.641349\n ],\n [\n 105.90569,\n 38.731488\n ],\n [\n 105.897683,\n 38.788875\n ],\n [\n 106.003625,\n 38.874636\n ],\n [\n 105.97098,\n 38.909097\n ],\n [\n 106.060907,\n 38.968667\n ],\n [\n 106.096631,\n 39.08487\n ],\n [\n 106.145907,\n 39.153108\n ],\n [\n 106.283877,\n 39.14522\n ],\n [\n 106.284493,\n 39.270397\n ],\n [\n 106.402753,\n 39.291701\n ],\n [\n 106.506231,\n 39.269934\n ],\n [\n 106.602318,\n 39.375466\n ],\n [\n 106.683622,\n 39.357426\n ],\n [\n 106.751375,\n 39.381478\n ],\n [\n 106.806809,\n 39.318554\n ],\n [\n 106.795723,\n 39.214327\n ],\n [\n 106.859164,\n 39.107623\n ],\n [\n 106.96757,\n 39.054676\n ],\n [\n 106.954019,\n 38.941215\n ],\n [\n 106.709491,\n 38.718885\n ],\n [\n 106.66268,\n 38.601614\n ],\n [\n 106.647897,\n 38.470569\n ],\n [\n 106.601702,\n 38.392295\n ],\n [\n 106.482825,\n 38.319571\n ],\n [\n 106.546883,\n 38.269794\n ],\n [\n 106.768621,\n 38.174843\n ],\n [\n 107.014997,\n 38.120261\n ],\n [\n 107.19054,\n 38.154144\n ],\n [\n 107.329742,\n 38.087774\n ],\n [\n 107.438147,\n 37.992586\n ],\n [\n 107.419669,\n 37.940699\n ],\n [\n 107.49235,\n 37.944945\n ],\n [\n 107.65003,\n 37.864688\n ],\n [\n 107.620465,\n 37.775832\n ],\n [\n 107.499125,\n 37.7659\n ],\n [\n 107.484959,\n 37.706279\n ],\n [\n 107.348836,\n 37.608226\n ],\n [\n 107.342061,\n 37.515265\n ],\n [\n 107.284162,\n 37.482036\n ],\n [\n 107.257677,\n 37.337082\n ],\n [\n 107.336517,\n 37.165628\n ],\n [\n 107.268764,\n 37.099324\n ],\n [\n 107.180685,\n 37.143692\n ],\n [\n 107.095685,\n 37.115548\n ],\n [\n 107.030395,\n 37.140831\n ],\n [\n 106.891193,\n 37.098369\n ],\n [\n 106.777244,\n 37.156569\n ],\n [\n 106.777244,\n 37.156569\n ],\n [\n 106.750143,\n 37.098847\n ],\n [\n 106.605397,\n 37.127475\n ],\n [\n 106.666991,\n 37.01672\n ],\n [\n 106.595542,\n 36.940243\n ],\n [\n 106.658368,\n 36.811972\n ],\n [\n 106.631883,\n 36.723301\n ],\n [\n 106.589383,\n 36.750153\n ],\n [\n 106.519782,\n 36.708912\n ],\n [\n 106.519782,\n 36.708912\n ],\n [\n 106.471738,\n 36.581214\n ],\n [\n 106.401521,\n 36.546133\n ],\n [\n 106.521014,\n 36.479289\n ],\n [\n 106.488369,\n 36.400348\n ],\n [\n 106.505615,\n 36.265869\n ],\n [\n 106.599238,\n 36.274552\n ],\n [\n 106.599238,\n 36.274552\n ],\n [\n 106.858548,\n 36.206992\n ],\n [\n 106.858548,\n 36.206992\n ],\n [\n 106.957715,\n 36.091522\n ],\n [\n 106.950939,\n 36.004444\n ],\n [\n 106.849925,\n 35.887707\n ],\n [\n 106.92199,\n 35.803316\n ],\n [\n 106.86594,\n 35.737779\n ],\n [\n 106.737208,\n 35.689198\n ],\n [\n 106.504383,\n 35.738265\n ],\n [\n 106.501304,\n 35.737779\n ],\n [\n 106.434782,\n 35.688712\n ],\n [\n 106.476666,\n 35.580756\n ],\n [\n 106.440941,\n 35.526723\n ],\n [\n 106.503767,\n 35.415135\n ],\n [\n 106.472354,\n 35.310716\n ],\n [\n 106.319601,\n 35.265296\n ],\n [\n 106.174856,\n 35.438538\n ],\n [\n 106.107102,\n 35.364894\n ],\n [\n 106.079385,\n 35.427325\n ],\n [\n 106.071378,\n 35.449261\n ],\n [\n 106.073226,\n 35.450236\n ],\n [\n 106.073842,\n 35.45511\n ],\n [\n 106.06953,\n 35.458034\n ]\n ]\n ],\n [\n [\n [\n 106.057827,\n 35.488245\n ],\n [\n 106.054132,\n 35.449261\n ],\n [\n 105.894603,\n 35.413672\n ],\n [\n 105.897683,\n 35.451698\n ],\n [\n 106.057827,\n 35.488245\n ]\n ]\n ],\n [\n [\n [\n 106.071378,\n 35.449261\n ],\n [\n 106.06953,\n 35.458034\n ],\n [\n 106.073842,\n 35.45511\n ],\n [\n 106.073226,\n 35.450236\n ],\n [\n 106.071378,\n 35.449261\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 650000,\n \"name\": \"新疆维吾尔自治区\",\n \"center\": [\n 87.617733,\n 43.792818\n ],\n \"centroid\": [\n 85.294712,\n 41.371801\n ],\n \"childrenNum\": 23,\n \"level\": \"province\",\n \"subFeatureIndex\": 30,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 79.039649,\n 34.33427\n ],\n [\n 78.958961,\n 34.386132\n ],\n [\n 78.878273,\n 34.391563\n ],\n [\n 78.742766,\n 34.454737\n ],\n [\n 78.708274,\n 34.522301\n ],\n [\n 78.634977,\n 34.538074\n ],\n [\n 78.58139,\n 34.505539\n ],\n [\n 78.542586,\n 34.574539\n ],\n [\n 78.436029,\n 34.543496\n ],\n [\n 78.427405,\n 34.594243\n ],\n [\n 78.280812,\n 34.623298\n ],\n [\n 78.267261,\n 34.705482\n ],\n [\n 78.213059,\n 34.717778\n ],\n [\n 78.237696,\n 34.882369\n ],\n [\n 78.182262,\n 34.936832\n ],\n [\n 78.201972,\n 34.974592\n ],\n [\n 78.123131,\n 35.036833\n ],\n [\n 78.124979,\n 35.108327\n ],\n [\n 78.062769,\n 35.11469\n ],\n [\n 78.01719,\n 35.22816\n ],\n [\n 78.013494,\n 35.36587\n ],\n [\n 78.136066,\n 35.49263\n ],\n [\n 78.009799,\n 35.491655\n ],\n [\n 77.914944,\n 35.464857\n ],\n [\n 77.816394,\n 35.518445\n ],\n [\n 77.690742,\n 35.448287\n ],\n [\n 77.518895,\n 35.481912\n ],\n [\n 77.396939,\n 35.467781\n ],\n [\n 77.307628,\n 35.540356\n ],\n [\n 77.195527,\n 35.519419\n ],\n [\n 77.072339,\n 35.590974\n ],\n [\n 76.967013,\n 35.591947\n ],\n [\n 76.83705,\n 35.66198\n ],\n [\n 76.76129,\n 35.65566\n ],\n [\n 76.69292,\n 35.747492\n ],\n [\n 76.593754,\n 35.772253\n ],\n [\n 76.566037,\n 35.819328\n ],\n [\n 76.59745,\n 35.895947\n ],\n [\n 76.54879,\n 35.919209\n ],\n [\n 76.365857,\n 35.82418\n ],\n [\n 76.298719,\n 35.841643\n ],\n [\n 76.147198,\n 35.833397\n ],\n [\n 76.16506,\n 35.909033\n ],\n [\n 76.104082,\n 36.018964\n ],\n [\n 75.961184,\n 36.051381\n ],\n [\n 75.942706,\n 36.137923\n ],\n [\n 76.016619,\n 36.165461\n ],\n [\n 76.011691,\n 36.229197\n ],\n [\n 76.060967,\n 36.225335\n ],\n [\n 75.989518,\n 36.340127\n ],\n [\n 76.035097,\n 36.409017\n ],\n [\n 75.945786,\n 36.588421\n ],\n [\n 75.871873,\n 36.66621\n ],\n [\n 75.724048,\n 36.750632\n ],\n [\n 75.537418,\n 36.773161\n ],\n [\n 75.536802,\n 36.730015\n ],\n [\n 75.458578,\n 36.720903\n ],\n [\n 75.425933,\n 36.778912\n ],\n [\n 75.413614,\n 36.954588\n ],\n [\n 75.244847,\n 36.963194\n ],\n [\n 75.130898,\n 37.010987\n ],\n [\n 75.032348,\n 37.01672\n ],\n [\n 74.893762,\n 36.939764\n ],\n [\n 74.84695,\n 37.056839\n ],\n [\n 74.739161,\n 37.028185\n ],\n [\n 74.70898,\n 37.084529\n ],\n [\n 74.56793,\n 37.032961\n ],\n [\n 74.498944,\n 37.072595\n ],\n [\n 74.465068,\n 37.147031\n ],\n [\n 74.511263,\n 37.239973\n ],\n [\n 74.665864,\n 37.235686\n ],\n [\n 74.727458,\n 37.282831\n ],\n [\n 74.816153,\n 37.216629\n ],\n [\n 74.911008,\n 37.23378\n ],\n [\n 74.927022,\n 37.277594\n ],\n [\n 75.125971,\n 37.322334\n ],\n [\n 75.153072,\n 37.414109\n ],\n [\n 75.069304,\n 37.513367\n ],\n [\n 75.035428,\n 37.501026\n ],\n [\n 74.940573,\n 37.558914\n ],\n [\n 74.891914,\n 37.668399\n ],\n [\n 75.006478,\n 37.771102\n ],\n [\n 74.917167,\n 37.844847\n ],\n [\n 74.911008,\n 37.967118\n ],\n [\n 74.821697,\n 38.102842\n ],\n [\n 74.789668,\n 38.324734\n ],\n [\n 74.868508,\n 38.404018\n ],\n [\n 74.862965,\n 38.484152\n ],\n [\n 74.792747,\n 38.536121\n ],\n [\n 74.717603,\n 38.542205\n ],\n [\n 74.639995,\n 38.599744\n ],\n [\n 74.506336,\n 38.63761\n ],\n [\n 74.229779,\n 38.656302\n ],\n [\n 74.147859,\n 38.676858\n ],\n [\n 74.068403,\n 38.585714\n ],\n [\n 74.090577,\n 38.542205\n ],\n [\n 73.926121,\n 38.536121\n ],\n [\n 73.89902,\n 38.579166\n ],\n [\n 73.799237,\n 38.610966\n ],\n [\n 73.757353,\n 38.719818\n ],\n [\n 73.769056,\n 38.775815\n ],\n [\n 73.699455,\n 38.857865\n ],\n [\n 73.767824,\n 38.941215\n ],\n [\n 73.826339,\n 38.917012\n ],\n [\n 73.820179,\n 39.041665\n ],\n [\n 73.743187,\n 39.029581\n ],\n [\n 73.719781,\n 39.108088\n ],\n [\n 73.639709,\n 39.220353\n ],\n [\n 73.542391,\n 39.269471\n ],\n [\n 73.554094,\n 39.350023\n ],\n [\n 73.502355,\n 39.383791\n ],\n [\n 73.592898,\n 39.412457\n ],\n [\n 73.61076,\n 39.466059\n ],\n [\n 73.745651,\n 39.461902\n ],\n [\n 73.868223,\n 39.482686\n ],\n [\n 73.953838,\n 39.600345\n ],\n [\n 73.905795,\n 39.742193\n ],\n [\n 73.841737,\n 39.756453\n ],\n [\n 73.845433,\n 39.831389\n ],\n [\n 73.907027,\n 39.873647\n ],\n [\n 73.910722,\n 39.934693\n ],\n [\n 73.980324,\n 40.004851\n ],\n [\n 73.943367,\n 40.015849\n ],\n [\n 74.023439,\n 40.085008\n ],\n [\n 74.26304,\n 40.125281\n ],\n [\n 74.356662,\n 40.089128\n ],\n [\n 74.442894,\n 40.137175\n ],\n [\n 74.577169,\n 40.260567\n ],\n [\n 74.673255,\n 40.278828\n ],\n [\n 74.697893,\n 40.344527\n ],\n [\n 74.908544,\n 40.339055\n ],\n [\n 74.795211,\n 40.443412\n ],\n [\n 74.819233,\n 40.505767\n ],\n [\n 74.891914,\n 40.507587\n ],\n [\n 74.973218,\n 40.460258\n ],\n [\n 75.102565,\n 40.439769\n ],\n [\n 75.13521,\n 40.463445\n ],\n [\n 75.242383,\n 40.448876\n ],\n [\n 75.355716,\n 40.538059\n ],\n [\n 75.432093,\n 40.563518\n ],\n [\n 75.550353,\n 40.648917\n ],\n [\n 75.636584,\n 40.624399\n ],\n [\n 75.646439,\n 40.516684\n ],\n [\n 75.733287,\n 40.474369\n ],\n [\n 75.669845,\n 40.363678\n ],\n [\n 75.709265,\n 40.28111\n ],\n [\n 75.831221,\n 40.327196\n ],\n [\n 75.921764,\n 40.291151\n ],\n [\n 75.986438,\n 40.381911\n ],\n [\n 76.176147,\n 40.381455\n ],\n [\n 76.279625,\n 40.439314\n ],\n [\n 76.333212,\n 40.343615\n ],\n [\n 76.442233,\n 40.391482\n ],\n [\n 76.539551,\n 40.4639\n ],\n [\n 76.556798,\n 40.542606\n ],\n [\n 76.657196,\n 40.620312\n ],\n [\n 76.676906,\n 40.696113\n ],\n [\n 76.646725,\n 40.760045\n ],\n [\n 76.731724,\n 40.818935\n ],\n [\n 76.761905,\n 40.954185\n ],\n [\n 76.85368,\n 40.976323\n ],\n [\n 76.885709,\n 41.027348\n ],\n [\n 77.002122,\n 41.073373\n ],\n [\n 77.091433,\n 41.062546\n ],\n [\n 77.169041,\n 41.009291\n ],\n [\n 77.296541,\n 41.004776\n ],\n [\n 77.363062,\n 41.040888\n ],\n [\n 77.476395,\n 40.999357\n ],\n [\n 77.591576,\n 40.992132\n ],\n [\n 77.829328,\n 41.059388\n ],\n [\n 77.814546,\n 41.134238\n ],\n [\n 77.905089,\n 41.185141\n ],\n [\n 77.972842,\n 41.172982\n ],\n [\n 78.129291,\n 41.228354\n ],\n [\n 78.162551,\n 41.382521\n ],\n [\n 78.324544,\n 41.384316\n ],\n [\n 78.458818,\n 41.41349\n ],\n [\n 78.580774,\n 41.481659\n ],\n [\n 78.650375,\n 41.467314\n ],\n [\n 78.739071,\n 41.555578\n ],\n [\n 78.825302,\n 41.560503\n ],\n [\n 78.959577,\n 41.652663\n ],\n [\n 79.021787,\n 41.657134\n ],\n [\n 79.138199,\n 41.722814\n ],\n [\n 79.21704,\n 41.725493\n ],\n [\n 79.326061,\n 41.809391\n ],\n [\n 79.361169,\n 41.796457\n ],\n [\n 79.462799,\n 41.848625\n ],\n [\n 79.550879,\n 41.833915\n ],\n [\n 79.640806,\n 41.884717\n ],\n [\n 79.776313,\n 41.892734\n ],\n [\n 79.852689,\n 42.015544\n ],\n [\n 79.918594,\n 42.041322\n ],\n [\n 80.14218,\n 42.034656\n ],\n [\n 80.193303,\n 42.081301\n ],\n [\n 80.139717,\n 42.151427\n ],\n [\n 80.168666,\n 42.200202\n ],\n [\n 80.28631,\n 42.232993\n ],\n [\n 80.283847,\n 42.320649\n ],\n [\n 80.229028,\n 42.358241\n ],\n [\n 80.206238,\n 42.428943\n ],\n [\n 80.265368,\n 42.502211\n ],\n [\n 80.164354,\n 42.627363\n ],\n [\n 80.228412,\n 42.692923\n ],\n [\n 80.261673,\n 42.825592\n ],\n [\n 80.417505,\n 42.838755\n ],\n [\n 80.500041,\n 42.879544\n ],\n [\n 80.602903,\n 42.89445\n ],\n [\n 80.487106,\n 42.94878\n ],\n [\n 80.378701,\n 43.031497\n ],\n [\n 80.593048,\n 43.133319\n ],\n [\n 80.79446,\n 43.137248\n ],\n [\n 80.777214,\n 43.30816\n ],\n [\n 80.69283,\n 43.32035\n ],\n [\n 80.761199,\n 43.446456\n ],\n [\n 80.75504,\n 43.49422\n ],\n [\n 80.522215,\n 43.816724\n ],\n [\n 80.511128,\n 43.906887\n ],\n [\n 80.453846,\n 43.989596\n ],\n [\n 80.449534,\n 44.077778\n ],\n [\n 80.3941,\n 44.127189\n ],\n [\n 80.413194,\n 44.264461\n ],\n [\n 80.350368,\n 44.484713\n ],\n [\n 80.411962,\n 44.605392\n ],\n [\n 80.313412,\n 44.704987\n ],\n [\n 80.200695,\n 44.75642\n ],\n [\n 80.169898,\n 44.844727\n ],\n [\n 79.999283,\n 44.793797\n ],\n [\n 79.969102,\n 44.877383\n ],\n [\n 79.887798,\n 44.909173\n ],\n [\n 80.144644,\n 45.058985\n ],\n [\n 80.24381,\n 45.031507\n ],\n [\n 80.328194,\n 45.069973\n ],\n [\n 80.404571,\n 45.049264\n ],\n [\n 80.493882,\n 45.126991\n ],\n [\n 80.599207,\n 45.10588\n ],\n [\n 80.731634,\n 45.156111\n ],\n [\n 80.897938,\n 45.127413\n ],\n [\n 80.93551,\n 45.16033\n ],\n [\n 81.024821,\n 45.162862\n ],\n [\n 81.111669,\n 45.218522\n ],\n [\n 81.170183,\n 45.210935\n ],\n [\n 81.44982,\n 45.265707\n ],\n [\n 81.575471,\n 45.307803\n ],\n [\n 81.634601,\n 45.357856\n ],\n [\n 81.78797,\n 45.383497\n ],\n [\n 81.921013,\n 45.233272\n ],\n [\n 82.052824,\n 45.25602\n ],\n [\n 82.109491,\n 45.211357\n ],\n [\n 82.294272,\n 45.247596\n ],\n [\n 82.487061,\n 45.181\n ],\n [\n 82.58746,\n 45.224001\n ],\n [\n 82.60101,\n 45.346083\n ],\n [\n 82.546808,\n 45.425925\n ],\n [\n 82.281954,\n 45.538772\n ],\n [\n 82.266555,\n 45.620015\n ],\n [\n 82.289961,\n 45.7166\n ],\n [\n 82.340468,\n 45.772552\n ],\n [\n 82.342932,\n 45.935076\n ],\n [\n 82.461808,\n 45.979999\n ],\n [\n 82.518474,\n 46.153938\n ],\n [\n 82.726662,\n 46.494818\n ],\n [\n 82.829524,\n 46.772551\n ],\n [\n 82.876335,\n 46.82375\n ],\n [\n 82.937929,\n 47.014193\n ],\n [\n 82.993364,\n 47.06557\n ],\n [\n 83.02724,\n 47.215341\n ],\n [\n 83.15474,\n 47.236063\n ],\n [\n 83.257602,\n 47.173057\n ],\n [\n 83.370318,\n 47.178751\n ],\n [\n 83.418978,\n 47.118934\n ],\n [\n 83.463325,\n 47.131961\n ],\n [\n 83.576042,\n 47.059049\n ],\n [\n 83.766367,\n 47.026838\n ],\n [\n 83.932671,\n 46.970117\n ],\n [\n 84.002888,\n 46.990527\n ],\n [\n 84.086656,\n 46.965217\n ],\n [\n 84.195061,\n 47.003586\n ],\n [\n 84.37122,\n 46.993384\n ],\n [\n 84.425422,\n 47.00889\n ],\n [\n 84.506726,\n 46.972975\n ],\n [\n 84.748175,\n 47.009706\n ],\n [\n 84.849189,\n 46.95705\n ],\n [\n 84.934188,\n 46.863857\n ],\n [\n 84.987159,\n 46.918239\n ],\n [\n 85.082014,\n 46.939895\n ],\n [\n 85.276651,\n 47.068831\n ],\n [\n 85.325926,\n 47.044781\n ],\n [\n 85.545816,\n 47.057826\n ],\n [\n 85.582772,\n 47.14295\n ],\n [\n 85.682555,\n 47.222655\n ],\n [\n 85.675163,\n 47.318063\n ],\n [\n 85.701649,\n 47.384138\n ],\n [\n 85.614801,\n 47.497853\n ],\n [\n 85.617881,\n 47.550781\n ],\n [\n 85.547048,\n 48.00833\n ],\n [\n 85.529186,\n 48.02714\n ],\n [\n 85.587084,\n 48.191738\n ],\n [\n 85.678243,\n 48.266272\n ],\n [\n 85.695489,\n 48.335129\n ],\n [\n 85.791576,\n 48.418986\n ],\n [\n 85.916612,\n 48.438043\n ],\n [\n 86.225813,\n 48.432485\n ],\n [\n 86.305269,\n 48.491999\n ],\n [\n 86.416138,\n 48.481688\n ],\n [\n 86.579978,\n 48.538768\n ],\n [\n 86.640956,\n 48.629012\n ],\n [\n 86.780774,\n 48.73133\n ],\n [\n 86.754289,\n 48.78458\n ],\n [\n 86.822042,\n 48.849193\n ],\n [\n 86.757985,\n 48.894844\n ],\n [\n 86.732731,\n 48.995444\n ],\n [\n 86.836209,\n 49.051159\n ],\n [\n 86.88918,\n 49.132656\n ],\n [\n 87.088128,\n 49.13383\n ],\n [\n 87.112766,\n 49.155748\n ],\n [\n 87.239033,\n 49.114644\n ],\n [\n 87.388707,\n 49.098193\n ],\n [\n 87.43675,\n 49.075073\n ],\n [\n 87.511894,\n 49.101718\n ],\n [\n 87.49896,\n 49.141268\n ],\n [\n 87.821096,\n 49.173745\n ],\n [\n 87.867291,\n 49.108769\n ],\n [\n 87.833415,\n 49.050374\n ],\n [\n 87.911639,\n 48.980132\n ],\n [\n 87.87653,\n 48.949099\n ],\n [\n 87.763198,\n 48.926697\n ],\n [\n 87.742256,\n 48.881074\n ],\n [\n 87.93874,\n 48.757765\n ],\n [\n 88.029283,\n 48.75027\n ],\n [\n 88.089645,\n 48.695009\n ],\n [\n 88.027436,\n 48.62743\n ],\n [\n 87.96153,\n 48.599344\n ],\n [\n 88.041602,\n 48.548275\n ],\n [\n 88.10874,\n 48.545898\n ],\n [\n 88.196819,\n 48.493982\n ],\n [\n 88.363123,\n 48.460267\n ],\n [\n 88.443811,\n 48.391579\n ],\n [\n 88.503557,\n 48.413029\n ],\n [\n 88.605803,\n 48.337914\n ],\n [\n 88.575006,\n 48.277423\n ],\n [\n 88.663085,\n 48.172189\n ],\n [\n 88.79736,\n 48.133869\n ],\n [\n 88.824461,\n 48.106708\n ],\n [\n 88.939026,\n 48.115497\n ],\n [\n 89.078228,\n 47.98711\n ],\n [\n 89.231597,\n 47.980301\n ],\n [\n 89.38127,\n 48.046344\n ],\n [\n 89.569132,\n 48.037943\n ],\n [\n 89.651052,\n 47.913774\n ],\n [\n 89.735435,\n 47.897329\n ],\n [\n 89.761921,\n 47.835916\n ],\n [\n 89.957789,\n 47.842743\n ],\n [\n 89.960253,\n 47.885694\n ],\n [\n 90.086521,\n 47.865628\n ],\n [\n 90.07605,\n 47.777646\n ],\n [\n 90.13518,\n 47.723337\n ],\n [\n 90.331665,\n 47.68146\n ],\n [\n 90.398186,\n 47.547551\n ],\n [\n 90.468403,\n 47.497853\n ],\n [\n 90.468403,\n 47.404795\n ],\n [\n 90.526301,\n 47.378871\n ],\n [\n 90.488113,\n 47.317252\n ],\n [\n 90.56141,\n 47.207212\n ],\n [\n 90.767134,\n 46.992568\n ],\n [\n 90.901408,\n 46.960725\n ],\n [\n 90.958075,\n 46.8794\n ],\n [\n 90.942676,\n 46.825797\n ],\n [\n 91.054161,\n 46.71761\n ],\n [\n 91.017821,\n 46.582483\n ],\n [\n 91.079415,\n 46.558626\n ],\n [\n 90.983328,\n 46.374823\n ],\n [\n 90.900177,\n 46.31204\n ],\n [\n 91.021517,\n 46.121185\n ],\n [\n 91.028292,\n 46.023224\n ],\n [\n 90.850285,\n 45.888035\n ],\n [\n 90.714779,\n 45.728714\n ],\n [\n 90.676591,\n 45.582339\n ],\n [\n 90.671047,\n 45.48762\n ],\n [\n 90.772677,\n 45.432223\n ],\n [\n 90.804706,\n 45.294756\n ],\n [\n 90.877387,\n 45.280865\n ],\n [\n 90.881698,\n 45.191964\n ],\n [\n 91.007966,\n 45.218522\n ],\n [\n 91.129922,\n 45.215993\n ],\n [\n 91.242023,\n 45.137544\n ],\n [\n 91.37753,\n 45.110947\n ],\n [\n 91.448978,\n 45.156533\n ],\n [\n 91.561695,\n 45.075466\n ],\n [\n 91.694738,\n 45.065325\n ],\n [\n 91.803144,\n 45.082649\n ],\n [\n 92.100026,\n 45.081381\n ],\n [\n 92.240461,\n 45.015859\n ],\n [\n 92.315605,\n 45.02897\n ],\n [\n 92.501003,\n 45.001054\n ],\n [\n 92.779407,\n 45.050532\n ],\n [\n 92.884117,\n 45.046727\n ],\n [\n 92.932776,\n 45.017551\n ],\n [\n 93.174225,\n 45.015436\n ],\n [\n 93.434767,\n 44.955343\n ],\n [\n 93.509296,\n 44.968044\n ],\n [\n 93.716251,\n 44.89434\n ],\n [\n 93.723642,\n 44.86551\n ],\n [\n 94.215162,\n 44.667978\n ],\n [\n 94.329727,\n 44.582811\n ],\n [\n 94.359292,\n 44.51544\n ],\n [\n 94.470777,\n 44.509466\n ],\n [\n 94.606283,\n 44.448418\n ],\n [\n 94.722696,\n 44.340681\n ],\n [\n 94.945666,\n 44.292734\n ],\n [\n 94.998637,\n 44.25332\n ],\n [\n 95.398381,\n 44.294447\n ],\n [\n 95.326932,\n 44.028756\n ],\n [\n 95.527113,\n 44.007243\n ],\n [\n 95.623199,\n 43.855567\n ],\n [\n 95.735916,\n 43.597437\n ],\n [\n 95.857872,\n 43.417779\n ],\n [\n 95.880046,\n 43.280289\n ],\n [\n 95.921314,\n 43.22974\n ],\n [\n 96.363558,\n 42.900586\n ],\n [\n 96.386348,\n 42.727655\n ],\n [\n 96.103632,\n 42.604026\n ],\n [\n 96.02356,\n 42.54234\n ],\n [\n 95.978596,\n 42.436892\n ],\n [\n 96.06606,\n 42.414367\n ],\n [\n 96.040806,\n 42.3264\n ],\n [\n 96.178161,\n 42.217929\n ],\n [\n 96.077147,\n 42.149652\n ],\n [\n 96.13874,\n 42.054207\n ],\n [\n 96.117183,\n 41.985753\n ],\n [\n 96.038342,\n 41.924794\n ],\n [\n 95.855408,\n 41.849516\n ],\n [\n 95.677402,\n 41.830795\n ],\n [\n 95.57146,\n 41.796011\n ],\n [\n 95.39407,\n 41.693333\n ],\n [\n 95.29552,\n 41.569456\n ],\n [\n 95.135991,\n 41.772811\n ],\n [\n 94.861898,\n 41.668309\n ],\n [\n 94.750413,\n 41.538114\n ],\n [\n 94.534219,\n 41.50586\n ],\n [\n 94.184365,\n 41.268392\n ],\n [\n 94.01067,\n 41.114857\n ],\n [\n 93.809874,\n 40.879583\n ],\n [\n 93.820961,\n 40.793574\n ],\n [\n 93.760599,\n 40.664804\n ],\n [\n 93.506216,\n 40.648464\n ],\n [\n 92.928465,\n 40.572609\n ],\n [\n 92.906907,\n 40.310773\n ],\n [\n 92.796654,\n 40.15364\n ],\n [\n 92.745531,\n 39.868137\n ],\n [\n 92.639589,\n 39.514543\n ],\n [\n 92.52564,\n 39.368528\n ],\n [\n 92.339011,\n 39.236575\n ],\n [\n 92.366728,\n 39.059322\n ],\n [\n 92.41046,\n 39.038412\n ],\n [\n 92.38459,\n 39.000758\n ],\n [\n 92.263866,\n 39.002153\n ],\n [\n 92.173323,\n 38.960758\n ],\n [\n 91.966368,\n 38.930976\n ],\n [\n 91.87952,\n 38.884417\n ],\n [\n 91.446515,\n 38.813588\n ],\n [\n 91.307928,\n 38.751089\n ],\n [\n 90.831191,\n 38.667982\n ],\n [\n 90.619308,\n 38.664245\n ],\n [\n 90.610685,\n 38.596003\n ],\n [\n 90.463476,\n 38.556711\n ],\n [\n 90.424671,\n 38.492114\n ],\n [\n 90.315034,\n 38.501948\n ],\n [\n 90.111774,\n 38.477595\n ],\n [\n 90.137644,\n 38.340692\n ],\n [\n 90.280542,\n 38.238315\n ],\n [\n 90.352607,\n 38.233615\n ],\n [\n 90.361846,\n 38.300322\n ],\n [\n 90.530613,\n 38.32004\n ],\n [\n 90.516446,\n 38.207291\n ],\n [\n 90.519526,\n 37.73089\n ],\n [\n 90.776373,\n 37.6504\n ],\n [\n 90.882314,\n 37.575513\n ],\n [\n 90.863836,\n 37.534246\n ],\n [\n 90.958075,\n 37.477763\n ],\n [\n 91.057241,\n 37.483936\n ],\n [\n 91.099741,\n 37.447843\n ],\n [\n 91.134849,\n 37.32614\n ],\n [\n 91.192132,\n 37.27807\n ],\n [\n 91.1909,\n 37.205669\n ],\n [\n 91.280211,\n 37.163721\n ],\n [\n 91.303617,\n 37.01242\n ],\n [\n 91.181045,\n 37.025318\n ],\n [\n 90.983944,\n 36.913458\n ],\n [\n 90.853981,\n 36.915371\n ],\n [\n 90.735105,\n 36.827778\n ],\n [\n 90.720938,\n 36.708912\n ],\n [\n 90.7388,\n 36.58746\n ],\n [\n 91.035683,\n 36.529788\n ],\n [\n 91.05293,\n 36.432608\n ],\n [\n 91.026444,\n 36.323738\n ],\n [\n 91.07264,\n 36.299149\n ],\n [\n 91.124994,\n 36.115693\n ],\n [\n 91.09235,\n 36.088621\n ],\n [\n 90.979017,\n 36.106992\n ],\n [\n 90.922966,\n 36.029126\n ],\n [\n 90.841046,\n 36.01848\n ],\n [\n 90.776373,\n 36.086203\n ],\n [\n 90.66304,\n 36.134058\n ],\n [\n 90.526917,\n 36.148553\n ],\n [\n 90.430215,\n 36.133091\n ],\n [\n 90.234962,\n 36.161597\n ],\n [\n 90.128405,\n 36.208923\n ],\n [\n 90.145651,\n 36.238849\n ],\n [\n 90.028006,\n 36.25815\n ],\n [\n 89.999057,\n 36.169809\n ],\n [\n 89.937463,\n 36.130675\n ],\n [\n 89.941159,\n 36.067343\n ],\n [\n 89.711414,\n 36.092972\n ],\n [\n 89.490291,\n 36.150969\n ],\n [\n 89.375727,\n 36.228231\n ],\n [\n 89.287647,\n 36.235954\n ],\n [\n 89.232213,\n 36.295774\n ],\n [\n 89.127503,\n 36.249465\n ],\n [\n 89.10225,\n 36.281305\n ],\n [\n 88.964279,\n 36.318917\n ],\n [\n 88.926091,\n 36.364221\n ],\n [\n 88.802903,\n 36.337717\n ],\n [\n 88.783809,\n 36.291916\n ],\n [\n 88.623665,\n 36.389271\n ],\n [\n 88.573158,\n 36.461005\n ],\n [\n 88.470912,\n 36.482175\n ],\n [\n 88.365586,\n 36.457636\n ],\n [\n 88.241782,\n 36.468704\n ],\n [\n 88.134609,\n 36.427313\n ],\n [\n 87.983088,\n 36.437903\n ],\n [\n 87.949211,\n 36.401312\n ],\n [\n 87.731785,\n 36.384936\n ],\n [\n 87.570409,\n 36.342536\n ],\n [\n 87.470626,\n 36.354102\n ],\n [\n 87.460155,\n 36.409498\n ],\n [\n 87.361605,\n 36.419128\n ],\n [\n 87.306787,\n 36.363739\n ],\n [\n 87.193454,\n 36.349283\n ],\n [\n 87.149106,\n 36.29722\n ],\n [\n 86.996353,\n 36.308793\n ],\n [\n 86.887332,\n 36.262492\n ],\n [\n 86.862078,\n 36.300114\n ],\n [\n 86.746282,\n 36.291916\n ],\n [\n 86.701318,\n 36.245122\n ],\n [\n 86.515305,\n 36.205543\n ],\n [\n 86.392733,\n 36.206992\n ],\n [\n 86.187625,\n 36.131158\n ],\n [\n 86.199944,\n 36.032513\n ],\n [\n 86.132806,\n 35.979271\n ],\n [\n 86.060125,\n 35.846008\n ],\n [\n 85.949256,\n 35.779049\n ],\n [\n 85.811286,\n 35.779049\n ],\n [\n 85.65299,\n 35.731465\n ],\n [\n 85.613569,\n 35.652257\n ],\n [\n 85.372121,\n 35.701346\n ],\n [\n 85.271107,\n 35.788757\n ],\n [\n 85.159006,\n 35.745549\n ],\n [\n 85.053065,\n 35.751862\n ],\n [\n 84.729081,\n 35.613353\n ],\n [\n 84.448828,\n 35.55058\n ],\n [\n 84.45314,\n 35.473141\n ],\n [\n 84.335495,\n 35.414647\n ],\n [\n 84.1618,\n 35.359039\n ],\n [\n 84.095895,\n 35.362943\n ],\n [\n 84.005968,\n 35.422449\n ],\n [\n 83.885244,\n 35.367334\n ],\n [\n 83.677672,\n 35.360991\n ],\n [\n 83.622238,\n 35.335614\n ],\n [\n 83.451006,\n 35.38197\n ],\n [\n 83.242203,\n 35.420011\n ],\n [\n 83.127022,\n 35.398554\n ],\n [\n 83.067892,\n 35.462908\n ],\n [\n 82.998907,\n 35.484348\n ],\n [\n 82.960719,\n 35.671702\n ],\n [\n 82.788872,\n 35.684824\n ],\n [\n 82.731589,\n 35.63767\n ],\n [\n 82.628727,\n 35.692114\n ],\n [\n 82.424852,\n 35.713006\n ],\n [\n 82.336156,\n 35.651284\n ],\n [\n 82.328149,\n 35.559342\n ],\n [\n 82.033114,\n 35.450236\n ],\n [\n 82.05344,\n 35.350255\n ],\n [\n 81.927789,\n 35.271158\n ],\n [\n 81.736847,\n 35.262365\n ],\n [\n 81.675253,\n 35.233536\n ],\n [\n 81.513261,\n 35.235002\n ],\n [\n 81.494167,\n 35.292161\n ],\n [\n 81.362356,\n 35.354647\n ],\n [\n 81.219458,\n 35.319016\n ],\n [\n 81.09935,\n 35.407333\n ],\n [\n 81.031597,\n 35.380506\n ],\n [\n 81.026053,\n 35.312181\n ],\n [\n 80.844351,\n 35.345375\n ],\n [\n 80.689135,\n 35.33903\n ],\n [\n 80.65649,\n 35.394165\n ],\n [\n 80.516672,\n 35.392214\n ],\n [\n 80.412578,\n 35.433663\n ],\n [\n 80.321419,\n 35.386848\n ],\n [\n 80.268448,\n 35.294114\n ],\n [\n 80.362687,\n 35.209096\n ],\n [\n 80.257977,\n 35.20323\n ],\n [\n 80.23026,\n 35.147476\n ],\n [\n 80.118159,\n 35.066222\n ],\n [\n 80.031311,\n 35.034384\n ],\n [\n 80.034391,\n 34.902\n ],\n [\n 79.947544,\n 34.820993\n ],\n [\n 79.906892,\n 34.683837\n ],\n [\n 79.801566,\n 34.478909\n ],\n [\n 79.675914,\n 34.451284\n ],\n [\n 79.504683,\n 34.454737\n ],\n [\n 79.229358,\n 34.413778\n ],\n [\n 79.161605,\n 34.441416\n ],\n [\n 79.0107,\n 34.399956\n ],\n [\n 79.039649,\n 34.33427\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 710000,\n \"name\": \"台湾省\",\n \"center\": [\n 121.509062,\n 25.044332\n ],\n \"centroid\": [\n 120.971486,\n 23.749452\n ],\n \"childrenNum\": 0,\n \"level\": \"province\",\n \"subFeatureIndex\": 31,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 120.443706,\n 22.441042\n ],\n [\n 120.297112,\n 22.531154\n ],\n [\n 120.20041,\n 22.721137\n ],\n [\n 120.131425,\n 23.002313\n ],\n [\n 120.018708,\n 23.073342\n ],\n [\n 120.108019,\n 23.34115\n ],\n [\n 120.12157,\n 23.504758\n ],\n [\n 120.095084,\n 23.587583\n ],\n [\n 120.102476,\n 23.70104\n ],\n [\n 120.175156,\n 23.807282\n ],\n [\n 120.245989,\n 23.84067\n ],\n [\n 120.278018,\n 23.927657\n ],\n [\n 120.68885,\n 24.600764\n ],\n [\n 120.82374,\n 24.68832\n ],\n [\n 120.89211,\n 24.767665\n ],\n [\n 120.914899,\n 24.864876\n ],\n [\n 121.024537,\n 25.040639\n ],\n [\n 121.209318,\n 25.127342\n ],\n [\n 121.371926,\n 25.15984\n ],\n [\n 121.444607,\n 25.27081\n ],\n [\n 121.53515,\n 25.307597\n ],\n [\n 121.62323,\n 25.294614\n ],\n [\n 121.745186,\n 25.162007\n ],\n [\n 121.917033,\n 25.137634\n ],\n [\n 121.947214,\n 25.031965\n ],\n [\n 122.012503,\n 25.001602\n ],\n [\n 121.844968,\n 24.836101\n ],\n [\n 121.841272,\n 24.733977\n ],\n [\n 121.892395,\n 24.618171\n ],\n [\n 121.88562,\n 24.529477\n ],\n [\n 121.809243,\n 24.338818\n ],\n [\n 121.643556,\n 24.097633\n ],\n [\n 121.65957,\n 24.006934\n ],\n [\n 121.621382,\n 23.920547\n ],\n [\n 121.522832,\n 23.538772\n ],\n [\n 121.479716,\n 23.32247\n ],\n [\n 121.415042,\n 23.196039\n ],\n [\n 121.430441,\n 23.137181\n ],\n [\n 121.370695,\n 23.084351\n ],\n [\n 121.324499,\n 22.945574\n ],\n [\n 121.170514,\n 22.723345\n ],\n [\n 121.03316,\n 22.650477\n ],\n [\n 120.914899,\n 22.302718\n ],\n [\n 120.907508,\n 22.033426\n ],\n [\n 120.86624,\n 21.98461\n ],\n [\n 120.873016,\n 21.897477\n ],\n [\n 120.701784,\n 21.926898\n ],\n [\n 120.651277,\n 22.033426\n ],\n [\n 120.640806,\n 22.241259\n ],\n [\n 120.569973,\n 22.361938\n ],\n [\n 120.443706,\n 22.441042\n ]\n ]\n ],\n [\n [\n [\n 119.646064,\n 23.55084\n ],\n [\n 119.609108,\n 23.503661\n ],\n [\n 119.566608,\n 23.584842\n ],\n [\n 119.678093,\n 23.600195\n ],\n [\n 119.646064,\n 23.55084\n ]\n ]\n ],\n [\n [\n [\n 123.491374,\n 25.747089\n ],\n [\n 123.496917,\n 25.739005\n ],\n [\n 123.495069,\n 25.737927\n ],\n [\n 123.494453,\n 25.737927\n ],\n [\n 123.492606,\n 25.737388\n ],\n [\n 123.480903,\n 25.737927\n ],\n [\n 123.480287,\n 25.737388\n ],\n [\n 123.46612,\n 25.732537\n ],\n [\n 123.465504,\n 25.732537\n ],\n [\n 123.491374,\n 25.747089\n ]\n ]\n ],\n [\n [\n [\n 123.549272,\n 25.724991\n ],\n [\n 123.549272,\n 25.724991\n ],\n [\n 123.546192,\n 25.729303\n ],\n [\n 123.546192,\n 25.728764\n ],\n [\n 123.549272,\n 25.724991\n ]\n ]\n ],\n [\n [\n [\n 123.690322,\n 25.923187\n ],\n [\n 123.691554,\n 25.921572\n ],\n [\n 123.690938,\n 25.917267\n ],\n [\n 123.690938,\n 25.916729\n ],\n [\n 123.690322,\n 25.923187\n ]\n ]\n ],\n [\n [\n [\n 123.559743,\n 25.718523\n ],\n [\n 123.559743,\n 25.717984\n ],\n [\n 123.548656,\n 25.720679\n ],\n [\n 123.549272,\n 25.720679\n ],\n [\n 123.559743,\n 25.718523\n ]\n ]\n ],\n [\n [\n [\n 121.510513,\n 22.087215\n ],\n [\n 121.573339,\n 22.086106\n ],\n [\n 121.594281,\n 21.995152\n ],\n [\n 121.510513,\n 22.087215\n ]\n ]\n ],\n [\n [\n [\n 123.559743,\n 25.718523\n ],\n [\n 123.560359,\n 25.718523\n ],\n [\n 123.560359,\n 25.717984\n ],\n [\n 123.559743,\n 25.717984\n ],\n [\n 123.559743,\n 25.718523\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 810000,\n \"name\": \"香港特别行政区\",\n \"center\": [\n 114.173355,\n 22.320048\n ],\n \"centroid\": [\n 114.134394,\n 22.377371\n ],\n \"childrenNum\": 18,\n \"level\": \"province\",\n \"subFeatureIndex\": 32,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 114.031778,\n 22.504071\n ],\n [\n 114.044096,\n 22.502413\n ],\n [\n 114.045944,\n 22.502413\n ],\n [\n 114.185762,\n 22.551601\n ],\n [\n 114.185762,\n 22.551601\n ],\n [\n 114.232574,\n 22.539997\n ],\n [\n 114.232574,\n 22.528944\n ],\n [\n 114.263371,\n 22.541654\n ],\n [\n 114.263987,\n 22.541654\n ],\n [\n 114.271994,\n 22.535023\n ],\n [\n 114.28924,\n 22.522864\n ],\n [\n 114.355762,\n 22.434958\n ],\n [\n 114.406269,\n 22.433299\n ],\n [\n 114.406269,\n 22.432746\n ],\n [\n 114.356994,\n 22.340356\n ],\n [\n 114.323733,\n 22.384622\n ],\n [\n 114.315726,\n 22.299951\n ],\n [\n 114.315726,\n 22.298843\n ],\n [\n 114.248588,\n 22.274484\n ],\n [\n 114.265835,\n 22.200825\n ],\n [\n 114.195002,\n 22.232951\n ],\n [\n 114.120473,\n 22.272269\n ],\n [\n 114.121089,\n 22.320985\n ],\n [\n 114.034857,\n 22.301058\n ],\n [\n 114.026234,\n 22.229628\n ],\n [\n 113.848844,\n 22.191961\n ],\n [\n 113.898119,\n 22.308808\n ],\n [\n 114.015763,\n 22.332054\n ],\n [\n 113.920293,\n 22.368024\n ],\n [\n 113.918445,\n 22.418366\n ],\n [\n 114.031778,\n 22.504071\n ]\n ]\n ],\n [\n [\n [\n 114.350834,\n 22.260087\n ],\n [\n 114.355146,\n 22.268393\n ],\n [\n 114.355762,\n 22.268393\n ],\n [\n 114.350834,\n 22.260087\n ]\n ]\n ],\n [\n [\n [\n 114.320037,\n 22.381303\n ],\n [\n 114.320037,\n 22.381856\n ],\n [\n 114.319421,\n 22.382409\n ],\n [\n 114.323733,\n 22.384622\n ],\n [\n 114.320037,\n 22.381303\n ]\n ]\n ],\n [\n [\n [\n 114.372392,\n 22.322645\n ],\n [\n 114.372392,\n 22.323752\n ],\n [\n 114.37424,\n 22.323199\n ],\n [\n 114.372392,\n 22.322645\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 820000,\n \"name\": \"澳门特别行政区\",\n \"center\": [\n 113.54909,\n 22.198951\n ],\n \"centroid\": [\n 113.56642,\n 22.159262\n ],\n \"childrenNum\": 8,\n \"level\": \"province\",\n \"subFeatureIndex\": 33,\n \"acroutes\": [\n 100000\n ],\n \"parent\": {\n \"adcode\": 100000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 113.558736,\n 22.213012\n ],\n [\n 113.6037,\n 22.132116\n ],\n [\n 113.553809,\n 22.107727\n ],\n [\n 113.558736,\n 22.213012\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 100000,\n \"name\": \"\",\n \"adchar\": \"JD\"\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 122.51865306,\n 23.46078502\n ],\n [\n 122.51742454,\n 23.45790762\n ],\n [\n 122.51536697,\n 23.45555069\n ],\n [\n 122.51268178,\n 23.45394494\n ],\n [\n 122.50963181,\n 23.45324755\n ],\n [\n 122.5065156,\n 23.45352678\n ],\n [\n 122.5036382,\n 23.45475531\n ],\n [\n 122.50128127,\n 23.45681287\n ],\n [\n 122.49967552,\n 23.45949807\n ],\n [\n 122.49897813,\n 23.46254804\n ],\n [\n 122.49925737,\n 23.46566424\n ],\n [\n 122.77921829,\n 24.57855302\n ],\n [\n 122.78044682,\n 24.58143041\n ],\n [\n 122.78250438,\n 24.58378734\n ],\n [\n 122.78518957,\n 24.5853931\n ],\n [\n 122.78823955,\n 24.58609049\n ],\n [\n 122.79135575,\n 24.58581125\n ],\n [\n 122.79423315,\n 24.58458272\n ],\n [\n 122.79659008,\n 24.58252516\n ],\n [\n 122.79819583,\n 24.57983997\n ],\n [\n 122.79889322,\n 24.57678999\n ],\n [\n 122.79861399,\n 24.57367379\n ],\n [\n 122.51865306,\n 23.46078502\n ]\n ]\n ],\n [\n [\n [\n 121.17202617,\n 20.8054593\n ],\n [\n 121.16966862,\n 20.80340244\n ],\n [\n 121.16679085,\n 20.80217478\n ],\n [\n 121.16367457,\n 20.80189649\n ],\n [\n 121.1606248,\n 20.8025948\n ],\n [\n 121.1579401,\n 20.80420136\n ],\n [\n 121.15588324,\n 20.80655891\n ],\n [\n 121.15465558,\n 20.80943668\n ],\n [\n 121.15437729,\n 20.81255297\n ],\n [\n 121.1550756,\n 20.81560273\n ],\n [\n 121.15668216,\n 20.81828744\n ],\n [\n 121.89404403,\n 21.70026162\n ],\n [\n 121.89640158,\n 21.70231847\n ],\n [\n 121.89927934,\n 21.70354613\n ],\n [\n 121.90239563,\n 21.70382443\n ],\n [\n 121.9054454,\n 21.70312611\n ],\n [\n 121.9081301,\n 21.70151955\n ],\n [\n 121.91018696,\n 21.699162\n ],\n [\n 121.91141462,\n 21.69628423\n ],\n [\n 121.91169291,\n 21.69316794\n ],\n [\n 121.9109946,\n 21.69011818\n ],\n [\n 121.90938804,\n 21.68743347\n ],\n [\n 121.17202617,\n 20.8054593\n ]\n ]\n ],\n [\n [\n [\n 119.47366172,\n 18.00707291\n ],\n [\n 119.47175735,\n 18.00459056\n ],\n [\n 119.46917909,\n 18.0028182\n ],\n [\n 119.46617933,\n 18.0019293\n ],\n [\n 119.4630517,\n 18.00201089\n ],\n [\n 119.46010237,\n 18.00305497\n ],\n [\n 119.45762002,\n 18.00495935\n ],\n [\n 119.45584765,\n 18.00753761\n ],\n [\n 119.45495876,\n 18.01053737\n ],\n [\n 119.45504035,\n 18.01366499\n ],\n [\n 119.45608443,\n 18.01661433\n ],\n [\n 120.00812005,\n 19.0335793\n ],\n [\n 120.01002443,\n 19.03606165\n ],\n [\n 120.01260269,\n 19.03783401\n ],\n [\n 120.01560245,\n 19.03872291\n ],\n [\n 120.01873007,\n 19.03864132\n ],\n [\n 120.02167941,\n 19.03759723\n ],\n [\n 120.02416175,\n 19.03569286\n ],\n [\n 120.02593412,\n 19.0331146\n ],\n [\n 120.02682302,\n 19.03011484\n ],\n [\n 120.02674143,\n 19.02698721\n ],\n [\n 120.02569734,\n 19.02403788\n ],\n [\n 119.47366172,\n 18.00707291\n ]\n ]\n ],\n [\n [\n [\n 119.0726757,\n 15.04098494\n ],\n [\n 119.0726746,\n 15.04083704\n ],\n [\n 119.07218171,\n 15.00751424\n ],\n [\n 119.07164663,\n 15.00443165\n ],\n [\n 119.07018516,\n 15.00166528\n ],\n [\n 119.06794036,\n 14.99948592\n ],\n [\n 119.06513198,\n 14.99810691\n ],\n [\n 119.06203491,\n 14.99766324\n ],\n [\n 119.05895232,\n 14.99819832\n ],\n [\n 119.05618595,\n 14.99965979\n ],\n [\n 119.05400659,\n 15.00190458\n ],\n [\n 119.05262758,\n 15.00471297\n ],\n [\n 119.0521839,\n 15.00781004\n ],\n [\n 119.0526757,\n 15.04105889\n ],\n [\n 119.0526757,\n 16.04388528\n ],\n [\n 119.05316513,\n 16.04697545\n ],\n [\n 119.05458553,\n 16.04976313\n ],\n [\n 119.05679784,\n 16.05197545\n ],\n [\n 119.05958553,\n 16.05339584\n ],\n [\n 119.0626757,\n 16.05388528\n ],\n [\n 119.06576587,\n 16.05339584\n ],\n [\n 119.06855355,\n 16.05197545\n ],\n [\n 119.07076587,\n 16.04976313\n ],\n [\n 119.07218626,\n 16.04697545\n ],\n [\n 119.0726757,\n 16.04388528\n ],\n [\n 119.0726757,\n 15.04098494\n ]\n ]\n ],\n [\n [\n [\n 118.68646749,\n 11.18959191\n ],\n [\n 118.85557939,\n 11.6136711\n ],\n [\n 118.9698053,\n 11.99151854\n ],\n [\n 118.97116801,\n 11.99433487\n ],\n [\n 118.97333431,\n 11.99659227\n ],\n [\n 118.97609216,\n 11.99806975\n ],\n [\n 118.9791716,\n 11.99862269\n ],\n [\n 118.98227119,\n 11.99819697\n ],\n [\n 118.98508753,\n 11.99683427\n ],\n [\n 118.98734492,\n 11.99466796\n ],\n [\n 118.9888224,\n 11.99191011\n ],\n [\n 118.98937534,\n 11.98883067\n ],\n [\n 118.98894963,\n 11.98573108\n ],\n [\n 118.87459939,\n 11.60747236\n ],\n [\n 118.87431591,\n 11.606662\n ],\n [\n 118.70476212,\n 11.18147468\n ],\n [\n 118.70409227,\n 11.18010771\n ],\n [\n 118.54242469,\n 10.9053354\n ],\n [\n 118.54043581,\n 10.90292022\n ],\n [\n 118.53779795,\n 10.90123786\n ],\n [\n 118.53476931,\n 10.90045298\n ],\n [\n 118.53164636,\n 10.90064241\n ],\n [\n 118.5287348,\n 10.90178762\n ],\n [\n 118.52631962,\n 10.9037765\n ],\n [\n 118.52463726,\n 10.90641436\n ],\n [\n 118.52385237,\n 10.909443\n ],\n [\n 118.52404181,\n 10.91256595\n ],\n [\n 118.52518702,\n 10.91547751\n ],\n [\n 118.68646749,\n 11.18959191\n ]\n ]\n ],\n [\n [\n [\n 115.54466883,\n 7.14672265\n ],\n [\n 115.54229721,\n 7.14468204\n ],\n [\n 115.53941108,\n 7.14347417\n ],\n [\n 115.53629295,\n 7.14321728\n ],\n [\n 115.53324806,\n 7.14393652\n ],\n [\n 115.53057445,\n 7.14556148\n ],\n [\n 115.52853383,\n 7.1479331\n ],\n [\n 115.52732596,\n 7.15081924\n ],\n [\n 115.52706908,\n 7.15393736\n ],\n [\n 115.52778832,\n 7.15698226\n ],\n [\n 115.52941328,\n 7.15965587\n ],\n [\n 116.23523025,\n 7.99221221\n ],\n [\n 116.23760187,\n 7.99425282\n ],\n [\n 116.240488,\n 7.99546069\n ],\n [\n 116.24360613,\n 7.99571758\n ],\n [\n 116.24665102,\n 7.99499834\n ],\n [\n 116.24932463,\n 7.99337338\n ],\n [\n 116.25136525,\n 7.99100176\n ],\n [\n 116.25257312,\n 7.98811563\n ],\n [\n 116.25283001,\n 7.9849975\n ],\n [\n 116.25211077,\n 7.98195261\n ],\n [\n 116.2504858,\n 7.979279\n ],\n [\n 115.54466883,\n 7.14672265\n ]\n ]\n ],\n [\n [\n [\n 112.30705249,\n 3.53487257\n ],\n [\n 112.51501594,\n 3.59753306\n ],\n [\n 112.84361424,\n 3.7506962\n ],\n [\n 112.84662187,\n 3.75155809\n ],\n [\n 112.84974864,\n 3.7514484\n ],\n [\n 112.85268847,\n 3.75037785\n ],\n [\n 112.8551536,\n 3.74845124\n ],\n [\n 112.85690272,\n 3.74585715\n ],\n [\n 112.85776462,\n 3.74284952\n ],\n [\n 112.85765492,\n 3.73972276\n ],\n [\n 112.85658437,\n 3.73678292\n ],\n [\n 112.85465776,\n 3.7343178\n ],\n [\n 112.85206367,\n 3.73256867\n ],\n [\n 112.52281386,\n 3.57910186\n ],\n [\n 112.52147408,\n 3.5785908\n ],\n [\n 112.31248917,\n 3.51562254\n ],\n [\n 112.31181658,\n 3.51544515\n ],\n [\n 111.79132585,\n 3.39736822\n ],\n [\n 111.78820398,\n 3.39716187\n ],\n [\n 111.78517113,\n 3.39793033\n ],\n [\n 111.78252419,\n 3.39959839\n ],\n [\n 111.78052226,\n 3.40200275\n ],\n [\n 111.77936129,\n 3.40490807\n ],\n [\n 111.77915495,\n 3.40802995\n ],\n [\n 111.77992341,\n 3.41106279\n ],\n [\n 111.78159146,\n 3.41370973\n ],\n [\n 111.78399583,\n 3.41571167\n ],\n [\n 111.78690114,\n 3.41687263\n ],\n [\n 112.30705249,\n 3.53487257\n ]\n ]\n ],\n [\n [\n [\n 108.26055972,\n 6.08912451\n ],\n [\n 108.26004031,\n 6.09098419\n ],\n [\n 108.23638164,\n 6.22427602\n ],\n [\n 108.23630689,\n 6.22476797\n ],\n [\n 108.19687578,\n 6.53630242\n ],\n [\n 108.19679674,\n 6.53760583\n ],\n [\n 108.1987683,\n 6.95072469\n ],\n [\n 108.19897125,\n 6.95268198\n ],\n [\n 108.22460147,\n 7.07791743\n ],\n [\n 108.22570055,\n 7.08084671\n ],\n [\n 108.22765103,\n 7.083293\n ],\n [\n 108.230262,\n 7.08501682\n ],\n [\n 108.23327786,\n 7.08584944\n ],\n [\n 108.23640341,\n 7.08570936\n ],\n [\n 108.2393327,\n 7.08461028\n ],\n [\n 108.24177899,\n 7.0826598\n ],\n [\n 108.24350281,\n 7.08004883\n ],\n [\n 108.24433543,\n 7.07703297\n ],\n [\n 108.24419535,\n 7.07390742\n ],\n [\n 108.21876335,\n 6.94964057\n ],\n [\n 108.21679964,\n 6.53816468\n ],\n [\n 108.25611734,\n 6.22752625\n ],\n [\n 108.279563,\n 6.09543449\n ],\n [\n 108.30878645,\n 6.01987736\n ],\n [\n 108.30944469,\n 6.0168187\n ],\n [\n 108.30912553,\n 6.01370633\n ],\n [\n 108.30786022,\n 6.01084492\n ],\n [\n 108.30577262,\n 6.00851455\n ],\n [\n 108.30306706,\n 6.00694335\n ],\n [\n 108.3000084,\n 6.00628511\n ],\n [\n 108.29689603,\n 6.00660426\n ],\n [\n 108.29403462,\n 6.00786957\n ],\n [\n 108.29170425,\n 6.00995718\n ],\n [\n 108.29013305,\n 6.01266273\n ],\n [\n 108.26055972,\n 6.08912451\n ]\n ]\n ],\n [\n [\n [\n 110.12822847,\n 11.36894451\n ],\n [\n 110.18898148,\n 11.48996382\n ],\n [\n 110.23982347,\n 11.61066468\n ],\n [\n 110.28485499,\n 11.78705054\n ],\n [\n 110.3083549,\n 11.94803461\n ],\n [\n 110.3142445,\n 12.14195265\n ],\n [\n 110.312278,\n 12.23998238\n ],\n [\n 110.31270536,\n 12.24308175\n ],\n [\n 110.31406956,\n 12.24589736\n ],\n [\n 110.31623706,\n 12.2481536\n ],\n [\n 110.3189957,\n 12.24962962\n ],\n [\n 110.32207543,\n 12.25018094\n ],\n [\n 110.32517479,\n 12.24975358\n ],\n [\n 110.3279904,\n 12.24838938\n ],\n [\n 110.33024665,\n 12.24622187\n ],\n [\n 110.33172267,\n 12.24346324\n ],\n [\n 110.33227398,\n 12.24038351\n ],\n [\n 110.33424553,\n 12.14210167\n ],\n [\n 110.33424294,\n 12.14159753\n ],\n [\n 110.32832827,\n 11.94685414\n ],\n [\n 110.32822801,\n 11.94571326\n ],\n [\n 110.30456934,\n 11.78364161\n ],\n [\n 110.30436343,\n 11.7826124\n ],\n [\n 110.25901765,\n 11.60499559\n ],\n [\n 110.25854422,\n 11.60358735\n ],\n [\n 110.20728377,\n 11.48189306\n ],\n [\n 110.20700505,\n 11.48128846\n ],\n [\n 110.14588682,\n 11.35954163\n ],\n [\n 110.14541497,\n 11.35870461\n ],\n [\n 110.07246741,\n 11.24270688\n ],\n [\n 110.07040803,\n 11.24035153\n ],\n [\n 110.0677216,\n 11.23874785\n ],\n [\n 110.06467109,\n 11.23805281\n ],\n [\n 110.0615551,\n 11.23833444\n ],\n [\n 110.05867865,\n 11.23956519\n ],\n [\n 110.05632331,\n 11.24162456\n ],\n [\n 110.05471962,\n 11.24431099\n ],\n [\n 110.05402458,\n 11.2473615\n ],\n [\n 110.05430621,\n 11.25047749\n ],\n [\n 110.05553696,\n 11.25335394\n ],\n [\n 110.12822847,\n 11.36894451\n ]\n ]\n ],\n [\n [\n [\n 109.82951587,\n 15.22896754\n ],\n [\n 109.77065019,\n 15.44468789\n ],\n [\n 109.67264555,\n 15.66561455\n ],\n [\n 109.57455994,\n 15.82609887\n ],\n [\n 109.51574449,\n 15.91095759\n ],\n [\n 109.29314007,\n 16.19491896\n ],\n [\n 109.29161878,\n 16.19765288\n ],\n [\n 109.29101677,\n 16.20072311\n ],\n [\n 109.29139298,\n 16.2038291\n ],\n [\n 109.29271057,\n 16.20666681\n ],\n [\n 109.29484059,\n 16.20895848\n ],\n [\n 109.29757451,\n 16.21047978\n ],\n [\n 109.30064474,\n 16.21108179\n ],\n [\n 109.30375073,\n 16.21070558\n ],\n [\n 109.30658844,\n 16.20938798\n ],\n [\n 109.30888011,\n 16.20725797\n ],\n [\n 109.53166592,\n 15.92306523\n ],\n [\n 109.53201478,\n 15.92259221\n ],\n [\n 109.59116145,\n 15.8372556\n ],\n [\n 109.59147511,\n 15.83677407\n ],\n [\n 109.6900529,\n 15.67548445\n ],\n [\n 109.69066131,\n 15.67432448\n ],\n [\n 109.7892391,\n 15.45210582\n ],\n [\n 109.78974541,\n 15.45068337\n ],\n [\n 109.84889209,\n 15.23393326\n ],\n [\n 109.84903675,\n 15.23333003\n ],\n [\n 109.8648092,\n 15.15722425\n ],\n [\n 109.86495704,\n 15.15409906\n ],\n [\n 109.86413191,\n 15.15108113\n ],\n [\n 109.86241457,\n 15.1484659\n ],\n [\n 109.85997314,\n 15.14650935\n ],\n [\n 109.85704658,\n 15.145403\n ],\n [\n 109.85392139,\n 15.14525516\n ],\n [\n 109.85090347,\n 15.14608029\n ],\n [\n 109.84828823,\n 15.14779763\n ],\n [\n 109.84633168,\n 15.15023907\n ],\n [\n 109.84522534,\n 15.15316562\n ],\n [\n 109.82951587,\n 15.22896754\n ]\n ]\n ]\n ]\n }\n }\n ]\n}', 'admin', '2020-05-19 16:42:27', 'admin', '2021-02-01 17:41:14', '0', NULL); +INSERT INTO `jimu_report_map` VALUES ('1235113459258056705', '内蒙古地图', '内蒙古地图', '{\n \"type\": \"FeatureCollection\",\n \"features\": [\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 150100,\n \"name\": \"呼和浩特市\",\n \"center\": [\n 111.670801,\n 40.818311\n ],\n \"centroid\": [\n 111.502117,\n 40.596287\n ],\n \"childrenNum\": 9,\n \"level\": \"city\",\n \"subFeatureIndex\": 0,\n \"acroutes\": [\n 100000,\n 150000\n ],\n \"parent\": {\n \"adcode\": 150000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 111.438183,\n 39.640433\n ],\n [\n 111.440784,\n 39.672526\n ],\n [\n 111.365058,\n 39.721166\n ],\n [\n 111.371417,\n 39.791775\n ],\n [\n 111.417083,\n 39.829778\n ],\n [\n 111.41506,\n 39.864772\n ],\n [\n 111.445409,\n 39.899045\n ],\n [\n 111.426332,\n 39.949983\n ],\n [\n 111.420263,\n 40.02211\n ],\n [\n 111.360433,\n 40.10187\n ],\n [\n 111.314188,\n 40.150557\n ],\n [\n 111.248289,\n 40.164561\n ],\n [\n 111.190483,\n 40.216525\n ],\n [\n 111.115624,\n 40.255866\n ],\n [\n 111.05406,\n 40.264605\n ],\n [\n 111.032961,\n 40.296931\n ],\n [\n 111.033828,\n 40.315271\n ],\n [\n 111.114757,\n 40.331161\n ],\n [\n 111.106664,\n 40.38073\n ],\n [\n 111.083253,\n 40.425729\n ],\n [\n 111.028337,\n 40.429914\n ],\n [\n 111.019955,\n 40.459198\n ],\n [\n 110.966195,\n 40.471221\n ],\n [\n 110.959547,\n 40.496133\n ],\n [\n 110.9081,\n 40.481675\n ],\n [\n 110.889024,\n 40.511633\n ],\n [\n 110.843068,\n 40.534962\n ],\n [\n 110.880064,\n 40.586468\n ],\n [\n 110.831217,\n 40.586816\n ],\n [\n 110.802025,\n 40.612207\n ],\n [\n 110.788441,\n 40.687625\n ],\n [\n 110.797112,\n 40.759662\n ],\n [\n 110.783527,\n 40.79383\n ],\n [\n 110.733814,\n 40.785853\n ],\n [\n 110.713004,\n 40.810301\n ],\n [\n 110.735548,\n 40.827461\n ],\n [\n 110.744797,\n 40.919079\n ],\n [\n 110.712137,\n 40.939326\n ],\n [\n 110.644792,\n 40.920118\n ],\n [\n 110.62774,\n 40.988272\n ],\n [\n 110.660978,\n 41.008497\n ],\n [\n 110.675719,\n 41.049965\n ],\n [\n 110.648261,\n 41.109874\n ],\n [\n 110.656065,\n 41.166109\n ],\n [\n 110.62774,\n 41.166109\n ],\n [\n 110.612999,\n 41.208856\n ],\n [\n 110.556927,\n 41.232458\n ],\n [\n 110.550857,\n 41.288415\n ],\n [\n 110.576003,\n 41.332974\n ],\n [\n 110.634098,\n 41.311816\n ],\n [\n 110.647105,\n 41.33263\n ],\n [\n 110.742196,\n 41.385408\n ],\n [\n 110.762139,\n 41.373893\n ],\n [\n 110.828905,\n 41.383002\n ],\n [\n 110.820523,\n 41.358938\n ],\n [\n 110.875728,\n 41.356875\n ],\n [\n 110.89596,\n 41.334006\n ],\n [\n 110.947697,\n 41.31801\n ],\n [\n 110.967351,\n 41.347935\n ],\n [\n 111.010706,\n 41.334866\n ],\n [\n 111.032094,\n 41.300461\n ],\n [\n 111.093947,\n 41.286694\n ],\n [\n 111.102618,\n 41.308203\n ],\n [\n 111.162447,\n 41.28394\n ],\n [\n 111.235283,\n 41.240553\n ],\n [\n 111.279794,\n 41.290308\n ],\n [\n 111.355231,\n 41.313193\n ],\n [\n 111.425465,\n 41.31887\n ],\n [\n 111.525181,\n 41.331426\n ],\n [\n 111.582409,\n 41.306655\n ],\n [\n 111.702646,\n 41.29461\n ],\n [\n 111.730104,\n 41.310956\n ],\n [\n 111.804096,\n 41.259668\n ],\n [\n 111.840514,\n 41.252091\n ],\n [\n 111.877221,\n 41.129027\n ],\n [\n 111.921732,\n 41.095895\n ],\n [\n 112.027517,\n 41.048583\n ],\n [\n 112.010175,\n 41.014719\n ],\n [\n 112.037055,\n 40.96389\n ],\n [\n 112.09515,\n 40.943305\n ],\n [\n 112.125788,\n 40.955933\n ],\n [\n 112.150933,\n 40.879088\n ],\n [\n 112.176079,\n 40.85276\n ],\n [\n 112.17868,\n 40.811514\n ],\n [\n 112.15209,\n 40.764519\n ],\n [\n 112.098619,\n 40.74526\n ],\n [\n 112.130412,\n 40.697697\n ],\n [\n 112.115672,\n 40.658788\n ],\n [\n 112.045148,\n 40.655139\n ],\n [\n 112.087925,\n 40.618813\n ],\n [\n 112.098619,\n 40.583859\n ],\n [\n 112.059022,\n 40.584381\n ],\n [\n 112.052374,\n 40.55985\n ],\n [\n 112.113648,\n 40.508672\n ],\n [\n 112.13706,\n 40.508324\n ],\n [\n 112.183305,\n 40.466168\n ],\n [\n 112.22348,\n 40.452575\n ],\n [\n 112.2177,\n 40.42817\n ],\n [\n 112.264523,\n 40.38736\n ],\n [\n 112.236198,\n 40.353856\n ],\n [\n 112.272616,\n 40.357172\n ],\n [\n 112.289379,\n 40.281032\n ],\n [\n 112.31019,\n 40.25639\n ],\n [\n 112.285622,\n 40.198158\n ],\n [\n 112.233018,\n 40.170336\n ],\n [\n 112.223191,\n 40.128845\n ],\n [\n 112.183594,\n 40.083998\n ],\n [\n 112.174923,\n 40.05122\n ],\n [\n 112.076363,\n 39.919425\n ],\n [\n 112.042547,\n 39.886216\n ],\n [\n 112.035032,\n 39.854398\n ],\n [\n 111.970578,\n 39.79635\n ],\n [\n 111.956416,\n 39.687686\n ],\n [\n 111.925489,\n 39.667414\n ],\n [\n 111.92838,\n 39.610266\n ],\n [\n 111.878955,\n 39.605855\n ],\n [\n 111.842537,\n 39.620147\n ],\n [\n 111.787621,\n 39.589618\n ],\n [\n 111.722589,\n 39.606031\n ],\n [\n 111.646574,\n 39.644313\n ],\n [\n 111.616515,\n 39.633378\n ],\n [\n 111.502059,\n 39.663182\n ],\n [\n 111.438183,\n 39.640433\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 150200,\n \"name\": \"包头市\",\n \"center\": [\n 109.840405,\n 40.658168\n ],\n \"centroid\": [\n 110.265618,\n 41.560878\n ],\n \"childrenNum\": 9,\n \"level\": \"city\",\n \"subFeatureIndex\": 1,\n \"acroutes\": [\n 100000,\n 150000\n ],\n \"parent\": {\n \"adcode\": 150000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 109.437509,\n 40.513722\n ],\n [\n 109.445602,\n 40.540184\n ],\n [\n 109.407739,\n 40.628027\n ],\n [\n 109.41641,\n 40.708463\n ],\n [\n 109.47913,\n 40.749945\n ],\n [\n 109.528554,\n 40.732592\n ],\n [\n 109.545607,\n 40.742831\n ],\n [\n 109.635496,\n 40.738666\n ],\n [\n 109.795908,\n 40.76157\n ],\n [\n 109.79822,\n 40.795911\n ],\n [\n 109.841575,\n 40.835606\n ],\n [\n 109.869322,\n 40.841324\n ],\n [\n 109.867299,\n 40.878049\n ],\n [\n 109.886953,\n 40.924271\n ],\n [\n 109.835216,\n 40.945727\n ],\n [\n 109.8251,\n 40.994496\n ],\n [\n 109.79822,\n 41.008151\n ],\n [\n 109.759779,\n 40.999509\n ],\n [\n 109.735211,\n 41.036318\n ],\n [\n 109.698794,\n 41.036663\n ],\n [\n 109.688099,\n 41.07725\n ],\n [\n 109.657462,\n 41.115914\n ],\n [\n 109.724806,\n 41.115224\n ],\n [\n 109.709488,\n 41.152486\n ],\n [\n 109.667578,\n 41.199723\n ],\n [\n 109.620466,\n 41.275506\n ],\n [\n 109.641565,\n 41.31801\n ],\n [\n 109.696192,\n 41.322998\n ],\n [\n 109.698794,\n 41.379393\n ],\n [\n 109.63116,\n 41.426637\n ],\n [\n 109.66411,\n 41.49907\n ],\n [\n 109.478263,\n 41.499584\n ],\n [\n 109.428838,\n 41.552055\n ],\n [\n 109.423636,\n 41.634448\n ],\n [\n 109.395022,\n 41.697926\n ],\n [\n 109.341551,\n 41.742546\n ],\n [\n 109.367853,\n 41.765784\n ],\n [\n 109.317272,\n 41.80865\n ],\n [\n 109.292127,\n 41.854557\n ],\n [\n 109.259177,\n 41.868374\n ],\n [\n 109.263513,\n 41.889521\n ],\n [\n 109.337216,\n 41.898727\n ],\n [\n 109.375079,\n 41.932985\n ],\n [\n 109.48809,\n 42.077312\n ],\n [\n 109.515548,\n 42.139333\n ],\n [\n 109.539248,\n 42.147315\n ],\n [\n 109.508611,\n 42.263702\n ],\n [\n 109.472482,\n 42.314363\n ],\n [\n 109.477396,\n 42.345181\n ],\n [\n 109.445313,\n 42.379198\n ],\n [\n 109.433463,\n 42.427737\n ],\n [\n 109.379414,\n 42.447345\n ],\n [\n 109.486934,\n 42.458668\n ],\n [\n 109.544162,\n 42.472354\n ],\n [\n 109.684053,\n 42.558961\n ],\n [\n 109.906029,\n 42.635844\n ],\n [\n 110.108351,\n 42.642752\n ],\n [\n 110.139566,\n 42.674755\n ],\n [\n 110.337552,\n 42.738039\n ],\n [\n 110.438135,\n 42.690414\n ],\n [\n 110.521954,\n 42.62607\n ],\n [\n 110.577159,\n 42.573637\n ],\n [\n 110.639012,\n 42.491779\n ],\n [\n 110.704911,\n 42.470833\n ],\n [\n 110.730057,\n 42.442613\n ],\n [\n 110.72312,\n 42.393916\n ],\n [\n 110.750867,\n 42.294883\n ],\n [\n 110.783238,\n 42.239967\n ],\n [\n 110.784683,\n 42.176347\n ],\n [\n 110.842201,\n 42.119969\n ],\n [\n 110.985849,\n 41.9352\n ],\n [\n 111.039609,\n 41.822818\n ],\n [\n 111.078917,\n 41.78611\n ],\n [\n 111.120827,\n 41.771421\n ],\n [\n 111.150886,\n 41.735026\n ],\n [\n 111.241353,\n 41.671242\n ],\n [\n 111.371128,\n 41.635646\n ],\n [\n 111.441362,\n 41.524282\n ],\n [\n 111.446565,\n 41.472646\n ],\n [\n 111.434136,\n 41.425264\n ],\n [\n 111.387313,\n 41.378705\n ],\n [\n 111.424887,\n 41.346903\n ],\n [\n 111.425465,\n 41.31887\n ],\n [\n 111.355231,\n 41.313193\n ],\n [\n 111.279794,\n 41.290308\n ],\n [\n 111.235283,\n 41.240553\n ],\n [\n 111.162447,\n 41.28394\n ],\n [\n 111.102618,\n 41.308203\n ],\n [\n 111.093947,\n 41.286694\n ],\n [\n 111.032094,\n 41.300461\n ],\n [\n 111.010706,\n 41.334866\n ],\n [\n 110.967351,\n 41.347935\n ],\n [\n 110.947697,\n 41.31801\n ],\n [\n 110.89596,\n 41.334006\n ],\n [\n 110.875728,\n 41.356875\n ],\n [\n 110.820523,\n 41.358938\n ],\n [\n 110.828905,\n 41.383002\n ],\n [\n 110.762139,\n 41.373893\n ],\n [\n 110.742196,\n 41.385408\n ],\n [\n 110.647105,\n 41.33263\n ],\n [\n 110.634098,\n 41.311816\n ],\n [\n 110.576003,\n 41.332974\n ],\n [\n 110.550857,\n 41.288415\n ],\n [\n 110.556927,\n 41.232458\n ],\n [\n 110.612999,\n 41.208856\n ],\n [\n 110.62774,\n 41.166109\n ],\n [\n 110.656065,\n 41.166109\n ],\n [\n 110.648261,\n 41.109874\n ],\n [\n 110.675719,\n 41.049965\n ],\n [\n 110.660978,\n 41.008497\n ],\n [\n 110.62774,\n 40.988272\n ],\n [\n 110.644792,\n 40.920118\n ],\n [\n 110.712137,\n 40.939326\n ],\n [\n 110.744797,\n 40.919079\n ],\n [\n 110.735548,\n 40.827461\n ],\n [\n 110.713004,\n 40.810301\n ],\n [\n 110.733814,\n 40.785853\n ],\n [\n 110.783527,\n 40.79383\n ],\n [\n 110.797112,\n 40.759662\n ],\n [\n 110.788441,\n 40.687625\n ],\n [\n 110.802025,\n 40.612207\n ],\n [\n 110.831217,\n 40.586816\n ],\n [\n 110.880064,\n 40.586468\n ],\n [\n 110.843068,\n 40.534962\n ],\n [\n 110.889024,\n 40.511633\n ],\n [\n 110.9081,\n 40.481675\n ],\n [\n 110.959547,\n 40.496133\n ],\n [\n 110.966195,\n 40.471221\n ],\n [\n 111.019955,\n 40.459198\n ],\n [\n 111.028337,\n 40.429914\n ],\n [\n 111.083253,\n 40.425729\n ],\n [\n 111.106664,\n 40.38073\n ],\n [\n 111.114757,\n 40.331161\n ],\n [\n 111.033828,\n 40.315271\n ],\n [\n 111.032961,\n 40.296931\n ],\n [\n 110.999144,\n 40.26111\n ],\n [\n 110.945963,\n 40.270373\n ],\n [\n 110.914458,\n 40.244678\n ],\n [\n 110.837287,\n 40.289943\n ],\n [\n 110.816477,\n 40.266178\n ],\n [\n 110.782371,\n 40.274042\n ],\n [\n 110.768787,\n 40.299726\n ],\n [\n 110.702021,\n 40.325399\n ],\n [\n 110.636699,\n 40.308634\n ],\n [\n 110.570222,\n 40.340589\n ],\n [\n 110.510971,\n 40.389279\n ],\n [\n 110.488137,\n 40.369563\n ],\n [\n 110.472241,\n 40.404978\n ],\n [\n 110.45172,\n 40.391896\n ],\n [\n 110.369057,\n 40.444383\n ],\n [\n 110.357495,\n 40.462509\n ],\n [\n 110.319054,\n 40.445777\n ],\n [\n 110.296799,\n 40.492823\n ],\n [\n 110.249398,\n 40.475054\n ],\n [\n 110.247953,\n 40.521209\n ],\n [\n 110.18321,\n 40.554282\n ],\n [\n 110.164712,\n 40.513722\n ],\n [\n 110.035804,\n 40.534266\n ],\n [\n 109.996207,\n 40.510588\n ],\n [\n 109.910075,\n 40.532003\n ],\n [\n 109.866143,\n 40.509891\n ],\n [\n 109.802267,\n 40.509717\n ],\n [\n 109.708621,\n 40.477494\n ],\n [\n 109.667,\n 40.500139\n ],\n [\n 109.635496,\n 40.546798\n ],\n [\n 109.580291,\n 40.553586\n ],\n [\n 109.519883,\n 40.514244\n ],\n [\n 109.437509,\n 40.513722\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 150300,\n \"name\": \"乌海市\",\n \"center\": [\n 106.825563,\n 39.673734\n ],\n \"centroid\": [\n 106.872209,\n 39.425058\n ],\n \"childrenNum\": 3,\n \"level\": \"city\",\n \"subFeatureIndex\": 2,\n \"acroutes\": [\n 100000,\n 150000\n ],\n \"parent\": {\n \"adcode\": 150000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 106.967739,\n 39.052388\n ],\n [\n 106.933344,\n 39.076396\n ],\n [\n 106.881318,\n 39.090263\n ],\n [\n 106.853571,\n 39.116569\n ],\n [\n 106.825535,\n 39.193828\n ],\n [\n 106.796054,\n 39.214239\n ],\n [\n 106.806748,\n 39.318684\n ],\n [\n 106.781603,\n 39.371822\n ],\n [\n 106.750965,\n 39.381559\n ],\n [\n 106.73449,\n 39.437303\n ],\n [\n 106.635064,\n 39.476209\n ],\n [\n 106.611074,\n 39.543005\n ],\n [\n 106.637376,\n 39.573731\n ],\n [\n 106.755012,\n 39.626851\n ],\n [\n 106.795476,\n 39.689449\n ],\n [\n 106.757324,\n 39.710595\n ],\n [\n 106.766573,\n 39.763787\n ],\n [\n 106.754145,\n 39.850706\n ],\n [\n 106.768885,\n 39.86653\n ],\n [\n 106.778712,\n 39.811131\n ],\n [\n 106.86282,\n 39.842793\n ],\n [\n 106.871491,\n 39.865475\n ],\n [\n 106.933922,\n 39.914506\n ],\n [\n 106.963403,\n 39.902383\n ],\n [\n 106.965137,\n 39.859673\n ],\n [\n 106.9345,\n 39.858794\n ],\n [\n 106.875827,\n 39.795822\n ],\n [\n 106.899238,\n 39.755687\n ],\n [\n 106.91369,\n 39.682046\n ],\n [\n 106.875827,\n 39.672526\n ],\n [\n 106.911956,\n 39.627027\n ],\n [\n 106.931899,\n 39.576732\n ],\n [\n 106.935945,\n 39.517213\n ],\n [\n 106.965426,\n 39.420142\n ],\n [\n 106.952131,\n 39.409171\n ],\n [\n 106.943749,\n 39.299367\n ],\n [\n 107.034505,\n 39.251318\n ],\n [\n 107.060229,\n 39.222401\n ],\n [\n 107.136533,\n 39.27969\n ],\n [\n 107.139134,\n 39.226127\n ],\n [\n 107.11659,\n 39.205365\n ],\n [\n 107.103583,\n 39.136113\n ],\n [\n 107.087976,\n 39.113903\n ],\n [\n 107.077859,\n 39.045273\n ],\n [\n 107.06283,\n 39.061458\n ],\n [\n 107.033349,\n 39.036734\n ],\n [\n 106.967739,\n 39.052388\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 150400,\n \"name\": \"赤峰市\",\n \"center\": [\n 118.956806,\n 42.275317\n ],\n \"centroid\": [\n 118.878117,\n 43.240534\n ],\n \"childrenNum\": 12,\n \"level\": \"city\",\n \"subFeatureIndex\": 3,\n \"acroutes\": [\n 100000,\n 150000\n ],\n \"parent\": {\n \"adcode\": 150000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 120.886032,\n 42.270651\n ],\n [\n 120.885743,\n 42.270482\n ],\n [\n 120.883719,\n 42.24268\n ],\n [\n 120.829382,\n 42.252514\n ],\n [\n 120.820711,\n 42.228096\n ],\n [\n 120.745273,\n 42.223517\n ],\n [\n 120.722151,\n 42.203669\n ],\n [\n 120.624748,\n 42.154447\n ],\n [\n 120.584283,\n 42.16718\n ],\n [\n 120.466647,\n 42.105357\n ],\n [\n 120.493527,\n 42.072552\n ],\n [\n 120.450751,\n 42.057248\n ],\n [\n 120.456531,\n 42.016251\n ],\n [\n 120.374447,\n 41.994466\n ],\n [\n 120.28687,\n 41.934859\n ],\n [\n 120.260279,\n 41.904183\n ],\n [\n 120.300455,\n 41.888157\n ],\n [\n 120.251608,\n 41.883894\n ],\n [\n 120.128192,\n 41.773471\n ],\n [\n 120.138308,\n 41.729215\n ],\n [\n 120.09611,\n 41.697071\n ],\n [\n 120.036858,\n 41.708016\n ],\n [\n 120.024719,\n 41.738615\n ],\n [\n 120.050443,\n 41.776033\n ],\n [\n 120.041772,\n 41.818721\n ],\n [\n 120.023274,\n 41.816502\n ],\n [\n 119.985122,\n 41.904694\n ],\n [\n 119.954484,\n 41.920375\n ],\n [\n 119.954484,\n 41.968246\n ],\n [\n 119.924425,\n 41.989189\n ],\n [\n 119.869798,\n 42.083432\n ],\n [\n 119.84552,\n 42.097199\n ],\n [\n 119.839739,\n 42.148674\n ],\n [\n 119.854769,\n 42.170236\n ],\n [\n 119.846676,\n 42.215205\n ],\n [\n 119.744648,\n 42.211643\n ],\n [\n 119.67239,\n 42.241663\n ],\n [\n 119.616896,\n 42.252683\n ],\n [\n 119.608514,\n 42.277091\n ],\n [\n 119.541459,\n 42.292172\n ],\n [\n 119.572096,\n 42.359399\n ],\n [\n 119.50244,\n 42.387995\n ],\n [\n 119.488277,\n 42.351444\n ],\n [\n 119.41573,\n 42.309621\n ],\n [\n 119.346652,\n 42.299965\n ],\n [\n 119.28451,\n 42.265227\n ],\n [\n 119.237976,\n 42.200954\n ],\n [\n 119.276417,\n 42.186021\n ],\n [\n 119.314859,\n 42.119799\n ],\n [\n 119.352433,\n 42.11827\n ],\n [\n 119.385093,\n 42.089551\n ],\n [\n 119.374399,\n 42.021016\n ],\n [\n 119.324686,\n 41.969268\n ],\n [\n 119.340871,\n 41.921568\n ],\n [\n 119.334513,\n 41.869398\n ],\n [\n 119.312835,\n 41.805747\n ],\n [\n 119.290002,\n 41.783378\n ],\n [\n 119.317749,\n 41.763222\n ],\n [\n 119.299829,\n 41.711435\n ],\n [\n 119.307922,\n 41.657554\n ],\n [\n 119.342606,\n 41.618012\n ],\n [\n 119.416019,\n 41.590096\n ],\n [\n 119.414863,\n 41.562339\n ],\n [\n 119.361971,\n 41.566451\n ],\n [\n 119.404458,\n 41.510734\n ],\n [\n 119.403302,\n 41.475221\n ],\n [\n 119.377867,\n 41.459774\n ],\n [\n 119.376422,\n 41.422172\n ],\n [\n 119.309945,\n 41.406026\n ],\n [\n 119.326131,\n 41.329362\n ],\n [\n 119.252139,\n 41.325578\n ],\n [\n 119.197801,\n 41.282907\n ],\n [\n 119.155024,\n 41.297708\n ],\n [\n 119.093172,\n 41.293578\n ],\n [\n 118.974669,\n 41.306483\n ],\n [\n 118.89085,\n 41.300805\n ],\n [\n 118.844894,\n 41.342432\n ],\n [\n 118.839691,\n 41.374237\n ],\n [\n 118.770035,\n 41.353093\n ],\n [\n 118.741999,\n 41.32403\n ],\n [\n 118.676967,\n 41.350514\n ],\n [\n 118.629855,\n 41.346387\n ],\n [\n 118.519156,\n 41.353781\n ],\n [\n 118.412503,\n 41.331942\n ],\n [\n 118.380132,\n 41.31216\n ],\n [\n 118.349206,\n 41.342776\n ],\n [\n 118.361056,\n 41.384892\n ],\n [\n 118.32695,\n 41.450848\n ],\n [\n 118.272034,\n 41.471273\n ],\n [\n 118.315678,\n 41.512449\n ],\n [\n 118.301515,\n 41.569707\n ],\n [\n 118.230414,\n 41.582215\n ],\n [\n 118.209893,\n 41.610649\n ],\n [\n 118.206713,\n 41.650708\n ],\n [\n 118.169139,\n 41.670729\n ],\n [\n 118.130698,\n 41.742375\n ],\n [\n 118.140236,\n 41.784061\n ],\n [\n 118.16596,\n 41.813259\n ],\n [\n 118.235905,\n 41.807625\n ],\n [\n 118.246889,\n 41.773984\n ],\n [\n 118.292266,\n 41.772788\n ],\n [\n 118.340246,\n 41.872468\n ],\n [\n 118.268855,\n 41.930088\n ],\n [\n 118.30614,\n 41.939971\n ],\n [\n 118.313944,\n 41.988167\n ],\n [\n 118.23764,\n 42.022887\n ],\n [\n 118.296891,\n 42.048405\n ],\n [\n 118.272323,\n 42.083262\n ],\n [\n 118.226656,\n 42.090231\n ],\n [\n 118.220298,\n 42.058609\n ],\n [\n 118.189082,\n 42.030544\n ],\n [\n 118.125206,\n 42.032926\n ],\n [\n 118.155266,\n 42.081222\n ],\n [\n 118.088789,\n 42.117081\n ],\n [\n 118.106419,\n 42.171934\n ],\n [\n 118.033584,\n 42.199088\n ],\n [\n 117.96913,\n 42.245562\n ],\n [\n 118.047457,\n 42.28065\n ],\n [\n 118.059885,\n 42.298271\n ],\n [\n 118.016242,\n 42.333329\n ],\n [\n 118.024335,\n 42.384781\n ],\n [\n 117.997744,\n 42.416747\n ],\n [\n 117.874038,\n 42.510185\n ],\n [\n 117.855829,\n 42.540063\n ],\n [\n 117.797734,\n 42.585274\n ],\n [\n 117.779814,\n 42.618655\n ],\n [\n 117.707267,\n 42.587972\n ],\n [\n 117.667381,\n 42.582407\n ],\n [\n 117.600326,\n 42.602978\n ],\n [\n 117.539918,\n 42.605507\n ],\n [\n 117.520264,\n 42.59185\n ],\n [\n 117.473441,\n 42.602472\n ],\n [\n 117.435289,\n 42.585442\n ],\n [\n 117.433266,\n 42.555755\n ],\n [\n 117.39627,\n 42.53635\n ],\n [\n 117.413034,\n 42.471171\n ],\n [\n 117.332105,\n 42.46154\n ],\n [\n 117.286727,\n 42.479787\n ],\n [\n 117.176028,\n 42.465596\n ],\n [\n 117.095389,\n 42.484178\n ],\n [\n 117.078625,\n 42.460189\n ],\n [\n 117.016772,\n 42.456471\n ],\n [\n 116.993939,\n 42.425708\n ],\n [\n 116.893645,\n 42.387826\n ],\n [\n 116.907807,\n 42.443965\n ],\n [\n 116.875725,\n 42.482996\n ],\n [\n 116.885552,\n 42.534662\n ],\n [\n 116.82052,\n 42.546981\n ],\n [\n 116.801444,\n 42.582913\n ],\n [\n 116.699127,\n 42.592019\n ],\n [\n 116.669357,\n 42.555755\n ],\n [\n 116.638141,\n 42.577179\n ],\n [\n 116.63554,\n 42.614609\n ],\n [\n 116.58785,\n 42.599775\n ],\n [\n 116.619354,\n 42.671387\n ],\n [\n 116.67427,\n 42.761586\n ],\n [\n 116.666177,\n 42.81655\n ],\n [\n 116.673981,\n 42.889758\n ],\n [\n 116.664732,\n 42.933038\n ],\n [\n 116.580624,\n 42.985336\n ],\n [\n 116.500852,\n 43.01532\n ],\n [\n 116.503742,\n 43.04914\n ],\n [\n 116.436109,\n 43.077922\n ],\n [\n 116.419345,\n 43.104015\n ],\n [\n 116.356336,\n 43.156835\n ],\n [\n 116.37021,\n 43.243323\n ],\n [\n 116.413853,\n 43.258003\n ],\n [\n 116.436398,\n 43.328188\n ],\n [\n 116.518194,\n 43.365664\n ],\n [\n 116.59681,\n 43.410605\n ],\n [\n 116.621956,\n 43.505039\n ],\n [\n 116.681207,\n 43.517165\n ],\n [\n 116.734967,\n 43.509026\n ],\n [\n 116.790461,\n 43.484436\n ],\n [\n 116.830636,\n 43.5067\n ],\n [\n 116.804912,\n 43.565147\n ],\n [\n 116.812138,\n 43.612593\n ],\n [\n 116.837284,\n 43.614086\n ],\n [\n 116.858383,\n 43.657351\n ],\n [\n 116.971683,\n 43.673422\n ],\n [\n 117.053768,\n 43.753384\n ],\n [\n 117.001164,\n 43.782495\n ],\n [\n 116.986135,\n 43.840343\n ],\n [\n 117.013304,\n 43.85075\n ],\n [\n 117.000008,\n 43.912328\n ],\n [\n 117.031802,\n 43.942845\n ],\n [\n 117.022264,\n 43.969721\n ],\n [\n 116.970816,\n 43.988674\n ],\n [\n 116.961567,\n 44.024752\n ],\n [\n 117.011281,\n 44.057681\n ],\n [\n 117.120823,\n 44.179195\n ],\n [\n 117.166201,\n 44.192662\n ],\n [\n 117.206666,\n 44.220081\n ],\n [\n 117.452631,\n 44.235017\n ],\n [\n 117.522866,\n 44.226811\n ],\n [\n 117.550613,\n 44.187736\n ],\n [\n 117.634721,\n 44.14847\n ],\n [\n 117.624894,\n 44.128745\n ],\n [\n 117.686746,\n 44.095033\n ],\n [\n 117.643392,\n 44.042207\n ],\n [\n 117.700331,\n 44.016353\n ],\n [\n 117.790219,\n 44.019482\n ],\n [\n 117.827793,\n 44.063113\n ],\n [\n 117.859876,\n 44.072987\n ],\n [\n 117.904098,\n 44.121182\n ],\n [\n 117.962193,\n 44.121182\n ],\n [\n 118.06162,\n 44.100461\n ],\n [\n 118.116825,\n 44.132362\n ],\n [\n 118.128675,\n 44.190692\n ],\n [\n 118.148907,\n 44.215157\n ],\n [\n 118.172608,\n 44.204321\n ],\n [\n 118.19284,\n 44.242565\n ],\n [\n 118.237351,\n 44.279144\n ],\n [\n 118.214228,\n 44.306195\n ],\n [\n 118.250935,\n 44.337493\n ],\n [\n 118.34198,\n 44.319961\n ],\n [\n 118.414816,\n 44.322419\n ],\n [\n 118.428111,\n 44.346174\n ],\n [\n 118.466552,\n 44.354036\n ],\n [\n 118.476957,\n 44.399383\n ],\n [\n 118.544591,\n 44.411165\n ],\n [\n 118.54777,\n 44.442243\n ],\n [\n 118.596038,\n 44.468728\n ],\n [\n 118.635635,\n 44.472814\n ],\n [\n 118.659336,\n 44.453361\n ],\n [\n 118.75067,\n 44.477554\n ],\n [\n 118.789111,\n 44.46317\n ],\n [\n 118.816569,\n 44.49128\n ],\n [\n 118.904723,\n 44.516436\n ],\n [\n 118.981606,\n 44.566064\n ],\n [\n 119.001549,\n 44.648248\n ],\n [\n 118.96831,\n 44.691087\n ],\n [\n 118.926112,\n 44.7046\n ],\n [\n 118.97149,\n 44.729827\n ],\n [\n 119.001549,\n 44.713879\n ],\n [\n 119.074674,\n 44.712739\n ],\n [\n 119.148377,\n 44.731617\n ],\n [\n 119.125832,\n 44.762199\n ],\n [\n 119.173233,\n 44.76041\n ],\n [\n 119.14751,\n 44.808692\n ],\n [\n 119.067448,\n 44.870895\n ],\n [\n 119.082188,\n 44.938381\n ],\n [\n 119.107334,\n 44.920543\n ],\n [\n 119.146642,\n 44.924922\n ],\n [\n 119.224681,\n 44.909676\n ],\n [\n 119.230172,\n 44.9353\n ],\n [\n 119.18624,\n 44.952971\n ],\n [\n 119.15329,\n 44.992993\n ],\n [\n 119.171788,\n 45.015989\n ],\n [\n 119.208495,\n 44.997366\n ],\n [\n 119.231907,\n 45.019065\n ],\n [\n 119.196934,\n 45.03234\n ],\n [\n 119.156759,\n 45.074409\n ],\n [\n 119.159071,\n 45.099959\n ],\n [\n 119.215432,\n 45.152802\n ],\n [\n 119.28769,\n 45.121943\n ],\n [\n 119.293181,\n 45.087347\n ],\n [\n 119.342027,\n 45.076026\n ],\n [\n 119.373243,\n 45.105456\n ],\n [\n 119.360814,\n 45.165884\n ],\n [\n 119.311101,\n 45.186551\n ],\n [\n 119.323818,\n 45.245925\n ],\n [\n 119.33827,\n 45.252214\n ],\n [\n 119.492324,\n 45.223829\n ],\n [\n 119.507642,\n 45.194622\n ],\n [\n 119.634816,\n 45.121619\n ],\n [\n 119.668633,\n 45.084436\n ],\n [\n 119.708519,\n 44.989429\n ],\n [\n 119.751874,\n 44.925895\n ],\n [\n 119.848988,\n 44.894751\n ],\n [\n 119.864307,\n 44.873329\n ],\n [\n 119.927604,\n 44.846379\n ],\n [\n 119.9409,\n 44.826401\n ],\n [\n 120.076166,\n 44.72641\n ],\n [\n 120.082236,\n 44.687668\n ],\n [\n 120.116342,\n 44.652484\n ],\n [\n 120.180796,\n 44.635373\n ],\n [\n 120.156517,\n 44.598853\n ],\n [\n 120.206519,\n 44.571938\n ],\n [\n 120.2123,\n 44.552355\n ],\n [\n 120.28687,\n 44.517253\n ],\n [\n 120.325022,\n 44.440444\n ],\n [\n 120.312016,\n 44.418363\n ],\n [\n 120.339185,\n 44.39071\n ],\n [\n 120.378493,\n 44.38629\n ],\n [\n 120.38832,\n 44.337656\n ],\n [\n 120.454508,\n 44.262416\n ],\n [\n 120.496707,\n 44.249292\n ],\n [\n 120.560872,\n 44.261432\n ],\n [\n 120.574456,\n 44.235017\n ],\n [\n 120.645847,\n 44.235017\n ],\n [\n 120.653651,\n 44.185765\n ],\n [\n 120.688912,\n 44.18248\n ],\n [\n 120.706543,\n 44.129238\n ],\n [\n 120.746141,\n 44.113783\n ],\n [\n 120.708856,\n 44.081543\n ],\n [\n 120.693537,\n 44.037268\n ],\n [\n 120.774466,\n 43.935588\n ],\n [\n 120.795854,\n 43.885756\n ],\n [\n 120.787472,\n 43.814401\n ],\n [\n 120.836029,\n 43.788613\n ],\n [\n 120.876783,\n 43.739485\n ],\n [\n 120.940659,\n 43.693961\n ],\n [\n 120.964359,\n 43.654037\n ],\n [\n 120.93141,\n 43.611101\n ],\n [\n 120.864354,\n 43.593188\n ],\n [\n 120.807993,\n 43.559504\n ],\n [\n 120.758569,\n 43.54307\n ],\n [\n 120.753366,\n 43.525967\n ],\n [\n 120.694404,\n 43.488424\n ],\n [\n 120.654807,\n 43.451024\n ],\n [\n 120.60018,\n 43.427241\n ],\n [\n 120.464046,\n 43.400787\n ],\n [\n 120.426761,\n 43.380149\n ],\n [\n 120.504222,\n 43.380315\n ],\n [\n 120.607406,\n 43.393798\n ],\n [\n 120.644402,\n 43.409607\n ],\n [\n 120.705387,\n 43.410439\n ],\n [\n 120.772153,\n 43.42824\n ],\n [\n 120.762904,\n 43.406112\n ],\n [\n 120.721284,\n 43.393964\n ],\n [\n 120.666368,\n 43.325022\n ],\n [\n 120.627927,\n 43.318523\n ],\n [\n 120.631973,\n 43.295856\n ],\n [\n 120.589486,\n 43.276849\n ],\n [\n 120.574745,\n 43.240486\n ],\n [\n 120.535148,\n 43.226803\n ],\n [\n 120.507979,\n 43.196254\n ],\n [\n 120.47474,\n 43.184899\n ],\n [\n 120.451907,\n 43.131434\n ],\n [\n 120.386008,\n 43.102008\n ],\n [\n 120.3467,\n 43.058512\n ],\n [\n 120.387164,\n 42.986342\n ],\n [\n 120.430519,\n 42.986174\n ],\n [\n 120.403061,\n 42.93723\n ],\n [\n 120.420403,\n 42.914757\n ],\n [\n 120.396413,\n 42.885563\n ],\n [\n 120.42416,\n 42.8671\n ],\n [\n 120.462023,\n 42.756541\n ],\n [\n 120.484856,\n 42.725926\n ],\n [\n 120.512892,\n 42.649154\n ],\n [\n 120.564918,\n 42.598089\n ],\n [\n 120.568386,\n 42.540569\n ],\n [\n 120.653073,\n 42.465089\n ],\n [\n 120.666079,\n 42.442275\n ],\n [\n 120.768685,\n 42.393916\n ],\n [\n 120.766951,\n 42.366168\n ],\n [\n 120.84181,\n 42.309282\n ],\n [\n 120.861175,\n 42.269465\n ],\n [\n 120.885743,\n 42.270482\n ],\n [\n 120.886032,\n 42.270651\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 150500,\n \"name\": \"通辽市\",\n \"center\": [\n 122.263119,\n 43.617429\n ],\n \"centroid\": [\n 121.569877,\n 43.834478\n ],\n \"childrenNum\": 8,\n \"level\": \"city\",\n \"subFeatureIndex\": 4,\n \"acroutes\": [\n 100000,\n 150000\n ],\n \"parent\": {\n \"adcode\": 150000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 120.886032,\n 42.270651\n ],\n [\n 120.885743,\n 42.270482\n ],\n [\n 120.861175,\n 42.269465\n ],\n [\n 120.84181,\n 42.309282\n ],\n [\n 120.766951,\n 42.366168\n ],\n [\n 120.768685,\n 42.393916\n ],\n [\n 120.666079,\n 42.442275\n ],\n [\n 120.653073,\n 42.465089\n ],\n [\n 120.568386,\n 42.540569\n ],\n [\n 120.564918,\n 42.598089\n ],\n [\n 120.512892,\n 42.649154\n ],\n [\n 120.484856,\n 42.725926\n ],\n [\n 120.462023,\n 42.756541\n ],\n [\n 120.42416,\n 42.8671\n ],\n [\n 120.396413,\n 42.885563\n ],\n [\n 120.420403,\n 42.914757\n ],\n [\n 120.403061,\n 42.93723\n ],\n [\n 120.430519,\n 42.986174\n ],\n [\n 120.387164,\n 42.986342\n ],\n [\n 120.3467,\n 43.058512\n ],\n [\n 120.386008,\n 43.102008\n ],\n [\n 120.451907,\n 43.131434\n ],\n [\n 120.47474,\n 43.184899\n ],\n [\n 120.507979,\n 43.196254\n ],\n [\n 120.535148,\n 43.226803\n ],\n [\n 120.574745,\n 43.240486\n ],\n [\n 120.589486,\n 43.276849\n ],\n [\n 120.631973,\n 43.295856\n ],\n [\n 120.627927,\n 43.318523\n ],\n [\n 120.666368,\n 43.325022\n ],\n [\n 120.721284,\n 43.393964\n ],\n [\n 120.762904,\n 43.406112\n ],\n [\n 120.772153,\n 43.42824\n ],\n [\n 120.705387,\n 43.410439\n ],\n [\n 120.644402,\n 43.409607\n ],\n [\n 120.607406,\n 43.393798\n ],\n [\n 120.504222,\n 43.380315\n ],\n [\n 120.426761,\n 43.380149\n ],\n [\n 120.464046,\n 43.400787\n ],\n [\n 120.60018,\n 43.427241\n ],\n [\n 120.654807,\n 43.451024\n ],\n [\n 120.694404,\n 43.488424\n ],\n [\n 120.753366,\n 43.525967\n ],\n [\n 120.758569,\n 43.54307\n ],\n [\n 120.807993,\n 43.559504\n ],\n [\n 120.864354,\n 43.593188\n ],\n [\n 120.93141,\n 43.611101\n ],\n [\n 120.964359,\n 43.654037\n ],\n [\n 120.940659,\n 43.693961\n ],\n [\n 120.876783,\n 43.739485\n ],\n [\n 120.836029,\n 43.788613\n ],\n [\n 120.787472,\n 43.814401\n ],\n [\n 120.795854,\n 43.885756\n ],\n [\n 120.774466,\n 43.935588\n ],\n [\n 120.693537,\n 44.037268\n ],\n [\n 120.708856,\n 44.081543\n ],\n [\n 120.746141,\n 44.113783\n ],\n [\n 120.706543,\n 44.129238\n ],\n [\n 120.688912,\n 44.18248\n ],\n [\n 120.653651,\n 44.185765\n ],\n [\n 120.645847,\n 44.235017\n ],\n [\n 120.574456,\n 44.235017\n ],\n [\n 120.560872,\n 44.261432\n ],\n [\n 120.496707,\n 44.249292\n ],\n [\n 120.454508,\n 44.262416\n ],\n [\n 120.38832,\n 44.337656\n ],\n [\n 120.378493,\n 44.38629\n ],\n [\n 120.339185,\n 44.39071\n ],\n [\n 120.312016,\n 44.418363\n ],\n [\n 120.325022,\n 44.440444\n ],\n [\n 120.28687,\n 44.517253\n ],\n [\n 120.2123,\n 44.552355\n ],\n [\n 120.206519,\n 44.571938\n ],\n [\n 120.156517,\n 44.598853\n ],\n [\n 120.180796,\n 44.635373\n ],\n [\n 120.116342,\n 44.652484\n ],\n [\n 120.082236,\n 44.687668\n ],\n [\n 120.076166,\n 44.72641\n ],\n [\n 119.9409,\n 44.826401\n ],\n [\n 119.927604,\n 44.846379\n ],\n [\n 119.864307,\n 44.873329\n ],\n [\n 119.848988,\n 44.894751\n ],\n [\n 119.751874,\n 44.925895\n ],\n [\n 119.708519,\n 44.989429\n ],\n [\n 119.668633,\n 45.084436\n ],\n [\n 119.634816,\n 45.121619\n ],\n [\n 119.507642,\n 45.194622\n ],\n [\n 119.492324,\n 45.223829\n ],\n [\n 119.33827,\n 45.252214\n ],\n [\n 119.323818,\n 45.245925\n ],\n [\n 119.248381,\n 45.304111\n ],\n [\n 119.313413,\n 45.385244\n ],\n [\n 119.304742,\n 45.468029\n ],\n [\n 119.396943,\n 45.511863\n ],\n [\n 119.496081,\n 45.550691\n ],\n [\n 119.55909,\n 45.615933\n ],\n [\n 119.544927,\n 45.635956\n ],\n [\n 119.566027,\n 45.65565\n ],\n [\n 119.656493,\n 45.623463\n ],\n [\n 119.790893,\n 45.564323\n ],\n [\n 119.819507,\n 45.572821\n ],\n [\n 119.877602,\n 45.549088\n ],\n [\n 119.918355,\n 45.561918\n ],\n [\n 119.906794,\n 45.505603\n ],\n [\n 120.002464,\n 45.482162\n ],\n [\n 120.031656,\n 45.499342\n ],\n [\n 120.028765,\n 45.526306\n ],\n [\n 119.994082,\n 45.552937\n ],\n [\n 119.994082,\n 45.580837\n ],\n [\n 120.027031,\n 45.594942\n ],\n [\n 120.142644,\n 45.584204\n ],\n [\n 120.165766,\n 45.594782\n ],\n [\n 120.269239,\n 45.552135\n ],\n [\n 120.318375,\n 45.556626\n ],\n [\n 120.35855,\n 45.516838\n ],\n [\n 120.414044,\n 45.503516\n ],\n [\n 120.434854,\n 45.464495\n ],\n [\n 120.49584,\n 45.464173\n ],\n [\n 120.559716,\n 45.416604\n ],\n [\n 120.554224,\n 45.357569\n ],\n [\n 120.580526,\n 45.352901\n ],\n [\n 120.660298,\n 45.297666\n ],\n [\n 120.744406,\n 45.260115\n ],\n [\n 120.82678,\n 45.253504\n ],\n [\n 120.834873,\n 45.216084\n ],\n [\n 120.882274,\n 45.217537\n ],\n [\n 120.967827,\n 45.184129\n ],\n [\n 120.97303,\n 45.157002\n ],\n [\n 120.947884,\n 45.120973\n ],\n [\n 120.97303,\n 45.11871\n ],\n [\n 120.977076,\n 45.072953\n ],\n [\n 121.032859,\n 44.9985\n ],\n [\n 121.239806,\n 44.934165\n ],\n [\n 121.401663,\n 44.85125\n ],\n [\n 121.420161,\n 44.817953\n ],\n [\n 121.409178,\n 44.790815\n ],\n [\n 121.529993,\n 44.720389\n ],\n [\n 121.548491,\n 44.667472\n ],\n [\n 121.595603,\n 44.659164\n ],\n [\n 121.585198,\n 44.639774\n ],\n [\n 121.651097,\n 44.563126\n ],\n [\n 121.697631,\n 44.534562\n ],\n [\n 121.760062,\n 44.47739\n ],\n [\n 121.778271,\n 44.446494\n ],\n [\n 121.829429,\n 44.411328\n ],\n [\n 121.881166,\n 44.402983\n ],\n [\n 121.933769,\n 44.351252\n ],\n [\n 122.017877,\n 44.304392\n ],\n [\n 122.167596,\n 44.25569\n ],\n [\n 122.22598,\n 44.263564\n ],\n [\n 122.274537,\n 44.25405\n ],\n [\n 122.319337,\n 44.232883\n ],\n [\n 122.483218,\n 44.236986\n ],\n [\n 122.512988,\n 44.250276\n ],\n [\n 122.641896,\n 44.283408\n ],\n [\n 122.675423,\n 44.285703\n ],\n [\n 122.760687,\n 44.369756\n ],\n [\n 122.856068,\n 44.398238\n ],\n [\n 123.024862,\n 44.492914\n ],\n [\n 123.124867,\n 44.509577\n ],\n [\n 123.124,\n 44.457939\n ],\n [\n 123.142208,\n 44.428178\n ],\n [\n 123.114461,\n 44.402493\n ],\n [\n 123.127179,\n 44.368774\n ],\n [\n 123.196835,\n 44.345028\n ],\n [\n 123.277186,\n 44.252573\n ],\n [\n 123.287302,\n 44.213351\n ],\n [\n 123.32372,\n 44.179852\n ],\n [\n 123.38644,\n 44.161945\n ],\n [\n 123.3506,\n 44.092566\n ],\n [\n 123.328344,\n 44.083847\n ],\n [\n 123.332391,\n 44.028376\n ],\n [\n 123.400891,\n 43.979281\n ],\n [\n 123.375168,\n 43.965599\n ],\n [\n 123.428349,\n 43.927341\n ],\n [\n 123.443957,\n 43.877337\n ],\n [\n 123.468236,\n 43.853062\n ],\n [\n 123.463322,\n 43.819524\n ],\n [\n 123.49685,\n 43.785637\n ],\n [\n 123.482687,\n 43.737831\n ],\n [\n 123.517371,\n 43.71383\n ],\n [\n 123.537314,\n 43.649728\n ],\n [\n 123.511879,\n 43.62619\n ],\n [\n 123.510434,\n 43.592193\n ],\n [\n 123.421123,\n 43.59833\n ],\n [\n 123.46101,\n 43.568632\n ],\n [\n 123.452339,\n 43.545726\n ],\n [\n 123.352912,\n 43.567636\n ],\n [\n 123.304644,\n 43.550707\n ],\n [\n 123.32979,\n 43.518992\n ],\n [\n 123.315916,\n 43.49208\n ],\n [\n 123.375746,\n 43.476625\n ],\n [\n 123.419967,\n 43.410106\n ],\n [\n 123.441934,\n 43.43772\n ],\n [\n 123.486734,\n 43.44537\n ],\n [\n 123.519683,\n 43.402452\n ],\n [\n 123.545118,\n 43.415097\n ],\n [\n 123.608705,\n 43.36633\n ],\n [\n 123.703796,\n 43.370659\n ],\n [\n 123.712756,\n 43.347179\n ],\n [\n 123.696281,\n 43.281351\n ],\n [\n 123.664199,\n 43.26234\n ],\n [\n 123.676916,\n 43.224132\n ],\n [\n 123.646279,\n 43.213283\n ],\n [\n 123.667956,\n 43.18089\n ],\n [\n 123.636163,\n 43.141462\n ],\n [\n 123.626336,\n 43.079427\n ],\n [\n 123.572576,\n 43.004601\n ],\n [\n 123.537603,\n 43.007114\n ],\n [\n 123.471993,\n 43.042779\n ],\n [\n 123.321986,\n 43.000749\n ],\n [\n 123.258977,\n 42.993043\n ],\n [\n 123.184118,\n 42.925995\n ],\n [\n 123.188742,\n 42.895799\n ],\n [\n 123.169955,\n 42.859713\n ],\n [\n 123.227473,\n 42.83234\n ],\n [\n 123.115907,\n 42.800419\n ],\n [\n 123.058389,\n 42.769153\n ],\n [\n 122.980351,\n 42.777559\n ],\n [\n 122.945956,\n 42.753682\n ],\n [\n 122.928904,\n 42.772179\n ],\n [\n 122.887283,\n 42.770162\n ],\n [\n 122.850865,\n 42.714315\n ],\n [\n 122.732362,\n 42.786469\n ],\n [\n 122.625132,\n 42.773188\n ],\n [\n 122.58091,\n 42.789662\n ],\n [\n 122.563857,\n 42.825957\n ],\n [\n 122.436973,\n 42.842921\n ],\n [\n 122.358356,\n 42.835868\n ],\n [\n 122.349974,\n 42.82159\n ],\n [\n 122.374831,\n 42.774869\n ],\n [\n 122.46154,\n 42.758055\n ],\n [\n 122.399688,\n 42.712128\n ],\n [\n 122.398531,\n 42.68671\n ],\n [\n 122.341303,\n 42.671219\n ],\n [\n 122.259507,\n 42.696643\n ],\n [\n 122.203724,\n 42.732151\n ],\n [\n 122.19621,\n 42.690919\n ],\n [\n 122.133201,\n 42.689404\n ],\n [\n 122.060943,\n 42.723402\n ],\n [\n 122.018745,\n 42.699168\n ],\n [\n 121.940417,\n 42.688562\n ],\n [\n 121.916139,\n 42.65724\n ],\n [\n 121.921341,\n 42.606181\n ],\n [\n 121.869315,\n 42.527911\n ],\n [\n 121.828851,\n 42.531962\n ],\n [\n 121.747344,\n 42.484516\n ],\n [\n 121.711215,\n 42.443627\n ],\n [\n 121.666127,\n 42.437204\n ],\n [\n 121.637802,\n 42.480462\n ],\n [\n 121.605141,\n 42.493974\n ],\n [\n 121.607742,\n 42.516094\n ],\n [\n 121.570168,\n 42.486881\n ],\n [\n 121.506292,\n 42.482489\n ],\n [\n 121.478834,\n 42.496339\n ],\n [\n 121.433746,\n 42.475395\n ],\n [\n 121.385188,\n 42.473029\n ],\n [\n 121.304549,\n 42.435683\n ],\n [\n 121.284895,\n 42.387826\n ],\n [\n 121.218706,\n 42.371922\n ],\n [\n 121.121592,\n 42.280989\n ],\n [\n 121.087197,\n 42.278447\n ],\n [\n 121.069277,\n 42.252683\n ],\n [\n 121.028813,\n 42.24251\n ],\n [\n 120.936034,\n 42.279803\n ],\n [\n 120.886032,\n 42.270651\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 150600,\n \"name\": \"鄂尔多斯市\",\n \"center\": [\n 109.99029,\n 39.817179\n ],\n \"centroid\": [\n 108.63473,\n 39.427784\n ],\n \"childrenNum\": 9,\n \"level\": \"city\",\n \"subFeatureIndex\": 5,\n \"acroutes\": [\n 100000,\n 150000\n ],\n \"parent\": {\n \"adcode\": 150000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 110.74104,\n 39.349509\n ],\n [\n 110.739595,\n 39.348977\n ],\n [\n 110.732947,\n 39.308406\n ],\n [\n 110.702888,\n 39.273839\n ],\n [\n 110.626294,\n 39.266747\n ],\n [\n 110.566754,\n 39.319924\n ],\n [\n 110.559239,\n 39.352165\n ],\n [\n 110.524266,\n 39.382799\n ],\n [\n 110.482646,\n 39.360666\n ],\n [\n 110.430042,\n 39.379258\n ],\n [\n 110.429175,\n 39.342069\n ],\n [\n 110.391023,\n 39.311773\n ],\n [\n 110.340443,\n 39.341715\n ],\n [\n 110.243328,\n 39.423681\n ],\n [\n 110.152572,\n 39.453929\n ],\n [\n 110.132051,\n 39.446855\n ],\n [\n 110.136676,\n 39.391827\n ],\n [\n 110.158931,\n 39.389526\n ],\n [\n 110.203153,\n 39.315317\n ],\n [\n 110.210957,\n 39.281463\n ],\n [\n 110.110663,\n 39.249721\n ],\n [\n 110.010947,\n 39.20856\n ],\n [\n 109.962679,\n 39.211932\n ],\n [\n 109.902849,\n 39.271889\n ],\n [\n 109.869033,\n 39.249721\n ],\n [\n 109.960367,\n 39.186727\n ],\n [\n 109.89389,\n 39.141265\n ],\n [\n 109.922215,\n 39.106972\n ],\n [\n 109.860073,\n 39.124387\n ],\n [\n 109.757467,\n 39.053455\n ],\n [\n 109.725384,\n 39.018407\n ],\n [\n 109.665266,\n 38.981739\n ],\n [\n 109.683764,\n 38.935611\n ],\n [\n 109.624513,\n 38.854502\n ],\n [\n 109.549653,\n 38.805791\n ],\n [\n 109.517282,\n 38.833808\n ],\n [\n 109.450805,\n 38.788833\n ],\n [\n 109.40167,\n 38.716314\n ],\n [\n 109.338661,\n 38.701479\n ],\n [\n 109.328834,\n 38.660534\n ],\n [\n 109.367564,\n 38.629766\n ],\n [\n 109.331435,\n 38.59791\n ],\n [\n 109.276808,\n 38.622966\n ],\n [\n 109.196747,\n 38.552607\n ],\n [\n 109.175936,\n 38.518746\n ],\n [\n 109.052231,\n 38.42855\n ],\n [\n 109.051364,\n 38.385295\n ],\n [\n 109.00772,\n 38.359078\n ],\n [\n 108.961764,\n 38.265087\n ],\n [\n 108.975927,\n 38.245122\n ],\n [\n 108.938931,\n 38.209497\n ],\n [\n 108.967545,\n 38.152784\n ],\n [\n 109.068995,\n 38.091161\n ],\n [\n 109.050786,\n 38.054919\n ],\n [\n 109.069573,\n 38.02299\n ],\n [\n 109.038068,\n 38.021546\n ],\n [\n 109.017547,\n 37.969924\n ],\n [\n 108.982574,\n 37.963784\n ],\n [\n 108.974193,\n 37.931815\n ],\n [\n 108.935751,\n 37.921698\n ],\n [\n 108.893842,\n 37.978229\n ],\n [\n 108.882859,\n 38.013787\n ],\n [\n 108.830544,\n 38.049869\n ],\n [\n 108.797595,\n 38.047885\n ],\n [\n 108.826787,\n 37.995198\n ],\n [\n 108.798173,\n 37.933622\n ],\n [\n 108.793259,\n 37.815925\n ],\n [\n 108.784588,\n 37.764701\n ],\n [\n 108.792103,\n 37.700214\n ],\n [\n 108.777651,\n 37.683539\n ],\n [\n 108.611169,\n 37.654169\n ],\n [\n 108.532553,\n 37.690608\n ],\n [\n 108.422432,\n 37.64891\n ],\n [\n 108.301039,\n 37.640749\n ],\n [\n 108.246412,\n 37.665774\n ],\n [\n 108.19352,\n 37.63821\n ],\n [\n 108.133979,\n 37.622066\n ],\n [\n 108.013164,\n 37.665592\n ],\n [\n 108.024436,\n 37.698764\n ],\n [\n 107.993221,\n 37.735363\n ],\n [\n 107.981949,\n 37.787331\n ],\n [\n 107.884834,\n 37.808325\n ],\n [\n 107.842636,\n 37.828951\n ],\n [\n 107.741186,\n 37.845412\n ],\n [\n 107.68338,\n 37.887722\n ],\n [\n 107.650141,\n 37.864581\n ],\n [\n 107.560541,\n 37.893687\n ],\n [\n 107.492619,\n 37.944821\n ],\n [\n 107.450132,\n 37.933261\n ],\n [\n 107.41169,\n 37.949156\n ],\n [\n 107.440015,\n 37.995017\n ],\n [\n 107.39377,\n 38.01505\n ],\n [\n 107.331629,\n 38.086474\n ],\n [\n 107.242318,\n 38.110626\n ],\n [\n 107.190293,\n 38.154045\n ],\n [\n 107.138845,\n 38.160709\n ],\n [\n 107.125839,\n 38.137113\n ],\n [\n 107.068899,\n 38.139095\n ],\n [\n 107.014851,\n 38.120357\n ],\n [\n 106.945194,\n 38.131708\n ],\n [\n 106.755879,\n 38.181236\n ],\n [\n 106.728132,\n 38.204098\n ],\n [\n 106.627838,\n 38.23253\n ],\n [\n 106.555291,\n 38.263828\n ],\n [\n 106.482455,\n 38.319556\n ],\n [\n 106.504711,\n 38.332852\n ],\n [\n 106.511358,\n 38.336804\n ],\n [\n 106.601825,\n 38.392476\n ],\n [\n 106.648648,\n 38.472676\n ],\n [\n 106.662522,\n 38.60149\n ],\n [\n 106.702697,\n 38.708271\n ],\n [\n 106.755879,\n 38.748474\n ],\n [\n 106.837386,\n 38.847545\n ],\n [\n 106.954443,\n 38.941134\n ],\n [\n 106.971496,\n 39.016983\n ],\n [\n 106.967739,\n 39.052388\n ],\n [\n 107.033349,\n 39.036734\n ],\n [\n 107.06283,\n 39.061458\n ],\n [\n 107.077859,\n 39.045273\n ],\n [\n 107.087976,\n 39.113903\n ],\n [\n 107.103583,\n 39.136113\n ],\n [\n 107.11659,\n 39.205365\n ],\n [\n 107.139134,\n 39.226127\n ],\n [\n 107.136533,\n 39.27969\n ],\n [\n 107.060229,\n 39.222401\n ],\n [\n 107.034505,\n 39.251318\n ],\n [\n 106.943749,\n 39.299367\n ],\n [\n 106.952131,\n 39.409171\n ],\n [\n 106.965426,\n 39.420142\n ],\n [\n 106.935945,\n 39.517213\n ],\n [\n 106.931899,\n 39.576732\n ],\n [\n 106.911956,\n 39.627027\n ],\n [\n 106.875827,\n 39.672526\n ],\n [\n 106.91369,\n 39.682046\n ],\n [\n 106.899238,\n 39.755687\n ],\n [\n 106.875827,\n 39.795822\n ],\n [\n 106.9345,\n 39.858794\n ],\n [\n 106.965137,\n 39.859673\n ],\n [\n 106.963403,\n 39.902383\n ],\n [\n 106.933922,\n 39.914506\n ],\n [\n 106.871491,\n 39.865475\n ],\n [\n 106.86282,\n 39.842793\n ],\n [\n 106.778712,\n 39.811131\n ],\n [\n 106.768885,\n 39.86653\n ],\n [\n 106.754145,\n 39.850706\n ],\n [\n 106.696049,\n 39.890258\n ],\n [\n 106.723796,\n 39.932422\n ],\n [\n 106.704142,\n 39.967364\n ],\n [\n 106.720039,\n 39.993163\n ],\n [\n 106.718016,\n 40.047363\n ],\n [\n 106.759347,\n 40.083647\n ],\n [\n 106.801546,\n 40.10187\n ],\n [\n 106.866578,\n 40.181012\n ],\n [\n 106.922939,\n 40.196934\n ],\n [\n 106.948663,\n 40.234887\n ],\n [\n 106.99722,\n 40.262333\n ],\n [\n 107.013116,\n 40.314572\n ],\n [\n 107.055026,\n 40.332733\n ],\n [\n 107.044043,\n 40.35403\n ],\n [\n 107.114277,\n 40.366945\n ],\n [\n 107.15214,\n 40.410907\n ],\n [\n 107.147227,\n 40.464251\n ],\n [\n 107.18509,\n 40.471744\n ],\n [\n 107.203877,\n 40.505712\n ],\n [\n 107.1611,\n 40.525388\n ],\n [\n 107.169193,\n 40.598295\n ],\n [\n 107.230757,\n 40.577423\n ],\n [\n 107.250989,\n 40.58299\n ],\n [\n 107.286829,\n 40.650969\n ],\n [\n 107.392325,\n 40.644887\n ],\n [\n 107.455334,\n 40.680677\n ],\n [\n 107.485104,\n 40.711067\n ],\n [\n 107.526725,\n 40.701344\n ],\n [\n 107.584531,\n 40.739707\n ],\n [\n 107.612567,\n 40.778049\n ],\n [\n 107.603896,\n 40.798685\n ],\n [\n 107.653609,\n 40.772845\n ],\n [\n 107.679622,\n 40.780824\n ],\n [\n 107.681067,\n 40.817235\n ],\n [\n 107.738874,\n 40.874758\n ],\n [\n 107.747545,\n 40.860728\n ],\n [\n 107.821247,\n 40.835779\n ],\n [\n 107.856509,\n 40.874585\n ],\n [\n 107.899575,\n 40.849295\n ],\n [\n 107.972122,\n 40.862287\n ],\n [\n 108.000447,\n 40.846003\n ],\n [\n 108.088601,\n 40.832314\n ],\n [\n 108.125308,\n 40.842711\n ],\n [\n 108.182247,\n 40.888092\n ],\n [\n 108.211439,\n 40.850681\n ],\n [\n 108.211728,\n 40.820875\n ],\n [\n 108.288033,\n 40.819661\n ],\n [\n 108.338902,\n 40.801633\n ],\n [\n 108.421565,\n 40.80666\n ],\n [\n 108.468388,\n 40.785159\n ],\n [\n 108.483129,\n 40.75463\n ],\n [\n 108.580243,\n 40.710893\n ],\n [\n 108.591804,\n 40.658962\n ],\n [\n 108.656547,\n 40.667128\n ],\n [\n 108.720134,\n 40.619161\n ],\n [\n 108.762622,\n 40.62681\n ],\n [\n 108.778229,\n 40.567158\n ],\n [\n 108.831122,\n 40.541577\n ],\n [\n 108.870141,\n 40.570464\n ],\n [\n 108.92737,\n 40.552194\n ],\n [\n 108.925635,\n 40.533048\n ],\n [\n 108.997604,\n 40.530088\n ],\n [\n 108.998182,\n 40.55724\n ],\n [\n 109.053387,\n 40.550801\n ],\n [\n 109.088938,\n 40.532699\n ],\n [\n 109.157149,\n 40.53357\n ],\n [\n 109.322475,\n 40.484636\n ],\n [\n 109.419879,\n 40.473312\n ],\n [\n 109.437509,\n 40.513722\n ],\n [\n 109.519883,\n 40.514244\n ],\n [\n 109.580291,\n 40.553586\n ],\n [\n 109.635496,\n 40.546798\n ],\n [\n 109.667,\n 40.500139\n ],\n [\n 109.708621,\n 40.477494\n ],\n [\n 109.802267,\n 40.509717\n ],\n [\n 109.866143,\n 40.509891\n ],\n [\n 109.910075,\n 40.532003\n ],\n [\n 109.996207,\n 40.510588\n ],\n [\n 110.035804,\n 40.534266\n ],\n [\n 110.164712,\n 40.513722\n ],\n [\n 110.18321,\n 40.554282\n ],\n [\n 110.247953,\n 40.521209\n ],\n [\n 110.249398,\n 40.475054\n ],\n [\n 110.296799,\n 40.492823\n ],\n [\n 110.319054,\n 40.445777\n ],\n [\n 110.357495,\n 40.462509\n ],\n [\n 110.369057,\n 40.444383\n ],\n [\n 110.45172,\n 40.391896\n ],\n [\n 110.472241,\n 40.404978\n ],\n [\n 110.488137,\n 40.369563\n ],\n [\n 110.510971,\n 40.389279\n ],\n [\n 110.570222,\n 40.340589\n ],\n [\n 110.636699,\n 40.308634\n ],\n [\n 110.702021,\n 40.325399\n ],\n [\n 110.768787,\n 40.299726\n ],\n [\n 110.782371,\n 40.274042\n ],\n [\n 110.816477,\n 40.266178\n ],\n [\n 110.837287,\n 40.289943\n ],\n [\n 110.914458,\n 40.244678\n ],\n [\n 110.945963,\n 40.270373\n ],\n [\n 110.999144,\n 40.26111\n ],\n [\n 111.032961,\n 40.296931\n ],\n [\n 111.05406,\n 40.264605\n ],\n [\n 111.115624,\n 40.255866\n ],\n [\n 111.190483,\n 40.216525\n ],\n [\n 111.248289,\n 40.164561\n ],\n [\n 111.314188,\n 40.150557\n ],\n [\n 111.360433,\n 40.10187\n ],\n [\n 111.420263,\n 40.02211\n ],\n [\n 111.426332,\n 39.949983\n ],\n [\n 111.445409,\n 39.899045\n ],\n [\n 111.41506,\n 39.864772\n ],\n [\n 111.417083,\n 39.829778\n ],\n [\n 111.371417,\n 39.791775\n ],\n [\n 111.365058,\n 39.721166\n ],\n [\n 111.440784,\n 39.672526\n ],\n [\n 111.438183,\n 39.640433\n ],\n [\n 111.426622,\n 39.50343\n ],\n [\n 111.364191,\n 39.467368\n ],\n [\n 111.352341,\n 39.426689\n ],\n [\n 111.289332,\n 39.417134\n ],\n [\n 111.21216,\n 39.425627\n ],\n [\n 111.145394,\n 39.409525\n ],\n [\n 111.108109,\n 39.356593\n ],\n [\n 111.097993,\n 39.401915\n ],\n [\n 111.064466,\n 39.400854\n ],\n [\n 111.058396,\n 39.447739\n ],\n [\n 111.108976,\n 39.474264\n ],\n [\n 111.106375,\n 39.498481\n ],\n [\n 111.148863,\n 39.53223\n ],\n [\n 111.154932,\n 39.568964\n ],\n [\n 111.134411,\n 39.586441\n ],\n [\n 111.100883,\n 39.559429\n ],\n [\n 111.043655,\n 39.554661\n ],\n [\n 111.041054,\n 39.567728\n ],\n [\n 110.959258,\n 39.51951\n ],\n [\n 110.890758,\n 39.508908\n ],\n [\n 110.808095,\n 39.411826\n ],\n [\n 110.74104,\n 39.349509\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 150700,\n \"name\": \"呼伦贝尔市\",\n \"center\": [\n 119.758168,\n 49.215333\n ],\n \"centroid\": [\n 120.886666,\n 49.619014\n ],\n \"childrenNum\": 14,\n \"level\": \"city\",\n \"subFeatureIndex\": 6,\n \"acroutes\": [\n 100000,\n 150000\n ],\n \"parent\": {\n \"adcode\": 150000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 119.486254,\n 47.336721\n ],\n [\n 119.444633,\n 47.371014\n ],\n [\n 119.386827,\n 47.397532\n ],\n [\n 119.351565,\n 47.432095\n ],\n [\n 119.322084,\n 47.427136\n ],\n [\n 119.365728,\n 47.477472\n ],\n [\n 119.205316,\n 47.520335\n ],\n [\n 119.152134,\n 47.540594\n ],\n [\n 119.134214,\n 47.664452\n ],\n [\n 118.773214,\n 47.771085\n ],\n [\n 118.568002,\n 47.99213\n ],\n [\n 118.455858,\n 47.996268\n ],\n [\n 118.424354,\n 48.014811\n ],\n [\n 118.329841,\n 48.006077\n ],\n [\n 118.27637,\n 48.009295\n ],\n [\n 118.240241,\n 48.040544\n ],\n [\n 118.107576,\n 48.031049\n ],\n [\n 118.015375,\n 48.012053\n ],\n [\n 117.926353,\n 48.015883\n ],\n [\n 117.886756,\n 48.025228\n ],\n [\n 117.813342,\n 48.01619\n ],\n [\n 117.528935,\n 47.782937\n ],\n [\n 117.493674,\n 47.758461\n ],\n [\n 117.384131,\n 47.641154\n ],\n [\n 117.094811,\n 47.824013\n ],\n [\n 116.879193,\n 47.893936\n ],\n [\n 116.791328,\n 47.897622\n ],\n [\n 116.669935,\n 47.890557\n ],\n [\n 116.452872,\n 47.837544\n ],\n [\n 116.265869,\n 47.876733\n ],\n [\n 116.110949,\n 47.811709\n ],\n [\n 115.968167,\n 47.689897\n ],\n [\n 115.938975,\n 47.683113\n ],\n [\n 115.580577,\n 47.921725\n ],\n [\n 115.529418,\n 48.15527\n ],\n [\n 115.822785,\n 48.259372\n ],\n [\n 115.799373,\n 48.515059\n ],\n [\n 115.830299,\n 48.560101\n ],\n [\n 116.078288,\n 48.822421\n ],\n [\n 116.048518,\n 48.873516\n ],\n [\n 116.350845,\n 49.317592\n ],\n [\n 116.717914,\n 49.847284\n ],\n [\n 116.736701,\n 49.847579\n ],\n [\n 117.069087,\n 49.695514\n ],\n [\n 117.278056,\n 49.636364\n ],\n [\n 117.485003,\n 49.6331\n ],\n [\n 117.638189,\n 49.574914\n ],\n [\n 117.809585,\n 49.521268\n ],\n [\n 117.849471,\n 49.551442\n ],\n [\n 117.866524,\n 49.59214\n ],\n [\n 117.950921,\n 49.596\n ],\n [\n 117.980691,\n 49.621231\n ],\n [\n 118.082719,\n 49.616631\n ],\n [\n 118.118848,\n 49.666467\n ],\n [\n 118.154688,\n 49.66024\n ],\n [\n 118.185325,\n 49.687809\n ],\n [\n 118.205846,\n 49.684697\n ],\n [\n 118.220876,\n 49.730022\n ],\n [\n 118.282439,\n 49.74364\n ],\n [\n 118.315967,\n 49.767168\n ],\n [\n 118.388514,\n 49.785952\n ],\n [\n 118.402387,\n 49.811381\n ],\n [\n 118.385334,\n 49.826898\n ],\n [\n 118.469732,\n 49.825716\n ],\n [\n 118.496033,\n 49.84625\n ],\n [\n 118.485917,\n 49.866923\n ],\n [\n 118.523202,\n 49.881093\n ],\n [\n 118.572916,\n 49.930952\n ],\n [\n 118.617715,\n 49.927856\n ],\n [\n 118.651243,\n 49.950852\n ],\n [\n 118.741999,\n 49.946578\n ],\n [\n 118.763098,\n 49.959694\n ],\n [\n 118.96542,\n 49.98886\n ],\n [\n 119.050395,\n 49.980613\n ],\n [\n 119.091437,\n 49.985768\n ],\n [\n 119.123809,\n 50.018156\n ],\n [\n 119.188263,\n 50.054493\n ],\n [\n 119.189997,\n 50.085365\n ],\n [\n 119.234797,\n 50.074783\n ],\n [\n 119.290291,\n 50.121651\n ],\n [\n 119.309656,\n 50.161285\n ],\n [\n 119.34434,\n 50.163192\n ],\n [\n 119.359658,\n 50.197074\n ],\n [\n 119.318616,\n 50.220381\n ],\n [\n 119.340004,\n 50.243823\n ],\n [\n 119.347808,\n 50.298135\n ],\n [\n 119.386827,\n 50.321685\n ],\n [\n 119.358502,\n 50.358961\n ],\n [\n 119.277284,\n 50.365974\n ],\n [\n 119.237109,\n 50.346539\n ],\n [\n 119.23393,\n 50.365098\n ],\n [\n 119.195489,\n 50.349316\n ],\n [\n 119.155602,\n 50.364659\n ],\n [\n 119.176702,\n 50.378683\n ],\n [\n 119.126699,\n 50.391243\n ],\n [\n 119.164851,\n 50.422482\n ],\n [\n 119.206761,\n 50.410368\n ],\n [\n 119.239999,\n 50.459095\n ],\n [\n 119.264567,\n 50.469447\n ],\n [\n 119.238265,\n 50.505587\n ],\n [\n 119.262544,\n 50.510831\n ],\n [\n 119.26659,\n 50.56091\n ],\n [\n 119.299251,\n 50.583893\n ],\n [\n 119.282487,\n 50.604831\n ],\n [\n 119.361393,\n 50.632732\n ],\n [\n 119.394053,\n 50.667296\n ],\n [\n 119.387405,\n 50.682827\n ],\n [\n 119.433072,\n 50.684568\n ],\n [\n 119.496659,\n 50.745478\n ],\n [\n 119.515735,\n 50.814125\n ],\n [\n 119.498971,\n 50.827726\n ],\n [\n 119.491457,\n 50.878913\n ],\n [\n 119.569784,\n 50.933797\n ],\n [\n 119.598687,\n 50.984723\n ],\n [\n 119.629902,\n 51.008508\n ],\n [\n 119.683084,\n 51.018883\n ],\n [\n 119.725572,\n 51.049562\n ],\n [\n 119.722681,\n 51.076192\n ],\n [\n 119.764302,\n 51.092594\n ],\n [\n 119.785112,\n 51.163603\n ],\n [\n 119.760255,\n 51.213272\n ],\n [\n 119.786268,\n 51.225466\n ],\n [\n 119.82153,\n 51.21442\n ],\n [\n 119.797251,\n 51.247121\n ],\n [\n 119.827889,\n 51.263749\n ],\n [\n 119.810836,\n 51.278508\n ],\n [\n 119.879336,\n 51.2967\n ],\n [\n 119.883961,\n 51.336927\n ],\n [\n 119.922402,\n 51.345225\n ],\n [\n 119.945813,\n 51.365965\n ],\n [\n 119.912864,\n 51.375259\n ],\n [\n 119.922113,\n 51.396557\n ],\n [\n 119.971248,\n 51.400415\n ],\n [\n 119.982809,\n 51.444976\n ],\n [\n 120.002464,\n 51.459392\n ],\n [\n 119.987145,\n 51.506604\n ],\n [\n 120.017204,\n 51.521143\n ],\n [\n 120.052466,\n 51.560887\n ],\n [\n 120.035124,\n 51.585799\n ],\n [\n 120.06605,\n 51.639135\n ],\n [\n 120.102179,\n 51.650221\n ],\n [\n 120.094375,\n 51.682043\n ],\n [\n 120.172414,\n 51.679913\n ],\n [\n 120.226174,\n 51.717674\n ],\n [\n 120.293518,\n 51.750724\n ],\n [\n 120.311149,\n 51.781767\n ],\n [\n 120.363463,\n 51.789985\n ],\n [\n 120.406818,\n 51.81647\n ],\n [\n 120.400459,\n 51.833457\n ],\n [\n 120.459422,\n 51.845062\n ],\n [\n 120.496996,\n 51.88735\n ],\n [\n 120.533414,\n 51.87915\n ],\n [\n 120.547865,\n 51.907137\n ],\n [\n 120.660876,\n 51.929458\n ],\n [\n 120.661165,\n 51.955578\n ],\n [\n 120.701341,\n 51.980555\n ],\n [\n 120.71955,\n 52.010171\n ],\n [\n 120.686022,\n 52.034976\n ],\n [\n 120.698739,\n 52.056107\n ],\n [\n 120.769552,\n 52.114093\n ],\n [\n 120.763193,\n 52.142777\n ],\n [\n 120.785738,\n 52.165542\n ],\n [\n 120.747008,\n 52.20402\n ],\n [\n 120.758569,\n 52.256346\n ],\n [\n 120.717526,\n 52.260833\n ],\n [\n 120.696138,\n 52.289842\n ],\n [\n 120.628505,\n 52.322753\n ],\n [\n 120.624169,\n 52.361514\n ],\n [\n 120.649315,\n 52.363752\n ],\n [\n 120.648448,\n 52.389619\n ],\n [\n 120.690069,\n 52.430416\n ],\n [\n 120.683132,\n 52.466571\n ],\n [\n 120.706543,\n 52.490147\n ],\n [\n 120.692959,\n 52.518309\n ],\n [\n 120.73429,\n 52.536842\n ],\n [\n 120.629372,\n 52.570265\n ],\n [\n 120.596711,\n 52.592811\n ],\n [\n 120.561161,\n 52.595594\n ],\n [\n 120.4837,\n 52.630084\n ],\n [\n 120.437166,\n 52.639675\n ],\n [\n 120.396702,\n 52.616319\n ],\n [\n 120.286292,\n 52.622993\n ],\n [\n 120.185998,\n 52.579312\n ],\n [\n 120.080502,\n 52.585436\n ],\n [\n 120.049287,\n 52.598515\n ],\n [\n 120.035124,\n 52.646346\n ],\n [\n 120.070675,\n 52.707587\n ],\n [\n 120.031367,\n 52.772762\n ],\n [\n 120.099,\n 52.787309\n ],\n [\n 120.141198,\n 52.812927\n ],\n [\n 120.187732,\n 52.807943\n ],\n [\n 120.222416,\n 52.842819\n ],\n [\n 120.296986,\n 52.869926\n ],\n [\n 120.294963,\n 52.890659\n ],\n [\n 120.344676,\n 52.900884\n ],\n [\n 120.363174,\n 52.941345\n ],\n [\n 120.408263,\n 52.956387\n ],\n [\n 120.453063,\n 53.010028\n ],\n [\n 120.529078,\n 53.045981\n ],\n [\n 120.541507,\n 53.070346\n ],\n [\n 120.611163,\n 53.100336\n ],\n [\n 120.642089,\n 53.105149\n ],\n [\n 120.660009,\n 53.137038\n ],\n [\n 120.686889,\n 53.142396\n ],\n [\n 120.690936,\n 53.172611\n ],\n [\n 120.748164,\n 53.210349\n ],\n [\n 120.814063,\n 53.239692\n ],\n [\n 120.840076,\n 53.241063\n ],\n [\n 120.822734,\n 53.270112\n ],\n [\n 120.93112,\n 53.286957\n ],\n [\n 120.954821,\n 53.298594\n ],\n [\n 121.047022,\n 53.288874\n ],\n [\n 121.096735,\n 53.307354\n ],\n [\n 121.129396,\n 53.277371\n ],\n [\n 121.153674,\n 53.285314\n ],\n [\n 121.234603,\n 53.280932\n ],\n [\n 121.285473,\n 53.291338\n ],\n [\n 121.329405,\n 53.322816\n ],\n [\n 121.416115,\n 53.319395\n ],\n [\n 121.499356,\n 53.337178\n ],\n [\n 121.511495,\n 53.31748\n ],\n [\n 121.579706,\n 53.289285\n ],\n [\n 121.615257,\n 53.259016\n ],\n [\n 121.648207,\n 53.260797\n ],\n [\n 121.678844,\n 53.241337\n ],\n [\n 121.679133,\n 53.199511\n ],\n [\n 121.665259,\n 53.170551\n ],\n [\n 121.719597,\n 53.146243\n ],\n [\n 121.753125,\n 53.147342\n ],\n [\n 121.784629,\n 53.104599\n ],\n [\n 121.775669,\n 53.089746\n ],\n [\n 121.814978,\n 53.069108\n ],\n [\n 121.785496,\n 53.018571\n ],\n [\n 121.715551,\n 52.998037\n ],\n [\n 121.677399,\n 52.948108\n ],\n [\n 121.662369,\n 52.912487\n ],\n [\n 121.610344,\n 52.892317\n ],\n [\n 121.620171,\n 52.851119\n ],\n [\n 121.591268,\n 52.824693\n ],\n [\n 121.482014,\n 52.774286\n ],\n [\n 121.454845,\n 52.735333\n ],\n [\n 121.373049,\n 52.683157\n ],\n [\n 121.321023,\n 52.678852\n ],\n [\n 121.292698,\n 52.651765\n ],\n [\n 121.182289,\n 52.596289\n ],\n [\n 121.232002,\n 52.577642\n ],\n [\n 121.277091,\n 52.587662\n ],\n [\n 121.325648,\n 52.572631\n ],\n [\n 121.353106,\n 52.535728\n ],\n [\n 121.409756,\n 52.523466\n ],\n [\n 121.416404,\n 52.49935\n ],\n [\n 121.49502,\n 52.484847\n ],\n [\n 121.518721,\n 52.456663\n ],\n [\n 121.565255,\n 52.460292\n ],\n [\n 121.5904,\n 52.443123\n ],\n [\n 121.640114,\n 52.444379\n ],\n [\n 121.678844,\n 52.419801\n ],\n [\n 121.658612,\n 52.390318\n ],\n [\n 121.715551,\n 52.343047\n ],\n [\n 121.714106,\n 52.318133\n ],\n [\n 121.769311,\n 52.308191\n ],\n [\n 121.841279,\n 52.282697\n ],\n [\n 121.90082,\n 52.280595\n ],\n [\n 121.947643,\n 52.298387\n ],\n [\n 121.976835,\n 52.343747\n ],\n [\n 122.035508,\n 52.377596\n ],\n [\n 122.040422,\n 52.413096\n ],\n [\n 122.091291,\n 52.427204\n ],\n [\n 122.16933,\n 52.51357\n ],\n [\n 122.207771,\n 52.469222\n ],\n [\n 122.310377,\n 52.475222\n ],\n [\n 122.34217,\n 52.414074\n ],\n [\n 122.367027,\n 52.413794\n ],\n [\n 122.416451,\n 52.37424\n ],\n [\n 122.439863,\n 52.393672\n ],\n [\n 122.484085,\n 52.341508\n ],\n [\n 122.478304,\n 52.296286\n ],\n [\n 122.560678,\n 52.282557\n ],\n [\n 122.585824,\n 52.26644\n ],\n [\n 122.678892,\n 52.276671\n ],\n [\n 122.710685,\n 52.256206\n ],\n [\n 122.760976,\n 52.26686\n ],\n [\n 122.787278,\n 52.252701\n ],\n [\n 122.766179,\n 52.232646\n ],\n [\n 122.769358,\n 52.179729\n ],\n [\n 122.738143,\n 52.153458\n ],\n [\n 122.690742,\n 52.140387\n ],\n [\n 122.629178,\n 52.136592\n ],\n [\n 122.643919,\n 52.111702\n ],\n [\n 122.625132,\n 52.067513\n ],\n [\n 122.650567,\n 52.059064\n ],\n [\n 122.665018,\n 51.99875\n ],\n [\n 122.683805,\n 51.974489\n ],\n [\n 122.726293,\n 51.978862\n ],\n [\n 122.729472,\n 51.919288\n ],\n [\n 122.706061,\n 51.890177\n ],\n [\n 122.725715,\n 51.87816\n ],\n [\n 122.732651,\n 51.832608\n ],\n [\n 122.77196,\n 51.7795\n ],\n [\n 122.749993,\n 51.747746\n ],\n [\n 122.77485,\n 51.703907\n ],\n [\n 122.816181,\n 51.655195\n ],\n [\n 122.820806,\n 51.633165\n ],\n [\n 122.856357,\n 51.606714\n ],\n [\n 122.832656,\n 51.581672\n ],\n [\n 122.873988,\n 51.561172\n ],\n [\n 122.880057,\n 51.511023\n ],\n [\n 122.854623,\n 51.477655\n ],\n [\n 122.900289,\n 51.445261\n ],\n [\n 122.898555,\n 51.422558\n ],\n [\n 122.965899,\n 51.386981\n ],\n [\n 122.960119,\n 51.361675\n ],\n [\n 122.978039,\n 51.331489\n ],\n [\n 123.014457,\n 51.310018\n ],\n [\n 123.059257,\n 51.3219\n ],\n [\n 123.15377,\n 51.300853\n ],\n [\n 123.231519,\n 51.268621\n ],\n [\n 123.294239,\n 51.254145\n ],\n [\n 123.339617,\n 51.27249\n ],\n [\n 123.4402,\n 51.270914\n ],\n [\n 123.465345,\n 51.28739\n ],\n [\n 123.588472,\n 51.142484\n ],\n [\n 123.736456,\n 50.974052\n ],\n [\n 123.772007,\n 50.906507\n ],\n [\n 123.792817,\n 50.891773\n ],\n [\n 123.795419,\n 50.83033\n ],\n [\n 123.825767,\n 50.813835\n ],\n [\n 123.872301,\n 50.765185\n ],\n [\n 124.027511,\n 50.619074\n ],\n [\n 124.020574,\n 50.598143\n ],\n [\n 124.076646,\n 50.564111\n ],\n [\n 124.087051,\n 50.539953\n ],\n [\n 124.026355,\n 50.538352\n ],\n [\n 124.023464,\n 50.51855\n ],\n [\n 123.983578,\n 50.510249\n ],\n [\n 124.003521,\n 50.478922\n ],\n [\n 124.005255,\n 50.434592\n ],\n [\n 123.969994,\n 50.399274\n ],\n [\n 123.939934,\n 50.397376\n ],\n [\n 123.92028,\n 50.372987\n ],\n [\n 123.879527,\n 50.402486\n ],\n [\n 123.840508,\n 50.411536\n ],\n [\n 123.825767,\n 50.449471\n ],\n [\n 123.780389,\n 50.437072\n ],\n [\n 123.787326,\n 50.373717\n ],\n [\n 123.777788,\n 50.344493\n ],\n [\n 123.870278,\n 50.273988\n ],\n [\n 123.862763,\n 50.226389\n ],\n [\n 123.954097,\n 50.186956\n ],\n [\n 124.007568,\n 50.219355\n ],\n [\n 124.061905,\n 50.19898\n ],\n [\n 124.103526,\n 50.222139\n ],\n [\n 124.102659,\n 50.238696\n ],\n [\n 124.189368,\n 50.216864\n ],\n [\n 124.283014,\n 50.230785\n ],\n [\n 124.286483,\n 50.189596\n ],\n [\n 124.327525,\n 50.178449\n ],\n [\n 124.359607,\n 50.199127\n ],\n [\n 124.344289,\n 50.219062\n ],\n [\n 124.368567,\n 50.258176\n ],\n [\n 124.348624,\n 50.292429\n ],\n [\n 124.374059,\n 50.310862\n ],\n [\n 124.347757,\n 50.316566\n ],\n [\n 124.364232,\n 50.360861\n ],\n [\n 124.403829,\n 50.362468\n ],\n [\n 124.439958,\n 50.388615\n ],\n [\n 124.499499,\n 50.398106\n ],\n [\n 124.504701,\n 50.342592\n ],\n [\n 124.578693,\n 50.294623\n ],\n [\n 124.592278,\n 50.243676\n ],\n [\n 124.619735,\n 50.229613\n ],\n [\n 124.575514,\n 50.179623\n ],\n [\n 124.508169,\n 50.162606\n ],\n [\n 124.533315,\n 50.149398\n ],\n [\n 124.555282,\n 50.106229\n ],\n [\n 124.604995,\n 50.07052\n ],\n [\n 124.63939,\n 50.069931\n ],\n [\n 124.680721,\n 50.031693\n ],\n [\n 124.650373,\n 49.99475\n ],\n [\n 124.670894,\n 49.95041\n ],\n [\n 124.66598,\n 49.868104\n ],\n [\n 124.711069,\n 49.82276\n ],\n [\n 124.730723,\n 49.817441\n ],\n [\n 124.720318,\n 49.775008\n ],\n [\n 124.67494,\n 49.774712\n ],\n [\n 124.741418,\n 49.76125\n ],\n [\n 124.82408,\n 49.849942\n ],\n [\n 124.878707,\n 49.834876\n ],\n [\n 124.972642,\n 49.83458\n ],\n [\n 124.97033,\n 49.853339\n ],\n [\n 124.935357,\n 49.866627\n ],\n [\n 124.977267,\n 49.900719\n ],\n [\n 125.0449,\n 49.826898\n ],\n [\n 125.09577,\n 49.795859\n ],\n [\n 125.177855,\n 49.829409\n ],\n [\n 125.222943,\n 49.798964\n ],\n [\n 125.228146,\n 49.774564\n ],\n [\n 125.205313,\n 49.733575\n ],\n [\n 125.224967,\n 49.726468\n ],\n [\n 125.219764,\n 49.669135\n ],\n [\n 125.189994,\n 49.649861\n ],\n [\n 125.164559,\n 49.669431\n ],\n [\n 125.127274,\n 49.655051\n ],\n [\n 125.154154,\n 49.61678\n ],\n [\n 125.168317,\n 49.629985\n ],\n [\n 125.205313,\n 49.59407\n ],\n [\n 125.226412,\n 49.596\n ],\n [\n 125.235661,\n 49.540891\n ],\n [\n 125.212538,\n 49.541337\n ],\n [\n 125.228435,\n 49.48691\n ],\n [\n 125.263986,\n 49.46146\n ],\n [\n 125.257049,\n 49.393976\n ],\n [\n 125.258205,\n 49.314008\n ],\n [\n 125.214851,\n 49.280252\n ],\n [\n 125.233638,\n 49.255442\n ],\n [\n 125.219475,\n 49.189023\n ],\n [\n 125.185369,\n 49.18528\n ],\n [\n 125.160224,\n 49.146342\n ],\n [\n 125.117447,\n 49.125962\n ],\n [\n 125.039409,\n 49.151885\n ],\n [\n 125.039987,\n 49.176297\n ],\n [\n 124.982759,\n 49.16252\n ],\n [\n 124.906454,\n 49.183933\n ],\n [\n 124.860787,\n 49.166564\n ],\n [\n 124.847492,\n 49.129709\n ],\n [\n 124.80934,\n 49.115918\n ],\n [\n 124.828994,\n 49.071974\n ],\n [\n 124.808184,\n 49.020481\n ],\n [\n 124.765407,\n 48.981263\n ],\n [\n 124.744308,\n 48.920496\n ],\n [\n 124.711936,\n 48.921248\n ],\n [\n 124.714827,\n 48.886771\n ],\n [\n 124.697196,\n 48.841871\n ],\n [\n 124.65413,\n 48.834333\n ],\n [\n 124.653552,\n 48.777161\n ],\n [\n 124.613955,\n 48.751193\n ],\n [\n 124.624938,\n 48.700276\n ],\n [\n 124.601816,\n 48.632356\n ],\n [\n 124.578982,\n 48.596468\n ],\n [\n 124.518575,\n 48.554188\n ],\n [\n 124.548923,\n 48.531291\n ],\n [\n 124.534471,\n 48.51779\n ],\n [\n 124.553258,\n 48.46527\n ],\n [\n 124.508748,\n 48.448257\n ],\n [\n 124.526378,\n 48.421664\n ],\n [\n 124.52002,\n 48.374521\n ],\n [\n 124.5469,\n 48.357631\n ],\n [\n 124.541119,\n 48.335253\n ],\n [\n 124.57956,\n 48.297479\n ],\n [\n 124.55875,\n 48.268215\n ],\n [\n 124.578982,\n 48.262116\n ],\n [\n 124.547189,\n 48.200936\n ],\n [\n 124.512505,\n 48.16459\n ],\n [\n 124.531003,\n 48.148699\n ],\n [\n 124.488515,\n 48.126383\n ],\n [\n 124.463948,\n 48.097633\n ],\n [\n 124.416258,\n 48.087995\n ],\n [\n 124.430131,\n 48.121032\n ],\n [\n 124.472619,\n 48.134485\n ],\n [\n 124.476954,\n 48.164131\n ],\n [\n 124.410477,\n 48.190401\n ],\n [\n 124.428397,\n 48.230086\n ],\n [\n 124.404985,\n 48.264251\n ],\n [\n 124.365099,\n 48.284678\n ],\n [\n 124.35585,\n 48.314846\n ],\n [\n 124.318854,\n 48.347128\n ],\n [\n 124.33215,\n 48.379238\n ],\n [\n 124.306715,\n 48.399619\n ],\n [\n 124.330126,\n 48.435646\n ],\n [\n 124.302668,\n 48.456764\n ],\n [\n 124.31423,\n 48.50383\n ],\n [\n 124.259025,\n 48.536447\n ],\n [\n 124.24255,\n 48.522189\n ],\n [\n 124.083294,\n 48.438533\n ],\n [\n 123.979821,\n 48.363718\n ],\n [\n 123.866231,\n 48.27477\n ],\n [\n 123.746283,\n 48.197577\n ],\n [\n 123.705241,\n 48.152061\n ],\n [\n 123.61911,\n 48.077896\n ],\n [\n 123.537603,\n 48.021858\n ],\n [\n 123.300308,\n 47.953642\n ],\n [\n 123.254642,\n 47.874736\n ],\n [\n 123.221692,\n 47.832624\n ],\n [\n 123.165042,\n 47.783091\n ],\n [\n 123.031221,\n 47.741829\n ],\n [\n 122.980929,\n 47.717179\n ],\n [\n 122.857513,\n 47.678333\n ],\n [\n 122.765023,\n 47.61445\n ],\n [\n 122.593049,\n 47.547088\n ],\n [\n 122.543336,\n 47.495426\n ],\n [\n 122.506918,\n 47.401408\n ],\n [\n 122.418186,\n 47.350534\n ],\n [\n 122.308932,\n 47.304271\n ],\n [\n 122.256906,\n 47.260299\n ],\n [\n 122.209505,\n 47.236199\n ],\n [\n 122.146207,\n 47.222201\n ],\n [\n 122.084644,\n 47.180652\n ],\n [\n 122.042156,\n 47.204154\n ],\n [\n 121.840123,\n 47.265739\n ],\n [\n 121.760351,\n 47.280968\n ],\n [\n 121.674219,\n 47.249883\n ],\n [\n 121.639825,\n 47.203064\n ],\n [\n 121.648785,\n 47.179406\n ],\n [\n 121.588955,\n 47.1724\n ],\n [\n 121.551092,\n 47.197773\n ],\n [\n 121.488661,\n 47.183765\n ],\n [\n 121.437503,\n 47.184232\n ],\n [\n 121.368136,\n 47.135175\n ],\n [\n 121.329405,\n 47.136577\n ],\n [\n 121.246453,\n 47.112577\n ],\n [\n 121.172461,\n 47.141251\n ],\n [\n 121.098469,\n 47.151999\n ],\n [\n 121.018119,\n 47.129253\n ],\n [\n 120.976787,\n 47.09652\n ],\n [\n 120.945861,\n 47.099014\n ],\n [\n 120.876494,\n 47.149819\n ],\n [\n 120.823312,\n 47.145613\n ],\n [\n 120.773888,\n 47.176915\n ],\n [\n 120.739204,\n 47.217379\n ],\n [\n 120.623302,\n 47.244285\n ],\n [\n 120.624748,\n 47.300698\n ],\n [\n 120.708277,\n 47.337342\n ],\n [\n 120.733134,\n 47.357672\n ],\n [\n 120.732556,\n 47.384972\n ],\n [\n 120.703364,\n 47.408539\n ],\n [\n 120.725619,\n 47.441545\n ],\n [\n 120.643535,\n 47.506877\n ],\n [\n 120.593532,\n 47.488617\n ],\n [\n 120.582549,\n 47.505329\n ],\n [\n 120.604226,\n 47.532244\n ],\n [\n 120.581104,\n 47.548479\n ],\n [\n 120.525321,\n 47.544769\n ],\n [\n 120.52561,\n 47.574599\n ],\n [\n 120.385719,\n 47.620317\n ],\n [\n 120.344387,\n 47.602405\n ],\n [\n 120.265193,\n 47.65643\n ],\n [\n 120.230509,\n 47.623713\n ],\n [\n 120.200161,\n 47.632975\n ],\n [\n 120.188022,\n 47.615222\n ],\n [\n 120.11403,\n 47.597926\n ],\n [\n 120.023852,\n 47.554044\n ],\n [\n 119.958242,\n 47.581552\n ],\n [\n 119.904482,\n 47.5678\n ],\n [\n 119.853034,\n 47.520954\n ],\n [\n 119.814015,\n 47.49914\n ],\n [\n 119.814304,\n 47.474995\n ],\n [\n 119.764013,\n 47.436123\n ],\n [\n 119.657938,\n 47.410554\n ],\n [\n 119.616896,\n 47.361706\n ],\n [\n 119.486254,\n 47.336721\n ]\n ]\n ],\n [\n [\n [\n 125.177855,\n 49.829409\n ],\n [\n 125.09577,\n 49.795859\n ],\n [\n 125.0449,\n 49.826898\n ],\n [\n 124.977267,\n 49.900719\n ],\n [\n 124.935357,\n 49.866627\n ],\n [\n 124.97033,\n 49.853339\n ],\n [\n 124.972642,\n 49.83458\n ],\n [\n 124.878707,\n 49.834876\n ],\n [\n 124.82408,\n 49.849942\n ],\n [\n 124.741418,\n 49.76125\n ],\n [\n 124.67494,\n 49.774712\n ],\n [\n 124.720318,\n 49.775008\n ],\n [\n 124.730723,\n 49.817441\n ],\n [\n 124.711069,\n 49.82276\n ],\n [\n 124.66598,\n 49.868104\n ],\n [\n 124.670894,\n 49.95041\n ],\n [\n 124.650373,\n 49.99475\n ],\n [\n 124.680721,\n 50.031693\n ],\n [\n 124.63939,\n 50.069931\n ],\n [\n 124.604995,\n 50.07052\n ],\n [\n 124.555282,\n 50.106229\n ],\n [\n 124.533315,\n 50.149398\n ],\n [\n 124.508169,\n 50.162606\n ],\n [\n 124.575514,\n 50.179623\n ],\n [\n 124.619735,\n 50.229613\n ],\n [\n 124.592278,\n 50.243676\n ],\n [\n 124.578693,\n 50.294623\n ],\n [\n 124.504701,\n 50.342592\n ],\n [\n 124.499499,\n 50.398106\n ],\n [\n 124.439958,\n 50.388615\n ],\n [\n 124.416547,\n 50.449617\n ],\n [\n 124.444872,\n 50.476298\n ],\n [\n 124.43331,\n 50.546649\n ],\n [\n 124.393135,\n 50.547522\n ],\n [\n 124.315964,\n 50.532674\n ],\n [\n 124.266539,\n 50.556254\n ],\n [\n 124.183009,\n 50.557709\n ],\n [\n 124.110174,\n 50.569785\n ],\n [\n 124.076646,\n 50.564111\n ],\n [\n 124.020574,\n 50.598143\n ],\n [\n 124.027511,\n 50.619074\n ],\n [\n 123.872301,\n 50.765185\n ],\n [\n 123.825767,\n 50.813835\n ],\n [\n 123.795419,\n 50.83033\n ],\n [\n 123.792817,\n 50.891773\n ],\n [\n 123.772007,\n 50.906507\n ],\n [\n 123.736456,\n 50.974052\n ],\n [\n 123.588472,\n 51.142484\n ],\n [\n 123.465345,\n 51.28739\n ],\n [\n 123.582692,\n 51.294695\n ],\n [\n 123.582403,\n 51.306868\n ],\n [\n 123.661886,\n 51.31918\n ],\n [\n 123.660441,\n 51.342793\n ],\n [\n 123.711022,\n 51.398272\n ],\n [\n 123.794552,\n 51.361246\n ],\n [\n 123.842531,\n 51.367538\n ],\n [\n 123.88762,\n 51.320898\n ],\n [\n 123.926061,\n 51.30071\n ],\n [\n 123.994561,\n 51.322758\n ],\n [\n 124.071733,\n 51.320754\n ],\n [\n 124.090231,\n 51.341362\n ],\n [\n 124.128094,\n 51.347514\n ],\n [\n 124.192548,\n 51.339359\n ],\n [\n 124.239371,\n 51.344653\n ],\n [\n 124.271453,\n 51.308299\n ],\n [\n 124.311628,\n 51.289539\n ],\n [\n 124.339375,\n 51.293406\n ],\n [\n 124.406431,\n 51.27206\n ],\n [\n 124.430131,\n 51.301283\n ],\n [\n 124.426663,\n 51.331918\n ],\n [\n 124.443716,\n 51.358099\n ],\n [\n 124.49025,\n 51.380406\n ],\n [\n 124.55586,\n 51.375402\n ],\n [\n 124.587075,\n 51.363677\n ],\n [\n 124.624649,\n 51.328627\n ],\n [\n 124.693438,\n 51.332777\n ],\n [\n 124.751245,\n 51.356955\n ],\n [\n 124.783616,\n 51.392269\n ],\n [\n 124.864545,\n 51.379691\n ],\n [\n 124.885066,\n 51.408131\n ],\n [\n 124.942583,\n 51.447403\n ],\n [\n 124.917727,\n 51.474231\n ],\n [\n 124.92871,\n 51.498477\n ],\n [\n 124.983626,\n 51.508315\n ],\n [\n 125.004436,\n 51.529266\n ],\n [\n 125.047502,\n 51.529693\n ],\n [\n 125.072936,\n 51.553482\n ],\n [\n 125.05993,\n 51.596756\n ],\n [\n 125.098949,\n 51.658321\n ],\n [\n 125.12843,\n 51.659031\n ],\n [\n 125.130453,\n 51.635439\n ],\n [\n 125.17612,\n 51.639277\n ],\n [\n 125.289132,\n 51.633875\n ],\n [\n 125.316011,\n 51.609986\n ],\n [\n 125.351562,\n 51.623923\n ],\n [\n 125.379598,\n 51.586795\n ],\n [\n 125.424687,\n 51.563023\n ],\n [\n 125.524114,\n 51.49149\n ],\n [\n 125.625853,\n 51.379262\n ],\n [\n 125.669496,\n 51.343222\n ],\n [\n 125.695509,\n 51.337785\n ],\n [\n 125.711117,\n 51.302715\n ],\n [\n 125.76401,\n 51.261455\n ],\n [\n 125.75794,\n 51.227331\n ],\n [\n 125.817769,\n 51.227044\n ],\n [\n 125.851875,\n 51.212555\n ],\n [\n 125.868928,\n 51.140328\n ],\n [\n 125.908814,\n 51.139179\n ],\n [\n 125.946388,\n 51.108128\n ],\n [\n 125.990032,\n 51.119199\n ],\n [\n 125.976158,\n 51.084538\n ],\n [\n 126.009108,\n 51.057193\n ],\n [\n 126.057087,\n 51.045242\n ],\n [\n 126.033676,\n 51.010525\n ],\n [\n 126.072695,\n 50.979243\n ],\n [\n 126.044081,\n 50.928022\n ],\n [\n 126.021247,\n 50.927878\n ],\n [\n 125.995524,\n 50.897118\n ],\n [\n 125.996391,\n 50.871542\n ],\n [\n 125.958817,\n 50.900296\n ],\n [\n 125.945521,\n 50.855495\n ],\n [\n 125.906791,\n 50.855206\n ],\n [\n 125.920375,\n 50.831343\n ],\n [\n 125.878466,\n 50.816585\n ],\n [\n 125.889449,\n 50.804862\n ],\n [\n 125.838869,\n 50.794439\n ],\n [\n 125.840025,\n 50.756202\n ],\n [\n 125.805341,\n 50.772717\n ],\n [\n 125.758518,\n 50.747217\n ],\n [\n 125.794647,\n 50.739971\n ],\n [\n 125.782219,\n 50.724024\n ],\n [\n 125.825284,\n 50.70488\n ],\n [\n 125.787421,\n 50.678037\n ],\n [\n 125.792913,\n 50.644208\n ],\n [\n 125.829331,\n 50.561637\n ],\n [\n 125.752737,\n 50.506898\n ],\n [\n 125.740598,\n 50.523356\n ],\n [\n 125.654467,\n 50.471197\n ],\n [\n 125.632211,\n 50.443928\n ],\n [\n 125.59088,\n 50.452242\n ],\n [\n 125.561977,\n 50.438239\n ],\n [\n 125.574694,\n 50.401318\n ],\n [\n 125.536542,\n 50.420001\n ],\n [\n 125.513131,\n 50.409347\n ],\n [\n 125.537409,\n 50.379852\n ],\n [\n 125.522669,\n 50.367143\n ],\n [\n 125.530473,\n 50.331043\n ],\n [\n 125.466308,\n 50.297403\n ],\n [\n 125.466019,\n 50.266961\n ],\n [\n 125.442896,\n 50.26169\n ],\n [\n 125.464573,\n 50.229906\n ],\n [\n 125.388558,\n 50.178449\n ],\n [\n 125.33422,\n 50.164953\n ],\n [\n 125.375841,\n 50.137362\n ],\n [\n 125.313121,\n 50.139417\n ],\n [\n 125.27757,\n 50.12635\n ],\n [\n 125.257627,\n 50.100794\n ],\n [\n 125.289132,\n 50.091243\n ],\n [\n 125.278726,\n 50.071843\n ],\n [\n 125.337689,\n 50.05964\n ],\n [\n 125.316011,\n 50.045669\n ],\n [\n 125.285663,\n 50.058757\n ],\n [\n 125.256182,\n 50.039049\n ],\n [\n 125.286819,\n 50.034489\n ],\n [\n 125.296646,\n 50.009472\n ],\n [\n 125.242019,\n 49.987829\n ],\n [\n 125.231614,\n 49.957631\n ],\n [\n 125.189994,\n 49.959841\n ],\n [\n 125.225545,\n 49.924612\n ],\n [\n 125.212827,\n 49.907209\n ],\n [\n 125.24173,\n 49.866775\n ],\n [\n 125.2241,\n 49.835762\n ],\n [\n 125.177855,\n 49.829409\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 150800,\n \"name\": \"巴彦淖尔市\",\n \"center\": [\n 107.416959,\n 40.757402\n ],\n \"centroid\": [\n 107.572978,\n 41.453196\n ],\n \"childrenNum\": 7,\n \"level\": \"city\",\n \"subFeatureIndex\": 7,\n \"acroutes\": [\n 100000,\n 150000\n ],\n \"parent\": {\n \"adcode\": 150000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 106.866578,\n 40.181012\n ],\n [\n 106.740271,\n 40.196234\n ],\n [\n 106.705587,\n 40.262158\n ],\n [\n 106.765706,\n 40.29466\n ],\n [\n 106.820044,\n 40.355252\n ],\n [\n 106.672349,\n 40.375845\n ],\n [\n 106.604426,\n 40.377764\n ],\n [\n 106.528122,\n 40.365375\n ],\n [\n 106.476386,\n 40.319113\n ],\n [\n 106.426961,\n 40.339542\n ],\n [\n 106.32002,\n 40.34024\n ],\n [\n 106.219148,\n 40.461289\n ],\n [\n 106.197182,\n 40.515637\n ],\n [\n 106.268283,\n 40.519294\n ],\n [\n 106.282446,\n 40.548539\n ],\n [\n 106.34979,\n 40.527999\n ],\n [\n 106.37956,\n 40.501009\n ],\n [\n 106.482455,\n 40.502925\n ],\n [\n 106.467137,\n 40.546276\n ],\n [\n 106.321754,\n 40.589425\n ],\n [\n 106.273197,\n 40.591165\n ],\n [\n 106.235334,\n 40.626636\n ],\n [\n 106.237935,\n 40.661221\n ],\n [\n 106.161631,\n 40.68502\n ],\n [\n 106.115097,\n 40.717838\n ],\n [\n 105.944279,\n 40.739534\n ],\n [\n 105.835604,\n 40.781864\n ],\n [\n 105.781266,\n 40.785333\n ],\n [\n 105.697447,\n 40.811168\n ],\n [\n 105.636461,\n 40.854492\n ],\n [\n 105.559001,\n 40.89017\n ],\n [\n 105.503507,\n 40.927559\n ],\n [\n 105.395409,\n 40.984987\n ],\n [\n 105.403213,\n 41.015756\n ],\n [\n 105.379224,\n 41.059464\n ],\n [\n 105.31766,\n 41.113153\n ],\n [\n 105.334424,\n 41.131442\n ],\n [\n 105.317082,\n 41.201446\n ],\n [\n 105.245691,\n 41.32403\n ],\n [\n 105.222858,\n 41.396748\n ],\n [\n 105.201759,\n 41.542456\n ],\n [\n 105.226326,\n 41.67877\n ],\n [\n 105.226615,\n 41.748186\n ],\n [\n 105.291647,\n 41.749894\n ],\n [\n 105.385293,\n 41.79721\n ],\n [\n 105.589638,\n 41.888498\n ],\n [\n 105.741669,\n 41.94934\n ],\n [\n 106.013069,\n 42.032075\n ],\n [\n 106.344877,\n 42.149523\n ],\n [\n 106.613097,\n 42.241832\n ],\n [\n 106.785938,\n 42.291494\n ],\n [\n 107.051269,\n 42.319275\n ],\n [\n 107.271799,\n 42.364138\n ],\n [\n 107.304171,\n 42.412689\n ],\n [\n 107.466317,\n 42.458837\n ],\n [\n 107.501868,\n 42.456809\n ],\n [\n 107.574415,\n 42.413027\n ],\n [\n 107.732804,\n 42.414887\n ],\n [\n 107.939172,\n 42.403726\n ],\n [\n 108.022413,\n 42.433316\n ],\n [\n 108.089179,\n 42.436359\n ],\n [\n 108.23803,\n 42.460358\n ],\n [\n 108.298438,\n 42.438387\n ],\n [\n 108.532842,\n 42.442951\n ],\n [\n 108.704816,\n 42.413365\n ],\n [\n 108.798751,\n 42.415225\n ],\n [\n 108.845574,\n 42.395776\n ],\n [\n 108.983153,\n 42.448866\n ],\n [\n 109.02564,\n 42.458499\n ],\n [\n 109.291549,\n 42.435852\n ],\n [\n 109.379414,\n 42.447345\n ],\n [\n 109.433463,\n 42.427737\n ],\n [\n 109.445313,\n 42.379198\n ],\n [\n 109.477396,\n 42.345181\n ],\n [\n 109.472482,\n 42.314363\n ],\n [\n 109.508611,\n 42.263702\n ],\n [\n 109.539248,\n 42.147315\n ],\n [\n 109.515548,\n 42.139333\n ],\n [\n 109.48809,\n 42.077312\n ],\n [\n 109.375079,\n 41.932985\n ],\n [\n 109.337216,\n 41.898727\n ],\n [\n 109.263513,\n 41.889521\n ],\n [\n 109.259177,\n 41.868374\n ],\n [\n 109.292127,\n 41.854557\n ],\n [\n 109.317272,\n 41.80865\n ],\n [\n 109.367853,\n 41.765784\n ],\n [\n 109.341551,\n 41.742546\n ],\n [\n 109.395022,\n 41.697926\n ],\n [\n 109.423636,\n 41.634448\n ],\n [\n 109.428838,\n 41.552055\n ],\n [\n 109.478263,\n 41.499584\n ],\n [\n 109.66411,\n 41.49907\n ],\n [\n 109.63116,\n 41.426637\n ],\n [\n 109.698794,\n 41.379393\n ],\n [\n 109.696192,\n 41.322998\n ],\n [\n 109.641565,\n 41.31801\n ],\n [\n 109.620466,\n 41.275506\n ],\n [\n 109.667578,\n 41.199723\n ],\n [\n 109.709488,\n 41.152486\n ],\n [\n 109.724806,\n 41.115224\n ],\n [\n 109.657462,\n 41.115914\n ],\n [\n 109.688099,\n 41.07725\n ],\n [\n 109.698794,\n 41.036663\n ],\n [\n 109.735211,\n 41.036318\n ],\n [\n 109.759779,\n 40.999509\n ],\n [\n 109.79822,\n 41.008151\n ],\n [\n 109.8251,\n 40.994496\n ],\n [\n 109.835216,\n 40.945727\n ],\n [\n 109.886953,\n 40.924271\n ],\n [\n 109.867299,\n 40.878049\n ],\n [\n 109.869322,\n 40.841324\n ],\n [\n 109.841575,\n 40.835606\n ],\n [\n 109.79822,\n 40.795911\n ],\n [\n 109.795908,\n 40.76157\n ],\n [\n 109.635496,\n 40.738666\n ],\n [\n 109.545607,\n 40.742831\n ],\n [\n 109.528554,\n 40.732592\n ],\n [\n 109.47913,\n 40.749945\n ],\n [\n 109.41641,\n 40.708463\n ],\n [\n 109.407739,\n 40.628027\n ],\n [\n 109.445602,\n 40.540184\n ],\n [\n 109.437509,\n 40.513722\n ],\n [\n 109.419879,\n 40.473312\n ],\n [\n 109.322475,\n 40.484636\n ],\n [\n 109.157149,\n 40.53357\n ],\n [\n 109.088938,\n 40.532699\n ],\n [\n 109.053387,\n 40.550801\n ],\n [\n 108.998182,\n 40.55724\n ],\n [\n 108.997604,\n 40.530088\n ],\n [\n 108.925635,\n 40.533048\n ],\n [\n 108.92737,\n 40.552194\n ],\n [\n 108.870141,\n 40.570464\n ],\n [\n 108.831122,\n 40.541577\n ],\n [\n 108.778229,\n 40.567158\n ],\n [\n 108.762622,\n 40.62681\n ],\n [\n 108.720134,\n 40.619161\n ],\n [\n 108.656547,\n 40.667128\n ],\n [\n 108.591804,\n 40.658962\n ],\n [\n 108.580243,\n 40.710893\n ],\n [\n 108.483129,\n 40.75463\n ],\n [\n 108.468388,\n 40.785159\n ],\n [\n 108.421565,\n 40.80666\n ],\n [\n 108.338902,\n 40.801633\n ],\n [\n 108.288033,\n 40.819661\n ],\n [\n 108.211728,\n 40.820875\n ],\n [\n 108.211439,\n 40.850681\n ],\n [\n 108.182247,\n 40.888092\n ],\n [\n 108.125308,\n 40.842711\n ],\n [\n 108.088601,\n 40.832314\n ],\n [\n 108.000447,\n 40.846003\n ],\n [\n 107.972122,\n 40.862287\n ],\n [\n 107.899575,\n 40.849295\n ],\n [\n 107.856509,\n 40.874585\n ],\n [\n 107.821247,\n 40.835779\n ],\n [\n 107.747545,\n 40.860728\n ],\n [\n 107.738874,\n 40.874758\n ],\n [\n 107.681067,\n 40.817235\n ],\n [\n 107.679622,\n 40.780824\n ],\n [\n 107.653609,\n 40.772845\n ],\n [\n 107.603896,\n 40.798685\n ],\n [\n 107.612567,\n 40.778049\n ],\n [\n 107.584531,\n 40.739707\n ],\n [\n 107.526725,\n 40.701344\n ],\n [\n 107.485104,\n 40.711067\n ],\n [\n 107.455334,\n 40.680677\n ],\n [\n 107.392325,\n 40.644887\n ],\n [\n 107.286829,\n 40.650969\n ],\n [\n 107.250989,\n 40.58299\n ],\n [\n 107.230757,\n 40.577423\n ],\n [\n 107.169193,\n 40.598295\n ],\n [\n 107.1611,\n 40.525388\n ],\n [\n 107.203877,\n 40.505712\n ],\n [\n 107.18509,\n 40.471744\n ],\n [\n 107.147227,\n 40.464251\n ],\n [\n 107.15214,\n 40.410907\n ],\n [\n 107.114277,\n 40.366945\n ],\n [\n 107.044043,\n 40.35403\n ],\n [\n 107.055026,\n 40.332733\n ],\n [\n 107.013116,\n 40.314572\n ],\n [\n 106.99722,\n 40.262333\n ],\n [\n 106.948663,\n 40.234887\n ],\n [\n 106.922939,\n 40.196934\n ],\n [\n 106.866578,\n 40.181012\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 150900,\n \"name\": \"乌兰察布市\",\n \"center\": [\n 113.114543,\n 41.034126\n ],\n \"centroid\": [\n 112.442779,\n 41.696758\n ],\n \"childrenNum\": 11,\n \"level\": \"city\",\n \"subFeatureIndex\": 8,\n \"acroutes\": [\n 100000,\n 150000\n ],\n \"parent\": {\n \"adcode\": 150000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 114.807129,\n 42.149523\n ],\n [\n 114.755393,\n 42.115891\n ],\n [\n 114.67562,\n 42.120478\n ],\n [\n 114.624751,\n 42.112153\n ],\n [\n 114.565788,\n 42.133728\n ],\n [\n 114.510872,\n 42.110964\n ],\n [\n 114.502491,\n 42.067111\n ],\n [\n 114.466073,\n 42.038029\n ],\n [\n 114.509427,\n 41.972503\n ],\n [\n 114.421562,\n 41.942185\n ],\n [\n 114.352483,\n 41.953939\n ],\n [\n 114.346703,\n 41.928043\n ],\n [\n 114.200742,\n 41.789867\n ],\n [\n 114.206812,\n 41.738445\n ],\n [\n 114.237449,\n 41.69861\n ],\n [\n 114.215483,\n 41.685099\n ],\n [\n 114.259415,\n 41.62332\n ],\n [\n 114.228778,\n 41.620923\n ],\n [\n 114.221552,\n 41.582215\n ],\n [\n 114.23109,\n 41.513649\n ],\n [\n 114.101315,\n 41.537827\n ],\n [\n 114.032237,\n 41.529597\n ],\n [\n 113.92992,\n 41.484487\n ],\n [\n 113.92096,\n 41.456513\n ],\n [\n 113.871247,\n 41.413412\n ],\n [\n 113.948707,\n 41.392109\n ],\n [\n 113.926741,\n 41.326266\n ],\n [\n 113.899572,\n 41.316289\n ],\n [\n 113.951308,\n 41.282907\n ],\n [\n 113.97154,\n 41.23952\n ],\n [\n 113.992351,\n 41.269825\n ],\n [\n 114.01634,\n 41.232113\n ],\n [\n 113.996686,\n 41.192484\n ],\n [\n 113.961135,\n 41.171281\n ],\n [\n 113.920382,\n 41.171971\n ],\n [\n 113.877894,\n 41.115569\n ],\n [\n 113.820377,\n 41.10159\n ],\n [\n 113.868356,\n 41.068962\n ],\n [\n 113.975587,\n 40.976514\n ],\n [\n 113.991195,\n 40.940191\n ],\n [\n 114.057383,\n 40.925137\n ],\n [\n 114.041486,\n 40.917349\n ],\n [\n 114.055359,\n 40.86783\n ],\n [\n 114.073568,\n 40.857264\n ],\n [\n 114.044665,\n 40.8311\n ],\n [\n 114.134554,\n 40.737798\n ],\n [\n 114.093223,\n 40.731898\n ],\n [\n 114.06403,\n 40.707074\n ],\n [\n 114.070389,\n 40.660352\n ],\n [\n 114.041775,\n 40.608729\n ],\n [\n 114.076748,\n 40.575857\n ],\n [\n 114.062007,\n 40.52887\n ],\n [\n 114.011427,\n 40.515812\n ],\n [\n 113.948707,\n 40.517379\n ],\n [\n 113.890034,\n 40.466517\n ],\n [\n 113.851014,\n 40.460592\n ],\n [\n 113.794942,\n 40.517901\n ],\n [\n 113.763438,\n 40.474009\n ],\n [\n 113.680486,\n 40.444034\n ],\n [\n 113.55996,\n 40.348619\n ],\n [\n 113.387698,\n 40.319113\n ],\n [\n 113.316018,\n 40.320161\n ],\n [\n 113.251275,\n 40.413349\n ],\n [\n 113.11543,\n 40.381079\n ],\n [\n 113.039704,\n 40.370086\n ],\n [\n 112.892876,\n 40.326447\n ],\n [\n 112.848655,\n 40.20708\n ],\n [\n 112.750673,\n 40.168061\n ],\n [\n 112.728707,\n 40.168236\n ],\n [\n 112.629858,\n 40.235761\n ],\n [\n 112.509043,\n 40.270373\n ],\n [\n 112.45615,\n 40.300075\n ],\n [\n 112.418287,\n 40.295358\n ],\n [\n 112.345451,\n 40.25639\n ],\n [\n 112.31019,\n 40.25639\n ],\n [\n 112.289379,\n 40.281032\n ],\n [\n 112.272616,\n 40.357172\n ],\n [\n 112.236198,\n 40.353856\n ],\n [\n 112.264523,\n 40.38736\n ],\n [\n 112.2177,\n 40.42817\n ],\n [\n 112.22348,\n 40.452575\n ],\n [\n 112.183305,\n 40.466168\n ],\n [\n 112.13706,\n 40.508324\n ],\n [\n 112.113648,\n 40.508672\n ],\n [\n 112.052374,\n 40.55985\n ],\n [\n 112.059022,\n 40.584381\n ],\n [\n 112.098619,\n 40.583859\n ],\n [\n 112.087925,\n 40.618813\n ],\n [\n 112.045148,\n 40.655139\n ],\n [\n 112.115672,\n 40.658788\n ],\n [\n 112.130412,\n 40.697697\n ],\n [\n 112.098619,\n 40.74526\n ],\n [\n 112.15209,\n 40.764519\n ],\n [\n 112.17868,\n 40.811514\n ],\n [\n 112.176079,\n 40.85276\n ],\n [\n 112.150933,\n 40.879088\n ],\n [\n 112.125788,\n 40.955933\n ],\n [\n 112.09515,\n 40.943305\n ],\n [\n 112.037055,\n 40.96389\n ],\n [\n 112.010175,\n 41.014719\n ],\n [\n 112.027517,\n 41.048583\n ],\n [\n 111.921732,\n 41.095895\n ],\n [\n 111.877221,\n 41.129027\n ],\n [\n 111.840514,\n 41.252091\n ],\n [\n 111.804096,\n 41.259668\n ],\n [\n 111.730104,\n 41.310956\n ],\n [\n 111.702646,\n 41.29461\n ],\n [\n 111.582409,\n 41.306655\n ],\n [\n 111.525181,\n 41.331426\n ],\n [\n 111.425465,\n 41.31887\n ],\n [\n 111.424887,\n 41.346903\n ],\n [\n 111.387313,\n 41.378705\n ],\n [\n 111.434136,\n 41.425264\n ],\n [\n 111.446565,\n 41.472646\n ],\n [\n 111.441362,\n 41.524282\n ],\n [\n 111.371128,\n 41.635646\n ],\n [\n 111.241353,\n 41.671242\n ],\n [\n 111.150886,\n 41.735026\n ],\n [\n 111.120827,\n 41.771421\n ],\n [\n 111.078917,\n 41.78611\n ],\n [\n 111.039609,\n 41.822818\n ],\n [\n 110.985849,\n 41.9352\n ],\n [\n 110.842201,\n 42.119969\n ],\n [\n 110.784683,\n 42.176347\n ],\n [\n 110.783238,\n 42.239967\n ],\n [\n 110.750867,\n 42.294883\n ],\n [\n 110.72312,\n 42.393916\n ],\n [\n 110.730057,\n 42.442613\n ],\n [\n 110.704911,\n 42.470833\n ],\n [\n 110.639012,\n 42.491779\n ],\n [\n 110.577159,\n 42.573637\n ],\n [\n 110.521954,\n 42.62607\n ],\n [\n 110.438135,\n 42.690414\n ],\n [\n 110.337552,\n 42.738039\n ],\n [\n 110.437268,\n 42.781426\n ],\n [\n 110.46964,\n 42.839059\n ],\n [\n 110.631497,\n 42.936057\n ],\n [\n 110.689303,\n 43.021516\n ],\n [\n 110.68728,\n 43.036418\n ],\n [\n 110.736415,\n 43.089631\n ],\n [\n 110.769943,\n 43.099332\n ],\n [\n 110.820234,\n 43.148982\n ],\n [\n 111.020533,\n 43.33002\n ],\n [\n 111.069668,\n 43.358004\n ],\n [\n 111.150886,\n 43.380315\n ],\n [\n 111.21534,\n 43.279351\n ],\n [\n 111.380087,\n 43.18206\n ],\n [\n 111.506972,\n 43.179387\n ],\n [\n 111.618827,\n 43.054161\n ],\n [\n 111.658135,\n 43.024028\n ],\n [\n 111.75236,\n 42.987514\n ],\n [\n 111.855833,\n 42.839899\n ],\n [\n 111.858434,\n 42.81823\n ],\n [\n 111.934738,\n 42.707415\n ],\n [\n 112.026072,\n 42.602978\n ],\n [\n 112.028962,\n 42.584599\n ],\n [\n 112.180704,\n 42.534662\n ],\n [\n 112.178391,\n 42.511029\n ],\n [\n 112.254407,\n 42.482827\n ],\n [\n 112.398055,\n 42.387318\n ],\n [\n 112.612227,\n 42.341287\n ],\n [\n 112.654715,\n 42.315887\n ],\n [\n 112.636795,\n 42.280311\n ],\n [\n 112.689976,\n 42.254379\n ],\n [\n 112.737956,\n 42.144258\n ],\n [\n 112.790848,\n 42.138144\n ],\n [\n 112.856458,\n 42.115721\n ],\n [\n 112.938832,\n 42.019655\n ],\n [\n 112.965134,\n 41.9977\n ],\n [\n 113.041727,\n 41.986125\n ],\n [\n 113.086527,\n 41.932644\n ],\n [\n 113.127281,\n 41.953939\n ],\n [\n 113.17208,\n 41.950022\n ],\n [\n 113.148669,\n 41.978293\n ],\n [\n 113.22873,\n 42.01489\n ],\n [\n 113.313417,\n 42.105357\n ],\n [\n 113.372379,\n 42.143579\n ],\n [\n 113.572388,\n 42.13186\n ],\n [\n 113.632218,\n 42.104677\n ],\n [\n 113.709389,\n 42.129822\n ],\n [\n 113.743206,\n 42.083432\n ],\n [\n 113.782803,\n 42.067111\n ],\n [\n 113.895236,\n 42.058099\n ],\n [\n 113.914601,\n 41.978122\n ],\n [\n 113.988015,\n 41.952917\n ],\n [\n 114.019231,\n 41.991572\n ],\n [\n 114.058539,\n 41.949681\n ],\n [\n 114.069233,\n 41.999062\n ],\n [\n 114.105362,\n 41.98306\n ],\n [\n 114.065186,\n 42.043302\n ],\n [\n 114.093801,\n 42.065241\n ],\n [\n 114.100159,\n 42.125745\n ],\n [\n 114.131953,\n 42.116911\n ],\n [\n 114.213459,\n 42.125235\n ],\n [\n 114.257103,\n 42.175668\n ],\n [\n 114.320112,\n 42.189416\n ],\n [\n 114.375895,\n 42.1519\n ],\n [\n 114.377051,\n 42.110114\n ],\n [\n 114.44584,\n 42.098729\n ],\n [\n 114.479079,\n 42.115551\n ],\n [\n 114.465206,\n 42.170745\n ],\n [\n 114.437748,\n 42.171424\n ],\n [\n 114.404798,\n 42.200276\n ],\n [\n 114.519832,\n 42.229962\n ],\n [\n 114.575037,\n 42.296577\n ],\n [\n 114.689205,\n 42.26421\n ],\n [\n 114.669551,\n 42.248953\n ],\n [\n 114.68747,\n 42.221142\n ],\n [\n 114.675042,\n 42.19807\n ],\n [\n 114.758572,\n 42.218598\n ],\n [\n 114.809153,\n 42.200106\n ],\n [\n 114.790077,\n 42.187718\n ],\n [\n 114.807129,\n 42.149523\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 152200,\n \"name\": \"兴安盟\",\n \"center\": [\n 122.070317,\n 46.076268\n ],\n \"centroid\": [\n 121.340147,\n 46.24332\n ],\n \"childrenNum\": 6,\n \"level\": \"city\",\n \"subFeatureIndex\": 9,\n \"acroutes\": [\n 100000,\n 150000\n ],\n \"parent\": {\n \"adcode\": 150000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 122.418186,\n 47.350534\n ],\n [\n 122.462696,\n 47.278482\n ],\n [\n 122.509808,\n 47.242886\n ],\n [\n 122.556342,\n 47.172556\n ],\n [\n 122.596229,\n 47.155115\n ],\n [\n 122.612414,\n 47.128474\n ],\n [\n 122.679759,\n 47.094181\n ],\n [\n 122.702014,\n 47.096676\n ],\n [\n 122.821962,\n 47.065638\n ],\n [\n 122.852021,\n 47.072346\n ],\n [\n 122.845952,\n 47.046757\n ],\n [\n 122.778318,\n 47.002883\n ],\n [\n 122.77485,\n 46.973979\n ],\n [\n 122.802308,\n 46.937396\n ],\n [\n 122.848842,\n 46.939586\n ],\n [\n 122.895376,\n 46.960224\n ],\n [\n 122.893642,\n 46.895155\n ],\n [\n 122.907226,\n 46.807907\n ],\n [\n 122.996537,\n 46.761641\n ],\n [\n 123.026596,\n 46.71879\n ],\n [\n 123.077176,\n 46.745007\n ],\n [\n 123.104056,\n 46.734647\n ],\n [\n 123.171112,\n 46.743908\n ],\n [\n 123.18643,\n 46.786739\n ],\n [\n 123.230941,\n 46.859928\n ],\n [\n 123.295684,\n 46.865253\n ],\n [\n 123.34164,\n 46.826872\n ],\n [\n 123.374589,\n 46.837684\n ],\n [\n 123.406672,\n 46.906423\n ],\n [\n 123.404649,\n 46.93552\n ],\n [\n 123.360427,\n 46.97101\n ],\n [\n 123.304066,\n 46.964914\n ],\n [\n 123.301754,\n 46.999759\n ],\n [\n 123.336437,\n 46.989136\n ],\n [\n 123.427482,\n 46.934425\n ],\n [\n 123.527776,\n 46.958036\n ],\n [\n 123.522284,\n 46.922225\n ],\n [\n 123.483843,\n 46.844734\n ],\n [\n 123.514192,\n 46.826089\n ],\n [\n 123.562749,\n 46.825932\n ],\n [\n 123.576911,\n 46.890616\n ],\n [\n 123.605525,\n 46.891242\n ],\n [\n 123.599167,\n 46.864939\n ],\n [\n 123.625758,\n 46.847711\n ],\n [\n 123.580091,\n 46.827969\n ],\n [\n 123.629226,\n 46.81355\n ],\n [\n 123.631827,\n 46.729466\n ],\n [\n 123.604658,\n 46.690046\n ],\n [\n 123.482109,\n 46.686904\n ],\n [\n 123.366497,\n 46.67779\n ],\n [\n 123.277475,\n 46.661602\n ],\n [\n 123.279209,\n 46.616941\n ],\n [\n 123.22834,\n 46.5883\n ],\n [\n 123.181517,\n 46.613637\n ],\n [\n 123.098565,\n 46.603094\n ],\n [\n 123.077755,\n 46.622132\n ],\n [\n 123.045672,\n 46.617255\n ],\n [\n 123.052898,\n 46.580115\n ],\n [\n 123.007231,\n 46.576966\n ],\n [\n 123.011566,\n 46.434928\n ],\n [\n 123.094807,\n 46.342192\n ],\n [\n 123.140474,\n 46.300274\n ],\n [\n 123.178626,\n 46.24803\n ],\n [\n 123.128624,\n 46.210478\n ],\n [\n 123.127757,\n 46.174646\n ],\n [\n 123.1029,\n 46.17195\n ],\n [\n 123.112438,\n 46.130061\n ],\n [\n 123.069951,\n 46.123552\n ],\n [\n 123.045672,\n 46.100052\n ],\n [\n 122.793059,\n 46.073205\n ],\n [\n 122.82861,\n 45.912329\n ],\n [\n 122.800285,\n 45.856685\n ],\n [\n 122.752305,\n 45.834827\n ],\n [\n 122.792481,\n 45.766165\n ],\n [\n 122.751149,\n 45.736119\n ],\n [\n 122.7419,\n 45.705097\n ],\n [\n 122.671377,\n 45.700619\n ],\n [\n 122.640739,\n 45.771118\n ],\n [\n 122.603454,\n 45.778147\n ],\n [\n 122.554897,\n 45.821421\n ],\n [\n 122.504317,\n 45.787731\n ],\n [\n 122.495935,\n 45.85828\n ],\n [\n 122.445933,\n 45.91695\n ],\n [\n 122.362114,\n 45.917428\n ],\n [\n 122.373097,\n 45.856047\n ],\n [\n 122.337546,\n 45.859875\n ],\n [\n 122.320782,\n 45.830518\n ],\n [\n 122.262687,\n 45.794918\n ],\n [\n 122.200834,\n 45.856845\n ],\n [\n 122.09158,\n 45.882043\n ],\n [\n 122.083488,\n 45.917269\n ],\n [\n 122.040133,\n 45.959001\n ],\n [\n 121.923653,\n 46.004838\n ],\n [\n 121.863824,\n 46.002611\n ],\n [\n 121.843303,\n 46.024403\n ],\n [\n 121.761796,\n 45.998952\n ],\n [\n 121.809197,\n 45.961548\n ],\n [\n 121.821047,\n 45.920615\n ],\n [\n 121.81729,\n 45.875665\n ],\n [\n 121.784918,\n 45.860194\n ],\n [\n 121.754281,\n 45.794918\n ],\n [\n 121.690116,\n 45.76281\n ],\n [\n 121.656878,\n 45.77016\n ],\n [\n 121.644449,\n 45.752423\n ],\n [\n 121.714106,\n 45.701738\n ],\n [\n 121.81122,\n 45.68702\n ],\n [\n 121.812376,\n 45.704777\n ],\n [\n 121.867003,\n 45.719811\n ],\n [\n 121.934058,\n 45.710535\n ],\n [\n 121.970187,\n 45.69278\n ],\n [\n 122.003426,\n 45.623302\n ],\n [\n 121.9962,\n 45.598949\n ],\n [\n 121.96643,\n 45.596064\n ],\n [\n 121.99331,\n 45.552937\n ],\n [\n 122.002559,\n 45.50785\n ],\n [\n 122.023369,\n 45.490191\n ],\n [\n 122.163549,\n 45.443768\n ],\n [\n 122.179735,\n 45.409369\n ],\n [\n 122.146785,\n 45.374465\n ],\n [\n 122.147363,\n 45.295572\n ],\n [\n 122.238986,\n 45.276234\n ],\n [\n 122.230026,\n 45.206887\n ],\n [\n 122.192741,\n 45.180739\n ],\n [\n 122.143317,\n 45.182999\n ],\n [\n 122.109789,\n 45.141979\n ],\n [\n 122.119327,\n 45.068586\n ],\n [\n 122.098806,\n 45.021493\n ],\n [\n 122.074528,\n 45.006597\n ],\n [\n 122.086667,\n 44.952971\n ],\n [\n 122.079152,\n 44.914218\n ],\n [\n 122.049671,\n 44.912758\n ],\n [\n 122.114992,\n 44.776671\n ],\n [\n 122.169041,\n 44.770167\n ],\n [\n 122.142739,\n 44.753742\n ],\n [\n 122.110656,\n 44.767891\n ],\n [\n 122.102853,\n 44.736336\n ],\n [\n 122.152566,\n 44.743819\n ],\n [\n 122.161526,\n 44.7282\n ],\n [\n 122.117304,\n 44.702158\n ],\n [\n 122.103142,\n 44.673988\n ],\n [\n 122.131756,\n 44.577485\n ],\n [\n 122.195921,\n 44.559863\n ],\n [\n 122.223957,\n 44.526235\n ],\n [\n 122.228003,\n 44.480168\n ],\n [\n 122.286098,\n 44.477717\n ],\n [\n 122.29448,\n 44.411001\n ],\n [\n 122.29159,\n 44.310292\n ],\n [\n 122.274537,\n 44.25405\n ],\n [\n 122.22598,\n 44.263564\n ],\n [\n 122.167596,\n 44.25569\n ],\n [\n 122.017877,\n 44.304392\n ],\n [\n 121.933769,\n 44.351252\n ],\n [\n 121.881166,\n 44.402983\n ],\n [\n 121.829429,\n 44.411328\n ],\n [\n 121.778271,\n 44.446494\n ],\n [\n 121.760062,\n 44.47739\n ],\n [\n 121.697631,\n 44.534562\n ],\n [\n 121.651097,\n 44.563126\n ],\n [\n 121.585198,\n 44.639774\n ],\n [\n 121.595603,\n 44.659164\n ],\n [\n 121.548491,\n 44.667472\n ],\n [\n 121.529993,\n 44.720389\n ],\n [\n 121.409178,\n 44.790815\n ],\n [\n 121.420161,\n 44.817953\n ],\n [\n 121.401663,\n 44.85125\n ],\n [\n 121.239806,\n 44.934165\n ],\n [\n 121.032859,\n 44.9985\n ],\n [\n 120.977076,\n 45.072953\n ],\n [\n 120.97303,\n 45.11871\n ],\n [\n 120.947884,\n 45.120973\n ],\n [\n 120.97303,\n 45.157002\n ],\n [\n 120.967827,\n 45.184129\n ],\n [\n 120.882274,\n 45.217537\n ],\n [\n 120.834873,\n 45.216084\n ],\n [\n 120.82678,\n 45.253504\n ],\n [\n 120.744406,\n 45.260115\n ],\n [\n 120.660298,\n 45.297666\n ],\n [\n 120.580526,\n 45.352901\n ],\n [\n 120.554224,\n 45.357569\n ],\n [\n 120.559716,\n 45.416604\n ],\n [\n 120.49584,\n 45.464173\n ],\n [\n 120.434854,\n 45.464495\n ],\n [\n 120.414044,\n 45.503516\n ],\n [\n 120.35855,\n 45.516838\n ],\n [\n 120.318375,\n 45.556626\n ],\n [\n 120.269239,\n 45.552135\n ],\n [\n 120.165766,\n 45.594782\n ],\n [\n 120.142644,\n 45.584204\n ],\n [\n 120.027031,\n 45.594942\n ],\n [\n 119.994082,\n 45.580837\n ],\n [\n 119.994082,\n 45.552937\n ],\n [\n 120.028765,\n 45.526306\n ],\n [\n 120.031656,\n 45.499342\n ],\n [\n 120.002464,\n 45.482162\n ],\n [\n 119.906794,\n 45.505603\n ],\n [\n 119.918355,\n 45.561918\n ],\n [\n 119.877602,\n 45.549088\n ],\n [\n 119.819507,\n 45.572821\n ],\n [\n 119.790893,\n 45.564323\n ],\n [\n 119.656493,\n 45.623463\n ],\n [\n 119.566027,\n 45.65565\n ],\n [\n 119.596086,\n 45.670057\n ],\n [\n 119.681639,\n 45.669417\n ],\n [\n 119.708808,\n 45.703178\n ],\n [\n 119.700426,\n 45.736439\n ],\n [\n 119.751585,\n 45.76297\n ],\n [\n 119.807946,\n 45.820463\n ],\n [\n 119.829912,\n 45.974603\n ],\n [\n 119.807657,\n 45.991314\n ],\n [\n 119.833669,\n 46.004838\n ],\n [\n 119.855058,\n 46.107992\n ],\n [\n 119.879336,\n 46.144344\n ],\n [\n 119.850433,\n 46.18321\n ],\n [\n 119.889452,\n 46.209686\n ],\n [\n 119.835693,\n 46.235357\n ],\n [\n 119.837716,\n 46.320683\n ],\n [\n 119.874134,\n 46.345512\n ],\n [\n 119.838294,\n 46.37586\n ],\n [\n 119.900147,\n 46.403507\n ],\n [\n 119.961421,\n 46.39561\n ],\n [\n 119.984544,\n 46.418667\n ],\n [\n 119.909396,\n 46.429088\n ],\n [\n 119.948704,\n 46.493617\n ],\n [\n 119.907083,\n 46.53775\n ],\n [\n 119.952461,\n 46.604196\n ],\n [\n 119.906794,\n 46.668518\n ],\n [\n 119.935119,\n 46.712822\n ],\n [\n 119.91691,\n 46.758346\n ],\n [\n 119.936275,\n 46.790189\n ],\n [\n 119.920379,\n 46.853193\n ],\n [\n 119.928761,\n 46.903762\n ],\n [\n 119.859682,\n 46.917062\n ],\n [\n 119.844942,\n 46.96507\n ],\n [\n 119.794939,\n 47.013035\n ],\n [\n 119.8065,\n 47.054872\n ],\n [\n 119.762857,\n 47.130968\n ],\n [\n 119.716034,\n 47.195595\n ],\n [\n 119.62181,\n 47.248484\n ],\n [\n 119.557356,\n 47.257656\n ],\n [\n 119.561113,\n 47.301164\n ],\n [\n 119.486254,\n 47.336721\n ],\n [\n 119.616896,\n 47.361706\n ],\n [\n 119.657938,\n 47.410554\n ],\n [\n 119.764013,\n 47.436123\n ],\n [\n 119.814304,\n 47.474995\n ],\n [\n 119.814015,\n 47.49914\n ],\n [\n 119.853034,\n 47.520954\n ],\n [\n 119.904482,\n 47.5678\n ],\n [\n 119.958242,\n 47.581552\n ],\n [\n 120.023852,\n 47.554044\n ],\n [\n 120.11403,\n 47.597926\n ],\n [\n 120.188022,\n 47.615222\n ],\n [\n 120.200161,\n 47.632975\n ],\n [\n 120.230509,\n 47.623713\n ],\n [\n 120.265193,\n 47.65643\n ],\n [\n 120.344387,\n 47.602405\n ],\n [\n 120.385719,\n 47.620317\n ],\n [\n 120.52561,\n 47.574599\n ],\n [\n 120.525321,\n 47.544769\n ],\n [\n 120.581104,\n 47.548479\n ],\n [\n 120.604226,\n 47.532244\n ],\n [\n 120.582549,\n 47.505329\n ],\n [\n 120.593532,\n 47.488617\n ],\n [\n 120.643535,\n 47.506877\n ],\n [\n 120.725619,\n 47.441545\n ],\n [\n 120.703364,\n 47.408539\n ],\n [\n 120.732556,\n 47.384972\n ],\n [\n 120.733134,\n 47.357672\n ],\n [\n 120.708277,\n 47.337342\n ],\n [\n 120.624748,\n 47.300698\n ],\n [\n 120.623302,\n 47.244285\n ],\n [\n 120.739204,\n 47.217379\n ],\n [\n 120.773888,\n 47.176915\n ],\n [\n 120.823312,\n 47.145613\n ],\n [\n 120.876494,\n 47.149819\n ],\n [\n 120.945861,\n 47.099014\n ],\n [\n 120.976787,\n 47.09652\n ],\n [\n 121.018119,\n 47.129253\n ],\n [\n 121.098469,\n 47.151999\n ],\n [\n 121.172461,\n 47.141251\n ],\n [\n 121.246453,\n 47.112577\n ],\n [\n 121.329405,\n 47.136577\n ],\n [\n 121.368136,\n 47.135175\n ],\n [\n 121.437503,\n 47.184232\n ],\n [\n 121.488661,\n 47.183765\n ],\n [\n 121.551092,\n 47.197773\n ],\n [\n 121.588955,\n 47.1724\n ],\n [\n 121.648785,\n 47.179406\n ],\n [\n 121.639825,\n 47.203064\n ],\n [\n 121.674219,\n 47.249883\n ],\n [\n 121.760351,\n 47.280968\n ],\n [\n 121.840123,\n 47.265739\n ],\n [\n 122.042156,\n 47.204154\n ],\n [\n 122.084644,\n 47.180652\n ],\n [\n 122.146207,\n 47.222201\n ],\n [\n 122.209505,\n 47.236199\n ],\n [\n 122.256906,\n 47.260299\n ],\n [\n 122.308932,\n 47.304271\n ],\n [\n 122.418186,\n 47.350534\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 152500,\n \"name\": \"锡林郭勒盟\",\n \"center\": [\n 116.090996,\n 43.944018\n ],\n \"centroid\": [\n 115.515195,\n 44.233018\n ],\n \"childrenNum\": 12,\n \"level\": \"city\",\n \"subFeatureIndex\": 10,\n \"acroutes\": [\n 100000,\n 150000\n ],\n \"parent\": {\n \"adcode\": 150000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 116.893645,\n 42.387826\n ],\n [\n 116.884974,\n 42.353306\n ],\n [\n 116.918502,\n 42.229962\n ],\n [\n 116.903472,\n 42.190773\n ],\n [\n 116.789305,\n 42.200276\n ],\n [\n 116.825145,\n 42.155636\n ],\n [\n 116.85029,\n 42.156315\n ],\n [\n 116.890755,\n 42.092611\n ],\n [\n 116.879482,\n 42.018463\n ],\n [\n 116.832081,\n 42.00536\n ],\n [\n 116.814161,\n 41.981868\n ],\n [\n 116.766471,\n 41.990381\n ],\n [\n 116.727452,\n 41.951044\n ],\n [\n 116.652304,\n 41.943889\n ],\n [\n 116.640743,\n 41.930429\n ],\n [\n 116.566462,\n 41.928725\n ],\n [\n 116.533801,\n 41.938948\n ],\n [\n 116.514147,\n 41.970119\n ],\n [\n 116.482643,\n 41.975909\n ],\n [\n 116.427438,\n 41.938948\n ],\n [\n 116.386684,\n 41.952406\n ],\n [\n 116.414431,\n 41.986976\n ],\n [\n 116.373678,\n 42.009955\n ],\n [\n 116.327144,\n 42.0057\n ],\n [\n 116.298241,\n 41.968076\n ],\n [\n 116.233498,\n 41.941504\n ],\n [\n 116.19419,\n 41.861893\n ],\n [\n 116.123088,\n 41.861722\n ],\n [\n 116.106902,\n 41.831522\n ],\n [\n 116.128869,\n 41.806089\n ],\n [\n 116.098809,\n 41.776546\n ],\n [\n 116.016725,\n 41.777058\n ],\n [\n 115.995047,\n 41.828621\n ],\n [\n 115.946779,\n 41.885599\n ],\n [\n 115.916431,\n 41.945081\n ],\n [\n 115.853133,\n 41.927703\n ],\n [\n 115.837236,\n 41.937756\n ],\n [\n 115.724514,\n 41.868033\n ],\n [\n 115.688096,\n 41.867692\n ],\n [\n 115.653991,\n 41.828962\n ],\n [\n 115.574218,\n 41.805406\n ],\n [\n 115.51988,\n 41.767834\n ],\n [\n 115.429991,\n 41.728702\n ],\n [\n 115.347039,\n 41.71229\n ],\n [\n 115.319003,\n 41.691427\n ],\n [\n 115.362358,\n 41.668163\n ],\n [\n 115.345594,\n 41.635646\n ],\n [\n 115.377677,\n 41.602428\n ],\n [\n 115.310911,\n 41.592665\n ],\n [\n 115.290389,\n 41.622977\n ],\n [\n 115.264377,\n 41.613046\n ],\n [\n 115.257729,\n 41.581187\n ],\n [\n 115.204258,\n 41.571421\n ],\n [\n 115.195009,\n 41.602086\n ],\n [\n 115.087779,\n 41.622806\n ],\n [\n 115.055985,\n 41.602257\n ],\n [\n 115.025059,\n 41.615272\n ],\n [\n 114.8606,\n 41.601058\n ],\n [\n 114.895573,\n 41.636502\n ],\n [\n 114.902799,\n 41.689375\n ],\n [\n 114.896151,\n 41.767663\n ],\n [\n 114.867248,\n 41.803016\n ],\n [\n 114.922453,\n 41.825207\n ],\n [\n 114.939217,\n 41.846197\n ],\n [\n 114.921586,\n 41.875879\n ],\n [\n 114.916961,\n 41.981017\n ],\n [\n 114.901932,\n 42.015571\n ],\n [\n 114.860889,\n 42.054868\n ],\n [\n 114.856265,\n 42.109944\n ],\n [\n 114.807129,\n 42.149523\n ],\n [\n 114.790077,\n 42.187718\n ],\n [\n 114.809153,\n 42.200106\n ],\n [\n 114.758572,\n 42.218598\n ],\n [\n 114.675042,\n 42.19807\n ],\n [\n 114.68747,\n 42.221142\n ],\n [\n 114.669551,\n 42.248953\n ],\n [\n 114.689205,\n 42.26421\n ],\n [\n 114.575037,\n 42.296577\n ],\n [\n 114.519832,\n 42.229962\n ],\n [\n 114.404798,\n 42.200276\n ],\n [\n 114.437748,\n 42.171424\n ],\n [\n 114.465206,\n 42.170745\n ],\n [\n 114.479079,\n 42.115551\n ],\n [\n 114.44584,\n 42.098729\n ],\n [\n 114.377051,\n 42.110114\n ],\n [\n 114.375895,\n 42.1519\n ],\n [\n 114.320112,\n 42.189416\n ],\n [\n 114.257103,\n 42.175668\n ],\n [\n 114.213459,\n 42.125235\n ],\n [\n 114.131953,\n 42.116911\n ],\n [\n 114.100159,\n 42.125745\n ],\n [\n 114.093801,\n 42.065241\n ],\n [\n 114.065186,\n 42.043302\n ],\n [\n 114.105362,\n 41.98306\n ],\n [\n 114.069233,\n 41.999062\n ],\n [\n 114.058539,\n 41.949681\n ],\n [\n 114.019231,\n 41.991572\n ],\n [\n 113.988015,\n 41.952917\n ],\n [\n 113.914601,\n 41.978122\n ],\n [\n 113.895236,\n 42.058099\n ],\n [\n 113.782803,\n 42.067111\n ],\n [\n 113.743206,\n 42.083432\n ],\n [\n 113.709389,\n 42.129822\n ],\n [\n 113.632218,\n 42.104677\n ],\n [\n 113.572388,\n 42.13186\n ],\n [\n 113.372379,\n 42.143579\n ],\n [\n 113.313417,\n 42.105357\n ],\n [\n 113.22873,\n 42.01489\n ],\n [\n 113.148669,\n 41.978293\n ],\n [\n 113.17208,\n 41.950022\n ],\n [\n 113.127281,\n 41.953939\n ],\n [\n 113.086527,\n 41.932644\n ],\n [\n 113.041727,\n 41.986125\n ],\n [\n 112.965134,\n 41.9977\n ],\n [\n 112.938832,\n 42.019655\n ],\n [\n 112.856458,\n 42.115721\n ],\n [\n 112.790848,\n 42.138144\n ],\n [\n 112.737956,\n 42.144258\n ],\n [\n 112.689976,\n 42.254379\n ],\n [\n 112.636795,\n 42.280311\n ],\n [\n 112.654715,\n 42.315887\n ],\n [\n 112.612227,\n 42.341287\n ],\n [\n 112.398055,\n 42.387318\n ],\n [\n 112.254407,\n 42.482827\n ],\n [\n 112.178391,\n 42.511029\n ],\n [\n 112.180704,\n 42.534662\n ],\n [\n 112.028962,\n 42.584599\n ],\n [\n 112.026072,\n 42.602978\n ],\n [\n 111.934738,\n 42.707415\n ],\n [\n 111.858434,\n 42.81823\n ],\n [\n 111.855833,\n 42.839899\n ],\n [\n 111.75236,\n 42.987514\n ],\n [\n 111.658135,\n 43.024028\n ],\n [\n 111.618827,\n 43.054161\n ],\n [\n 111.506972,\n 43.179387\n ],\n [\n 111.380087,\n 43.18206\n ],\n [\n 111.21534,\n 43.279351\n ],\n [\n 111.150886,\n 43.380315\n ],\n [\n 111.183546,\n 43.396128\n ],\n [\n 111.354075,\n 43.436057\n ],\n [\n 111.40032,\n 43.472802\n ],\n [\n 111.456681,\n 43.494406\n ],\n [\n 111.564489,\n 43.490252\n ],\n [\n 111.643973,\n 43.543734\n ],\n [\n 111.794269,\n 43.671931\n ],\n [\n 111.891673,\n 43.674085\n ],\n [\n 111.950924,\n 43.693133\n ],\n [\n 111.970578,\n 43.748421\n ],\n [\n 111.959884,\n 43.82316\n ],\n [\n 111.870284,\n 43.940206\n ],\n [\n 111.77317,\n 44.010587\n ],\n [\n 111.702357,\n 44.033974\n ],\n [\n 111.663049,\n 44.061138\n ],\n [\n 111.559287,\n 44.17131\n ],\n [\n 111.541656,\n 44.20662\n ],\n [\n 111.534141,\n 44.262088\n ],\n [\n 111.506683,\n 44.294229\n ],\n [\n 111.428645,\n 44.31947\n ],\n [\n 111.415927,\n 44.357148\n ],\n [\n 111.4272,\n 44.39431\n ],\n [\n 111.478358,\n 44.488829\n ],\n [\n 111.514487,\n 44.507453\n ],\n [\n 111.530673,\n 44.550233\n ],\n [\n 111.569981,\n 44.57618\n ],\n [\n 111.560732,\n 44.646944\n ],\n [\n 111.624608,\n 44.778297\n ],\n [\n 111.692241,\n 44.86018\n ],\n [\n 111.764499,\n 44.969339\n ],\n [\n 111.903523,\n 45.052245\n ],\n [\n 112.002661,\n 45.090743\n ],\n [\n 112.071161,\n 45.096079\n ],\n [\n 112.113648,\n 45.073115\n ],\n [\n 112.39661,\n 45.064542\n ],\n [\n 112.438808,\n 45.071498\n ],\n [\n 112.540547,\n 45.001091\n ],\n [\n 112.599799,\n 44.930598\n ],\n [\n 112.712232,\n 44.879335\n ],\n [\n 112.850678,\n 44.840695\n ],\n [\n 112.937965,\n 44.840208\n ],\n [\n 113.03797,\n 44.822502\n ],\n [\n 113.129015,\n 44.796991\n ],\n [\n 113.504177,\n 44.777484\n ],\n [\n 113.540595,\n 44.759434\n ],\n [\n 113.631062,\n 44.745446\n ],\n [\n 113.71228,\n 44.788214\n ],\n [\n 113.798989,\n 44.849464\n ],\n [\n 113.861998,\n 44.863265\n ],\n [\n 113.907376,\n 44.915191\n ],\n [\n 114.065186,\n 44.931246\n ],\n [\n 114.116923,\n 44.956861\n ],\n [\n 114.190915,\n 45.03671\n ],\n [\n 114.313464,\n 45.107396\n ],\n [\n 114.347281,\n 45.119357\n ],\n [\n 114.409712,\n 45.179609\n ],\n [\n 114.459714,\n 45.213342\n ],\n [\n 114.519543,\n 45.283809\n ],\n [\n 114.539776,\n 45.326015\n ],\n [\n 114.551048,\n 45.387657\n ],\n [\n 114.744988,\n 45.438304\n ],\n [\n 114.920719,\n 45.386049\n ],\n [\n 114.974189,\n 45.37704\n ],\n [\n 115.16784,\n 45.396343\n ],\n [\n 115.36467,\n 45.392322\n ],\n [\n 115.530285,\n 45.428982\n ],\n [\n 115.699657,\n 45.459515\n ],\n [\n 115.863827,\n 45.572982\n ],\n [\n 115.936663,\n 45.632913\n ],\n [\n 116.026841,\n 45.661093\n ],\n [\n 116.035512,\n 45.6851\n ],\n [\n 116.115573,\n 45.679659\n ],\n [\n 116.174246,\n 45.68862\n ],\n [\n 116.217312,\n 45.722369\n ],\n [\n 116.223093,\n 45.747309\n ],\n [\n 116.260956,\n 45.775911\n ],\n [\n 116.286969,\n 45.775112\n ],\n [\n 116.288703,\n 45.838976\n ],\n [\n 116.243036,\n 45.876143\n ],\n [\n 116.27165,\n 45.966802\n ],\n [\n 116.414142,\n 46.134029\n ],\n [\n 116.439577,\n 46.137679\n ],\n [\n 116.536113,\n 46.232664\n ],\n [\n 116.573398,\n 46.258958\n ],\n [\n 116.585249,\n 46.292361\n ],\n [\n 116.673403,\n 46.325112\n ],\n [\n 116.745661,\n 46.327801\n ],\n [\n 116.813294,\n 46.355946\n ],\n [\n 116.82659,\n 46.380443\n ],\n [\n 117.097412,\n 46.357211\n ],\n [\n 117.247708,\n 46.367011\n ],\n [\n 117.371991,\n 46.360214\n ],\n [\n 117.375749,\n 46.416457\n ],\n [\n 117.392224,\n 46.463176\n ],\n [\n 117.447718,\n 46.528138\n ],\n [\n 117.419971,\n 46.582004\n ],\n [\n 117.495697,\n 46.600577\n ],\n [\n 117.595991,\n 46.603567\n ],\n [\n 117.630096,\n 46.591606\n ],\n [\n 117.641079,\n 46.558228\n ],\n [\n 117.703799,\n 46.516791\n ],\n [\n 117.769987,\n 46.537592\n ],\n [\n 117.813342,\n 46.530817\n ],\n [\n 117.870859,\n 46.54988\n ],\n [\n 117.868547,\n 46.575706\n ],\n [\n 117.914503,\n 46.607973\n ],\n [\n 117.982425,\n 46.614895\n ],\n [\n 117.993119,\n 46.63157\n ],\n [\n 118.04659,\n 46.631412\n ],\n [\n 118.124339,\n 46.678262\n ],\n [\n 118.19284,\n 46.682819\n ],\n [\n 118.238796,\n 46.709524\n ],\n [\n 118.316545,\n 46.739513\n ],\n [\n 118.410191,\n 46.72821\n ],\n [\n 118.446609,\n 46.704498\n ],\n [\n 118.585922,\n 46.693031\n ],\n [\n 118.638815,\n 46.721459\n ],\n [\n 118.676967,\n 46.698058\n ],\n [\n 118.787955,\n 46.687061\n ],\n [\n 118.788244,\n 46.717533\n ],\n [\n 118.845183,\n 46.771838\n ],\n [\n 118.91455,\n 46.774976\n ],\n [\n 118.912527,\n 46.733391\n ],\n [\n 118.950968,\n 46.722087\n ],\n [\n 119.011376,\n 46.745634\n ],\n [\n 119.040857,\n 46.708896\n ],\n [\n 119.123231,\n 46.642893\n ],\n [\n 119.152423,\n 46.658301\n ],\n [\n 119.262833,\n 46.648868\n ],\n [\n 119.313413,\n 46.610805\n ],\n [\n 119.357924,\n 46.6193\n ],\n [\n 119.37411,\n 46.603252\n ],\n [\n 119.431916,\n 46.638647\n ],\n [\n 119.491746,\n 46.62921\n ],\n [\n 119.558223,\n 46.633772\n ],\n [\n 119.598976,\n 46.618199\n ],\n [\n 119.656782,\n 46.625593\n ],\n [\n 119.677593,\n 46.58468\n ],\n [\n 119.739734,\n 46.615367\n ],\n [\n 119.783667,\n 46.625907\n ],\n [\n 119.813437,\n 46.668361\n ],\n [\n 119.804188,\n 46.681719\n ],\n [\n 119.906794,\n 46.668518\n ],\n [\n 119.952461,\n 46.604196\n ],\n [\n 119.907083,\n 46.53775\n ],\n [\n 119.948704,\n 46.493617\n ],\n [\n 119.909396,\n 46.429088\n ],\n [\n 119.984544,\n 46.418667\n ],\n [\n 119.961421,\n 46.39561\n ],\n [\n 119.900147,\n 46.403507\n ],\n [\n 119.838294,\n 46.37586\n ],\n [\n 119.874134,\n 46.345512\n ],\n [\n 119.837716,\n 46.320683\n ],\n [\n 119.835693,\n 46.235357\n ],\n [\n 119.889452,\n 46.209686\n ],\n [\n 119.850433,\n 46.18321\n ],\n [\n 119.879336,\n 46.144344\n ],\n [\n 119.855058,\n 46.107992\n ],\n [\n 119.833669,\n 46.004838\n ],\n [\n 119.807657,\n 45.991314\n ],\n [\n 119.829912,\n 45.974603\n ],\n [\n 119.807946,\n 45.820463\n ],\n [\n 119.751585,\n 45.76297\n ],\n [\n 119.700426,\n 45.736439\n ],\n [\n 119.708808,\n 45.703178\n ],\n [\n 119.681639,\n 45.669417\n ],\n [\n 119.596086,\n 45.670057\n ],\n [\n 119.566027,\n 45.65565\n ],\n [\n 119.544927,\n 45.635956\n ],\n [\n 119.55909,\n 45.615933\n ],\n [\n 119.496081,\n 45.550691\n ],\n [\n 119.396943,\n 45.511863\n ],\n [\n 119.304742,\n 45.468029\n ],\n [\n 119.313413,\n 45.385244\n ],\n [\n 119.248381,\n 45.304111\n ],\n [\n 119.323818,\n 45.245925\n ],\n [\n 119.311101,\n 45.186551\n ],\n [\n 119.360814,\n 45.165884\n ],\n [\n 119.373243,\n 45.105456\n ],\n [\n 119.342027,\n 45.076026\n ],\n [\n 119.293181,\n 45.087347\n ],\n [\n 119.28769,\n 45.121943\n ],\n [\n 119.215432,\n 45.152802\n ],\n [\n 119.159071,\n 45.099959\n ],\n [\n 119.156759,\n 45.074409\n ],\n [\n 119.196934,\n 45.03234\n ],\n [\n 119.231907,\n 45.019065\n ],\n [\n 119.208495,\n 44.997366\n ],\n [\n 119.171788,\n 45.015989\n ],\n [\n 119.15329,\n 44.992993\n ],\n [\n 119.18624,\n 44.952971\n ],\n [\n 119.230172,\n 44.9353\n ],\n [\n 119.224681,\n 44.909676\n ],\n [\n 119.146642,\n 44.924922\n ],\n [\n 119.107334,\n 44.920543\n ],\n [\n 119.082188,\n 44.938381\n ],\n [\n 119.067448,\n 44.870895\n ],\n [\n 119.14751,\n 44.808692\n ],\n [\n 119.173233,\n 44.76041\n ],\n [\n 119.125832,\n 44.762199\n ],\n [\n 119.148377,\n 44.731617\n ],\n [\n 119.074674,\n 44.712739\n ],\n [\n 119.001549,\n 44.713879\n ],\n [\n 118.97149,\n 44.729827\n ],\n [\n 118.926112,\n 44.7046\n ],\n [\n 118.96831,\n 44.691087\n ],\n [\n 119.001549,\n 44.648248\n ],\n [\n 118.981606,\n 44.566064\n ],\n [\n 118.904723,\n 44.516436\n ],\n [\n 118.816569,\n 44.49128\n ],\n [\n 118.789111,\n 44.46317\n ],\n [\n 118.75067,\n 44.477554\n ],\n [\n 118.659336,\n 44.453361\n ],\n [\n 118.635635,\n 44.472814\n ],\n [\n 118.596038,\n 44.468728\n ],\n [\n 118.54777,\n 44.442243\n ],\n [\n 118.544591,\n 44.411165\n ],\n [\n 118.476957,\n 44.399383\n ],\n [\n 118.466552,\n 44.354036\n ],\n [\n 118.428111,\n 44.346174\n ],\n [\n 118.414816,\n 44.322419\n ],\n [\n 118.34198,\n 44.319961\n ],\n [\n 118.250935,\n 44.337493\n ],\n [\n 118.214228,\n 44.306195\n ],\n [\n 118.237351,\n 44.279144\n ],\n [\n 118.19284,\n 44.242565\n ],\n [\n 118.172608,\n 44.204321\n ],\n [\n 118.148907,\n 44.215157\n ],\n [\n 118.128675,\n 44.190692\n ],\n [\n 118.116825,\n 44.132362\n ],\n [\n 118.06162,\n 44.100461\n ],\n [\n 117.962193,\n 44.121182\n ],\n [\n 117.904098,\n 44.121182\n ],\n [\n 117.859876,\n 44.072987\n ],\n [\n 117.827793,\n 44.063113\n ],\n [\n 117.790219,\n 44.019482\n ],\n [\n 117.700331,\n 44.016353\n ],\n [\n 117.643392,\n 44.042207\n ],\n [\n 117.686746,\n 44.095033\n ],\n [\n 117.624894,\n 44.128745\n ],\n [\n 117.634721,\n 44.14847\n ],\n [\n 117.550613,\n 44.187736\n ],\n [\n 117.522866,\n 44.226811\n ],\n [\n 117.452631,\n 44.235017\n ],\n [\n 117.206666,\n 44.220081\n ],\n [\n 117.166201,\n 44.192662\n ],\n [\n 117.120823,\n 44.179195\n ],\n [\n 117.011281,\n 44.057681\n ],\n [\n 116.961567,\n 44.024752\n ],\n [\n 116.970816,\n 43.988674\n ],\n [\n 117.022264,\n 43.969721\n ],\n [\n 117.031802,\n 43.942845\n ],\n [\n 117.000008,\n 43.912328\n ],\n [\n 117.013304,\n 43.85075\n ],\n [\n 116.986135,\n 43.840343\n ],\n [\n 117.001164,\n 43.782495\n ],\n [\n 117.053768,\n 43.753384\n ],\n [\n 116.971683,\n 43.673422\n ],\n [\n 116.858383,\n 43.657351\n ],\n [\n 116.837284,\n 43.614086\n ],\n [\n 116.812138,\n 43.612593\n ],\n [\n 116.804912,\n 43.565147\n ],\n [\n 116.830636,\n 43.5067\n ],\n [\n 116.790461,\n 43.484436\n ],\n [\n 116.734967,\n 43.509026\n ],\n [\n 116.681207,\n 43.517165\n ],\n [\n 116.621956,\n 43.505039\n ],\n [\n 116.59681,\n 43.410605\n ],\n [\n 116.518194,\n 43.365664\n ],\n [\n 116.436398,\n 43.328188\n ],\n [\n 116.413853,\n 43.258003\n ],\n [\n 116.37021,\n 43.243323\n ],\n [\n 116.356336,\n 43.156835\n ],\n [\n 116.419345,\n 43.104015\n ],\n [\n 116.436109,\n 43.077922\n ],\n [\n 116.503742,\n 43.04914\n ],\n [\n 116.500852,\n 43.01532\n ],\n [\n 116.580624,\n 42.985336\n ],\n [\n 116.664732,\n 42.933038\n ],\n [\n 116.673981,\n 42.889758\n ],\n [\n 116.666177,\n 42.81655\n ],\n [\n 116.67427,\n 42.761586\n ],\n [\n 116.619354,\n 42.671387\n ],\n [\n 116.58785,\n 42.599775\n ],\n [\n 116.63554,\n 42.614609\n ],\n [\n 116.638141,\n 42.577179\n ],\n [\n 116.669357,\n 42.555755\n ],\n [\n 116.699127,\n 42.592019\n ],\n [\n 116.801444,\n 42.582913\n ],\n [\n 116.82052,\n 42.546981\n ],\n [\n 116.885552,\n 42.534662\n ],\n [\n 116.875725,\n 42.482996\n ],\n [\n 116.907807,\n 42.443965\n ],\n [\n 116.893645,\n 42.387826\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 152900,\n \"name\": \"阿拉善盟\",\n \"center\": [\n 105.706422,\n 38.844814\n ],\n \"centroid\": [\n 102.422231,\n 40.532548\n ],\n \"childrenNum\": 3,\n \"level\": \"city\",\n \"subFeatureIndex\": 11,\n \"acroutes\": [\n 100000,\n 150000\n ],\n \"parent\": {\n \"adcode\": 150000\n }\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 105.226615,\n 41.748186\n ],\n [\n 105.226326,\n 41.67877\n ],\n [\n 105.201759,\n 41.542456\n ],\n [\n 105.222858,\n 41.396748\n ],\n [\n 105.245691,\n 41.32403\n ],\n [\n 105.317082,\n 41.201446\n ],\n [\n 105.334424,\n 41.131442\n ],\n [\n 105.31766,\n 41.113153\n ],\n [\n 105.379224,\n 41.059464\n ],\n [\n 105.403213,\n 41.015756\n ],\n [\n 105.395409,\n 40.984987\n ],\n [\n 105.503507,\n 40.927559\n ],\n [\n 105.559001,\n 40.89017\n ],\n [\n 105.636461,\n 40.854492\n ],\n [\n 105.697447,\n 40.811168\n ],\n [\n 105.781266,\n 40.785333\n ],\n [\n 105.835604,\n 40.781864\n ],\n [\n 105.944279,\n 40.739534\n ],\n [\n 106.115097,\n 40.717838\n ],\n [\n 106.161631,\n 40.68502\n ],\n [\n 106.237935,\n 40.661221\n ],\n [\n 106.235334,\n 40.626636\n ],\n [\n 106.273197,\n 40.591165\n ],\n [\n 106.321754,\n 40.589425\n ],\n [\n 106.467137,\n 40.546276\n ],\n [\n 106.482455,\n 40.502925\n ],\n [\n 106.37956,\n 40.501009\n ],\n [\n 106.34979,\n 40.527999\n ],\n [\n 106.282446,\n 40.548539\n ],\n [\n 106.268283,\n 40.519294\n ],\n [\n 106.197182,\n 40.515637\n ],\n [\n 106.219148,\n 40.461289\n ],\n [\n 106.32002,\n 40.34024\n ],\n [\n 106.426961,\n 40.339542\n ],\n [\n 106.476386,\n 40.319113\n ],\n [\n 106.528122,\n 40.365375\n ],\n [\n 106.604426,\n 40.377764\n ],\n [\n 106.672349,\n 40.375845\n ],\n [\n 106.820044,\n 40.355252\n ],\n [\n 106.765706,\n 40.29466\n ],\n [\n 106.705587,\n 40.262158\n ],\n [\n 106.740271,\n 40.196234\n ],\n [\n 106.866578,\n 40.181012\n ],\n [\n 106.801546,\n 40.10187\n ],\n [\n 106.759347,\n 40.083647\n ],\n [\n 106.718016,\n 40.047363\n ],\n [\n 106.720039,\n 39.993163\n ],\n [\n 106.704142,\n 39.967364\n ],\n [\n 106.723796,\n 39.932422\n ],\n [\n 106.696049,\n 39.890258\n ],\n [\n 106.754145,\n 39.850706\n ],\n [\n 106.766573,\n 39.763787\n ],\n [\n 106.757324,\n 39.710595\n ],\n [\n 106.795476,\n 39.689449\n ],\n [\n 106.755012,\n 39.626851\n ],\n [\n 106.637376,\n 39.573731\n ],\n [\n 106.611074,\n 39.543005\n ],\n [\n 106.635064,\n 39.476209\n ],\n [\n 106.73449,\n 39.437303\n ],\n [\n 106.750965,\n 39.381559\n ],\n [\n 106.680731,\n 39.355885\n ],\n [\n 106.602692,\n 39.375363\n ],\n [\n 106.555869,\n 39.322228\n ],\n [\n 106.525232,\n 39.308406\n ],\n [\n 106.506445,\n 39.270116\n ],\n [\n 106.402972,\n 39.291568\n ],\n [\n 106.279845,\n 39.262136\n ],\n [\n 106.295452,\n 39.167907\n ],\n [\n 106.250941,\n 39.131494\n ],\n [\n 106.146023,\n 39.153166\n ],\n [\n 106.098333,\n 39.087597\n ],\n [\n 106.078101,\n 39.026592\n ],\n [\n 106.089373,\n 39.015916\n ],\n [\n 106.060759,\n 38.968563\n ],\n [\n 106.018849,\n 38.951109\n ],\n [\n 105.973183,\n 38.911377\n ],\n [\n 106.002953,\n 38.875902\n ],\n [\n 105.935898,\n 38.810075\n ],\n [\n 105.898613,\n 38.789547\n ],\n [\n 105.905838,\n 38.731324\n ],\n [\n 105.893121,\n 38.691111\n ],\n [\n 105.852946,\n 38.641574\n ],\n [\n 105.875201,\n 38.591823\n ],\n [\n 105.856703,\n 38.572128\n ],\n [\n 105.862773,\n 38.526272\n ],\n [\n 105.83676,\n 38.475903\n ],\n [\n 105.835604,\n 38.390322\n ],\n [\n 105.82173,\n 38.368058\n ],\n [\n 105.865952,\n 38.29727\n ],\n [\n 105.84254,\n 38.241165\n ],\n [\n 105.797163,\n 38.217055\n ],\n [\n 105.775196,\n 38.186817\n ],\n [\n 105.76797,\n 38.121619\n ],\n [\n 105.782133,\n 38.082327\n ],\n [\n 105.839939,\n 38.007832\n ],\n [\n 105.799764,\n 37.940125\n ],\n [\n 105.808724,\n 37.87543\n ],\n [\n 105.760745,\n 37.799819\n ],\n [\n 105.677504,\n 37.771943\n ],\n [\n 105.62201,\n 37.777736\n ],\n [\n 105.616229,\n 37.722501\n ],\n [\n 105.598887,\n 37.699308\n ],\n [\n 105.467378,\n 37.694958\n ],\n [\n 105.403791,\n 37.709999\n ],\n [\n 105.31477,\n 37.702026\n ],\n [\n 105.221991,\n 37.677014\n ],\n [\n 105.111003,\n 37.633857\n ],\n [\n 105.028051,\n 37.581055\n ],\n [\n 104.866482,\n 37.566714\n ],\n [\n 104.806075,\n 37.539659\n ],\n [\n 104.623696,\n 37.522585\n ],\n [\n 104.41964,\n 37.511866\n ],\n [\n 104.407501,\n 37.464614\n ],\n [\n 104.322526,\n 37.448432\n ],\n [\n 104.23784,\n 37.411874\n ],\n [\n 104.183502,\n 37.40678\n ],\n [\n 104.074537,\n 37.475158\n ],\n [\n 103.93349,\n 37.574157\n ],\n [\n 103.871348,\n 37.605737\n ],\n [\n 103.841,\n 37.647459\n ],\n [\n 103.683189,\n 37.777918\n ],\n [\n 103.636077,\n 37.795476\n ],\n [\n 103.401962,\n 37.861869\n ],\n [\n 103.385487,\n 37.946989\n ],\n [\n 103.368145,\n 37.985631\n ],\n [\n 103.368723,\n 38.088997\n ],\n [\n 103.534916,\n 38.156747\n ],\n [\n 103.507747,\n 38.28091\n ],\n [\n 103.466416,\n 38.350996\n ],\n [\n 103.416413,\n 38.405041\n ],\n [\n 103.859787,\n 38.644436\n ],\n [\n 104.011528,\n 38.859139\n ],\n [\n 104.044478,\n 38.894979\n ],\n [\n 104.167894,\n 38.940421\n ],\n [\n 104.196219,\n 38.988149\n ],\n [\n 104.191017,\n 39.042249\n ],\n [\n 104.207202,\n 39.083685\n ],\n [\n 104.177432,\n 39.152101\n ],\n [\n 104.047657,\n 39.297772\n ],\n [\n 104.073381,\n 39.351811\n ],\n [\n 104.090145,\n 39.419788\n ],\n [\n 103.955745,\n 39.457112\n ],\n [\n 103.838977,\n 39.460295\n ],\n [\n 103.595324,\n 39.386693\n ],\n [\n 103.428842,\n 39.353582\n ],\n [\n 103.346468,\n 39.332504\n ],\n [\n 103.188079,\n 39.215481\n ],\n [\n 103.133163,\n 39.192763\n ],\n [\n 103.013215,\n 39.101107\n ],\n [\n 102.947027,\n 39.106794\n ],\n [\n 102.583426,\n 39.180691\n ],\n [\n 102.453651,\n 39.255219\n ],\n [\n 102.352201,\n 39.231272\n ],\n [\n 102.286591,\n 39.192585\n ],\n [\n 102.059701,\n 39.143575\n ],\n [\n 102.008254,\n 39.125809\n ],\n [\n 101.897555,\n 39.11106\n ],\n [\n 101.8305,\n 39.093463\n ],\n [\n 101.926169,\n 39.00061\n ],\n [\n 101.955072,\n 38.986012\n ],\n [\n 102.045828,\n 38.904604\n ],\n [\n 102.07502,\n 38.891592\n ],\n [\n 101.941488,\n 38.808826\n ],\n [\n 101.873854,\n 38.734004\n ],\n [\n 101.777029,\n 38.660534\n ],\n [\n 101.679047,\n 38.690932\n ],\n [\n 101.601876,\n 38.655169\n ],\n [\n 101.557654,\n 38.715063\n ],\n [\n 101.412272,\n 38.764192\n ],\n [\n 101.331343,\n 38.777228\n ],\n [\n 101.306197,\n 38.801865\n ],\n [\n 101.341459,\n 38.82221\n ],\n [\n 101.335389,\n 38.846831\n ],\n [\n 101.242032,\n 38.861279\n ],\n [\n 101.237697,\n 38.907278\n ],\n [\n 101.198678,\n 38.943271\n ],\n [\n 101.228737,\n 39.02072\n ],\n [\n 101.117171,\n 38.975151\n ],\n [\n 100.969187,\n 38.947012\n ],\n [\n 100.969476,\n 38.996694\n ],\n [\n 100.901843,\n 39.029973\n ],\n [\n 100.875541,\n 39.00239\n ],\n [\n 100.835077,\n 39.026059\n ],\n [\n 100.829296,\n 39.074973\n ],\n [\n 100.864269,\n 39.106972\n ],\n [\n 100.84288,\n 39.200218\n ],\n [\n 100.842013,\n 39.405809\n ],\n [\n 100.707903,\n 39.40457\n ],\n [\n 100.617436,\n 39.387401\n ],\n [\n 100.499222,\n 39.4005\n ],\n [\n 100.500668,\n 39.481336\n ],\n [\n 100.44315,\n 39.485578\n ],\n [\n 100.326382,\n 39.509085\n ],\n [\n 100.300947,\n 39.572318\n ],\n [\n 100.314242,\n 39.606914\n ],\n [\n 100.250078,\n 39.685042\n ],\n [\n 100.127817,\n 39.702137\n ],\n [\n 100.040819,\n 39.757096\n ],\n [\n 99.904396,\n 39.785791\n ],\n [\n 99.822022,\n 39.860025\n ],\n [\n 99.672593,\n 39.887974\n ],\n [\n 99.487903,\n 39.876022\n ],\n [\n 99.441079,\n 39.885865\n ],\n [\n 99.459577,\n 39.898166\n ],\n [\n 99.524609,\n 39.888149\n ],\n [\n 99.713925,\n 39.972103\n ],\n [\n 99.75121,\n 40.006849\n ],\n [\n 99.841388,\n 40.01334\n ],\n [\n 99.928386,\n 40.064894\n ],\n [\n 99.955844,\n 40.150907\n ],\n [\n 100.0018,\n 40.196934\n ],\n [\n 100.169727,\n 40.277537\n ],\n [\n 100.169727,\n 40.541403\n ],\n [\n 100.242563,\n 40.61864\n ],\n [\n 100.23736,\n 40.716796\n ],\n [\n 100.108163,\n 40.875624\n ],\n [\n 100.057005,\n 40.908002\n ],\n [\n 99.985903,\n 40.909733\n ],\n [\n 99.673171,\n 40.932924\n ],\n [\n 99.565941,\n 40.846696\n ],\n [\n 99.174882,\n 40.858303\n ],\n [\n 99.173148,\n 40.747343\n ],\n [\n 99.125747,\n 40.715234\n ],\n [\n 99.102046,\n 40.676335\n ],\n [\n 99.041638,\n 40.693703\n ],\n [\n 98.984988,\n 40.782905\n ],\n [\n 98.791049,\n 40.705337\n ],\n [\n 98.807234,\n 40.65931\n ],\n [\n 98.800298,\n 40.610294\n ],\n [\n 98.715611,\n 40.661742\n ],\n [\n 98.687864,\n 40.696829\n ],\n [\n 98.668499,\n 40.772845\n ],\n [\n 98.56994,\n 40.746822\n ],\n [\n 98.628035,\n 40.677898\n ],\n [\n 98.344206,\n 40.568376\n ],\n [\n 98.333223,\n 40.919079\n ],\n [\n 98.250271,\n 40.939153\n ],\n [\n 98.18495,\n 40.988099\n ],\n [\n 98.142463,\n 41.001756\n ],\n [\n 97.971934,\n 41.097966\n ],\n [\n 97.629432,\n 41.440547\n ],\n [\n 97.614114,\n 41.47728\n ],\n [\n 97.847073,\n 41.656527\n ],\n [\n 97.500814,\n 42.243867\n ],\n [\n 97.371328,\n 42.456978\n ],\n [\n 97.172763,\n 42.795209\n ],\n [\n 97.282595,\n 42.782098\n ],\n [\n 97.831754,\n 42.706069\n ],\n [\n 98.195355,\n 42.653366\n ],\n [\n 98.546528,\n 42.638203\n ],\n [\n 98.962733,\n 42.606855\n ],\n [\n 99.507557,\n 42.56807\n ],\n [\n 99.969139,\n 42.647806\n ],\n [\n 100.272622,\n 42.63635\n ],\n [\n 100.325515,\n 42.690077\n ],\n [\n 100.576683,\n 42.682838\n ],\n [\n 100.862824,\n 42.671219\n ],\n [\n 101.155034,\n 42.613935\n ],\n [\n 101.581644,\n 42.52521\n ],\n [\n 101.80362,\n 42.503769\n ],\n [\n 101.981952,\n 42.326556\n ],\n [\n 102.070395,\n 42.232166\n ],\n [\n 102.093807,\n 42.223686\n ],\n [\n 102.449026,\n 42.144088\n ],\n [\n 102.540938,\n 42.162257\n ],\n [\n 102.712045,\n 42.152749\n ],\n [\n 103.021886,\n 42.028162\n ],\n [\n 103.207444,\n 41.962796\n ],\n [\n 103.418437,\n 41.882359\n ],\n [\n 103.868747,\n 41.802503\n ],\n [\n 104.095636,\n 41.80865\n ],\n [\n 104.53005,\n 41.874855\n ],\n [\n 104.52427,\n 41.661832\n ],\n [\n 104.689017,\n 41.645232\n ],\n [\n 104.923133,\n 41.654131\n ],\n [\n 105.009553,\n 41.583243\n ],\n [\n 105.226615,\n 41.748186\n ]\n ]\n ]\n ]\n }\n }\n ]\n}', 'admin', '2020-05-19 16:42:33', 'jeecg', '2020-05-19 16:42:33', '0', NULL); +INSERT INTO `jimu_report_map` VALUES ('1262343644795432961', '河北省', '河北省', '{\n \"type\": \"FeatureCollection\",\n \"features\": [\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 130100,\n \"name\": \"石家庄市\",\n \"center\": [\n 114.502461,\n 38.045474\n ],\n \"centroid\": [\n 114.44505,\n 38.133023\n ],\n \"childrenNum\": 22,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 130000\n },\n \"subFeatureIndex\": 0,\n \"acroutes\": [\n 100000,\n 130000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 113.839548,\n 38.758413\n ],\n [\n 113.864664,\n 38.746006\n ],\n [\n 113.883245,\n 38.74667\n ],\n [\n 113.932324,\n 38.71362\n ],\n [\n 113.929697,\n 38.702467\n ],\n [\n 113.964617,\n 38.699811\n ],\n [\n 113.991655,\n 38.676769\n ],\n [\n 114.028624,\n 38.688524\n ],\n [\n 114.052139,\n 38.686399\n ],\n [\n 114.086097,\n 38.65837\n ],\n [\n 114.125053,\n 38.659632\n ],\n [\n 114.129153,\n 38.669596\n ],\n [\n 114.182205,\n 38.67657\n ],\n [\n 114.212831,\n 38.688192\n ],\n [\n 114.311502,\n 38.706517\n ],\n [\n 114.341167,\n 38.690184\n ],\n [\n 114.366411,\n 38.6862\n ],\n [\n 114.413504,\n 38.703928\n ],\n [\n 114.437787,\n 38.692773\n ],\n [\n 114.452652,\n 38.699413\n ],\n [\n 114.498463,\n 38.678297\n ],\n [\n 114.522106,\n 38.65372\n ],\n [\n 114.53633,\n 38.649268\n ],\n [\n 114.536907,\n 38.632324\n ],\n [\n 114.552284,\n 38.612983\n ],\n [\n 114.527616,\n 38.590644\n ],\n [\n 114.56324,\n 38.590644\n ],\n [\n 114.58432,\n 38.596429\n ],\n [\n 114.595724,\n 38.568897\n ],\n [\n 114.635257,\n 38.514801\n ],\n [\n 114.651851,\n 38.504682\n ],\n [\n 114.6737,\n 38.473452\n ],\n [\n 114.702084,\n 38.489102\n ],\n [\n 114.729442,\n 38.484574\n ],\n [\n 114.765259,\n 38.496626\n ],\n [\n 114.81075,\n 38.492365\n ],\n [\n 114.830868,\n 38.46033\n ],\n [\n 114.819143,\n 38.449871\n ],\n [\n 114.837852,\n 38.435745\n ],\n [\n 114.840992,\n 38.460797\n ],\n [\n 114.858163,\n 38.448605\n ],\n [\n 114.853998,\n 38.435879\n ],\n [\n 114.882254,\n 38.424149\n ],\n [\n 114.910381,\n 38.393751\n ],\n [\n 114.923388,\n 38.388217\n ],\n [\n 114.932871,\n 38.344194\n ],\n [\n 114.942994,\n 38.343193\n ],\n [\n 114.922875,\n 38.315631\n ],\n [\n 114.906986,\n 38.309624\n ],\n [\n 114.902565,\n 38.294936\n ],\n [\n 114.883343,\n 38.284854\n ],\n [\n 114.886162,\n 38.265286\n ],\n [\n 114.915059,\n 38.263348\n ],\n [\n 114.927681,\n 38.283385\n ],\n [\n 114.970096,\n 38.281114\n ],\n [\n 114.990087,\n 38.272165\n ],\n [\n 114.989062,\n 38.258138\n ],\n [\n 115.031862,\n 38.267089\n ],\n [\n 115.056465,\n 38.258472\n ],\n [\n 115.066204,\n 38.264684\n ],\n [\n 115.056722,\n 38.288326\n ],\n [\n 115.073765,\n 38.293134\n ],\n [\n 115.085874,\n 38.276773\n ],\n [\n 115.108107,\n 38.264551\n ],\n [\n 115.152317,\n 38.256802\n ],\n [\n 115.168591,\n 38.259608\n ],\n [\n 115.19422,\n 38.236759\n ],\n [\n 115.210174,\n 38.236491\n ],\n [\n 115.225871,\n 38.269894\n ],\n [\n 115.252205,\n 38.29093\n ],\n [\n 115.265788,\n 38.287658\n ],\n [\n 115.263994,\n 38.260543\n ],\n [\n 115.273605,\n 38.2403\n ],\n [\n 115.302758,\n 38.235289\n ],\n [\n 115.324734,\n 38.248184\n ],\n [\n 115.323645,\n 38.220586\n ],\n [\n 115.35094,\n 38.210493\n ],\n [\n 115.342418,\n 38.196254\n ],\n [\n 115.346903,\n 38.13967\n ],\n [\n 115.364843,\n 38.13793\n ],\n [\n 115.383232,\n 38.0886\n ],\n [\n 115.420522,\n 38.089671\n ],\n [\n 115.439871,\n 38.082038\n ],\n [\n 115.468063,\n 38.095161\n ],\n [\n 115.482992,\n 38.08398\n ],\n [\n 115.466782,\n 38.063554\n ],\n [\n 115.45134,\n 38.017323\n ],\n [\n 115.438205,\n 38.001102\n ],\n [\n 115.464219,\n 37.99299\n ],\n [\n 115.444997,\n 37.989168\n ],\n [\n 115.456017,\n 37.974551\n ],\n [\n 115.457555,\n 37.95074\n ],\n [\n 115.448585,\n 37.936584\n ],\n [\n 115.412769,\n 37.943293\n ],\n [\n 115.408668,\n 37.918936\n ],\n [\n 115.385795,\n 37.917191\n ],\n [\n 115.365484,\n 37.906318\n ],\n [\n 115.360294,\n 37.880068\n ],\n [\n 115.389831,\n 37.874629\n ],\n [\n 115.388614,\n 37.853003\n ],\n [\n 115.363049,\n 37.849845\n ],\n [\n 115.360166,\n 37.820215\n ],\n [\n 115.349722,\n 37.805765\n ],\n [\n 115.352349,\n 37.784052\n ],\n [\n 115.371635,\n 37.770335\n ],\n [\n 115.344468,\n 37.74814\n ],\n [\n 115.360294,\n 37.731994\n ],\n [\n 115.386179,\n 37.727082\n ],\n [\n 115.394316,\n 37.712143\n ],\n [\n 115.380989,\n 37.707432\n ],\n [\n 115.333768,\n 37.71322\n ],\n [\n 115.317046,\n 37.695383\n ],\n [\n 115.325567,\n 37.682458\n ],\n [\n 115.316853,\n 37.660102\n ],\n [\n 115.301412,\n 37.660169\n ],\n [\n 115.297376,\n 37.629587\n ],\n [\n 115.258356,\n 37.639625\n ],\n [\n 115.255088,\n 37.645621\n ],\n [\n 115.253807,\n 37.671415\n ],\n [\n 115.261431,\n 37.68818\n ],\n [\n 115.243235,\n 37.722641\n ],\n [\n 115.227281,\n 37.732599\n ],\n [\n 115.172564,\n 37.749351\n ],\n [\n 115.152765,\n 37.759507\n ],\n [\n 115.160262,\n 37.780287\n ],\n [\n 115.150523,\n 37.808521\n ],\n [\n 115.131173,\n 37.799783\n ],\n [\n 115.122972,\n 37.811479\n ],\n [\n 115.097471,\n 37.807849\n ],\n [\n 115.097215,\n 37.797498\n ],\n [\n 115.072099,\n 37.788893\n ],\n [\n 115.066653,\n 37.771007\n ],\n [\n 115.070049,\n 37.745651\n ],\n [\n 115.041024,\n 37.733541\n ],\n [\n 115.012512,\n 37.75157\n ],\n [\n 115.001748,\n 37.734685\n ],\n [\n 114.987524,\n 37.742691\n ],\n [\n 114.960165,\n 37.720084\n ],\n [\n 114.931846,\n 37.728899\n ],\n [\n 114.904038,\n 37.729302\n ],\n [\n 114.895965,\n 37.712547\n ],\n [\n 114.881357,\n 37.716113\n ],\n [\n 114.871041,\n 37.702114\n ],\n [\n 114.847783,\n 37.69673\n ],\n [\n 114.841504,\n 37.676129\n ],\n [\n 114.808571,\n 37.659832\n ],\n [\n 114.797423,\n 37.628239\n ],\n [\n 114.764618,\n 37.624399\n ],\n [\n 114.725983,\n 37.630665\n ],\n [\n 114.707338,\n 37.615774\n ],\n [\n 114.698816,\n 37.589353\n ],\n [\n 114.680171,\n 37.565283\n ],\n [\n 114.64679,\n 37.556247\n ],\n [\n 114.585217,\n 37.55301\n ],\n [\n 114.519927,\n 37.574656\n ],\n [\n 114.483471,\n 37.576814\n ],\n [\n 114.433495,\n 37.552537\n ],\n [\n 114.412095,\n 37.549907\n ],\n [\n 114.37269,\n 37.52967\n ],\n [\n 114.370192,\n 37.513612\n ],\n [\n 114.358274,\n 37.519212\n ],\n [\n 114.334632,\n 37.502949\n ],\n [\n 114.310861,\n 37.499979\n ],\n [\n 114.303621,\n 37.507808\n ],\n [\n 114.27293,\n 37.494445\n ],\n [\n 114.255439,\n 37.504096\n ],\n [\n 114.215009,\n 37.51125\n ],\n [\n 114.184575,\n 37.530817\n ],\n [\n 114.166123,\n 37.528186\n ],\n [\n 114.156191,\n 37.505244\n ],\n [\n 114.133766,\n 37.498899\n ],\n [\n 114.126526,\n 37.481957\n ],\n [\n 114.113263,\n 37.493837\n ],\n [\n 114.096477,\n 37.490935\n ],\n [\n 114.06899,\n 37.447384\n ],\n [\n 114.022666,\n 37.435496\n ],\n [\n 114.028304,\n 37.474598\n ],\n [\n 114.036762,\n 37.494175\n ],\n [\n 114.059635,\n 37.515906\n ],\n [\n 114.118325,\n 37.590634\n ],\n [\n 114.115378,\n 37.619884\n ],\n [\n 114.131139,\n 37.648315\n ],\n [\n 114.139725,\n 37.675927\n ],\n [\n 114.128256,\n 37.69821\n ],\n [\n 114.088275,\n 37.708845\n ],\n [\n 114.068029,\n 37.721564\n ],\n [\n 113.993769,\n 37.706893\n ],\n [\n 114.000817,\n 37.735358\n ],\n [\n 114.041182,\n 37.756817\n ],\n [\n 114.043873,\n 37.777463\n ],\n [\n 114.018821,\n 37.794876\n ],\n [\n 114.006648,\n 37.813495\n ],\n [\n 113.982557,\n 37.812823\n ],\n [\n 113.970191,\n 37.833923\n ],\n [\n 113.971536,\n 37.868786\n ],\n [\n 113.956864,\n 37.911419\n ],\n [\n 113.929185,\n 37.932022\n ],\n [\n 113.922842,\n 37.952082\n ],\n [\n 113.90125,\n 37.98481\n ],\n [\n 113.872353,\n 37.990375\n ],\n [\n 113.878376,\n 38.032402\n ],\n [\n 113.876261,\n 38.055047\n ],\n [\n 113.856015,\n 38.065898\n ],\n [\n 113.854733,\n 38.077082\n ],\n [\n 113.824235,\n 38.106676\n ],\n [\n 113.810075,\n 38.112566\n ],\n [\n 113.822505,\n 38.150442\n ],\n [\n 113.83359,\n 38.147431\n ],\n [\n 113.828848,\n 38.168971\n ],\n [\n 113.796876,\n 38.162884\n ],\n [\n 113.756575,\n 38.171713\n ],\n [\n 113.731139,\n 38.168369\n ],\n [\n 113.720631,\n 38.174656\n ],\n [\n 113.738507,\n 38.189501\n ],\n [\n 113.715057,\n 38.193713\n ],\n [\n 113.711725,\n 38.213702\n ],\n [\n 113.679112,\n 38.205413\n ],\n [\n 113.657072,\n 38.225599\n ],\n [\n 113.636761,\n 38.232682\n ],\n [\n 113.598894,\n 38.227136\n ],\n [\n 113.570318,\n 38.237427\n ],\n [\n 113.566282,\n 38.252393\n ],\n [\n 113.544818,\n 38.270495\n ],\n [\n 113.546035,\n 38.293067\n ],\n [\n 113.557248,\n 38.34346\n ],\n [\n 113.53431,\n 38.365208\n ],\n [\n 113.525468,\n 38.383016\n ],\n [\n 113.538026,\n 38.418017\n ],\n [\n 113.573202,\n 38.449205\n ],\n [\n 113.583517,\n 38.465992\n ],\n [\n 113.561348,\n 38.485773\n ],\n [\n 113.555518,\n 38.521058\n ],\n [\n 113.562053,\n 38.558321\n ],\n [\n 113.602803,\n 38.586854\n ],\n [\n 113.604212,\n 38.616107\n ],\n [\n 113.612862,\n 38.646013\n ],\n [\n 113.632596,\n 38.653122\n ],\n [\n 113.667067,\n 38.646943\n ],\n [\n 113.702114,\n 38.65166\n ],\n [\n 113.713839,\n 38.663684\n ],\n [\n 113.709995,\n 38.698284\n ],\n [\n 113.729024,\n 38.71196\n ],\n [\n 113.745363,\n 38.701538\n ],\n [\n 113.775669,\n 38.709836\n ],\n [\n 113.78041,\n 38.728355\n ],\n [\n 113.802899,\n 38.763321\n ],\n [\n 113.839548,\n 38.758413\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 130200,\n \"name\": \"唐山市\",\n \"center\": [\n 118.175393,\n 39.635113\n ],\n \"centroid\": [\n 118.343434,\n 39.717249\n ],\n \"childrenNum\": 14,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 130000\n },\n \"subFeatureIndex\": 1,\n \"acroutes\": [\n 100000,\n 130000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 119.319039,\n 39.429554\n ],\n [\n 119.317052,\n 39.410759\n ],\n [\n 119.272779,\n 39.363616\n ],\n [\n 119.239269,\n 39.352368\n ],\n [\n 119.185577,\n 39.342039\n ],\n [\n 119.121505,\n 39.281549\n ],\n [\n 119.096068,\n 39.241963\n ],\n [\n 119.038276,\n 39.21178\n ],\n [\n 119.023988,\n 39.186925\n ],\n [\n 118.977984,\n 39.163381\n ],\n [\n 118.926278,\n 39.123464\n ],\n [\n 118.890013,\n 39.118844\n ],\n [\n 118.896549,\n 39.139698\n ],\n [\n 118.952035,\n 39.175649\n ],\n [\n 118.920447,\n 39.171758\n ],\n [\n 118.897253,\n 39.151508\n ],\n [\n 118.876366,\n 39.14999\n ],\n [\n 118.857913,\n 39.162854\n ],\n [\n 118.814409,\n 39.138642\n ],\n [\n 118.760716,\n 39.133495\n ],\n [\n 118.719646,\n 39.136992\n ],\n [\n 118.692992,\n 39.148077\n ],\n [\n 118.637314,\n 39.157379\n ],\n [\n 118.59272,\n 39.142601\n ],\n [\n 118.578752,\n 39.130921\n ],\n [\n 118.588619,\n 39.107623\n ],\n [\n 118.560107,\n 39.09904\n ],\n [\n 118.551394,\n 39.088278\n ],\n [\n 118.532877,\n 39.091051\n ],\n [\n 118.570487,\n 38.999212\n ],\n [\n 118.604445,\n 38.971505\n ],\n [\n 118.539732,\n 38.909835\n ],\n [\n 118.525252,\n 38.90487\n ],\n [\n 118.491038,\n 38.909041\n ],\n [\n 118.406463,\n 38.960525\n ],\n [\n 118.378015,\n 38.97177\n ],\n [\n 118.371031,\n 38.984137\n ],\n [\n 118.373594,\n 39.012037\n ],\n [\n 118.309907,\n 39.011773\n ],\n [\n 118.290813,\n 39.022216\n ],\n [\n 118.267107,\n 39.021555\n ],\n [\n 118.225011,\n 39.034839\n ],\n [\n 118.182596,\n 39.094155\n ],\n [\n 118.16299,\n 39.136596\n ],\n [\n 118.121151,\n 39.186068\n ],\n [\n 118.07771,\n 39.202024\n ],\n [\n 118.07047,\n 39.214021\n ],\n [\n 118.037153,\n 39.220348\n ],\n [\n 118.037089,\n 39.230497\n ],\n [\n 118.064768,\n 39.231222\n ],\n [\n 118.064768,\n 39.256061\n ],\n [\n 118.036512,\n 39.265151\n ],\n [\n 118.024787,\n 39.292414\n ],\n [\n 118.016842,\n 39.284117\n ],\n [\n 117.97763,\n 39.300643\n ],\n [\n 117.972248,\n 39.314401\n ],\n [\n 117.891774,\n 39.32322\n ],\n [\n 117.888314,\n 39.332038\n ],\n [\n 117.84955,\n 39.327366\n ],\n [\n 117.842054,\n 39.336512\n ],\n [\n 117.862877,\n 39.362169\n ],\n [\n 117.837056,\n 39.350789\n ],\n [\n 117.803354,\n 39.362037\n ],\n [\n 117.805277,\n 39.373284\n ],\n [\n 117.852369,\n 39.38078\n ],\n [\n 117.859353,\n 39.403265\n ],\n [\n 117.871847,\n 39.411547\n ],\n [\n 117.87031,\n 39.45498\n ],\n [\n 117.878062,\n 39.467196\n ],\n [\n 117.898181,\n 39.472516\n ],\n [\n 117.898565,\n 39.509675\n ],\n [\n 117.912277,\n 39.516172\n ],\n [\n 117.905293,\n 39.53015\n ],\n [\n 117.933997,\n 39.574164\n ],\n [\n 117.892607,\n 39.591539\n ],\n [\n 117.868259,\n 39.596849\n ],\n [\n 117.851408,\n 39.589244\n ],\n [\n 117.826548,\n 39.590818\n ],\n [\n 117.801945,\n 39.601765\n ],\n [\n 117.76773,\n 39.599012\n ],\n [\n 117.747868,\n 39.589375\n ],\n [\n 117.753122,\n 39.576\n ],\n [\n 117.737745,\n 39.574033\n ],\n [\n 117.744857,\n 39.548585\n ],\n [\n 117.71596,\n 39.530084\n ],\n [\n 117.710194,\n 39.550422\n ],\n [\n 117.689563,\n 39.559539\n ],\n [\n 117.688794,\n 39.569246\n ],\n [\n 117.708913,\n 39.572918\n ],\n [\n 117.68495,\n 39.588916\n ],\n [\n 117.660795,\n 39.57541\n ],\n [\n 117.636191,\n 39.603731\n ],\n [\n 117.621967,\n 39.59167\n ],\n [\n 117.619084,\n 39.603207\n ],\n [\n 117.641189,\n 39.612645\n ],\n [\n 117.641957,\n 39.628438\n ],\n [\n 117.662012,\n 39.636365\n ],\n [\n 117.668355,\n 39.667085\n ],\n [\n 117.657014,\n 39.668657\n ],\n [\n 117.643944,\n 39.688692\n ],\n [\n 117.644777,\n 39.701849\n ],\n [\n 117.602425,\n 39.705384\n ],\n [\n 117.577629,\n 39.726913\n ],\n [\n 117.596082,\n 39.735222\n ],\n [\n 117.59589,\n 39.746147\n ],\n [\n 117.559305,\n 39.756088\n ],\n [\n 117.546106,\n 39.776164\n ],\n [\n 117.561419,\n 39.800024\n ],\n [\n 117.537264,\n 39.835178\n ],\n [\n 117.548092,\n 39.839882\n ],\n [\n 117.521374,\n 39.870641\n ],\n [\n 117.518811,\n 39.891271\n ],\n [\n 117.507406,\n 39.909023\n ],\n [\n 117.525539,\n 39.92964\n ],\n [\n 117.514967,\n 39.946665\n ],\n [\n 117.532907,\n 39.952469\n ],\n [\n 117.547323,\n 39.976855\n ],\n [\n 117.537777,\n 39.997452\n ],\n [\n 117.589226,\n 39.996866\n ],\n [\n 117.634589,\n 39.968901\n ],\n [\n 117.674698,\n 39.974834\n ],\n [\n 117.70667,\n 39.986046\n ],\n [\n 117.72775,\n 39.972422\n ],\n [\n 117.756326,\n 39.96512\n ],\n [\n 117.763566,\n 39.972748\n ],\n [\n 117.781826,\n 39.966293\n ],\n [\n 117.797075,\n 40.010225\n ],\n [\n 117.782467,\n 40.023516\n ],\n [\n 117.744152,\n 40.018434\n ],\n [\n 117.747932,\n 40.047421\n ],\n [\n 117.758312,\n 40.04436\n ],\n [\n 117.776188,\n 40.059272\n ],\n [\n 117.758184,\n 40.065978\n ],\n [\n 117.751648,\n 40.081993\n ],\n [\n 117.721983,\n 40.07991\n ],\n [\n 117.708272,\n 40.093643\n ],\n [\n 117.67489,\n 40.082123\n ],\n [\n 117.668099,\n 40.100931\n ],\n [\n 117.644841,\n 40.096181\n ],\n [\n 117.65317,\n 40.110757\n ],\n [\n 117.650159,\n 40.128191\n ],\n [\n 117.635999,\n 40.132094\n ],\n [\n 117.630232,\n 40.147833\n ],\n [\n 117.601208,\n 40.171239\n ],\n [\n 117.576412,\n 40.178584\n ],\n [\n 117.575451,\n 40.192817\n ],\n [\n 117.609409,\n 40.194897\n ],\n [\n 117.619532,\n 40.206398\n ],\n [\n 117.64625,\n 40.205163\n ],\n [\n 117.677069,\n 40.22095\n ],\n [\n 117.694112,\n 40.238161\n ],\n [\n 117.714551,\n 40.241668\n ],\n [\n 117.75152,\n 40.229718\n ],\n [\n 117.807775,\n 40.261926\n ],\n [\n 117.844104,\n 40.261406\n ],\n [\n 117.867554,\n 40.26965\n ],\n [\n 117.897989,\n 40.270429\n ],\n [\n 117.909457,\n 40.285876\n ],\n [\n 118.000888,\n 40.29256\n ],\n [\n 118.031643,\n 40.302358\n ],\n [\n 118.061564,\n 40.319095\n ],\n [\n 118.079312,\n 40.353528\n ],\n [\n 118.121856,\n 40.354695\n ],\n [\n 118.133837,\n 40.375113\n ],\n [\n 118.165232,\n 40.400449\n ],\n [\n 118.153123,\n 40.409519\n ],\n [\n 118.156967,\n 40.423768\n ],\n [\n 118.173818,\n 40.423056\n ],\n [\n 118.239684,\n 40.464686\n ],\n [\n 118.262942,\n 40.452063\n ],\n [\n 118.277935,\n 40.425711\n ],\n [\n 118.306575,\n 40.419558\n ],\n [\n 118.356295,\n 40.435295\n ],\n [\n 118.360011,\n 40.428819\n ],\n [\n 118.387305,\n 40.436719\n ],\n [\n 118.402683,\n 40.416838\n ],\n [\n 118.430746,\n 40.411851\n ],\n [\n 118.45599,\n 40.414053\n ],\n [\n 118.503211,\n 40.403365\n ],\n [\n 118.523458,\n 40.40628\n ],\n [\n 118.548062,\n 40.422667\n ],\n [\n 118.571512,\n 40.414636\n ],\n [\n 118.550881,\n 40.385482\n ],\n [\n 118.558377,\n 40.36928\n ],\n [\n 118.539989,\n 40.361048\n ],\n [\n 118.532364,\n 40.319419\n ],\n [\n 118.533325,\n 40.298854\n ],\n [\n 118.568949,\n 40.287564\n ],\n [\n 118.571384,\n 40.269845\n ],\n [\n 118.628472,\n 40.249915\n ],\n [\n 118.665634,\n 40.242577\n ],\n [\n 118.708562,\n 40.216078\n ],\n [\n 118.746108,\n 40.208087\n ],\n [\n 118.743609,\n 40.191777\n ],\n [\n 118.775581,\n 40.194182\n ],\n [\n 118.794482,\n 40.204838\n ],\n [\n 118.849135,\n 40.178974\n ],\n [\n 118.867652,\n 40.180599\n ],\n [\n 118.888924,\n 40.168768\n ],\n [\n 118.906736,\n 40.169679\n ],\n [\n 118.92474,\n 40.149653\n ],\n [\n 118.918269,\n 40.092211\n ],\n [\n 118.900521,\n 40.086549\n ],\n [\n 118.866307,\n 40.061942\n ],\n [\n 118.865602,\n 40.023777\n ],\n [\n 118.88508,\n 40.005403\n ],\n [\n 118.884247,\n 39.961794\n ],\n [\n 118.875149,\n 39.941121\n ],\n [\n 118.859643,\n 39.93362\n ],\n [\n 118.853556,\n 39.88409\n ],\n [\n 118.835232,\n 39.859018\n ],\n [\n 118.838179,\n 39.847981\n ],\n [\n 118.816843,\n 39.825836\n ],\n [\n 118.825429,\n 39.799436\n ],\n [\n 118.797942,\n 39.790415\n ],\n [\n 118.800185,\n 39.775706\n ],\n [\n 118.774428,\n 39.764198\n ],\n [\n 118.787242,\n 39.71592\n ],\n [\n 118.804157,\n 39.679985\n ],\n [\n 118.822225,\n 39.668984\n ],\n [\n 118.824596,\n 39.648681\n ],\n [\n 118.850097,\n 39.622737\n ],\n [\n 118.844586,\n 39.615004\n ],\n [\n 118.861309,\n 39.574754\n ],\n [\n 118.882261,\n 39.566557\n ],\n [\n 118.895139,\n 39.547011\n ],\n [\n 118.938452,\n 39.557572\n ],\n [\n 118.945243,\n 39.544781\n ],\n [\n 118.983302,\n 39.538942\n ],\n [\n 118.966067,\n 39.529494\n ],\n [\n 118.961453,\n 39.51591\n ],\n [\n 119.008098,\n 39.509347\n ],\n [\n 119.015658,\n 39.482103\n ],\n [\n 119.004894,\n 39.467459\n ],\n [\n 119.048399,\n 39.459052\n ],\n [\n 119.064545,\n 39.473763\n ],\n [\n 119.185769,\n 39.458986\n ],\n [\n 119.212295,\n 39.463453\n ],\n [\n 119.257401,\n 39.429752\n ],\n [\n 119.280403,\n 39.422852\n ],\n [\n 119.319039,\n 39.429554\n ]\n ]\n ],\n [\n [\n [\n 117.784581,\n 39.377032\n ],\n [\n 117.744601,\n 39.354604\n ],\n [\n 117.692318,\n 39.35171\n ],\n [\n 117.670918,\n 39.356446\n ],\n [\n 117.669316,\n 39.324141\n ],\n [\n 117.650799,\n 39.315191\n ],\n [\n 117.637536,\n 39.335986\n ],\n [\n 117.595249,\n 39.349144\n ],\n [\n 117.536239,\n 39.338026\n ],\n [\n 117.520862,\n 39.357236\n ],\n [\n 117.535342,\n 39.374007\n ],\n [\n 117.557895,\n 39.38558\n ],\n [\n 117.571158,\n 39.404646\n ],\n [\n 117.590636,\n 39.405435\n ],\n [\n 117.6014,\n 39.4195\n ],\n [\n 117.61415,\n 39.407078\n ],\n [\n 117.643495,\n 39.405829\n ],\n [\n 117.669124,\n 39.412008\n ],\n [\n 117.673224,\n 39.386698\n ],\n [\n 117.702313,\n 39.388934\n ],\n [\n 117.69975,\n 39.407604\n ],\n [\n 117.737296,\n 39.410562\n ],\n [\n 117.782147,\n 39.394785\n ],\n [\n 117.784581,\n 39.377032\n ]\n ]\n ],\n [\n [\n [\n 118.630522,\n 39.054726\n ],\n [\n 118.620847,\n 39.068268\n ],\n [\n 118.638852,\n 39.076061\n ],\n [\n 118.653652,\n 39.056973\n ],\n [\n 118.640005,\n 39.042306\n ],\n [\n 118.630522,\n 39.054726\n ]\n ]\n ],\n [\n [\n [\n 118.869446,\n 39.142733\n ],\n [\n 118.871753,\n 39.115082\n ],\n [\n 118.857465,\n 39.098842\n ],\n [\n 118.820495,\n 39.093693\n ],\n [\n 118.820239,\n 39.108745\n ],\n [\n 118.842664,\n 39.117788\n ],\n [\n 118.869446,\n 39.142733\n ]\n ]\n ],\n [\n [\n [\n 118.83914,\n 39.153817\n ],\n [\n 118.841511,\n 39.135475\n ],\n [\n 118.825749,\n 39.122672\n ],\n [\n 118.815177,\n 39.132373\n ],\n [\n 118.83914,\n 39.153817\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 130300,\n \"name\": \"秦皇岛市\",\n \"center\": [\n 119.586579,\n 39.942531\n ],\n \"centroid\": [\n 119.193332,\n 40.088346\n ],\n \"childrenNum\": 7,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 130000\n },\n \"subFeatureIndex\": 2,\n \"acroutes\": [\n 100000,\n 130000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 119.319039,\n 39.429554\n ],\n [\n 119.280403,\n 39.422852\n ],\n [\n 119.257401,\n 39.429752\n ],\n [\n 119.212295,\n 39.463453\n ],\n [\n 119.185769,\n 39.458986\n ],\n [\n 119.064545,\n 39.473763\n ],\n [\n 119.048399,\n 39.459052\n ],\n [\n 119.004894,\n 39.467459\n ],\n [\n 119.015658,\n 39.482103\n ],\n [\n 119.008098,\n 39.509347\n ],\n [\n 118.961453,\n 39.51591\n ],\n [\n 118.966067,\n 39.529494\n ],\n [\n 118.983302,\n 39.538942\n ],\n [\n 118.945243,\n 39.544781\n ],\n [\n 118.938452,\n 39.557572\n ],\n [\n 118.895139,\n 39.547011\n ],\n [\n 118.882261,\n 39.566557\n ],\n [\n 118.861309,\n 39.574754\n ],\n [\n 118.844586,\n 39.615004\n ],\n [\n 118.850097,\n 39.622737\n ],\n [\n 118.824596,\n 39.648681\n ],\n [\n 118.822225,\n 39.668984\n ],\n [\n 118.804157,\n 39.679985\n ],\n [\n 118.787242,\n 39.71592\n ],\n [\n 118.774428,\n 39.764198\n ],\n [\n 118.800185,\n 39.775706\n ],\n [\n 118.797942,\n 39.790415\n ],\n [\n 118.825429,\n 39.799436\n ],\n [\n 118.816843,\n 39.825836\n ],\n [\n 118.838179,\n 39.847981\n ],\n [\n 118.835232,\n 39.859018\n ],\n [\n 118.853556,\n 39.88409\n ],\n [\n 118.859643,\n 39.93362\n ],\n [\n 118.875149,\n 39.941121\n ],\n [\n 118.884247,\n 39.961794\n ],\n [\n 118.88508,\n 40.005403\n ],\n [\n 118.865602,\n 40.023777\n ],\n [\n 118.866307,\n 40.061942\n ],\n [\n 118.900521,\n 40.086549\n ],\n [\n 118.918269,\n 40.092211\n ],\n [\n 118.92474,\n 40.149653\n ],\n [\n 118.906736,\n 40.169679\n ],\n [\n 118.888924,\n 40.168768\n ],\n [\n 118.867652,\n 40.180599\n ],\n [\n 118.849135,\n 40.178974\n ],\n [\n 118.794482,\n 40.204838\n ],\n [\n 118.775581,\n 40.194182\n ],\n [\n 118.743609,\n 40.191777\n ],\n [\n 118.746108,\n 40.208087\n ],\n [\n 118.708562,\n 40.216078\n ],\n [\n 118.665634,\n 40.242577\n ],\n [\n 118.628472,\n 40.249915\n ],\n [\n 118.571384,\n 40.269845\n ],\n [\n 118.568949,\n 40.287564\n ],\n [\n 118.580098,\n 40.305861\n ],\n [\n 118.596949,\n 40.308456\n ],\n [\n 118.608225,\n 40.328305\n ],\n [\n 118.640197,\n 40.354566\n ],\n [\n 118.643785,\n 40.380946\n ],\n [\n 118.618349,\n 40.425193\n ],\n [\n 118.624179,\n 40.437626\n ],\n [\n 118.657176,\n 40.450574\n ],\n [\n 118.702795,\n 40.491411\n ],\n [\n 118.723491,\n 40.473746\n ],\n [\n 118.772954,\n 40.479765\n ],\n [\n 118.792112,\n 40.492382\n ],\n [\n 118.794867,\n 40.510753\n ],\n [\n 118.821328,\n 40.531964\n ],\n [\n 118.864,\n 40.527244\n ],\n [\n 118.886938,\n 40.542438\n ],\n [\n 118.919038,\n 40.53093\n ],\n [\n 118.966003,\n 40.536102\n ],\n [\n 118.952676,\n 40.558469\n ],\n [\n 118.983366,\n 40.56364\n ],\n [\n 118.998359,\n 40.578955\n ],\n [\n 119.013095,\n 40.577081\n ],\n [\n 119.063392,\n 40.606151\n ],\n [\n 119.086394,\n 40.588775\n ],\n [\n 119.105487,\n 40.603632\n ],\n [\n 119.158474,\n 40.614418\n ],\n [\n 119.162575,\n 40.600015\n ],\n [\n 119.178209,\n 40.609316\n ],\n [\n 119.230812,\n 40.603891\n ],\n [\n 119.232862,\n 40.589421\n ],\n [\n 119.220624,\n 40.569133\n ],\n [\n 119.25612,\n 40.543279\n ],\n [\n 119.302188,\n 40.530283\n ],\n [\n 119.338068,\n 40.531253\n ],\n [\n 119.361839,\n 40.537331\n ],\n [\n 119.441864,\n 40.539852\n ],\n [\n 119.477809,\n 40.533322\n ],\n [\n 119.491007,\n 40.536167\n ],\n [\n 119.503886,\n 40.553945\n ],\n [\n 119.520288,\n 40.547416\n ],\n [\n 119.534256,\n 40.554203\n ],\n [\n 119.571033,\n 40.540887\n ],\n [\n 119.568855,\n 40.520778\n ],\n [\n 119.555464,\n 40.516833\n ],\n [\n 119.553542,\n 40.501762\n ],\n [\n 119.604927,\n 40.454976\n ],\n [\n 119.593458,\n 40.435683\n ],\n [\n 119.600442,\n 40.406863\n ],\n [\n 119.586667,\n 40.375437\n ],\n [\n 119.599801,\n 40.356575\n ],\n [\n 119.598136,\n 40.334206\n ],\n [\n 119.621458,\n 40.30359\n ],\n [\n 119.642153,\n 40.291327\n ],\n [\n 119.651892,\n 40.272377\n ],\n [\n 119.633503,\n 40.249395\n ],\n [\n 119.625174,\n 40.224132\n ],\n [\n 119.671562,\n 40.23959\n ],\n [\n 119.676239,\n 40.224522\n ],\n [\n 119.716797,\n 40.196066\n ],\n [\n 119.745949,\n 40.207957\n ],\n [\n 119.755496,\n 40.153165\n ],\n [\n 119.76248,\n 40.144776\n ],\n [\n 119.736723,\n 40.104836\n ],\n [\n 119.771578,\n 40.082253\n ],\n [\n 119.76043,\n 40.065653\n ],\n [\n 119.770873,\n 40.048788\n ],\n [\n 119.795285,\n 40.040387\n ],\n [\n 119.817069,\n 40.052826\n ],\n [\n 119.835009,\n 40.050286\n ],\n [\n 119.854231,\n 40.03231\n ],\n [\n 119.841032,\n 40.011789\n ],\n [\n 119.872363,\n 39.960621\n ],\n [\n 119.862432,\n 39.951556\n ],\n [\n 119.835522,\n 39.964468\n ],\n [\n 119.836739,\n 39.985786\n ],\n [\n 119.816877,\n 39.978224\n ],\n [\n 119.787212,\n 39.950382\n ],\n [\n 119.726279,\n 39.941056\n ],\n [\n 119.683543,\n 39.921942\n ],\n [\n 119.674317,\n 39.933424\n ],\n [\n 119.666436,\n 39.92018\n ],\n [\n 119.637027,\n 39.923182\n ],\n [\n 119.612936,\n 39.898907\n ],\n [\n 119.587948,\n 39.909936\n ],\n [\n 119.559564,\n 39.901518\n ],\n [\n 119.541048,\n 39.888138\n ],\n [\n 119.520352,\n 39.838183\n ],\n [\n 119.537652,\n 39.831259\n ],\n [\n 119.53778,\n 39.810154\n ],\n [\n 119.506641,\n 39.816493\n ],\n [\n 119.464738,\n 39.809239\n ],\n [\n 119.396886,\n 39.761124\n ],\n [\n 119.395925,\n 39.74425\n ],\n [\n 119.3735,\n 39.739671\n ],\n [\n 119.358122,\n 39.721744\n ],\n [\n 119.334928,\n 39.656148\n ],\n [\n 119.31276,\n 39.605894\n ],\n [\n 119.270024,\n 39.498582\n ],\n [\n 119.304238,\n 39.459972\n ],\n [\n 119.319039,\n 39.429554\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 130400,\n \"name\": \"邯郸市\",\n \"center\": [\n 114.490686,\n 36.612273\n ],\n \"centroid\": [\n 114.548854,\n 36.553496\n ],\n \"childrenNum\": 18,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 130000\n },\n \"subFeatureIndex\": 3,\n \"acroutes\": [\n 100000,\n 130000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 113.794954,\n 36.994995\n ],\n [\n 113.828784,\n 37.012048\n ],\n [\n 113.859475,\n 37.015037\n ],\n [\n 113.883886,\n 37.010893\n ],\n [\n 113.901185,\n 36.99683\n ],\n [\n 113.941743,\n 36.983376\n ],\n [\n 113.984415,\n 36.941503\n ],\n [\n 113.991078,\n 36.914913\n ],\n [\n 114.028176,\n 36.881236\n ],\n [\n 114.063672,\n 36.879331\n ],\n [\n 114.090005,\n 36.861023\n ],\n [\n 114.081548,\n 36.845094\n ],\n [\n 114.100449,\n 36.839035\n ],\n [\n 114.182653,\n 36.843937\n ],\n [\n 114.225902,\n 36.843052\n ],\n [\n 114.252684,\n 36.856531\n ],\n [\n 114.299969,\n 36.845435\n ],\n [\n 114.304518,\n 36.857007\n ],\n [\n 114.336105,\n 36.846728\n ],\n [\n 114.353533,\n 36.852038\n ],\n [\n 114.421193,\n 36.839444\n ],\n [\n 114.462327,\n 36.847681\n ],\n [\n 114.478921,\n 36.833248\n ],\n [\n 114.507754,\n 36.827936\n ],\n [\n 114.555231,\n 36.845979\n ],\n [\n 114.551707,\n 36.884094\n ],\n [\n 114.56702,\n 36.891307\n ],\n [\n 114.64884,\n 36.89845\n ],\n [\n 114.671073,\n 36.917429\n ],\n [\n 114.707145,\n 36.918041\n ],\n [\n 114.718166,\n 36.938103\n ],\n [\n 114.734568,\n 36.942931\n ],\n [\n 114.74341,\n 36.932323\n ],\n [\n 114.772691,\n 36.928447\n ],\n [\n 114.787492,\n 36.91396\n ],\n [\n 114.838172,\n 36.950885\n ],\n [\n 114.836314,\n 36.958024\n ],\n [\n 114.862712,\n 36.969715\n ],\n [\n 114.892441,\n 36.969647\n ],\n [\n 114.949593,\n 36.948778\n ],\n [\n 114.985602,\n 36.950477\n ],\n [\n 115.02161,\n 36.961422\n ],\n [\n 115.0589,\n 36.957004\n ],\n [\n 115.096702,\n 36.964549\n ],\n [\n 115.111631,\n 36.958431\n ],\n [\n 115.125022,\n 36.936471\n ],\n [\n 115.106505,\n 36.923958\n ],\n [\n 115.125086,\n 36.90607\n ],\n [\n 115.143219,\n 36.899131\n ],\n [\n 115.16622,\n 36.901512\n ],\n [\n 115.170449,\n 36.881509\n ],\n [\n 115.158916,\n 36.852038\n ],\n [\n 115.176856,\n 36.854353\n ],\n [\n 115.200563,\n 36.868374\n ],\n [\n 115.283344,\n 36.862589\n ],\n [\n 115.325567,\n 36.869667\n ],\n [\n 115.307499,\n 36.837129\n ],\n [\n 115.323004,\n 36.815474\n ],\n [\n 115.335691,\n 36.775826\n ],\n [\n 115.349786,\n 36.786796\n ],\n [\n 115.362921,\n 36.771056\n ],\n [\n 115.390664,\n 36.76315\n ],\n [\n 115.423661,\n 36.766081\n ],\n [\n 115.463386,\n 36.752177\n ],\n [\n 115.478314,\n 36.754699\n ],\n [\n 115.450507,\n 36.713656\n ],\n [\n 115.446663,\n 36.694626\n ],\n [\n 115.420586,\n 36.686781\n ],\n [\n 115.406426,\n 36.663242\n ],\n [\n 115.386756,\n 36.656827\n ],\n [\n 115.388229,\n 36.647203\n ],\n [\n 115.366061,\n 36.621945\n ],\n [\n 115.355104,\n 36.627407\n ],\n [\n 115.334281,\n 36.58247\n ],\n [\n 115.33127,\n 36.550219\n ],\n [\n 115.307435,\n 36.527458\n ],\n [\n 115.288341,\n 36.528484\n ],\n [\n 115.296479,\n 36.508862\n ],\n [\n 115.272836,\n 36.497373\n ],\n [\n 115.291417,\n 36.460572\n ],\n [\n 115.300259,\n 36.465908\n ],\n [\n 115.317046,\n 36.454003\n ],\n [\n 115.312048,\n 36.433541\n ],\n [\n 115.29744,\n 36.413484\n ],\n [\n 115.339983,\n 36.398078\n ],\n [\n 115.349594,\n 36.363079\n ],\n [\n 115.368688,\n 36.342593\n ],\n [\n 115.359782,\n 36.318743\n ],\n [\n 115.366637,\n 36.30894\n ],\n [\n 115.394637,\n 36.322581\n ],\n [\n 115.422956,\n 36.32217\n ],\n [\n 115.417062,\n 36.29276\n ],\n [\n 115.436347,\n 36.27637\n ],\n [\n 115.462681,\n 36.276096\n ],\n [\n 115.465372,\n 36.250373\n ],\n [\n 115.47652,\n 36.246531\n ],\n [\n 115.475944,\n 36.193066\n ],\n [\n 115.483568,\n 36.148976\n ],\n [\n 115.469985,\n 36.152892\n ],\n [\n 115.463898,\n 36.171299\n ],\n [\n 115.451276,\n 36.16972\n ],\n [\n 115.449674,\n 36.150144\n ],\n [\n 115.431286,\n 36.149183\n ],\n [\n 115.415716,\n 36.137572\n ],\n [\n 115.404632,\n 36.15564\n ],\n [\n 115.39265,\n 36.12919\n ],\n [\n 115.377914,\n 36.128503\n ],\n [\n 115.369264,\n 36.102731\n ],\n [\n 115.341393,\n 36.087608\n ],\n [\n 115.313073,\n 36.088227\n ],\n [\n 115.297247,\n 36.109123\n ],\n [\n 115.302181,\n 36.127678\n ],\n [\n 115.279307,\n 36.137847\n ],\n [\n 115.260406,\n 36.171574\n ],\n [\n 115.242146,\n 36.191212\n ],\n [\n 115.20178,\n 36.212768\n ],\n [\n 115.189222,\n 36.195538\n ],\n [\n 115.170705,\n 36.191006\n ],\n [\n 115.142834,\n 36.209679\n ],\n [\n 115.110414,\n 36.199382\n ],\n [\n 115.104583,\n 36.172192\n ],\n [\n 115.06268,\n 36.178235\n ],\n [\n 115.048456,\n 36.162027\n ],\n [\n 115.045893,\n 36.112216\n ],\n [\n 114.998416,\n 36.069732\n ],\n [\n 114.954591,\n 36.067806\n ],\n [\n 114.920184,\n 36.048205\n ],\n [\n 114.914674,\n 36.051988\n ],\n [\n 114.926463,\n 36.089464\n ],\n [\n 114.90705,\n 36.117233\n ],\n [\n 114.912432,\n 36.140458\n ],\n [\n 114.879435,\n 36.147809\n ],\n [\n 114.858675,\n 36.144305\n ],\n [\n 114.857458,\n 36.127747\n ],\n [\n 114.825166,\n 36.123693\n ],\n [\n 114.77865,\n 36.133175\n ],\n [\n 114.771345,\n 36.124517\n ],\n [\n 114.73444,\n 36.155777\n ],\n [\n 114.720665,\n 36.140046\n ],\n [\n 114.692409,\n 36.146229\n ],\n [\n 114.691128,\n 36.138397\n ],\n [\n 114.655183,\n 36.140252\n ],\n [\n 114.630387,\n 36.124243\n ],\n [\n 114.610845,\n 36.128297\n ],\n [\n 114.58259,\n 36.121356\n ],\n [\n 114.586883,\n 36.140939\n ],\n [\n 114.55805,\n 36.150763\n ],\n [\n 114.53287,\n 36.171505\n ],\n [\n 114.480267,\n 36.177823\n ],\n [\n 114.466171,\n 36.197735\n ],\n [\n 114.417541,\n 36.205904\n ],\n [\n 114.408442,\n 36.224573\n ],\n [\n 114.39236,\n 36.221141\n ],\n [\n 114.356096,\n 36.230337\n ],\n [\n 114.345139,\n 36.255792\n ],\n [\n 114.328353,\n 36.248177\n ],\n [\n 114.290102,\n 36.247148\n ],\n [\n 114.256464,\n 36.264024\n ],\n [\n 114.235577,\n 36.252774\n ],\n [\n 114.223723,\n 36.270883\n ],\n [\n 114.211037,\n 36.273009\n ],\n [\n 114.203028,\n 36.24557\n ],\n [\n 114.168878,\n 36.243443\n ],\n [\n 114.17663,\n 36.263132\n ],\n [\n 114.130627,\n 36.279662\n ],\n [\n 114.12108,\n 36.272735\n ],\n [\n 114.092632,\n 36.27781\n ],\n [\n 114.085328,\n 36.270129\n ],\n [\n 114.060532,\n 36.276507\n ],\n [\n 114.04272,\n 36.297011\n ],\n [\n 114.061557,\n 36.317989\n ],\n [\n 114.055727,\n 36.329983\n ],\n [\n 114.026254,\n 36.325117\n ],\n [\n 114.032276,\n 36.347527\n ],\n [\n 114.023691,\n 36.354995\n ],\n [\n 114.010684,\n 36.342456\n ],\n [\n 113.985824,\n 36.357599\n ],\n [\n 113.979802,\n 36.344101\n ],\n [\n 113.994474,\n 36.344169\n ],\n [\n 113.993833,\n 36.314561\n ],\n [\n 113.983005,\n 36.317166\n ],\n [\n 113.964232,\n 36.352597\n ],\n [\n 113.952763,\n 36.358147\n ],\n [\n 113.957248,\n 36.33622\n ],\n [\n 113.934439,\n 36.336151\n ],\n [\n 113.93162,\n 36.319497\n ],\n [\n 113.911181,\n 36.314767\n ],\n [\n 113.901121,\n 36.336974\n ],\n [\n 113.881515,\n 36.353899\n ],\n [\n 113.85358,\n 36.35013\n ],\n [\n 113.855951,\n 36.329367\n ],\n [\n 113.818212,\n 36.331149\n ],\n [\n 113.797581,\n 36.347184\n ],\n [\n 113.764392,\n 36.355612\n ],\n [\n 113.755166,\n 36.365956\n ],\n [\n 113.73242,\n 36.357599\n ],\n [\n 113.729601,\n 36.381642\n ],\n [\n 113.708329,\n 36.423342\n ],\n [\n 113.670206,\n 36.425122\n ],\n [\n 113.6292,\n 36.454687\n ],\n [\n 113.587233,\n 36.460982\n ],\n [\n 113.582108,\n 36.482942\n ],\n [\n 113.554428,\n 36.494706\n ],\n [\n 113.559939,\n 36.52862\n ],\n [\n 113.547317,\n 36.534362\n ],\n [\n 113.588707,\n 36.548101\n ],\n [\n 113.58813,\n 36.562725\n ],\n [\n 113.569678,\n 36.585885\n ],\n [\n 113.539756,\n 36.594082\n ],\n [\n 113.545266,\n 36.616892\n ],\n [\n 113.535463,\n 36.62925\n ],\n [\n 113.486833,\n 36.635189\n ],\n [\n 113.47703,\n 36.655189\n ],\n [\n 113.502018,\n 36.681528\n ],\n [\n 113.507015,\n 36.704858\n ],\n [\n 113.477542,\n 36.697287\n ],\n [\n 113.465369,\n 36.70779\n ],\n [\n 113.47767,\n 36.726407\n ],\n [\n 113.499391,\n 36.740589\n ],\n [\n 113.536232,\n 36.732339\n ],\n [\n 113.549303,\n 36.752313\n ],\n [\n 113.569165,\n 36.758107\n ],\n [\n 113.599984,\n 36.752927\n ],\n [\n 113.65579,\n 36.785706\n ],\n [\n 113.68097,\n 36.790134\n ],\n [\n 113.673923,\n 36.807505\n ],\n [\n 113.68411,\n 36.824804\n ],\n [\n 113.676293,\n 36.855646\n ],\n [\n 113.696924,\n 36.882257\n ],\n [\n 113.710508,\n 36.88736\n ],\n [\n 113.731587,\n 36.87865\n ],\n [\n 113.731908,\n 36.859118\n ],\n [\n 113.742095,\n 36.851085\n ],\n [\n 113.772337,\n 36.871165\n ],\n [\n 113.786945,\n 36.870076\n ],\n [\n 113.79284,\n 36.894709\n ],\n [\n 113.761701,\n 36.956052\n ],\n [\n 113.777463,\n 36.96856\n ],\n [\n 113.794954,\n 36.994995\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 130500,\n \"name\": \"邢台市\",\n \"center\": [\n 114.508851,\n 37.0682\n ],\n \"centroid\": [\n 114.822689,\n 37.213818\n ],\n \"childrenNum\": 19,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 130000\n },\n \"subFeatureIndex\": 4,\n \"acroutes\": [\n 100000,\n 130000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 114.022666,\n 37.435496\n ],\n [\n 114.06899,\n 37.447384\n ],\n [\n 114.096477,\n 37.490935\n ],\n [\n 114.113263,\n 37.493837\n ],\n [\n 114.126526,\n 37.481957\n ],\n [\n 114.133766,\n 37.498899\n ],\n [\n 114.156191,\n 37.505244\n ],\n [\n 114.166123,\n 37.528186\n ],\n [\n 114.184575,\n 37.530817\n ],\n [\n 114.215009,\n 37.51125\n ],\n [\n 114.255439,\n 37.504096\n ],\n [\n 114.27293,\n 37.494445\n ],\n [\n 114.303621,\n 37.507808\n ],\n [\n 114.310861,\n 37.499979\n ],\n [\n 114.334632,\n 37.502949\n ],\n [\n 114.358274,\n 37.519212\n ],\n [\n 114.370192,\n 37.513612\n ],\n [\n 114.37269,\n 37.52967\n ],\n [\n 114.412095,\n 37.549907\n ],\n [\n 114.433495,\n 37.552537\n ],\n [\n 114.483471,\n 37.576814\n ],\n [\n 114.519927,\n 37.574656\n ],\n [\n 114.585217,\n 37.55301\n ],\n [\n 114.64679,\n 37.556247\n ],\n [\n 114.680171,\n 37.565283\n ],\n [\n 114.698816,\n 37.589353\n ],\n [\n 114.707338,\n 37.615774\n ],\n [\n 114.725983,\n 37.630665\n ],\n [\n 114.764618,\n 37.624399\n ],\n [\n 114.797423,\n 37.628239\n ],\n [\n 114.808571,\n 37.659832\n ],\n [\n 114.841504,\n 37.676129\n ],\n [\n 114.847783,\n 37.69673\n ],\n [\n 114.871041,\n 37.702114\n ],\n [\n 114.881357,\n 37.716113\n ],\n [\n 114.895965,\n 37.712547\n ],\n [\n 114.904038,\n 37.729302\n ],\n [\n 114.931846,\n 37.728899\n ],\n [\n 114.960165,\n 37.720084\n ],\n [\n 114.987524,\n 37.742691\n ],\n [\n 115.001748,\n 37.734685\n ],\n [\n 115.012512,\n 37.75157\n ],\n [\n 115.041024,\n 37.733541\n ],\n [\n 115.070049,\n 37.745651\n ],\n [\n 115.066653,\n 37.771007\n ],\n [\n 115.072099,\n 37.788893\n ],\n [\n 115.097215,\n 37.797498\n ],\n [\n 115.097471,\n 37.807849\n ],\n [\n 115.122972,\n 37.811479\n ],\n [\n 115.131173,\n 37.799783\n ],\n [\n 115.150523,\n 37.808521\n ],\n [\n 115.160262,\n 37.780287\n ],\n [\n 115.152765,\n 37.759507\n ],\n [\n 115.172564,\n 37.749351\n ],\n [\n 115.227281,\n 37.732599\n ],\n [\n 115.243235,\n 37.722641\n ],\n [\n 115.261431,\n 37.68818\n ],\n [\n 115.253807,\n 37.671415\n ],\n [\n 115.255088,\n 37.645621\n ],\n [\n 115.227858,\n 37.648921\n ],\n [\n 115.202934,\n 37.637133\n ],\n [\n 115.191593,\n 37.608833\n ],\n [\n 115.172756,\n 37.600543\n ],\n [\n 115.200563,\n 37.572498\n ],\n [\n 115.188325,\n 37.563125\n ],\n [\n 115.201908,\n 37.555977\n ],\n [\n 115.237276,\n 37.575465\n ],\n [\n 115.282575,\n 37.576005\n ],\n [\n 115.307179,\n 37.563935\n ],\n [\n 115.360871,\n 37.523935\n ],\n [\n 115.359461,\n 37.558675\n ],\n [\n 115.372147,\n 37.544106\n ],\n [\n 115.405785,\n 37.535944\n ],\n [\n 115.410078,\n 37.523261\n ],\n [\n 115.430965,\n 37.506796\n ],\n [\n 115.455313,\n 37.501802\n ],\n [\n 115.421675,\n 37.495727\n ],\n [\n 115.426096,\n 37.506256\n ],\n [\n 115.402069,\n 37.51017\n ],\n [\n 115.397968,\n 37.497347\n ],\n [\n 115.417638,\n 37.487762\n ],\n [\n 115.410719,\n 37.476421\n ],\n [\n 115.431478,\n 37.469602\n ],\n [\n 115.404183,\n 37.462039\n ],\n [\n 115.360038,\n 37.461431\n ],\n [\n 115.345109,\n 37.448195\n ],\n [\n 115.391049,\n 37.42793\n ],\n [\n 115.428595,\n 37.387926\n ],\n [\n 115.468768,\n 37.382788\n ],\n [\n 115.506634,\n 37.368997\n ],\n [\n 115.520089,\n 37.353648\n ],\n [\n 115.52938,\n 37.326864\n ],\n [\n 115.577177,\n 37.316107\n ],\n [\n 115.599218,\n 37.332884\n ],\n [\n 115.590632,\n 37.312453\n ],\n [\n 115.599859,\n 37.301965\n ],\n [\n 115.623437,\n 37.297905\n ],\n [\n 115.63292,\n 37.277058\n ],\n [\n 115.67258,\n 37.275839\n ],\n [\n 115.675784,\n 37.258914\n ],\n [\n 115.698465,\n 37.257153\n ],\n [\n 115.756322,\n 37.209876\n ],\n [\n 115.76997,\n 37.14155\n ],\n [\n 115.786564,\n 37.123916\n ],\n [\n 115.827378,\n 37.106006\n ],\n [\n 115.853904,\n 37.059245\n ],\n [\n 115.812385,\n 37.028961\n ],\n [\n 115.80963,\n 37.011436\n ],\n [\n 115.776441,\n 36.992073\n ],\n [\n 115.784322,\n 36.970735\n ],\n [\n 115.796816,\n 36.968763\n ],\n [\n 115.772789,\n 36.936811\n ],\n [\n 115.757796,\n 36.903008\n ],\n [\n 115.740561,\n 36.90641\n ],\n [\n 115.71128,\n 36.882393\n ],\n [\n 115.688598,\n 36.83958\n ],\n [\n 115.684177,\n 36.812954\n ],\n [\n 115.66502,\n 36.812477\n ],\n [\n 115.637405,\n 36.797492\n ],\n [\n 115.572116,\n 36.775349\n ],\n [\n 115.538734,\n 36.784139\n ],\n [\n 115.523613,\n 36.763832\n ],\n [\n 115.502918,\n 36.77017\n ],\n [\n 115.478314,\n 36.754699\n ],\n [\n 115.463386,\n 36.752177\n ],\n [\n 115.423661,\n 36.766081\n ],\n [\n 115.390664,\n 36.76315\n ],\n [\n 115.362921,\n 36.771056\n ],\n [\n 115.349786,\n 36.786796\n ],\n [\n 115.335691,\n 36.775826\n ],\n [\n 115.323004,\n 36.815474\n ],\n [\n 115.307499,\n 36.837129\n ],\n [\n 115.325567,\n 36.869667\n ],\n [\n 115.283344,\n 36.862589\n ],\n [\n 115.200563,\n 36.868374\n ],\n [\n 115.176856,\n 36.854353\n ],\n [\n 115.158916,\n 36.852038\n ],\n [\n 115.170449,\n 36.881509\n ],\n [\n 115.16622,\n 36.901512\n ],\n [\n 115.143219,\n 36.899131\n ],\n [\n 115.125086,\n 36.90607\n ],\n [\n 115.106505,\n 36.923958\n ],\n [\n 115.125022,\n 36.936471\n ],\n [\n 115.111631,\n 36.958431\n ],\n [\n 115.096702,\n 36.964549\n ],\n [\n 115.0589,\n 36.957004\n ],\n [\n 115.02161,\n 36.961422\n ],\n [\n 114.985602,\n 36.950477\n ],\n [\n 114.949593,\n 36.948778\n ],\n [\n 114.892441,\n 36.969647\n ],\n [\n 114.862712,\n 36.969715\n ],\n [\n 114.836314,\n 36.958024\n ],\n [\n 114.838172,\n 36.950885\n ],\n [\n 114.787492,\n 36.91396\n ],\n [\n 114.772691,\n 36.928447\n ],\n [\n 114.74341,\n 36.932323\n ],\n [\n 114.734568,\n 36.942931\n ],\n [\n 114.718166,\n 36.938103\n ],\n [\n 114.707145,\n 36.918041\n ],\n [\n 114.671073,\n 36.917429\n ],\n [\n 114.64884,\n 36.89845\n ],\n [\n 114.56702,\n 36.891307\n ],\n [\n 114.551707,\n 36.884094\n ],\n [\n 114.555231,\n 36.845979\n ],\n [\n 114.507754,\n 36.827936\n ],\n [\n 114.478921,\n 36.833248\n ],\n [\n 114.462327,\n 36.847681\n ],\n [\n 114.421193,\n 36.839444\n ],\n [\n 114.353533,\n 36.852038\n ],\n [\n 114.336105,\n 36.846728\n ],\n [\n 114.304518,\n 36.857007\n ],\n [\n 114.299969,\n 36.845435\n ],\n [\n 114.252684,\n 36.856531\n ],\n [\n 114.225902,\n 36.843052\n ],\n [\n 114.182653,\n 36.843937\n ],\n [\n 114.100449,\n 36.839035\n ],\n [\n 114.081548,\n 36.845094\n ],\n [\n 114.090005,\n 36.861023\n ],\n [\n 114.063672,\n 36.879331\n ],\n [\n 114.028176,\n 36.881236\n ],\n [\n 113.991078,\n 36.914913\n ],\n [\n 113.984415,\n 36.941503\n ],\n [\n 113.941743,\n 36.983376\n ],\n [\n 113.901185,\n 36.99683\n ],\n [\n 113.883886,\n 37.010893\n ],\n [\n 113.859475,\n 37.015037\n ],\n [\n 113.828784,\n 37.012048\n ],\n [\n 113.794954,\n 36.994995\n ],\n [\n 113.771888,\n 37.016803\n ],\n [\n 113.790149,\n 37.04295\n ],\n [\n 113.788227,\n 37.059788\n ],\n [\n 113.768749,\n 37.062504\n ],\n [\n 113.758177,\n 37.075672\n ],\n [\n 113.77349,\n 37.106956\n ],\n [\n 113.767339,\n 37.144601\n ],\n [\n 113.77317,\n 37.151857\n ],\n [\n 113.831924,\n 37.167518\n ],\n [\n 113.836601,\n 37.18948\n ],\n [\n 113.853067,\n 37.215093\n ],\n [\n 113.886449,\n 37.23914\n ],\n [\n 113.886897,\n 37.25993\n ],\n [\n 113.899007,\n 37.279495\n ],\n [\n 113.902147,\n 37.30995\n ],\n [\n 113.921176,\n 37.33072\n ],\n [\n 113.959811,\n 37.348982\n ],\n [\n 113.973907,\n 37.403133\n ],\n [\n 114.022666,\n 37.435496\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 130600,\n \"name\": \"保定市\",\n \"center\": [\n 115.482331,\n 38.867657\n ],\n \"centroid\": [\n 115.177664,\n 39.025148\n ],\n \"childrenNum\": 24,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 130000\n },\n \"subFeatureIndex\": 5,\n \"acroutes\": [\n 100000,\n 130000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 116.244678,\n 39.517354\n ],\n [\n 116.222766,\n 39.501995\n ],\n [\n 116.220843,\n 39.511644\n ],\n [\n 116.182144,\n 39.49635\n ],\n [\n 116.179901,\n 39.486568\n ],\n [\n 116.151325,\n 39.471005\n ],\n [\n 116.132104,\n 39.429423\n ],\n [\n 116.133001,\n 39.4055\n ],\n [\n 116.116791,\n 39.376243\n ],\n [\n 116.13582,\n 39.351842\n ],\n [\n 116.198226,\n 39.351315\n ],\n [\n 116.208734,\n 39.330195\n ],\n [\n 116.201109,\n 39.251911\n ],\n [\n 116.186116,\n 39.222457\n ],\n [\n 116.206555,\n 39.207429\n ],\n [\n 116.207837,\n 39.168526\n ],\n [\n 116.221804,\n 39.147813\n ],\n [\n 116.262426,\n 39.138114\n ],\n [\n 116.278957,\n 39.112045\n ],\n [\n 116.305354,\n 39.098116\n ],\n [\n 116.317592,\n 39.077911\n ],\n [\n 116.318617,\n 39.037416\n ],\n [\n 116.307148,\n 39.032196\n ],\n [\n 116.293757,\n 39.007344\n ],\n [\n 116.299588,\n 38.993658\n ],\n [\n 116.3215,\n 38.998088\n ],\n [\n 116.33534,\n 38.984004\n ],\n [\n 116.316182,\n 38.962708\n ],\n [\n 116.298755,\n 38.975076\n ],\n [\n 116.291386,\n 38.948683\n ],\n [\n 116.253007,\n 38.932074\n ],\n [\n 116.243653,\n 38.949345\n ],\n [\n 116.228083,\n 38.942199\n ],\n [\n 116.230262,\n 38.92453\n ],\n [\n 116.209503,\n 38.921618\n ],\n [\n 116.15203,\n 38.948352\n ],\n [\n 116.121083,\n 38.934391\n ],\n [\n 116.125633,\n 38.920823\n ],\n [\n 116.112754,\n 38.909703\n ],\n [\n 116.085524,\n 38.91063\n ],\n [\n 116.045543,\n 38.897786\n ],\n [\n 116.04157,\n 38.878451\n ],\n [\n 116.048746,\n 38.8607\n ],\n [\n 116.035548,\n 38.829492\n ],\n [\n 116.04093,\n 38.812259\n ],\n [\n 116.023054,\n 38.812524\n ],\n [\n 115.999731,\n 38.796812\n ],\n [\n 115.995118,\n 38.77798\n ],\n [\n 115.95187,\n 38.746736\n ],\n [\n 115.944053,\n 38.735456\n ],\n [\n 115.966286,\n 38.708973\n ],\n [\n 115.955009,\n 38.702932\n ],\n [\n 115.959879,\n 38.679891\n ],\n [\n 115.973526,\n 38.668467\n ],\n [\n 115.973398,\n 38.635514\n ],\n [\n 115.951101,\n 38.627938\n ],\n [\n 115.96321,\n 38.613182\n ],\n [\n 115.960583,\n 38.584394\n ],\n [\n 115.934058,\n 38.546678\n ],\n [\n 115.940721,\n 38.530508\n ],\n [\n 115.890809,\n 38.52585\n ],\n [\n 115.878507,\n 38.535566\n ],\n [\n 115.869345,\n 38.524652\n ],\n [\n 115.875047,\n 38.510141\n ],\n [\n 115.816101,\n 38.52545\n ],\n [\n 115.79137,\n 38.512005\n ],\n [\n 115.770418,\n 38.48817\n ],\n [\n 115.745686,\n 38.481311\n ],\n [\n 115.718584,\n 38.449205\n ],\n [\n 115.715957,\n 38.438411\n ],\n [\n 115.731462,\n 38.392618\n ],\n [\n 115.705321,\n 38.367543\n ],\n [\n 115.699811,\n 38.349932\n ],\n [\n 115.650155,\n 38.340791\n ],\n [\n 115.644965,\n 38.32611\n ],\n [\n 115.590504,\n 38.332784\n ],\n [\n 115.57942,\n 38.342859\n ],\n [\n 115.575768,\n 38.326377\n ],\n [\n 115.550908,\n 38.332917\n ],\n [\n 115.547704,\n 38.318168\n ],\n [\n 115.516437,\n 38.318168\n ],\n [\n 115.516822,\n 38.357337\n ],\n [\n 115.494781,\n 38.362006\n ],\n [\n 115.495101,\n 38.342993\n ],\n [\n 115.478122,\n 38.341658\n ],\n [\n 115.462104,\n 38.327311\n ],\n [\n 115.420906,\n 38.337922\n ],\n [\n 115.402453,\n 38.320103\n ],\n [\n 115.381822,\n 38.327578\n ],\n [\n 115.383104,\n 38.299076\n ],\n [\n 115.393611,\n 38.285588\n ],\n [\n 115.369072,\n 38.283451\n ],\n [\n 115.356194,\n 38.271764\n ],\n [\n 115.34953,\n 38.248117\n ],\n [\n 115.324734,\n 38.248184\n ],\n [\n 115.302758,\n 38.235289\n ],\n [\n 115.273605,\n 38.2403\n ],\n [\n 115.263994,\n 38.260543\n ],\n [\n 115.265788,\n 38.287658\n ],\n [\n 115.252205,\n 38.29093\n ],\n [\n 115.225871,\n 38.269894\n ],\n [\n 115.210174,\n 38.236491\n ],\n [\n 115.19422,\n 38.236759\n ],\n [\n 115.168591,\n 38.259608\n ],\n [\n 115.152317,\n 38.256802\n ],\n [\n 115.108107,\n 38.264551\n ],\n [\n 115.085874,\n 38.276773\n ],\n [\n 115.073765,\n 38.293134\n ],\n [\n 115.056722,\n 38.288326\n ],\n [\n 115.066204,\n 38.264684\n ],\n [\n 115.056465,\n 38.258472\n ],\n [\n 115.031862,\n 38.267089\n ],\n [\n 114.989062,\n 38.258138\n ],\n [\n 114.990087,\n 38.272165\n ],\n [\n 114.970096,\n 38.281114\n ],\n [\n 114.927681,\n 38.283385\n ],\n [\n 114.915059,\n 38.263348\n ],\n [\n 114.886162,\n 38.265286\n ],\n [\n 114.883343,\n 38.284854\n ],\n [\n 114.902565,\n 38.294936\n ],\n [\n 114.906986,\n 38.309624\n ],\n [\n 114.922875,\n 38.315631\n ],\n [\n 114.942994,\n 38.343193\n ],\n [\n 114.932871,\n 38.344194\n ],\n [\n 114.923388,\n 38.388217\n ],\n [\n 114.910381,\n 38.393751\n ],\n [\n 114.882254,\n 38.424149\n ],\n [\n 114.853998,\n 38.435879\n ],\n [\n 114.858163,\n 38.448605\n ],\n [\n 114.840992,\n 38.460797\n ],\n [\n 114.837852,\n 38.435745\n ],\n [\n 114.819143,\n 38.449871\n ],\n [\n 114.830868,\n 38.46033\n ],\n [\n 114.81075,\n 38.492365\n ],\n [\n 114.765259,\n 38.496626\n ],\n [\n 114.729442,\n 38.484574\n ],\n [\n 114.702084,\n 38.489102\n ],\n [\n 114.6737,\n 38.473452\n ],\n [\n 114.651851,\n 38.504682\n ],\n [\n 114.635257,\n 38.514801\n ],\n [\n 114.595724,\n 38.568897\n ],\n [\n 114.58432,\n 38.596429\n ],\n [\n 114.56324,\n 38.590644\n ],\n [\n 114.527616,\n 38.590644\n ],\n [\n 114.552284,\n 38.612983\n ],\n [\n 114.536907,\n 38.632324\n ],\n [\n 114.53633,\n 38.649268\n ],\n [\n 114.522106,\n 38.65372\n ],\n [\n 114.498463,\n 38.678297\n ],\n [\n 114.452652,\n 38.699413\n ],\n [\n 114.437787,\n 38.692773\n ],\n [\n 114.413504,\n 38.703928\n ],\n [\n 114.366411,\n 38.6862\n ],\n [\n 114.341167,\n 38.690184\n ],\n [\n 114.311502,\n 38.706517\n ],\n [\n 114.212831,\n 38.688192\n ],\n [\n 114.182205,\n 38.67657\n ],\n [\n 114.129153,\n 38.669596\n ],\n [\n 114.125053,\n 38.659632\n ],\n [\n 114.086097,\n 38.65837\n ],\n [\n 114.052139,\n 38.686399\n ],\n [\n 114.028624,\n 38.688524\n ],\n [\n 113.991655,\n 38.676769\n ],\n [\n 113.964617,\n 38.699811\n ],\n [\n 113.929697,\n 38.702467\n ],\n [\n 113.932324,\n 38.71362\n ],\n [\n 113.883245,\n 38.74667\n ],\n [\n 113.864664,\n 38.746006\n ],\n [\n 113.839548,\n 38.758413\n ],\n [\n 113.836537,\n 38.79595\n ],\n [\n 113.853644,\n 38.810138\n ],\n [\n 113.855566,\n 38.828962\n ],\n [\n 113.83564,\n 38.842547\n ],\n [\n 113.801297,\n 38.85487\n ],\n [\n 113.776181,\n 38.885669\n ],\n [\n 113.775156,\n 38.919103\n ],\n [\n 113.767532,\n 38.959665\n ],\n [\n 113.776758,\n 38.98698\n ],\n [\n 113.806808,\n 38.989691\n ],\n [\n 113.830514,\n 39.011773\n ],\n [\n 113.884399,\n 39.051688\n ],\n [\n 113.898046,\n 39.067607\n ],\n [\n 113.930274,\n 39.063446\n ],\n [\n 113.942896,\n 39.08742\n ],\n [\n 113.961733,\n 39.100823\n ],\n [\n 113.995115,\n 39.095475\n ],\n [\n 114.006456,\n 39.12287\n ],\n [\n 114.050793,\n 39.13587\n ],\n [\n 114.065274,\n 39.093494\n ],\n [\n 114.078793,\n 39.095343\n ],\n [\n 114.096797,\n 39.083722\n ],\n [\n 114.108714,\n 39.052282\n ],\n [\n 114.126654,\n 39.050895\n ],\n [\n 114.157217,\n 39.061134\n ],\n [\n 114.180923,\n 39.049111\n ],\n [\n 114.197005,\n 39.050432\n ],\n [\n 114.22635,\n 39.066485\n ],\n [\n 114.300097,\n 39.079231\n ],\n [\n 114.320215,\n 39.070712\n ],\n [\n 114.349176,\n 39.076788\n ],\n [\n 114.369679,\n 39.107557\n ],\n [\n 114.360773,\n 39.133957\n ],\n [\n 114.388196,\n 39.176968\n ],\n [\n 114.417989,\n 39.171626\n ],\n [\n 114.443618,\n 39.174132\n ],\n [\n 114.453165,\n 39.192662\n ],\n [\n 114.469695,\n 39.193321\n ],\n [\n 114.475974,\n 39.215867\n ],\n [\n 114.467389,\n 39.225884\n ],\n [\n 114.436314,\n 39.229641\n ],\n [\n 114.415939,\n 39.242885\n ],\n [\n 114.437018,\n 39.25942\n ],\n [\n 114.425101,\n 39.285105\n ],\n [\n 114.438236,\n 39.319139\n ],\n [\n 114.46662,\n 39.329669\n ],\n [\n 114.47969,\n 39.351118\n ],\n [\n 114.469503,\n 39.355196\n ],\n [\n 114.470913,\n 39.408787\n ],\n [\n 114.496798,\n 39.438556\n ],\n [\n 114.502308,\n 39.477112\n ],\n [\n 114.532678,\n 39.486174\n ],\n [\n 114.536586,\n 39.512891\n ],\n [\n 114.557345,\n 39.531987\n ],\n [\n 114.563432,\n 39.558162\n ],\n [\n 114.58432,\n 39.585835\n ],\n [\n 114.604887,\n 39.567869\n ],\n [\n 114.633527,\n 39.555866\n ],\n [\n 114.654991,\n 39.599209\n ],\n [\n 114.680748,\n 39.588064\n ],\n [\n 114.712079,\n 39.594358\n ],\n [\n 114.716756,\n 39.618674\n ],\n [\n 114.760645,\n 39.617036\n ],\n [\n 114.783775,\n 39.609499\n ],\n [\n 114.821642,\n 39.61022\n ],\n [\n 114.838429,\n 39.589179\n ],\n [\n 114.891032,\n 39.634728\n ],\n [\n 114.936331,\n 39.66368\n ],\n [\n 114.961895,\n 39.666103\n ],\n [\n 114.987396,\n 39.67802\n ],\n [\n 115.011487,\n 39.674746\n ],\n [\n 115.03199,\n 39.702373\n ],\n [\n 115.050058,\n 39.709245\n ],\n [\n 115.095293,\n 39.704795\n ],\n [\n 115.138734,\n 39.688627\n ],\n [\n 115.168847,\n 39.672651\n ],\n [\n 115.179163,\n 39.679592\n ],\n [\n 115.177625,\n 39.700475\n ],\n [\n 115.215043,\n 39.708067\n ],\n [\n 115.250859,\n 39.73882\n ],\n [\n 115.283216,\n 39.745165\n ],\n [\n 115.312945,\n 39.783551\n ],\n [\n 115.342867,\n 39.79205\n ],\n [\n 115.330052,\n 39.80656\n ],\n [\n 115.345237,\n 39.821851\n ],\n [\n 115.343251,\n 39.837857\n ],\n [\n 115.354848,\n 39.850528\n ],\n [\n 115.354848,\n 39.850528\n ],\n [\n 115.365676,\n 39.867507\n ],\n [\n 115.364523,\n 39.885331\n ],\n [\n 115.399891,\n 39.891336\n ],\n [\n 115.40162,\n 39.903802\n ],\n [\n 115.426801,\n 39.950056\n ],\n [\n 115.438462,\n 39.952534\n ],\n [\n 115.480685,\n 39.935838\n ],\n [\n 115.487285,\n 39.923834\n ],\n [\n 115.523037,\n 39.898907\n ],\n [\n 115.51003,\n 39.881479\n ],\n [\n 115.526625,\n 39.875538\n ],\n [\n 115.514323,\n 39.837726\n ],\n [\n 115.569168,\n 39.814206\n ],\n [\n 115.55488,\n 39.795579\n ],\n [\n 115.505289,\n 39.784597\n ],\n [\n 115.483761,\n 39.798717\n ],\n [\n 115.457171,\n 39.781982\n ],\n [\n 115.434105,\n 39.782309\n ],\n [\n 115.439871,\n 39.752099\n ],\n [\n 115.466717,\n 39.740456\n ],\n [\n 115.482351,\n 39.742483\n ],\n [\n 115.499266,\n 39.69622\n ],\n [\n 115.491065,\n 39.66846\n ],\n [\n 115.478507,\n 39.650319\n ],\n [\n 115.506698,\n 39.652153\n ],\n [\n 115.52246,\n 39.639969\n ],\n [\n 115.523421,\n 39.620378\n ],\n [\n 115.513041,\n 39.611727\n ],\n [\n 115.515925,\n 39.591211\n ],\n [\n 115.545974,\n 39.61874\n ],\n [\n 115.587044,\n 39.589965\n ],\n [\n 115.61844,\n 39.604059\n ],\n [\n 115.633176,\n 39.597701\n ],\n [\n 115.664507,\n 39.604649\n ],\n [\n 115.667134,\n 39.615594\n ],\n [\n 115.685331,\n 39.603666\n ],\n [\n 115.697889,\n 39.579344\n ],\n [\n 115.692058,\n 39.56577\n ],\n [\n 115.71711,\n 39.560392\n ],\n [\n 115.738574,\n 39.546289\n ],\n [\n 115.752542,\n 39.515385\n ],\n [\n 115.82033,\n 39.509741\n ],\n [\n 115.819241,\n 39.53074\n ],\n [\n 115.846023,\n 39.543272\n ],\n [\n 115.855506,\n 39.555014\n ],\n [\n 115.882992,\n 39.548126\n ],\n [\n 115.89004,\n 39.567869\n ],\n [\n 115.907852,\n 39.566885\n ],\n [\n 115.915605,\n 39.58295\n ],\n [\n 115.910223,\n 39.600847\n ],\n [\n 115.923742,\n 39.597308\n ],\n [\n 115.937966,\n 39.577442\n ],\n [\n 115.959558,\n 39.560851\n ],\n [\n 115.978139,\n 39.572852\n ],\n [\n 115.978459,\n 39.595669\n ],\n [\n 115.991018,\n 39.593768\n ],\n [\n 115.995182,\n 39.577049\n ],\n [\n 116.026193,\n 39.587409\n ],\n [\n 116.036188,\n 39.571672\n ],\n [\n 116.121468,\n 39.574951\n ],\n [\n 116.149595,\n 39.573049\n ],\n [\n 116.151774,\n 39.583409\n ],\n [\n 116.19688,\n 39.588982\n ],\n [\n 116.221164,\n 39.578951\n ],\n [\n 116.246152,\n 39.557178\n ],\n [\n 116.244678,\n 39.517354\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 130700,\n \"name\": \"张家口市\",\n \"center\": [\n 114.884091,\n 40.811901\n ],\n \"centroid\": [\n 115.038685,\n 40.874644\n ],\n \"childrenNum\": 16,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 130000\n },\n \"subFeatureIndex\": 6,\n \"acroutes\": [\n 100000,\n 130000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 114.563432,\n 39.558162\n ],\n [\n 114.568942,\n 39.573967\n ],\n [\n 114.557025,\n 39.581442\n ],\n [\n 114.515378,\n 39.564983\n ],\n [\n 114.495836,\n 39.608188\n ],\n [\n 114.474757,\n 39.613759\n ],\n [\n 114.431636,\n 39.614021\n ],\n [\n 114.408122,\n 39.651956\n ],\n [\n 114.408827,\n 39.782375\n ],\n [\n 114.390695,\n 39.818584\n ],\n [\n 114.406712,\n 39.83348\n ],\n [\n 114.395436,\n 39.867246\n ],\n [\n 114.349432,\n 39.862806\n ],\n [\n 114.328929,\n 39.865548\n ],\n [\n 114.286065,\n 39.858235\n ],\n [\n 114.276967,\n 39.874494\n ],\n [\n 114.224877,\n 39.851704\n ],\n [\n 114.19944,\n 39.87939\n ],\n [\n 114.229426,\n 39.899495\n ],\n [\n 114.211998,\n 39.918745\n ],\n [\n 114.174132,\n 39.897602\n ],\n [\n 114.102884,\n 39.912873\n ],\n [\n 114.089941,\n 39.910197\n ],\n [\n 114.067772,\n 39.922334\n ],\n [\n 114.047397,\n 39.916135\n ],\n [\n 114.02824,\n 39.959316\n ],\n [\n 114.029457,\n 39.985395\n ],\n [\n 114.021256,\n 39.991782\n ],\n [\n 113.960452,\n 40.000906\n ],\n [\n 113.932004,\n 40.009443\n ],\n [\n 113.914641,\n 40.005924\n ],\n [\n 113.922457,\n 40.026578\n ],\n [\n 113.954878,\n 40.030812\n ],\n [\n 113.975573,\n 40.051068\n ],\n [\n 113.981019,\n 40.073205\n ],\n [\n 113.973843,\n 40.097157\n ],\n [\n 113.989476,\n 40.112383\n ],\n [\n 114.019462,\n 40.102819\n ],\n [\n 114.043809,\n 40.056863\n ],\n [\n 114.091159,\n 40.075288\n ],\n [\n 114.101218,\n 40.10874\n ],\n [\n 114.089108,\n 40.121491\n ],\n [\n 114.068029,\n 40.179754\n ],\n [\n 114.097758,\n 40.193597\n ],\n [\n 114.123387,\n 40.188723\n ],\n [\n 114.123963,\n 40.178129\n ],\n [\n 114.145107,\n 40.177349\n ],\n [\n 114.180026,\n 40.191517\n ],\n [\n 114.235833,\n 40.198341\n ],\n [\n 114.240126,\n 40.221924\n ],\n [\n 114.255247,\n 40.236213\n ],\n [\n 114.293113,\n 40.230108\n ],\n [\n 114.335144,\n 40.245434\n ],\n [\n 114.362567,\n 40.250109\n ],\n [\n 114.406392,\n 40.246149\n ],\n [\n 114.469951,\n 40.268093\n ],\n [\n 114.510957,\n 40.303006\n ],\n [\n 114.526463,\n 40.32357\n ],\n [\n 114.530627,\n 40.3451\n ],\n [\n 114.499296,\n 40.354047\n ],\n [\n 114.470784,\n 40.349703\n ],\n [\n 114.446565,\n 40.372845\n ],\n [\n 114.390374,\n 40.351259\n ],\n [\n 114.382237,\n 40.362085\n ],\n [\n 114.344435,\n 40.36954\n ],\n [\n 114.314449,\n 40.369604\n ],\n [\n 114.28709,\n 40.423444\n ],\n [\n 114.299648,\n 40.440086\n ],\n [\n 114.275429,\n 40.458019\n ],\n [\n 114.267228,\n 40.474199\n ],\n [\n 114.282605,\n 40.495164\n ],\n [\n 114.285617,\n 40.525822\n ],\n [\n 114.296381,\n 40.535973\n ],\n [\n 114.293433,\n 40.551424\n ],\n [\n 114.273379,\n 40.553815\n ],\n [\n 114.282926,\n 40.590778\n ],\n [\n 114.258258,\n 40.610672\n ],\n [\n 114.236153,\n 40.606991\n ],\n [\n 114.209307,\n 40.629721\n ],\n [\n 114.216163,\n 40.63437\n ],\n [\n 114.200081,\n 40.662189\n ],\n [\n 114.18323,\n 40.671675\n ],\n [\n 114.147285,\n 40.73346\n ],\n [\n 114.134727,\n 40.737263\n ],\n [\n 114.104165,\n 40.768068\n ],\n [\n 114.104421,\n 40.797571\n ],\n [\n 114.081163,\n 40.790486\n ],\n [\n 114.044771,\n 40.831115\n ],\n [\n 114.069694,\n 40.846948\n ],\n [\n 114.073539,\n 40.857308\n ],\n [\n 114.052844,\n 40.870304\n ],\n [\n 114.052203,\n 40.893395\n ],\n [\n 114.041375,\n 40.917378\n ],\n [\n 114.057457,\n 40.925092\n ],\n [\n 114.011773,\n 40.935311\n ],\n [\n 114.000753,\n 40.947521\n ],\n [\n 113.991142,\n 40.940195\n ],\n [\n 113.97647,\n 40.961206\n ],\n [\n 113.972946,\n 40.982981\n ],\n [\n 113.922585,\n 41.024391\n ],\n [\n 113.90567,\n 41.034081\n ],\n [\n 113.868445,\n 41.068853\n ],\n [\n 113.823402,\n 41.093093\n ],\n [\n 113.820327,\n 41.101619\n ],\n [\n 113.863383,\n 41.106042\n ],\n [\n 113.877927,\n 41.115593\n ],\n [\n 113.920407,\n 41.172034\n ],\n [\n 113.973651,\n 41.174275\n ],\n [\n 113.996781,\n 41.192458\n ],\n [\n 114.000625,\n 41.224011\n ],\n [\n 114.016259,\n 41.232073\n ],\n [\n 114.007032,\n 41.250752\n ],\n [\n 113.985824,\n 41.270385\n ],\n [\n 113.976854,\n 41.266676\n ],\n [\n 113.971536,\n 41.239814\n ],\n [\n 113.952956,\n 41.254269\n ],\n [\n 113.951226,\n 41.282916\n ],\n [\n 113.936297,\n 41.294805\n ],\n [\n 113.922585,\n 41.291162\n ],\n [\n 113.89952,\n 41.316214\n ],\n [\n 113.926622,\n 41.326309\n ],\n [\n 113.923354,\n 41.33934\n ],\n [\n 113.937514,\n 41.356647\n ],\n [\n 113.93399,\n 41.376823\n ],\n [\n 113.943985,\n 41.390802\n ],\n [\n 113.918229,\n 41.40382\n ],\n [\n 113.8712,\n 41.413327\n ],\n [\n 113.884911,\n 41.438141\n ],\n [\n 113.92124,\n 41.457271\n ],\n [\n 113.930659,\n 41.485573\n ],\n [\n 113.952827,\n 41.483533\n ],\n [\n 113.977559,\n 41.506664\n ],\n [\n 114.032148,\n 41.529595\n ],\n [\n 114.083982,\n 41.528958\n ],\n [\n 114.101218,\n 41.537746\n ],\n [\n 114.231027,\n 41.513671\n ],\n [\n 114.231604,\n 41.547043\n ],\n [\n 114.221673,\n 41.582242\n ],\n [\n 114.237242,\n 41.59624\n ],\n [\n 114.227632,\n 41.620221\n ],\n [\n 114.259347,\n 41.6234\n ],\n [\n 114.215394,\n 41.685057\n ],\n [\n 114.219302,\n 41.700239\n ],\n [\n 114.237563,\n 41.698651\n ],\n [\n 114.232501,\n 41.717705\n ],\n [\n 114.206744,\n 41.738402\n ],\n [\n 114.215266,\n 41.756492\n ],\n [\n 114.200401,\n 41.778509\n ],\n [\n 114.202964,\n 41.793416\n ],\n [\n 114.243457,\n 41.832792\n ],\n [\n 114.287026,\n 41.868658\n ],\n [\n 114.330403,\n 41.916977\n ],\n [\n 114.326751,\n 41.9297\n ],\n [\n 114.343217,\n 41.926915\n ],\n [\n 114.348087,\n 41.947609\n ],\n [\n 114.374036,\n 41.956783\n ],\n [\n 114.421705,\n 41.942167\n ],\n [\n 114.476295,\n 41.953936\n ],\n [\n 114.487443,\n 41.96722\n ],\n [\n 114.510701,\n 41.973292\n ],\n [\n 114.501411,\n 41.99277\n ],\n [\n 114.484752,\n 41.999155\n ],\n [\n 114.485969,\n 42.015338\n ],\n [\n 114.46835,\n 42.025577\n ],\n [\n 114.466107,\n 42.037962\n ],\n [\n 114.479883,\n 42.064304\n ],\n [\n 114.5025,\n 42.067398\n ],\n [\n 114.500706,\n 42.085963\n ],\n [\n 114.510957,\n 42.110897\n ],\n [\n 114.560293,\n 42.132414\n ],\n [\n 114.585537,\n 42.131215\n ],\n [\n 114.624813,\n 42.112222\n ],\n [\n 114.647751,\n 42.109634\n ],\n [\n 114.675494,\n 42.120426\n ],\n [\n 114.704647,\n 42.121435\n ],\n [\n 114.710221,\n 42.115377\n ],\n [\n 114.754879,\n 42.115756\n ],\n [\n 114.78935,\n 42.130963\n ],\n [\n 114.793963,\n 42.149193\n ],\n [\n 114.828369,\n 42.147679\n ],\n [\n 114.823051,\n 42.140867\n ],\n [\n 114.861302,\n 42.101997\n ],\n [\n 114.860854,\n 42.05483\n ],\n [\n 114.889622,\n 42.030316\n ],\n [\n 114.89148,\n 42.012115\n ],\n [\n 114.901796,\n 42.015528\n ],\n [\n 114.916853,\n 41.981008\n ],\n [\n 114.915507,\n 41.958934\n ],\n [\n 114.933255,\n 41.943559\n ],\n [\n 114.916148,\n 41.936978\n ],\n [\n 114.925438,\n 41.899566\n ],\n [\n 114.92153,\n 41.875943\n ],\n [\n 114.939214,\n 41.846165\n ],\n [\n 114.922363,\n 41.825121\n ],\n [\n 114.8663,\n 41.804578\n ],\n [\n 114.896157,\n 41.76766\n ],\n [\n 114.895068,\n 41.736561\n ],\n [\n 114.902885,\n 41.689313\n ],\n [\n 114.895581,\n 41.636436\n ],\n [\n 114.860726,\n 41.600948\n ],\n [\n 114.877449,\n 41.590896\n ],\n [\n 114.89808,\n 41.607182\n ],\n [\n 114.938317,\n 41.613225\n ],\n [\n 114.977849,\n 41.611571\n ],\n [\n 115.025006,\n 41.61526\n ],\n [\n 115.055953,\n 41.602284\n ],\n [\n 115.087796,\n 41.613415\n ],\n [\n 115.099137,\n 41.623973\n ],\n [\n 115.113489,\n 41.615769\n ],\n [\n 115.142386,\n 41.616087\n ],\n [\n 115.167246,\n 41.605973\n ],\n [\n 115.195053,\n 41.602093\n ],\n [\n 115.205753,\n 41.591723\n ],\n [\n 115.204215,\n 41.571423\n ],\n [\n 115.257587,\n 41.581097\n ],\n [\n 115.266429,\n 41.592868\n ],\n [\n 115.26425,\n 41.611889\n ],\n [\n 115.273477,\n 41.622764\n ],\n [\n 115.290328,\n 41.622955\n ],\n [\n 115.311535,\n 41.592677\n ],\n [\n 115.365099,\n 41.595795\n ],\n [\n 115.377594,\n 41.602475\n ],\n [\n 115.345494,\n 41.635673\n ],\n [\n 115.360935,\n 41.661355\n ],\n [\n 115.355489,\n 41.672158\n ],\n [\n 115.336844,\n 41.675145\n ],\n [\n 115.319032,\n 41.691473\n ],\n [\n 115.347031,\n 41.712307\n ],\n [\n 115.366317,\n 41.712561\n ],\n [\n 115.430068,\n 41.728753\n ],\n [\n 115.488758,\n 41.760934\n ],\n [\n 115.519769,\n 41.767787\n ],\n [\n 115.548345,\n 41.783902\n ],\n [\n 115.574102,\n 41.805403\n ],\n [\n 115.598641,\n 41.808003\n ],\n [\n 115.630806,\n 41.824995\n ],\n [\n 115.653871,\n 41.829052\n ],\n [\n 115.659382,\n 41.848319\n ],\n [\n 115.68815,\n 41.867708\n ],\n [\n 115.724415,\n 41.868025\n ],\n [\n 115.727874,\n 41.888421\n ],\n [\n 115.756707,\n 41.886774\n ],\n [\n 115.795855,\n 41.911153\n ],\n [\n 115.810976,\n 41.912356\n ],\n [\n 115.815461,\n 41.928687\n ],\n [\n 115.828852,\n 41.936978\n ],\n [\n 115.853071,\n 41.927738\n ],\n [\n 115.916374,\n 41.945141\n ],\n [\n 115.946936,\n 41.885634\n ],\n [\n 115.978588,\n 41.840841\n ],\n [\n 115.994926,\n 41.828608\n ],\n [\n 116.016646,\n 41.77705\n ],\n [\n 116.03401,\n 41.782633\n ],\n [\n 116.083986,\n 41.781745\n ],\n [\n 116.081039,\n 41.776352\n ],\n [\n 116.056307,\n 41.733705\n ],\n [\n 116.014404,\n 41.715355\n ],\n [\n 115.972885,\n 41.680101\n ],\n [\n 115.909967,\n 41.642921\n ],\n [\n 115.929252,\n 41.596113\n ],\n [\n 115.924767,\n 41.568623\n ],\n [\n 115.958789,\n 41.550353\n ],\n [\n 115.97391,\n 41.529659\n ],\n [\n 115.982112,\n 41.485127\n ],\n [\n 115.97673,\n 41.470913\n ],\n [\n 116.000052,\n 41.454402\n ],\n [\n 116.004473,\n 41.432911\n ],\n [\n 116.03023,\n 41.416645\n ],\n [\n 116.036124,\n 41.397694\n ],\n [\n 116.07713,\n 41.384866\n ],\n [\n 116.08751,\n 41.376951\n ],\n [\n 116.141586,\n 41.373439\n ],\n [\n 116.17484,\n 41.356328\n ],\n [\n 116.203352,\n 41.326117\n ],\n [\n 116.209503,\n 41.307715\n ],\n [\n 116.191627,\n 41.288158\n ],\n [\n 116.198995,\n 41.259578\n ],\n [\n 116.213603,\n 41.233288\n ],\n [\n 116.235195,\n 41.211853\n ],\n [\n 116.221356,\n 41.185928\n ],\n [\n 116.22347,\n 41.174275\n ],\n [\n 116.245895,\n 41.16358\n ],\n [\n 116.233273,\n 41.130845\n ],\n [\n 116.245447,\n 41.114183\n ],\n [\n 116.268769,\n 41.102645\n ],\n [\n 116.277419,\n 41.083154\n ],\n [\n 116.296128,\n 41.062118\n ],\n [\n 116.264733,\n 41.038252\n ],\n [\n 116.29837,\n 40.986641\n ],\n [\n 116.333546,\n 40.984458\n ],\n [\n 116.341747,\n 40.964804\n ],\n [\n 116.365069,\n 40.943216\n ],\n [\n 116.334571,\n 40.921749\n ],\n [\n 116.334443,\n 40.904648\n ],\n [\n 116.399988,\n 40.84978\n ],\n [\n 116.40646,\n 40.833368\n ],\n [\n 116.43683,\n 40.820751\n ],\n [\n 116.456564,\n 40.798665\n ],\n [\n 116.465854,\n 40.774511\n ],\n [\n 116.453937,\n 40.765877\n ],\n [\n 116.416519,\n 40.769357\n ],\n [\n 116.414276,\n 40.777925\n ],\n [\n 116.379806,\n 40.77232\n ],\n [\n 116.317015,\n 40.772256\n ],\n [\n 116.307917,\n 40.752152\n ],\n [\n 116.290938,\n 40.763815\n ],\n [\n 116.273446,\n 40.762913\n ],\n [\n 116.269602,\n 40.777152\n ],\n [\n 116.247946,\n 40.791839\n ],\n [\n 116.235003,\n 40.783143\n ],\n [\n 116.218857,\n 40.742807\n ],\n [\n 116.191947,\n 40.724241\n ],\n [\n 116.171316,\n 40.695996\n ],\n [\n 116.162025,\n 40.662383\n ],\n [\n 116.136909,\n 40.667674\n ],\n [\n 116.112562,\n 40.648507\n ],\n [\n 116.121724,\n 40.62914\n ],\n [\n 116.099363,\n 40.630561\n ],\n [\n 116.062714,\n 40.610285\n ],\n [\n 116.030037,\n 40.597367\n ],\n [\n 116.0285,\n 40.607314\n ],\n [\n 116.005113,\n 40.584124\n ],\n [\n 115.981407,\n 40.579665\n ],\n [\n 115.971988,\n 40.602341\n ],\n [\n 115.907788,\n 40.617324\n ],\n [\n 115.885427,\n 40.595235\n ],\n [\n 115.846151,\n 40.593039\n ],\n [\n 115.827378,\n 40.587031\n ],\n [\n 115.819818,\n 40.559374\n ],\n [\n 115.792203,\n 40.561313\n ],\n [\n 115.755041,\n 40.540046\n ],\n [\n 115.736012,\n 40.503832\n ],\n [\n 115.782207,\n 40.492058\n ],\n [\n 115.769841,\n 40.468051\n ],\n [\n 115.770418,\n 40.444165\n ],\n [\n 115.796431,\n 40.426812\n ],\n [\n 115.846856,\n 40.375113\n ],\n [\n 115.861849,\n 40.373428\n ],\n [\n 115.864476,\n 40.359363\n ],\n [\n 115.918296,\n 40.353917\n ],\n [\n 115.922653,\n 40.325905\n ],\n [\n 115.943156,\n 40.311375\n ],\n [\n 115.93976,\n 40.304434\n ],\n [\n 115.968913,\n 40.264263\n ],\n [\n 115.960007,\n 40.256667\n ],\n [\n 115.930085,\n 40.254524\n ],\n [\n 115.911953,\n 40.23446\n ],\n [\n 115.898498,\n 40.234524\n ],\n [\n 115.883121,\n 40.216143\n ],\n [\n 115.886324,\n 40.206657\n ],\n [\n 115.870306,\n 40.186058\n ],\n [\n 115.855506,\n 40.188853\n ],\n [\n 115.844421,\n 40.168053\n ],\n [\n 115.847817,\n 40.147052\n ],\n [\n 115.806555,\n 40.15323\n ],\n [\n 115.773045,\n 40.176179\n ],\n [\n 115.754336,\n 40.163243\n ],\n [\n 115.754849,\n 40.145427\n ],\n [\n 115.734858,\n 40.129492\n ],\n [\n 115.715893,\n 40.133395\n ],\n [\n 115.644581,\n 40.12663\n ],\n [\n 115.641762,\n 40.115897\n ],\n [\n 115.59909,\n 40.119995\n ],\n [\n 115.590697,\n 40.096376\n ],\n [\n 115.575576,\n 40.100997\n ],\n [\n 115.553727,\n 40.091691\n ],\n [\n 115.555457,\n 40.082644\n ],\n [\n 115.528034,\n 40.07633\n ],\n [\n 115.478571,\n 40.036153\n ],\n [\n 115.454544,\n 40.029705\n ],\n [\n 115.442178,\n 40.010876\n ],\n [\n 115.450123,\n 39.99289\n ],\n [\n 115.428531,\n 39.984352\n ],\n [\n 115.426801,\n 39.950056\n ],\n [\n 115.40162,\n 39.903802\n ],\n [\n 115.399891,\n 39.891336\n ],\n [\n 115.364523,\n 39.885331\n ],\n [\n 115.365676,\n 39.867507\n ],\n [\n 115.354848,\n 39.850528\n ],\n [\n 115.354848,\n 39.850528\n ],\n [\n 115.343251,\n 39.837857\n ],\n [\n 115.345237,\n 39.821851\n ],\n [\n 115.330052,\n 39.80656\n ],\n [\n 115.342867,\n 39.79205\n ],\n [\n 115.312945,\n 39.783551\n ],\n [\n 115.283216,\n 39.745165\n ],\n [\n 115.250859,\n 39.73882\n ],\n [\n 115.215043,\n 39.708067\n ],\n [\n 115.177625,\n 39.700475\n ],\n [\n 115.179163,\n 39.679592\n ],\n [\n 115.168847,\n 39.672651\n ],\n [\n 115.138734,\n 39.688627\n ],\n [\n 115.095293,\n 39.704795\n ],\n [\n 115.050058,\n 39.709245\n ],\n [\n 115.03199,\n 39.702373\n ],\n [\n 115.011487,\n 39.674746\n ],\n [\n 114.987396,\n 39.67802\n ],\n [\n 114.961895,\n 39.666103\n ],\n [\n 114.936331,\n 39.66368\n ],\n [\n 114.891032,\n 39.634728\n ],\n [\n 114.838429,\n 39.589179\n ],\n [\n 114.821642,\n 39.61022\n ],\n [\n 114.783775,\n 39.609499\n ],\n [\n 114.760645,\n 39.617036\n ],\n [\n 114.716756,\n 39.618674\n ],\n [\n 114.712079,\n 39.594358\n ],\n [\n 114.680748,\n 39.588064\n ],\n [\n 114.654991,\n 39.599209\n ],\n [\n 114.633527,\n 39.555866\n ],\n [\n 114.604887,\n 39.567869\n ],\n [\n 114.58432,\n 39.585835\n ],\n [\n 114.563432,\n 39.558162\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 130800,\n \"name\": \"承德市\",\n \"center\": [\n 117.939152,\n 40.976204\n ],\n \"centroid\": [\n 117.55153,\n 41.356188\n ],\n \"childrenNum\": 11,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 130000\n },\n \"subFeatureIndex\": 7,\n \"acroutes\": [\n 100000,\n 130000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 119.158474,\n 40.614418\n ],\n [\n 119.105487,\n 40.603632\n ],\n [\n 119.086394,\n 40.588775\n ],\n [\n 119.063392,\n 40.606151\n ],\n [\n 119.013095,\n 40.577081\n ],\n [\n 118.998359,\n 40.578955\n ],\n [\n 118.983366,\n 40.56364\n ],\n [\n 118.952676,\n 40.558469\n ],\n [\n 118.966003,\n 40.536102\n ],\n [\n 118.919038,\n 40.53093\n ],\n [\n 118.886938,\n 40.542438\n ],\n [\n 118.864,\n 40.527244\n ],\n [\n 118.821328,\n 40.531964\n ],\n [\n 118.794867,\n 40.510753\n ],\n [\n 118.792112,\n 40.492382\n ],\n [\n 118.772954,\n 40.479765\n ],\n [\n 118.723491,\n 40.473746\n ],\n [\n 118.702795,\n 40.491411\n ],\n [\n 118.657176,\n 40.450574\n ],\n [\n 118.624179,\n 40.437626\n ],\n [\n 118.618349,\n 40.425193\n ],\n [\n 118.643785,\n 40.380946\n ],\n [\n 118.640197,\n 40.354566\n ],\n [\n 118.608225,\n 40.328305\n ],\n [\n 118.596949,\n 40.308456\n ],\n [\n 118.580098,\n 40.305861\n ],\n [\n 118.568949,\n 40.287564\n ],\n [\n 118.533325,\n 40.298854\n ],\n [\n 118.532364,\n 40.319419\n ],\n [\n 118.539989,\n 40.361048\n ],\n [\n 118.558377,\n 40.36928\n ],\n [\n 118.550881,\n 40.385482\n ],\n [\n 118.571512,\n 40.414636\n ],\n [\n 118.548062,\n 40.422667\n ],\n [\n 118.523458,\n 40.40628\n ],\n [\n 118.503211,\n 40.403365\n ],\n [\n 118.45599,\n 40.414053\n ],\n [\n 118.430746,\n 40.411851\n ],\n [\n 118.402683,\n 40.416838\n ],\n [\n 118.387305,\n 40.436719\n ],\n [\n 118.360011,\n 40.428819\n ],\n [\n 118.356295,\n 40.435295\n ],\n [\n 118.306575,\n 40.419558\n ],\n [\n 118.277935,\n 40.425711\n ],\n [\n 118.262942,\n 40.452063\n ],\n [\n 118.239684,\n 40.464686\n ],\n [\n 118.173818,\n 40.423056\n ],\n [\n 118.156967,\n 40.423768\n ],\n [\n 118.153123,\n 40.409519\n ],\n [\n 118.165232,\n 40.400449\n ],\n [\n 118.133837,\n 40.375113\n ],\n [\n 118.121856,\n 40.354695\n ],\n [\n 118.079312,\n 40.353528\n ],\n [\n 118.061564,\n 40.319095\n ],\n [\n 118.031643,\n 40.302358\n ],\n [\n 118.000888,\n 40.29256\n ],\n [\n 117.909457,\n 40.285876\n ],\n [\n 117.897989,\n 40.270429\n ],\n [\n 117.867554,\n 40.26965\n ],\n [\n 117.844104,\n 40.261406\n ],\n [\n 117.807775,\n 40.261926\n ],\n [\n 117.75152,\n 40.229718\n ],\n [\n 117.714551,\n 40.241668\n ],\n [\n 117.694112,\n 40.238161\n ],\n [\n 117.677069,\n 40.22095\n ],\n [\n 117.64625,\n 40.205163\n ],\n [\n 117.619532,\n 40.206398\n ],\n [\n 117.609409,\n 40.194897\n ],\n [\n 117.575451,\n 40.192817\n ],\n [\n 117.56238,\n 40.206073\n ],\n [\n 117.571671,\n 40.219261\n ],\n [\n 117.54617,\n 40.232901\n ],\n [\n 117.514326,\n 40.227705\n ],\n [\n 117.484084,\n 40.235304\n ],\n [\n 117.450062,\n 40.252512\n ],\n [\n 117.419115,\n 40.249785\n ],\n [\n 117.415335,\n 40.236862\n ],\n [\n 117.386375,\n 40.22712\n ],\n [\n 117.350943,\n 40.229978\n ],\n [\n 117.339859,\n 40.246213\n ],\n [\n 117.331465,\n 40.28977\n ],\n [\n 117.296354,\n 40.278088\n ],\n [\n 117.293342,\n 40.296713\n ],\n [\n 117.274377,\n 40.308521\n ],\n [\n 117.275018,\n 40.33239\n ],\n [\n 117.260217,\n 40.335762\n ],\n [\n 117.242277,\n 40.369993\n ],\n [\n 117.226195,\n 40.369021\n ],\n [\n 117.228502,\n 40.386389\n ],\n [\n 117.240675,\n 40.394424\n ],\n [\n 117.234076,\n 40.417162\n ],\n [\n 117.263357,\n 40.442352\n ],\n [\n 117.236511,\n 40.45653\n ],\n [\n 117.237215,\n 40.468763\n ],\n [\n 117.208575,\n 40.501115\n ],\n [\n 117.219019,\n 40.514375\n ],\n [\n 117.247147,\n 40.511788\n ],\n [\n 117.264126,\n 40.517285\n ],\n [\n 117.247403,\n 40.54024\n ],\n [\n 117.269444,\n 40.560473\n ],\n [\n 117.311859,\n 40.57805\n ],\n [\n 117.342742,\n 40.581604\n ],\n [\n 117.365936,\n 40.575982\n ],\n [\n 117.387464,\n 40.560861\n ],\n [\n 117.402072,\n 40.573139\n ],\n [\n 117.430008,\n 40.576112\n ],\n [\n 117.412708,\n 40.605118\n ],\n [\n 117.431545,\n 40.625589\n ],\n [\n 117.448909,\n 40.628366\n ],\n [\n 117.46198,\n 40.65309\n ],\n [\n 117.477997,\n 40.635338\n ],\n [\n 117.501256,\n 40.636759\n ],\n [\n 117.514583,\n 40.660511\n ],\n [\n 117.492862,\n 40.675417\n ],\n [\n 117.442245,\n 40.676643\n ],\n [\n 117.409248,\n 40.687288\n ],\n [\n 117.359208,\n 40.673869\n ],\n [\n 117.342678,\n 40.673611\n ],\n [\n 117.32115,\n 40.658317\n ],\n [\n 117.290395,\n 40.660189\n ],\n [\n 117.261371,\n 40.681159\n ],\n [\n 117.241636,\n 40.676643\n ],\n [\n 117.20236,\n 40.695609\n ],\n [\n 117.117785,\n 40.700059\n ],\n [\n 117.110673,\n 40.70825\n ],\n [\n 117.0771,\n 40.700059\n ],\n [\n 117.058327,\n 40.701543\n ],\n [\n 117.031032,\n 40.692126\n ],\n [\n 116.979967,\n 40.702833\n ],\n [\n 116.926531,\n 40.744869\n ],\n [\n 116.923391,\n 40.773738\n ],\n [\n 116.894623,\n 40.781597\n ],\n [\n 116.896353,\n 40.79712\n ],\n [\n 116.880207,\n 40.804332\n ],\n [\n 116.87617,\n 40.821202\n ],\n [\n 116.847723,\n 40.839354\n ],\n [\n 116.813636,\n 40.848428\n ],\n [\n 116.805051,\n 40.840706\n ],\n [\n 116.79512,\n 40.863614\n ],\n [\n 116.759496,\n 40.889858\n ],\n [\n 116.730471,\n 40.897768\n ],\n [\n 116.713236,\n 40.911978\n ],\n [\n 116.722334,\n 40.927406\n ],\n [\n 116.689465,\n 40.950669\n ],\n [\n 116.67774,\n 40.971227\n ],\n [\n 116.683058,\n 41.000511\n ],\n [\n 116.698884,\n 41.021246\n ],\n [\n 116.688632,\n 41.044669\n ],\n [\n 116.665182,\n 41.046658\n ],\n [\n 116.64769,\n 41.059296\n ],\n [\n 116.630839,\n 41.060771\n ],\n [\n 116.614116,\n 41.03607\n ],\n [\n 116.622958,\n 41.02086\n ],\n [\n 116.614309,\n 40.982916\n ],\n [\n 116.597778,\n 40.97476\n ],\n [\n 116.569715,\n 40.991265\n ],\n [\n 116.536333,\n 40.988889\n ],\n [\n 116.516791,\n 40.975274\n ],\n [\n 116.455539,\n 40.980476\n ],\n [\n 116.447466,\n 40.953818\n ],\n [\n 116.473607,\n 40.919757\n ],\n [\n 116.474184,\n 40.896032\n ],\n [\n 116.458678,\n 40.900597\n ],\n [\n 116.41402,\n 40.899762\n ],\n [\n 116.398771,\n 40.905934\n ],\n [\n 116.37641,\n 40.939681\n ],\n [\n 116.365069,\n 40.943216\n ],\n [\n 116.341747,\n 40.964804\n ],\n [\n 116.333546,\n 40.984458\n ],\n [\n 116.29837,\n 40.986641\n ],\n [\n 116.264733,\n 41.038252\n ],\n [\n 116.296128,\n 41.062118\n ],\n [\n 116.277419,\n 41.083154\n ],\n [\n 116.268769,\n 41.102645\n ],\n [\n 116.245447,\n 41.114183\n ],\n [\n 116.233273,\n 41.130845\n ],\n [\n 116.245895,\n 41.16358\n ],\n [\n 116.22347,\n 41.174275\n ],\n [\n 116.221356,\n 41.185928\n ],\n [\n 116.235195,\n 41.211853\n ],\n [\n 116.213603,\n 41.233288\n ],\n [\n 116.198995,\n 41.259578\n ],\n [\n 116.191627,\n 41.288158\n ],\n [\n 116.209503,\n 41.307715\n ],\n [\n 116.203352,\n 41.326117\n ],\n [\n 116.17484,\n 41.356328\n ],\n [\n 116.141586,\n 41.373439\n ],\n [\n 116.08751,\n 41.376951\n ],\n [\n 116.07713,\n 41.384866\n ],\n [\n 116.036124,\n 41.397694\n ],\n [\n 116.03023,\n 41.416645\n ],\n [\n 116.004473,\n 41.432911\n ],\n [\n 116.000052,\n 41.454402\n ],\n [\n 115.97673,\n 41.470913\n ],\n [\n 115.982112,\n 41.485127\n ],\n [\n 115.97391,\n 41.529659\n ],\n [\n 115.958789,\n 41.550353\n ],\n [\n 115.924767,\n 41.568623\n ],\n [\n 115.929252,\n 41.596113\n ],\n [\n 115.909967,\n 41.642921\n ],\n [\n 115.972885,\n 41.680101\n ],\n [\n 116.014404,\n 41.715355\n ],\n [\n 116.056307,\n 41.733705\n ],\n [\n 116.081039,\n 41.776352\n ],\n [\n 116.098658,\n 41.776479\n ],\n [\n 116.129221,\n 41.806607\n ],\n [\n 116.105706,\n 41.834757\n ],\n [\n 116.106667,\n 41.849587\n ],\n [\n 116.134731,\n 41.863844\n ],\n [\n 116.171124,\n 41.868912\n ],\n [\n 116.193164,\n 41.861816\n ],\n [\n 116.212578,\n 41.885128\n ],\n [\n 116.211361,\n 41.906848\n ],\n [\n 116.230518,\n 41.926282\n ],\n [\n 116.233401,\n 41.941408\n ],\n [\n 116.28421,\n 41.959376\n ],\n [\n 116.29837,\n 41.968106\n ],\n [\n 116.306507,\n 41.991379\n ],\n [\n 116.327267,\n 42.005667\n ],\n [\n 116.373719,\n 42.009965\n ],\n [\n 116.409087,\n 41.994034\n ],\n [\n 116.41402,\n 41.98221\n ],\n [\n 116.393133,\n 41.94299\n ],\n [\n 116.432088,\n 41.939383\n ],\n [\n 116.453873,\n 41.945964\n ],\n [\n 116.482641,\n 41.975886\n ],\n [\n 116.496416,\n 41.97968\n ],\n [\n 116.514164,\n 41.970067\n ],\n [\n 116.533706,\n 41.938876\n ],\n [\n 116.566383,\n 41.928751\n ],\n [\n 116.597073,\n 41.935586\n ],\n [\n 116.634812,\n 41.929953\n ],\n [\n 116.669154,\n 41.947735\n ],\n [\n 116.72746,\n 41.951089\n ],\n [\n 116.744631,\n 41.982146\n ],\n [\n 116.766479,\n 41.990304\n ],\n [\n 116.796209,\n 41.978099\n ],\n [\n 116.821133,\n 41.988723\n ],\n [\n 116.831961,\n 42.005351\n ],\n [\n 116.868161,\n 42.002885\n ],\n [\n 116.87963,\n 42.018372\n ],\n [\n 116.881681,\n 42.05224\n ],\n [\n 116.890651,\n 42.092655\n ],\n [\n 116.877324,\n 42.121057\n ],\n [\n 116.865022,\n 42.124085\n ],\n [\n 116.850221,\n 42.15632\n ],\n [\n 116.825169,\n 42.155563\n ],\n [\n 116.789225,\n 42.200261\n ],\n [\n 116.858166,\n 42.197236\n ],\n [\n 116.903401,\n 42.19087\n ],\n [\n 116.917433,\n 42.207698\n ],\n [\n 116.918522,\n 42.229875\n ],\n [\n 116.897442,\n 42.297618\n ],\n [\n 116.886806,\n 42.366608\n ],\n [\n 116.911858,\n 42.391431\n ],\n [\n 116.914421,\n 42.402677\n ],\n [\n 116.965102,\n 42.421583\n ],\n [\n 117.006685,\n 42.432948\n ],\n [\n 117.016744,\n 42.45649\n ],\n [\n 117.046922,\n 42.454105\n ],\n [\n 117.079535,\n 42.460632\n ],\n [\n 117.094912,\n 42.483661\n ],\n [\n 117.135726,\n 42.469167\n ],\n [\n 117.175963,\n 42.465527\n ],\n [\n 117.222287,\n 42.475442\n ],\n [\n 117.252208,\n 42.473685\n ],\n [\n 117.275466,\n 42.481905\n ],\n [\n 117.321406,\n 42.468791\n ],\n [\n 117.330056,\n 42.461887\n ],\n [\n 117.390732,\n 42.462076\n ],\n [\n 117.412836,\n 42.472493\n ],\n [\n 117.416296,\n 42.512326\n ],\n [\n 117.408415,\n 42.519976\n ],\n [\n 117.387015,\n 42.517405\n ],\n [\n 117.39637,\n 42.536339\n ],\n [\n 117.433147,\n 42.555769\n ],\n [\n 117.44436,\n 42.577447\n ],\n [\n 117.435197,\n 42.585403\n ],\n [\n 117.455957,\n 42.589411\n ],\n [\n 117.473512,\n 42.602437\n ],\n [\n 117.524898,\n 42.590727\n ],\n [\n 117.539955,\n 42.605443\n ],\n [\n 117.600311,\n 42.603001\n ],\n [\n 117.610883,\n 42.592355\n ],\n [\n 117.6442,\n 42.589787\n ],\n [\n 117.66733,\n 42.582459\n ],\n [\n 117.707247,\n 42.588033\n ],\n [\n 117.779904,\n 42.618591\n ],\n [\n 117.801496,\n 42.612706\n ],\n [\n 117.792334,\n 42.598367\n ],\n [\n 117.797588,\n 42.585277\n ],\n [\n 117.829624,\n 42.56498\n ],\n [\n 117.849614,\n 42.546619\n ],\n [\n 117.87409,\n 42.510194\n ],\n [\n 117.940148,\n 42.462766\n ],\n [\n 117.954564,\n 42.445003\n ],\n [\n 117.99762,\n 42.416684\n ],\n [\n 118.019405,\n 42.395201\n ],\n [\n 118.021263,\n 42.371636\n ],\n [\n 118.009153,\n 42.358248\n ],\n [\n 118.016265,\n 42.333286\n ],\n [\n 118.059962,\n 42.29831\n ],\n [\n 118.047468,\n 42.280563\n ],\n [\n 118.023249,\n 42.267155\n ],\n [\n 117.971095,\n 42.248014\n ],\n [\n 117.977438,\n 42.229875\n ],\n [\n 118.020366,\n 42.213432\n ],\n [\n 118.033629,\n 42.199127\n ],\n [\n 118.089051,\n 42.183874\n ],\n [\n 118.10635,\n 42.171958\n ],\n [\n 118.104172,\n 42.148878\n ],\n [\n 118.088859,\n 42.117144\n ],\n [\n 118.097765,\n 42.10509\n ],\n [\n 118.136528,\n 42.094486\n ],\n [\n 118.155173,\n 42.081164\n ],\n [\n 118.136913,\n 42.052871\n ],\n [\n 118.115256,\n 42.045859\n ],\n [\n 118.116538,\n 42.037204\n ],\n [\n 118.141846,\n 42.031327\n ],\n [\n 118.189067,\n 42.030569\n ],\n [\n 118.204188,\n 42.034866\n ],\n [\n 118.220206,\n 42.058619\n ],\n [\n 118.212581,\n 42.081101\n ],\n [\n 118.226613,\n 42.090256\n ],\n [\n 118.252498,\n 42.091014\n ],\n [\n 118.272232,\n 42.083311\n ],\n [\n 118.297284,\n 42.048765\n ],\n [\n 118.283061,\n 42.03158\n ],\n [\n 118.237634,\n 42.022859\n ],\n [\n 118.256278,\n 42.010724\n ],\n [\n 118.294722,\n 42.005224\n ],\n [\n 118.314007,\n 41.987774\n ],\n [\n 118.306255,\n 41.975127\n ],\n [\n 118.306511,\n 41.940269\n ],\n [\n 118.268901,\n 41.930143\n ],\n [\n 118.270182,\n 41.917357\n ],\n [\n 118.286649,\n 41.91109\n ],\n [\n 118.324515,\n 41.880187\n ],\n [\n 118.340213,\n 41.872459\n ],\n [\n 118.331755,\n 41.840651\n ],\n [\n 118.319838,\n 41.83146\n ],\n [\n 118.292287,\n 41.772863\n ],\n [\n 118.270823,\n 41.762203\n ],\n [\n 118.246988,\n 41.774005\n ],\n [\n 118.236032,\n 41.807559\n ],\n [\n 118.219117,\n 41.815358\n ],\n [\n 118.165873,\n 41.813265\n ],\n [\n 118.140372,\n 41.783965\n ],\n [\n 118.130698,\n 41.742275\n ],\n [\n 118.155173,\n 41.712624\n ],\n [\n 118.153699,\n 41.691156\n ],\n [\n 118.169013,\n 41.67076\n ],\n [\n 118.206879,\n 41.65074\n ],\n [\n 118.215208,\n 41.633002\n ],\n [\n 118.20989,\n 41.61774\n ],\n [\n 118.215337,\n 41.595668\n ],\n [\n 118.230522,\n 41.582178\n ],\n [\n 118.270823,\n 41.573524\n ],\n [\n 118.279152,\n 41.56544\n ],\n [\n 118.301577,\n 41.569641\n ],\n [\n 118.313302,\n 41.561494\n ],\n [\n 118.302923,\n 41.552709\n ],\n [\n 118.315801,\n 41.512525\n ],\n [\n 118.295426,\n 41.485127\n ],\n [\n 118.269605,\n 41.478881\n ],\n [\n 118.272168,\n 41.471296\n ],\n [\n 118.327078,\n 41.450831\n ],\n [\n 118.34867,\n 41.428318\n ],\n [\n 118.343993,\n 41.404139\n ],\n [\n 118.361741,\n 41.386717\n ],\n [\n 118.348286,\n 41.373886\n ],\n [\n 118.349119,\n 41.342789\n ],\n [\n 118.380193,\n 41.312124\n ],\n [\n 118.399607,\n 41.311102\n ],\n [\n 118.412422,\n 41.33193\n ],\n [\n 118.47329,\n 41.345663\n ],\n [\n 118.500841,\n 41.345791\n ],\n [\n 118.528135,\n 41.355051\n ],\n [\n 118.539796,\n 41.3509\n ],\n [\n 118.57997,\n 41.354029\n ],\n [\n 118.629946,\n 41.34643\n ],\n [\n 118.676974,\n 41.350453\n ],\n [\n 118.695171,\n 41.337999\n ],\n [\n 118.741879,\n 41.324073\n ],\n [\n 118.763343,\n 41.328928\n ],\n [\n 118.770007,\n 41.353071\n ],\n [\n 118.846124,\n 41.373823\n ],\n [\n 118.844907,\n 41.34247\n ],\n [\n 118.868421,\n 41.312636\n ],\n [\n 118.890718,\n 41.300749\n ],\n [\n 118.934671,\n 41.304584\n ],\n [\n 118.949536,\n 41.318003\n ],\n [\n 118.974716,\n 41.306565\n ],\n [\n 119.006752,\n 41.307076\n ],\n [\n 119.035136,\n 41.298768\n ],\n [\n 119.093121,\n 41.293655\n ],\n [\n 119.154951,\n 41.297682\n ],\n [\n 119.200698,\n 41.28234\n ],\n [\n 119.212103,\n 41.308099\n ],\n [\n 119.239461,\n 41.314489\n ],\n [\n 119.248367,\n 41.27665\n ],\n [\n 119.231004,\n 41.256444\n ],\n [\n 119.20954,\n 41.244483\n ],\n [\n 119.209796,\n 41.225803\n ],\n [\n 119.169623,\n 41.222923\n ],\n [\n 119.166483,\n 41.21294\n ],\n [\n 119.188909,\n 41.198156\n ],\n [\n 119.184295,\n 41.182727\n ],\n [\n 119.158603,\n 41.169664\n ],\n [\n 119.126374,\n 41.138662\n ],\n [\n 119.081204,\n 41.131422\n ],\n [\n 119.080627,\n 41.095978\n ],\n [\n 119.073771,\n 41.084244\n ],\n [\n 119.050834,\n 41.080333\n ],\n [\n 119.037507,\n 41.067378\n ],\n [\n 119.008354,\n 41.068596\n ],\n [\n 118.964657,\n 41.079307\n ],\n [\n 118.93685,\n 41.052624\n ],\n [\n 118.936209,\n 41.037482\n ],\n [\n 118.951971,\n 41.018421\n ],\n [\n 119.013544,\n 41.007637\n ],\n [\n 119.0204,\n 40.997878\n ],\n [\n 119.005086,\n 40.984265\n ],\n [\n 119.000601,\n 40.967052\n ],\n [\n 118.946461,\n 40.958122\n ],\n [\n 118.917052,\n 40.968594\n ],\n [\n 118.903468,\n 40.961784\n ],\n [\n 118.891743,\n 40.903362\n ],\n [\n 118.873034,\n 40.848042\n ],\n [\n 118.855094,\n 40.840577\n ],\n [\n 118.846252,\n 40.822103\n ],\n [\n 118.849135,\n 40.800919\n ],\n [\n 118.861501,\n 40.802658\n ],\n [\n 118.878544,\n 40.783207\n ],\n [\n 118.910965,\n 40.776766\n ],\n [\n 118.895459,\n 40.754021\n ],\n [\n 118.91167,\n 40.756083\n ],\n [\n 118.949344,\n 40.747834\n ],\n [\n 118.960813,\n 40.720566\n ],\n [\n 118.987723,\n 40.697931\n ],\n [\n 119.010725,\n 40.687868\n ],\n [\n 119.027063,\n 40.692448\n ],\n [\n 119.048719,\n 40.681482\n ],\n [\n 119.05423,\n 40.664964\n ],\n [\n 119.081588,\n 40.671869\n ],\n [\n 119.095107,\n 40.663351\n ],\n [\n 119.115098,\n 40.666513\n ],\n [\n 119.153349,\n 40.688707\n ],\n [\n 119.176222,\n 40.690191\n ],\n [\n 119.185833,\n 40.67574\n ],\n [\n 119.173211,\n 40.654316\n ],\n [\n 119.146557,\n 40.63579\n ],\n [\n 119.158474,\n 40.614418\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 130900,\n \"name\": \"沧州市\",\n \"center\": [\n 116.857461,\n 38.310582\n ],\n \"centroid\": [\n 116.771346,\n 38.27096\n ],\n \"childrenNum\": 16,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 130000\n },\n \"subFeatureIndex\": 8,\n \"acroutes\": [\n 100000,\n 130000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 116.335916,\n 37.581263\n ],\n [\n 116.3281,\n 37.605058\n ],\n [\n 116.375192,\n 37.617256\n ],\n [\n 116.374936,\n 37.63949\n ],\n [\n 116.36539,\n 37.648719\n ],\n [\n 116.378909,\n 37.659698\n ],\n [\n 116.386533,\n 37.696393\n ],\n [\n 116.424784,\n 37.735829\n ],\n [\n 116.434331,\n 37.734618\n ],\n [\n 116.438367,\n 37.758902\n ],\n [\n 116.451182,\n 37.7587\n ],\n [\n 116.460664,\n 37.778875\n ],\n [\n 116.47303,\n 37.777059\n ],\n [\n 116.466623,\n 37.805564\n ],\n [\n 116.481424,\n 37.830026\n ],\n [\n 116.473415,\n 37.865495\n ],\n [\n 116.51346,\n 37.863951\n ],\n [\n 116.515382,\n 37.892892\n ],\n [\n 116.53377,\n 37.907727\n ],\n [\n 116.565166,\n 37.980116\n ],\n [\n 116.563243,\n 38.01987\n ],\n [\n 116.496352,\n 38.013704\n ],\n [\n 116.483474,\n 38.02503\n ],\n [\n 116.479309,\n 38.011492\n ],\n [\n 116.417224,\n 38.009481\n ],\n [\n 116.3709,\n 38.018597\n ],\n [\n 116.343925,\n 38.017256\n ],\n [\n 116.329189,\n 38.008141\n ],\n [\n 116.306764,\n 37.979312\n ],\n [\n 116.278252,\n 37.962479\n ],\n [\n 116.266975,\n 37.981458\n ],\n [\n 116.266206,\n 37.961405\n ],\n [\n 116.256595,\n 37.965229\n ],\n [\n 116.226354,\n 37.95121\n ],\n [\n 116.209118,\n 37.966369\n ],\n [\n 116.188039,\n 37.968314\n ],\n [\n 116.170163,\n 37.959594\n ],\n [\n 116.170867,\n 37.933565\n ],\n [\n 116.153952,\n 37.914573\n ],\n [\n 116.091034,\n 37.910949\n ],\n [\n 116.093981,\n 37.922627\n ],\n [\n 116.120571,\n 37.948996\n ],\n [\n 116.100645,\n 37.948929\n ],\n [\n 116.071876,\n 37.980318\n ],\n [\n 116.062394,\n 38.005057\n ],\n [\n 116.044774,\n 38.023824\n ],\n [\n 116.049515,\n 38.038365\n ],\n [\n 116.070595,\n 38.041112\n ],\n [\n 116.05227,\n 38.052434\n ],\n [\n 116.055474,\n 38.071725\n ],\n [\n 116.031511,\n 38.082774\n ],\n [\n 116.031831,\n 38.100718\n ],\n [\n 116.048554,\n 38.11424\n ],\n [\n 116.055218,\n 38.131306\n ],\n [\n 116.049771,\n 38.146026\n ],\n [\n 115.986725,\n 38.125885\n ],\n [\n 115.968913,\n 38.138533\n ],\n [\n 115.938671,\n 38.144354\n ],\n [\n 115.935403,\n 38.167232\n ],\n [\n 115.900804,\n 38.158536\n ],\n [\n 115.887542,\n 38.171312\n ],\n [\n 115.899523,\n 38.20314\n ],\n [\n 115.871267,\n 38.217579\n ],\n [\n 115.856467,\n 38.240901\n ],\n [\n 115.864476,\n 38.255266\n ],\n [\n 115.837181,\n 38.272499\n ],\n [\n 115.833016,\n 38.298008\n ],\n [\n 115.850188,\n 38.309423\n ],\n [\n 115.841538,\n 38.346062\n ],\n [\n 115.804633,\n 38.345462\n ],\n [\n 115.783297,\n 38.358338\n ],\n [\n 115.738767,\n 38.369544\n ],\n [\n 115.734025,\n 38.359205\n ],\n [\n 115.705321,\n 38.367543\n ],\n [\n 115.731462,\n 38.392618\n ],\n [\n 115.715957,\n 38.438411\n ],\n [\n 115.718584,\n 38.449205\n ],\n [\n 115.745686,\n 38.481311\n ],\n [\n 115.770418,\n 38.48817\n ],\n [\n 115.79137,\n 38.512005\n ],\n [\n 115.816101,\n 38.52545\n ],\n [\n 115.875047,\n 38.510141\n ],\n [\n 115.869345,\n 38.524652\n ],\n [\n 115.878507,\n 38.535566\n ],\n [\n 115.890809,\n 38.52585\n ],\n [\n 115.940721,\n 38.530508\n ],\n [\n 115.934058,\n 38.546678\n ],\n [\n 115.960583,\n 38.584394\n ],\n [\n 115.96321,\n 38.613182\n ],\n [\n 115.951101,\n 38.627938\n ],\n [\n 115.973398,\n 38.635514\n ],\n [\n 115.973526,\n 38.668467\n ],\n [\n 115.959879,\n 38.679891\n ],\n [\n 115.955009,\n 38.702932\n ],\n [\n 115.966286,\n 38.708973\n ],\n [\n 115.944053,\n 38.735456\n ],\n [\n 115.95187,\n 38.746736\n ],\n [\n 115.995118,\n 38.77798\n ],\n [\n 115.999731,\n 38.796812\n ],\n [\n 116.023054,\n 38.812524\n ],\n [\n 116.04093,\n 38.812259\n ],\n [\n 116.035548,\n 38.829492\n ],\n [\n 116.048746,\n 38.8607\n ],\n [\n 116.04157,\n 38.878451\n ],\n [\n 116.045543,\n 38.897786\n ],\n [\n 116.085524,\n 38.91063\n ],\n [\n 116.112754,\n 38.909703\n ],\n [\n 116.125633,\n 38.920823\n ],\n [\n 116.121083,\n 38.934391\n ],\n [\n 116.15203,\n 38.948352\n ],\n [\n 116.209503,\n 38.921618\n ],\n [\n 116.20002,\n 38.915727\n ],\n [\n 116.202198,\n 38.887258\n ],\n [\n 116.212194,\n 38.870238\n ],\n [\n 116.23212,\n 38.871894\n ],\n [\n 116.248907,\n 38.85964\n ],\n [\n 116.247497,\n 38.848907\n ],\n [\n 116.278764,\n 38.836451\n ],\n [\n 116.271973,\n 38.816634\n ],\n [\n 116.338287,\n 38.80689\n ],\n [\n 116.390313,\n 38.789784\n ],\n [\n 116.42299,\n 38.770419\n ],\n [\n 116.435804,\n 38.733199\n ],\n [\n 116.406331,\n 38.703596\n ],\n [\n 116.370836,\n 38.692508\n ],\n [\n 116.366863,\n 38.67305\n ],\n [\n 116.381984,\n 38.619165\n ],\n [\n 116.41921,\n 38.599288\n ],\n [\n 116.425425,\n 38.587187\n ],\n [\n 116.454834,\n 38.580337\n ],\n [\n 116.455475,\n 38.557656\n ],\n [\n 116.432152,\n 38.552533\n ],\n [\n 116.431127,\n 38.539558\n ],\n [\n 116.452655,\n 38.534501\n ],\n [\n 116.449772,\n 38.518262\n ],\n [\n 116.465726,\n 38.494096\n ],\n [\n 116.519482,\n 38.48817\n ],\n [\n 116.559399,\n 38.496759\n ],\n [\n 116.569715,\n 38.470988\n ],\n [\n 116.589897,\n 38.483908\n ],\n [\n 116.610593,\n 38.479646\n ],\n [\n 116.627315,\n 38.501087\n ],\n [\n 116.621228,\n 38.514335\n ],\n [\n 116.647114,\n 38.50648\n ],\n [\n 116.668257,\n 38.530042\n ],\n [\n 116.672678,\n 38.546545\n ],\n [\n 116.652431,\n 38.551202\n ],\n [\n 116.643333,\n 38.564773\n ],\n [\n 116.671653,\n 38.566503\n ],\n [\n 116.662234,\n 38.581268\n ],\n [\n 116.680303,\n 38.592706\n ],\n [\n 116.680559,\n 38.605936\n ],\n [\n 116.702792,\n 38.619098\n ],\n [\n 116.71503,\n 38.609327\n ],\n [\n 116.733739,\n 38.614047\n ],\n [\n 116.738224,\n 38.631327\n ],\n [\n 116.763212,\n 38.633853\n ],\n [\n 116.77404,\n 38.652258\n ],\n [\n 116.758855,\n 38.732071\n ],\n [\n 116.766351,\n 38.741959\n ],\n [\n 116.796529,\n 38.74667\n ],\n [\n 116.859127,\n 38.741295\n ],\n [\n 116.867457,\n 38.745873\n ],\n [\n 116.866496,\n 38.717005\n ],\n [\n 116.87726,\n 38.680688\n ],\n [\n 116.994447,\n 38.695695\n ],\n [\n 117.014502,\n 38.690184\n ],\n [\n 117.015719,\n 38.700409\n ],\n [\n 117.042309,\n 38.706517\n ],\n [\n 117.039041,\n 38.688457\n ],\n [\n 117.06813,\n 38.680621\n ],\n [\n 117.051727,\n 38.643488\n ],\n [\n 117.064285,\n 38.635713\n ],\n [\n 117.071526,\n 38.607399\n ],\n [\n 117.086326,\n 38.606402\n ],\n [\n 117.098179,\n 38.586921\n ],\n [\n 117.13611,\n 38.598756\n ],\n [\n 117.151103,\n 38.617702\n ],\n [\n 117.186086,\n 38.616506\n ],\n [\n 117.23036,\n 38.641694\n ],\n [\n 117.23068,\n 38.624017\n ],\n [\n 117.255988,\n 38.613781\n ],\n [\n 117.259512,\n 38.603078\n ],\n [\n 117.238369,\n 38.581002\n ],\n [\n 117.253169,\n 38.556192\n ],\n [\n 117.292189,\n 38.562445\n ],\n [\n 117.305644,\n 38.556591\n ],\n [\n 117.358055,\n 38.57056\n ],\n [\n 117.368883,\n 38.582465\n ],\n [\n 117.369075,\n 38.564773\n ],\n [\n 117.391949,\n 38.572689\n ],\n [\n 117.432442,\n 38.601349\n ],\n [\n 117.478895,\n 38.617237\n ],\n [\n 117.541429,\n 38.60361\n ],\n [\n 117.557831,\n 38.613781\n ],\n [\n 117.63901,\n 38.626742\n ],\n [\n 117.645033,\n 38.593836\n ],\n [\n 117.638562,\n 38.570028\n ],\n [\n 117.643367,\n 38.54029\n ],\n [\n 117.68527,\n 38.539425\n ],\n [\n 117.685975,\n 38.532438\n ],\n [\n 117.645161,\n 38.527647\n ],\n [\n 117.647852,\n 38.508677\n ],\n [\n 117.678799,\n 38.477049\n ],\n [\n 117.710899,\n 38.467791\n ],\n [\n 117.725123,\n 38.457333\n ],\n [\n 117.730505,\n 38.424949\n ],\n [\n 117.781186,\n 38.373812\n ],\n [\n 117.804764,\n 38.367076\n ],\n [\n 117.846411,\n 38.36801\n ],\n [\n 117.937457,\n 38.38775\n ],\n [\n 117.958024,\n 38.376147\n ],\n [\n 117.948349,\n 38.346462\n ],\n [\n 117.916698,\n 38.32344\n ],\n [\n 117.895682,\n 38.301613\n ],\n [\n 117.860891,\n 38.274569\n ],\n [\n 117.8475,\n 38.25393\n ],\n [\n 117.808544,\n 38.228406\n ],\n [\n 117.789195,\n 38.180741\n ],\n [\n 117.801625,\n 38.173786\n ],\n [\n 117.766962,\n 38.15867\n ],\n [\n 117.76882,\n 38.131908\n ],\n [\n 117.743191,\n 38.123409\n ],\n [\n 117.729223,\n 38.093822\n ],\n [\n 117.704492,\n 38.076078\n ],\n [\n 117.679504,\n 38.07956\n ],\n [\n 117.666048,\n 38.072528\n ],\n [\n 117.616713,\n 38.069046\n ],\n [\n 117.58378,\n 38.070653\n ],\n [\n 117.556486,\n 38.05719\n ],\n [\n 117.56033,\n 38.040978\n ],\n [\n 117.527974,\n 37.996275\n ],\n [\n 117.512789,\n 37.943428\n ],\n [\n 117.481137,\n 37.914842\n ],\n [\n 117.438593,\n 37.853876\n ],\n [\n 117.406301,\n 37.843531\n ],\n [\n 117.381954,\n 37.854547\n ],\n [\n 117.34428,\n 37.862675\n ],\n [\n 117.320124,\n 37.861399\n ],\n [\n 117.271366,\n 37.839903\n ],\n [\n 117.208832,\n 37.843732\n ],\n [\n 117.185317,\n 37.849778\n ],\n [\n 117.150142,\n 37.839567\n ],\n [\n 117.093759,\n 37.849509\n ],\n [\n 117.074345,\n 37.848771\n ],\n [\n 117.027188,\n 37.832378\n ],\n [\n 116.976635,\n 37.841045\n ],\n [\n 116.947675,\n 37.840037\n ],\n [\n 116.919355,\n 37.845882\n ],\n [\n 116.883795,\n 37.844337\n ],\n [\n 116.84375,\n 37.834461\n ],\n [\n 116.812739,\n 37.843598\n ],\n [\n 116.788136,\n 37.843396\n ],\n [\n 116.786149,\n 37.82633\n ],\n [\n 116.753665,\n 37.792993\n ],\n [\n 116.753793,\n 37.770536\n ],\n [\n 116.744182,\n 37.757355\n ],\n [\n 116.723167,\n 37.766703\n ],\n [\n 116.724512,\n 37.744305\n ],\n [\n 116.699332,\n 37.730648\n ],\n [\n 116.67979,\n 37.728764\n ],\n [\n 116.663964,\n 37.687776\n ],\n [\n 116.641027,\n 37.682323\n ],\n [\n 116.640834,\n 37.666432\n ],\n [\n 116.604506,\n 37.62514\n ],\n [\n 116.574648,\n 37.609978\n ],\n [\n 116.545816,\n 37.582477\n ],\n [\n 116.538512,\n 37.568453\n ],\n [\n 116.517048,\n 37.557191\n ],\n [\n 116.486421,\n 37.524205\n ],\n [\n 116.456115,\n 37.513679\n ],\n [\n 116.434139,\n 37.473383\n ],\n [\n 116.402167,\n 37.509833\n ],\n [\n 116.368913,\n 37.526364\n ],\n [\n 116.376858,\n 37.546602\n ],\n [\n 116.367696,\n 37.566295\n ],\n [\n 116.343541,\n 37.566025\n ],\n [\n 116.335916,\n 37.581263\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 131000,\n \"name\": \"廊坊市\",\n \"center\": [\n 116.704441,\n 39.523927\n ],\n \"centroid\": [\n 116.540228,\n 39.111214\n ],\n \"childrenNum\": 10,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 130000\n },\n \"subFeatureIndex\": 9,\n \"acroutes\": [\n 100000,\n 130000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 116.209503,\n 38.921618\n ],\n [\n 116.230262,\n 38.92453\n ],\n [\n 116.228083,\n 38.942199\n ],\n [\n 116.243653,\n 38.949345\n ],\n [\n 116.253007,\n 38.932074\n ],\n [\n 116.291386,\n 38.948683\n ],\n [\n 116.298755,\n 38.975076\n ],\n [\n 116.316182,\n 38.962708\n ],\n [\n 116.33534,\n 38.984004\n ],\n [\n 116.3215,\n 38.998088\n ],\n [\n 116.299588,\n 38.993658\n ],\n [\n 116.293757,\n 39.007344\n ],\n [\n 116.307148,\n 39.032196\n ],\n [\n 116.318617,\n 39.037416\n ],\n [\n 116.317592,\n 39.077911\n ],\n [\n 116.305354,\n 39.098116\n ],\n [\n 116.278957,\n 39.112045\n ],\n [\n 116.262426,\n 39.138114\n ],\n [\n 116.221804,\n 39.147813\n ],\n [\n 116.207837,\n 39.168526\n ],\n [\n 116.206555,\n 39.207429\n ],\n [\n 116.186116,\n 39.222457\n ],\n [\n 116.201109,\n 39.251911\n ],\n [\n 116.208734,\n 39.330195\n ],\n [\n 116.198226,\n 39.351315\n ],\n [\n 116.13582,\n 39.351842\n ],\n [\n 116.116791,\n 39.376243\n ],\n [\n 116.133001,\n 39.4055\n ],\n [\n 116.132104,\n 39.429423\n ],\n [\n 116.151325,\n 39.471005\n ],\n [\n 116.179901,\n 39.486568\n ],\n [\n 116.182144,\n 39.49635\n ],\n [\n 116.220843,\n 39.511644\n ],\n [\n 116.222766,\n 39.501995\n ],\n [\n 116.244678,\n 39.517354\n ],\n [\n 116.257941,\n 39.500551\n ],\n [\n 116.279277,\n 39.491295\n ],\n [\n 116.306443,\n 39.488997\n ],\n [\n 116.320027,\n 39.46851\n ],\n [\n 116.350461,\n 39.453009\n ],\n [\n 116.408958,\n 39.45025\n ],\n [\n 116.434395,\n 39.442761\n ],\n [\n 116.454706,\n 39.453338\n ],\n [\n 116.444134,\n 39.482169\n ],\n [\n 116.412354,\n 39.482103\n ],\n [\n 116.418761,\n 39.506393\n ],\n [\n 116.402807,\n 39.5144\n ],\n [\n 116.402679,\n 39.526869\n ],\n [\n 116.424079,\n 39.522735\n ],\n [\n 116.424656,\n 39.509741\n ],\n [\n 116.443813,\n 39.509872\n ],\n [\n 116.440994,\n 39.527328\n ],\n [\n 116.464573,\n 39.527657\n ],\n [\n 116.478861,\n 39.539204\n ],\n [\n 116.470916,\n 39.55462\n ],\n [\n 116.508462,\n 39.551078\n ],\n [\n 116.519354,\n 39.566491\n ],\n [\n 116.524416,\n 39.596521\n ],\n [\n 116.541779,\n 39.593505\n ],\n [\n 116.566575,\n 39.604387\n ],\n [\n 116.565934,\n 39.619788\n ],\n [\n 116.607773,\n 39.619723\n ],\n [\n 116.620524,\n 39.601699\n ],\n [\n 116.646537,\n 39.599143\n ],\n [\n 116.662363,\n 39.605239\n ],\n [\n 116.705099,\n 39.587999\n ],\n [\n 116.727075,\n 39.593047\n ],\n [\n 116.7026,\n 39.610417\n ],\n [\n 116.700742,\n 39.621033\n ],\n [\n 116.748667,\n 39.619919\n ],\n [\n 116.790699,\n 39.596062\n ],\n [\n 116.789994,\n 39.610548\n ],\n [\n 116.812355,\n 39.615922\n ],\n [\n 116.797875,\n 39.594358\n ],\n [\n 116.81165,\n 39.576983\n ],\n [\n 116.787687,\n 39.554555\n ],\n [\n 116.806204,\n 39.528838\n ],\n [\n 116.819595,\n 39.52851\n ],\n [\n 116.826194,\n 39.513088\n ],\n [\n 116.813957,\n 39.510266\n ],\n [\n 116.820748,\n 39.482431\n ],\n [\n 116.785124,\n 39.465883\n ],\n [\n 116.807421,\n 39.445586\n ],\n [\n 116.815751,\n 39.451761\n ],\n [\n 116.832473,\n 39.435468\n ],\n [\n 116.855475,\n 39.443352\n ],\n [\n 116.875914,\n 39.434548\n ],\n [\n 116.834139,\n 39.402674\n ],\n [\n 116.837599,\n 39.374073\n ],\n [\n 116.818121,\n 39.373547\n ],\n [\n 116.829206,\n 39.338881\n ],\n [\n 116.849196,\n 39.339473\n ],\n [\n 116.870724,\n 39.357499\n ],\n [\n 116.875786,\n 39.33921\n ],\n [\n 116.889626,\n 39.338157\n ],\n [\n 116.884243,\n 39.305383\n ],\n [\n 116.867969,\n 39.302552\n ],\n [\n 116.878733,\n 39.255336\n ],\n [\n 116.892637,\n 39.223973\n ],\n [\n 116.874569,\n 39.230036\n ],\n [\n 116.875594,\n 39.21646\n ],\n [\n 116.855796,\n 39.215669\n ],\n [\n 116.863164,\n 39.201365\n ],\n [\n 116.870084,\n 39.153685\n ],\n [\n 116.909232,\n 39.150782\n ],\n [\n 116.924096,\n 39.119372\n ],\n [\n 116.91109,\n 39.111055\n ],\n [\n 116.881488,\n 39.071702\n ],\n [\n 116.869891,\n 39.069919\n ],\n [\n 116.860473,\n 39.050564\n ],\n [\n 116.80268,\n 39.050895\n ],\n [\n 116.787303,\n 39.061927\n ],\n [\n 116.773015,\n 39.046865\n ],\n [\n 116.756612,\n 39.0503\n ],\n [\n 116.754626,\n 39.003245\n ],\n [\n 116.728613,\n 38.975341\n ],\n [\n 116.716247,\n 38.938957\n ],\n [\n 116.70811,\n 38.931876\n ],\n [\n 116.708046,\n 38.897058\n ],\n [\n 116.722334,\n 38.897058\n ],\n [\n 116.723103,\n 38.852551\n ],\n [\n 116.74604,\n 38.851491\n ],\n [\n 116.75123,\n 38.831282\n ],\n [\n 116.73848,\n 38.807022\n ],\n [\n 116.737327,\n 38.784479\n ],\n [\n 116.751294,\n 38.780168\n ],\n [\n 116.746297,\n 38.754233\n ],\n [\n 116.766351,\n 38.741959\n ],\n [\n 116.758855,\n 38.732071\n ],\n [\n 116.77404,\n 38.652258\n ],\n [\n 116.763212,\n 38.633853\n ],\n [\n 116.738224,\n 38.631327\n ],\n [\n 116.733739,\n 38.614047\n ],\n [\n 116.71503,\n 38.609327\n ],\n [\n 116.702792,\n 38.619098\n ],\n [\n 116.680559,\n 38.605936\n ],\n [\n 116.680303,\n 38.592706\n ],\n [\n 116.662234,\n 38.581268\n ],\n [\n 116.671653,\n 38.566503\n ],\n [\n 116.643333,\n 38.564773\n ],\n [\n 116.652431,\n 38.551202\n ],\n [\n 116.672678,\n 38.546545\n ],\n [\n 116.668257,\n 38.530042\n ],\n [\n 116.647114,\n 38.50648\n ],\n [\n 116.621228,\n 38.514335\n ],\n [\n 116.627315,\n 38.501087\n ],\n [\n 116.610593,\n 38.479646\n ],\n [\n 116.589897,\n 38.483908\n ],\n [\n 116.569715,\n 38.470988\n ],\n [\n 116.559399,\n 38.496759\n ],\n [\n 116.519482,\n 38.48817\n ],\n [\n 116.465726,\n 38.494096\n ],\n [\n 116.449772,\n 38.518262\n ],\n [\n 116.452655,\n 38.534501\n ],\n [\n 116.431127,\n 38.539558\n ],\n [\n 116.432152,\n 38.552533\n ],\n [\n 116.455475,\n 38.557656\n ],\n [\n 116.454834,\n 38.580337\n ],\n [\n 116.425425,\n 38.587187\n ],\n [\n 116.41921,\n 38.599288\n ],\n [\n 116.381984,\n 38.619165\n ],\n [\n 116.366863,\n 38.67305\n ],\n [\n 116.370836,\n 38.692508\n ],\n [\n 116.406331,\n 38.703596\n ],\n [\n 116.435804,\n 38.733199\n ],\n [\n 116.42299,\n 38.770419\n ],\n [\n 116.390313,\n 38.789784\n ],\n [\n 116.338287,\n 38.80689\n ],\n [\n 116.271973,\n 38.816634\n ],\n [\n 116.278764,\n 38.836451\n ],\n [\n 116.247497,\n 38.848907\n ],\n [\n 116.248907,\n 38.85964\n ],\n [\n 116.23212,\n 38.871894\n ],\n [\n 116.212194,\n 38.870238\n ],\n [\n 116.202198,\n 38.887258\n ],\n [\n 116.20002,\n 38.915727\n ],\n [\n 116.209503,\n 38.921618\n ]\n ]\n ],\n [\n [\n [\n 117.209793,\n 40.082253\n ],\n [\n 117.222863,\n 40.065523\n ],\n [\n 117.1841,\n 40.062593\n ],\n [\n 117.187752,\n 40.026187\n ],\n [\n 117.198132,\n 39.99276\n ],\n [\n 117.178654,\n 39.977311\n ],\n [\n 117.175963,\n 39.959121\n ],\n [\n 117.151039,\n 39.944839\n ],\n [\n 117.156869,\n 39.938055\n ],\n [\n 117.137456,\n 39.921616\n ],\n [\n 117.158856,\n 39.909218\n ],\n [\n 117.149117,\n 39.896297\n ],\n [\n 117.166865,\n 39.868944\n ],\n [\n 117.227797,\n 39.852749\n ],\n [\n 117.247467,\n 39.861043\n ],\n [\n 117.259961,\n 39.843409\n ],\n [\n 117.252208,\n 39.834591\n ],\n [\n 117.192173,\n 39.833088\n ],\n [\n 117.195056,\n 39.82551\n ],\n [\n 117.156357,\n 39.817473\n ],\n [\n 117.15751,\n 39.796756\n ],\n [\n 117.178718,\n 39.795318\n ],\n [\n 117.18064,\n 39.78244\n ],\n [\n 117.205884,\n 39.763871\n ],\n [\n 117.161867,\n 39.747389\n ],\n [\n 117.153153,\n 39.722726\n ],\n [\n 117.169235,\n 39.717622\n ],\n [\n 117.170132,\n 39.673371\n ],\n [\n 117.159624,\n 39.666823\n ],\n [\n 117.177693,\n 39.645602\n ],\n [\n 117.157959,\n 39.636627\n ],\n [\n 117.152641,\n 39.623523\n ],\n [\n 117.127076,\n 39.61697\n ],\n [\n 117.057045,\n 39.644554\n ],\n [\n 117.015783,\n 39.654052\n ],\n [\n 117.004378,\n 39.644489\n ],\n [\n 116.974585,\n 39.636824\n ],\n [\n 116.963629,\n 39.643441\n ],\n [\n 116.944599,\n 39.695173\n ],\n [\n 116.950878,\n 39.706824\n ],\n [\n 116.91692,\n 39.706365\n ],\n [\n 116.912563,\n 39.689216\n ],\n [\n 116.893854,\n 39.695893\n ],\n [\n 116.88277,\n 39.718472\n ],\n [\n 116.916664,\n 39.731362\n ],\n [\n 116.901799,\n 39.763609\n ],\n [\n 116.920893,\n 39.769167\n ],\n [\n 116.924288,\n 39.781263\n ],\n [\n 116.949725,\n 39.778583\n ],\n [\n 116.952608,\n 39.789827\n ],\n [\n 116.928453,\n 39.813095\n ],\n [\n 116.92589,\n 39.835374\n ],\n [\n 116.902824,\n 39.848242\n ],\n [\n 116.907566,\n 39.834133\n ],\n [\n 116.885653,\n 39.844585\n ],\n [\n 116.866047,\n 39.843866\n ],\n [\n 116.827284,\n 39.87704\n ],\n [\n 116.804154,\n 39.877954\n ],\n [\n 116.784676,\n 39.891401\n ],\n [\n 116.780575,\n 39.94973\n ],\n [\n 116.757317,\n 39.961468\n ],\n [\n 116.775385,\n 39.99276\n ],\n [\n 116.770452,\n 40.011658\n ],\n [\n 116.781536,\n 40.034851\n ],\n [\n 116.819979,\n 40.028337\n ],\n [\n 116.822734,\n 40.046444\n ],\n [\n 116.857782,\n 40.051914\n ],\n [\n 116.867841,\n 40.041885\n ],\n [\n 116.928133,\n 40.05491\n ],\n [\n 116.960489,\n 40.051133\n ],\n [\n 116.972086,\n 40.037\n ],\n [\n 117.000662,\n 40.0299\n ],\n [\n 117.028533,\n 40.033939\n ],\n [\n 117.052048,\n 40.059402\n ],\n [\n 117.085173,\n 40.068583\n ],\n [\n 117.085621,\n 40.075158\n ],\n [\n 117.119515,\n 40.072424\n ],\n [\n 117.13925,\n 40.064025\n ],\n [\n 117.160073,\n 40.076199\n ],\n [\n 117.204347,\n 40.06982\n ],\n [\n 117.209793,\n 40.082253\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 131100,\n \"name\": \"衡水市\",\n \"center\": [\n 115.665993,\n 37.735097\n ],\n \"centroid\": [\n 115.828776,\n 37.764802\n ],\n \"childrenNum\": 11,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 130000\n },\n \"subFeatureIndex\": 10,\n \"acroutes\": [\n 100000,\n 130000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 115.705321,\n 38.367543\n ],\n [\n 115.734025,\n 38.359205\n ],\n [\n 115.738767,\n 38.369544\n ],\n [\n 115.783297,\n 38.358338\n ],\n [\n 115.804633,\n 38.345462\n ],\n [\n 115.841538,\n 38.346062\n ],\n [\n 115.850188,\n 38.309423\n ],\n [\n 115.833016,\n 38.298008\n ],\n [\n 115.837181,\n 38.272499\n ],\n [\n 115.864476,\n 38.255266\n ],\n [\n 115.856467,\n 38.240901\n ],\n [\n 115.871267,\n 38.217579\n ],\n [\n 115.899523,\n 38.20314\n ],\n [\n 115.887542,\n 38.171312\n ],\n [\n 115.900804,\n 38.158536\n ],\n [\n 115.935403,\n 38.167232\n ],\n [\n 115.938671,\n 38.144354\n ],\n [\n 115.968913,\n 38.138533\n ],\n [\n 115.986725,\n 38.125885\n ],\n [\n 116.049771,\n 38.146026\n ],\n [\n 116.055218,\n 38.131306\n ],\n [\n 116.048554,\n 38.11424\n ],\n [\n 116.031831,\n 38.100718\n ],\n [\n 116.031511,\n 38.082774\n ],\n [\n 116.055474,\n 38.071725\n ],\n [\n 116.05227,\n 38.052434\n ],\n [\n 116.070595,\n 38.041112\n ],\n [\n 116.049515,\n 38.038365\n ],\n [\n 116.044774,\n 38.023824\n ],\n [\n 116.062394,\n 38.005057\n ],\n [\n 116.071876,\n 37.980318\n ],\n [\n 116.100645,\n 37.948929\n ],\n [\n 116.120571,\n 37.948996\n ],\n [\n 116.093981,\n 37.922627\n ],\n [\n 116.091034,\n 37.910949\n ],\n [\n 116.153952,\n 37.914573\n ],\n [\n 116.170867,\n 37.933565\n ],\n [\n 116.170163,\n 37.959594\n ],\n [\n 116.188039,\n 37.968314\n ],\n [\n 116.209118,\n 37.966369\n ],\n [\n 116.226354,\n 37.95121\n ],\n [\n 116.256595,\n 37.965229\n ],\n [\n 116.266206,\n 37.961405\n ],\n [\n 116.266975,\n 37.981458\n ],\n [\n 116.278252,\n 37.962479\n ],\n [\n 116.306764,\n 37.979312\n ],\n [\n 116.329189,\n 38.008141\n ],\n [\n 116.343925,\n 38.017256\n ],\n [\n 116.3709,\n 38.018597\n ],\n [\n 116.417224,\n 38.009481\n ],\n [\n 116.479309,\n 38.011492\n ],\n [\n 116.483474,\n 38.02503\n ],\n [\n 116.496352,\n 38.013704\n ],\n [\n 116.563243,\n 38.01987\n ],\n [\n 116.565166,\n 37.980116\n ],\n [\n 116.53377,\n 37.907727\n ],\n [\n 116.515382,\n 37.892892\n ],\n [\n 116.51346,\n 37.863951\n ],\n [\n 116.473415,\n 37.865495\n ],\n [\n 116.481424,\n 37.830026\n ],\n [\n 116.466623,\n 37.805564\n ],\n [\n 116.47303,\n 37.777059\n ],\n [\n 116.460664,\n 37.778875\n ],\n [\n 116.451182,\n 37.7587\n ],\n [\n 116.438367,\n 37.758902\n ],\n [\n 116.434331,\n 37.734618\n ],\n [\n 116.424784,\n 37.735829\n ],\n [\n 116.386533,\n 37.696393\n ],\n [\n 116.378909,\n 37.659698\n ],\n [\n 116.36539,\n 37.648719\n ],\n [\n 116.374936,\n 37.63949\n ],\n [\n 116.375192,\n 37.617256\n ],\n [\n 116.3281,\n 37.605058\n ],\n [\n 116.335916,\n 37.581263\n ],\n [\n 116.287863,\n 37.5493\n ],\n [\n 116.291386,\n 37.5238\n ],\n [\n 116.278444,\n 37.524745\n ],\n [\n 116.290233,\n 37.484049\n ],\n [\n 116.271781,\n 37.478176\n ],\n [\n 116.276458,\n 37.466901\n ],\n [\n 116.241346,\n 37.491475\n ],\n [\n 116.224431,\n 37.479729\n ],\n [\n 116.229878,\n 37.459676\n ],\n [\n 116.243076,\n 37.448195\n ],\n [\n 116.227379,\n 37.424755\n ],\n [\n 116.263067,\n 37.42239\n ],\n [\n 116.285236,\n 37.40266\n ],\n [\n 116.236028,\n 37.361559\n ],\n [\n 116.195471,\n 37.365684\n ],\n [\n 116.168817,\n 37.38414\n ],\n [\n 116.106539,\n 37.368794\n ],\n [\n 116.08751,\n 37.373324\n ],\n [\n 116.056179,\n 37.369065\n ],\n [\n 116.05195,\n 37.357502\n ],\n [\n 116.024527,\n 37.359937\n ],\n [\n 116.00947,\n 37.343165\n ],\n [\n 115.975897,\n 37.334508\n ],\n [\n 115.98461,\n 37.316175\n ],\n [\n 115.968272,\n 37.287076\n ],\n [\n 115.976217,\n 37.276178\n ],\n [\n 115.964171,\n 37.250721\n ],\n [\n 115.969425,\n 37.239479\n ],\n [\n 115.953215,\n 37.223697\n ],\n [\n 115.940721,\n 37.227558\n ],\n [\n 115.912017,\n 37.207098\n ],\n [\n 115.904841,\n 37.189344\n ],\n [\n 115.911825,\n 37.176195\n ],\n [\n 115.879981,\n 37.151992\n ],\n [\n 115.885427,\n 37.128731\n ],\n [\n 115.864988,\n 37.070785\n ],\n [\n 115.853904,\n 37.059245\n ],\n [\n 115.827378,\n 37.106006\n ],\n [\n 115.786564,\n 37.123916\n ],\n [\n 115.76997,\n 37.14155\n ],\n [\n 115.756322,\n 37.209876\n ],\n [\n 115.698465,\n 37.257153\n ],\n [\n 115.675784,\n 37.258914\n ],\n [\n 115.67258,\n 37.275839\n ],\n [\n 115.63292,\n 37.277058\n ],\n [\n 115.623437,\n 37.297905\n ],\n [\n 115.599859,\n 37.301965\n ],\n [\n 115.590632,\n 37.312453\n ],\n [\n 115.599218,\n 37.332884\n ],\n [\n 115.577177,\n 37.316107\n ],\n [\n 115.52938,\n 37.326864\n ],\n [\n 115.520089,\n 37.353648\n ],\n [\n 115.506634,\n 37.368997\n ],\n [\n 115.468768,\n 37.382788\n ],\n [\n 115.428595,\n 37.387926\n ],\n [\n 115.391049,\n 37.42793\n ],\n [\n 115.345109,\n 37.448195\n ],\n [\n 115.360038,\n 37.461431\n ],\n [\n 115.404183,\n 37.462039\n ],\n [\n 115.431478,\n 37.469602\n ],\n [\n 115.410719,\n 37.476421\n ],\n [\n 115.417638,\n 37.487762\n ],\n [\n 115.397968,\n 37.497347\n ],\n [\n 115.402069,\n 37.51017\n ],\n [\n 115.426096,\n 37.506256\n ],\n [\n 115.421675,\n 37.495727\n ],\n [\n 115.455313,\n 37.501802\n ],\n [\n 115.430965,\n 37.506796\n ],\n [\n 115.410078,\n 37.523261\n ],\n [\n 115.405785,\n 37.535944\n ],\n [\n 115.372147,\n 37.544106\n ],\n [\n 115.359461,\n 37.558675\n ],\n [\n 115.360871,\n 37.523935\n ],\n [\n 115.307179,\n 37.563935\n ],\n [\n 115.282575,\n 37.576005\n ],\n [\n 115.237276,\n 37.575465\n ],\n [\n 115.201908,\n 37.555977\n ],\n [\n 115.188325,\n 37.563125\n ],\n [\n 115.200563,\n 37.572498\n ],\n [\n 115.172756,\n 37.600543\n ],\n [\n 115.191593,\n 37.608833\n ],\n [\n 115.202934,\n 37.637133\n ],\n [\n 115.227858,\n 37.648921\n ],\n [\n 115.255088,\n 37.645621\n ],\n [\n 115.258356,\n 37.639625\n ],\n [\n 115.297376,\n 37.629587\n ],\n [\n 115.301412,\n 37.660169\n ],\n [\n 115.316853,\n 37.660102\n ],\n [\n 115.325567,\n 37.682458\n ],\n [\n 115.317046,\n 37.695383\n ],\n [\n 115.333768,\n 37.71322\n ],\n [\n 115.380989,\n 37.707432\n ],\n [\n 115.394316,\n 37.712143\n ],\n [\n 115.386179,\n 37.727082\n ],\n [\n 115.360294,\n 37.731994\n ],\n [\n 115.344468,\n 37.74814\n ],\n [\n 115.371635,\n 37.770335\n ],\n [\n 115.352349,\n 37.784052\n ],\n [\n 115.349722,\n 37.805765\n ],\n [\n 115.360166,\n 37.820215\n ],\n [\n 115.363049,\n 37.849845\n ],\n [\n 115.388614,\n 37.853003\n ],\n [\n 115.389831,\n 37.874629\n ],\n [\n 115.360294,\n 37.880068\n ],\n [\n 115.365484,\n 37.906318\n ],\n [\n 115.385795,\n 37.917191\n ],\n [\n 115.408668,\n 37.918936\n ],\n [\n 115.412769,\n 37.943293\n ],\n [\n 115.448585,\n 37.936584\n ],\n [\n 115.457555,\n 37.95074\n ],\n [\n 115.456017,\n 37.974551\n ],\n [\n 115.444997,\n 37.989168\n ],\n [\n 115.464219,\n 37.99299\n ],\n [\n 115.438205,\n 38.001102\n ],\n [\n 115.45134,\n 38.017323\n ],\n [\n 115.466782,\n 38.063554\n ],\n [\n 115.482992,\n 38.08398\n ],\n [\n 115.468063,\n 38.095161\n ],\n [\n 115.439871,\n 38.082038\n ],\n [\n 115.420522,\n 38.089671\n ],\n [\n 115.383232,\n 38.0886\n ],\n [\n 115.364843,\n 38.13793\n ],\n [\n 115.346903,\n 38.13967\n ],\n [\n 115.342418,\n 38.196254\n ],\n [\n 115.35094,\n 38.210493\n ],\n [\n 115.323645,\n 38.220586\n ],\n [\n 115.324734,\n 38.248184\n ],\n [\n 115.34953,\n 38.248117\n ],\n [\n 115.356194,\n 38.271764\n ],\n [\n 115.369072,\n 38.283451\n ],\n [\n 115.393611,\n 38.285588\n ],\n [\n 115.383104,\n 38.299076\n ],\n [\n 115.381822,\n 38.327578\n ],\n [\n 115.402453,\n 38.320103\n ],\n [\n 115.420906,\n 38.337922\n ],\n [\n 115.462104,\n 38.327311\n ],\n [\n 115.478122,\n 38.341658\n ],\n [\n 115.495101,\n 38.342993\n ],\n [\n 115.494781,\n 38.362006\n ],\n [\n 115.516822,\n 38.357337\n ],\n [\n 115.516437,\n 38.318168\n ],\n [\n 115.547704,\n 38.318168\n ],\n [\n 115.550908,\n 38.332917\n ],\n [\n 115.575768,\n 38.326377\n ],\n [\n 115.57942,\n 38.342859\n ],\n [\n 115.590504,\n 38.332784\n ],\n [\n 115.644965,\n 38.32611\n ],\n [\n 115.650155,\n 38.340791\n ],\n [\n 115.699811,\n 38.349932\n ],\n [\n 115.705321,\n 38.367543\n ]\n ]\n ]\n ]\n }\n }\n ]\n}', 'admin', '2020-05-19 16:42:35', 'jeecg', '2020-05-19 16:42:35', '0', NULL); +INSERT INTO `jimu_report_map` VALUES ('1334703777051127809', '山东', 'shandong', '{\n \"type\": \"FeatureCollection\",\n \"features\": [\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 370100,\n \"name\": \"济南市\",\n \"center\": [\n 117.000923,\n 36.675807\n ],\n \"centroid\": [\n 117.221244,\n 36.639974\n ],\n \"childrenNum\": 12,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 370000\n },\n \"subFeatureIndex\": 0,\n \"acroutes\": [\n 100000,\n 370000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 117.273417,\n 37.532619\n ],\n [\n 117.275549,\n 37.526193\n ],\n [\n 117.284393,\n 37.522266\n ],\n [\n 117.286525,\n 37.510046\n ],\n [\n 117.307215,\n 37.507744\n ],\n [\n 117.317718,\n 37.499371\n ],\n [\n 117.312585,\n 37.487068\n ],\n [\n 117.285894,\n 37.479328\n ],\n [\n 117.283998,\n 37.471587\n ],\n [\n 117.304609,\n 37.466069\n ],\n [\n 117.307768,\n 37.46194\n ],\n [\n 117.295449,\n 37.4538\n ],\n [\n 117.309189,\n 37.447486\n ],\n [\n 117.353332,\n 37.450901\n ],\n [\n 117.369758,\n 37.436048\n ],\n [\n 117.368257,\n 37.419563\n ],\n [\n 117.360202,\n 37.405697\n ],\n [\n 117.368652,\n 37.396399\n ],\n [\n 117.401029,\n 37.379071\n ],\n [\n 117.415401,\n 37.364203\n ],\n [\n 117.41319,\n 37.342255\n ],\n [\n 117.409163,\n 37.329488\n ],\n [\n 117.411611,\n 37.308604\n ],\n [\n 117.417612,\n 37.296587\n ],\n [\n 117.430168,\n 37.285166\n ],\n [\n 117.432379,\n 37.272032\n ],\n [\n 117.43688,\n 37.27235\n ],\n [\n 117.438302,\n 37.25786\n ],\n [\n 117.443908,\n 37.250056\n ],\n [\n 117.431037,\n 37.254396\n ],\n [\n 117.424403,\n 37.243367\n ],\n [\n 117.429141,\n 37.239783\n ],\n [\n 117.408768,\n 37.239703\n ],\n [\n 117.402371,\n 37.224808\n ],\n [\n 117.404977,\n 37.21716\n ],\n [\n 117.417928,\n 37.20003\n ],\n [\n 117.436091,\n 37.184251\n ],\n [\n 117.442724,\n 37.170859\n ],\n [\n 117.444066,\n 37.156868\n ],\n [\n 117.4507,\n 37.153957\n ],\n [\n 117.4507,\n 37.143711\n ],\n [\n 117.455596,\n 37.11767\n ],\n [\n 117.459781,\n 37.109931\n ],\n [\n 117.442092,\n 37.093574\n ],\n [\n 117.409241,\n 37.089425\n ],\n [\n 117.391158,\n 37.083479\n ],\n [\n 117.365256,\n 37.069272\n ],\n [\n 117.336433,\n 37.073941\n ],\n [\n 117.339434,\n 37.056419\n ],\n [\n 117.33667,\n 37.046838\n ],\n [\n 117.326088,\n 37.036178\n ],\n [\n 117.315349,\n 37.030547\n ],\n [\n 117.317323,\n 37.020923\n ],\n [\n 117.328457,\n 37.011218\n ],\n [\n 117.35349,\n 37.003349\n ],\n [\n 117.365335,\n 36.99496\n ],\n [\n 117.378286,\n 36.956997\n ],\n [\n 117.391632,\n 36.952\n ],\n [\n 117.40403,\n 36.955038\n ],\n [\n 117.415322,\n 36.964311\n ],\n [\n 117.432853,\n 36.954878\n ],\n [\n 117.444461,\n 36.958116\n ],\n [\n 117.458754,\n 36.957676\n ],\n [\n 117.477628,\n 36.961154\n ],\n [\n 117.476522,\n 36.968348\n ],\n [\n 117.494527,\n 36.972344\n ],\n [\n 117.509847,\n 36.969267\n ],\n [\n 117.519875,\n 36.957117\n ],\n [\n 117.536854,\n 36.978498\n ],\n [\n 117.549094,\n 36.979817\n ],\n [\n 117.555253,\n 36.970785\n ],\n [\n 117.54933,\n 36.96507\n ],\n [\n 117.56544,\n 36.959954\n ],\n [\n 117.56465,\n 36.945084\n ],\n [\n 117.553674,\n 36.940727\n ],\n [\n 117.551305,\n 36.93385\n ],\n [\n 117.539538,\n 36.941486\n ],\n [\n 117.534248,\n 36.931611\n ],\n [\n 117.56923,\n 36.915736\n ],\n [\n 117.58376,\n 36.894176\n ],\n [\n 117.585024,\n 36.886815\n ],\n [\n 117.579891,\n 36.878093\n ],\n [\n 117.577364,\n 36.862847\n ],\n [\n 117.580523,\n 36.85136\n ],\n [\n 117.608556,\n 36.821815\n ],\n [\n 117.648119,\n 36.805436\n ],\n [\n 117.677811,\n 36.783245\n ],\n [\n 117.687603,\n 36.763853\n ],\n [\n 117.695974,\n 36.754115\n ],\n [\n 117.724165,\n 36.755998\n ],\n [\n 117.747303,\n 36.748584\n ],\n [\n 117.736642,\n 36.729423\n ],\n [\n 117.739959,\n 36.721004\n ],\n [\n 117.71848,\n 36.704724\n ],\n [\n 117.718006,\n 36.697826\n ],\n [\n 117.715637,\n 36.691208\n ],\n [\n 117.701265,\n 36.685191\n ],\n [\n 117.695184,\n 36.666978\n ],\n [\n 117.698027,\n 36.652974\n ],\n [\n 117.709003,\n 36.651569\n ],\n [\n 117.712241,\n 36.642258\n ],\n [\n 117.70853,\n 36.635154\n ],\n [\n 117.715321,\n 36.627527\n ],\n [\n 117.714926,\n 36.610545\n ],\n [\n 117.706555,\n 36.611549\n ],\n [\n 117.705055,\n 36.605807\n ],\n [\n 117.690525,\n 36.604883\n ],\n [\n 117.697869,\n 36.599422\n ],\n [\n 117.715163,\n 36.600546\n ],\n [\n 117.706792,\n 36.593559\n ],\n [\n 117.715321,\n 36.578537\n ],\n [\n 117.706792,\n 36.581469\n ],\n [\n 117.696132,\n 36.575042\n ],\n [\n 117.694315,\n 36.568896\n ],\n [\n 117.720849,\n 36.560057\n ],\n [\n 117.72377,\n 36.54732\n ],\n [\n 117.739406,\n 36.539925\n ],\n [\n 117.742486,\n 36.525737\n ],\n [\n 117.750777,\n 36.524652\n ],\n [\n 117.76586,\n 36.512994\n ],\n [\n 117.765544,\n 36.509496\n ],\n [\n 117.751646,\n 36.509979\n ],\n [\n 117.735853,\n 36.504993\n ],\n [\n 117.743118,\n 36.498439\n ],\n [\n 117.755673,\n 36.496228\n ],\n [\n 117.757332,\n 36.484485\n ],\n [\n 117.748566,\n 36.478694\n ],\n [\n 117.765544,\n 36.469845\n ],\n [\n 117.757016,\n 36.459144\n ],\n [\n 117.763491,\n 36.452868\n ],\n [\n 117.755752,\n 36.445303\n ],\n [\n 117.779838,\n 36.441239\n ],\n [\n 117.786471,\n 36.434277\n ],\n [\n 117.7965,\n 36.43963\n ],\n [\n 117.799343,\n 36.432265\n ],\n [\n 117.817268,\n 36.436129\n ],\n [\n 117.822717,\n 36.44305\n ],\n [\n 117.833062,\n 36.44301\n ],\n [\n 117.826823,\n 36.427114\n ],\n [\n 117.829508,\n 36.417776\n ],\n [\n 117.855094,\n 36.412945\n ],\n [\n 117.859279,\n 36.389433\n ],\n [\n 117.867492,\n 36.386373\n ],\n [\n 117.879732,\n 36.370626\n ],\n [\n 117.882101,\n 36.35673\n ],\n [\n 117.890314,\n 36.366035\n ],\n [\n 117.89521,\n 36.359227\n ],\n [\n 117.893472,\n 36.339446\n ],\n [\n 117.902633,\n 36.352057\n ],\n [\n 117.915346,\n 36.352903\n ],\n [\n 117.933904,\n 36.341219\n ],\n [\n 117.933509,\n 36.334369\n ],\n [\n 117.919611,\n 36.324738\n ],\n [\n 117.918347,\n 36.317725\n ],\n [\n 117.924823,\n 36.313171\n ],\n [\n 117.922533,\n 36.300514\n ],\n [\n 117.93114,\n 36.283742\n ],\n [\n 117.926797,\n 36.277532\n ],\n [\n 117.932719,\n 36.271846\n ],\n [\n 117.943696,\n 36.274064\n ],\n [\n 117.972993,\n 36.268378\n ],\n [\n 117.975362,\n 36.262328\n ],\n [\n 117.96707,\n 36.248251\n ],\n [\n 117.96328,\n 36.224971\n ],\n [\n 117.967781,\n 36.21464\n ],\n [\n 117.959332,\n 36.204308\n ],\n [\n 117.943933,\n 36.207981\n ],\n [\n 117.928534,\n 36.196558\n ],\n [\n 117.921664,\n 36.203662\n ],\n [\n 117.914636,\n 36.200837\n ],\n [\n 117.915899,\n 36.192562\n ],\n [\n 117.903027,\n 36.172092\n ],\n [\n 117.912109,\n 36.171648\n ],\n [\n 117.917873,\n 36.16337\n ],\n [\n 117.90666,\n 36.152708\n ],\n [\n 117.914162,\n 36.140631\n ],\n [\n 117.91203,\n 36.132753\n ],\n [\n 117.923875,\n 36.1174\n ],\n [\n 117.921111,\n 36.110005\n ],\n [\n 117.931535,\n 36.094203\n ],\n [\n 117.939984,\n 36.094324\n ],\n [\n 117.946618,\n 36.100387\n ],\n [\n 117.954041,\n 36.090201\n ],\n [\n 117.953172,\n 36.081833\n ],\n [\n 117.946223,\n 36.08151\n ],\n [\n 117.94188,\n 36.071807\n ],\n [\n 117.948829,\n 36.062589\n ],\n [\n 117.935799,\n 36.061214\n ],\n [\n 117.932798,\n 36.052196\n ],\n [\n 117.946855,\n 36.04253\n ],\n [\n 117.949855,\n 36.018259\n ],\n [\n 117.94338,\n 36.017288\n ],\n [\n 117.950803,\n 35.996489\n ],\n [\n 117.937536,\n 35.99653\n ],\n [\n 117.935088,\n 36.004421\n ],\n [\n 117.926165,\n 36.005068\n ],\n [\n 117.922848,\n 36.015467\n ],\n [\n 117.914557,\n 36.020039\n ],\n [\n 117.895052,\n 36.020363\n ],\n [\n 117.877047,\n 36.016357\n ],\n [\n 117.866386,\n 36.007415\n ],\n [\n 117.854462,\n 36.006889\n ],\n [\n 117.841827,\n 36.011947\n ],\n [\n 117.828719,\n 36.008022\n ],\n [\n 117.825244,\n 36.013363\n ],\n [\n 117.801159,\n 36.012959\n ],\n [\n 117.794763,\n 36.015143\n ],\n [\n 117.782286,\n 36.007294\n ],\n [\n 117.781022,\n 35.995437\n ],\n [\n 117.762307,\n 35.990621\n ],\n [\n 117.756621,\n 35.991916\n ],\n [\n 117.756542,\n 36.002236\n ],\n [\n 117.750304,\n 36.011947\n ],\n [\n 117.757016,\n 36.019392\n ],\n [\n 117.741696,\n 36.036058\n ],\n [\n 117.725824,\n 36.029667\n ],\n [\n 117.720454,\n 36.038243\n ],\n [\n 117.701186,\n 36.04528\n ],\n [\n 117.689972,\n 36.052358\n ],\n [\n 117.656569,\n 36.049729\n ],\n [\n 117.630588,\n 36.059879\n ],\n [\n 117.601844,\n 36.075648\n ],\n [\n 117.575943,\n 36.074516\n ],\n [\n 117.561649,\n 36.079327\n ],\n [\n 117.552884,\n 36.087978\n ],\n [\n 117.547672,\n 36.106166\n ],\n [\n 117.534879,\n 36.111419\n ],\n [\n 117.505898,\n 36.098245\n ],\n [\n 117.491052,\n 36.096587\n ],\n [\n 117.484893,\n 36.10075\n ],\n [\n 117.473758,\n 36.089797\n ],\n [\n 117.451963,\n 36.087412\n ],\n [\n 117.447067,\n 36.09206\n ],\n [\n 117.456148,\n 36.100467\n ],\n [\n 117.454885,\n 36.111177\n ],\n [\n 117.463571,\n 36.116875\n ],\n [\n 117.44683,\n 36.120834\n ],\n [\n 117.459623,\n 36.1498\n ],\n [\n 117.469178,\n 36.154687\n ],\n [\n 117.476601,\n 36.150123\n ],\n [\n 117.487972,\n 36.15921\n ],\n [\n 117.475653,\n 36.173102\n ],\n [\n 117.461202,\n 36.170194\n ],\n [\n 117.446988,\n 36.18691\n ],\n [\n 117.440434,\n 36.191189\n ],\n [\n 117.452437,\n 36.203138\n ],\n [\n 117.447778,\n 36.203541\n ],\n [\n 117.447383,\n 36.218313\n ],\n [\n 117.427878,\n 36.221662\n ],\n [\n 117.412716,\n 36.210927\n ],\n [\n 117.396607,\n 36.215972\n ],\n [\n 117.385235,\n 36.226989\n ],\n [\n 117.393132,\n 36.226747\n ],\n [\n 117.392895,\n 36.237439\n ],\n [\n 117.417217,\n 36.243652\n ],\n [\n 117.413901,\n 36.267934\n ],\n [\n 117.394553,\n 36.266522\n ],\n [\n 117.397791,\n 36.283782\n ],\n [\n 117.387604,\n 36.285556\n ],\n [\n 117.38792,\n 36.296361\n ],\n [\n 117.379707,\n 36.315146\n ],\n [\n 117.38871,\n 36.326148\n ],\n [\n 117.387762,\n 36.337915\n ],\n [\n 117.362729,\n 36.360234\n ],\n [\n 117.351753,\n 36.377997\n ],\n [\n 117.35041,\n 36.393379\n ],\n [\n 117.344962,\n 36.403968\n ],\n [\n 117.339434,\n 36.425786\n ],\n [\n 117.339118,\n 36.438181\n ],\n [\n 117.346936,\n 36.455724\n ],\n [\n 117.346383,\n 36.46373\n ],\n [\n 117.335328,\n 36.466345\n ],\n [\n 117.30682,\n 36.467029\n ],\n [\n 117.30682,\n 36.472097\n ],\n [\n 117.288184,\n 36.476039\n ],\n [\n 117.288973,\n 36.468718\n ],\n [\n 117.275786,\n 36.451218\n ],\n [\n 117.263862,\n 36.449206\n ],\n [\n 117.249726,\n 36.436732\n ],\n [\n 117.242145,\n 36.41528\n ],\n [\n 117.218297,\n 36.406182\n ],\n [\n 117.208742,\n 36.405297\n ],\n [\n 117.200924,\n 36.389755\n ],\n [\n 117.191685,\n 36.378762\n ],\n [\n 117.180945,\n 36.37256\n ],\n [\n 117.18292,\n 36.360798\n ],\n [\n 117.179603,\n 36.353144\n ],\n [\n 117.161361,\n 36.351895\n ],\n [\n 117.142567,\n 36.345731\n ],\n [\n 117.137039,\n 36.335135\n ],\n [\n 117.111691,\n 36.340413\n ],\n [\n 117.107347,\n 36.338882\n ],\n [\n 117.088711,\n 36.346013\n ],\n [\n 117.07734,\n 36.321957\n ],\n [\n 117.077655,\n 36.307205\n ],\n [\n 117.074102,\n 36.296724\n ],\n [\n 117.066995,\n 36.296885\n ],\n [\n 117.051201,\n 36.288741\n ],\n [\n 117.0482,\n 36.283701\n ],\n [\n 117.030275,\n 36.277532\n ],\n [\n 117.027353,\n 36.268983\n ],\n [\n 117.003347,\n 36.265353\n ],\n [\n 117.002794,\n 36.254503\n ],\n [\n 116.987632,\n 36.250711\n ],\n [\n 116.975471,\n 36.243208\n ],\n [\n 116.956835,\n 36.259787\n ],\n [\n 116.950201,\n 36.257327\n ],\n [\n 116.932828,\n 36.261925\n ],\n [\n 116.928722,\n 36.26991\n ],\n [\n 116.891133,\n 36.255471\n ],\n [\n 116.873129,\n 36.264062\n ],\n [\n 116.867759,\n 36.28108\n ],\n [\n 116.855519,\n 36.289709\n ],\n [\n 116.855756,\n 36.301642\n ],\n [\n 116.830644,\n 36.294587\n ],\n [\n 116.808612,\n 36.299022\n ],\n [\n 116.786659,\n 36.311357\n ],\n [\n 116.772761,\n 36.312002\n ],\n [\n 116.762574,\n 36.305391\n ],\n [\n 116.732961,\n 36.294144\n ],\n [\n 116.710376,\n 36.279185\n ],\n [\n 116.701058,\n 36.280153\n ],\n [\n 116.686528,\n 36.275435\n ],\n [\n 116.675709,\n 36.276645\n ],\n [\n 116.649018,\n 36.295797\n ],\n [\n 116.615536,\n 36.294587\n ],\n [\n 116.610403,\n 36.282451\n ],\n [\n 116.595794,\n 36.270999\n ],\n [\n 116.587502,\n 36.268862\n ],\n [\n 116.581264,\n 36.255471\n ],\n [\n 116.574393,\n 36.263457\n ],\n [\n 116.558837,\n 36.261037\n ],\n [\n 116.552361,\n 36.247767\n ],\n [\n 116.53641,\n 36.245588\n ],\n [\n 116.525591,\n 36.255229\n ],\n [\n 116.512325,\n 36.253414\n ],\n [\n 116.506402,\n 36.240344\n ],\n [\n 116.485239,\n 36.236067\n ],\n [\n 116.487529,\n 36.228441\n ],\n [\n 116.472604,\n 36.21464\n ],\n [\n 116.481922,\n 36.197002\n ],\n [\n 116.502059,\n 36.192764\n ],\n [\n 116.51035,\n 36.176857\n ],\n [\n 116.525986,\n 36.168297\n ],\n [\n 116.52188,\n 36.157151\n ],\n [\n 116.510192,\n 36.148346\n ],\n [\n 116.507192,\n 36.141277\n ],\n [\n 116.519748,\n 36.141196\n ],\n [\n 116.528513,\n 36.145276\n ],\n [\n 116.525275,\n 36.135298\n ],\n [\n 116.543122,\n 36.13958\n ],\n [\n 116.5586,\n 36.133804\n ],\n [\n 116.562153,\n 36.121643\n ],\n [\n 116.569024,\n 36.118774\n ],\n [\n 116.566891,\n 36.108752\n ],\n [\n 116.554651,\n 36.108187\n ],\n [\n 116.546597,\n 36.101195\n ],\n [\n 116.543359,\n 36.086604\n ],\n [\n 116.532303,\n 36.074274\n ],\n [\n 116.504112,\n 36.064732\n ],\n [\n 116.471182,\n 36.06457\n ],\n [\n 116.452072,\n 36.058019\n ],\n [\n 116.449387,\n 36.047302\n ],\n [\n 116.434541,\n 36.038607\n ],\n [\n 116.436121,\n 36.046534\n ],\n [\n 116.429566,\n 36.052439\n ],\n [\n 116.433357,\n 36.059839\n ],\n [\n 116.427829,\n 36.067441\n ],\n [\n 116.409508,\n 36.068007\n ],\n [\n 116.401059,\n 36.074031\n ],\n [\n 116.398058,\n 36.084582\n ],\n [\n 116.386845,\n 36.090807\n ],\n [\n 116.360233,\n 36.084744\n ],\n [\n 116.352731,\n 36.070797\n ],\n [\n 116.338753,\n 36.060082\n ],\n [\n 116.324855,\n 36.054178\n ],\n [\n 116.310404,\n 36.052196\n ],\n [\n 116.304718,\n 36.046251\n ],\n [\n 116.301244,\n 36.031123\n ],\n [\n 116.294689,\n 36.031407\n ],\n [\n 116.271552,\n 36.043824\n ],\n [\n 116.267998,\n 36.052964\n ],\n [\n 116.267287,\n 36.074233\n ],\n [\n 116.273368,\n 36.093758\n ],\n [\n 116.27171,\n 36.109843\n ],\n [\n 116.261444,\n 36.122693\n ],\n [\n 116.246677,\n 36.149436\n ],\n [\n 116.226066,\n 36.173748\n ],\n [\n 116.234911,\n 36.180935\n ],\n [\n 116.255047,\n 36.203703\n ],\n [\n 116.280159,\n 36.221945\n ],\n [\n 116.28624,\n 36.239174\n ],\n [\n 116.307166,\n 36.259464\n ],\n [\n 116.310799,\n 36.270515\n ],\n [\n 116.322644,\n 36.284669\n ],\n [\n 116.331251,\n 36.290677\n ],\n [\n 116.374526,\n 36.3039\n ],\n [\n 116.406745,\n 36.319015\n ],\n [\n 116.430593,\n 36.318007\n ],\n [\n 116.441411,\n 36.321755\n ],\n [\n 116.449071,\n 36.337149\n ],\n [\n 116.484607,\n 36.336948\n ],\n [\n 116.503717,\n 36.369982\n ],\n [\n 116.519984,\n 36.384158\n ],\n [\n 116.528592,\n 36.387259\n ],\n [\n 116.546202,\n 36.40892\n ],\n [\n 116.591213,\n 36.416286\n ],\n [\n 116.612377,\n 36.42333\n ],\n [\n 116.6198,\n 36.428522\n ],\n [\n 116.620905,\n 36.44144\n ],\n [\n 116.611429,\n 36.459104\n ],\n [\n 116.613009,\n 36.473425\n ],\n [\n 116.595636,\n 36.480383\n ],\n [\n 116.593267,\n 36.485973\n ],\n [\n 116.602032,\n 36.495223\n ],\n [\n 116.624301,\n 36.497233\n ],\n [\n 116.627223,\n 36.508853\n ],\n [\n 116.610087,\n 36.51609\n ],\n [\n 116.60835,\n 36.52011\n ],\n [\n 116.622801,\n 36.532651\n ],\n [\n 116.629592,\n 36.544587\n ],\n [\n 116.646728,\n 36.544105\n ],\n [\n 116.658968,\n 36.553026\n ],\n [\n 116.662916,\n 36.563111\n ],\n [\n 116.661258,\n 36.578376\n ],\n [\n 116.682421,\n 36.580586\n ],\n [\n 116.694345,\n 36.591149\n ],\n [\n 116.693319,\n 36.607895\n ],\n [\n 116.71314,\n 36.608858\n ],\n [\n 116.742042,\n 36.620381\n ],\n [\n 116.759494,\n 36.632746\n ],\n [\n 116.763126,\n 36.651971\n ],\n [\n 116.777262,\n 36.660718\n ],\n [\n 116.780736,\n 36.671552\n ],\n [\n 116.780657,\n 36.691048\n ],\n [\n 116.799689,\n 36.694417\n ],\n [\n 116.802768,\n 36.706729\n ],\n [\n 116.830881,\n 36.723851\n ],\n [\n 116.842489,\n 36.72786\n ],\n [\n 116.861757,\n 36.730345\n ],\n [\n 116.873997,\n 36.739846\n ],\n [\n 116.88679,\n 36.745538\n ],\n [\n 116.883868,\n 36.758243\n ],\n [\n 116.87076,\n 36.759164\n ],\n [\n 116.865548,\n 36.777877\n ],\n [\n 116.868233,\n 36.801872\n ],\n [\n 116.872813,\n 36.812004\n ],\n [\n 116.887975,\n 36.811404\n ],\n [\n 116.882447,\n 36.824058\n ],\n [\n 116.887106,\n 36.833427\n ],\n [\n 116.892476,\n 36.830023\n ],\n [\n 116.919404,\n 36.822776\n ],\n [\n 116.933223,\n 36.823697\n ],\n [\n 116.935908,\n 36.829743\n ],\n [\n 116.934724,\n 36.845116\n ],\n [\n 116.9442,\n 36.844916\n ],\n [\n 116.948069,\n 36.839231\n ],\n [\n 116.962836,\n 36.842674\n ],\n [\n 116.96181,\n 36.867529\n ],\n [\n 116.963152,\n 36.893896\n ],\n [\n 116.957466,\n 36.916495\n ],\n [\n 116.934408,\n 36.925973\n ],\n [\n 116.922563,\n 36.93453\n ],\n [\n 116.935434,\n 36.93457\n ],\n [\n 116.931881,\n 36.946204\n ],\n [\n 116.933381,\n 36.959595\n ],\n [\n 116.907717,\n 36.963272\n ],\n [\n 116.897767,\n 36.962712\n ],\n [\n 116.899188,\n 36.977499\n ],\n [\n 116.886158,\n 36.983573\n ],\n [\n 116.885764,\n 36.991444\n ],\n [\n 116.875024,\n 36.999274\n ],\n [\n 116.891607,\n 37.00271\n ],\n [\n 116.907796,\n 37.019046\n ],\n [\n 116.943173,\n 37.030907\n ],\n [\n 116.948701,\n 37.036537\n ],\n [\n 116.944279,\n 37.042327\n ],\n [\n 116.928643,\n 37.05103\n ],\n [\n 116.925247,\n 37.069831\n ],\n [\n 116.91972,\n 37.081364\n ],\n [\n 116.919009,\n 37.093056\n ],\n [\n 116.931486,\n 37.100477\n ],\n [\n 116.982578,\n 37.113601\n ],\n [\n 117.004531,\n 37.121219\n ],\n [\n 117.024273,\n 37.119664\n ],\n [\n 117.044884,\n 37.122615\n ],\n [\n 117.047411,\n 37.134739\n ],\n [\n 117.059809,\n 37.137251\n ],\n [\n 117.054676,\n 37.141717\n ],\n [\n 117.050648,\n 37.160894\n ],\n [\n 117.061783,\n 37.16496\n ],\n [\n 117.06352,\n 37.182656\n ],\n [\n 117.05744,\n 37.192141\n ],\n [\n 117.045358,\n 37.197161\n ],\n [\n 117.037382,\n 37.195169\n ],\n [\n 117.037777,\n 37.207361\n ],\n [\n 117.022299,\n 37.215089\n ],\n [\n 117.03596,\n 37.224091\n ],\n [\n 117.036592,\n 37.237393\n ],\n [\n 117.042673,\n 37.238867\n ],\n [\n 117.041251,\n 37.247667\n ],\n [\n 117.032328,\n 37.253241\n ],\n [\n 117.030275,\n 37.264229\n ],\n [\n 117.038961,\n 37.266538\n ],\n [\n 117.024273,\n 37.278918\n ],\n [\n 117.002241,\n 37.285962\n ],\n [\n 116.993397,\n 37.32201\n ],\n [\n 116.986684,\n 37.335335\n ],\n [\n 116.987158,\n 37.342692\n ],\n [\n 117.006663,\n 37.355138\n ],\n [\n 117.009664,\n 37.359671\n ],\n [\n 116.99924,\n 37.376964\n ],\n [\n 117.008164,\n 37.392464\n ],\n [\n 117.019693,\n 37.405419\n ],\n [\n 117.018193,\n 37.418967\n ],\n [\n 117.029406,\n 37.435174\n ],\n [\n 117.085631,\n 37.437517\n ],\n [\n 117.096845,\n 37.440099\n ],\n [\n 117.104978,\n 37.455309\n ],\n [\n 117.098819,\n 37.469721\n ],\n [\n 117.109795,\n 37.47901\n ],\n [\n 117.124878,\n 37.483853\n ],\n [\n 117.135618,\n 37.475239\n ],\n [\n 117.163809,\n 37.478971\n ],\n [\n 117.176049,\n 37.486116\n ],\n [\n 117.199345,\n 37.487148\n ],\n [\n 117.22114,\n 37.51318\n ],\n [\n 117.230063,\n 37.528891\n ],\n [\n 117.238197,\n 37.532897\n ],\n [\n 117.260861,\n 37.530081\n ],\n [\n 117.273417,\n 37.532619\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 370200,\n \"name\": \"青岛市\",\n \"center\": [\n 120.355173,\n 36.082982\n ],\n \"centroid\": [\n 120.150851,\n 36.451234\n ],\n \"childrenNum\": 10,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 370000\n },\n \"subFeatureIndex\": 1,\n \"acroutes\": [\n 100000,\n 370000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 120.850108,\n 36.612271\n ],\n [\n 120.86598,\n 36.605606\n ],\n [\n 120.884854,\n 36.60143\n ],\n [\n 120.891961,\n 36.58898\n ],\n [\n 120.893382,\n 36.57918\n ],\n [\n 120.91265,\n 36.568414\n ],\n [\n 120.923785,\n 36.572029\n ],\n [\n 120.936341,\n 36.56532\n ],\n [\n 120.962163,\n 36.562789\n ],\n [\n 120.969349,\n 36.559495\n ],\n [\n 120.983326,\n 36.545913\n ],\n [\n 120.983958,\n 36.540809\n ],\n [\n 120.962716,\n 36.519225\n ],\n [\n 120.954345,\n 36.507567\n ],\n [\n 120.95861,\n 36.498721\n ],\n [\n 120.954977,\n 36.489311\n ],\n [\n 120.967691,\n 36.47797\n ],\n [\n 120.963585,\n 36.464334\n ],\n [\n 120.952371,\n 36.459184\n ],\n [\n 120.947238,\n 36.449287\n ],\n [\n 120.938315,\n 36.44812\n ],\n [\n 120.934524,\n 36.454678\n ],\n [\n 120.920152,\n 36.455201\n ],\n [\n 120.907833,\n 36.445987\n ],\n [\n 120.917388,\n 36.435364\n ],\n [\n 120.91881,\n 36.425383\n ],\n [\n 120.925522,\n 36.419909\n ],\n [\n 120.935077,\n 36.421036\n ],\n [\n 120.927812,\n 36.410047\n ],\n [\n 120.918968,\n 36.419144\n ],\n [\n 120.903332,\n 36.406142\n ],\n [\n 120.891645,\n 36.389675\n ],\n [\n 120.895909,\n 36.376104\n ],\n [\n 120.872061,\n 36.367001\n ],\n [\n 120.87443,\n 36.373244\n ],\n [\n 120.854925,\n 36.381903\n ],\n [\n 120.851134,\n 36.406021\n ],\n [\n 120.859505,\n 36.412422\n ],\n [\n 120.858952,\n 36.424578\n ],\n [\n 120.838342,\n 36.436974\n ],\n [\n 120.842369,\n 36.441601\n ],\n [\n 120.843001,\n 36.457736\n ],\n [\n 120.83921,\n 36.464374\n ],\n [\n 120.828471,\n 36.466627\n ],\n [\n 120.759453,\n 36.462604\n ],\n [\n 120.756768,\n 36.458098\n ],\n [\n 120.761664,\n 36.443211\n ],\n [\n 120.760084,\n 36.434559\n ],\n [\n 120.751003,\n 36.431299\n ],\n [\n 120.736868,\n 36.432829\n ],\n [\n 120.726997,\n 36.422928\n ],\n [\n 120.72597,\n 36.413912\n ],\n [\n 120.71144,\n 36.408678\n ],\n [\n 120.694383,\n 36.390158\n ],\n [\n 120.700385,\n 36.37123\n ],\n [\n 120.709703,\n 36.368089\n ],\n [\n 120.716494,\n 36.360516\n ],\n [\n 120.72676,\n 36.359831\n ],\n [\n 120.729603,\n 36.349801\n ],\n [\n 120.739632,\n 36.3386\n ],\n [\n 120.744449,\n 36.328163\n ],\n [\n 120.73821,\n 36.32373\n ],\n [\n 120.707966,\n 36.328929\n ],\n [\n 120.692093,\n 36.325544\n ],\n [\n 120.663033,\n 36.33179\n ],\n [\n 120.656005,\n 36.322158\n ],\n [\n 120.66635,\n 36.309342\n ],\n [\n 120.665718,\n 36.29749\n ],\n [\n 120.656005,\n 36.28862\n ],\n [\n 120.65482,\n 36.27983\n ],\n [\n 120.659716,\n 36.27483\n ],\n [\n 120.677326,\n 36.281443\n ],\n [\n 120.686249,\n 36.279104\n ],\n [\n 120.685855,\n 36.260231\n ],\n [\n 120.689724,\n 36.251437\n ],\n [\n 120.681038,\n 36.238932\n ],\n [\n 120.689171,\n 36.230176\n ],\n [\n 120.696752,\n 36.204026\n ],\n [\n 120.693041,\n 36.190624\n ],\n [\n 120.697147,\n 36.168579\n ],\n [\n 120.707255,\n 36.165066\n ],\n [\n 120.707018,\n 36.159331\n ],\n [\n 120.698332,\n 36.158887\n ],\n [\n 120.704333,\n 36.152344\n ],\n [\n 120.705439,\n 36.139702\n ],\n [\n 120.716257,\n 36.142085\n ],\n [\n 120.719811,\n 36.13441\n ],\n [\n 120.71223,\n 36.126572\n ],\n [\n 120.695647,\n 36.123744\n ],\n [\n 120.672667,\n 36.129844\n ],\n [\n 120.650951,\n 36.117885\n ],\n [\n 120.632235,\n 36.113319\n ],\n [\n 120.621259,\n 36.119259\n ],\n [\n 120.612099,\n 36.117521\n ],\n [\n 120.607834,\n 36.107217\n ],\n [\n 120.599859,\n 36.101801\n ],\n [\n 120.579248,\n 36.103943\n ],\n [\n 120.580827,\n 36.111419\n ],\n [\n 120.573325,\n 36.114248\n ],\n [\n 120.567087,\n 36.105964\n ],\n [\n 120.547187,\n 36.10952\n ],\n [\n 120.552241,\n 36.097881\n ],\n [\n 120.547345,\n 36.092141\n ],\n [\n 120.526261,\n 36.093435\n ],\n [\n 120.497832,\n 36.08624\n ],\n [\n 120.479827,\n 36.091656\n ],\n [\n 120.467587,\n 36.087169\n ],\n [\n 120.449662,\n 36.07302\n ],\n [\n 120.441923,\n 36.063236\n ],\n [\n 120.437185,\n 36.0655\n ],\n [\n 120.42226,\n 36.054986\n ],\n [\n 120.415311,\n 36.057413\n ],\n [\n 120.404413,\n 36.051589\n ],\n [\n 120.38783,\n 36.051711\n ],\n [\n 120.389172,\n 36.059394\n ],\n [\n 120.37022,\n 36.053409\n ],\n [\n 120.371089,\n 36.044835\n ],\n [\n 120.365166,\n 36.041398\n ],\n [\n 120.35798,\n 36.04892\n ],\n [\n 120.345661,\n 36.043541\n ],\n [\n 120.337922,\n 36.044633\n ],\n [\n 120.342897,\n 36.05167\n ],\n [\n 120.337527,\n 36.054986\n ],\n [\n 120.324577,\n 36.051104\n ],\n [\n 120.324814,\n 36.059515\n ],\n [\n 120.315969,\n 36.059677\n ],\n [\n 120.307993,\n 36.050214\n ],\n [\n 120.296069,\n 36.052439\n ],\n [\n 120.297649,\n 36.045361\n ],\n [\n 120.286119,\n 36.047181\n ],\n [\n 120.290147,\n 36.060526\n ],\n [\n 120.30136,\n 36.071282\n ],\n [\n 120.311231,\n 36.087614\n ],\n [\n 120.312653,\n 36.100185\n ],\n [\n 120.317549,\n 36.108106\n ],\n [\n 120.326235,\n 36.111662\n ],\n [\n 120.333658,\n 36.134652\n ],\n [\n 120.347004,\n 36.155818\n ],\n [\n 120.356953,\n 36.166076\n ],\n [\n 120.358217,\n 36.174757\n ],\n [\n 120.369509,\n 36.177745\n ],\n [\n 120.35877,\n 36.200312\n ],\n [\n 120.336896,\n 36.213954\n ],\n [\n 120.319997,\n 36.232234\n ],\n [\n 120.297412,\n 36.225455\n ],\n [\n 120.293305,\n 36.219241\n ],\n [\n 120.29828,\n 36.203783\n ],\n [\n 120.313205,\n 36.196316\n ],\n [\n 120.310283,\n 36.185295\n ],\n [\n 120.291489,\n 36.185941\n ],\n [\n 120.28075,\n 36.17932\n ],\n [\n 120.276564,\n 36.185699\n ],\n [\n 120.262982,\n 36.182267\n ],\n [\n 120.260929,\n 36.198415\n ],\n [\n 120.244819,\n 36.199384\n ],\n [\n 120.235027,\n 36.189211\n ],\n [\n 120.224445,\n 36.19131\n ],\n [\n 120.217338,\n 36.211412\n ],\n [\n 120.20723,\n 36.211613\n ],\n [\n 120.181566,\n 36.203945\n ],\n [\n 120.164351,\n 36.188767\n ],\n [\n 120.140345,\n 36.173304\n ],\n [\n 120.142556,\n 36.143539\n ],\n [\n 120.128105,\n 36.129723\n ],\n [\n 120.1086,\n 36.12742\n ],\n [\n 120.116023,\n 36.114046\n ],\n [\n 120.116891,\n 36.102852\n ],\n [\n 120.152111,\n 36.095254\n ],\n [\n 120.161903,\n 36.082682\n ],\n [\n 120.173906,\n 36.077225\n ],\n [\n 120.181645,\n 36.066511\n ],\n [\n 120.19499,\n 36.064206\n ],\n [\n 120.231868,\n 36.063842\n ],\n [\n 120.241345,\n 36.060445\n ],\n [\n 120.24095,\n 36.047828\n ],\n [\n 120.230605,\n 36.044916\n ],\n [\n 120.23479,\n 36.030638\n ],\n [\n 120.223656,\n 36.022385\n ],\n [\n 120.223577,\n 36.016398\n ],\n [\n 120.19886,\n 35.99572\n ],\n [\n 120.213232,\n 35.998351\n ],\n [\n 120.244977,\n 36.020444\n ],\n [\n 120.25698,\n 36.024813\n ],\n [\n 120.265509,\n 36.014011\n ],\n [\n 120.256427,\n 36.005433\n ],\n [\n 120.248768,\n 35.992078\n ],\n [\n 120.247662,\n 35.982567\n ],\n [\n 120.254927,\n 35.980826\n ],\n [\n 120.265588,\n 36.001062\n ],\n [\n 120.271273,\n 35.99394\n ],\n [\n 120.278775,\n 35.996368\n ],\n [\n 120.27459,\n 36.004664\n ],\n [\n 120.289673,\n 36.017086\n ],\n [\n 120.309494,\n 36.014132\n ],\n [\n 120.316522,\n 36.002155\n ],\n [\n 120.305072,\n 35.97184\n ],\n [\n 120.284619,\n 35.965565\n ],\n [\n 120.261718,\n 35.965484\n ],\n [\n 120.251531,\n 35.95937\n ],\n [\n 120.246477,\n 35.947466\n ],\n [\n 120.233132,\n 35.941553\n ],\n [\n 120.222076,\n 35.924947\n ],\n [\n 120.209284,\n 35.917616\n ],\n [\n 120.204388,\n 35.910404\n ],\n [\n 120.202098,\n 35.89205\n ],\n [\n 120.185198,\n 35.88747\n ],\n [\n 120.169405,\n 35.888565\n ],\n [\n 120.172169,\n 35.904408\n ],\n [\n 120.184172,\n 35.915671\n ],\n [\n 120.194438,\n 35.93402\n ],\n [\n 120.210784,\n 35.938435\n ],\n [\n 120.207862,\n 35.947344\n ],\n [\n 120.179276,\n 35.936653\n ],\n [\n 120.167983,\n 35.918426\n ],\n [\n 120.15677,\n 35.909149\n ],\n [\n 120.147768,\n 35.907852\n ],\n [\n 120.141924,\n 35.919438\n ],\n [\n 120.142714,\n 35.909392\n ],\n [\n 120.135843,\n 35.905421\n ],\n [\n 120.12542,\n 35.906718\n ],\n [\n 120.123998,\n 35.895291\n ],\n [\n 120.118392,\n 35.888524\n ],\n [\n 120.102203,\n 35.881918\n ],\n [\n 120.084041,\n 35.880378\n ],\n [\n 120.07875,\n 35.885768\n ],\n [\n 120.062798,\n 35.87134\n ],\n [\n 120.036423,\n 35.824753\n ],\n [\n 120.033264,\n 35.806013\n ],\n [\n 120.041319,\n 35.799198\n ],\n [\n 120.049453,\n 35.782278\n ],\n [\n 120.043135,\n 35.776759\n ],\n [\n 120.03745,\n 35.763041\n ],\n [\n 120.037529,\n 35.753908\n ],\n [\n 120.031369,\n 35.752244\n ],\n [\n 120.020235,\n 35.722239\n ],\n [\n 120.011074,\n 35.713223\n ],\n [\n 120.001519,\n 35.720209\n ],\n [\n 119.981224,\n 35.715335\n ],\n [\n 119.986041,\n 35.729711\n ],\n [\n 119.978461,\n 35.739496\n ],\n [\n 119.967879,\n 35.74108\n ],\n [\n 119.969932,\n 35.749078\n ],\n [\n 119.959982,\n 35.759104\n ],\n [\n 119.937081,\n 35.763407\n ],\n [\n 119.924841,\n 35.758252\n ],\n [\n 119.920735,\n 35.737548\n ],\n [\n 119.930369,\n 35.728899\n ],\n [\n 119.949321,\n 35.729873\n ],\n [\n 119.953349,\n 35.72561\n ],\n [\n 119.952954,\n 35.713142\n ],\n [\n 119.94482,\n 35.705506\n ],\n [\n 119.923894,\n 35.696529\n ],\n [\n 119.910864,\n 35.674305\n ],\n [\n 119.912285,\n 35.660651\n ],\n [\n 119.927921,\n 35.65045\n ],\n [\n 119.925157,\n 35.63736\n ],\n [\n 119.902493,\n 35.63297\n ],\n [\n 119.894597,\n 35.628742\n ],\n [\n 119.877619,\n 35.610972\n ],\n [\n 119.868379,\n 35.608817\n ],\n [\n 119.851717,\n 35.622074\n ],\n [\n 119.844768,\n 35.623619\n ],\n [\n 119.831422,\n 35.618333\n ],\n [\n 119.829606,\n 35.643702\n ],\n [\n 119.824315,\n 35.646304\n ],\n [\n 119.818472,\n 35.63858\n ],\n [\n 119.800625,\n 35.626465\n ],\n [\n 119.802204,\n 35.620244\n ],\n [\n 119.792649,\n 35.615446\n ],\n [\n 119.802994,\n 35.609183\n ],\n [\n 119.800467,\n 35.59869\n ],\n [\n 119.792649,\n 35.59385\n ],\n [\n 119.800862,\n 35.581891\n ],\n [\n 119.786174,\n 35.576073\n ],\n [\n 119.780172,\n 35.58486\n ],\n [\n 119.76967,\n 35.577212\n ],\n [\n 119.762483,\n 35.578351\n ],\n [\n 119.752849,\n 35.588684\n ],\n [\n 119.751349,\n 35.617845\n ],\n [\n 119.729949,\n 35.618943\n ],\n [\n 119.717946,\n 35.615649\n ],\n [\n 119.682173,\n 35.590027\n ],\n [\n 119.662115,\n 35.589294\n ],\n [\n 119.651455,\n 35.588766\n ],\n [\n 119.634713,\n 35.598731\n ],\n [\n 119.614972,\n 35.606336\n ],\n [\n 119.609286,\n 35.59202\n ],\n [\n 119.600599,\n 35.590271\n ],\n [\n 119.592308,\n 35.600683\n ],\n [\n 119.57762,\n 35.586243\n ],\n [\n 119.556535,\n 35.592508\n ],\n [\n 119.538215,\n 35.589294\n ],\n [\n 119.536872,\n 35.606011\n ],\n [\n 119.518157,\n 35.615446\n ],\n [\n 119.517762,\n 35.625774\n ],\n [\n 119.524474,\n 35.632279\n ],\n [\n 119.528265,\n 35.674305\n ],\n [\n 119.519105,\n 35.68552\n ],\n [\n 119.51484,\n 35.697992\n ],\n [\n 119.518473,\n 35.700632\n ],\n [\n 119.521079,\n 35.716879\n ],\n [\n 119.517762,\n 35.723742\n ],\n [\n 119.525422,\n 35.730604\n ],\n [\n 119.527317,\n 35.723214\n ],\n [\n 119.545085,\n 35.726747\n ],\n [\n 119.560563,\n 35.721752\n ],\n [\n 119.566485,\n 35.714523\n ],\n [\n 119.576988,\n 35.71237\n ],\n [\n 119.588833,\n 35.715701\n ],\n [\n 119.601231,\n 35.709446\n ],\n [\n 119.614182,\n 35.716675\n ],\n [\n 119.624685,\n 35.712817\n ],\n [\n 119.627843,\n 35.722077\n ],\n [\n 119.605495,\n 35.747454\n ],\n [\n 119.591992,\n 35.753218\n ],\n [\n 119.596256,\n 35.773756\n ],\n [\n 119.611576,\n 35.776597\n ],\n [\n 119.617972,\n 35.789623\n ],\n [\n 119.60897,\n 35.799279\n ],\n [\n 119.612445,\n 35.812707\n ],\n [\n 119.622631,\n 35.816114\n ],\n [\n 119.629344,\n 35.833878\n ],\n [\n 119.649796,\n 35.845191\n ],\n [\n 119.664326,\n 35.841015\n ],\n [\n 119.676014,\n 35.842515\n ],\n [\n 119.68699,\n 35.861814\n ],\n [\n 119.704047,\n 35.863962\n ],\n [\n 119.71834,\n 35.853138\n ],\n [\n 119.725211,\n 35.856746\n ],\n [\n 119.72221,\n 35.865138\n ],\n [\n 119.736898,\n 35.86303\n ],\n [\n 119.738003,\n 35.873123\n ],\n [\n 119.727738,\n 35.902544\n ],\n [\n 119.721262,\n 35.906718\n ],\n [\n 119.716208,\n 35.927337\n ],\n [\n 119.701362,\n 35.923732\n ],\n [\n 119.701757,\n 35.944469\n ],\n [\n 119.690149,\n 35.963702\n ],\n [\n 119.684858,\n 35.982648\n ],\n [\n 119.689122,\n 36.000212\n ],\n [\n 119.681068,\n 36.012068\n ],\n [\n 119.706495,\n 36.028292\n ],\n [\n 119.717314,\n 36.044229\n ],\n [\n 119.704126,\n 36.055269\n ],\n [\n 119.695677,\n 36.053045\n ],\n [\n 119.675698,\n 36.064085\n ],\n [\n 119.666695,\n 36.062993\n ],\n [\n 119.633608,\n 36.067683\n ],\n [\n 119.632187,\n 36.091535\n ],\n [\n 119.657061,\n 36.100872\n ],\n [\n 119.657614,\n 36.108631\n ],\n [\n 119.643716,\n 36.127178\n ],\n [\n 119.651218,\n 36.130531\n ],\n [\n 119.649954,\n 36.137157\n ],\n [\n 119.660852,\n 36.154122\n ],\n [\n 119.671039,\n 36.177866\n ],\n [\n 119.681305,\n 36.18045\n ],\n [\n 119.691728,\n 36.176292\n ],\n [\n 119.723473,\n 36.175565\n ],\n [\n 119.732792,\n 36.172536\n ],\n [\n 119.733818,\n 36.163572\n ],\n [\n 119.748111,\n 36.158645\n ],\n [\n 119.772354,\n 36.167691\n ],\n [\n 119.782778,\n 36.165308\n ],\n [\n 119.792333,\n 36.171648\n ],\n [\n 119.813023,\n 36.167691\n ],\n [\n 119.81326,\n 36.175242\n ],\n [\n 119.821315,\n 36.171285\n ],\n [\n 119.82242,\n 36.177987\n ],\n [\n 119.831738,\n 36.180612\n ],\n [\n 119.823131,\n 36.19894\n ],\n [\n 119.828816,\n 36.210685\n ],\n [\n 119.819498,\n 36.211856\n ],\n [\n 119.808048,\n 36.232839\n ],\n [\n 119.82092,\n 36.244499\n ],\n [\n 119.820446,\n 36.257367\n ],\n [\n 119.82929,\n 36.258859\n ],\n [\n 119.83387,\n 36.278822\n ],\n [\n 119.848795,\n 36.292692\n ],\n [\n 119.854402,\n 36.302328\n ],\n [\n 119.862773,\n 36.302368\n ],\n [\n 119.865379,\n 36.308898\n ],\n [\n 119.891991,\n 36.318773\n ],\n [\n 119.896966,\n 36.334047\n ],\n [\n 119.895939,\n 36.34827\n ],\n [\n 119.904784,\n 36.369942\n ],\n [\n 119.90431,\n 36.38154\n ],\n [\n 119.909837,\n 36.384359\n ],\n [\n 119.93029,\n 36.385165\n ],\n [\n 119.936371,\n 36.380655\n ],\n [\n 119.945452,\n 36.384682\n ],\n [\n 119.941425,\n 36.39503\n ],\n [\n 119.926421,\n 36.403324\n ],\n [\n 119.925236,\n 36.419346\n ],\n [\n 119.933923,\n 36.42007\n ],\n [\n 119.935976,\n 36.427436\n ],\n [\n 119.949795,\n 36.446511\n ],\n [\n 119.953981,\n 36.444217\n ],\n [\n 119.968432,\n 36.450051\n ],\n [\n 119.994175,\n 36.450333\n ],\n [\n 119.996623,\n 36.446309\n ],\n [\n 120.011864,\n 36.454236\n ],\n [\n 120.012812,\n 36.467833\n ],\n [\n 120.006889,\n 36.468799\n ],\n [\n 120.004125,\n 36.477447\n ],\n [\n 120.010758,\n 36.484445\n ],\n [\n 120.004204,\n 36.489512\n ],\n [\n 120.010364,\n 36.509255\n ],\n [\n 119.997571,\n 36.504431\n ],\n [\n 119.974749,\n 36.515688\n ],\n [\n 119.971985,\n 36.522441\n ],\n [\n 119.951375,\n 36.519788\n ],\n [\n 119.936292,\n 36.511507\n ],\n [\n 119.936687,\n 36.496389\n ],\n [\n 119.923025,\n 36.495464\n ],\n [\n 119.920261,\n 36.522079\n ],\n [\n 119.917576,\n 36.525858\n ],\n [\n 119.826763,\n 36.54101\n ],\n [\n 119.798019,\n 36.551619\n ],\n [\n 119.784516,\n 36.554673\n ],\n [\n 119.755929,\n 36.565521\n ],\n [\n 119.74748,\n 36.571788\n ],\n [\n 119.72758,\n 36.562749\n ],\n [\n 119.730107,\n 36.581027\n ],\n [\n 119.701125,\n 36.602634\n ],\n [\n 119.681857,\n 36.606891\n ],\n [\n 119.670328,\n 36.616246\n ],\n [\n 119.651297,\n 36.623633\n ],\n [\n 119.625079,\n 36.638807\n ],\n [\n 119.617025,\n 36.652532\n ],\n [\n 119.61355,\n 36.66453\n ],\n [\n 119.607154,\n 36.667379\n ],\n [\n 119.596651,\n 36.689884\n ],\n [\n 119.587412,\n 36.696101\n ],\n [\n 119.579831,\n 36.711581\n ],\n [\n 119.567433,\n 36.713065\n ],\n [\n 119.561036,\n 36.720884\n ],\n [\n 119.547059,\n 36.725454\n ],\n [\n 119.534977,\n 36.743333\n ],\n [\n 119.530555,\n 36.765256\n ],\n [\n 119.532766,\n 36.78008\n ],\n [\n 119.539162,\n 36.787732\n ],\n [\n 119.539162,\n 36.799949\n ],\n [\n 119.550613,\n 36.80868\n ],\n [\n 119.563721,\n 36.802753\n ],\n [\n 119.56767,\n 36.805717\n ],\n [\n 119.597757,\n 36.857244\n ],\n [\n 119.599652,\n 36.878253\n ],\n [\n 119.599968,\n 36.920614\n ],\n [\n 119.5837,\n 36.950441\n ],\n [\n 119.598072,\n 36.989406\n ],\n [\n 119.604548,\n 36.996038\n ],\n [\n 119.60976,\n 37.013894\n ],\n [\n 119.619078,\n 37.017848\n ],\n [\n 119.61971,\n 37.012895\n ],\n [\n 119.629344,\n 37.01621\n ],\n [\n 119.66251,\n 37.008262\n ],\n [\n 119.681699,\n 36.998475\n ],\n [\n 119.716998,\n 37.007144\n ],\n [\n 119.722289,\n 36.993401\n ],\n [\n 119.731133,\n 36.988487\n ],\n [\n 119.743057,\n 36.992483\n ],\n [\n 119.750559,\n 36.990844\n ],\n [\n 119.769906,\n 36.996597\n ],\n [\n 119.771881,\n 37.006984\n ],\n [\n 119.804968,\n 37.013814\n ],\n [\n 119.820209,\n 36.999594\n ],\n [\n 119.829606,\n 37.002031\n ],\n [\n 119.85148,\n 37.002031\n ],\n [\n 119.900045,\n 36.997556\n ],\n [\n 119.902257,\n 36.9948\n ],\n [\n 119.923341,\n 36.993961\n ],\n [\n 119.939608,\n 37.004108\n ],\n [\n 119.949716,\n 37.006185\n ],\n [\n 119.961561,\n 37.013654\n ],\n [\n 119.975618,\n 37.011098\n ],\n [\n 119.980198,\n 37.018088\n ],\n [\n 119.993543,\n 37.012176\n ],\n [\n 120.002309,\n 37.013494\n ],\n [\n 120.024104,\n 36.999913\n ],\n [\n 120.035238,\n 36.998395\n ],\n [\n 120.049374,\n 37.020045\n ],\n [\n 120.09249,\n 37.017928\n ],\n [\n 120.101571,\n 37.014293\n ],\n [\n 120.123051,\n 37.01645\n ],\n [\n 120.138134,\n 37.022201\n ],\n [\n 120.142319,\n 37.015292\n ],\n [\n 120.159929,\n 37.013375\n ],\n [\n 120.167273,\n 37.017968\n ],\n [\n 120.166404,\n 37.025795\n ],\n [\n 120.173037,\n 37.034421\n ],\n [\n 120.180697,\n 37.032544\n ],\n [\n 120.189621,\n 37.038094\n ],\n [\n 120.193411,\n 37.034261\n ],\n [\n 120.205335,\n 37.038374\n ],\n [\n 120.21647,\n 37.056699\n ],\n [\n 120.214101,\n 37.07019\n ],\n [\n 120.220497,\n 37.08711\n ],\n [\n 120.229894,\n 37.089544\n ],\n [\n 120.231237,\n 37.106301\n ],\n [\n 120.236606,\n 37.125965\n ],\n [\n 120.245688,\n 37.118906\n ],\n [\n 120.264087,\n 37.114718\n ],\n [\n 120.280828,\n 37.13111\n ],\n [\n 120.303413,\n 37.130153\n ],\n [\n 120.300176,\n 37.119584\n ],\n [\n 120.315337,\n 37.113043\n ],\n [\n 120.320628,\n 37.10654\n ],\n [\n 120.331684,\n 37.111966\n ],\n [\n 120.336896,\n 37.104267\n ],\n [\n 120.336343,\n 37.092058\n ],\n [\n 120.34574,\n 37.087789\n ],\n [\n 120.348583,\n 37.077094\n ],\n [\n 120.357822,\n 37.084357\n ],\n [\n 120.362244,\n 37.100477\n ],\n [\n 120.369667,\n 37.104626\n ],\n [\n 120.388225,\n 37.104227\n ],\n [\n 120.398096,\n 37.096447\n ],\n [\n 120.408914,\n 37.09517\n ],\n [\n 120.412942,\n 37.103149\n ],\n [\n 120.407098,\n 37.112803\n ],\n [\n 120.415153,\n 37.110569\n ],\n [\n 120.439475,\n 37.116912\n ],\n [\n 120.440265,\n 37.122655\n ],\n [\n 120.462928,\n 37.115157\n ],\n [\n 120.478643,\n 37.124211\n ],\n [\n 120.493015,\n 37.126723\n ],\n [\n 120.493805,\n 37.1345\n ],\n [\n 120.505729,\n 37.143551\n ],\n [\n 120.506834,\n 37.148854\n ],\n [\n 120.517258,\n 37.148974\n ],\n [\n 120.527129,\n 37.143352\n ],\n [\n 120.527998,\n 37.136733\n ],\n [\n 120.542528,\n 37.128677\n ],\n [\n 120.547661,\n 37.113003\n ],\n [\n 120.536368,\n 37.081963\n ],\n [\n 120.539843,\n 37.060371\n ],\n [\n 120.533289,\n 37.053944\n ],\n [\n 120.541738,\n 37.044163\n ],\n [\n 120.549793,\n 37.041288\n ],\n [\n 120.558953,\n 37.047437\n ],\n [\n 120.570877,\n 37.046399\n ],\n [\n 120.58446,\n 37.058136\n ],\n [\n 120.586513,\n 37.048515\n ],\n [\n 120.606176,\n 37.047157\n ],\n [\n 120.613915,\n 37.023839\n ],\n [\n 120.601754,\n 37.012696\n ],\n [\n 120.606413,\n 37.001192\n ],\n [\n 120.593857,\n 36.991244\n ],\n [\n 120.582328,\n 37.001791\n ],\n [\n 120.575931,\n 36.999074\n ],\n [\n 120.574036,\n 36.987568\n ],\n [\n 120.568508,\n 36.983293\n ],\n [\n 120.566534,\n 36.96559\n ],\n [\n 120.560296,\n 36.960674\n ],\n [\n 120.563218,\n 36.95172\n ],\n [\n 120.571114,\n 36.948682\n ],\n [\n 120.574984,\n 36.927053\n ],\n [\n 120.592909,\n 36.912216\n ],\n [\n 120.617389,\n 36.911136\n ],\n [\n 120.622838,\n 36.907377\n ],\n [\n 120.622838,\n 36.890856\n ],\n [\n 120.592909,\n 36.882134\n ],\n [\n 120.576642,\n 36.879894\n ],\n [\n 120.57988,\n 36.858885\n ],\n [\n 120.588408,\n 36.859045\n ],\n [\n 120.595989,\n 36.852681\n ],\n [\n 120.58754,\n 36.843635\n ],\n [\n 120.589751,\n 36.838791\n ],\n [\n 120.609809,\n 36.832906\n ],\n [\n 120.612336,\n 36.829223\n ],\n [\n 120.601517,\n 36.804996\n ],\n [\n 120.590382,\n 36.801552\n ],\n [\n 120.563454,\n 36.802953\n ],\n [\n 120.56377,\n 36.795343\n ],\n [\n 120.5554,\n 36.778718\n ],\n [\n 120.540791,\n 36.7679\n ],\n [\n 120.544502,\n 36.76213\n ],\n [\n 120.546397,\n 36.744616\n ],\n [\n 120.560375,\n 36.742492\n ],\n [\n 120.562586,\n 36.736479\n ],\n [\n 120.584065,\n 36.735236\n ],\n [\n 120.58525,\n 36.728501\n ],\n [\n 120.596542,\n 36.708052\n ],\n [\n 120.586118,\n 36.698829\n ],\n [\n 120.589751,\n 36.694497\n ],\n [\n 120.616521,\n 36.689764\n ],\n [\n 120.619206,\n 36.681541\n ],\n [\n 120.631446,\n 36.673357\n ],\n [\n 120.625128,\n 36.671231\n ],\n [\n 120.627339,\n 36.659836\n ],\n [\n 120.642027,\n 36.666095\n ],\n [\n 120.652135,\n 36.663327\n ],\n [\n 120.648977,\n 36.655863\n ],\n [\n 120.660585,\n 36.647998\n ],\n [\n 120.657426,\n 36.626644\n ],\n [\n 120.644712,\n 36.626524\n ],\n [\n 120.643449,\n 36.613436\n ],\n [\n 120.635947,\n 36.597775\n ],\n [\n 120.637763,\n 36.574199\n ],\n [\n 120.664059,\n 36.583478\n ],\n [\n 120.665402,\n 36.587454\n ],\n [\n 120.679695,\n 36.589181\n ],\n [\n 120.702991,\n 36.598338\n ],\n [\n 120.699121,\n 36.60665\n ],\n [\n 120.70836,\n 36.612914\n ],\n [\n 120.708281,\n 36.621385\n ],\n [\n 120.725733,\n 36.624436\n ],\n [\n 120.751556,\n 36.615042\n ],\n [\n 120.757557,\n 36.606088\n ],\n [\n 120.765533,\n 36.607011\n ],\n [\n 120.777062,\n 36.600546\n ],\n [\n 120.779747,\n 36.591551\n ],\n [\n 120.786223,\n 36.589663\n ],\n [\n 120.850108,\n 36.612271\n ]\n ]\n ],\n [\n [\n [\n 120.584381,\n 36.096183\n ],\n [\n 120.587461,\n 36.099457\n ],\n [\n 120.595042,\n 36.090282\n ],\n [\n 120.579485,\n 36.091535\n ],\n [\n 120.584381,\n 36.096183\n ]\n ]\n ],\n [\n [\n [\n 120.990039,\n 36.413348\n ],\n [\n 120.981431,\n 36.417494\n ],\n [\n 120.963663,\n 36.41363\n ],\n [\n 120.950318,\n 36.414757\n ],\n [\n 120.948502,\n 36.421117\n ],\n [\n 120.9639,\n 36.424618\n ],\n [\n 120.969823,\n 36.431581\n ],\n [\n 120.978115,\n 36.428643\n ],\n [\n 120.990039,\n 36.413348\n ]\n ]\n ],\n [\n [\n [\n 121.004253,\n 36.488306\n ],\n [\n 120.988538,\n 36.485249\n ],\n [\n 120.989881,\n 36.492367\n ],\n [\n 121.004253,\n 36.488306\n ]\n ]\n ],\n [\n [\n [\n 120.877352,\n 35.89359\n ],\n [\n 120.888802,\n 35.897277\n ],\n [\n 120.875377,\n 35.888443\n ],\n [\n 120.877352,\n 35.89359\n ]\n ]\n ],\n [\n [\n [\n 119.73524,\n 35.595762\n ],\n [\n 119.738872,\n 35.599666\n ],\n [\n 119.743689,\n 35.591328\n ],\n [\n 119.741873,\n 35.583884\n ],\n [\n 119.73524,\n 35.595762\n ]\n ]\n ],\n [\n [\n [\n 120.158823,\n 35.76499\n ],\n [\n 120.17209,\n 35.785727\n ],\n [\n 120.180539,\n 35.788649\n ],\n [\n 120.184725,\n 35.766978\n ],\n [\n 120.192858,\n 35.757156\n ],\n [\n 120.187962,\n 35.748712\n ],\n [\n 120.173037,\n 35.741405\n ],\n [\n 120.158665,\n 35.744896\n ],\n [\n 120.155428,\n 35.751838\n ],\n [\n 120.158823,\n 35.76499\n ]\n ]\n ],\n [\n [\n [\n 120.775088,\n 36.237963\n ],\n [\n 120.777457,\n 36.222308\n ],\n [\n 120.76806,\n 36.230701\n ],\n [\n 120.775088,\n 36.237963\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 370300,\n \"name\": \"淄博市\",\n \"center\": [\n 118.047648,\n 36.814939\n ],\n \"centroid\": [\n 118.058672,\n 36.610968\n ],\n \"childrenNum\": 8,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 370000\n },\n \"subFeatureIndex\": 2,\n \"acroutes\": [\n 100000,\n 370000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 117.718006,\n 36.697826\n ],\n [\n 117.725666,\n 36.695219\n ],\n [\n 117.754173,\n 36.696944\n ],\n [\n 117.777942,\n 36.695219\n ],\n [\n 117.78197,\n 36.70304\n ],\n [\n 117.793025,\n 36.707451\n ],\n [\n 117.795157,\n 36.719761\n ],\n [\n 117.810161,\n 36.734394\n ],\n [\n 117.820743,\n 36.756359\n ],\n [\n 117.826429,\n 36.763011\n ],\n [\n 117.834404,\n 36.751871\n ],\n [\n 117.832983,\n 36.744816\n ],\n [\n 117.852488,\n 36.750708\n ],\n [\n 117.850672,\n 36.764735\n ],\n [\n 117.840327,\n 36.777516\n ],\n [\n 117.825639,\n 36.775834\n ],\n [\n 117.824297,\n 36.787933\n ],\n [\n 117.815531,\n 36.788573\n ],\n [\n 117.814662,\n 36.797306\n ],\n [\n 117.820901,\n 36.801511\n ],\n [\n 117.822085,\n 36.825139\n ],\n [\n 117.831877,\n 36.836629\n ],\n [\n 117.828008,\n 36.855883\n ],\n [\n 117.832825,\n 36.859966\n ],\n [\n 117.856594,\n 36.859926\n ],\n [\n 117.865597,\n 36.866529\n ],\n [\n 117.875152,\n 36.861246\n ],\n [\n 117.891103,\n 36.864408\n ],\n [\n 117.891814,\n 36.871811\n ],\n [\n 117.917005,\n 36.86973\n ],\n [\n 117.9189,\n 36.880094\n ],\n [\n 117.929719,\n 36.890216\n ],\n [\n 117.940616,\n 36.891616\n ],\n [\n 117.9403,\n 36.901177\n ],\n [\n 117.950645,\n 36.902137\n ],\n [\n 117.960674,\n 36.910376\n ],\n [\n 117.96178,\n 36.922494\n ],\n [\n 117.949145,\n 36.918375\n ],\n [\n 117.94338,\n 36.930012\n ],\n [\n 117.935404,\n 36.915736\n ],\n [\n 117.936115,\n 36.93489\n ],\n [\n 117.931772,\n 36.941886\n ],\n [\n 117.913372,\n 36.953679\n ],\n [\n 117.910292,\n 36.962592\n ],\n [\n 117.911951,\n 36.975141\n ],\n [\n 117.906581,\n 36.981695\n ],\n [\n 117.870493,\n 36.985451\n ],\n [\n 117.866623,\n 36.993282\n ],\n [\n 117.866386,\n 37.007024\n ],\n [\n 117.870493,\n 37.013375\n ],\n [\n 117.865992,\n 37.023719\n ],\n [\n 117.841827,\n 37.026354\n ],\n [\n 117.840327,\n 37.035539\n ],\n [\n 117.847355,\n 37.065959\n ],\n [\n 117.800369,\n 37.070789\n ],\n [\n 117.771783,\n 37.069032\n ],\n [\n 117.761991,\n 37.065839\n ],\n [\n 117.739801,\n 37.064921\n ],\n [\n 117.726692,\n 37.068753\n ],\n [\n 117.703002,\n 37.068673\n ],\n [\n 117.673942,\n 37.073143\n ],\n [\n 117.644645,\n 37.083878\n ],\n [\n 117.619375,\n 37.090103\n ],\n [\n 117.608477,\n 37.090622\n ],\n [\n 117.590946,\n 37.084996\n ],\n [\n 117.575074,\n 37.089185\n ],\n [\n 117.567888,\n 37.11029\n ],\n [\n 117.576969,\n 37.114758\n ],\n [\n 117.574442,\n 37.12106\n ],\n [\n 117.557464,\n 37.124211\n ],\n [\n 117.551305,\n 37.146781\n ],\n [\n 117.574284,\n 37.151366\n ],\n [\n 117.586366,\n 37.160216\n ],\n [\n 117.592052,\n 37.169624\n ],\n [\n 117.598212,\n 37.203058\n ],\n [\n 117.615348,\n 37.212699\n ],\n [\n 117.627193,\n 37.228074\n ],\n [\n 117.63043,\n 37.247269\n ],\n [\n 117.644329,\n 37.265862\n ],\n [\n 117.659491,\n 37.274101\n ],\n [\n 117.675995,\n 37.270121\n ],\n [\n 117.693447,\n 37.257661\n ],\n [\n 117.729851,\n 37.249101\n ],\n [\n 117.760333,\n 37.244959\n ],\n [\n 117.773678,\n 37.244959\n ],\n [\n 117.782128,\n 37.248702\n ],\n [\n 117.818848,\n 37.276012\n ],\n [\n 117.83859,\n 37.282659\n ],\n [\n 117.850909,\n 37.28246\n ],\n [\n 117.8776,\n 37.273027\n ],\n [\n 117.888497,\n 37.262319\n ],\n [\n 117.909266,\n 37.265065\n ],\n [\n 117.941327,\n 37.280549\n ],\n [\n 117.948829,\n 37.26829\n ],\n [\n 117.947013,\n 37.262159\n ],\n [\n 117.963833,\n 37.271753\n ],\n [\n 117.990603,\n 37.262358\n ],\n [\n 117.990761,\n 37.248981\n ],\n [\n 117.996446,\n 37.246273\n ],\n [\n 117.981048,\n 37.238429\n ],\n [\n 117.973862,\n 37.216483\n ],\n [\n 117.98089,\n 37.218674\n ],\n [\n 117.984364,\n 37.210349\n ],\n [\n 117.994393,\n 37.212699\n ],\n [\n 118.010898,\n 37.20756\n ],\n [\n 118.019584,\n 37.210309\n ],\n [\n 118.022348,\n 37.2221\n ],\n [\n 118.036799,\n 37.220905\n ],\n [\n 118.046275,\n 37.216324\n ],\n [\n 118.048012,\n 37.205568\n ],\n [\n 118.064122,\n 37.21007\n ],\n [\n 118.074072,\n 37.204094\n ],\n [\n 118.077941,\n 37.188953\n ],\n [\n 118.082995,\n 37.185605\n ],\n [\n 118.071545,\n 37.177675\n ],\n [\n 118.074467,\n 37.170341\n ],\n [\n 118.062385,\n 37.162528\n ],\n [\n 118.059858,\n 37.151087\n ],\n [\n 118.065069,\n 37.139564\n ],\n [\n 118.079679,\n 37.120781\n ],\n [\n 118.068623,\n 37.115875\n ],\n [\n 118.057252,\n 37.106141\n ],\n [\n 118.045485,\n 37.105982\n ],\n [\n 118.045959,\n 37.098202\n ],\n [\n 118.056857,\n 37.093654\n ],\n [\n 118.063016,\n 37.082841\n ],\n [\n 118.086075,\n 37.091899\n ],\n [\n 118.111187,\n 37.094652\n ],\n [\n 118.115925,\n 37.100636\n ],\n [\n 118.130455,\n 37.091101\n ],\n [\n 118.136062,\n 37.077773\n ],\n [\n 118.13622,\n 37.06536\n ],\n [\n 118.156909,\n 37.065281\n ],\n [\n 118.15762,\n 37.057776\n ],\n [\n 118.150829,\n 37.054743\n ],\n [\n 118.15146,\n 37.047038\n ],\n [\n 118.139615,\n 37.044363\n ],\n [\n 118.139299,\n 37.033103\n ],\n [\n 118.134008,\n 37.025955\n ],\n [\n 118.139299,\n 37.014693\n ],\n [\n 118.138983,\n 37.005985\n ],\n [\n 118.153198,\n 37.000512\n ],\n [\n 118.15146,\n 36.988527\n ],\n [\n 118.161331,\n 36.988567\n ],\n [\n 118.160936,\n 36.981934\n ],\n [\n 118.192918,\n 36.977739\n ],\n [\n 118.195209,\n 36.967348\n ],\n [\n 118.209739,\n 36.963152\n ],\n [\n 118.222531,\n 36.967109\n ],\n [\n 118.231376,\n 36.974822\n ],\n [\n 118.235087,\n 36.98557\n ],\n [\n 118.247327,\n 36.98613\n ],\n [\n 118.250802,\n 37.002949\n ],\n [\n 118.262568,\n 37.00271\n ],\n [\n 118.271412,\n 37.006744\n ],\n [\n 118.288785,\n 36.999993\n ],\n [\n 118.291628,\n 36.995878\n ],\n [\n 118.294629,\n 36.969666\n ],\n [\n 118.312476,\n 36.970905\n ],\n [\n 118.322347,\n 36.974502\n ],\n [\n 118.324637,\n 36.964751\n ],\n [\n 118.3443,\n 36.960714\n ],\n [\n 118.352276,\n 36.974582\n ],\n [\n 118.384652,\n 36.974382\n ],\n [\n 118.387574,\n 36.971305\n ],\n [\n 118.386548,\n 36.950481\n ],\n [\n 118.401788,\n 36.949802\n ],\n [\n 118.40321,\n 36.943125\n ],\n [\n 118.439061,\n 36.942206\n ],\n [\n 118.467411,\n 36.945484\n ],\n [\n 118.494339,\n 36.941846\n ],\n [\n 118.492365,\n 36.931611\n ],\n [\n 118.496708,\n 36.924733\n ],\n [\n 118.48968,\n 36.914096\n ],\n [\n 118.481862,\n 36.914136\n ],\n [\n 118.474913,\n 36.905297\n ],\n [\n 118.483046,\n 36.900777\n ],\n [\n 118.482809,\n 36.879214\n ],\n [\n 118.476966,\n 36.876893\n ],\n [\n 118.465042,\n 36.861366\n ],\n [\n 118.479967,\n 36.860166\n ],\n [\n 118.480993,\n 36.852641\n ],\n [\n 118.460462,\n 36.846597\n ],\n [\n 118.461488,\n 36.854322\n ],\n [\n 118.453828,\n 36.857564\n ],\n [\n 118.450038,\n 36.83747\n ],\n [\n 118.435508,\n 36.838391\n ],\n [\n 118.44072,\n 36.828142\n ],\n [\n 118.438666,\n 36.809682\n ],\n [\n 118.424531,\n 36.802673\n ],\n [\n 118.419872,\n 36.796304\n ],\n [\n 118.388522,\n 36.791217\n ],\n [\n 118.350222,\n 36.768301\n ],\n [\n 118.321636,\n 36.770905\n ],\n [\n 118.318161,\n 36.77972\n ],\n [\n 118.307501,\n 36.776234\n ],\n [\n 118.297788,\n 36.777677\n ],\n [\n 118.298183,\n 36.753914\n ],\n [\n 118.279546,\n 36.753033\n ],\n [\n 118.27157,\n 36.744015\n ],\n [\n 118.276151,\n 36.731749\n ],\n [\n 118.284363,\n 36.72337\n ],\n [\n 118.277019,\n 36.719801\n ],\n [\n 118.264147,\n 36.72373\n ],\n [\n 118.254276,\n 36.731789\n ],\n [\n 118.234219,\n 36.726457\n ],\n [\n 118.227743,\n 36.717957\n ],\n [\n 118.237614,\n 36.712704\n ],\n [\n 118.227585,\n 36.697625\n ],\n [\n 118.238246,\n 36.697305\n ],\n [\n 118.245037,\n 36.690647\n ],\n [\n 118.228059,\n 36.694016\n ],\n [\n 118.21653,\n 36.6811\n ],\n [\n 118.215819,\n 36.668262\n ],\n [\n 118.226796,\n 36.668382\n ],\n [\n 118.230191,\n 36.660357\n ],\n [\n 118.221189,\n 36.664169\n ],\n [\n 118.215898,\n 36.648921\n ],\n [\n 118.199631,\n 36.639047\n ],\n [\n 118.20658,\n 36.637482\n ],\n [\n 118.214793,\n 36.621144\n ],\n [\n 118.200657,\n 36.612071\n ],\n [\n 118.189523,\n 36.599141\n ],\n [\n 118.180363,\n 36.593599\n ],\n [\n 118.176967,\n 36.582996\n ],\n [\n 118.180678,\n 36.577412\n ],\n [\n 118.180915,\n 36.5607\n ],\n [\n 118.183916,\n 36.561142\n ],\n [\n 118.191892,\n 36.546074\n ],\n [\n 118.214556,\n 36.539322\n ],\n [\n 118.221663,\n 36.531887\n ],\n [\n 118.210844,\n 36.526099\n ],\n [\n 118.213766,\n 36.513075\n ],\n [\n 118.210528,\n 36.503466\n ],\n [\n 118.218346,\n 36.497354\n ],\n [\n 118.212818,\n 36.490075\n ],\n [\n 118.216135,\n 36.478573\n ],\n [\n 118.229638,\n 36.467793\n ],\n [\n 118.233508,\n 36.456609\n ],\n [\n 118.22719,\n 36.451379\n ],\n [\n 118.232797,\n 36.432869\n ],\n [\n 118.228533,\n 36.430736\n ],\n [\n 118.224427,\n 36.414234\n ],\n [\n 118.227427,\n 36.408034\n ],\n [\n 118.250407,\n 36.411214\n ],\n [\n 118.251592,\n 36.401995\n ],\n [\n 118.235403,\n 36.389634\n ],\n [\n 118.239825,\n 36.376748\n ],\n [\n 118.256093,\n 36.363175\n ],\n [\n 118.262726,\n 36.352218\n ],\n [\n 118.261857,\n 36.345852\n ],\n [\n 118.269912,\n 36.339849\n ],\n [\n 118.300157,\n 36.338116\n ],\n [\n 118.291075,\n 36.326189\n ],\n [\n 118.304105,\n 36.321393\n ],\n [\n 118.30908,\n 36.307125\n ],\n [\n 118.315477,\n 36.304464\n ],\n [\n 118.310107,\n 36.295716\n ],\n [\n 118.317609,\n 36.288903\n ],\n [\n 118.31366,\n 36.277371\n ],\n [\n 118.315003,\n 36.266361\n ],\n [\n 118.306948,\n 36.252123\n ],\n [\n 118.31524,\n 36.24938\n ],\n [\n 118.350775,\n 36.263538\n ],\n [\n 118.368385,\n 36.248412\n ],\n [\n 118.379756,\n 36.245265\n ],\n [\n 118.386548,\n 36.239053\n ],\n [\n 118.382046,\n 36.207335\n ],\n [\n 118.374387,\n 36.203097\n ],\n [\n 118.387653,\n 36.174555\n ],\n [\n 118.402262,\n 36.162926\n ],\n [\n 118.405263,\n 36.141641\n ],\n [\n 118.402183,\n 36.131622\n ],\n [\n 118.412844,\n 36.127218\n ],\n [\n 118.428953,\n 36.132672\n ],\n [\n 118.440956,\n 36.132511\n ],\n [\n 118.447116,\n 36.140913\n ],\n [\n 118.457303,\n 36.13247\n ],\n [\n 118.462594,\n 36.14059\n ],\n [\n 118.487863,\n 36.131784\n ],\n [\n 118.492601,\n 36.127057\n ],\n [\n 118.479493,\n 36.118814\n ],\n [\n 118.484468,\n 36.104064\n ],\n [\n 118.478545,\n 36.098245\n ],\n [\n 118.482099,\n 36.092546\n ],\n [\n 118.48044,\n 36.074071\n ],\n [\n 118.496866,\n 36.067683\n ],\n [\n 118.507842,\n 36.074961\n ],\n [\n 118.516608,\n 36.068573\n ],\n [\n 118.513449,\n 36.064085\n ],\n [\n 118.522214,\n 36.05349\n ],\n [\n 118.522609,\n 36.043622\n ],\n [\n 118.516845,\n 36.026107\n ],\n [\n 118.507447,\n 36.029789\n ],\n [\n 118.503341,\n 36.024246\n ],\n [\n 118.489206,\n 36.025784\n ],\n [\n 118.476097,\n 36.031407\n ],\n [\n 118.469859,\n 36.022992\n ],\n [\n 118.476571,\n 36.012797\n ],\n [\n 118.487074,\n 36.005797\n ],\n [\n 118.49268,\n 35.995437\n ],\n [\n 118.486521,\n 35.988759\n ],\n [\n 118.499393,\n 35.976212\n ],\n [\n 118.505157,\n 35.965808\n ],\n [\n 118.502157,\n 35.962488\n ],\n [\n 118.470964,\n 35.960868\n ],\n [\n 118.459356,\n 35.952689\n ],\n [\n 118.430612,\n 35.969694\n ],\n [\n 118.415213,\n 35.990783\n ],\n [\n 118.387021,\n 35.987586\n ],\n [\n 118.382283,\n 35.975078\n ],\n [\n 118.360725,\n 35.970908\n ],\n [\n 118.352828,\n 35.956698\n ],\n [\n 118.344774,\n 35.955888\n ],\n [\n 118.320136,\n 35.946575\n ],\n [\n 118.314134,\n 35.950827\n ],\n [\n 118.303552,\n 35.948923\n ],\n [\n 118.293523,\n 35.937503\n ],\n [\n 118.281362,\n 35.935964\n ],\n [\n 118.26928,\n 35.928512\n ],\n [\n 118.257593,\n 35.925717\n ],\n [\n 118.257119,\n 35.930699\n ],\n [\n 118.245906,\n 35.932157\n ],\n [\n 118.236904,\n 35.939245\n ],\n [\n 118.236351,\n 35.947749\n ],\n [\n 118.22569,\n 35.948235\n ],\n [\n 118.209897,\n 35.955767\n ],\n [\n 118.207054,\n 35.964391\n ],\n [\n 118.193787,\n 35.974026\n ],\n [\n 118.206106,\n 35.97864\n ],\n [\n 118.197578,\n 36.004947\n ],\n [\n 118.178388,\n 36.017005\n ],\n [\n 118.135588,\n 36.02364\n ],\n [\n 118.132666,\n 36.030436\n ],\n [\n 118.10937,\n 36.030031\n ],\n [\n 118.096104,\n 36.024246\n ],\n [\n 118.093261,\n 36.014618\n ],\n [\n 118.084338,\n 36.012149\n ],\n [\n 118.078415,\n 36.017652\n ],\n [\n 118.075888,\n 36.009034\n ],\n [\n 118.066807,\n 36.009155\n ],\n [\n 118.058989,\n 35.992968\n ],\n [\n 118.042248,\n 35.986371\n ],\n [\n 118.032693,\n 35.974268\n ],\n [\n 118.03293,\n 35.964998\n ],\n [\n 118.02298,\n 35.958965\n ],\n [\n 118.021084,\n 35.949004\n ],\n [\n 117.988471,\n 35.947709\n ],\n [\n 117.984443,\n 35.956293\n ],\n [\n 117.992577,\n 35.971273\n ],\n [\n 117.971414,\n 35.969937\n ],\n [\n 117.953962,\n 35.957913\n ],\n [\n 117.947013,\n 35.960382\n ],\n [\n 117.946065,\n 35.970949\n ],\n [\n 117.937221,\n 35.98119\n ],\n [\n 117.937536,\n 35.99653\n ],\n [\n 117.950803,\n 35.996489\n ],\n [\n 117.94338,\n 36.017288\n ],\n [\n 117.949855,\n 36.018259\n ],\n [\n 117.946855,\n 36.04253\n ],\n [\n 117.932798,\n 36.052196\n ],\n [\n 117.935799,\n 36.061214\n ],\n [\n 117.948829,\n 36.062589\n ],\n [\n 117.94188,\n 36.071807\n ],\n [\n 117.946223,\n 36.08151\n ],\n [\n 117.953172,\n 36.081833\n ],\n [\n 117.954041,\n 36.090201\n ],\n [\n 117.946618,\n 36.100387\n ],\n [\n 117.939984,\n 36.094324\n ],\n [\n 117.931535,\n 36.094203\n ],\n [\n 117.921111,\n 36.110005\n ],\n [\n 117.923875,\n 36.1174\n ],\n [\n 117.91203,\n 36.132753\n ],\n [\n 117.914162,\n 36.140631\n ],\n [\n 117.90666,\n 36.152708\n ],\n [\n 117.917873,\n 36.16337\n ],\n [\n 117.912109,\n 36.171648\n ],\n [\n 117.903027,\n 36.172092\n ],\n [\n 117.915899,\n 36.192562\n ],\n [\n 117.914636,\n 36.200837\n ],\n [\n 117.921664,\n 36.203662\n ],\n [\n 117.928534,\n 36.196558\n ],\n [\n 117.943933,\n 36.207981\n ],\n [\n 117.959332,\n 36.204308\n ],\n [\n 117.967781,\n 36.21464\n ],\n [\n 117.96328,\n 36.224971\n ],\n [\n 117.96707,\n 36.248251\n ],\n [\n 117.975362,\n 36.262328\n ],\n [\n 117.972993,\n 36.268378\n ],\n [\n 117.943696,\n 36.274064\n ],\n [\n 117.932719,\n 36.271846\n ],\n [\n 117.926797,\n 36.277532\n ],\n [\n 117.93114,\n 36.283742\n ],\n [\n 117.922533,\n 36.300514\n ],\n [\n 117.924823,\n 36.313171\n ],\n [\n 117.918347,\n 36.317725\n ],\n [\n 117.919611,\n 36.324738\n ],\n [\n 117.933509,\n 36.334369\n ],\n [\n 117.933904,\n 36.341219\n ],\n [\n 117.915346,\n 36.352903\n ],\n [\n 117.902633,\n 36.352057\n ],\n [\n 117.893472,\n 36.339446\n ],\n [\n 117.89521,\n 36.359227\n ],\n [\n 117.890314,\n 36.366035\n ],\n [\n 117.882101,\n 36.35673\n ],\n [\n 117.879732,\n 36.370626\n ],\n [\n 117.867492,\n 36.386373\n ],\n [\n 117.859279,\n 36.389433\n ],\n [\n 117.855094,\n 36.412945\n ],\n [\n 117.829508,\n 36.417776\n ],\n [\n 117.826823,\n 36.427114\n ],\n [\n 117.833062,\n 36.44301\n ],\n [\n 117.822717,\n 36.44305\n ],\n [\n 117.817268,\n 36.436129\n ],\n [\n 117.799343,\n 36.432265\n ],\n [\n 117.7965,\n 36.43963\n ],\n [\n 117.786471,\n 36.434277\n ],\n [\n 117.779838,\n 36.441239\n ],\n [\n 117.755752,\n 36.445303\n ],\n [\n 117.763491,\n 36.452868\n ],\n [\n 117.757016,\n 36.459144\n ],\n [\n 117.765544,\n 36.469845\n ],\n [\n 117.748566,\n 36.478694\n ],\n [\n 117.757332,\n 36.484485\n ],\n [\n 117.755673,\n 36.496228\n ],\n [\n 117.743118,\n 36.498439\n ],\n [\n 117.735853,\n 36.504993\n ],\n [\n 117.751646,\n 36.509979\n ],\n [\n 117.765544,\n 36.509496\n ],\n [\n 117.76586,\n 36.512994\n ],\n [\n 117.750777,\n 36.524652\n ],\n [\n 117.742486,\n 36.525737\n ],\n [\n 117.739406,\n 36.539925\n ],\n [\n 117.72377,\n 36.54732\n ],\n [\n 117.720849,\n 36.560057\n ],\n [\n 117.694315,\n 36.568896\n ],\n [\n 117.696132,\n 36.575042\n ],\n [\n 117.706792,\n 36.581469\n ],\n [\n 117.715321,\n 36.578537\n ],\n [\n 117.706792,\n 36.593559\n ],\n [\n 117.715163,\n 36.600546\n ],\n [\n 117.697869,\n 36.599422\n ],\n [\n 117.690525,\n 36.604883\n ],\n [\n 117.705055,\n 36.605807\n ],\n [\n 117.706555,\n 36.611549\n ],\n [\n 117.714926,\n 36.610545\n ],\n [\n 117.715321,\n 36.627527\n ],\n [\n 117.70853,\n 36.635154\n ],\n [\n 117.712241,\n 36.642258\n ],\n [\n 117.709003,\n 36.651569\n ],\n [\n 117.698027,\n 36.652974\n ],\n [\n 117.695184,\n 36.666978\n ],\n [\n 117.701265,\n 36.685191\n ],\n [\n 117.715637,\n 36.691208\n ],\n [\n 117.718006,\n 36.697826\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 370400,\n \"name\": \"枣庄市\",\n \"center\": [\n 117.557964,\n 34.856424\n ],\n \"centroid\": [\n 117.39817,\n 34.916234\n ],\n \"childrenNum\": 6,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 370000\n },\n \"subFeatureIndex\": 3,\n \"acroutes\": [\n 100000,\n 370000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 117.392342,\n 34.574909\n ],\n [\n 117.393922,\n 34.587676\n ],\n [\n 117.398976,\n 34.588335\n ],\n [\n 117.397949,\n 34.604393\n ],\n [\n 117.407978,\n 34.610651\n ],\n [\n 117.4109,\n 34.623454\n ],\n [\n 117.402687,\n 34.628434\n ],\n [\n 117.384051,\n 34.628228\n ],\n [\n 117.376707,\n 34.622301\n ],\n [\n 117.374022,\n 34.636172\n ],\n [\n 117.366915,\n 34.650246\n ],\n [\n 117.354201,\n 34.653538\n ],\n [\n 117.35657,\n 34.661643\n ],\n [\n 117.346067,\n 34.670982\n ],\n [\n 117.329247,\n 34.677359\n ],\n [\n 117.335485,\n 34.692454\n ],\n [\n 117.324272,\n 34.697307\n ],\n [\n 117.326167,\n 34.703434\n ],\n [\n 117.310611,\n 34.717333\n ],\n [\n 117.304609,\n 34.714866\n ],\n [\n 117.278787,\n 34.715647\n ],\n [\n 117.271443,\n 34.726501\n ],\n [\n 117.253675,\n 34.721444\n ],\n [\n 117.242067,\n 34.729995\n ],\n [\n 117.236697,\n 34.746355\n ],\n [\n 117.22422,\n 34.745533\n ],\n [\n 117.212927,\n 34.761027\n ],\n [\n 117.191369,\n 34.780914\n ],\n [\n 117.180551,\n 34.784201\n ],\n [\n 117.176523,\n 34.779065\n ],\n [\n 117.162467,\n 34.782105\n ],\n [\n 117.172733,\n 34.799194\n ],\n [\n 117.180314,\n 34.800221\n ],\n [\n 117.194686,\n 34.816239\n ],\n [\n 117.17755,\n 34.828722\n ],\n [\n 117.156623,\n 34.834306\n ],\n [\n 117.140593,\n 34.846499\n ],\n [\n 117.139013,\n 34.854052\n ],\n [\n 117.125826,\n 34.863451\n ],\n [\n 117.12093,\n 34.903581\n ],\n [\n 117.110111,\n 34.90514\n ],\n [\n 117.111059,\n 34.917774\n ],\n [\n 117.103399,\n 34.937459\n ],\n [\n 117.082551,\n 34.934917\n ],\n [\n 117.073707,\n 34.925485\n ],\n [\n 117.06123,\n 34.930406\n ],\n [\n 117.05815,\n 34.926961\n ],\n [\n 117.041093,\n 34.925157\n ],\n [\n 117.043462,\n 34.932825\n ],\n [\n 117.038487,\n 34.937869\n ],\n [\n 117.017719,\n 34.942503\n ],\n [\n 116.989448,\n 34.93873\n ],\n [\n 116.980367,\n 34.941027\n ],\n [\n 116.9671,\n 34.951072\n ],\n [\n 116.955334,\n 34.967142\n ],\n [\n 116.943015,\n 34.975627\n ],\n [\n 116.954466,\n 34.993331\n ],\n [\n 116.956993,\n 35.01054\n ],\n [\n 116.951702,\n 35.020618\n ],\n [\n 116.937172,\n 35.0275\n ],\n [\n 116.907875,\n 35.046995\n ],\n [\n 116.900767,\n 35.05977\n ],\n [\n 116.881183,\n 35.058133\n ],\n [\n 116.880473,\n 35.062595\n ],\n [\n 116.900373,\n 35.068737\n ],\n [\n 116.888212,\n 35.085193\n ],\n [\n 116.888922,\n 35.093829\n ],\n [\n 116.863179,\n 35.091496\n ],\n [\n 116.848649,\n 35.103774\n ],\n [\n 116.832065,\n 35.123783\n ],\n [\n 116.825748,\n 35.147631\n ],\n [\n 116.81793,\n 35.150699\n ],\n [\n 116.813192,\n 35.159573\n ],\n [\n 116.81564,\n 35.170777\n ],\n [\n 116.811218,\n 35.17736\n ],\n [\n 116.832776,\n 35.184392\n ],\n [\n 116.85394,\n 35.16861\n ],\n [\n 116.86618,\n 35.172617\n ],\n [\n 116.876603,\n 35.188031\n ],\n [\n 116.898398,\n 35.195757\n ],\n [\n 116.904716,\n 35.182471\n ],\n [\n 116.913718,\n 35.178791\n ],\n [\n 116.925721,\n 35.182266\n ],\n [\n 116.938277,\n 35.172168\n ],\n [\n 116.962047,\n 35.177319\n ],\n [\n 116.969706,\n 35.187377\n ],\n [\n 116.995687,\n 35.1978\n ],\n [\n 117.014639,\n 35.214844\n ],\n [\n 117.028774,\n 35.221219\n ],\n [\n 117.053333,\n 35.224202\n ],\n [\n 117.065336,\n 35.22792\n ],\n [\n 117.092896,\n 35.220361\n ],\n [\n 117.104899,\n 35.221464\n ],\n [\n 117.123536,\n 35.23078\n ],\n [\n 117.152675,\n 35.232047\n ],\n [\n 117.176681,\n 35.243159\n ],\n [\n 117.199108,\n 35.24749\n ],\n [\n 117.204873,\n 35.258518\n ],\n [\n 117.220824,\n 35.26489\n ],\n [\n 117.269231,\n 35.261296\n ],\n [\n 117.262203,\n 35.287472\n ],\n [\n 117.284472,\n 35.294331\n ],\n [\n 117.290079,\n 35.299394\n ],\n [\n 117.305794,\n 35.295229\n ],\n [\n 117.311163,\n 35.28588\n ],\n [\n 117.314085,\n 35.302129\n ],\n [\n 117.308557,\n 35.312579\n ],\n [\n 117.318034,\n 35.320252\n ],\n [\n 117.347568,\n 35.315109\n ],\n [\n 117.359571,\n 35.318375\n ],\n [\n 117.399528,\n 35.306374\n ],\n [\n 117.403635,\n 35.301394\n ],\n [\n 117.406004,\n 35.283348\n ],\n [\n 117.419191,\n 35.273997\n ],\n [\n 117.426456,\n 35.261786\n ],\n [\n 117.439486,\n 35.258927\n ],\n [\n 117.449752,\n 35.246795\n ],\n [\n 117.448331,\n 35.231842\n ],\n [\n 117.468073,\n 35.228369\n ],\n [\n 117.480628,\n 35.222771\n ],\n [\n 117.494843,\n 35.205893\n ],\n [\n 117.507162,\n 35.198986\n ],\n [\n 117.526825,\n 35.200621\n ],\n [\n 117.528009,\n 35.184351\n ],\n [\n 117.548462,\n 35.161741\n ],\n [\n 117.556043,\n 35.161291\n ],\n [\n 117.570336,\n 35.168365\n ],\n [\n 117.58376,\n 35.164317\n ],\n [\n 117.586208,\n 35.152989\n ],\n [\n 117.591025,\n 35.152539\n ],\n [\n 117.600344,\n 35.135524\n ],\n [\n 117.604371,\n 35.13401\n ],\n [\n 117.623007,\n 35.113063\n ],\n [\n 117.650725,\n 35.092724\n ],\n [\n 117.656885,\n 35.077497\n ],\n [\n 117.676469,\n 35.065543\n ],\n [\n 117.69321,\n 35.06018\n ],\n [\n 117.707345,\n 35.052318\n ],\n [\n 117.704423,\n 35.031227\n ],\n [\n 117.736247,\n 35.031514\n ],\n [\n 117.744618,\n 35.022748\n ],\n [\n 117.737985,\n 35.013203\n ],\n [\n 117.728035,\n 35.008041\n ],\n [\n 117.726534,\n 34.979561\n ],\n [\n 117.719506,\n 34.968331\n ],\n [\n 117.724323,\n 34.958329\n ],\n [\n 117.714689,\n 34.947833\n ],\n [\n 117.712004,\n 34.934999\n ],\n [\n 117.704265,\n 34.933605\n ],\n [\n 117.698501,\n 34.919989\n ],\n [\n 117.70466,\n 34.906699\n ],\n [\n 117.715163,\n 34.896238\n ],\n [\n 117.729298,\n 34.876994\n ],\n [\n 117.742407,\n 34.874163\n ],\n [\n 117.75291,\n 34.857623\n ],\n [\n 117.763175,\n 34.848839\n ],\n [\n 117.795315,\n 34.835907\n ],\n [\n 117.803686,\n 34.830734\n ],\n [\n 117.798632,\n 34.810653\n ],\n [\n 117.77739,\n 34.801248\n ],\n [\n 117.784023,\n 34.79484\n ],\n [\n 117.784576,\n 34.780667\n ],\n [\n 117.79958,\n 34.768875\n ],\n [\n 117.830614,\n 34.760246\n ],\n [\n 117.830061,\n 34.740888\n ],\n [\n 117.823665,\n 34.72868\n ],\n [\n 117.825244,\n 34.713139\n ],\n [\n 117.831719,\n 34.707793\n ],\n [\n 117.825639,\n 34.684392\n ],\n [\n 117.819243,\n 34.681842\n ],\n [\n 117.805818,\n 34.646254\n ],\n [\n 117.793657,\n 34.651768\n ],\n [\n 117.796026,\n 34.637736\n ],\n [\n 117.793657,\n 34.625594\n ],\n [\n 117.798553,\n 34.621848\n ],\n [\n 117.791446,\n 34.585082\n ],\n [\n 117.794605,\n 34.559751\n ],\n [\n 117.793499,\n 34.548463\n ],\n [\n 117.799185,\n 34.535155\n ],\n [\n 117.801712,\n 34.518753\n ],\n [\n 117.790498,\n 34.518918\n ],\n [\n 117.773994,\n 34.529056\n ],\n [\n 117.748645,\n 34.533383\n ],\n [\n 117.700712,\n 34.54525\n ],\n [\n 117.684523,\n 34.547351\n ],\n [\n 117.681996,\n 34.529551\n ],\n [\n 117.673389,\n 34.515827\n ],\n [\n 117.659096,\n 34.501071\n ],\n [\n 117.647014,\n 34.492908\n ],\n [\n 117.642039,\n 34.496825\n ],\n [\n 117.629246,\n 34.488538\n ],\n [\n 117.609662,\n 34.490476\n ],\n [\n 117.603187,\n 34.476828\n ],\n [\n 117.592289,\n 34.462518\n ],\n [\n 117.569783,\n 34.463054\n ],\n [\n 117.561334,\n 34.471962\n ],\n [\n 117.54783,\n 34.475179\n ],\n [\n 117.538275,\n 34.46722\n ],\n [\n 117.513005,\n 34.472581\n ],\n [\n 117.493263,\n 34.472663\n ],\n [\n 117.487341,\n 34.466354\n ],\n [\n 117.48663,\n 34.482065\n ],\n [\n 117.48205,\n 34.48594\n ],\n [\n 117.465467,\n 34.48458\n ],\n [\n 117.45141,\n 34.506264\n ],\n [\n 117.438223,\n 34.516445\n ],\n [\n 117.439486,\n 34.520031\n ],\n [\n 117.426772,\n 34.525224\n ],\n [\n 117.424482,\n 34.537009\n ],\n [\n 117.403793,\n 34.546898\n ],\n [\n 117.402529,\n 34.569431\n ],\n [\n 117.392342,\n 34.574909\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 370500,\n \"name\": \"东营市\",\n \"center\": [\n 118.66471,\n 37.434564\n ],\n \"centroid\": [\n 118.625299,\n 37.636119\n ],\n \"childrenNum\": 5,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 370000\n },\n \"subFeatureIndex\": 4,\n \"acroutes\": [\n 100000,\n 370000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 119.039928,\n 37.304466\n ],\n [\n 118.856959,\n 37.293842\n ],\n [\n 118.821897,\n 37.288788\n ],\n [\n 118.777991,\n 37.280112\n ],\n [\n 118.728399,\n 37.252764\n ],\n [\n 118.709684,\n 37.241256\n ],\n [\n 118.680624,\n 37.229269\n ],\n [\n 118.672332,\n 37.215129\n ],\n [\n 118.668779,\n 37.198436\n ],\n [\n 118.660408,\n 37.187877\n ],\n [\n 118.649274,\n 37.189112\n ],\n [\n 118.645483,\n 37.178153\n ],\n [\n 118.633638,\n 37.171178\n ],\n [\n 118.634191,\n 37.163366\n ],\n [\n 118.64572,\n 37.159579\n ],\n [\n 118.649195,\n 37.164243\n ],\n [\n 118.653617,\n 37.149692\n ],\n [\n 118.673754,\n 37.144309\n ],\n [\n 118.667041,\n 37.11392\n ],\n [\n 118.668384,\n 37.091539\n ],\n [\n 118.665146,\n 37.081763\n ],\n [\n 118.655512,\n 37.082681\n ],\n [\n 118.654091,\n 37.076935\n ],\n [\n 118.632138,\n 37.070429\n ],\n [\n 118.631901,\n 37.066757\n ],\n [\n 118.610895,\n 37.063005\n ],\n [\n 118.591469,\n 37.068474\n ],\n [\n 118.580414,\n 37.063325\n ],\n [\n 118.561303,\n 37.063325\n ],\n [\n 118.557592,\n 37.051469\n ],\n [\n 118.56004,\n 37.041408\n ],\n [\n 118.545431,\n 37.038494\n ],\n [\n 118.545826,\n 37.023519\n ],\n [\n 118.57149,\n 37.022081\n ],\n [\n 118.588389,\n 37.017409\n ],\n [\n 118.583572,\n 37.008422\n ],\n [\n 118.590206,\n 37.001351\n ],\n [\n 118.571174,\n 37.004148\n ],\n [\n 118.566199,\n 36.999034\n ],\n [\n 118.580493,\n 36.994999\n ],\n [\n 118.564146,\n 36.99416\n ],\n [\n 118.553959,\n 37.000233\n ],\n [\n 118.552301,\n 36.979657\n ],\n [\n 118.559803,\n 36.977059\n ],\n [\n 118.557434,\n 36.96539\n ],\n [\n 118.560751,\n 36.946564\n ],\n [\n 118.55467,\n 36.938368\n ],\n [\n 118.537771,\n 36.936769\n ],\n [\n 118.52711,\n 36.939687\n ],\n [\n 118.524583,\n 36.945284\n ],\n [\n 118.503183,\n 36.944285\n ],\n [\n 118.503736,\n 36.95156\n ],\n [\n 118.47665,\n 36.957077\n ],\n [\n 118.467411,\n 36.945484\n ],\n [\n 118.439061,\n 36.942206\n ],\n [\n 118.40321,\n 36.943125\n ],\n [\n 118.401788,\n 36.949802\n ],\n [\n 118.386548,\n 36.950481\n ],\n [\n 118.387574,\n 36.971305\n ],\n [\n 118.384652,\n 36.974382\n ],\n [\n 118.352276,\n 36.974582\n ],\n [\n 118.3443,\n 36.960714\n ],\n [\n 118.324637,\n 36.964751\n ],\n [\n 118.322347,\n 36.974502\n ],\n [\n 118.312476,\n 36.970905\n ],\n [\n 118.294629,\n 36.969666\n ],\n [\n 118.291628,\n 36.995878\n ],\n [\n 118.288785,\n 36.999993\n ],\n [\n 118.28997,\n 37.00946\n ],\n [\n 118.308212,\n 37.019885\n ],\n [\n 118.310186,\n 37.028231\n ],\n [\n 118.3259,\n 37.035459\n ],\n [\n 118.324558,\n 37.046279\n ],\n [\n 118.337588,\n 37.053904\n ],\n [\n 118.338535,\n 37.072265\n ],\n [\n 118.332928,\n 37.081923\n ],\n [\n 118.338851,\n 37.093894\n ],\n [\n 118.338298,\n 37.10311\n ],\n [\n 118.349354,\n 37.101753\n ],\n [\n 118.338219,\n 37.123134\n ],\n [\n 118.346116,\n 37.123931\n ],\n [\n 118.340667,\n 37.131748\n ],\n [\n 118.347616,\n 37.139803\n ],\n [\n 118.356224,\n 37.139325\n ],\n [\n 118.361594,\n 37.148495\n ],\n [\n 118.366569,\n 37.146781\n ],\n [\n 118.377545,\n 37.154157\n ],\n [\n 118.380467,\n 37.175164\n ],\n [\n 118.387574,\n 37.177834\n ],\n [\n 118.383389,\n 37.190587\n ],\n [\n 118.376598,\n 37.196962\n ],\n [\n 118.375966,\n 37.206126\n ],\n [\n 118.3642,\n 37.210189\n ],\n [\n 118.346669,\n 37.233252\n ],\n [\n 118.350459,\n 37.243765\n ],\n [\n 118.36033,\n 37.244561\n ],\n [\n 118.368385,\n 37.258576\n ],\n [\n 118.375729,\n 37.258497\n ],\n [\n 118.372096,\n 37.273703\n ],\n [\n 118.36262,\n 37.273783\n ],\n [\n 118.368069,\n 37.279594\n ],\n [\n 118.358277,\n 37.280669\n ],\n [\n 118.355197,\n 37.286997\n ],\n [\n 118.342168,\n 37.287076\n ],\n [\n 118.342168,\n 37.295075\n ],\n [\n 118.325584,\n 37.296866\n ],\n [\n 118.326058,\n 37.306535\n ],\n [\n 118.319741,\n 37.305978\n ],\n [\n 118.31524,\n 37.31477\n ],\n [\n 118.315398,\n 37.352514\n ],\n [\n 118.287285,\n 37.352434\n ],\n [\n 118.291865,\n 37.358518\n ],\n [\n 118.286495,\n 37.362772\n ],\n [\n 118.273624,\n 37.360029\n ],\n [\n 118.262015,\n 37.364283\n ],\n [\n 118.258541,\n 37.37911\n ],\n [\n 118.245827,\n 37.376646\n ],\n [\n 118.245353,\n 37.367781\n ],\n [\n 118.222768,\n 37.367861\n ],\n [\n 118.217951,\n 37.371478\n ],\n [\n 118.216925,\n 37.385191\n ],\n [\n 118.202,\n 37.382409\n ],\n [\n 118.161015,\n 37.362573\n ],\n [\n 118.156198,\n 37.364322\n ],\n [\n 118.154935,\n 37.377401\n ],\n [\n 118.141668,\n 37.376487\n ],\n [\n 118.135509,\n 37.384834\n ],\n [\n 118.144037,\n 37.392822\n ],\n [\n 118.16141,\n 37.389961\n ],\n [\n 118.160147,\n 37.399618\n ],\n [\n 118.165596,\n 37.4082\n ],\n [\n 118.163937,\n 37.416742\n ],\n [\n 118.14996,\n 37.438351\n ],\n [\n 118.136141,\n 37.441688\n ],\n [\n 118.114898,\n 37.439742\n ],\n [\n 118.118531,\n 37.456182\n ],\n [\n 118.125322,\n 37.45912\n ],\n [\n 118.112766,\n 37.463528\n ],\n [\n 118.120426,\n 37.480757\n ],\n [\n 118.128481,\n 37.483694\n ],\n [\n 118.127849,\n 37.491831\n ],\n [\n 118.135035,\n 37.496752\n ],\n [\n 118.134245,\n 37.507387\n ],\n [\n 118.139378,\n 37.507427\n ],\n [\n 118.136772,\n 37.516791\n ],\n [\n 118.142537,\n 37.518933\n ],\n [\n 118.150987,\n 37.530517\n ],\n [\n 118.156988,\n 37.530358\n ],\n [\n 118.159831,\n 37.539164\n ],\n [\n 118.173255,\n 37.546858\n ],\n [\n 118.176098,\n 37.557129\n ],\n [\n 118.173176,\n 37.563593\n ],\n [\n 118.141431,\n 37.556297\n ],\n [\n 118.134166,\n 37.558478\n ],\n [\n 118.13922,\n 37.571364\n ],\n [\n 118.131324,\n 37.571285\n ],\n [\n 118.127612,\n 37.578103\n ],\n [\n 118.134877,\n 37.590035\n ],\n [\n 118.148696,\n 37.594078\n ],\n [\n 118.146722,\n 37.599943\n ],\n [\n 118.154935,\n 37.605491\n ],\n [\n 118.157462,\n 37.62035\n ],\n [\n 118.154935,\n 37.628036\n ],\n [\n 118.163542,\n 37.63069\n ],\n [\n 118.165596,\n 37.644633\n ],\n [\n 118.172545,\n 37.644079\n ],\n [\n 118.177125,\n 37.657623\n ],\n [\n 118.195445,\n 37.661742\n ],\n [\n 118.200657,\n 37.667404\n ],\n [\n 118.207449,\n 37.661583\n ],\n [\n 118.22569,\n 37.663682\n ],\n [\n 118.239431,\n 37.65596\n ],\n [\n 118.246459,\n 37.658376\n ],\n [\n 118.260989,\n 37.654614\n ],\n [\n 118.2846,\n 37.662058\n ],\n [\n 118.293129,\n 37.670096\n ],\n [\n 118.294076,\n 37.678529\n ],\n [\n 118.305132,\n 37.683122\n ],\n [\n 118.3045,\n 37.690722\n ],\n [\n 118.316187,\n 37.714151\n ],\n [\n 118.319425,\n 37.712924\n ],\n [\n 118.31753,\n 37.728395\n ],\n [\n 118.337509,\n 37.729502\n ],\n [\n 118.341931,\n 37.74667\n ],\n [\n 118.353697,\n 37.750151\n ],\n [\n 118.353065,\n 37.75814\n ],\n [\n 118.340667,\n 37.763913\n ],\n [\n 118.340588,\n 37.774391\n ],\n [\n 118.348406,\n 37.790719\n ],\n [\n 118.36191,\n 37.792063\n ],\n [\n 118.352355,\n 37.814274\n ],\n [\n 118.356382,\n 37.820834\n ],\n [\n 118.344932,\n 37.824627\n ],\n [\n 118.346116,\n 37.832371\n ],\n [\n 118.334271,\n 37.832134\n ],\n [\n 118.340193,\n 37.838059\n ],\n [\n 118.328111,\n 37.865272\n ],\n [\n 118.313265,\n 37.861521\n ],\n [\n 118.301657,\n 37.870208\n ],\n [\n 118.286337,\n 37.8569\n ],\n [\n 118.269754,\n 37.853109\n ],\n [\n 118.258304,\n 37.844182\n ],\n [\n 118.258146,\n 37.854886\n ],\n [\n 118.247643,\n 37.871788\n ],\n [\n 118.248749,\n 37.858164\n ],\n [\n 118.239115,\n 37.868708\n ],\n [\n 118.236588,\n 37.884501\n ],\n [\n 118.243142,\n 37.895673\n ],\n [\n 118.235403,\n 37.905343\n ],\n [\n 118.232718,\n 37.922509\n ],\n [\n 118.225611,\n 37.923417\n ],\n [\n 118.226954,\n 37.939672\n ],\n [\n 118.224742,\n 37.950559\n ],\n [\n 118.215503,\n 37.949376\n ],\n [\n 118.213529,\n 37.95541\n ],\n [\n 118.223479,\n 37.959788\n ],\n [\n 118.220873,\n 37.98258\n ],\n [\n 118.22956,\n 37.986444\n ],\n [\n 118.2234,\n 38.00095\n ],\n [\n 118.40779,\n 38.026212\n ],\n [\n 118.419951,\n 38.025503\n ],\n [\n 118.419319,\n 38.053119\n ],\n [\n 118.410001,\n 38.053277\n ],\n [\n 118.227585,\n 38.037874\n ],\n [\n 118.230665,\n 38.056743\n ],\n [\n 118.226638,\n 38.079583\n ],\n [\n 118.235324,\n 38.082969\n ],\n [\n 118.245511,\n 38.103322\n ],\n [\n 118.241247,\n 38.112138\n ],\n [\n 118.227664,\n 38.119262\n ],\n [\n 118.236272,\n 38.125754\n ],\n [\n 118.245432,\n 38.144286\n ],\n [\n 118.274334,\n 38.138542\n ],\n [\n 118.330717,\n 38.125046\n ],\n [\n 118.360172,\n 38.120954\n ],\n [\n 118.38023,\n 38.119931\n ],\n [\n 118.39097,\n 38.123315\n ],\n [\n 118.404078,\n 38.120914\n ],\n [\n 118.420425,\n 38.107337\n ],\n [\n 118.43148,\n 38.106274\n ],\n [\n 118.449722,\n 38.124259\n ],\n [\n 118.461409,\n 38.126659\n ],\n [\n 118.483204,\n 38.123236\n ],\n [\n 118.504526,\n 38.113909\n ],\n [\n 118.513212,\n 38.10466\n ],\n [\n 118.517081,\n 38.088363\n ],\n [\n 118.526321,\n 38.071314\n ],\n [\n 118.534533,\n 38.063517\n ],\n [\n 118.552459,\n 38.055679\n ],\n [\n 118.565568,\n 38.060209\n ],\n [\n 118.597629,\n 38.078993\n ],\n [\n 118.603946,\n 38.101354\n ],\n [\n 118.607816,\n 38.12906\n ],\n [\n 118.62582,\n 38.138306\n ],\n [\n 118.726425,\n 38.154238\n ],\n [\n 118.777754,\n 38.156952\n ],\n [\n 118.811474,\n 38.15762\n ],\n [\n 118.853721,\n 38.154985\n ],\n [\n 118.877491,\n 38.149596\n ],\n [\n 118.908051,\n 38.139368\n ],\n [\n 118.931426,\n 38.127486\n ],\n [\n 118.958512,\n 38.110131\n ],\n [\n 118.974068,\n 38.09415\n ],\n [\n 118.985282,\n 38.062099\n ],\n [\n 118.996495,\n 38.013996\n ],\n [\n 119.00455,\n 37.992278\n ],\n [\n 119.045297,\n 37.967597\n ],\n [\n 119.110604,\n 37.921365\n ],\n [\n 119.120554,\n 37.897054\n ],\n [\n 119.122844,\n 37.866536\n ],\n [\n 119.128293,\n 37.855992\n ],\n [\n 119.126555,\n 37.845723\n ],\n [\n 119.119764,\n 37.839442\n ],\n [\n 119.121501,\n 37.827511\n ],\n [\n 119.128293,\n 37.814393\n ],\n [\n 119.15451,\n 37.80645\n ],\n [\n 119.180254,\n 37.809098\n ],\n [\n 119.204734,\n 37.815618\n ],\n [\n 119.217605,\n 37.810244\n ],\n [\n 119.219974,\n 37.793723\n ],\n [\n 119.21421,\n 37.769647\n ],\n [\n 119.215394,\n 37.76332\n ],\n [\n 119.225344,\n 37.752998\n ],\n [\n 119.275252,\n 37.739353\n ],\n [\n 119.278963,\n 37.729819\n ],\n [\n 119.275726,\n 37.717435\n ],\n [\n 119.26009,\n 37.702398\n ],\n [\n 119.247218,\n 37.698519\n ],\n [\n 119.22487,\n 37.697332\n ],\n [\n 119.196916,\n 37.699073\n ],\n [\n 119.138006,\n 37.705128\n ],\n [\n 119.107129,\n 37.703941\n ],\n [\n 119.080122,\n 37.696382\n ],\n [\n 119.047509,\n 37.679044\n ],\n [\n 119.020186,\n 37.657227\n ],\n [\n 118.997206,\n 37.632592\n ],\n [\n 118.972331,\n 37.594474\n ],\n [\n 118.9518,\n 37.556019\n ],\n [\n 118.939638,\n 37.527066\n ],\n [\n 118.942955,\n 37.497466\n ],\n [\n 118.958275,\n 37.454912\n ],\n [\n 118.973121,\n 37.404346\n ],\n [\n 118.977385,\n 37.382052\n ],\n [\n 118.982597,\n 37.378077\n ],\n [\n 119.003444,\n 37.383403\n ],\n [\n 119.012842,\n 37.376089\n ],\n [\n 119.009841,\n 37.370763\n ],\n [\n 118.985598,\n 37.365754\n ],\n [\n 118.981412,\n 37.35983\n ],\n [\n 118.98694,\n 37.339511\n ],\n [\n 119.001233,\n 37.318748\n ],\n [\n 119.010315,\n 37.313218\n ],\n [\n 119.039928,\n 37.304466\n ]\n ]\n ],\n [\n [\n [\n 118.410001,\n 38.053277\n ],\n [\n 118.40779,\n 38.026212\n ],\n [\n 118.2234,\n 38.00095\n ],\n [\n 118.227585,\n 38.037874\n ],\n [\n 118.410001,\n 38.053277\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 370600,\n \"name\": \"烟台市\",\n \"center\": [\n 121.391382,\n 37.539297\n ],\n \"centroid\": [\n 120.805129,\n 37.241857\n ],\n \"childrenNum\": 12,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 370000\n },\n \"subFeatureIndex\": 5,\n \"acroutes\": [\n 100000,\n 370000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 119.576514,\n 37.127561\n ],\n [\n 119.629423,\n 37.142116\n ],\n [\n 119.678541,\n 37.157984\n ],\n [\n 119.68628,\n 37.15611\n ],\n [\n 119.687069,\n 37.14395\n ],\n [\n 119.698598,\n 37.127002\n ],\n [\n 119.744795,\n 37.135257\n ],\n [\n 119.754034,\n 37.147459\n ],\n [\n 119.771091,\n 37.160456\n ],\n [\n 119.780488,\n 37.175204\n ],\n [\n 119.790517,\n 37.185008\n ],\n [\n 119.80789,\n 37.196404\n ],\n [\n 119.822104,\n 37.220068\n ],\n [\n 119.83008,\n 37.225724\n ],\n [\n 119.865063,\n 37.233969\n ],\n [\n 119.877066,\n 37.24046\n ],\n [\n 119.885989,\n 37.252286\n ],\n [\n 119.858982,\n 37.253719\n ],\n [\n 119.860956,\n 37.262557\n ],\n [\n 119.892149,\n 37.263911\n ],\n [\n 119.895781,\n 37.275495\n ],\n [\n 119.887332,\n 37.283972\n ],\n [\n 119.889227,\n 37.298457\n ],\n [\n 119.883383,\n 37.310871\n ],\n [\n 119.874697,\n 37.313099\n ],\n [\n 119.869406,\n 37.321016\n ],\n [\n 119.85306,\n 37.326226\n ],\n [\n 119.848085,\n 37.337323\n ],\n [\n 119.838214,\n 37.34309\n ],\n [\n 119.842715,\n 37.361341\n ],\n [\n 119.839714,\n 37.37112\n ],\n [\n 119.843978,\n 37.376725\n ],\n [\n 119.927131,\n 37.386702\n ],\n [\n 119.937397,\n 37.393339\n ],\n [\n 119.949874,\n 37.42004\n ],\n [\n 119.986357,\n 37.425681\n ],\n [\n 120.012654,\n 37.442919\n ],\n [\n 120.06493,\n 37.449114\n ],\n [\n 120.086252,\n 37.465275\n ],\n [\n 120.108758,\n 37.470515\n ],\n [\n 120.144372,\n 37.481908\n ],\n [\n 120.194517,\n 37.512982\n ],\n [\n 120.199492,\n 37.524646\n ],\n [\n 120.222313,\n 37.532857\n ],\n [\n 120.235975,\n 37.548128\n ],\n [\n 120.246793,\n 37.556614\n ],\n [\n 120.208178,\n 37.588648\n ],\n [\n 120.217575,\n 37.603787\n ],\n [\n 120.210152,\n 37.616745\n ],\n [\n 120.215048,\n 37.621143\n ],\n [\n 120.24861,\n 37.623876\n ],\n [\n 120.265667,\n 37.628868\n ],\n [\n 120.2723,\n 37.63683\n ],\n [\n 120.273563,\n 37.650891\n ],\n [\n 120.269299,\n 37.658495\n ],\n [\n 120.244661,\n 37.657703\n ],\n [\n 120.232895,\n 37.662138\n ],\n [\n 120.220339,\n 37.672036\n ],\n [\n 120.216154,\n 37.686605\n ],\n [\n 120.227209,\n 37.693611\n ],\n [\n 120.341555,\n 37.693215\n ],\n [\n 120.368246,\n 37.698005\n ],\n [\n 120.386408,\n 37.707701\n ],\n [\n 120.437817,\n 37.74141\n ],\n [\n 120.447924,\n 37.754659\n ],\n [\n 120.47201,\n 37.757626\n ],\n [\n 120.482354,\n 37.755015\n ],\n [\n 120.518443,\n 37.750586\n ],\n [\n 120.528235,\n 37.757151\n ],\n [\n 120.579959,\n 37.760868\n ],\n [\n 120.595357,\n 37.767551\n ],\n [\n 120.621654,\n 37.790877\n ],\n [\n 120.63421,\n 37.796371\n ],\n [\n 120.657031,\n 37.793051\n ],\n [\n 120.733393,\n 37.833556\n ],\n [\n 120.743185,\n 37.833082\n ],\n [\n 120.754241,\n 37.837506\n ],\n [\n 120.762611,\n 37.829961\n ],\n [\n 120.778563,\n 37.831146\n ],\n [\n 120.797278,\n 37.827709\n ],\n [\n 120.811887,\n 37.822098\n ],\n [\n 120.832972,\n 37.821624\n ],\n [\n 120.865112,\n 37.832963\n ],\n [\n 120.890381,\n 37.832963\n ],\n [\n 120.900489,\n 37.823679\n ],\n [\n 120.915019,\n 37.824034\n ],\n [\n 120.921653,\n 37.819885\n ],\n [\n 120.935788,\n 37.822375\n ],\n [\n 120.94637,\n 37.813405\n ],\n [\n 120.947712,\n 37.798624\n ],\n [\n 120.941158,\n 37.793367\n ],\n [\n 120.943448,\n 37.78554\n ],\n [\n 120.952924,\n 37.776882\n ],\n [\n 120.975588,\n 37.762371\n ],\n [\n 120.995724,\n 37.759049\n ],\n [\n 121.016098,\n 37.741766\n ],\n [\n 121.019573,\n 37.731085\n ],\n [\n 121.037735,\n 37.718583\n ],\n [\n 121.055108,\n 37.715734\n ],\n [\n 121.064584,\n 37.717119\n ],\n [\n 121.068375,\n 37.72519\n ],\n [\n 121.075482,\n 37.717791\n ],\n [\n 121.096329,\n 37.722698\n ],\n [\n 121.139841,\n 37.723054\n ],\n [\n 121.148527,\n 37.719651\n ],\n [\n 121.159583,\n 37.70687\n ],\n [\n 121.160057,\n 37.699034\n ],\n [\n 121.146079,\n 37.678846\n ],\n [\n 121.142684,\n 37.661267\n ],\n [\n 121.156582,\n 37.657386\n ],\n [\n 121.161715,\n 37.646336\n ],\n [\n 121.150107,\n 37.628987\n ],\n [\n 121.149554,\n 37.619875\n ],\n [\n 121.16977,\n 37.600617\n ],\n [\n 121.182483,\n 37.594276\n ],\n [\n 121.215887,\n 37.583098\n ],\n [\n 121.251264,\n 37.581116\n ],\n [\n 121.304963,\n 37.582979\n ],\n [\n 121.354791,\n 37.596178\n ],\n [\n 121.361583,\n 37.600855\n ],\n [\n 121.358266,\n 37.616467\n ],\n [\n 121.344289,\n 37.627759\n ],\n [\n 121.349264,\n 37.635206\n ],\n [\n 121.361898,\n 37.634216\n ],\n [\n 121.374849,\n 37.628749\n ],\n [\n 121.386142,\n 37.627798\n ],\n [\n 121.411174,\n 37.609494\n ],\n [\n 121.43676,\n 37.600815\n ],\n [\n 121.439603,\n 37.596218\n ],\n [\n 121.427047,\n 37.590788\n ],\n [\n 121.411016,\n 37.591263\n ],\n [\n 121.389774,\n 37.59705\n ],\n [\n 121.385905,\n 37.591303\n ],\n [\n 121.395934,\n 37.589876\n ],\n [\n 121.401066,\n 37.557804\n ],\n [\n 121.412438,\n 37.547652\n ],\n [\n 121.436444,\n 37.541227\n ],\n [\n 121.459819,\n 37.522623\n ],\n [\n 121.45666,\n 37.502665\n ],\n [\n 121.46045,\n 37.493855\n ],\n [\n 121.479245,\n 37.474961\n ],\n [\n 121.514938,\n 37.46186\n ],\n [\n 121.532074,\n 37.462456\n ],\n [\n 121.537207,\n 37.451219\n ],\n [\n 121.56532,\n 37.440377\n ],\n [\n 121.571558,\n 37.441449\n ],\n [\n 121.576059,\n 37.460391\n ],\n [\n 121.586562,\n 37.467299\n ],\n [\n 121.599118,\n 37.46992\n ],\n [\n 121.618939,\n 37.481948\n ],\n [\n 121.633469,\n 37.49318\n ],\n [\n 121.653843,\n 37.493061\n ],\n [\n 121.660239,\n 37.487187\n ],\n [\n 121.665767,\n 37.473453\n ],\n [\n 121.747893,\n 37.467458\n ],\n [\n 121.773084,\n 37.466505\n ],\n [\n 121.838943,\n 37.471468\n ],\n [\n 121.887587,\n 37.470039\n ],\n [\n 121.923992,\n 37.473096\n ],\n [\n 121.92944,\n 37.460868\n ],\n [\n 121.929519,\n 37.454713\n ],\n [\n 121.920438,\n 37.429931\n ],\n [\n 121.91878,\n 37.420755\n ],\n [\n 121.908435,\n 37.400969\n ],\n [\n 121.90038,\n 37.391232\n ],\n [\n 121.882454,\n 37.381694\n ],\n [\n 121.870293,\n 37.368894\n ],\n [\n 121.865239,\n 37.336727\n ],\n [\n 121.859396,\n 37.329249\n ],\n [\n 121.834047,\n 37.318311\n ],\n [\n 121.822281,\n 37.303988\n ],\n [\n 121.815253,\n 37.300447\n ],\n [\n 121.794879,\n 37.30375\n ],\n [\n 121.790615,\n 37.299532\n ],\n [\n 121.792431,\n 37.288469\n ],\n [\n 121.784692,\n 37.268409\n ],\n [\n 121.778296,\n 37.260487\n ],\n [\n 121.7749,\n 37.248225\n ],\n [\n 121.757211,\n 37.247667\n ],\n [\n 121.74813,\n 37.241575\n ],\n [\n 121.748525,\n 37.223255\n ],\n [\n 121.755632,\n 37.220506\n ],\n [\n 121.754527,\n 37.212022\n ],\n [\n 121.761634,\n 37.217997\n ],\n [\n 121.769057,\n 37.196364\n ],\n [\n 121.759738,\n 37.19222\n ],\n [\n 121.760686,\n 37.178831\n ],\n [\n 121.749315,\n 37.176439\n ],\n [\n 121.753895,\n 37.172493\n ],\n [\n 121.761002,\n 37.177954\n ],\n [\n 121.767872,\n 37.170979\n ],\n [\n 121.747656,\n 37.135776\n ],\n [\n 121.737706,\n 37.136175\n ],\n [\n 121.733995,\n 37.125607\n ],\n [\n 121.699328,\n 37.125926\n ],\n [\n 121.694037,\n 37.141239\n ],\n [\n 121.683455,\n 37.141917\n ],\n [\n 121.688983,\n 37.133503\n ],\n [\n 121.682271,\n 37.13127\n ],\n [\n 121.683692,\n 37.123014\n ],\n [\n 121.678007,\n 37.121658\n ],\n [\n 121.669162,\n 37.110649\n ],\n [\n 121.666714,\n 37.12082\n ],\n [\n 121.654316,\n 37.121897\n ],\n [\n 121.639865,\n 37.131908\n ],\n [\n 121.638839,\n 37.139524\n ],\n [\n 121.628889,\n 37.137969\n ],\n [\n 121.625414,\n 37.131908\n ],\n [\n 121.612147,\n 37.125846\n ],\n [\n 121.600539,\n 37.141079\n ],\n [\n 121.590747,\n 37.144269\n ],\n [\n 121.585377,\n 37.132306\n ],\n [\n 121.590352,\n 37.128518\n ],\n [\n 121.589168,\n 37.116712\n ],\n [\n 121.580323,\n 37.10674\n ],\n [\n 121.574954,\n 37.110091\n ],\n [\n 121.547868,\n 37.104945\n ],\n [\n 121.49946,\n 37.104426\n ],\n [\n 121.465425,\n 37.12086\n ],\n [\n 121.447578,\n 37.123333\n ],\n [\n 121.441656,\n 37.12106\n ],\n [\n 121.427363,\n 37.100796\n ],\n [\n 121.391432,\n 37.098282\n ],\n [\n 121.382746,\n 37.112125\n ],\n [\n 121.376823,\n 37.115915\n ],\n [\n 121.369795,\n 37.110889\n ],\n [\n 121.351475,\n 37.126962\n ],\n [\n 121.363715,\n 37.129236\n ],\n [\n 121.358187,\n 37.140282\n ],\n [\n 121.348316,\n 37.135975\n ],\n [\n 121.34113,\n 37.127002\n ],\n [\n 121.326916,\n 37.12768\n ],\n [\n 121.317992,\n 37.132825\n ],\n [\n 121.314044,\n 37.141079\n ],\n [\n 121.306542,\n 37.141996\n ],\n [\n 121.287827,\n 37.136055\n ],\n [\n 121.26153,\n 37.117989\n ],\n [\n 121.246368,\n 37.102631\n ],\n [\n 121.243131,\n 37.092138\n ],\n [\n 121.204279,\n 37.07897\n ],\n [\n 121.191407,\n 37.072026\n ],\n [\n 121.192512,\n 37.052108\n ],\n [\n 121.188011,\n 37.041169\n ],\n [\n 121.188564,\n 37.029948\n ],\n [\n 121.19496,\n 37.027273\n ],\n [\n 121.194565,\n 37.019485\n ],\n [\n 121.181299,\n 37.016131\n ],\n [\n 121.177587,\n 37.003748\n ],\n [\n 121.182404,\n 36.99456\n ],\n [\n 121.19038,\n 36.996558\n ],\n [\n 121.209096,\n 36.985371\n ],\n [\n 121.222915,\n 36.986649\n ],\n [\n 121.22639,\n 36.971065\n ],\n [\n 121.233734,\n 36.956917\n ],\n [\n 121.248501,\n 36.953679\n ],\n [\n 121.252607,\n 36.938088\n ],\n [\n 121.263189,\n 36.926093\n ],\n [\n 121.272191,\n 36.927532\n ],\n [\n 121.282615,\n 36.918535\n ],\n [\n 121.304173,\n 36.918335\n ],\n [\n 121.308358,\n 36.905177\n ],\n [\n 121.312938,\n 36.904097\n ],\n [\n 121.347605,\n 36.920574\n ],\n [\n 121.360951,\n 36.921494\n ],\n [\n 121.366557,\n 36.903617\n ],\n [\n 121.36482,\n 36.897417\n ],\n [\n 121.385431,\n 36.877333\n ],\n [\n 121.363873,\n 36.871651\n ],\n [\n 121.357397,\n 36.864048\n ],\n [\n 121.357239,\n 36.852401\n ],\n [\n 121.36174,\n 36.841273\n ],\n [\n 121.373428,\n 36.840593\n ],\n [\n 121.376665,\n 36.830384\n ],\n [\n 121.396802,\n 36.803834\n ],\n [\n 121.395855,\n 36.794342\n ],\n [\n 121.409121,\n 36.790176\n ],\n [\n 121.417334,\n 36.792739\n ],\n [\n 121.450184,\n 36.790056\n ],\n [\n 121.462424,\n 36.784888\n ],\n [\n 121.478218,\n 36.770825\n ],\n [\n 121.460687,\n 36.76245\n ],\n [\n 121.454291,\n 36.752351\n ],\n [\n 121.412596,\n 36.748103\n ],\n [\n 121.394038,\n 36.737962\n ],\n [\n 121.390406,\n 36.728742\n ],\n [\n 121.404304,\n 36.726457\n ],\n [\n 121.410385,\n 36.714709\n ],\n [\n 121.405489,\n 36.704443\n ],\n [\n 121.394354,\n 36.699029\n ],\n [\n 121.374691,\n 36.699791\n ],\n [\n 121.365531,\n 36.711461\n ],\n [\n 121.357792,\n 36.713105\n ],\n [\n 121.318308,\n 36.702117\n ],\n [\n 121.298724,\n 36.702318\n ],\n [\n 121.285536,\n 36.699871\n ],\n [\n 121.274876,\n 36.692652\n ],\n [\n 121.251896,\n 36.671351\n ],\n [\n 121.239261,\n 36.668342\n ],\n [\n 121.220941,\n 36.671271\n ],\n [\n 121.194881,\n 36.653295\n ],\n [\n 121.176877,\n 36.65482\n ],\n [\n 121.161399,\n 36.651288\n ],\n [\n 121.146079,\n 36.640372\n ],\n [\n 121.113939,\n 36.621907\n ],\n [\n 121.07793,\n 36.607614\n ],\n [\n 121.055582,\n 36.592675\n ],\n [\n 121.045237,\n 36.579581\n ],\n [\n 121.02897,\n 36.573194\n ],\n [\n 121.016019,\n 36.574721\n ],\n [\n 120.955609,\n 36.576087\n ],\n [\n 120.928681,\n 36.589783\n ],\n [\n 120.924495,\n 36.596892\n ],\n [\n 120.925917,\n 36.613837\n ],\n [\n 120.90578,\n 36.623473\n ],\n [\n 120.89504,\n 36.622188\n ],\n [\n 120.882011,\n 36.627086\n ],\n [\n 120.847107,\n 36.618615\n ],\n [\n 120.850108,\n 36.612271\n ],\n [\n 120.786223,\n 36.589663\n ],\n [\n 120.779747,\n 36.591551\n ],\n [\n 120.777062,\n 36.600546\n ],\n [\n 120.765533,\n 36.607011\n ],\n [\n 120.757557,\n 36.606088\n ],\n [\n 120.751556,\n 36.615042\n ],\n [\n 120.725733,\n 36.624436\n ],\n [\n 120.708281,\n 36.621385\n ],\n [\n 120.70836,\n 36.612914\n ],\n [\n 120.699121,\n 36.60665\n ],\n [\n 120.702991,\n 36.598338\n ],\n [\n 120.679695,\n 36.589181\n ],\n [\n 120.665402,\n 36.587454\n ],\n [\n 120.664059,\n 36.583478\n ],\n [\n 120.637763,\n 36.574199\n ],\n [\n 120.635947,\n 36.597775\n ],\n [\n 120.643449,\n 36.613436\n ],\n [\n 120.644712,\n 36.626524\n ],\n [\n 120.657426,\n 36.626644\n ],\n [\n 120.660585,\n 36.647998\n ],\n [\n 120.648977,\n 36.655863\n ],\n [\n 120.652135,\n 36.663327\n ],\n [\n 120.642027,\n 36.666095\n ],\n [\n 120.627339,\n 36.659836\n ],\n [\n 120.625128,\n 36.671231\n ],\n [\n 120.631446,\n 36.673357\n ],\n [\n 120.619206,\n 36.681541\n ],\n [\n 120.616521,\n 36.689764\n ],\n [\n 120.589751,\n 36.694497\n ],\n [\n 120.586118,\n 36.698829\n ],\n [\n 120.596542,\n 36.708052\n ],\n [\n 120.58525,\n 36.728501\n ],\n [\n 120.584065,\n 36.735236\n ],\n [\n 120.562586,\n 36.736479\n ],\n [\n 120.560375,\n 36.742492\n ],\n [\n 120.546397,\n 36.744616\n ],\n [\n 120.544502,\n 36.76213\n ],\n [\n 120.540791,\n 36.7679\n ],\n [\n 120.5554,\n 36.778718\n ],\n [\n 120.56377,\n 36.795343\n ],\n [\n 120.563454,\n 36.802953\n ],\n [\n 120.590382,\n 36.801552\n ],\n [\n 120.601517,\n 36.804996\n ],\n [\n 120.612336,\n 36.829223\n ],\n [\n 120.609809,\n 36.832906\n ],\n [\n 120.589751,\n 36.838791\n ],\n [\n 120.58754,\n 36.843635\n ],\n [\n 120.595989,\n 36.852681\n ],\n [\n 120.588408,\n 36.859045\n ],\n [\n 120.57988,\n 36.858885\n ],\n [\n 120.576642,\n 36.879894\n ],\n [\n 120.592909,\n 36.882134\n ],\n [\n 120.622838,\n 36.890856\n ],\n [\n 120.622838,\n 36.907377\n ],\n [\n 120.617389,\n 36.911136\n ],\n [\n 120.592909,\n 36.912216\n ],\n [\n 120.574984,\n 36.927053\n ],\n [\n 120.571114,\n 36.948682\n ],\n [\n 120.563218,\n 36.95172\n ],\n [\n 120.560296,\n 36.960674\n ],\n [\n 120.566534,\n 36.96559\n ],\n [\n 120.568508,\n 36.983293\n ],\n [\n 120.574036,\n 36.987568\n ],\n [\n 120.575931,\n 36.999074\n ],\n [\n 120.582328,\n 37.001791\n ],\n [\n 120.593857,\n 36.991244\n ],\n [\n 120.606413,\n 37.001192\n ],\n [\n 120.601754,\n 37.012696\n ],\n [\n 120.613915,\n 37.023839\n ],\n [\n 120.606176,\n 37.047157\n ],\n [\n 120.586513,\n 37.048515\n ],\n [\n 120.58446,\n 37.058136\n ],\n [\n 120.570877,\n 37.046399\n ],\n [\n 120.558953,\n 37.047437\n ],\n [\n 120.549793,\n 37.041288\n ],\n [\n 120.541738,\n 37.044163\n ],\n [\n 120.533289,\n 37.053944\n ],\n [\n 120.539843,\n 37.060371\n ],\n [\n 120.536368,\n 37.081963\n ],\n [\n 120.547661,\n 37.113003\n ],\n [\n 120.542528,\n 37.128677\n ],\n [\n 120.527998,\n 37.136733\n ],\n [\n 120.527129,\n 37.143352\n ],\n [\n 120.517258,\n 37.148974\n ],\n [\n 120.506834,\n 37.148854\n ],\n [\n 120.505729,\n 37.143551\n ],\n [\n 120.493805,\n 37.1345\n ],\n [\n 120.493015,\n 37.126723\n ],\n [\n 120.478643,\n 37.124211\n ],\n [\n 120.462928,\n 37.115157\n ],\n [\n 120.440265,\n 37.122655\n ],\n [\n 120.439475,\n 37.116912\n ],\n [\n 120.415153,\n 37.110569\n ],\n [\n 120.407098,\n 37.112803\n ],\n [\n 120.412942,\n 37.103149\n ],\n [\n 120.408914,\n 37.09517\n ],\n [\n 120.398096,\n 37.096447\n ],\n [\n 120.388225,\n 37.104227\n ],\n [\n 120.369667,\n 37.104626\n ],\n [\n 120.362244,\n 37.100477\n ],\n [\n 120.357822,\n 37.084357\n ],\n [\n 120.348583,\n 37.077094\n ],\n [\n 120.34574,\n 37.087789\n ],\n [\n 120.336343,\n 37.092058\n ],\n [\n 120.336896,\n 37.104267\n ],\n [\n 120.331684,\n 37.111966\n ],\n [\n 120.320628,\n 37.10654\n ],\n [\n 120.315337,\n 37.113043\n ],\n [\n 120.300176,\n 37.119584\n ],\n [\n 120.303413,\n 37.130153\n ],\n [\n 120.280828,\n 37.13111\n ],\n [\n 120.264087,\n 37.114718\n ],\n [\n 120.245688,\n 37.118906\n ],\n [\n 120.236606,\n 37.125965\n ],\n [\n 120.231237,\n 37.106301\n ],\n [\n 120.229894,\n 37.089544\n ],\n [\n 120.220497,\n 37.08711\n ],\n [\n 120.214101,\n 37.07019\n ],\n [\n 120.21647,\n 37.056699\n ],\n [\n 120.205335,\n 37.038374\n ],\n [\n 120.193411,\n 37.034261\n ],\n [\n 120.189621,\n 37.038094\n ],\n [\n 120.180697,\n 37.032544\n ],\n [\n 120.173037,\n 37.034421\n ],\n [\n 120.166404,\n 37.025795\n ],\n [\n 120.167273,\n 37.017968\n ],\n [\n 120.159929,\n 37.013375\n ],\n [\n 120.142319,\n 37.015292\n ],\n [\n 120.138134,\n 37.022201\n ],\n [\n 120.123051,\n 37.01645\n ],\n [\n 120.101571,\n 37.014293\n ],\n [\n 120.09249,\n 37.017928\n ],\n [\n 120.049374,\n 37.020045\n ],\n [\n 120.035238,\n 36.998395\n ],\n [\n 120.024104,\n 36.999913\n ],\n [\n 120.002309,\n 37.013494\n ],\n [\n 119.993543,\n 37.012176\n ],\n [\n 119.980198,\n 37.018088\n ],\n [\n 119.975618,\n 37.011098\n ],\n [\n 119.961561,\n 37.013654\n ],\n [\n 119.949716,\n 37.006185\n ],\n [\n 119.939608,\n 37.004108\n ],\n [\n 119.923341,\n 36.993961\n ],\n [\n 119.902257,\n 36.9948\n ],\n [\n 119.900045,\n 36.997556\n ],\n [\n 119.85148,\n 37.002031\n ],\n [\n 119.829606,\n 37.002031\n ],\n [\n 119.820209,\n 36.999594\n ],\n [\n 119.804968,\n 37.013814\n ],\n [\n 119.771881,\n 37.006984\n ],\n [\n 119.769906,\n 36.996597\n ],\n [\n 119.750559,\n 36.990844\n ],\n [\n 119.743057,\n 36.992483\n ],\n [\n 119.731133,\n 36.988487\n ],\n [\n 119.722289,\n 36.993401\n ],\n [\n 119.716998,\n 37.007144\n ],\n [\n 119.681699,\n 36.998475\n ],\n [\n 119.66251,\n 37.008262\n ],\n [\n 119.629344,\n 37.01621\n ],\n [\n 119.61971,\n 37.012895\n ],\n [\n 119.619078,\n 37.017848\n ],\n [\n 119.60976,\n 37.013894\n ],\n [\n 119.613155,\n 37.034101\n ],\n [\n 119.606048,\n 37.04037\n ],\n [\n 119.563406,\n 37.058495\n ],\n [\n 119.559615,\n 37.071786\n ],\n [\n 119.576198,\n 37.087509\n ],\n [\n 119.568696,\n 37.100157\n ],\n [\n 119.576514,\n 37.127561\n ]\n ]\n ],\n [\n [\n [\n 121.508621,\n 37.55253\n ],\n [\n 121.50712,\n 37.556892\n ],\n [\n 121.520308,\n 37.565139\n ],\n [\n 121.526625,\n 37.562522\n ],\n [\n 121.508621,\n 37.55253\n ]\n ]\n ],\n [\n [\n [\n 120.728339,\n 37.92393\n ],\n [\n 120.725733,\n 37.928586\n ],\n [\n 120.721548,\n 37.931308\n ],\n [\n 120.722101,\n 37.94551\n ],\n [\n 120.732446,\n 37.948192\n ],\n [\n 120.737736,\n 37.955174\n ],\n [\n 120.746423,\n 37.951466\n ],\n [\n 120.758031,\n 37.929454\n ],\n [\n 120.765375,\n 37.922904\n ],\n [\n 120.759058,\n 37.911776\n ],\n [\n 120.764901,\n 37.896186\n ],\n [\n 120.760558,\n 37.890581\n ],\n [\n 120.753056,\n 37.894883\n ],\n [\n 120.740974,\n 37.908777\n ],\n [\n 120.727708,\n 37.909448\n ],\n [\n 120.721627,\n 37.917182\n ],\n [\n 120.728339,\n 37.92393\n ]\n ]\n ],\n [\n [\n [\n 120.692409,\n 37.983842\n ],\n [\n 120.685539,\n 37.991332\n ],\n [\n 120.697147,\n 37.995117\n ],\n [\n 120.71602,\n 37.987311\n ],\n [\n 120.724707,\n 37.987429\n ],\n [\n 120.730787,\n 37.974142\n ],\n [\n 120.736631,\n 37.971146\n ],\n [\n 120.732525,\n 37.961484\n ],\n [\n 120.706465,\n 37.966808\n ],\n [\n 120.696278,\n 37.974024\n ],\n [\n 120.692409,\n 37.983842\n ]\n ]\n ],\n [\n [\n [\n 120.653004,\n 37.980017\n ],\n [\n 120.658611,\n 37.975483\n ],\n [\n 120.653952,\n 37.963969\n ],\n [\n 120.64416,\n 37.964757\n ],\n [\n 120.653004,\n 37.980017\n ]\n ]\n ],\n [\n [\n [\n 120.452584,\n 37.768856\n ],\n [\n 120.443976,\n 37.770991\n ],\n [\n 120.435526,\n 37.786608\n ],\n [\n 120.453136,\n 37.788387\n ],\n [\n 120.463323,\n 37.786054\n ],\n [\n 120.452584,\n 37.768856\n ]\n ]\n ],\n [\n [\n [\n 120.682775,\n 37.92831\n ],\n [\n 120.673536,\n 37.929178\n ],\n [\n 120.679379,\n 37.937147\n ],\n [\n 120.678511,\n 37.944642\n ],\n [\n 120.692804,\n 37.94693\n ],\n [\n 120.687829,\n 37.931308\n ],\n [\n 120.682775,\n 37.92831\n ]\n ]\n ],\n [\n [\n [\n 120.750687,\n 38.150304\n ],\n [\n 120.73821,\n 38.161711\n ],\n [\n 120.738052,\n 38.174688\n ],\n [\n 120.742554,\n 38.198986\n ],\n [\n 120.747607,\n 38.202759\n ],\n [\n 120.753688,\n 38.195291\n ],\n [\n 120.760321,\n 38.176615\n ],\n [\n 120.777694,\n 38.172565\n ],\n [\n 120.787328,\n 38.158682\n ],\n [\n 120.771456,\n 38.156558\n ],\n [\n 120.760479,\n 38.15939\n ],\n [\n 120.750687,\n 38.150304\n ]\n ]\n ],\n [\n [\n [\n 120.91881,\n 38.34511\n ],\n [\n 120.90657,\n 38.349778\n ],\n [\n 120.895277,\n 38.363232\n ],\n [\n 120.900015,\n 38.3719\n ],\n [\n 120.91494,\n 38.373429\n ],\n [\n 120.913993,\n 38.364566\n ],\n [\n 120.921021,\n 38.362997\n ],\n [\n 120.914151,\n 38.354682\n ],\n [\n 120.91881,\n 38.34511\n ]\n ]\n ],\n [\n [\n [\n 120.841342,\n 38.335655\n ],\n [\n 120.842843,\n 38.355898\n ],\n [\n 120.85682,\n 38.343188\n ],\n [\n 120.841342,\n 38.335655\n ]\n ]\n ],\n [\n [\n [\n 120.62655,\n 37.945786\n ],\n [\n 120.604913,\n 37.956712\n ],\n [\n 120.598279,\n 37.970633\n ],\n [\n 120.60207,\n 37.97848\n ],\n [\n 120.614152,\n 37.984512\n ],\n [\n 120.632472,\n 37.978913\n ],\n [\n 120.630972,\n 37.952018\n ],\n [\n 120.62655,\n 37.945786\n ]\n ]\n ],\n [\n [\n [\n 120.903332,\n 38.381742\n ],\n [\n 120.898515,\n 38.386487\n ],\n [\n 120.91573,\n 38.401933\n ],\n [\n 120.931997,\n 38.391231\n ],\n [\n 120.931918,\n 38.382291\n ],\n [\n 120.922126,\n 38.385271\n ],\n [\n 120.903332,\n 38.381742\n ]\n ]\n ],\n [\n [\n [\n 120.802253,\n 38.284041\n ],\n [\n 120.797041,\n 38.288282\n ],\n [\n 120.808492,\n 38.311913\n ],\n [\n 120.816546,\n 38.318075\n ],\n [\n 120.835262,\n 38.320077\n ],\n [\n 120.849871,\n 38.310343\n ],\n [\n 120.84308,\n 38.30057\n ],\n [\n 120.82389,\n 38.297939\n ],\n [\n 120.81552,\n 38.288714\n ],\n [\n 120.802253,\n 38.284041\n ]\n ]\n ],\n [\n [\n [\n 120.943843,\n 38.019907\n ],\n [\n 120.932708,\n 38.026882\n ],\n [\n 120.931287,\n 38.035353\n ],\n [\n 120.94787,\n 38.032398\n ],\n [\n 120.951108,\n 38.02436\n ],\n [\n 120.943843,\n 38.019907\n ]\n ]\n ],\n [\n [\n [\n 119.821394,\n 37.309121\n ],\n [\n 119.818867,\n 37.31656\n ],\n [\n 119.825895,\n 37.315168\n ],\n [\n 119.821394,\n 37.309121\n ]\n ]\n ],\n [\n [\n [\n 121.388668,\n 36.266442\n ],\n [\n 121.391432,\n 36.271926\n ],\n [\n 121.396644,\n 36.264183\n ],\n [\n 121.388668,\n 36.266442\n ]\n ]\n ],\n [\n [\n [\n 120.645818,\n 38.132011\n ],\n [\n 120.637763,\n 38.139171\n ],\n [\n 120.640922,\n 38.148141\n ],\n [\n 120.647318,\n 38.149557\n ],\n [\n 120.653715,\n 38.141532\n ],\n [\n 120.645818,\n 38.132011\n ]\n ]\n ],\n [\n [\n [\n 120.878141,\n 38.026961\n ],\n [\n 120.87672,\n 38.018213\n ],\n [\n 120.872693,\n 38.027552\n ],\n [\n 120.878141,\n 38.026961\n ]\n ]\n ],\n [\n [\n [\n 120.645423,\n 38.05501\n ],\n [\n 120.641238,\n 38.061233\n ],\n [\n 120.644791,\n 38.06966\n ],\n [\n 120.652056,\n 38.069109\n ],\n [\n 120.652767,\n 38.058988\n ],\n [\n 120.645423,\n 38.05501\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 370700,\n \"name\": \"潍坊市\",\n \"center\": [\n 119.107078,\n 36.70925\n ],\n \"centroid\": [\n 119.077723,\n 36.554349\n ],\n \"childrenNum\": 12,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 370000\n },\n \"subFeatureIndex\": 6,\n \"acroutes\": [\n 100000,\n 370000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 118.467411,\n 36.945484\n ],\n [\n 118.47665,\n 36.957077\n ],\n [\n 118.503736,\n 36.95156\n ],\n [\n 118.503183,\n 36.944285\n ],\n [\n 118.524583,\n 36.945284\n ],\n [\n 118.52711,\n 36.939687\n ],\n [\n 118.537771,\n 36.936769\n ],\n [\n 118.55467,\n 36.938368\n ],\n [\n 118.560751,\n 36.946564\n ],\n [\n 118.557434,\n 36.96539\n ],\n [\n 118.559803,\n 36.977059\n ],\n [\n 118.552301,\n 36.979657\n ],\n [\n 118.553959,\n 37.000233\n ],\n [\n 118.564146,\n 36.99416\n ],\n [\n 118.580493,\n 36.994999\n ],\n [\n 118.566199,\n 36.999034\n ],\n [\n 118.571174,\n 37.004148\n ],\n [\n 118.590206,\n 37.001351\n ],\n [\n 118.583572,\n 37.008422\n ],\n [\n 118.588389,\n 37.017409\n ],\n [\n 118.57149,\n 37.022081\n ],\n [\n 118.545826,\n 37.023519\n ],\n [\n 118.545431,\n 37.038494\n ],\n [\n 118.56004,\n 37.041408\n ],\n [\n 118.557592,\n 37.051469\n ],\n [\n 118.561303,\n 37.063325\n ],\n [\n 118.580414,\n 37.063325\n ],\n [\n 118.591469,\n 37.068474\n ],\n [\n 118.610895,\n 37.063005\n ],\n [\n 118.631901,\n 37.066757\n ],\n [\n 118.632138,\n 37.070429\n ],\n [\n 118.654091,\n 37.076935\n ],\n [\n 118.655512,\n 37.082681\n ],\n [\n 118.665146,\n 37.081763\n ],\n [\n 118.668384,\n 37.091539\n ],\n [\n 118.667041,\n 37.11392\n ],\n [\n 118.673754,\n 37.144309\n ],\n [\n 118.653617,\n 37.149692\n ],\n [\n 118.649195,\n 37.164243\n ],\n [\n 118.64572,\n 37.159579\n ],\n [\n 118.634191,\n 37.163366\n ],\n [\n 118.633638,\n 37.171178\n ],\n [\n 118.645483,\n 37.178153\n ],\n [\n 118.649274,\n 37.189112\n ],\n [\n 118.660408,\n 37.187877\n ],\n [\n 118.668779,\n 37.198436\n ],\n [\n 118.672332,\n 37.215129\n ],\n [\n 118.680624,\n 37.229269\n ],\n [\n 118.709684,\n 37.241256\n ],\n [\n 118.728399,\n 37.252764\n ],\n [\n 118.777991,\n 37.280112\n ],\n [\n 118.821897,\n 37.288788\n ],\n [\n 118.856959,\n 37.293842\n ],\n [\n 119.039928,\n 37.304466\n ],\n [\n 119.045376,\n 37.298935\n ],\n [\n 119.052089,\n 37.276848\n ],\n [\n 119.054142,\n 37.254953\n ],\n [\n 119.066935,\n 37.241814\n ],\n [\n 119.084465,\n 37.239424\n ],\n [\n 119.091336,\n 37.257581\n ],\n [\n 119.108393,\n 37.260328\n ],\n [\n 119.128214,\n 37.254874\n ],\n [\n 119.134294,\n 37.263314\n ],\n [\n 119.135479,\n 37.282102\n ],\n [\n 119.139032,\n 37.288191\n ],\n [\n 119.157748,\n 37.288191\n ],\n [\n 119.16983,\n 37.278599\n ],\n [\n 119.166513,\n 37.27438\n ],\n [\n 119.15759,\n 37.281226\n ],\n [\n 119.142586,\n 37.279475\n ],\n [\n 119.141559,\n 37.262557\n ],\n [\n 119.128451,\n 37.235721\n ],\n [\n 119.136979,\n 37.231181\n ],\n [\n 119.20426,\n 37.280112\n ],\n [\n 119.212788,\n 37.273305\n ],\n [\n 119.190993,\n 37.259452\n ],\n [\n 119.191941,\n 37.254117\n ],\n [\n 119.202365,\n 37.253759\n ],\n [\n 119.204418,\n 37.246313\n ],\n [\n 119.194231,\n 37.221741\n ],\n [\n 119.191941,\n 37.197639\n ],\n [\n 119.205365,\n 37.194292\n ],\n [\n 119.204102,\n 37.21007\n ],\n [\n 119.206945,\n 37.223175\n ],\n [\n 119.222106,\n 37.225007\n ],\n [\n 119.232767,\n 37.221821\n ],\n [\n 119.244533,\n 37.211424\n ],\n [\n 119.261432,\n 37.207998\n ],\n [\n 119.282201,\n 37.21242\n ],\n [\n 119.296336,\n 37.20505\n ],\n [\n 119.298389,\n 37.19736\n ],\n [\n 119.291519,\n 37.177635\n ],\n [\n 119.291756,\n 37.164801\n ],\n [\n 119.297126,\n 37.158781\n ],\n [\n 119.299337,\n 37.142594\n ],\n [\n 119.30826,\n 37.136733\n ],\n [\n 119.320421,\n 37.120501\n ],\n [\n 119.329582,\n 37.115715\n ],\n [\n 119.342296,\n 37.11735\n ],\n [\n 119.351298,\n 37.122894\n ],\n [\n 119.36567,\n 37.126045\n ],\n [\n 119.425528,\n 37.125447\n ],\n [\n 119.445585,\n 37.130831\n ],\n [\n 119.489729,\n 37.13446\n ],\n [\n 119.489965,\n 37.142355\n ],\n [\n 119.479068,\n 37.153399\n ],\n [\n 119.481832,\n 37.155791\n ],\n [\n 119.493282,\n 37.143591\n ],\n [\n 119.493282,\n 37.133383\n ],\n [\n 119.503153,\n 37.128279\n ],\n [\n 119.51942,\n 37.130312\n ],\n [\n 119.576514,\n 37.127561\n ],\n [\n 119.568696,\n 37.100157\n ],\n [\n 119.576198,\n 37.087509\n ],\n [\n 119.559615,\n 37.071786\n ],\n [\n 119.563406,\n 37.058495\n ],\n [\n 119.606048,\n 37.04037\n ],\n [\n 119.613155,\n 37.034101\n ],\n [\n 119.60976,\n 37.013894\n ],\n [\n 119.604548,\n 36.996038\n ],\n [\n 119.598072,\n 36.989406\n ],\n [\n 119.5837,\n 36.950441\n ],\n [\n 119.599968,\n 36.920614\n ],\n [\n 119.599652,\n 36.878253\n ],\n [\n 119.597757,\n 36.857244\n ],\n [\n 119.56767,\n 36.805717\n ],\n [\n 119.563721,\n 36.802753\n ],\n [\n 119.550613,\n 36.80868\n ],\n [\n 119.539162,\n 36.799949\n ],\n [\n 119.539162,\n 36.787732\n ],\n [\n 119.532766,\n 36.78008\n ],\n [\n 119.530555,\n 36.765256\n ],\n [\n 119.534977,\n 36.743333\n ],\n [\n 119.547059,\n 36.725454\n ],\n [\n 119.561036,\n 36.720884\n ],\n [\n 119.567433,\n 36.713065\n ],\n [\n 119.579831,\n 36.711581\n ],\n [\n 119.587412,\n 36.696101\n ],\n [\n 119.596651,\n 36.689884\n ],\n [\n 119.607154,\n 36.667379\n ],\n [\n 119.61355,\n 36.66453\n ],\n [\n 119.617025,\n 36.652532\n ],\n [\n 119.625079,\n 36.638807\n ],\n [\n 119.651297,\n 36.623633\n ],\n [\n 119.670328,\n 36.616246\n ],\n [\n 119.681857,\n 36.606891\n ],\n [\n 119.701125,\n 36.602634\n ],\n [\n 119.730107,\n 36.581027\n ],\n [\n 119.72758,\n 36.562749\n ],\n [\n 119.74748,\n 36.571788\n ],\n [\n 119.755929,\n 36.565521\n ],\n [\n 119.784516,\n 36.554673\n ],\n [\n 119.798019,\n 36.551619\n ],\n [\n 119.826763,\n 36.54101\n ],\n [\n 119.917576,\n 36.525858\n ],\n [\n 119.920261,\n 36.522079\n ],\n [\n 119.923025,\n 36.495464\n ],\n [\n 119.936687,\n 36.496389\n ],\n [\n 119.936292,\n 36.511507\n ],\n [\n 119.951375,\n 36.519788\n ],\n [\n 119.971985,\n 36.522441\n ],\n [\n 119.974749,\n 36.515688\n ],\n [\n 119.997571,\n 36.504431\n ],\n [\n 120.010364,\n 36.509255\n ],\n [\n 120.004204,\n 36.489512\n ],\n [\n 120.010758,\n 36.484445\n ],\n [\n 120.004125,\n 36.477447\n ],\n [\n 120.006889,\n 36.468799\n ],\n [\n 120.012812,\n 36.467833\n ],\n [\n 120.011864,\n 36.454236\n ],\n [\n 119.996623,\n 36.446309\n ],\n [\n 119.994175,\n 36.450333\n ],\n [\n 119.968432,\n 36.450051\n ],\n [\n 119.953981,\n 36.444217\n ],\n [\n 119.949795,\n 36.446511\n ],\n [\n 119.935976,\n 36.427436\n ],\n [\n 119.933923,\n 36.42007\n ],\n [\n 119.925236,\n 36.419346\n ],\n [\n 119.926421,\n 36.403324\n ],\n [\n 119.941425,\n 36.39503\n ],\n [\n 119.945452,\n 36.384682\n ],\n [\n 119.936371,\n 36.380655\n ],\n [\n 119.93029,\n 36.385165\n ],\n [\n 119.909837,\n 36.384359\n ],\n [\n 119.90431,\n 36.38154\n ],\n [\n 119.904784,\n 36.369942\n ],\n [\n 119.895939,\n 36.34827\n ],\n [\n 119.896966,\n 36.334047\n ],\n [\n 119.891991,\n 36.318773\n ],\n [\n 119.865379,\n 36.308898\n ],\n [\n 119.862773,\n 36.302368\n ],\n [\n 119.854402,\n 36.302328\n ],\n [\n 119.848795,\n 36.292692\n ],\n [\n 119.83387,\n 36.278822\n ],\n [\n 119.82929,\n 36.258859\n ],\n [\n 119.820446,\n 36.257367\n ],\n [\n 119.82092,\n 36.244499\n ],\n [\n 119.808048,\n 36.232839\n ],\n [\n 119.819498,\n 36.211856\n ],\n [\n 119.828816,\n 36.210685\n ],\n [\n 119.823131,\n 36.19894\n ],\n [\n 119.831738,\n 36.180612\n ],\n [\n 119.82242,\n 36.177987\n ],\n [\n 119.821315,\n 36.171285\n ],\n [\n 119.81326,\n 36.175242\n ],\n [\n 119.813023,\n 36.167691\n ],\n [\n 119.792333,\n 36.171648\n ],\n [\n 119.782778,\n 36.165308\n ],\n [\n 119.772354,\n 36.167691\n ],\n [\n 119.748111,\n 36.158645\n ],\n [\n 119.733818,\n 36.163572\n ],\n [\n 119.732792,\n 36.172536\n ],\n [\n 119.723473,\n 36.175565\n ],\n [\n 119.691728,\n 36.176292\n ],\n [\n 119.681305,\n 36.18045\n ],\n [\n 119.671039,\n 36.177866\n ],\n [\n 119.660852,\n 36.154122\n ],\n [\n 119.649954,\n 36.137157\n ],\n [\n 119.651218,\n 36.130531\n ],\n [\n 119.643716,\n 36.127178\n ],\n [\n 119.657614,\n 36.108631\n ],\n [\n 119.657061,\n 36.100872\n ],\n [\n 119.632187,\n 36.091535\n ],\n [\n 119.633608,\n 36.067683\n ],\n [\n 119.666695,\n 36.062993\n ],\n [\n 119.675698,\n 36.064085\n ],\n [\n 119.695677,\n 36.053045\n ],\n [\n 119.704126,\n 36.055269\n ],\n [\n 119.717314,\n 36.044229\n ],\n [\n 119.706495,\n 36.028292\n ],\n [\n 119.681068,\n 36.012068\n ],\n [\n 119.689122,\n 36.000212\n ],\n [\n 119.684858,\n 35.982648\n ],\n [\n 119.690149,\n 35.963702\n ],\n [\n 119.701757,\n 35.944469\n ],\n [\n 119.701362,\n 35.923732\n ],\n [\n 119.716208,\n 35.927337\n ],\n [\n 119.721262,\n 35.906718\n ],\n [\n 119.727738,\n 35.902544\n ],\n [\n 119.738003,\n 35.873123\n ],\n [\n 119.736898,\n 35.86303\n ],\n [\n 119.72221,\n 35.865138\n ],\n [\n 119.725211,\n 35.856746\n ],\n [\n 119.71834,\n 35.853138\n ],\n [\n 119.704047,\n 35.863962\n ],\n [\n 119.68699,\n 35.861814\n ],\n [\n 119.676014,\n 35.842515\n ],\n [\n 119.664326,\n 35.841015\n ],\n [\n 119.649796,\n 35.845191\n ],\n [\n 119.629344,\n 35.833878\n ],\n [\n 119.622631,\n 35.816114\n ],\n [\n 119.612445,\n 35.812707\n ],\n [\n 119.60897,\n 35.799279\n ],\n [\n 119.617972,\n 35.789623\n ],\n [\n 119.611576,\n 35.776597\n ],\n [\n 119.596256,\n 35.773756\n ],\n [\n 119.591992,\n 35.753218\n ],\n [\n 119.605495,\n 35.747454\n ],\n [\n 119.627843,\n 35.722077\n ],\n [\n 119.624685,\n 35.712817\n ],\n [\n 119.614182,\n 35.716675\n ],\n [\n 119.601231,\n 35.709446\n ],\n [\n 119.588833,\n 35.715701\n ],\n [\n 119.576988,\n 35.71237\n ],\n [\n 119.566485,\n 35.714523\n ],\n [\n 119.560563,\n 35.721752\n ],\n [\n 119.545085,\n 35.726747\n ],\n [\n 119.527317,\n 35.723214\n ],\n [\n 119.525422,\n 35.730604\n ],\n [\n 119.504101,\n 35.752325\n ],\n [\n 119.48807,\n 35.754599\n ],\n [\n 119.48657,\n 35.771646\n ],\n [\n 119.496599,\n 35.779235\n ],\n [\n 119.493282,\n 35.789866\n ],\n [\n 119.482385,\n 35.799725\n ],\n [\n 119.464696,\n 35.80861\n ],\n [\n 119.455693,\n 35.809056\n ],\n [\n 119.444322,\n 35.804026\n ],\n [\n 119.427739,\n 35.802078\n ],\n [\n 119.397731,\n 35.786823\n ],\n [\n 119.390466,\n 35.778707\n ],\n [\n 119.375857,\n 35.770712\n ],\n [\n 119.368829,\n 35.770834\n ],\n [\n 119.374041,\n 35.816154\n ],\n [\n 119.372382,\n 35.830025\n ],\n [\n 119.358247,\n 35.84511\n ],\n [\n 119.371435,\n 35.860476\n ],\n [\n 119.360695,\n 35.884066\n ],\n [\n 119.345533,\n 35.893792\n ],\n [\n 119.315999,\n 35.887552\n ],\n [\n 119.298153,\n 35.893022\n ],\n [\n 119.294441,\n 35.911336\n ],\n [\n 119.281964,\n 35.910202\n ],\n [\n 119.240427,\n 35.884269\n ],\n [\n 119.217053,\n 35.879527\n ],\n [\n 119.190598,\n 35.879446\n ],\n [\n 119.169119,\n 35.894846\n ],\n [\n 119.161854,\n 35.894481\n ],\n [\n 119.158221,\n 35.882486\n ],\n [\n 119.135637,\n 35.892982\n ],\n [\n 119.144718,\n 35.904449\n ],\n [\n 119.151746,\n 35.905502\n ],\n [\n 119.169672,\n 35.91721\n ],\n [\n 119.183412,\n 35.91875\n ],\n [\n 119.179385,\n 35.926163\n ],\n [\n 119.182623,\n 35.962285\n ],\n [\n 119.178595,\n 35.97107\n ],\n [\n 119.155063,\n 35.965767\n ],\n [\n 119.153246,\n 35.971192\n ],\n [\n 119.134373,\n 35.968601\n ],\n [\n 119.121817,\n 35.962731\n ],\n [\n 119.088888,\n 35.963176\n ],\n [\n 119.07878,\n 35.959289\n ],\n [\n 119.066619,\n 35.963986\n ],\n [\n 119.060538,\n 35.978195\n ],\n [\n 119.05201,\n 35.9803\n ],\n [\n 119.021054,\n 35.977426\n ],\n [\n 119.015606,\n 35.995923\n ],\n [\n 119.024924,\n 36.003571\n ],\n [\n 119.023739,\n 36.011219\n ],\n [\n 119.014105,\n 36.013404\n ],\n [\n 119.017659,\n 36.024044\n ],\n [\n 119.024134,\n 36.02631\n ],\n [\n 119.035584,\n 36.02275\n ],\n [\n 119.047903,\n 36.024813\n ],\n [\n 119.052089,\n 36.037838\n ],\n [\n 119.040322,\n 36.042934\n ],\n [\n 119.042534,\n 36.055512\n ],\n [\n 119.049641,\n 36.066632\n ],\n [\n 119.063539,\n 36.075042\n ],\n [\n 119.066935,\n 36.081631\n ],\n [\n 119.048851,\n 36.092707\n ],\n [\n 119.038506,\n 36.090444\n ],\n [\n 119.020344,\n 36.104307\n ],\n [\n 119.013868,\n 36.09881\n ],\n [\n 119.000523,\n 36.099497\n ],\n [\n 118.988756,\n 36.092343\n ],\n [\n 118.970278,\n 36.09873\n ],\n [\n 118.970041,\n 36.104671\n ],\n [\n 118.958512,\n 36.104145\n ],\n [\n 118.954642,\n 36.1115\n ],\n [\n 118.943271,\n 36.119582\n ],\n [\n 118.936322,\n 36.11344\n ],\n [\n 118.916185,\n 36.111702\n ],\n [\n 118.920765,\n 36.105721\n ],\n [\n 118.908288,\n 36.091292\n ],\n [\n 118.886493,\n 36.088584\n ],\n [\n 118.880886,\n 36.08438\n ],\n [\n 118.875911,\n 36.091535\n ],\n [\n 118.860513,\n 36.101316\n ],\n [\n 118.865961,\n 36.113682\n ],\n [\n 118.860197,\n 36.114733\n ],\n [\n 118.858302,\n 36.129966\n ],\n [\n 118.863908,\n 36.139298\n ],\n [\n 118.858302,\n 36.143256\n ],\n [\n 118.859802,\n 36.16232\n ],\n [\n 118.85459,\n 36.170194\n ],\n [\n 118.846614,\n 36.172092\n ],\n [\n 118.844561,\n 36.18473\n ],\n [\n 118.848746,\n 36.188606\n ],\n [\n 118.847009,\n 36.199263\n ],\n [\n 118.835796,\n 36.203138\n ],\n [\n 118.809026,\n 36.198738\n ],\n [\n 118.802076,\n 36.202855\n ],\n [\n 118.78573,\n 36.197487\n ],\n [\n 118.766383,\n 36.206649\n ],\n [\n 118.745535,\n 36.191754\n ],\n [\n 118.751142,\n 36.183115\n ],\n [\n 118.741824,\n 36.165551\n ],\n [\n 118.733532,\n 36.166802\n ],\n [\n 118.73298,\n 36.1519\n ],\n [\n 118.736454,\n 36.146528\n ],\n [\n 118.72603,\n 36.141035\n ],\n [\n 118.714659,\n 36.154485\n ],\n [\n 118.703761,\n 36.150446\n ],\n [\n 118.701235,\n 36.144509\n ],\n [\n 118.679913,\n 36.152062\n ],\n [\n 118.683388,\n 36.158564\n ],\n [\n 118.675491,\n 36.170194\n ],\n [\n 118.666015,\n 36.168983\n ],\n [\n 118.653143,\n 36.176695\n ],\n [\n 118.644299,\n 36.177018\n ],\n [\n 118.640824,\n 36.171042\n ],\n [\n 118.622109,\n 36.17718\n ],\n [\n 118.606236,\n 36.164218\n ],\n [\n 118.581914,\n 36.151456\n ],\n [\n 118.572201,\n 36.156424\n ],\n [\n 118.563988,\n 36.147094\n ],\n [\n 118.565015,\n 36.130087\n ],\n [\n 118.556881,\n 36.130935\n ],\n [\n 118.541719,\n 36.124996\n ],\n [\n 118.535797,\n 36.118531\n ],\n [\n 118.515502,\n 36.109884\n ],\n [\n 118.509974,\n 36.114612\n ],\n [\n 118.504762,\n 36.105802\n ],\n [\n 118.526716,\n 36.104671\n ],\n [\n 118.529479,\n 36.093879\n ],\n [\n 118.522925,\n 36.084784\n ],\n [\n 118.507842,\n 36.074961\n ],\n [\n 118.496866,\n 36.067683\n ],\n [\n 118.48044,\n 36.074071\n ],\n [\n 118.482099,\n 36.092546\n ],\n [\n 118.478545,\n 36.098245\n ],\n [\n 118.484468,\n 36.104064\n ],\n [\n 118.479493,\n 36.118814\n ],\n [\n 118.492601,\n 36.127057\n ],\n [\n 118.487863,\n 36.131784\n ],\n [\n 118.462594,\n 36.14059\n ],\n [\n 118.457303,\n 36.13247\n ],\n [\n 118.447116,\n 36.140913\n ],\n [\n 118.440956,\n 36.132511\n ],\n [\n 118.428953,\n 36.132672\n ],\n [\n 118.412844,\n 36.127218\n ],\n [\n 118.402183,\n 36.131622\n ],\n [\n 118.405263,\n 36.141641\n ],\n [\n 118.402262,\n 36.162926\n ],\n [\n 118.387653,\n 36.174555\n ],\n [\n 118.374387,\n 36.203097\n ],\n [\n 118.382046,\n 36.207335\n ],\n [\n 118.386548,\n 36.239053\n ],\n [\n 118.379756,\n 36.245265\n ],\n [\n 118.368385,\n 36.248412\n ],\n [\n 118.350775,\n 36.263538\n ],\n [\n 118.31524,\n 36.24938\n ],\n [\n 118.306948,\n 36.252123\n ],\n [\n 118.315003,\n 36.266361\n ],\n [\n 118.31366,\n 36.277371\n ],\n [\n 118.317609,\n 36.288903\n ],\n [\n 118.310107,\n 36.295716\n ],\n [\n 118.315477,\n 36.304464\n ],\n [\n 118.30908,\n 36.307125\n ],\n [\n 118.304105,\n 36.321393\n ],\n [\n 118.291075,\n 36.326189\n ],\n [\n 118.300157,\n 36.338116\n ],\n [\n 118.269912,\n 36.339849\n ],\n [\n 118.261857,\n 36.345852\n ],\n [\n 118.262726,\n 36.352218\n ],\n [\n 118.256093,\n 36.363175\n ],\n [\n 118.239825,\n 36.376748\n ],\n [\n 118.235403,\n 36.389634\n ],\n [\n 118.251592,\n 36.401995\n ],\n [\n 118.250407,\n 36.411214\n ],\n [\n 118.227427,\n 36.408034\n ],\n [\n 118.224427,\n 36.414234\n ],\n [\n 118.228533,\n 36.430736\n ],\n [\n 118.232797,\n 36.432869\n ],\n [\n 118.22719,\n 36.451379\n ],\n [\n 118.233508,\n 36.456609\n ],\n [\n 118.229638,\n 36.467793\n ],\n [\n 118.216135,\n 36.478573\n ],\n [\n 118.212818,\n 36.490075\n ],\n [\n 118.218346,\n 36.497354\n ],\n [\n 118.210528,\n 36.503466\n ],\n [\n 118.213766,\n 36.513075\n ],\n [\n 118.210844,\n 36.526099\n ],\n [\n 118.221663,\n 36.531887\n ],\n [\n 118.214556,\n 36.539322\n ],\n [\n 118.191892,\n 36.546074\n ],\n [\n 118.183916,\n 36.561142\n ],\n [\n 118.180915,\n 36.5607\n ],\n [\n 118.180678,\n 36.577412\n ],\n [\n 118.176967,\n 36.582996\n ],\n [\n 118.180363,\n 36.593599\n ],\n [\n 118.189523,\n 36.599141\n ],\n [\n 118.200657,\n 36.612071\n ],\n [\n 118.214793,\n 36.621144\n ],\n [\n 118.20658,\n 36.637482\n ],\n [\n 118.199631,\n 36.639047\n ],\n [\n 118.215898,\n 36.648921\n ],\n [\n 118.221189,\n 36.664169\n ],\n [\n 118.230191,\n 36.660357\n ],\n [\n 118.226796,\n 36.668382\n ],\n [\n 118.215819,\n 36.668262\n ],\n [\n 118.21653,\n 36.6811\n ],\n [\n 118.228059,\n 36.694016\n ],\n [\n 118.245037,\n 36.690647\n ],\n [\n 118.238246,\n 36.697305\n ],\n [\n 118.227585,\n 36.697625\n ],\n [\n 118.237614,\n 36.712704\n ],\n [\n 118.227743,\n 36.717957\n ],\n [\n 118.234219,\n 36.726457\n ],\n [\n 118.254276,\n 36.731789\n ],\n [\n 118.264147,\n 36.72373\n ],\n [\n 118.277019,\n 36.719801\n ],\n [\n 118.284363,\n 36.72337\n ],\n [\n 118.276151,\n 36.731749\n ],\n [\n 118.27157,\n 36.744015\n ],\n [\n 118.279546,\n 36.753033\n ],\n [\n 118.298183,\n 36.753914\n ],\n [\n 118.297788,\n 36.777677\n ],\n [\n 118.307501,\n 36.776234\n ],\n [\n 118.318161,\n 36.77972\n ],\n [\n 118.321636,\n 36.770905\n ],\n [\n 118.350222,\n 36.768301\n ],\n [\n 118.388522,\n 36.791217\n ],\n [\n 118.419872,\n 36.796304\n ],\n [\n 118.424531,\n 36.802673\n ],\n [\n 118.438666,\n 36.809682\n ],\n [\n 118.44072,\n 36.828142\n ],\n [\n 118.435508,\n 36.838391\n ],\n [\n 118.450038,\n 36.83747\n ],\n [\n 118.453828,\n 36.857564\n ],\n [\n 118.461488,\n 36.854322\n ],\n [\n 118.460462,\n 36.846597\n ],\n [\n 118.480993,\n 36.852641\n ],\n [\n 118.479967,\n 36.860166\n ],\n [\n 118.465042,\n 36.861366\n ],\n [\n 118.476966,\n 36.876893\n ],\n [\n 118.482809,\n 36.879214\n ],\n [\n 118.483046,\n 36.900777\n ],\n [\n 118.474913,\n 36.905297\n ],\n [\n 118.481862,\n 36.914136\n ],\n [\n 118.48968,\n 36.914096\n ],\n [\n 118.496708,\n 36.924733\n ],\n [\n 118.492365,\n 36.931611\n ],\n [\n 118.494339,\n 36.941846\n ],\n [\n 118.467411,\n 36.945484\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 370800,\n \"name\": \"济宁市\",\n \"center\": [\n 116.587245,\n 35.415393\n ],\n \"centroid\": [\n 116.74105,\n 35.371092\n ],\n \"childrenNum\": 11,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 370000\n },\n \"subFeatureIndex\": 7,\n \"acroutes\": [\n 100000,\n 370000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 117.392342,\n 34.574909\n ],\n [\n 117.363045,\n 34.589241\n ],\n [\n 117.357991,\n 34.582693\n ],\n [\n 117.344014,\n 34.582075\n ],\n [\n 117.325378,\n 34.570996\n ],\n [\n 117.333037,\n 34.56177\n ],\n [\n 117.32135,\n 34.565436\n ],\n [\n 117.294264,\n 34.554025\n ],\n [\n 117.30303,\n 34.548999\n ],\n [\n 117.302477,\n 34.541253\n ],\n [\n 117.285341,\n 34.533012\n ],\n [\n 117.268047,\n 34.532806\n ],\n [\n 117.27547,\n 34.520113\n ],\n [\n 117.269705,\n 34.511664\n ],\n [\n 117.274364,\n 34.503544\n ],\n [\n 117.259282,\n 34.49736\n ],\n [\n 117.267494,\n 34.480003\n ],\n [\n 117.263625,\n 34.472622\n ],\n [\n 117.256044,\n 34.476292\n ],\n [\n 117.252332,\n 34.486518\n ],\n [\n 117.242698,\n 34.478519\n ],\n [\n 117.255096,\n 34.472539\n ],\n [\n 117.255886,\n 34.462023\n ],\n [\n 117.24791,\n 34.451052\n ],\n [\n 117.234644,\n 34.454476\n ],\n [\n 117.222325,\n 34.450599\n ],\n [\n 117.222088,\n 34.445731\n ],\n [\n 117.200214,\n 34.441606\n ],\n [\n 117.199503,\n 34.43451\n ],\n [\n 117.166099,\n 34.434675\n ],\n [\n 117.159861,\n 34.453115\n ],\n [\n 117.156623,\n 34.48091\n ],\n [\n 117.145963,\n 34.503956\n ],\n [\n 117.139803,\n 34.522875\n ],\n [\n 117.140593,\n 34.538699\n ],\n [\n 117.151253,\n 34.559257\n ],\n [\n 117.147621,\n 34.570255\n ],\n [\n 117.133486,\n 34.58607\n ],\n [\n 117.123694,\n 34.604682\n ],\n [\n 117.115244,\n 34.628146\n ],\n [\n 117.103952,\n 34.64897\n ],\n [\n 117.095897,\n 34.64753\n ],\n [\n 117.081525,\n 34.638188\n ],\n [\n 117.072996,\n 34.639094\n ],\n [\n 117.062336,\n 34.657735\n ],\n [\n 117.061704,\n 34.675713\n ],\n [\n 117.072049,\n 34.694181\n ],\n [\n 117.07734,\n 34.696484\n ],\n [\n 117.069048,\n 34.708287\n ],\n [\n 117.070469,\n 34.713714\n ],\n [\n 117.061151,\n 34.723993\n ],\n [\n 117.043225,\n 34.736531\n ],\n [\n 117.021904,\n 34.759219\n ],\n [\n 116.995687,\n 34.758274\n ],\n [\n 116.989685,\n 34.765136\n ],\n [\n 116.978472,\n 34.763616\n ],\n [\n 116.976814,\n 34.771259\n ],\n [\n 116.96789,\n 34.772984\n ],\n [\n 116.965837,\n 34.785063\n ],\n [\n 116.951623,\n 34.794553\n ],\n [\n 116.951149,\n 34.810571\n ],\n [\n 116.971681,\n 34.811885\n ],\n [\n 116.979183,\n 34.814966\n ],\n [\n 116.966074,\n 34.844487\n ],\n [\n 116.92888,\n 34.842886\n ],\n [\n 116.930144,\n 34.859675\n ],\n [\n 116.936303,\n 34.865093\n ],\n [\n 116.951465,\n 34.864313\n ],\n [\n 116.976892,\n 34.868541\n ],\n [\n 116.966943,\n 34.875599\n ],\n [\n 116.945226,\n 34.876789\n ],\n [\n 116.945305,\n 34.873794\n ],\n [\n 116.922168,\n 34.871413\n ],\n [\n 116.922326,\n 34.894515\n ],\n [\n 116.89903,\n 34.904689\n ],\n [\n 116.876129,\n 34.912524\n ],\n [\n 116.858125,\n 34.928355\n ],\n [\n 116.822115,\n 34.929299\n ],\n [\n 116.815877,\n 34.965298\n ],\n [\n 116.80877,\n 34.968823\n ],\n [\n 116.812166,\n 34.927945\n ],\n [\n 116.803874,\n 34.928314\n ],\n [\n 116.803716,\n 34.970339\n ],\n [\n 116.789107,\n 34.975094\n ],\n [\n 116.789107,\n 34.959804\n ],\n [\n 116.781605,\n 34.961895\n ],\n [\n 116.785474,\n 34.9473\n ],\n [\n 116.796925,\n 34.944143\n ],\n [\n 116.797635,\n 34.938771\n ],\n [\n 116.786975,\n 34.940453\n ],\n [\n 116.78121,\n 34.916585\n ],\n [\n 116.756572,\n 34.917487\n ],\n [\n 116.74599,\n 34.915764\n ],\n [\n 116.74528,\n 34.920973\n ],\n [\n 116.720405,\n 34.926141\n ],\n [\n 116.706191,\n 34.933974\n ],\n [\n 116.696951,\n 34.932743\n ],\n [\n 116.677999,\n 34.939182\n ],\n [\n 116.675709,\n 34.933154\n ],\n [\n 116.658415,\n 34.933441\n ],\n [\n 116.657862,\n 34.929012\n ],\n [\n 116.640016,\n 34.932579\n ],\n [\n 116.631803,\n 34.94074\n ],\n [\n 116.622485,\n 34.940043\n ],\n [\n 116.613877,\n 34.922778\n ],\n [\n 116.5601,\n 34.909324\n ],\n [\n 116.546123,\n 34.909406\n ],\n [\n 116.523064,\n 34.903951\n ],\n [\n 116.502769,\n 34.906125\n ],\n [\n 116.500558,\n 34.90112\n ],\n [\n 116.480737,\n 34.897387\n ],\n [\n 116.455784,\n 34.900628\n ],\n [\n 116.445044,\n 34.895418\n ],\n [\n 116.445281,\n 34.888648\n ],\n [\n 116.436042,\n 34.883026\n ],\n [\n 116.409745,\n 34.852944\n ],\n [\n 116.373815,\n 34.86538\n ],\n [\n 116.339543,\n 34.867022\n ],\n [\n 116.325803,\n 34.874943\n ],\n [\n 116.299032,\n 34.877733\n ],\n [\n 116.286713,\n 34.88159\n ],\n [\n 116.266261,\n 34.89751\n ],\n [\n 116.226935,\n 34.911786\n ],\n [\n 116.213826,\n 34.913098\n ],\n [\n 116.201586,\n 34.919702\n ],\n [\n 116.192505,\n 34.939182\n ],\n [\n 116.162181,\n 34.94361\n ],\n [\n 116.155153,\n 34.947259\n ],\n [\n 116.162023,\n 34.957632\n ],\n [\n 116.171499,\n 34.964683\n ],\n [\n 116.170789,\n 34.974684\n ],\n [\n 116.139754,\n 34.995421\n ],\n [\n 116.115748,\n 35.025574\n ],\n [\n 116.114564,\n 35.039828\n ],\n [\n 116.119381,\n 35.053383\n ],\n [\n 116.141413,\n 35.055062\n ],\n [\n 116.140228,\n 35.06018\n ],\n [\n 116.15389,\n 35.088467\n ],\n [\n 116.141018,\n 35.09076\n ],\n [\n 116.154284,\n 35.113513\n ],\n [\n 116.181765,\n 35.11204\n ],\n [\n 116.204903,\n 35.145668\n ],\n [\n 116.214537,\n 35.155606\n ],\n [\n 116.223618,\n 35.173231\n ],\n [\n 116.221881,\n 35.181817\n ],\n [\n 116.213115,\n 35.196697\n ],\n [\n 116.228356,\n 35.194367\n ],\n [\n 116.234516,\n 35.200008\n ],\n [\n 116.234437,\n 35.208264\n ],\n [\n 116.248256,\n 35.195634\n ],\n [\n 116.269104,\n 35.191178\n ],\n [\n 116.284265,\n 35.22506\n ],\n [\n 116.285608,\n 35.242669\n ],\n [\n 116.269656,\n 35.269872\n ],\n [\n 116.265866,\n 35.271547\n ],\n [\n 116.237201,\n 35.261745\n ],\n [\n 116.223539,\n 35.260438\n ],\n [\n 116.215642,\n 35.29131\n ],\n [\n 116.199612,\n 35.304986\n ],\n [\n 116.193452,\n 35.337555\n ],\n [\n 116.201744,\n 35.345185\n ],\n [\n 116.215169,\n 35.350734\n ],\n [\n 116.22117,\n 35.358608\n ],\n [\n 116.223855,\n 35.371702\n ],\n [\n 116.215879,\n 35.393438\n ],\n [\n 116.212642,\n 35.409054\n ],\n [\n 116.215958,\n 35.419857\n ],\n [\n 116.215484,\n 35.435957\n ],\n [\n 116.204429,\n 35.436079\n ],\n [\n 116.20206,\n 35.458247\n ],\n [\n 116.206798,\n 35.465703\n ],\n [\n 116.19669,\n 35.46334\n ],\n [\n 116.188319,\n 35.467781\n ],\n [\n 116.188319,\n 35.477313\n ],\n [\n 116.177817,\n 35.466151\n ],\n [\n 116.178685,\n 35.450342\n ],\n [\n 116.167946,\n 35.452217\n ],\n [\n 116.15689,\n 35.446838\n ],\n [\n 116.160918,\n 35.471569\n ],\n [\n 116.15002,\n 35.469573\n ],\n [\n 116.129567,\n 35.475235\n ],\n [\n 116.128778,\n 35.489614\n ],\n [\n 116.121276,\n 35.497881\n ],\n [\n 116.12554,\n 35.516042\n ],\n [\n 116.123408,\n 35.540589\n ],\n [\n 116.115274,\n 35.566471\n ],\n [\n 116.114327,\n 35.577456\n ],\n [\n 116.125145,\n 35.587871\n ],\n [\n 116.125145,\n 35.59385\n ],\n [\n 116.116222,\n 35.606621\n ],\n [\n 116.115906,\n 35.618414\n ],\n [\n 116.134384,\n 35.638539\n ],\n [\n 116.127514,\n 35.649433\n ],\n [\n 116.121829,\n 35.67459\n ],\n [\n 116.103034,\n 35.687348\n ],\n [\n 116.089847,\n 35.699373\n ],\n [\n 116.079897,\n 35.712452\n ],\n [\n 116.071052,\n 35.719072\n ],\n [\n 116.041518,\n 35.733893\n ],\n [\n 116.026909,\n 35.749687\n ],\n [\n 116.017591,\n 35.756263\n ],\n [\n 115.970289,\n 35.782156\n ],\n [\n 115.945493,\n 35.791976\n ],\n [\n 115.922119,\n 35.799157\n ],\n [\n 115.925988,\n 35.804756\n ],\n [\n 115.911932,\n 35.811733\n ],\n [\n 115.898192,\n 35.805202\n ],\n [\n 115.883583,\n 35.808163\n ],\n [\n 115.877107,\n 35.820657\n ],\n [\n 115.875212,\n 35.835095\n ],\n [\n 115.876002,\n 35.867124\n ],\n [\n 115.876081,\n 35.875069\n ],\n [\n 115.882872,\n 35.879892\n ],\n [\n 115.883267,\n 35.895413\n ],\n [\n 115.88911,\n 35.897561\n ],\n [\n 115.884767,\n 35.909108\n ],\n [\n 115.872369,\n 35.909351\n ],\n [\n 115.875133,\n 35.920168\n ],\n [\n 115.907826,\n 35.926851\n ],\n [\n 115.909958,\n 35.935762\n ],\n [\n 115.906325,\n 35.9454\n ],\n [\n 115.911853,\n 35.960261\n ],\n [\n 115.957654,\n 35.967994\n ],\n [\n 115.985135,\n 35.974107\n ],\n [\n 116.00006,\n 35.974349\n ],\n [\n 116.036069,\n 35.96771\n ],\n [\n 116.048704,\n 35.970301\n ],\n [\n 116.0506,\n 35.981919\n ],\n [\n 116.061892,\n 35.97358\n ],\n [\n 116.065367,\n 35.964714\n ],\n [\n 116.060392,\n 35.956374\n ],\n [\n 116.048704,\n 35.948114\n ],\n [\n 116.05897,\n 35.936167\n ],\n [\n 116.07279,\n 35.940055\n ],\n [\n 116.074606,\n 35.927459\n ],\n [\n 116.086767,\n 35.923246\n ],\n [\n 116.081634,\n 35.914172\n ],\n [\n 116.09261,\n 35.904935\n ],\n [\n 116.126172,\n 35.891037\n ],\n [\n 116.142834,\n 35.895656\n ],\n [\n 116.154284,\n 35.886012\n ],\n [\n 116.161155,\n 35.900397\n ],\n [\n 116.166998,\n 35.90457\n ],\n [\n 116.185398,\n 35.900478\n ],\n [\n 116.190057,\n 35.892536\n ],\n [\n 116.20814,\n 35.886863\n ],\n [\n 116.214774,\n 35.889659\n ],\n [\n 116.218485,\n 35.879811\n ],\n [\n 116.221091,\n 35.892779\n ],\n [\n 116.233963,\n 35.888403\n ],\n [\n 116.230804,\n 35.860963\n ],\n [\n 116.233963,\n 35.851273\n ],\n [\n 116.245808,\n 35.834162\n ],\n [\n 116.250072,\n 35.823536\n ],\n [\n 116.274868,\n 35.803377\n ],\n [\n 116.277395,\n 35.806581\n ],\n [\n 116.304007,\n 35.799401\n ],\n [\n 116.297295,\n 35.795546\n ],\n [\n 116.301875,\n 35.777084\n ],\n [\n 116.309377,\n 35.77404\n ],\n [\n 116.32983,\n 35.787594\n ],\n [\n 116.336621,\n 35.796723\n ],\n [\n 116.355652,\n 35.800537\n ],\n [\n 116.362838,\n 35.795952\n ],\n [\n 116.377921,\n 35.796642\n ],\n [\n 116.385581,\n 35.801754\n ],\n [\n 116.400822,\n 35.794613\n ],\n [\n 116.421196,\n 35.799279\n ],\n [\n 116.428698,\n 35.796398\n ],\n [\n 116.436989,\n 35.807271\n ],\n [\n 116.459811,\n 35.81583\n ],\n [\n 116.459732,\n 35.828241\n ],\n [\n 116.468024,\n 35.836149\n ],\n [\n 116.475841,\n 35.83327\n ],\n [\n 116.486976,\n 35.84138\n ],\n [\n 116.507508,\n 35.84361\n ],\n [\n 116.515325,\n 35.841866\n ],\n [\n 116.520616,\n 35.853057\n ],\n [\n 116.525275,\n 35.847462\n ],\n [\n 116.53641,\n 35.847178\n ],\n [\n 116.549834,\n 35.857517\n ],\n [\n 116.55702,\n 35.890753\n ],\n [\n 116.566023,\n 35.899222\n ],\n [\n 116.595715,\n 35.905056\n ],\n [\n 116.599663,\n 35.916157\n ],\n [\n 116.618536,\n 35.935195\n ],\n [\n 116.62817,\n 35.938556\n ],\n [\n 116.665996,\n 35.940176\n ],\n [\n 116.676973,\n 35.925596\n ],\n [\n 116.672392,\n 35.92118\n ],\n [\n 116.666944,\n 35.898209\n ],\n [\n 116.647518,\n 35.884674\n ],\n [\n 116.62438,\n 35.878068\n ],\n [\n 116.614904,\n 35.865746\n ],\n [\n 116.617036,\n 35.855206\n ],\n [\n 116.641042,\n 35.836879\n ],\n [\n 116.656441,\n 35.828525\n ],\n [\n 116.676736,\n 35.822198\n ],\n [\n 116.686607,\n 35.814005\n ],\n [\n 116.687317,\n 35.798062\n ],\n [\n 116.670497,\n 35.761499\n ],\n [\n 116.662679,\n 35.758252\n ],\n [\n 116.636699,\n 35.764137\n ],\n [\n 116.619563,\n 35.756628\n ],\n [\n 116.614588,\n 35.74924\n ],\n [\n 116.612061,\n 35.71237\n ],\n [\n 116.615615,\n 35.705222\n ],\n [\n 116.627539,\n 35.705791\n ],\n [\n 116.648939,\n 35.713426\n ],\n [\n 116.664969,\n 35.716716\n ],\n [\n 116.68866,\n 35.724838\n ],\n [\n 116.698847,\n 35.72098\n ],\n [\n 116.705322,\n 35.70839\n ],\n [\n 116.733829,\n 35.703435\n ],\n [\n 116.743069,\n 35.703597\n ],\n [\n 116.743069,\n 35.703597\n ],\n [\n 116.762732,\n 35.708309\n ],\n [\n 116.770076,\n 35.703557\n ],\n [\n 116.77742,\n 35.690882\n ],\n [\n 116.795345,\n 35.682188\n ],\n [\n 116.8049,\n 35.686292\n ],\n [\n 116.811376,\n 35.706034\n ],\n [\n 116.8218,\n 35.705222\n ],\n [\n 116.8233,\n 35.696935\n ],\n [\n 116.836882,\n 35.697382\n ],\n [\n 116.861994,\n 35.679059\n ],\n [\n 116.879367,\n 35.685479\n ],\n [\n 116.88071,\n 35.696732\n ],\n [\n 116.897135,\n 35.701851\n ],\n [\n 116.909849,\n 35.699982\n ],\n [\n 116.91814,\n 35.706278\n ],\n [\n 116.930538,\n 35.709406\n ],\n [\n 116.931012,\n 35.713629\n ],\n [\n 116.949649,\n 35.715741\n ],\n [\n 116.954939,\n 35.719072\n ],\n [\n 116.952412,\n 35.737507\n ],\n [\n 116.946253,\n 35.744368\n ],\n [\n 116.952412,\n 35.7561\n ],\n [\n 116.974366,\n 35.760444\n ],\n [\n 116.993397,\n 35.794045\n ],\n [\n 116.991423,\n 35.805973\n ],\n [\n 117.009506,\n 35.807636\n ],\n [\n 117.0268,\n 35.799401\n ],\n [\n 117.049622,\n 35.801307\n ],\n [\n 117.070864,\n 35.790394\n ],\n [\n 117.083815,\n 35.80431\n ],\n [\n 117.097318,\n 35.802687\n ],\n [\n 117.103241,\n 35.790272\n ],\n [\n 117.131275,\n 35.786498\n ],\n [\n 117.137908,\n 35.783374\n ],\n [\n 117.135855,\n 35.774811\n ],\n [\n 117.128353,\n 35.769901\n ],\n [\n 117.135381,\n 35.767303\n ],\n [\n 117.143436,\n 35.771727\n ],\n [\n 117.163651,\n 35.775014\n ],\n [\n 117.175023,\n 35.780209\n ],\n [\n 117.200214,\n 35.775095\n ],\n [\n 117.21806,\n 35.778464\n ],\n [\n 117.226984,\n 35.773959\n ],\n [\n 117.260308,\n 35.771037\n ],\n [\n 117.297581,\n 35.788487\n ],\n [\n 117.306504,\n 35.798833\n ],\n [\n 117.318428,\n 35.793802\n ],\n [\n 117.341013,\n 35.793558\n ],\n [\n 117.343382,\n 35.784267\n ],\n [\n 117.350331,\n 35.782725\n ],\n [\n 117.364467,\n 35.770225\n ],\n [\n 117.379155,\n 35.775785\n ],\n [\n 117.391,\n 35.767141\n ],\n [\n 117.415559,\n 35.775177\n ],\n [\n 117.431195,\n 35.760971\n ],\n [\n 117.440197,\n 35.744571\n ],\n [\n 117.452832,\n 35.742298\n ],\n [\n 117.478733,\n 35.732675\n ],\n [\n 117.488683,\n 35.721102\n ],\n [\n 117.49121,\n 35.707903\n ],\n [\n 117.511031,\n 35.712411\n ],\n [\n 117.530931,\n 35.707131\n ],\n [\n 117.520586,\n 35.697626\n ],\n [\n 117.529431,\n 35.682879\n ],\n [\n 117.576022,\n 35.650206\n ],\n [\n 117.596948,\n 35.630449\n ],\n [\n 117.588893,\n 35.619878\n ],\n [\n 117.585577,\n 35.593972\n ],\n [\n 117.592763,\n 35.589701\n ],\n [\n 117.590394,\n 35.573551\n ],\n [\n 117.593473,\n 35.567448\n ],\n [\n 117.582418,\n 35.554141\n ],\n [\n 117.528641,\n 35.547182\n ],\n [\n 117.515058,\n 35.551008\n ],\n [\n 117.499502,\n 35.550845\n ],\n [\n 117.496264,\n 35.543031\n ],\n [\n 117.50424,\n 35.531675\n ],\n [\n 117.516401,\n 35.527319\n ],\n [\n 117.520033,\n 35.51991\n ],\n [\n 117.513795,\n 35.514576\n ],\n [\n 117.501634,\n 35.512947\n ],\n [\n 117.498396,\n 35.503093\n ],\n [\n 117.481734,\n 35.507898\n ],\n [\n 117.472416,\n 35.514372\n ],\n [\n 117.467441,\n 35.512255\n ],\n [\n 117.462703,\n 35.497922\n ],\n [\n 117.452279,\n 35.490306\n ],\n [\n 117.442171,\n 35.469247\n ],\n [\n 117.42851,\n 35.458614\n ],\n [\n 117.453779,\n 35.442396\n ],\n [\n 117.455833,\n 35.424953\n ],\n [\n 117.467441,\n 35.418186\n ],\n [\n 117.474785,\n 35.400941\n ],\n [\n 117.463334,\n 35.39038\n ],\n [\n 117.463887,\n 35.375617\n ],\n [\n 117.439644,\n 35.359668\n ],\n [\n 117.439012,\n 35.348939\n ],\n [\n 117.446988,\n 35.330292\n ],\n [\n 117.453937,\n 35.325027\n ],\n [\n 117.478891,\n 35.314375\n ],\n [\n 117.463098,\n 35.287472\n ],\n [\n 117.439565,\n 35.282368\n ],\n [\n 117.419191,\n 35.273997\n ],\n [\n 117.406004,\n 35.283348\n ],\n [\n 117.403635,\n 35.301394\n ],\n [\n 117.399528,\n 35.306374\n ],\n [\n 117.359571,\n 35.318375\n ],\n [\n 117.347568,\n 35.315109\n ],\n [\n 117.318034,\n 35.320252\n ],\n [\n 117.308557,\n 35.312579\n ],\n [\n 117.314085,\n 35.302129\n ],\n [\n 117.311163,\n 35.28588\n ],\n [\n 117.305794,\n 35.295229\n ],\n [\n 117.290079,\n 35.299394\n ],\n [\n 117.284472,\n 35.294331\n ],\n [\n 117.262203,\n 35.287472\n ],\n [\n 117.269231,\n 35.261296\n ],\n [\n 117.220824,\n 35.26489\n ],\n [\n 117.204873,\n 35.258518\n ],\n [\n 117.199108,\n 35.24749\n ],\n [\n 117.176681,\n 35.243159\n ],\n [\n 117.152675,\n 35.232047\n ],\n [\n 117.123536,\n 35.23078\n ],\n [\n 117.104899,\n 35.221464\n ],\n [\n 117.092896,\n 35.220361\n ],\n [\n 117.065336,\n 35.22792\n ],\n [\n 117.053333,\n 35.224202\n ],\n [\n 117.028774,\n 35.221219\n ],\n [\n 117.014639,\n 35.214844\n ],\n [\n 116.995687,\n 35.1978\n ],\n [\n 116.969706,\n 35.187377\n ],\n [\n 116.962047,\n 35.177319\n ],\n [\n 116.938277,\n 35.172168\n ],\n [\n 116.925721,\n 35.182266\n ],\n [\n 116.913718,\n 35.178791\n ],\n [\n 116.904716,\n 35.182471\n ],\n [\n 116.898398,\n 35.195757\n ],\n [\n 116.876603,\n 35.188031\n ],\n [\n 116.86618,\n 35.172617\n ],\n [\n 116.85394,\n 35.16861\n ],\n [\n 116.832776,\n 35.184392\n ],\n [\n 116.811218,\n 35.17736\n ],\n [\n 116.81564,\n 35.170777\n ],\n [\n 116.813192,\n 35.159573\n ],\n [\n 116.81793,\n 35.150699\n ],\n [\n 116.825748,\n 35.147631\n ],\n [\n 116.832065,\n 35.123783\n ],\n [\n 116.848649,\n 35.103774\n ],\n [\n 116.863179,\n 35.091496\n ],\n [\n 116.888922,\n 35.093829\n ],\n [\n 116.888212,\n 35.085193\n ],\n [\n 116.900373,\n 35.068737\n ],\n [\n 116.880473,\n 35.062595\n ],\n [\n 116.881183,\n 35.058133\n ],\n [\n 116.900767,\n 35.05977\n ],\n [\n 116.907875,\n 35.046995\n ],\n [\n 116.937172,\n 35.0275\n ],\n [\n 116.951702,\n 35.020618\n ],\n [\n 116.956993,\n 35.01054\n ],\n [\n 116.954466,\n 34.993331\n ],\n [\n 116.943015,\n 34.975627\n ],\n [\n 116.955334,\n 34.967142\n ],\n [\n 116.9671,\n 34.951072\n ],\n [\n 116.980367,\n 34.941027\n ],\n [\n 116.989448,\n 34.93873\n ],\n [\n 117.017719,\n 34.942503\n ],\n [\n 117.038487,\n 34.937869\n ],\n [\n 117.043462,\n 34.932825\n ],\n [\n 117.041093,\n 34.925157\n ],\n [\n 117.05815,\n 34.926961\n ],\n [\n 117.06123,\n 34.930406\n ],\n [\n 117.073707,\n 34.925485\n ],\n [\n 117.082551,\n 34.934917\n ],\n [\n 117.103399,\n 34.937459\n ],\n [\n 117.111059,\n 34.917774\n ],\n [\n 117.110111,\n 34.90514\n ],\n [\n 117.12093,\n 34.903581\n ],\n [\n 117.125826,\n 34.863451\n ],\n [\n 117.139013,\n 34.854052\n ],\n [\n 117.140593,\n 34.846499\n ],\n [\n 117.156623,\n 34.834306\n ],\n [\n 117.17755,\n 34.828722\n ],\n [\n 117.194686,\n 34.816239\n ],\n [\n 117.180314,\n 34.800221\n ],\n [\n 117.172733,\n 34.799194\n ],\n [\n 117.162467,\n 34.782105\n ],\n [\n 117.176523,\n 34.779065\n ],\n [\n 117.180551,\n 34.784201\n ],\n [\n 117.191369,\n 34.780914\n ],\n [\n 117.212927,\n 34.761027\n ],\n [\n 117.22422,\n 34.745533\n ],\n [\n 117.236697,\n 34.746355\n ],\n [\n 117.242067,\n 34.729995\n ],\n [\n 117.253675,\n 34.721444\n ],\n [\n 117.271443,\n 34.726501\n ],\n [\n 117.278787,\n 34.715647\n ],\n [\n 117.304609,\n 34.714866\n ],\n [\n 117.310611,\n 34.717333\n ],\n [\n 117.326167,\n 34.703434\n ],\n [\n 117.324272,\n 34.697307\n ],\n [\n 117.335485,\n 34.692454\n ],\n [\n 117.329247,\n 34.677359\n ],\n [\n 117.346067,\n 34.670982\n ],\n [\n 117.35657,\n 34.661643\n ],\n [\n 117.354201,\n 34.653538\n ],\n [\n 117.366915,\n 34.650246\n ],\n [\n 117.374022,\n 34.636172\n ],\n [\n 117.376707,\n 34.622301\n ],\n [\n 117.384051,\n 34.628228\n ],\n [\n 117.402687,\n 34.628434\n ],\n [\n 117.4109,\n 34.623454\n ],\n [\n 117.407978,\n 34.610651\n ],\n [\n 117.397949,\n 34.604393\n ],\n [\n 117.398976,\n 34.588335\n ],\n [\n 117.393922,\n 34.587676\n ],\n [\n 117.392342,\n 34.574909\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 370900,\n \"name\": \"泰安市\",\n \"center\": [\n 117.129063,\n 36.194968\n ],\n \"centroid\": [\n 117.030947,\n 36.002333\n ],\n \"childrenNum\": 6,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 370000\n },\n \"subFeatureIndex\": 8,\n \"acroutes\": [\n 100000,\n 370000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 117.596948,\n 35.630449\n ],\n [\n 117.576022,\n 35.650206\n ],\n [\n 117.529431,\n 35.682879\n ],\n [\n 117.520586,\n 35.697626\n ],\n [\n 117.530931,\n 35.707131\n ],\n [\n 117.511031,\n 35.712411\n ],\n [\n 117.49121,\n 35.707903\n ],\n [\n 117.488683,\n 35.721102\n ],\n [\n 117.478733,\n 35.732675\n ],\n [\n 117.452832,\n 35.742298\n ],\n [\n 117.440197,\n 35.744571\n ],\n [\n 117.431195,\n 35.760971\n ],\n [\n 117.415559,\n 35.775177\n ],\n [\n 117.391,\n 35.767141\n ],\n [\n 117.379155,\n 35.775785\n ],\n [\n 117.364467,\n 35.770225\n ],\n [\n 117.350331,\n 35.782725\n ],\n [\n 117.343382,\n 35.784267\n ],\n [\n 117.341013,\n 35.793558\n ],\n [\n 117.318428,\n 35.793802\n ],\n [\n 117.306504,\n 35.798833\n ],\n [\n 117.297581,\n 35.788487\n ],\n [\n 117.260308,\n 35.771037\n ],\n [\n 117.226984,\n 35.773959\n ],\n [\n 117.21806,\n 35.778464\n ],\n [\n 117.200214,\n 35.775095\n ],\n [\n 117.175023,\n 35.780209\n ],\n [\n 117.163651,\n 35.775014\n ],\n [\n 117.143436,\n 35.771727\n ],\n [\n 117.135381,\n 35.767303\n ],\n [\n 117.128353,\n 35.769901\n ],\n [\n 117.135855,\n 35.774811\n ],\n [\n 117.137908,\n 35.783374\n ],\n [\n 117.131275,\n 35.786498\n ],\n [\n 117.103241,\n 35.790272\n ],\n [\n 117.097318,\n 35.802687\n ],\n [\n 117.083815,\n 35.80431\n ],\n [\n 117.070864,\n 35.790394\n ],\n [\n 117.049622,\n 35.801307\n ],\n [\n 117.0268,\n 35.799401\n ],\n [\n 117.009506,\n 35.807636\n ],\n [\n 116.991423,\n 35.805973\n ],\n [\n 116.993397,\n 35.794045\n ],\n [\n 116.974366,\n 35.760444\n ],\n [\n 116.952412,\n 35.7561\n ],\n [\n 116.946253,\n 35.744368\n ],\n [\n 116.952412,\n 35.737507\n ],\n [\n 116.954939,\n 35.719072\n ],\n [\n 116.949649,\n 35.715741\n ],\n [\n 116.931012,\n 35.713629\n ],\n [\n 116.930538,\n 35.709406\n ],\n [\n 116.91814,\n 35.706278\n ],\n [\n 116.909849,\n 35.699982\n ],\n [\n 116.897135,\n 35.701851\n ],\n [\n 116.88071,\n 35.696732\n ],\n [\n 116.879367,\n 35.685479\n ],\n [\n 116.861994,\n 35.679059\n ],\n [\n 116.836882,\n 35.697382\n ],\n [\n 116.8233,\n 35.696935\n ],\n [\n 116.8218,\n 35.705222\n ],\n [\n 116.811376,\n 35.706034\n ],\n [\n 116.8049,\n 35.686292\n ],\n [\n 116.795345,\n 35.682188\n ],\n [\n 116.77742,\n 35.690882\n ],\n [\n 116.770076,\n 35.703557\n ],\n [\n 116.762732,\n 35.708309\n ],\n [\n 116.743069,\n 35.703597\n ],\n [\n 116.743069,\n 35.703597\n ],\n [\n 116.733829,\n 35.703435\n ],\n [\n 116.705322,\n 35.70839\n ],\n [\n 116.698847,\n 35.72098\n ],\n [\n 116.68866,\n 35.724838\n ],\n [\n 116.664969,\n 35.716716\n ],\n [\n 116.648939,\n 35.713426\n ],\n [\n 116.627539,\n 35.705791\n ],\n [\n 116.615615,\n 35.705222\n ],\n [\n 116.612061,\n 35.71237\n ],\n [\n 116.614588,\n 35.74924\n ],\n [\n 116.619563,\n 35.756628\n ],\n [\n 116.636699,\n 35.764137\n ],\n [\n 116.662679,\n 35.758252\n ],\n [\n 116.670497,\n 35.761499\n ],\n [\n 116.687317,\n 35.798062\n ],\n [\n 116.686607,\n 35.814005\n ],\n [\n 116.676736,\n 35.822198\n ],\n [\n 116.656441,\n 35.828525\n ],\n [\n 116.641042,\n 35.836879\n ],\n [\n 116.617036,\n 35.855206\n ],\n [\n 116.614904,\n 35.865746\n ],\n [\n 116.62438,\n 35.878068\n ],\n [\n 116.647518,\n 35.884674\n ],\n [\n 116.666944,\n 35.898209\n ],\n [\n 116.672392,\n 35.92118\n ],\n [\n 116.676973,\n 35.925596\n ],\n [\n 116.665996,\n 35.940176\n ],\n [\n 116.62817,\n 35.938556\n ],\n [\n 116.618536,\n 35.935195\n ],\n [\n 116.599663,\n 35.916157\n ],\n [\n 116.595715,\n 35.905056\n ],\n [\n 116.566023,\n 35.899222\n ],\n [\n 116.55702,\n 35.890753\n ],\n [\n 116.549834,\n 35.857517\n ],\n [\n 116.53641,\n 35.847178\n ],\n [\n 116.525275,\n 35.847462\n ],\n [\n 116.520616,\n 35.853057\n ],\n [\n 116.515325,\n 35.841866\n ],\n [\n 116.507508,\n 35.84361\n ],\n [\n 116.486976,\n 35.84138\n ],\n [\n 116.475841,\n 35.83327\n ],\n [\n 116.468024,\n 35.836149\n ],\n [\n 116.459732,\n 35.828241\n ],\n [\n 116.459811,\n 35.81583\n ],\n [\n 116.436989,\n 35.807271\n ],\n [\n 116.428698,\n 35.796398\n ],\n [\n 116.421196,\n 35.799279\n ],\n [\n 116.400822,\n 35.794613\n ],\n [\n 116.385581,\n 35.801754\n ],\n [\n 116.377921,\n 35.796642\n ],\n [\n 116.362838,\n 35.795952\n ],\n [\n 116.355652,\n 35.800537\n ],\n [\n 116.336621,\n 35.796723\n ],\n [\n 116.32983,\n 35.787594\n ],\n [\n 116.309377,\n 35.77404\n ],\n [\n 116.301875,\n 35.777084\n ],\n [\n 116.297295,\n 35.795546\n ],\n [\n 116.304007,\n 35.799401\n ],\n [\n 116.277395,\n 35.806581\n ],\n [\n 116.274868,\n 35.803377\n ],\n [\n 116.250072,\n 35.823536\n ],\n [\n 116.245808,\n 35.834162\n ],\n [\n 116.233963,\n 35.851273\n ],\n [\n 116.230804,\n 35.860963\n ],\n [\n 116.233963,\n 35.888403\n ],\n [\n 116.221091,\n 35.892779\n ],\n [\n 116.218485,\n 35.879811\n ],\n [\n 116.214774,\n 35.889659\n ],\n [\n 116.20814,\n 35.886863\n ],\n [\n 116.190057,\n 35.892536\n ],\n [\n 116.185398,\n 35.900478\n ],\n [\n 116.166998,\n 35.90457\n ],\n [\n 116.161155,\n 35.900397\n ],\n [\n 116.154284,\n 35.886012\n ],\n [\n 116.142834,\n 35.895656\n ],\n [\n 116.126172,\n 35.891037\n ],\n [\n 116.09261,\n 35.904935\n ],\n [\n 116.081634,\n 35.914172\n ],\n [\n 116.086767,\n 35.923246\n ],\n [\n 116.074606,\n 35.927459\n ],\n [\n 116.07279,\n 35.940055\n ],\n [\n 116.05897,\n 35.936167\n ],\n [\n 116.048704,\n 35.948114\n ],\n [\n 116.060392,\n 35.956374\n ],\n [\n 116.065367,\n 35.964714\n ],\n [\n 116.061892,\n 35.97358\n ],\n [\n 116.0506,\n 35.981919\n ],\n [\n 116.052574,\n 35.99912\n ],\n [\n 116.06284,\n 36.028899\n ],\n [\n 116.073658,\n 36.026148\n ],\n [\n 116.079502,\n 36.042611\n ],\n [\n 116.076106,\n 36.056887\n ],\n [\n 116.087162,\n 36.071403\n ],\n [\n 116.091742,\n 36.089474\n ],\n [\n 116.096875,\n 36.092182\n ],\n [\n 116.099323,\n 36.112066\n ],\n [\n 116.114011,\n 36.122047\n ],\n [\n 116.123882,\n 36.136429\n ],\n [\n 116.164313,\n 36.146084\n ],\n [\n 116.164392,\n 36.168862\n ],\n [\n 116.169446,\n 36.171325\n ],\n [\n 116.213036,\n 36.169831\n ],\n [\n 116.226066,\n 36.173748\n ],\n [\n 116.246677,\n 36.149436\n ],\n [\n 116.261444,\n 36.122693\n ],\n [\n 116.27171,\n 36.109843\n ],\n [\n 116.273368,\n 36.093758\n ],\n [\n 116.267287,\n 36.074233\n ],\n [\n 116.267998,\n 36.052964\n ],\n [\n 116.271552,\n 36.043824\n ],\n [\n 116.294689,\n 36.031407\n ],\n [\n 116.301244,\n 36.031123\n ],\n [\n 116.304718,\n 36.046251\n ],\n [\n 116.310404,\n 36.052196\n ],\n [\n 116.324855,\n 36.054178\n ],\n [\n 116.338753,\n 36.060082\n ],\n [\n 116.352731,\n 36.070797\n ],\n [\n 116.360233,\n 36.084744\n ],\n [\n 116.386845,\n 36.090807\n ],\n [\n 116.398058,\n 36.084582\n ],\n [\n 116.401059,\n 36.074031\n ],\n [\n 116.409508,\n 36.068007\n ],\n [\n 116.427829,\n 36.067441\n ],\n [\n 116.433357,\n 36.059839\n ],\n [\n 116.429566,\n 36.052439\n ],\n [\n 116.436121,\n 36.046534\n ],\n [\n 116.434541,\n 36.038607\n ],\n [\n 116.449387,\n 36.047302\n ],\n [\n 116.452072,\n 36.058019\n ],\n [\n 116.471182,\n 36.06457\n ],\n [\n 116.504112,\n 36.064732\n ],\n [\n 116.532303,\n 36.074274\n ],\n [\n 116.543359,\n 36.086604\n ],\n [\n 116.546597,\n 36.101195\n ],\n [\n 116.554651,\n 36.108187\n ],\n [\n 116.566891,\n 36.108752\n ],\n [\n 116.569024,\n 36.118774\n ],\n [\n 116.562153,\n 36.121643\n ],\n [\n 116.5586,\n 36.133804\n ],\n [\n 116.543122,\n 36.13958\n ],\n [\n 116.525275,\n 36.135298\n ],\n [\n 116.528513,\n 36.145276\n ],\n [\n 116.519748,\n 36.141196\n ],\n [\n 116.507192,\n 36.141277\n ],\n [\n 116.510192,\n 36.148346\n ],\n [\n 116.52188,\n 36.157151\n ],\n [\n 116.525986,\n 36.168297\n ],\n [\n 116.51035,\n 36.176857\n ],\n [\n 116.502059,\n 36.192764\n ],\n [\n 116.481922,\n 36.197002\n ],\n [\n 116.472604,\n 36.21464\n ],\n [\n 116.487529,\n 36.228441\n ],\n [\n 116.485239,\n 36.236067\n ],\n [\n 116.506402,\n 36.240344\n ],\n [\n 116.512325,\n 36.253414\n ],\n [\n 116.525591,\n 36.255229\n ],\n [\n 116.53641,\n 36.245588\n ],\n [\n 116.552361,\n 36.247767\n ],\n [\n 116.558837,\n 36.261037\n ],\n [\n 116.574393,\n 36.263457\n ],\n [\n 116.581264,\n 36.255471\n ],\n [\n 116.587502,\n 36.268862\n ],\n [\n 116.595794,\n 36.270999\n ],\n [\n 116.610403,\n 36.282451\n ],\n [\n 116.615536,\n 36.294587\n ],\n [\n 116.649018,\n 36.295797\n ],\n [\n 116.675709,\n 36.276645\n ],\n [\n 116.686528,\n 36.275435\n ],\n [\n 116.701058,\n 36.280153\n ],\n [\n 116.710376,\n 36.279185\n ],\n [\n 116.732961,\n 36.294144\n ],\n [\n 116.762574,\n 36.305391\n ],\n [\n 116.772761,\n 36.312002\n ],\n [\n 116.786659,\n 36.311357\n ],\n [\n 116.808612,\n 36.299022\n ],\n [\n 116.830644,\n 36.294587\n ],\n [\n 116.855756,\n 36.301642\n ],\n [\n 116.855519,\n 36.289709\n ],\n [\n 116.867759,\n 36.28108\n ],\n [\n 116.873129,\n 36.264062\n ],\n [\n 116.891133,\n 36.255471\n ],\n [\n 116.928722,\n 36.26991\n ],\n [\n 116.932828,\n 36.261925\n ],\n [\n 116.950201,\n 36.257327\n ],\n [\n 116.956835,\n 36.259787\n ],\n [\n 116.975471,\n 36.243208\n ],\n [\n 116.987632,\n 36.250711\n ],\n [\n 117.002794,\n 36.254503\n ],\n [\n 117.003347,\n 36.265353\n ],\n [\n 117.027353,\n 36.268983\n ],\n [\n 117.030275,\n 36.277532\n ],\n [\n 117.0482,\n 36.283701\n ],\n [\n 117.051201,\n 36.288741\n ],\n [\n 117.066995,\n 36.296885\n ],\n [\n 117.074102,\n 36.296724\n ],\n [\n 117.077655,\n 36.307205\n ],\n [\n 117.07734,\n 36.321957\n ],\n [\n 117.088711,\n 36.346013\n ],\n [\n 117.107347,\n 36.338882\n ],\n [\n 117.111691,\n 36.340413\n ],\n [\n 117.137039,\n 36.335135\n ],\n [\n 117.142567,\n 36.345731\n ],\n [\n 117.161361,\n 36.351895\n ],\n [\n 117.179603,\n 36.353144\n ],\n [\n 117.18292,\n 36.360798\n ],\n [\n 117.180945,\n 36.37256\n ],\n [\n 117.191685,\n 36.378762\n ],\n [\n 117.200924,\n 36.389755\n ],\n [\n 117.208742,\n 36.405297\n ],\n [\n 117.218297,\n 36.406182\n ],\n [\n 117.242145,\n 36.41528\n ],\n [\n 117.249726,\n 36.436732\n ],\n [\n 117.263862,\n 36.449206\n ],\n [\n 117.275786,\n 36.451218\n ],\n [\n 117.288973,\n 36.468718\n ],\n [\n 117.288184,\n 36.476039\n ],\n [\n 117.30682,\n 36.472097\n ],\n [\n 117.30682,\n 36.467029\n ],\n [\n 117.335328,\n 36.466345\n ],\n [\n 117.346383,\n 36.46373\n ],\n [\n 117.346936,\n 36.455724\n ],\n [\n 117.339118,\n 36.438181\n ],\n [\n 117.339434,\n 36.425786\n ],\n [\n 117.344962,\n 36.403968\n ],\n [\n 117.35041,\n 36.393379\n ],\n [\n 117.351753,\n 36.377997\n ],\n [\n 117.362729,\n 36.360234\n ],\n [\n 117.387762,\n 36.337915\n ],\n [\n 117.38871,\n 36.326148\n ],\n [\n 117.379707,\n 36.315146\n ],\n [\n 117.38792,\n 36.296361\n ],\n [\n 117.387604,\n 36.285556\n ],\n [\n 117.397791,\n 36.283782\n ],\n [\n 117.394553,\n 36.266522\n ],\n [\n 117.413901,\n 36.267934\n ],\n [\n 117.417217,\n 36.243652\n ],\n [\n 117.392895,\n 36.237439\n ],\n [\n 117.393132,\n 36.226747\n ],\n [\n 117.385235,\n 36.226989\n ],\n [\n 117.396607,\n 36.215972\n ],\n [\n 117.412716,\n 36.210927\n ],\n [\n 117.427878,\n 36.221662\n ],\n [\n 117.447383,\n 36.218313\n ],\n [\n 117.447778,\n 36.203541\n ],\n [\n 117.452437,\n 36.203138\n ],\n [\n 117.440434,\n 36.191189\n ],\n [\n 117.446988,\n 36.18691\n ],\n [\n 117.461202,\n 36.170194\n ],\n [\n 117.475653,\n 36.173102\n ],\n [\n 117.487972,\n 36.15921\n ],\n [\n 117.476601,\n 36.150123\n ],\n [\n 117.469178,\n 36.154687\n ],\n [\n 117.459623,\n 36.1498\n ],\n [\n 117.44683,\n 36.120834\n ],\n [\n 117.463571,\n 36.116875\n ],\n [\n 117.454885,\n 36.111177\n ],\n [\n 117.456148,\n 36.100467\n ],\n [\n 117.447067,\n 36.09206\n ],\n [\n 117.451963,\n 36.087412\n ],\n [\n 117.473758,\n 36.089797\n ],\n [\n 117.484893,\n 36.10075\n ],\n [\n 117.491052,\n 36.096587\n ],\n [\n 117.505898,\n 36.098245\n ],\n [\n 117.534879,\n 36.111419\n ],\n [\n 117.547672,\n 36.106166\n ],\n [\n 117.552884,\n 36.087978\n ],\n [\n 117.561649,\n 36.079327\n ],\n [\n 117.575943,\n 36.074516\n ],\n [\n 117.601844,\n 36.075648\n ],\n [\n 117.630588,\n 36.059879\n ],\n [\n 117.656569,\n 36.049729\n ],\n [\n 117.689972,\n 36.052358\n ],\n [\n 117.701186,\n 36.04528\n ],\n [\n 117.720454,\n 36.038243\n ],\n [\n 117.725824,\n 36.029667\n ],\n [\n 117.741696,\n 36.036058\n ],\n [\n 117.757016,\n 36.019392\n ],\n [\n 117.750304,\n 36.011947\n ],\n [\n 117.756542,\n 36.002236\n ],\n [\n 117.756621,\n 35.991916\n ],\n [\n 117.762307,\n 35.990621\n ],\n [\n 117.781022,\n 35.995437\n ],\n [\n 117.782286,\n 36.007294\n ],\n [\n 117.794763,\n 36.015143\n ],\n [\n 117.801159,\n 36.012959\n ],\n [\n 117.825244,\n 36.013363\n ],\n [\n 117.828719,\n 36.008022\n ],\n [\n 117.841827,\n 36.011947\n ],\n [\n 117.854462,\n 36.006889\n ],\n [\n 117.866386,\n 36.007415\n ],\n [\n 117.877047,\n 36.016357\n ],\n [\n 117.895052,\n 36.020363\n ],\n [\n 117.914557,\n 36.020039\n ],\n [\n 117.922848,\n 36.015467\n ],\n [\n 117.926165,\n 36.005068\n ],\n [\n 117.935088,\n 36.004421\n ],\n [\n 117.937536,\n 35.99653\n ],\n [\n 117.937221,\n 35.98119\n ],\n [\n 117.946065,\n 35.970949\n ],\n [\n 117.947013,\n 35.960382\n ],\n [\n 117.953962,\n 35.957913\n ],\n [\n 117.971414,\n 35.969937\n ],\n [\n 117.992577,\n 35.971273\n ],\n [\n 117.984443,\n 35.956293\n ],\n [\n 117.988471,\n 35.947709\n ],\n [\n 117.997394,\n 35.934587\n ],\n [\n 117.99921,\n 35.925393\n ],\n [\n 117.988234,\n 35.908703\n ],\n [\n 117.981364,\n 35.906191\n ],\n [\n 117.97931,\n 35.889699\n ],\n [\n 117.968097,\n 35.884066\n ],\n [\n 117.960516,\n 35.87057\n ],\n [\n 117.937615,\n 35.874826\n ],\n [\n 117.924586,\n 35.880946\n ],\n [\n 117.906265,\n 35.884634\n ],\n [\n 117.883364,\n 35.882648\n ],\n [\n 117.86686,\n 35.86984\n ],\n [\n 117.85541,\n 35.850219\n ],\n [\n 117.842143,\n 35.84507\n ],\n [\n 117.827376,\n 35.827754\n ],\n [\n 117.828403,\n 35.821792\n ],\n [\n 117.840959,\n 35.812058\n ],\n [\n 117.846092,\n 35.796398\n ],\n [\n 117.831167,\n 35.786661\n ],\n [\n 117.828482,\n 35.773837\n ],\n [\n 117.833694,\n 35.760484\n ],\n [\n 117.837405,\n 35.741445\n ],\n [\n 117.823033,\n 35.739496\n ],\n [\n 117.811504,\n 35.732919\n ],\n [\n 117.781733,\n 35.734096\n ],\n [\n 117.769019,\n 35.726625\n ],\n [\n 117.754173,\n 35.709609\n ],\n [\n 117.732615,\n 35.71237\n ],\n [\n 117.707424,\n 35.726016\n ],\n [\n 117.679154,\n 35.713305\n ],\n [\n 117.663913,\n 35.70969\n ],\n [\n 117.634616,\n 35.709324\n ],\n [\n 117.62585,\n 35.703841\n ],\n [\n 117.605319,\n 35.674834\n ],\n [\n 117.599001,\n 35.649149\n ],\n [\n 117.596948,\n 35.630449\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 371000,\n \"name\": \"威海市\",\n \"center\": [\n 122.116394,\n 37.509691\n ],\n \"centroid\": [\n 122.000809,\n 37.118689\n ],\n \"childrenNum\": 4,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 370000\n },\n \"subFeatureIndex\": 9,\n \"acroutes\": [\n 100000,\n 370000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 121.923992,\n 37.473096\n ],\n [\n 121.966002,\n 37.489648\n ],\n [\n 121.979111,\n 37.488378\n ],\n [\n 121.996958,\n 37.493974\n ],\n [\n 121.999485,\n 37.506236\n ],\n [\n 122.013225,\n 37.510006\n ],\n [\n 122.017253,\n 37.530914\n ],\n [\n 122.036284,\n 37.529446\n ],\n [\n 122.045207,\n 37.531628\n ],\n [\n 122.053736,\n 37.543448\n ],\n [\n 122.069924,\n 37.537062\n ],\n [\n 122.075215,\n 37.540473\n ],\n [\n 122.074583,\n 37.551816\n ],\n [\n 122.066529,\n 37.562364\n ],\n [\n 122.069529,\n 37.568747\n ],\n [\n 122.088797,\n 37.554116\n ],\n [\n 122.107434,\n 37.550309\n ],\n [\n 122.123148,\n 37.552926\n ],\n [\n 122.119437,\n 37.564227\n ],\n [\n 122.125833,\n 37.56732\n ],\n [\n 122.133572,\n 37.556455\n ],\n [\n 122.150471,\n 37.557129\n ],\n [\n 122.144154,\n 37.550388\n ],\n [\n 122.150708,\n 37.544281\n ],\n [\n 122.171398,\n 37.541147\n ],\n [\n 122.171714,\n 37.534285\n ],\n [\n 122.163106,\n 37.518973\n ],\n [\n 122.15442,\n 37.518219\n ],\n [\n 122.14755,\n 37.51199\n ],\n [\n 122.136336,\n 37.512307\n ],\n [\n 122.131993,\n 37.499371\n ],\n [\n 122.149524,\n 37.493418\n ],\n [\n 122.153946,\n 37.488616\n ],\n [\n 122.148892,\n 37.481948\n ],\n [\n 122.156947,\n 37.459438\n ],\n [\n 122.165712,\n 37.450027\n ],\n [\n 122.167213,\n 37.438073\n ],\n [\n 122.183717,\n 37.431282\n ],\n [\n 122.185849,\n 37.441688\n ],\n [\n 122.194456,\n 37.456222\n ],\n [\n 122.212461,\n 37.455666\n ],\n [\n 122.220595,\n 37.463289\n ],\n [\n 122.233151,\n 37.46051\n ],\n [\n 122.235046,\n 37.469205\n ],\n [\n 122.24089,\n 37.465354\n ],\n [\n 122.252656,\n 37.467855\n ],\n [\n 122.260316,\n 37.46047\n ],\n [\n 122.27682,\n 37.456778\n ],\n [\n 122.286138,\n 37.447287\n ],\n [\n 122.280373,\n 37.442641\n ],\n [\n 122.280216,\n 37.433863\n ],\n [\n 122.285664,\n 37.425403\n ],\n [\n 122.31046,\n 37.423059\n ],\n [\n 122.312355,\n 37.416663\n ],\n [\n 122.336993,\n 37.414438\n ],\n [\n 122.387375,\n 37.42\n ],\n [\n 122.393376,\n 37.415114\n ],\n [\n 122.416751,\n 37.414676\n ],\n [\n 122.437046,\n 37.420358\n ],\n [\n 122.464684,\n 37.42441\n ],\n [\n 122.480952,\n 37.433665\n ],\n [\n 122.489559,\n 37.431917\n ],\n [\n 122.487348,\n 37.420278\n ],\n [\n 122.495245,\n 37.413683\n ],\n [\n 122.513408,\n 37.410703\n ],\n [\n 122.553602,\n 37.406929\n ],\n [\n 122.580293,\n 37.410187\n ],\n [\n 122.595929,\n 37.421152\n ],\n [\n 122.606511,\n 37.424131\n ],\n [\n 122.626648,\n 37.424688\n ],\n [\n 122.643862,\n 37.428064\n ],\n [\n 122.649548,\n 37.419881\n ],\n [\n 122.656655,\n 37.428461\n ],\n [\n 122.665816,\n 37.424251\n ],\n [\n 122.659735,\n 37.421589\n ],\n [\n 122.666526,\n 37.414438\n ],\n [\n 122.675923,\n 37.413326\n ],\n [\n 122.669527,\n 37.42858\n ],\n [\n 122.684847,\n 37.4287\n ],\n [\n 122.688558,\n 37.422423\n ],\n [\n 122.704273,\n 37.414955\n ],\n [\n 122.706958,\n 37.404108\n ],\n [\n 122.715802,\n 37.396121\n ],\n [\n 122.697877,\n 37.384118\n ],\n [\n 122.69456,\n 37.376328\n ],\n [\n 122.680662,\n 37.37438\n ],\n [\n 122.675134,\n 37.383761\n ],\n [\n 122.655629,\n 37.388292\n ],\n [\n 122.641809,\n 37.385867\n ],\n [\n 122.626884,\n 37.36957\n ],\n [\n 122.611486,\n 37.366907\n ],\n [\n 122.594823,\n 37.347981\n ],\n [\n 122.59356,\n 37.336289\n ],\n [\n 122.611486,\n 37.339431\n ],\n [\n 122.610459,\n 37.331119\n ],\n [\n 122.594192,\n 37.319822\n ],\n [\n 122.573897,\n 37.296349\n ],\n [\n 122.581083,\n 37.286957\n ],\n [\n 122.57137,\n 37.279037\n ],\n [\n 122.577056,\n 37.271395\n ],\n [\n 122.567185,\n 37.261164\n ],\n [\n 122.584716,\n 37.258736\n ],\n [\n 122.592454,\n 37.261284\n ],\n [\n 122.590638,\n 37.248065\n ],\n [\n 122.60043,\n 37.242212\n ],\n [\n 122.60043,\n 37.22895\n ],\n [\n 122.604063,\n 37.221462\n ],\n [\n 122.623963,\n 37.212739\n ],\n [\n 122.628859,\n 37.203456\n ],\n [\n 122.624042,\n 37.191144\n ],\n [\n 122.606274,\n 37.193057\n ],\n [\n 122.596877,\n 37.181262\n ],\n [\n 122.57903,\n 37.183493\n ],\n [\n 122.573344,\n 37.17624\n ],\n [\n 122.587243,\n 37.163684\n ],\n [\n 122.586374,\n 37.153519\n ],\n [\n 122.581083,\n 37.147738\n ],\n [\n 122.559762,\n 37.147419\n ],\n [\n 122.533544,\n 37.153359\n ],\n [\n 122.501562,\n 37.148695\n ],\n [\n 122.493113,\n 37.142036\n ],\n [\n 122.484505,\n 37.128877\n ],\n [\n 122.481189,\n 37.117829\n ],\n [\n 122.477951,\n 37.091539\n ],\n [\n 122.481031,\n 37.071786\n ],\n [\n 122.480083,\n 37.06105\n ],\n [\n 122.45963,\n 37.04584\n ],\n [\n 122.461447,\n 37.039532\n ],\n [\n 122.487901,\n 37.034301\n ],\n [\n 122.498641,\n 37.034301\n ],\n [\n 122.524226,\n 37.04033\n ],\n [\n 122.548706,\n 37.05091\n ],\n [\n 122.575634,\n 37.054423\n ],\n [\n 122.585268,\n 37.042965\n ],\n [\n 122.583373,\n 37.037296\n ],\n [\n 122.555971,\n 37.02324\n ],\n [\n 122.544837,\n 37.004587\n ],\n [\n 122.545232,\n 36.990205\n ],\n [\n 122.556919,\n 36.978898\n ],\n [\n 122.557551,\n 36.968707\n ],\n [\n 122.545863,\n 36.956317\n ],\n [\n 122.546574,\n 36.923494\n ],\n [\n 122.542468,\n 36.913536\n ],\n [\n 122.532123,\n 36.901457\n ],\n [\n 122.516408,\n 36.890256\n ],\n [\n 122.497061,\n 36.886095\n ],\n [\n 122.484663,\n 36.891536\n ],\n [\n 122.485453,\n 36.903777\n ],\n [\n 122.492639,\n 36.912176\n ],\n [\n 122.483005,\n 36.914056\n ],\n [\n 122.434124,\n 36.914256\n ],\n [\n 122.428833,\n 36.908856\n ],\n [\n 122.446601,\n 36.898217\n ],\n [\n 122.454498,\n 36.878813\n ],\n [\n 122.464448,\n 36.879294\n ],\n [\n 122.457025,\n 36.86913\n ],\n [\n 122.445732,\n 36.873052\n ],\n [\n 122.416119,\n 36.859485\n ],\n [\n 122.403326,\n 36.860686\n ],\n [\n 122.392587,\n 36.866209\n ],\n [\n 122.3839,\n 36.865368\n ],\n [\n 122.386506,\n 36.860046\n ],\n [\n 122.378373,\n 36.844275\n ],\n [\n 122.350655,\n 36.835228\n ],\n [\n 122.342758,\n 36.828502\n ],\n [\n 122.335414,\n 36.83767\n ],\n [\n 122.32657,\n 36.830424\n ],\n [\n 122.298141,\n 36.83707\n ],\n [\n 122.280452,\n 36.835829\n ],\n [\n 122.263869,\n 36.841633\n ],\n [\n 122.250603,\n 36.839912\n ],\n [\n 122.245865,\n 36.835428\n ],\n [\n 122.220437,\n 36.848919\n ],\n [\n 122.196115,\n 36.842874\n ],\n [\n 122.174714,\n 36.842474\n ],\n [\n 122.17203,\n 36.852441\n ],\n [\n 122.181427,\n 36.856323\n ],\n [\n 122.188534,\n 36.866209\n ],\n [\n 122.175662,\n 36.894537\n ],\n [\n 122.164291,\n 36.892536\n ],\n [\n 122.155999,\n 36.883055\n ],\n [\n 122.119674,\n 36.892096\n ],\n [\n 122.117463,\n 36.895737\n ],\n [\n 122.127176,\n 36.918535\n ],\n [\n 122.14139,\n 36.938288\n ],\n [\n 122.136731,\n 36.944325\n ],\n [\n 122.12765,\n 36.945484\n ],\n [\n 122.112409,\n 36.939607\n ],\n [\n 122.106486,\n 36.941686\n ],\n [\n 122.0993,\n 36.93289\n ],\n [\n 122.100801,\n 36.921934\n ],\n [\n 122.09322,\n 36.914136\n ],\n [\n 122.073636,\n 36.914376\n ],\n [\n 122.051998,\n 36.904977\n ],\n [\n 122.05342,\n 36.895697\n ],\n [\n 122.046234,\n 36.891176\n ],\n [\n 122.042522,\n 36.872011\n ],\n [\n 122.037784,\n 36.875492\n ],\n [\n 122.03731,\n 36.895817\n ],\n [\n 122.025307,\n 36.908856\n ],\n [\n 122.022464,\n 36.942006\n ],\n [\n 122.013936,\n 36.959994\n ],\n [\n 121.994668,\n 36.953719\n ],\n [\n 121.98306,\n 36.958436\n ],\n [\n 121.977611,\n 36.947163\n ],\n [\n 121.964818,\n 36.938128\n ],\n [\n 121.927545,\n 36.932371\n ],\n [\n 121.897616,\n 36.921694\n ],\n [\n 121.870846,\n 36.915736\n ],\n [\n 121.862791,\n 36.909256\n ],\n [\n 121.829388,\n 36.898057\n ],\n [\n 121.816121,\n 36.891856\n ],\n [\n 121.790457,\n 36.884255\n ],\n [\n 121.767714,\n 36.874852\n ],\n [\n 121.76195,\n 36.866049\n ],\n [\n 121.763766,\n 36.85084\n ],\n [\n 121.757606,\n 36.841753\n ],\n [\n 121.73818,\n 36.835068\n ],\n [\n 121.726256,\n 36.82626\n ],\n [\n 121.718517,\n 36.829223\n ],\n [\n 121.70683,\n 36.822296\n ],\n [\n 121.670742,\n 36.817651\n ],\n [\n 121.64176,\n 36.805757\n ],\n [\n 121.628494,\n 36.797306\n ],\n [\n 121.628968,\n 36.783245\n ],\n [\n 121.634416,\n 36.766858\n ],\n [\n 121.653527,\n 36.72798\n ],\n [\n 121.651473,\n 36.723851\n ],\n [\n 121.620834,\n 36.737241\n ],\n [\n 121.606067,\n 36.738122\n ],\n [\n 121.599671,\n 36.745578\n ],\n [\n 121.60125,\n 36.763412\n ],\n [\n 121.586009,\n 36.756399\n ],\n [\n 121.570531,\n 36.766257\n ],\n [\n 121.556317,\n 36.764294\n ],\n [\n 121.574638,\n 36.745538\n ],\n [\n 121.574322,\n 36.737\n ],\n [\n 121.565477,\n 36.728822\n ],\n [\n 121.542024,\n 36.734595\n ],\n [\n 121.531995,\n 36.731027\n ],\n [\n 121.532153,\n 36.736198\n ],\n [\n 121.546051,\n 36.741971\n ],\n [\n 121.547394,\n 36.74642\n ],\n [\n 121.53239,\n 36.753273\n ],\n [\n 121.520466,\n 36.749386\n ],\n [\n 121.517702,\n 36.761088\n ],\n [\n 121.507594,\n 36.760928\n ],\n [\n 121.505857,\n 36.770665\n ],\n [\n 121.482245,\n 36.77355\n ],\n [\n 121.481061,\n 36.780401\n ],\n [\n 121.496302,\n 36.792379\n ],\n [\n 121.528205,\n 36.805637\n ],\n [\n 121.546051,\n 36.806558\n ],\n [\n 121.554027,\n 36.81709\n ],\n [\n 121.569979,\n 36.827501\n ],\n [\n 121.565083,\n 36.830504\n ],\n [\n 121.539339,\n 36.823417\n ],\n [\n 121.530179,\n 36.818772\n ],\n [\n 121.522914,\n 36.80824\n ],\n [\n 121.506962,\n 36.803834\n ],\n [\n 121.480271,\n 36.784487\n ],\n [\n 121.478218,\n 36.770825\n ],\n [\n 121.462424,\n 36.784888\n ],\n [\n 121.450184,\n 36.790056\n ],\n [\n 121.417334,\n 36.792739\n ],\n [\n 121.409121,\n 36.790176\n ],\n [\n 121.395855,\n 36.794342\n ],\n [\n 121.396802,\n 36.803834\n ],\n [\n 121.376665,\n 36.830384\n ],\n [\n 121.373428,\n 36.840593\n ],\n [\n 121.36174,\n 36.841273\n ],\n [\n 121.357239,\n 36.852401\n ],\n [\n 121.357397,\n 36.864048\n ],\n [\n 121.363873,\n 36.871651\n ],\n [\n 121.385431,\n 36.877333\n ],\n [\n 121.36482,\n 36.897417\n ],\n [\n 121.366557,\n 36.903617\n ],\n [\n 121.360951,\n 36.921494\n ],\n [\n 121.347605,\n 36.920574\n ],\n [\n 121.312938,\n 36.904097\n ],\n [\n 121.308358,\n 36.905177\n ],\n [\n 121.304173,\n 36.918335\n ],\n [\n 121.282615,\n 36.918535\n ],\n [\n 121.272191,\n 36.927532\n ],\n [\n 121.263189,\n 36.926093\n ],\n [\n 121.252607,\n 36.938088\n ],\n [\n 121.248501,\n 36.953679\n ],\n [\n 121.233734,\n 36.956917\n ],\n [\n 121.22639,\n 36.971065\n ],\n [\n 121.222915,\n 36.986649\n ],\n [\n 121.209096,\n 36.985371\n ],\n [\n 121.19038,\n 36.996558\n ],\n [\n 121.182404,\n 36.99456\n ],\n [\n 121.177587,\n 37.003748\n ],\n [\n 121.181299,\n 37.016131\n ],\n [\n 121.194565,\n 37.019485\n ],\n [\n 121.19496,\n 37.027273\n ],\n [\n 121.188564,\n 37.029948\n ],\n [\n 121.188011,\n 37.041169\n ],\n [\n 121.192512,\n 37.052108\n ],\n [\n 121.191407,\n 37.072026\n ],\n [\n 121.204279,\n 37.07897\n ],\n [\n 121.243131,\n 37.092138\n ],\n [\n 121.246368,\n 37.102631\n ],\n [\n 121.26153,\n 37.117989\n ],\n [\n 121.287827,\n 37.136055\n ],\n [\n 121.306542,\n 37.141996\n ],\n [\n 121.314044,\n 37.141079\n ],\n [\n 121.317992,\n 37.132825\n ],\n [\n 121.326916,\n 37.12768\n ],\n [\n 121.34113,\n 37.127002\n ],\n [\n 121.348316,\n 37.135975\n ],\n [\n 121.358187,\n 37.140282\n ],\n [\n 121.363715,\n 37.129236\n ],\n [\n 121.351475,\n 37.126962\n ],\n [\n 121.369795,\n 37.110889\n ],\n [\n 121.376823,\n 37.115915\n ],\n [\n 121.382746,\n 37.112125\n ],\n [\n 121.391432,\n 37.098282\n ],\n [\n 121.427363,\n 37.100796\n ],\n [\n 121.441656,\n 37.12106\n ],\n [\n 121.447578,\n 37.123333\n ],\n [\n 121.465425,\n 37.12086\n ],\n [\n 121.49946,\n 37.104426\n ],\n [\n 121.547868,\n 37.104945\n ],\n [\n 121.574954,\n 37.110091\n ],\n [\n 121.580323,\n 37.10674\n ],\n [\n 121.589168,\n 37.116712\n ],\n [\n 121.590352,\n 37.128518\n ],\n [\n 121.585377,\n 37.132306\n ],\n [\n 121.590747,\n 37.144269\n ],\n [\n 121.600539,\n 37.141079\n ],\n [\n 121.612147,\n 37.125846\n ],\n [\n 121.625414,\n 37.131908\n ],\n [\n 121.628889,\n 37.137969\n ],\n [\n 121.638839,\n 37.139524\n ],\n [\n 121.639865,\n 37.131908\n ],\n [\n 121.654316,\n 37.121897\n ],\n [\n 121.666714,\n 37.12082\n ],\n [\n 121.669162,\n 37.110649\n ],\n [\n 121.678007,\n 37.121658\n ],\n [\n 121.683692,\n 37.123014\n ],\n [\n 121.682271,\n 37.13127\n ],\n [\n 121.688983,\n 37.133503\n ],\n [\n 121.683455,\n 37.141917\n ],\n [\n 121.694037,\n 37.141239\n ],\n [\n 121.699328,\n 37.125926\n ],\n [\n 121.733995,\n 37.125607\n ],\n [\n 121.737706,\n 37.136175\n ],\n [\n 121.747656,\n 37.135776\n ],\n [\n 121.767872,\n 37.170979\n ],\n [\n 121.761002,\n 37.177954\n ],\n [\n 121.753895,\n 37.172493\n ],\n [\n 121.749315,\n 37.176439\n ],\n [\n 121.760686,\n 37.178831\n ],\n [\n 121.759738,\n 37.19222\n ],\n [\n 121.769057,\n 37.196364\n ],\n [\n 121.761634,\n 37.217997\n ],\n [\n 121.754527,\n 37.212022\n ],\n [\n 121.755632,\n 37.220506\n ],\n [\n 121.748525,\n 37.223255\n ],\n [\n 121.74813,\n 37.241575\n ],\n [\n 121.757211,\n 37.247667\n ],\n [\n 121.7749,\n 37.248225\n ],\n [\n 121.778296,\n 37.260487\n ],\n [\n 121.784692,\n 37.268409\n ],\n [\n 121.792431,\n 37.288469\n ],\n [\n 121.790615,\n 37.299532\n ],\n [\n 121.794879,\n 37.30375\n ],\n [\n 121.815253,\n 37.300447\n ],\n [\n 121.822281,\n 37.303988\n ],\n [\n 121.834047,\n 37.318311\n ],\n [\n 121.859396,\n 37.329249\n ],\n [\n 121.865239,\n 37.336727\n ],\n [\n 121.870293,\n 37.368894\n ],\n [\n 121.882454,\n 37.381694\n ],\n [\n 121.90038,\n 37.391232\n ],\n [\n 121.908435,\n 37.400969\n ],\n [\n 121.91878,\n 37.420755\n ],\n [\n 121.920438,\n 37.429931\n ],\n [\n 121.933941,\n 37.452529\n ],\n [\n 121.929519,\n 37.454713\n ],\n [\n 121.92944,\n 37.460868\n ],\n [\n 121.923992,\n 37.473096\n ]\n ]\n ],\n [\n [\n [\n 122.183559,\n 37.49957\n ],\n [\n 122.171951,\n 37.501792\n ],\n [\n 122.184901,\n 37.5156\n ],\n [\n 122.188218,\n 37.510165\n ],\n [\n 122.199747,\n 37.510323\n ],\n [\n 122.202748,\n 37.501951\n ],\n [\n 122.216173,\n 37.497824\n ],\n [\n 122.183559,\n 37.49957\n ]\n ]\n ],\n [\n [\n [\n 122.257631,\n 36.755638\n ],\n [\n 122.267028,\n 36.754195\n ],\n [\n 122.260316,\n 36.748704\n ],\n [\n 122.257631,\n 36.755638\n ]\n ]\n ],\n [\n [\n [\n 121.484614,\n 36.732871\n ],\n [\n 121.492274,\n 36.740207\n ],\n [\n 121.499776,\n 36.73712\n ],\n [\n 121.484614,\n 36.732871\n ]\n ]\n ],\n [\n [\n [\n 121.620834,\n 36.713827\n ],\n [\n 121.623124,\n 36.728702\n ],\n [\n 121.631179,\n 36.725855\n ],\n [\n 121.620834,\n 36.713827\n ]\n ]\n ],\n [\n [\n [\n 122.482215,\n 37.447089\n ],\n [\n 122.483479,\n 37.454991\n ],\n [\n 122.490586,\n 37.449829\n ],\n [\n 122.482215,\n 37.447089\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 371100,\n \"name\": \"日照市\",\n \"center\": [\n 119.461208,\n 35.428588\n ],\n \"centroid\": [\n 119.146499,\n 35.578656\n ],\n \"childrenNum\": 4,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 370000\n },\n \"subFeatureIndex\": 10,\n \"acroutes\": [\n 100000,\n 370000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 119.662115,\n 35.589294\n ],\n [\n 119.665748,\n 35.570255\n ],\n [\n 119.649875,\n 35.537658\n ],\n [\n 119.639215,\n 35.509446\n ],\n [\n 119.628712,\n 35.500854\n ],\n [\n 119.618999,\n 35.459469\n ],\n [\n 119.612997,\n 35.449813\n ],\n [\n 119.600205,\n 35.443537\n ],\n [\n 119.592545,\n 35.43339\n ],\n [\n 119.579673,\n 35.406527\n ],\n [\n 119.578804,\n 35.385568\n ],\n [\n 119.588991,\n 35.376106\n ],\n [\n 119.586938,\n 35.36387\n ],\n [\n 119.57912,\n 35.357629\n ],\n [\n 119.543743,\n 35.34796\n ],\n [\n 119.539794,\n 35.329802\n ],\n [\n 119.552745,\n 35.330006\n ],\n [\n 119.552113,\n 35.324456\n ],\n [\n 119.53861,\n 35.320456\n ],\n [\n 119.538452,\n 35.29674\n ],\n [\n 119.528502,\n 35.303721\n ],\n [\n 119.520447,\n 35.303803\n ],\n [\n 119.516025,\n 35.318089\n ],\n [\n 119.502442,\n 35.321721\n ],\n [\n 119.476541,\n 35.308334\n ],\n [\n 119.451113,\n 35.28539\n ],\n [\n 119.42458,\n 35.255332\n ],\n [\n 119.411313,\n 35.231638\n ],\n [\n 119.397652,\n 35.166893\n ],\n [\n 119.416604,\n 35.167465\n ],\n [\n 119.416999,\n 35.158183\n ],\n [\n 119.396073,\n 35.157815\n ],\n [\n 119.393546,\n 35.143582\n ],\n [\n 119.397731,\n 35.137692\n ],\n [\n 119.418973,\n 35.128283\n ],\n [\n 119.428292,\n 35.121205\n ],\n [\n 119.432398,\n 35.111385\n ],\n [\n 119.426633,\n 35.108234\n ],\n [\n 119.412893,\n 35.11073\n ],\n [\n 119.403259,\n 35.106802\n ],\n [\n 119.396467,\n 35.091701\n ],\n [\n 119.386518,\n 35.088918\n ],\n [\n 119.374041,\n 35.078685\n ],\n [\n 119.360379,\n 35.075655\n ],\n [\n 119.350508,\n 35.083883\n ],\n [\n 119.305812,\n 35.076679\n ],\n [\n 119.301785,\n 35.093174\n ],\n [\n 119.286702,\n 35.11515\n ],\n [\n 119.267276,\n 35.117154\n ],\n [\n 119.25551,\n 35.122637\n ],\n [\n 119.240743,\n 35.122923\n ],\n [\n 119.220685,\n 35.10717\n ],\n [\n 119.203233,\n 35.110894\n ],\n [\n 119.196679,\n 35.129919\n ],\n [\n 119.189967,\n 35.138101\n ],\n [\n 119.174252,\n 35.139042\n ],\n [\n 119.164223,\n 35.143173\n ],\n [\n 119.163433,\n 35.154134\n ],\n [\n 119.173146,\n 35.1617\n ],\n [\n 119.164855,\n 35.166525\n ],\n [\n 119.157274,\n 35.18243\n ],\n [\n 119.149219,\n 35.189298\n ],\n [\n 119.1354,\n 35.191669\n ],\n [\n 119.139032,\n 35.202338\n ],\n [\n 119.161301,\n 35.204136\n ],\n [\n 119.170225,\n 35.21231\n ],\n [\n 119.174568,\n 35.230331\n ],\n [\n 119.182149,\n 35.241852\n ],\n [\n 119.181991,\n 35.25231\n ],\n [\n 119.187519,\n 35.258192\n ],\n [\n 119.179543,\n 35.287595\n ],\n [\n 119.164065,\n 35.289554\n ],\n [\n 119.155931,\n 35.293882\n ],\n [\n 119.157669,\n 35.301721\n ],\n [\n 119.143218,\n 35.314048\n ],\n [\n 119.141322,\n 35.320823\n ],\n [\n 119.148193,\n 35.326741\n ],\n [\n 119.146455,\n 35.334862\n ],\n [\n 119.133741,\n 35.335596\n ],\n [\n 119.105708,\n 35.330659\n ],\n [\n 119.096153,\n 35.326864\n ],\n [\n 119.087229,\n 35.340575\n ],\n [\n 119.085571,\n 35.354243\n ],\n [\n 119.078385,\n 35.357506\n ],\n [\n 119.075542,\n 35.366113\n ],\n [\n 119.06575,\n 35.364563\n ],\n [\n 119.04893,\n 35.371498\n ],\n [\n 119.044587,\n 35.377004\n ],\n [\n 119.024371,\n 35.386873\n ],\n [\n 118.999654,\n 35.388953\n ],\n [\n 118.984413,\n 35.382224\n ],\n [\n 118.98852,\n 35.36697\n ],\n [\n 118.986861,\n 35.353141\n ],\n [\n 118.973042,\n 35.340167\n ],\n [\n 118.961828,\n 35.334168\n ],\n [\n 118.947219,\n 35.336943\n ],\n [\n 118.930478,\n 35.331271\n ],\n [\n 118.923213,\n 35.339187\n ],\n [\n 118.92195,\n 35.348408\n ],\n [\n 118.904814,\n 35.355507\n ],\n [\n 118.889573,\n 35.357261\n ],\n [\n 118.871015,\n 35.367215\n ],\n [\n 118.874174,\n 35.388464\n ],\n [\n 118.865725,\n 35.391685\n ],\n [\n 118.859644,\n 35.381694\n ],\n [\n 118.84314,\n 35.370804\n ],\n [\n 118.816764,\n 35.373292\n ],\n [\n 118.797575,\n 35.369417\n ],\n [\n 118.784151,\n 35.371049\n ],\n [\n 118.776412,\n 35.37627\n ],\n [\n 118.768989,\n 35.368031\n ],\n [\n 118.739455,\n 35.359505\n ],\n [\n 118.723898,\n 35.368479\n ],\n [\n 118.712527,\n 35.363544\n ],\n [\n 118.709605,\n 35.369825\n ],\n [\n 118.696891,\n 35.379818\n ],\n [\n 118.682914,\n 35.368642\n ],\n [\n 118.652274,\n 35.373578\n ],\n [\n 118.632059,\n 35.368438\n ],\n [\n 118.625425,\n 35.370315\n ],\n [\n 118.624952,\n 35.387036\n ],\n [\n 118.606157,\n 35.390747\n ],\n [\n 118.601419,\n 35.414517\n ],\n [\n 118.619029,\n 35.423118\n ],\n [\n 118.635691,\n 35.421039\n ],\n [\n 118.642246,\n 35.425156\n ],\n [\n 118.632611,\n 35.430903\n ],\n [\n 118.6289,\n 35.449324\n ],\n [\n 118.64801,\n 35.453276\n ],\n [\n 118.651011,\n 35.458614\n ],\n [\n 118.662066,\n 35.461547\n ],\n [\n 118.667831,\n 35.456821\n ],\n [\n 118.693575,\n 35.459103\n ],\n [\n 118.698234,\n 35.455436\n ],\n [\n 118.709131,\n 35.457677\n ],\n [\n 118.723898,\n 35.468758\n ],\n [\n 118.734322,\n 35.48607\n ],\n [\n 118.725004,\n 35.496578\n ],\n [\n 118.698865,\n 35.513558\n ],\n [\n 118.696575,\n 35.528622\n ],\n [\n 118.725083,\n 35.553205\n ],\n [\n 118.724056,\n 35.562972\n ],\n [\n 118.734875,\n 35.569767\n ],\n [\n 118.74056,\n 35.581484\n ],\n [\n 118.735822,\n 35.593443\n ],\n [\n 118.739692,\n 35.62496\n ],\n [\n 118.751458,\n 35.640409\n ],\n [\n 118.76662,\n 35.653539\n ],\n [\n 118.791416,\n 35.68296\n ],\n [\n 118.794101,\n 35.697504\n ],\n [\n 118.806499,\n 35.718056\n ],\n [\n 118.804209,\n 35.728655\n ],\n [\n 118.798918,\n 35.730117\n ],\n [\n 118.757223,\n 35.725935\n ],\n [\n 118.743482,\n 35.729346\n ],\n [\n 118.722161,\n 35.73101\n ],\n [\n 118.707078,\n 35.738075\n ],\n [\n 118.703288,\n 35.745221\n ],\n [\n 118.706525,\n 35.765152\n ],\n [\n 118.702182,\n 35.772295\n ],\n [\n 118.700603,\n 35.791367\n ],\n [\n 118.716712,\n 35.80723\n ],\n [\n 118.724609,\n 35.820454\n ],\n [\n 118.722082,\n 35.834932\n ],\n [\n 118.732822,\n 35.848111\n ],\n [\n 118.7498,\n 35.849489\n ],\n [\n 118.75438,\n 35.853544\n ],\n [\n 118.756038,\n 35.877379\n ],\n [\n 118.765198,\n 35.898331\n ],\n [\n 118.777281,\n 35.896791\n ],\n [\n 118.775148,\n 35.917251\n ],\n [\n 118.805709,\n 35.923854\n ],\n [\n 118.80413,\n 35.939731\n ],\n [\n 118.813922,\n 35.948761\n ],\n [\n 118.837217,\n 35.948883\n ],\n [\n 118.883571,\n 35.957305\n ],\n [\n 118.893047,\n 35.963257\n ],\n [\n 118.897312,\n 35.97605\n ],\n [\n 118.87986,\n 35.992321\n ],\n [\n 118.896048,\n 36.006404\n ],\n [\n 118.956853,\n 36.008427\n ],\n [\n 118.981886,\n 36.017409\n ],\n [\n 118.999022,\n 36.038404\n ],\n [\n 119.012526,\n 36.03533\n ],\n [\n 119.024134,\n 36.02631\n ],\n [\n 119.017659,\n 36.024044\n ],\n [\n 119.014105,\n 36.013404\n ],\n [\n 119.023739,\n 36.011219\n ],\n [\n 119.024924,\n 36.003571\n ],\n [\n 119.015606,\n 35.995923\n ],\n [\n 119.021054,\n 35.977426\n ],\n [\n 119.05201,\n 35.9803\n ],\n [\n 119.060538,\n 35.978195\n ],\n [\n 119.066619,\n 35.963986\n ],\n [\n 119.07878,\n 35.959289\n ],\n [\n 119.088888,\n 35.963176\n ],\n [\n 119.121817,\n 35.962731\n ],\n [\n 119.134373,\n 35.968601\n ],\n [\n 119.153246,\n 35.971192\n ],\n [\n 119.155063,\n 35.965767\n ],\n [\n 119.178595,\n 35.97107\n ],\n [\n 119.182623,\n 35.962285\n ],\n [\n 119.179385,\n 35.926163\n ],\n [\n 119.183412,\n 35.91875\n ],\n [\n 119.169672,\n 35.91721\n ],\n [\n 119.151746,\n 35.905502\n ],\n [\n 119.144718,\n 35.904449\n ],\n [\n 119.135637,\n 35.892982\n ],\n [\n 119.158221,\n 35.882486\n ],\n [\n 119.161854,\n 35.894481\n ],\n [\n 119.169119,\n 35.894846\n ],\n [\n 119.190598,\n 35.879446\n ],\n [\n 119.217053,\n 35.879527\n ],\n [\n 119.240427,\n 35.884269\n ],\n [\n 119.281964,\n 35.910202\n ],\n [\n 119.294441,\n 35.911336\n ],\n [\n 119.298153,\n 35.893022\n ],\n [\n 119.315999,\n 35.887552\n ],\n [\n 119.345533,\n 35.893792\n ],\n [\n 119.360695,\n 35.884066\n ],\n [\n 119.371435,\n 35.860476\n ],\n [\n 119.358247,\n 35.84511\n ],\n [\n 119.372382,\n 35.830025\n ],\n [\n 119.374041,\n 35.816154\n ],\n [\n 119.368829,\n 35.770834\n ],\n [\n 119.375857,\n 35.770712\n ],\n [\n 119.390466,\n 35.778707\n ],\n [\n 119.397731,\n 35.786823\n ],\n [\n 119.427739,\n 35.802078\n ],\n [\n 119.444322,\n 35.804026\n ],\n [\n 119.455693,\n 35.809056\n ],\n [\n 119.464696,\n 35.80861\n ],\n [\n 119.482385,\n 35.799725\n ],\n [\n 119.493282,\n 35.789866\n ],\n [\n 119.496599,\n 35.779235\n ],\n [\n 119.48657,\n 35.771646\n ],\n [\n 119.48807,\n 35.754599\n ],\n [\n 119.504101,\n 35.752325\n ],\n [\n 119.525422,\n 35.730604\n ],\n [\n 119.517762,\n 35.723742\n ],\n [\n 119.521079,\n 35.716879\n ],\n [\n 119.518473,\n 35.700632\n ],\n [\n 119.51484,\n 35.697992\n ],\n [\n 119.519105,\n 35.68552\n ],\n [\n 119.528265,\n 35.674305\n ],\n [\n 119.524474,\n 35.632279\n ],\n [\n 119.517762,\n 35.625774\n ],\n [\n 119.518157,\n 35.615446\n ],\n [\n 119.536872,\n 35.606011\n ],\n [\n 119.538215,\n 35.589294\n ],\n [\n 119.556535,\n 35.592508\n ],\n [\n 119.57762,\n 35.586243\n ],\n [\n 119.592308,\n 35.600683\n ],\n [\n 119.600599,\n 35.590271\n ],\n [\n 119.609286,\n 35.59202\n ],\n [\n 119.614972,\n 35.606336\n ],\n [\n 119.634713,\n 35.598731\n ],\n [\n 119.651455,\n 35.588766\n ],\n [\n 119.662115,\n 35.589294\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 371300,\n \"name\": \"临沂市\",\n \"center\": [\n 118.326443,\n 35.065282\n ],\n \"centroid\": [\n 118.286436,\n 35.311894\n ],\n \"childrenNum\": 12,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 370000\n },\n \"subFeatureIndex\": 11,\n \"acroutes\": [\n 100000,\n 370000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 117.419191,\n 35.273997\n ],\n [\n 117.439565,\n 35.282368\n ],\n [\n 117.463098,\n 35.287472\n ],\n [\n 117.478891,\n 35.314375\n ],\n [\n 117.453937,\n 35.325027\n ],\n [\n 117.446988,\n 35.330292\n ],\n [\n 117.439012,\n 35.348939\n ],\n [\n 117.439644,\n 35.359668\n ],\n [\n 117.463887,\n 35.375617\n ],\n [\n 117.463334,\n 35.39038\n ],\n [\n 117.474785,\n 35.400941\n ],\n [\n 117.467441,\n 35.418186\n ],\n [\n 117.455833,\n 35.424953\n ],\n [\n 117.453779,\n 35.442396\n ],\n [\n 117.42851,\n 35.458614\n ],\n [\n 117.442171,\n 35.469247\n ],\n [\n 117.452279,\n 35.490306\n ],\n [\n 117.462703,\n 35.497922\n ],\n [\n 117.467441,\n 35.512255\n ],\n [\n 117.472416,\n 35.514372\n ],\n [\n 117.481734,\n 35.507898\n ],\n [\n 117.498396,\n 35.503093\n ],\n [\n 117.501634,\n 35.512947\n ],\n [\n 117.513795,\n 35.514576\n ],\n [\n 117.520033,\n 35.51991\n ],\n [\n 117.516401,\n 35.527319\n ],\n [\n 117.50424,\n 35.531675\n ],\n [\n 117.496264,\n 35.543031\n ],\n [\n 117.499502,\n 35.550845\n ],\n [\n 117.515058,\n 35.551008\n ],\n [\n 117.528641,\n 35.547182\n ],\n [\n 117.582418,\n 35.554141\n ],\n [\n 117.593473,\n 35.567448\n ],\n [\n 117.590394,\n 35.573551\n ],\n [\n 117.592763,\n 35.589701\n ],\n [\n 117.585577,\n 35.593972\n ],\n [\n 117.588893,\n 35.619878\n ],\n [\n 117.596948,\n 35.630449\n ],\n [\n 117.599001,\n 35.649149\n ],\n [\n 117.605319,\n 35.674834\n ],\n [\n 117.62585,\n 35.703841\n ],\n [\n 117.634616,\n 35.709324\n ],\n [\n 117.663913,\n 35.70969\n ],\n [\n 117.679154,\n 35.713305\n ],\n [\n 117.707424,\n 35.726016\n ],\n [\n 117.732615,\n 35.71237\n ],\n [\n 117.754173,\n 35.709609\n ],\n [\n 117.769019,\n 35.726625\n ],\n [\n 117.781733,\n 35.734096\n ],\n [\n 117.811504,\n 35.732919\n ],\n [\n 117.823033,\n 35.739496\n ],\n [\n 117.837405,\n 35.741445\n ],\n [\n 117.833694,\n 35.760484\n ],\n [\n 117.828482,\n 35.773837\n ],\n [\n 117.831167,\n 35.786661\n ],\n [\n 117.846092,\n 35.796398\n ],\n [\n 117.840959,\n 35.812058\n ],\n [\n 117.828403,\n 35.821792\n ],\n [\n 117.827376,\n 35.827754\n ],\n [\n 117.842143,\n 35.84507\n ],\n [\n 117.85541,\n 35.850219\n ],\n [\n 117.86686,\n 35.86984\n ],\n [\n 117.883364,\n 35.882648\n ],\n [\n 117.906265,\n 35.884634\n ],\n [\n 117.924586,\n 35.880946\n ],\n [\n 117.937615,\n 35.874826\n ],\n [\n 117.960516,\n 35.87057\n ],\n [\n 117.968097,\n 35.884066\n ],\n [\n 117.97931,\n 35.889699\n ],\n [\n 117.981364,\n 35.906191\n ],\n [\n 117.988234,\n 35.908703\n ],\n [\n 117.99921,\n 35.925393\n ],\n [\n 117.997394,\n 35.934587\n ],\n [\n 117.988471,\n 35.947709\n ],\n [\n 118.021084,\n 35.949004\n ],\n [\n 118.02298,\n 35.958965\n ],\n [\n 118.03293,\n 35.964998\n ],\n [\n 118.032693,\n 35.974268\n ],\n [\n 118.042248,\n 35.986371\n ],\n [\n 118.058989,\n 35.992968\n ],\n [\n 118.066807,\n 36.009155\n ],\n [\n 118.075888,\n 36.009034\n ],\n [\n 118.078415,\n 36.017652\n ],\n [\n 118.084338,\n 36.012149\n ],\n [\n 118.093261,\n 36.014618\n ],\n [\n 118.096104,\n 36.024246\n ],\n [\n 118.10937,\n 36.030031\n ],\n [\n 118.132666,\n 36.030436\n ],\n [\n 118.135588,\n 36.02364\n ],\n [\n 118.178388,\n 36.017005\n ],\n [\n 118.197578,\n 36.004947\n ],\n [\n 118.206106,\n 35.97864\n ],\n [\n 118.193787,\n 35.974026\n ],\n [\n 118.207054,\n 35.964391\n ],\n [\n 118.209897,\n 35.955767\n ],\n [\n 118.22569,\n 35.948235\n ],\n [\n 118.236351,\n 35.947749\n ],\n [\n 118.236904,\n 35.939245\n ],\n [\n 118.245906,\n 35.932157\n ],\n [\n 118.257119,\n 35.930699\n ],\n [\n 118.257593,\n 35.925717\n ],\n [\n 118.26928,\n 35.928512\n ],\n [\n 118.281362,\n 35.935964\n ],\n [\n 118.293523,\n 35.937503\n ],\n [\n 118.303552,\n 35.948923\n ],\n [\n 118.314134,\n 35.950827\n ],\n [\n 118.320136,\n 35.946575\n ],\n [\n 118.344774,\n 35.955888\n ],\n [\n 118.352828,\n 35.956698\n ],\n [\n 118.360725,\n 35.970908\n ],\n [\n 118.382283,\n 35.975078\n ],\n [\n 118.387021,\n 35.987586\n ],\n [\n 118.415213,\n 35.990783\n ],\n [\n 118.430612,\n 35.969694\n ],\n [\n 118.459356,\n 35.952689\n ],\n [\n 118.470964,\n 35.960868\n ],\n [\n 118.502157,\n 35.962488\n ],\n [\n 118.505157,\n 35.965808\n ],\n [\n 118.499393,\n 35.976212\n ],\n [\n 118.486521,\n 35.988759\n ],\n [\n 118.49268,\n 35.995437\n ],\n [\n 118.487074,\n 36.005797\n ],\n [\n 118.476571,\n 36.012797\n ],\n [\n 118.469859,\n 36.022992\n ],\n [\n 118.476097,\n 36.031407\n ],\n [\n 118.489206,\n 36.025784\n ],\n [\n 118.503341,\n 36.024246\n ],\n [\n 118.507447,\n 36.029789\n ],\n [\n 118.516845,\n 36.026107\n ],\n [\n 118.522609,\n 36.043622\n ],\n [\n 118.522214,\n 36.05349\n ],\n [\n 118.513449,\n 36.064085\n ],\n [\n 118.516608,\n 36.068573\n ],\n [\n 118.507842,\n 36.074961\n ],\n [\n 118.522925,\n 36.084784\n ],\n [\n 118.529479,\n 36.093879\n ],\n [\n 118.526716,\n 36.104671\n ],\n [\n 118.504762,\n 36.105802\n ],\n [\n 118.509974,\n 36.114612\n ],\n [\n 118.515502,\n 36.109884\n ],\n [\n 118.535797,\n 36.118531\n ],\n [\n 118.541719,\n 36.124996\n ],\n [\n 118.556881,\n 36.130935\n ],\n [\n 118.565015,\n 36.130087\n ],\n [\n 118.563988,\n 36.147094\n ],\n [\n 118.572201,\n 36.156424\n ],\n [\n 118.581914,\n 36.151456\n ],\n [\n 118.606236,\n 36.164218\n ],\n [\n 118.622109,\n 36.17718\n ],\n [\n 118.640824,\n 36.171042\n ],\n [\n 118.644299,\n 36.177018\n ],\n [\n 118.653143,\n 36.176695\n ],\n [\n 118.666015,\n 36.168983\n ],\n [\n 118.675491,\n 36.170194\n ],\n [\n 118.683388,\n 36.158564\n ],\n [\n 118.679913,\n 36.152062\n ],\n [\n 118.701235,\n 36.144509\n ],\n [\n 118.703761,\n 36.150446\n ],\n [\n 118.714659,\n 36.154485\n ],\n [\n 118.72603,\n 36.141035\n ],\n [\n 118.736454,\n 36.146528\n ],\n [\n 118.73298,\n 36.1519\n ],\n [\n 118.733532,\n 36.166802\n ],\n [\n 118.741824,\n 36.165551\n ],\n [\n 118.751142,\n 36.183115\n ],\n [\n 118.745535,\n 36.191754\n ],\n [\n 118.766383,\n 36.206649\n ],\n [\n 118.78573,\n 36.197487\n ],\n [\n 118.802076,\n 36.202855\n ],\n [\n 118.809026,\n 36.198738\n ],\n [\n 118.835796,\n 36.203138\n ],\n [\n 118.847009,\n 36.199263\n ],\n [\n 118.848746,\n 36.188606\n ],\n [\n 118.844561,\n 36.18473\n ],\n [\n 118.846614,\n 36.172092\n ],\n [\n 118.85459,\n 36.170194\n ],\n [\n 118.859802,\n 36.16232\n ],\n [\n 118.858302,\n 36.143256\n ],\n [\n 118.863908,\n 36.139298\n ],\n [\n 118.858302,\n 36.129966\n ],\n [\n 118.860197,\n 36.114733\n ],\n [\n 118.865961,\n 36.113682\n ],\n [\n 118.860513,\n 36.101316\n ],\n [\n 118.875911,\n 36.091535\n ],\n [\n 118.880886,\n 36.08438\n ],\n [\n 118.886493,\n 36.088584\n ],\n [\n 118.908288,\n 36.091292\n ],\n [\n 118.920765,\n 36.105721\n ],\n [\n 118.916185,\n 36.111702\n ],\n [\n 118.936322,\n 36.11344\n ],\n [\n 118.943271,\n 36.119582\n ],\n [\n 118.954642,\n 36.1115\n ],\n [\n 118.958512,\n 36.104145\n ],\n [\n 118.970041,\n 36.104671\n ],\n [\n 118.970278,\n 36.09873\n ],\n [\n 118.988756,\n 36.092343\n ],\n [\n 119.000523,\n 36.099497\n ],\n [\n 119.013868,\n 36.09881\n ],\n [\n 119.020344,\n 36.104307\n ],\n [\n 119.038506,\n 36.090444\n ],\n [\n 119.048851,\n 36.092707\n ],\n [\n 119.066935,\n 36.081631\n ],\n [\n 119.063539,\n 36.075042\n ],\n [\n 119.049641,\n 36.066632\n ],\n [\n 119.042534,\n 36.055512\n ],\n [\n 119.040322,\n 36.042934\n ],\n [\n 119.052089,\n 36.037838\n ],\n [\n 119.047903,\n 36.024813\n ],\n [\n 119.035584,\n 36.02275\n ],\n [\n 119.024134,\n 36.02631\n ],\n [\n 119.012526,\n 36.03533\n ],\n [\n 118.999022,\n 36.038404\n ],\n [\n 118.981886,\n 36.017409\n ],\n [\n 118.956853,\n 36.008427\n ],\n [\n 118.896048,\n 36.006404\n ],\n [\n 118.87986,\n 35.992321\n ],\n [\n 118.897312,\n 35.97605\n ],\n [\n 118.893047,\n 35.963257\n ],\n [\n 118.883571,\n 35.957305\n ],\n [\n 118.837217,\n 35.948883\n ],\n [\n 118.813922,\n 35.948761\n ],\n [\n 118.80413,\n 35.939731\n ],\n [\n 118.805709,\n 35.923854\n ],\n [\n 118.775148,\n 35.917251\n ],\n [\n 118.777281,\n 35.896791\n ],\n [\n 118.765198,\n 35.898331\n ],\n [\n 118.756038,\n 35.877379\n ],\n [\n 118.75438,\n 35.853544\n ],\n [\n 118.7498,\n 35.849489\n ],\n [\n 118.732822,\n 35.848111\n ],\n [\n 118.722082,\n 35.834932\n ],\n [\n 118.724609,\n 35.820454\n ],\n [\n 118.716712,\n 35.80723\n ],\n [\n 118.700603,\n 35.791367\n ],\n [\n 118.702182,\n 35.772295\n ],\n [\n 118.706525,\n 35.765152\n ],\n [\n 118.703288,\n 35.745221\n ],\n [\n 118.707078,\n 35.738075\n ],\n [\n 118.722161,\n 35.73101\n ],\n [\n 118.743482,\n 35.729346\n ],\n [\n 118.757223,\n 35.725935\n ],\n [\n 118.798918,\n 35.730117\n ],\n [\n 118.804209,\n 35.728655\n ],\n [\n 118.806499,\n 35.718056\n ],\n [\n 118.794101,\n 35.697504\n ],\n [\n 118.791416,\n 35.68296\n ],\n [\n 118.76662,\n 35.653539\n ],\n [\n 118.751458,\n 35.640409\n ],\n [\n 118.739692,\n 35.62496\n ],\n [\n 118.735822,\n 35.593443\n ],\n [\n 118.74056,\n 35.581484\n ],\n [\n 118.734875,\n 35.569767\n ],\n [\n 118.724056,\n 35.562972\n ],\n [\n 118.725083,\n 35.553205\n ],\n [\n 118.696575,\n 35.528622\n ],\n [\n 118.698865,\n 35.513558\n ],\n [\n 118.725004,\n 35.496578\n ],\n [\n 118.734322,\n 35.48607\n ],\n [\n 118.723898,\n 35.468758\n ],\n [\n 118.709131,\n 35.457677\n ],\n [\n 118.698234,\n 35.455436\n ],\n [\n 118.693575,\n 35.459103\n ],\n [\n 118.667831,\n 35.456821\n ],\n [\n 118.662066,\n 35.461547\n ],\n [\n 118.651011,\n 35.458614\n ],\n [\n 118.64801,\n 35.453276\n ],\n [\n 118.6289,\n 35.449324\n ],\n [\n 118.632611,\n 35.430903\n ],\n [\n 118.642246,\n 35.425156\n ],\n [\n 118.635691,\n 35.421039\n ],\n [\n 118.619029,\n 35.423118\n ],\n [\n 118.601419,\n 35.414517\n ],\n [\n 118.606157,\n 35.390747\n ],\n [\n 118.624952,\n 35.387036\n ],\n [\n 118.625425,\n 35.370315\n ],\n [\n 118.632059,\n 35.368438\n ],\n [\n 118.652274,\n 35.373578\n ],\n [\n 118.682914,\n 35.368642\n ],\n [\n 118.696891,\n 35.379818\n ],\n [\n 118.709605,\n 35.369825\n ],\n [\n 118.712527,\n 35.363544\n ],\n [\n 118.723898,\n 35.368479\n ],\n [\n 118.739455,\n 35.359505\n ],\n [\n 118.768989,\n 35.368031\n ],\n [\n 118.776412,\n 35.37627\n ],\n [\n 118.784151,\n 35.371049\n ],\n [\n 118.797575,\n 35.369417\n ],\n [\n 118.816764,\n 35.373292\n ],\n [\n 118.84314,\n 35.370804\n ],\n [\n 118.859644,\n 35.381694\n ],\n [\n 118.865725,\n 35.391685\n ],\n [\n 118.874174,\n 35.388464\n ],\n [\n 118.871015,\n 35.367215\n ],\n [\n 118.889573,\n 35.357261\n ],\n [\n 118.904814,\n 35.355507\n ],\n [\n 118.92195,\n 35.348408\n ],\n [\n 118.923213,\n 35.339187\n ],\n [\n 118.930478,\n 35.331271\n ],\n [\n 118.947219,\n 35.336943\n ],\n [\n 118.961828,\n 35.334168\n ],\n [\n 118.973042,\n 35.340167\n ],\n [\n 118.986861,\n 35.353141\n ],\n [\n 118.98852,\n 35.36697\n ],\n [\n 118.984413,\n 35.382224\n ],\n [\n 118.999654,\n 35.388953\n ],\n [\n 119.024371,\n 35.386873\n ],\n [\n 119.044587,\n 35.377004\n ],\n [\n 119.04893,\n 35.371498\n ],\n [\n 119.06575,\n 35.364563\n ],\n [\n 119.075542,\n 35.366113\n ],\n [\n 119.078385,\n 35.357506\n ],\n [\n 119.085571,\n 35.354243\n ],\n [\n 119.087229,\n 35.340575\n ],\n [\n 119.096153,\n 35.326864\n ],\n [\n 119.105708,\n 35.330659\n ],\n [\n 119.133741,\n 35.335596\n ],\n [\n 119.146455,\n 35.334862\n ],\n [\n 119.148193,\n 35.326741\n ],\n [\n 119.141322,\n 35.320823\n ],\n [\n 119.143218,\n 35.314048\n ],\n [\n 119.157669,\n 35.301721\n ],\n [\n 119.155931,\n 35.293882\n ],\n [\n 119.164065,\n 35.289554\n ],\n [\n 119.179543,\n 35.287595\n ],\n [\n 119.187519,\n 35.258192\n ],\n [\n 119.181991,\n 35.25231\n ],\n [\n 119.182149,\n 35.241852\n ],\n [\n 119.174568,\n 35.230331\n ],\n [\n 119.170225,\n 35.21231\n ],\n [\n 119.161301,\n 35.204136\n ],\n [\n 119.139032,\n 35.202338\n ],\n [\n 119.1354,\n 35.191669\n ],\n [\n 119.149219,\n 35.189298\n ],\n [\n 119.157274,\n 35.18243\n ],\n [\n 119.164855,\n 35.166525\n ],\n [\n 119.173146,\n 35.1617\n ],\n [\n 119.163433,\n 35.154134\n ],\n [\n 119.164223,\n 35.143173\n ],\n [\n 119.174252,\n 35.139042\n ],\n [\n 119.189967,\n 35.138101\n ],\n [\n 119.196679,\n 35.129919\n ],\n [\n 119.203233,\n 35.110894\n ],\n [\n 119.171409,\n 35.10717\n ],\n [\n 119.159011,\n 35.100991\n ],\n [\n 119.138085,\n 35.096285\n ],\n [\n 119.129477,\n 35.076187\n ],\n [\n 119.120475,\n 35.070088\n ],\n [\n 119.120396,\n 35.05801\n ],\n [\n 119.114631,\n 35.05498\n ],\n [\n 119.073647,\n 35.056659\n ],\n [\n 119.061407,\n 35.051581\n ],\n [\n 119.037401,\n 35.051335\n ],\n [\n 119.00534,\n 35.05412\n ],\n [\n 118.992152,\n 35.048182\n ],\n [\n 118.965619,\n 35.046462\n ],\n [\n 118.945166,\n 35.040811\n ],\n [\n 118.928504,\n 35.050885\n ],\n [\n 118.911131,\n 35.047773\n ],\n [\n 118.903787,\n 35.041343\n ],\n [\n 118.885782,\n 35.034258\n ],\n [\n 118.86533,\n 35.029834\n ],\n [\n 118.862487,\n 35.025697\n ],\n [\n 118.865093,\n 34.993208\n ],\n [\n 118.859249,\n 34.962633\n ],\n [\n 118.86075,\n 34.943979\n ],\n [\n 118.829715,\n 34.911129\n ],\n [\n 118.805235,\n 34.873055\n ],\n [\n 118.802471,\n 34.845637\n ],\n [\n 118.768989,\n 34.846129\n ],\n [\n 118.768278,\n 34.838822\n ],\n [\n 118.78194,\n 34.82749\n ],\n [\n 118.776649,\n 34.818785\n ],\n [\n 118.779018,\n 34.809627\n ],\n [\n 118.773569,\n 34.795333\n ],\n [\n 118.756512,\n 34.789541\n ],\n [\n 118.73756,\n 34.792088\n ],\n [\n 118.728399,\n 34.786871\n ],\n [\n 118.740166,\n 34.781243\n ],\n [\n 118.738507,\n 34.766862\n ],\n [\n 118.727215,\n 34.768752\n ],\n [\n 118.716475,\n 34.763821\n ],\n [\n 118.719239,\n 34.745533\n ],\n [\n 118.730374,\n 34.745451\n ],\n [\n 118.740087,\n 34.736901\n ],\n [\n 118.759197,\n 34.740847\n ],\n [\n 118.768515,\n 34.738093\n ],\n [\n 118.78344,\n 34.722061\n ],\n [\n 118.758723,\n 34.703434\n ],\n [\n 118.739376,\n 34.69377\n ],\n [\n 118.720108,\n 34.694222\n ],\n [\n 118.704077,\n 34.688752\n ],\n [\n 118.690258,\n 34.678593\n ],\n [\n 118.681335,\n 34.678346\n ],\n [\n 118.664357,\n 34.693441\n ],\n [\n 118.650537,\n 34.695086\n ],\n [\n 118.633717,\n 34.687025\n ],\n [\n 118.604894,\n 34.696484\n ],\n [\n 118.60134,\n 34.714167\n ],\n [\n 118.570464,\n 34.712522\n ],\n [\n 118.558934,\n 34.706847\n ],\n [\n 118.546063,\n 34.70619\n ],\n [\n 118.53935,\n 34.711494\n ],\n [\n 118.525215,\n 34.712563\n ],\n [\n 118.522688,\n 34.692289\n ],\n [\n 118.508158,\n 34.687066\n ],\n [\n 118.500814,\n 34.675178\n ],\n [\n 118.484231,\n 34.6709\n ],\n [\n 118.468437,\n 34.674315\n ],\n [\n 118.460856,\n 34.65757\n ],\n [\n 118.466463,\n 34.643127\n ],\n [\n 118.474913,\n 34.637201\n ],\n [\n 118.473807,\n 34.623412\n ],\n [\n 118.46362,\n 34.625265\n ],\n [\n 118.452881,\n 34.617691\n ],\n [\n 118.439219,\n 34.626294\n ],\n [\n 118.42382,\n 34.591094\n ],\n [\n 118.428322,\n 34.563253\n ],\n [\n 118.440956,\n 34.52477\n ],\n [\n 118.439535,\n 34.507996\n ],\n [\n 118.430928,\n 34.489074\n ],\n [\n 118.421372,\n 34.483219\n ],\n [\n 118.41624,\n 34.473859\n ],\n [\n 118.411344,\n 34.446391\n ],\n [\n 118.405342,\n 34.437027\n ],\n [\n 118.404947,\n 34.427744\n ],\n [\n 118.395155,\n 34.427084\n ],\n [\n 118.379993,\n 34.415531\n ],\n [\n 118.353223,\n 34.41747\n ],\n [\n 118.352197,\n 34.422834\n ],\n [\n 118.320925,\n 34.421349\n ],\n [\n 118.290681,\n 34.424567\n ],\n [\n 118.28918,\n 34.412271\n ],\n [\n 118.279862,\n 34.412188\n ],\n [\n 118.277414,\n 34.404677\n ],\n [\n 118.242431,\n 34.405709\n ],\n [\n 118.230981,\n 34.398693\n ],\n [\n 118.220241,\n 34.405957\n ],\n [\n 118.217714,\n 34.379127\n ],\n [\n 118.204369,\n 34.377352\n ],\n [\n 118.189602,\n 34.380654\n ],\n [\n 118.183363,\n 34.390355\n ],\n [\n 118.179336,\n 34.379416\n ],\n [\n 118.170413,\n 34.381356\n ],\n [\n 118.177125,\n 34.408722\n ],\n [\n 118.178862,\n 34.425186\n ],\n [\n 118.177757,\n 34.453238\n ],\n [\n 118.139931,\n 34.475344\n ],\n [\n 118.132824,\n 34.483425\n ],\n [\n 118.141826,\n 34.497154\n ],\n [\n 118.164964,\n 34.504904\n ],\n [\n 118.16757,\n 34.519701\n ],\n [\n 118.184706,\n 34.544179\n ],\n [\n 118.163542,\n 34.551471\n ],\n [\n 118.153671,\n 34.549164\n ],\n [\n 118.140721,\n 34.554025\n ],\n [\n 118.137167,\n 34.563253\n ],\n [\n 118.126428,\n 34.55522\n ],\n [\n 118.100447,\n 34.564736\n ],\n [\n 118.078968,\n 34.569761\n ],\n [\n 118.082363,\n 34.579893\n ],\n [\n 118.102816,\n 34.593441\n ],\n [\n 118.11474,\n 34.614397\n ],\n [\n 118.113003,\n 34.621437\n ],\n [\n 118.100526,\n 34.626582\n ],\n [\n 118.094603,\n 34.636583\n ],\n [\n 118.102658,\n 34.647736\n ],\n [\n 118.084022,\n 34.655924\n ],\n [\n 118.077783,\n 34.653702\n ],\n [\n 118.05741,\n 34.655019\n ],\n [\n 118.053935,\n 34.650945\n ],\n [\n 118.02069,\n 34.660409\n ],\n [\n 118.018242,\n 34.647036\n ],\n [\n 118.007818,\n 34.64753\n ],\n [\n 118.007423,\n 34.65613\n ],\n [\n 117.99084,\n 34.661726\n ],\n [\n 117.991708,\n 34.670077\n ],\n [\n 117.96328,\n 34.678552\n ],\n [\n 117.951672,\n 34.678469\n ],\n [\n 117.939669,\n 34.664852\n ],\n [\n 117.90974,\n 34.67016\n ],\n [\n 117.903106,\n 34.644567\n ],\n [\n 117.880995,\n 34.645184\n ],\n [\n 117.877916,\n 34.650205\n ],\n [\n 117.863465,\n 34.645184\n ],\n [\n 117.849408,\n 34.647201\n ],\n [\n 117.847513,\n 34.652386\n ],\n [\n 117.834483,\n 34.647324\n ],\n [\n 117.831798,\n 34.653455\n ],\n [\n 117.820111,\n 34.646172\n ],\n [\n 117.805818,\n 34.646254\n ],\n [\n 117.819243,\n 34.681842\n ],\n [\n 117.825639,\n 34.684392\n ],\n [\n 117.831719,\n 34.707793\n ],\n [\n 117.825244,\n 34.713139\n ],\n [\n 117.823665,\n 34.72868\n ],\n [\n 117.830061,\n 34.740888\n ],\n [\n 117.830614,\n 34.760246\n ],\n [\n 117.79958,\n 34.768875\n ],\n [\n 117.784576,\n 34.780667\n ],\n [\n 117.784023,\n 34.79484\n ],\n [\n 117.77739,\n 34.801248\n ],\n [\n 117.798632,\n 34.810653\n ],\n [\n 117.803686,\n 34.830734\n ],\n [\n 117.795315,\n 34.835907\n ],\n [\n 117.763175,\n 34.848839\n ],\n [\n 117.75291,\n 34.857623\n ],\n [\n 117.742407,\n 34.874163\n ],\n [\n 117.729298,\n 34.876994\n ],\n [\n 117.715163,\n 34.896238\n ],\n [\n 117.70466,\n 34.906699\n ],\n [\n 117.698501,\n 34.919989\n ],\n [\n 117.704265,\n 34.933605\n ],\n [\n 117.712004,\n 34.934999\n ],\n [\n 117.714689,\n 34.947833\n ],\n [\n 117.724323,\n 34.958329\n ],\n [\n 117.719506,\n 34.968331\n ],\n [\n 117.726534,\n 34.979561\n ],\n [\n 117.728035,\n 35.008041\n ],\n [\n 117.737985,\n 35.013203\n ],\n [\n 117.744618,\n 35.022748\n ],\n [\n 117.736247,\n 35.031514\n ],\n [\n 117.704423,\n 35.031227\n ],\n [\n 117.707345,\n 35.052318\n ],\n [\n 117.69321,\n 35.06018\n ],\n [\n 117.676469,\n 35.065543\n ],\n [\n 117.656885,\n 35.077497\n ],\n [\n 117.650725,\n 35.092724\n ],\n [\n 117.623007,\n 35.113063\n ],\n [\n 117.604371,\n 35.13401\n ],\n [\n 117.600344,\n 35.135524\n ],\n [\n 117.591025,\n 35.152539\n ],\n [\n 117.586208,\n 35.152989\n ],\n [\n 117.58376,\n 35.164317\n ],\n [\n 117.570336,\n 35.168365\n ],\n [\n 117.556043,\n 35.161291\n ],\n [\n 117.548462,\n 35.161741\n ],\n [\n 117.528009,\n 35.184351\n ],\n [\n 117.526825,\n 35.200621\n ],\n [\n 117.507162,\n 35.198986\n ],\n [\n 117.494843,\n 35.205893\n ],\n [\n 117.480628,\n 35.222771\n ],\n [\n 117.468073,\n 35.228369\n ],\n [\n 117.448331,\n 35.231842\n ],\n [\n 117.449752,\n 35.246795\n ],\n [\n 117.439486,\n 35.258927\n ],\n [\n 117.426456,\n 35.261786\n ],\n [\n 117.419191,\n 35.273997\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 371400,\n \"name\": \"德州市\",\n \"center\": [\n 116.307428,\n 37.453968\n ],\n \"centroid\": [\n 116.653994,\n 37.251363\n ],\n \"childrenNum\": 11,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 370000\n },\n \"subFeatureIndex\": 12,\n \"acroutes\": [\n 100000,\n 370000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 115.768684,\n 36.921014\n ],\n [\n 115.761972,\n 36.924413\n ],\n [\n 115.762683,\n 36.939327\n ],\n [\n 115.772791,\n 36.936849\n ],\n [\n 115.788189,\n 36.9526\n ],\n [\n 115.796876,\n 36.968747\n ],\n [\n 115.791743,\n 36.975261\n ],\n [\n 115.784478,\n 36.970625\n ],\n [\n 115.786373,\n 36.983093\n ],\n [\n 115.776265,\n 36.990884\n ],\n [\n 115.790874,\n 37.005985\n ],\n [\n 115.808089,\n 37.010259\n ],\n [\n 115.813222,\n 37.019126\n ],\n [\n 115.812354,\n 37.02895\n ],\n [\n 115.825778,\n 37.032384\n ],\n [\n 115.831938,\n 37.045281\n ],\n [\n 115.85626,\n 37.06073\n ],\n [\n 115.855154,\n 37.071108\n ],\n [\n 115.865025,\n 37.070828\n ],\n [\n 115.868263,\n 37.084038\n ],\n [\n 115.879476,\n 37.105583\n ],\n [\n 115.885399,\n 37.128757\n ],\n [\n 115.879397,\n 37.138647\n ],\n [\n 115.87995,\n 37.152004\n ],\n [\n 115.892269,\n 37.157625\n ],\n [\n 115.912485,\n 37.178751\n ],\n [\n 115.904825,\n 37.189391\n ],\n [\n 115.9098,\n 37.206803\n ],\n [\n 115.920145,\n 37.214173\n ],\n [\n 115.920934,\n 37.223534\n ],\n [\n 115.926778,\n 37.219511\n ],\n [\n 115.941387,\n 37.227716\n ],\n [\n 115.953232,\n 37.223693\n ],\n [\n 115.969421,\n 37.239464\n ],\n [\n 115.971079,\n 37.245636\n ],\n [\n 115.963972,\n 37.250096\n ],\n [\n 115.972895,\n 37.257103\n ],\n [\n 115.966973,\n 37.265742\n ],\n [\n 115.975185,\n 37.268967\n ],\n [\n 115.976212,\n 37.276171\n ],\n [\n 115.96871,\n 37.28632\n ],\n [\n 115.970763,\n 37.295553\n ],\n [\n 115.981503,\n 37.30737\n ],\n [\n 115.984346,\n 37.319265\n ],\n [\n 115.975659,\n 37.317515\n ],\n [\n 115.972974,\n 37.324039\n ],\n [\n 115.984503,\n 37.326067\n ],\n [\n 115.975738,\n 37.337283\n ],\n [\n 115.986951,\n 37.341738\n ],\n [\n 116.009457,\n 37.343169\n ],\n [\n 116.000376,\n 37.350804\n ],\n [\n 116.013643,\n 37.349571\n ],\n [\n 116.024461,\n 37.359949\n ],\n [\n 116.031252,\n 37.356411\n ],\n [\n 116.051942,\n 37.357484\n ],\n [\n 116.056206,\n 37.369053\n ],\n [\n 116.072474,\n 37.368099\n ],\n [\n 116.087557,\n 37.373307\n ],\n [\n 116.106588,\n 37.368815\n ],\n [\n 116.116459,\n 37.374301\n ],\n [\n 116.126646,\n 37.373466\n ],\n [\n 116.168814,\n 37.384118\n ],\n [\n 116.18524,\n 37.369928\n ],\n [\n 116.195506,\n 37.365674\n ],\n [\n 116.234437,\n 37.361221\n ],\n [\n 116.251652,\n 37.376566\n ],\n [\n 116.261602,\n 37.389802\n ],\n [\n 116.270446,\n 37.389126\n ],\n [\n 116.273052,\n 37.398425\n ],\n [\n 116.282923,\n 37.401326\n ],\n [\n 116.270446,\n 37.413802\n ],\n [\n 116.275026,\n 37.418252\n ],\n [\n 116.263023,\n 37.422423\n ],\n [\n 116.270999,\n 37.426714\n ],\n [\n 116.250072,\n 37.425919\n ],\n [\n 116.247151,\n 37.422066\n ],\n [\n 116.231515,\n 37.424529\n ],\n [\n 116.22733,\n 37.434261\n ],\n [\n 116.243123,\n 37.448201\n ],\n [\n 116.243597,\n 37.455904\n ],\n [\n 116.229936,\n 37.459676\n ],\n [\n 116.224803,\n 37.479963\n ],\n [\n 116.235068,\n 37.479725\n ],\n [\n 116.241307,\n 37.491434\n ],\n [\n 116.258285,\n 37.482662\n ],\n [\n 116.256469,\n 37.478812\n ],\n [\n 116.276448,\n 37.466902\n ],\n [\n 116.271473,\n 37.478931\n ],\n [\n 116.290899,\n 37.484766\n ],\n [\n 116.286082,\n 37.491117\n ],\n [\n 116.292952,\n 37.497387\n ],\n [\n 116.284344,\n 37.500721\n ],\n [\n 116.297532,\n 37.508816\n ],\n [\n 116.280317,\n 37.510879\n ],\n [\n 116.283555,\n 37.517584\n ],\n [\n 116.278422,\n 37.524765\n ],\n [\n 116.291373,\n 37.523813\n ],\n [\n 116.286082,\n 37.532619\n ],\n [\n 116.291373,\n 37.545589\n ],\n [\n 116.287898,\n 37.549317\n ],\n [\n 116.299348,\n 37.55935\n ],\n [\n 116.299664,\n 37.56958\n ],\n [\n 116.304481,\n 37.564505\n ],\n [\n 116.334805,\n 37.574773\n ],\n [\n 116.319406,\n 37.580046\n ],\n [\n 116.33591,\n 37.581235\n ],\n [\n 116.344913,\n 37.570492\n ],\n [\n 116.343491,\n 37.566011\n ],\n [\n 116.367655,\n 37.566289\n ],\n [\n 116.375473,\n 37.560341\n ],\n [\n 116.376895,\n 37.546581\n ],\n [\n 116.367892,\n 37.533809\n ],\n [\n 116.368919,\n 37.526392\n ],\n [\n 116.382738,\n 37.523615\n ],\n [\n 116.388661,\n 37.516315\n ],\n [\n 116.402164,\n 37.509847\n ],\n [\n 116.414089,\n 37.490997\n ],\n [\n 116.434146,\n 37.473334\n ],\n [\n 116.438648,\n 37.477224\n ],\n [\n 116.446702,\n 37.500562\n ],\n [\n 116.46218,\n 37.517426\n ],\n [\n 116.482633,\n 37.52179\n ],\n [\n 116.49969,\n 37.537855\n ],\n [\n 116.507113,\n 37.541822\n ],\n [\n 116.51959,\n 37.559905\n ],\n [\n 116.538463,\n 37.56843\n ],\n [\n 116.545807,\n 37.582504\n ],\n [\n 116.563496,\n 37.596495\n ],\n [\n 116.556547,\n 37.596852\n ],\n [\n 116.580316,\n 37.613258\n ],\n [\n 116.60448,\n 37.625105\n ],\n [\n 116.630776,\n 37.652713\n ],\n [\n 116.640884,\n 37.666454\n ],\n [\n 116.636462,\n 37.675877\n ],\n [\n 116.641042,\n 37.68233\n ],\n [\n 116.646412,\n 37.676233\n ],\n [\n 116.653677,\n 37.67754\n ],\n [\n 116.664022,\n 37.687793\n ],\n [\n 116.675235,\n 37.720838\n ],\n [\n 116.679736,\n 37.72879\n ],\n [\n 116.69932,\n 37.73065\n ],\n [\n 116.698768,\n 37.738759\n ],\n [\n 116.709586,\n 37.735199\n ],\n [\n 116.724511,\n 37.744297\n ],\n [\n 116.718826,\n 37.762331\n ],\n [\n 116.723169,\n 37.766721\n ],\n [\n 116.73912,\n 37.756914\n ],\n [\n 116.744174,\n 37.757349\n ],\n [\n 116.753808,\n 37.770517\n ],\n [\n 116.75365,\n 37.793011\n ],\n [\n 116.74599,\n 37.795778\n ],\n [\n 116.758941,\n 37.801865\n ],\n [\n 116.766838,\n 37.81135\n ],\n [\n 116.786185,\n 37.826326\n ],\n [\n 116.788159,\n 37.843432\n ],\n [\n 116.794556,\n 37.846987\n ],\n [\n 116.811771,\n 37.847935\n ],\n [\n 116.812718,\n 37.84359\n ],\n [\n 116.828038,\n 37.840627\n ],\n [\n 116.843753,\n 37.834465\n ],\n [\n 116.879604,\n 37.843748\n ],\n [\n 116.919325,\n 37.84592\n ],\n [\n 116.950359,\n 37.839719\n ],\n [\n 116.976656,\n 37.841062\n ],\n [\n 117.008874,\n 37.833872\n ],\n [\n 117.027195,\n 37.832371\n ],\n [\n 117.040541,\n 37.839324\n ],\n [\n 117.074339,\n 37.848725\n ],\n [\n 117.093765,\n 37.849515\n ],\n [\n 117.150148,\n 37.8396\n ],\n [\n 117.163651,\n 37.839798\n ],\n [\n 117.185368,\n 37.849791\n ],\n [\n 117.208821,\n 37.843748\n ],\n [\n 117.259755,\n 37.838257\n ],\n [\n 117.271364,\n 37.839916\n ],\n [\n 117.284472,\n 37.84675\n ],\n [\n 117.302951,\n 37.852358\n ],\n [\n 117.320166,\n 37.861402\n ],\n [\n 117.344251,\n 37.862666\n ],\n [\n 117.364704,\n 37.854136\n ],\n [\n 117.381919,\n 37.854531\n ],\n [\n 117.40632,\n 37.843511\n ],\n [\n 117.423614,\n 37.847263\n ],\n [\n 117.438539,\n 37.853859\n ],\n [\n 117.466809,\n 37.890739\n ],\n [\n 117.481181,\n 37.914854\n ],\n [\n 117.49271,\n 37.927481\n ],\n [\n 117.512847,\n 37.943459\n ],\n [\n 117.520902,\n 37.966729\n ],\n [\n 117.524377,\n 37.989479\n ],\n [\n 117.541039,\n 38.011237\n ],\n [\n 117.54933,\n 38.010252\n ],\n [\n 117.563545,\n 37.998585\n ],\n [\n 117.570652,\n 37.957264\n ],\n [\n 117.567809,\n 37.946772\n ],\n [\n 117.529036,\n 37.932295\n ],\n [\n 117.539302,\n 37.913552\n ],\n [\n 117.542776,\n 37.890146\n ],\n [\n 117.547198,\n 37.883198\n ],\n [\n 117.568835,\n 37.882409\n ],\n [\n 117.580602,\n 37.875302\n ],\n [\n 117.581076,\n 37.858993\n ],\n [\n 117.595685,\n 37.853504\n ],\n [\n 117.606582,\n 37.845209\n ],\n [\n 117.605003,\n 37.838968\n ],\n [\n 117.59529,\n 37.834741\n ],\n [\n 117.588025,\n 37.82273\n ],\n [\n 117.56623,\n 37.812733\n ],\n [\n 117.568599,\n 37.804987\n ],\n [\n 117.559912,\n 37.800008\n ],\n [\n 117.546567,\n 37.776368\n ],\n [\n 117.547356,\n 37.767512\n ],\n [\n 117.526509,\n 37.762964\n ],\n [\n 117.522165,\n 37.755371\n ],\n [\n 117.531563,\n 37.748213\n ],\n [\n 117.544119,\n 37.747699\n ],\n [\n 117.547198,\n 37.737494\n ],\n [\n 117.542618,\n 37.726258\n ],\n [\n 117.556201,\n 37.716683\n ],\n [\n 117.539775,\n 37.713993\n ],\n [\n 117.543092,\n 37.703625\n ],\n [\n 117.531247,\n 37.688901\n ],\n [\n 117.506451,\n 37.686803\n ],\n [\n 117.50345,\n 37.680548\n ],\n [\n 117.488604,\n 37.677025\n ],\n [\n 117.477075,\n 37.654416\n ],\n [\n 117.465625,\n 37.655564\n ],\n [\n 117.451963,\n 37.669978\n ],\n [\n 117.444224,\n 37.671918\n ],\n [\n 117.428825,\n 37.665741\n ],\n [\n 117.415401,\n 37.669582\n ],\n [\n 117.407188,\n 37.678846\n ],\n [\n 117.392974,\n 37.660039\n ],\n [\n 117.373074,\n 37.648594\n ],\n [\n 117.363835,\n 37.649624\n ],\n [\n 117.357596,\n 37.658495\n ],\n [\n 117.358149,\n 37.672947\n ],\n [\n 117.363598,\n 37.679559\n ],\n [\n 117.36573,\n 37.698361\n ],\n [\n 117.352543,\n 37.707345\n ],\n [\n 117.344567,\n 37.693136\n ],\n [\n 117.347489,\n 37.683319\n ],\n [\n 117.329405,\n 37.673343\n ],\n [\n 117.318428,\n 37.662019\n ],\n [\n 117.312506,\n 37.64194\n ],\n [\n 117.304925,\n 37.640514\n ],\n [\n 117.312585,\n 37.633701\n ],\n [\n 117.317797,\n 37.615081\n ],\n [\n 117.314875,\n 37.600458\n ],\n [\n 117.308321,\n 37.589956\n ],\n [\n 117.288973,\n 37.577112\n ],\n [\n 117.280682,\n 37.56621\n ],\n [\n 117.277681,\n 37.545391\n ],\n [\n 117.273417,\n 37.532619\n ],\n [\n 117.260861,\n 37.530081\n ],\n [\n 117.238197,\n 37.532897\n ],\n [\n 117.230063,\n 37.528891\n ],\n [\n 117.22114,\n 37.51318\n ],\n [\n 117.199345,\n 37.487148\n ],\n [\n 117.176049,\n 37.486116\n ],\n [\n 117.163809,\n 37.478971\n ],\n [\n 117.135618,\n 37.475239\n ],\n [\n 117.124878,\n 37.483853\n ],\n [\n 117.109795,\n 37.47901\n ],\n [\n 117.098819,\n 37.469721\n ],\n [\n 117.104978,\n 37.455309\n ],\n [\n 117.096845,\n 37.440099\n ],\n [\n 117.085631,\n 37.437517\n ],\n [\n 117.029406,\n 37.435174\n ],\n [\n 117.018193,\n 37.418967\n ],\n [\n 117.019693,\n 37.405419\n ],\n [\n 117.008164,\n 37.392464\n ],\n [\n 116.99924,\n 37.376964\n ],\n [\n 117.009664,\n 37.359671\n ],\n [\n 117.006663,\n 37.355138\n ],\n [\n 116.987158,\n 37.342692\n ],\n [\n 116.986684,\n 37.335335\n ],\n [\n 116.993397,\n 37.32201\n ],\n [\n 117.002241,\n 37.285962\n ],\n [\n 117.024273,\n 37.278918\n ],\n [\n 117.038961,\n 37.266538\n ],\n [\n 117.030275,\n 37.264229\n ],\n [\n 117.032328,\n 37.253241\n ],\n [\n 117.041251,\n 37.247667\n ],\n [\n 117.042673,\n 37.238867\n ],\n [\n 117.036592,\n 37.237393\n ],\n [\n 117.03596,\n 37.224091\n ],\n [\n 117.022299,\n 37.215089\n ],\n [\n 117.037777,\n 37.207361\n ],\n [\n 117.037382,\n 37.195169\n ],\n [\n 117.045358,\n 37.197161\n ],\n [\n 117.05744,\n 37.192141\n ],\n [\n 117.06352,\n 37.182656\n ],\n [\n 117.061783,\n 37.16496\n ],\n [\n 117.050648,\n 37.160894\n ],\n [\n 117.054676,\n 37.141717\n ],\n [\n 117.059809,\n 37.137251\n ],\n [\n 117.047411,\n 37.134739\n ],\n [\n 117.044884,\n 37.122615\n ],\n [\n 117.024273,\n 37.119664\n ],\n [\n 117.004531,\n 37.121219\n ],\n [\n 116.982578,\n 37.113601\n ],\n [\n 116.931486,\n 37.100477\n ],\n [\n 116.919009,\n 37.093056\n ],\n [\n 116.91972,\n 37.081364\n ],\n [\n 116.925247,\n 37.069831\n ],\n [\n 116.928643,\n 37.05103\n ],\n [\n 116.944279,\n 37.042327\n ],\n [\n 116.948701,\n 37.036537\n ],\n [\n 116.943173,\n 37.030907\n ],\n [\n 116.907796,\n 37.019046\n ],\n [\n 116.891607,\n 37.00271\n ],\n [\n 116.875024,\n 36.999274\n ],\n [\n 116.885764,\n 36.991444\n ],\n [\n 116.886158,\n 36.983573\n ],\n [\n 116.899188,\n 36.977499\n ],\n [\n 116.897767,\n 36.962712\n ],\n [\n 116.907717,\n 36.963272\n ],\n [\n 116.933381,\n 36.959595\n ],\n [\n 116.931881,\n 36.946204\n ],\n [\n 116.935434,\n 36.93457\n ],\n [\n 116.922563,\n 36.93453\n ],\n [\n 116.934408,\n 36.925973\n ],\n [\n 116.957466,\n 36.916495\n ],\n [\n 116.963152,\n 36.893896\n ],\n [\n 116.96181,\n 36.867529\n ],\n [\n 116.962836,\n 36.842674\n ],\n [\n 116.948069,\n 36.839231\n ],\n [\n 116.9442,\n 36.844916\n ],\n [\n 116.934724,\n 36.845116\n ],\n [\n 116.935908,\n 36.829743\n ],\n [\n 116.933223,\n 36.823697\n ],\n [\n 116.919404,\n 36.822776\n ],\n [\n 116.892476,\n 36.830023\n ],\n [\n 116.887106,\n 36.833427\n ],\n [\n 116.882447,\n 36.824058\n ],\n [\n 116.887975,\n 36.811404\n ],\n [\n 116.872813,\n 36.812004\n ],\n [\n 116.868233,\n 36.801872\n ],\n [\n 116.865548,\n 36.777877\n ],\n [\n 116.87076,\n 36.759164\n ],\n [\n 116.883868,\n 36.758243\n ],\n [\n 116.88679,\n 36.745538\n ],\n [\n 116.873997,\n 36.739846\n ],\n [\n 116.861757,\n 36.730345\n ],\n [\n 116.842489,\n 36.72786\n ],\n [\n 116.830881,\n 36.723851\n ],\n [\n 116.802768,\n 36.706729\n ],\n [\n 116.799689,\n 36.694417\n ],\n [\n 116.780657,\n 36.691048\n ],\n [\n 116.780736,\n 36.671552\n ],\n [\n 116.777262,\n 36.660718\n ],\n [\n 116.763126,\n 36.651971\n ],\n [\n 116.759494,\n 36.632746\n ],\n [\n 116.742042,\n 36.620381\n ],\n [\n 116.71314,\n 36.608858\n ],\n [\n 116.693319,\n 36.607895\n ],\n [\n 116.694345,\n 36.591149\n ],\n [\n 116.682421,\n 36.580586\n ],\n [\n 116.661258,\n 36.578376\n ],\n [\n 116.662916,\n 36.563111\n ],\n [\n 116.658968,\n 36.553026\n ],\n [\n 116.646728,\n 36.544105\n ],\n [\n 116.629592,\n 36.544587\n ],\n [\n 116.622801,\n 36.532651\n ],\n [\n 116.60835,\n 36.52011\n ],\n [\n 116.610087,\n 36.51609\n ],\n [\n 116.627223,\n 36.508853\n ],\n [\n 116.624301,\n 36.497233\n ],\n [\n 116.602032,\n 36.495223\n ],\n [\n 116.593267,\n 36.485973\n ],\n [\n 116.595636,\n 36.480383\n ],\n [\n 116.613009,\n 36.473425\n ],\n [\n 116.611429,\n 36.459104\n ],\n [\n 116.620905,\n 36.44144\n ],\n [\n 116.6198,\n 36.428522\n ],\n [\n 116.612377,\n 36.42333\n ],\n [\n 116.591213,\n 36.416286\n ],\n [\n 116.546202,\n 36.40892\n ],\n [\n 116.549518,\n 36.417333\n ],\n [\n 116.535857,\n 36.41842\n ],\n [\n 116.539647,\n 36.427597\n ],\n [\n 116.527092,\n 36.424337\n ],\n [\n 116.511851,\n 36.430012\n ],\n [\n 116.512798,\n 36.441239\n ],\n [\n 116.507271,\n 36.447999\n ],\n [\n 116.489345,\n 36.454477\n ],\n [\n 116.481685,\n 36.448361\n ],\n [\n 116.461548,\n 36.449971\n ],\n [\n 116.455705,\n 36.46192\n ],\n [\n 116.459258,\n 36.47978\n ],\n [\n 116.445676,\n 36.488587\n ],\n [\n 116.443544,\n 36.498319\n ],\n [\n 116.431304,\n 36.500611\n ],\n [\n 116.412983,\n 36.519145\n ],\n [\n 116.400901,\n 36.524813\n ],\n [\n 116.399322,\n 36.540126\n ],\n [\n 116.403507,\n 36.564878\n ],\n [\n 116.410298,\n 36.593237\n ],\n [\n 116.411325,\n 36.615242\n ],\n [\n 116.406034,\n 36.631983\n ],\n [\n 116.41322,\n 36.643181\n ],\n [\n 116.411246,\n 36.676647\n ],\n [\n 116.40706,\n 36.689042\n ],\n [\n 116.407139,\n 36.704804\n ],\n [\n 116.397584,\n 36.715431\n ],\n [\n 116.393399,\n 36.731708\n ],\n [\n 116.401849,\n 36.74634\n ],\n [\n 116.405639,\n 36.761208\n ],\n [\n 116.396242,\n 36.792459\n ],\n [\n 116.376026,\n 36.797025\n ],\n [\n 116.391978,\n 36.802913\n ],\n [\n 116.397663,\n 36.809441\n ],\n [\n 116.409193,\n 36.807038\n ],\n [\n 116.408008,\n 36.815729\n ],\n [\n 116.399874,\n 36.823857\n ],\n [\n 116.409587,\n 36.83759\n ],\n [\n 116.407218,\n 36.846717\n ],\n [\n 116.415352,\n 36.855923\n ],\n [\n 116.412746,\n 36.861086\n ],\n [\n 116.429645,\n 36.865208\n ],\n [\n 116.434146,\n 36.876453\n ],\n [\n 116.419537,\n 36.877213\n ],\n [\n 116.415905,\n 36.881374\n ],\n [\n 116.422143,\n 36.890536\n ],\n [\n 116.417958,\n 36.894297\n ],\n [\n 116.421591,\n 36.905257\n ],\n [\n 116.433988,\n 36.908417\n ],\n [\n 116.447966,\n 36.899977\n ],\n [\n 116.452467,\n 36.906417\n ],\n [\n 116.449308,\n 36.915496\n ],\n [\n 116.439911,\n 36.916495\n ],\n [\n 116.444728,\n 36.923694\n ],\n [\n 116.443149,\n 36.932211\n ],\n [\n 116.461548,\n 36.940687\n ],\n [\n 116.470551,\n 36.940007\n ],\n [\n 116.471103,\n 36.947043\n ],\n [\n 116.458074,\n 36.955358\n ],\n [\n 116.442675,\n 36.954319\n ],\n [\n 116.434383,\n 36.968228\n ],\n [\n 116.405876,\n 36.969067\n ],\n [\n 116.379343,\n 36.966309\n ],\n [\n 116.370261,\n 36.963272\n ],\n [\n 116.366471,\n 36.971864\n ],\n [\n 116.341359,\n 36.980256\n ],\n [\n 116.340175,\n 36.971944\n ],\n [\n 116.324065,\n 36.972024\n ],\n [\n 116.317037,\n 36.981854\n ],\n [\n 116.304955,\n 36.990245\n ],\n [\n 116.30535,\n 36.994999\n ],\n [\n 116.290741,\n 36.995759\n ],\n [\n 116.26784,\n 37.010499\n ],\n [\n 116.254731,\n 37.008262\n ],\n [\n 116.247624,\n 37.019685\n ],\n [\n 116.250388,\n 37.025476\n ],\n [\n 116.232857,\n 37.032225\n ],\n [\n 116.225592,\n 37.025396\n ],\n [\n 116.222276,\n 37.010339\n ],\n [\n 116.235779,\n 37.010139\n ],\n [\n 116.229225,\n 36.996438\n ],\n [\n 116.211694,\n 36.990085\n ],\n [\n 116.212089,\n 36.982454\n ],\n [\n 116.219196,\n 36.979617\n ],\n [\n 116.210588,\n 36.970146\n ],\n [\n 116.211536,\n 36.963112\n ],\n [\n 116.191478,\n 36.963312\n ],\n [\n 116.18366,\n 36.959595\n ],\n [\n 116.172842,\n 36.947723\n ],\n [\n 116.173237,\n 36.929692\n ],\n [\n 116.164392,\n 36.916975\n ],\n [\n 116.146388,\n 36.910776\n ],\n [\n 116.123724,\n 36.890656\n ],\n [\n 116.114958,\n 36.897697\n ],\n [\n 116.097349,\n 36.891336\n ],\n [\n 116.098217,\n 36.883895\n ],\n [\n 116.082424,\n 36.883855\n ],\n [\n 116.075948,\n 36.889496\n ],\n [\n 116.061892,\n 36.888576\n ],\n [\n 116.050126,\n 36.894497\n ],\n [\n 116.005667,\n 36.884375\n ],\n [\n 115.947704,\n 36.888576\n ],\n [\n 115.920461,\n 36.892976\n ],\n [\n 115.894796,\n 36.905657\n ],\n [\n 115.885241,\n 36.907017\n ],\n [\n 115.881687,\n 36.917575\n ],\n [\n 115.875844,\n 36.916255\n ],\n [\n 115.868421,\n 36.901457\n ],\n [\n 115.853733,\n 36.904777\n ],\n [\n 115.85855,\n 36.908337\n ],\n [\n 115.85397,\n 36.916215\n ],\n [\n 115.848995,\n 36.912656\n ],\n [\n 115.832964,\n 36.918575\n ],\n [\n 115.83178,\n 36.910856\n ],\n [\n 115.823251,\n 36.913496\n ],\n [\n 115.81875,\n 36.908577\n ],\n [\n 115.813064,\n 36.913416\n ],\n [\n 115.791348,\n 36.914336\n ],\n [\n 115.779819,\n 36.904977\n ],\n [\n 115.780293,\n 36.912216\n ],\n [\n 115.768684,\n 36.921014\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 371500,\n \"name\": \"聊城市\",\n \"center\": [\n 115.980367,\n 36.456013\n ],\n \"centroid\": [\n 115.887733,\n 36.460089\n ],\n \"childrenNum\": 8,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 370000\n },\n \"subFeatureIndex\": 13,\n \"acroutes\": [\n 100000,\n 370000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 115.768684,\n 36.921014\n ],\n [\n 115.780293,\n 36.912216\n ],\n [\n 115.779819,\n 36.904977\n ],\n [\n 115.791348,\n 36.914336\n ],\n [\n 115.813064,\n 36.913416\n ],\n [\n 115.81875,\n 36.908577\n ],\n [\n 115.823251,\n 36.913496\n ],\n [\n 115.83178,\n 36.910856\n ],\n [\n 115.832964,\n 36.918575\n ],\n [\n 115.848995,\n 36.912656\n ],\n [\n 115.85397,\n 36.916215\n ],\n [\n 115.85855,\n 36.908337\n ],\n [\n 115.853733,\n 36.904777\n ],\n [\n 115.868421,\n 36.901457\n ],\n [\n 115.875844,\n 36.916255\n ],\n [\n 115.881687,\n 36.917575\n ],\n [\n 115.885241,\n 36.907017\n ],\n [\n 115.894796,\n 36.905657\n ],\n [\n 115.920461,\n 36.892976\n ],\n [\n 115.947704,\n 36.888576\n ],\n [\n 116.005667,\n 36.884375\n ],\n [\n 116.050126,\n 36.894497\n ],\n [\n 116.061892,\n 36.888576\n ],\n [\n 116.075948,\n 36.889496\n ],\n [\n 116.082424,\n 36.883855\n ],\n [\n 116.098217,\n 36.883895\n ],\n [\n 116.097349,\n 36.891336\n ],\n [\n 116.114958,\n 36.897697\n ],\n [\n 116.123724,\n 36.890656\n ],\n [\n 116.146388,\n 36.910776\n ],\n [\n 116.164392,\n 36.916975\n ],\n [\n 116.173237,\n 36.929692\n ],\n [\n 116.172842,\n 36.947723\n ],\n [\n 116.18366,\n 36.959595\n ],\n [\n 116.191478,\n 36.963312\n ],\n [\n 116.211536,\n 36.963112\n ],\n [\n 116.210588,\n 36.970146\n ],\n [\n 116.219196,\n 36.979617\n ],\n [\n 116.212089,\n 36.982454\n ],\n [\n 116.211694,\n 36.990085\n ],\n [\n 116.229225,\n 36.996438\n ],\n [\n 116.235779,\n 37.010139\n ],\n [\n 116.222276,\n 37.010339\n ],\n [\n 116.225592,\n 37.025396\n ],\n [\n 116.232857,\n 37.032225\n ],\n [\n 116.250388,\n 37.025476\n ],\n [\n 116.247624,\n 37.019685\n ],\n [\n 116.254731,\n 37.008262\n ],\n [\n 116.26784,\n 37.010499\n ],\n [\n 116.290741,\n 36.995759\n ],\n [\n 116.30535,\n 36.994999\n ],\n [\n 116.304955,\n 36.990245\n ],\n [\n 116.317037,\n 36.981854\n ],\n [\n 116.324065,\n 36.972024\n ],\n [\n 116.340175,\n 36.971944\n ],\n [\n 116.341359,\n 36.980256\n ],\n [\n 116.366471,\n 36.971864\n ],\n [\n 116.370261,\n 36.963272\n ],\n [\n 116.379343,\n 36.966309\n ],\n [\n 116.405876,\n 36.969067\n ],\n [\n 116.434383,\n 36.968228\n ],\n [\n 116.442675,\n 36.954319\n ],\n [\n 116.458074,\n 36.955358\n ],\n [\n 116.471103,\n 36.947043\n ],\n [\n 116.470551,\n 36.940007\n ],\n [\n 116.461548,\n 36.940687\n ],\n [\n 116.443149,\n 36.932211\n ],\n [\n 116.444728,\n 36.923694\n ],\n [\n 116.439911,\n 36.916495\n ],\n [\n 116.449308,\n 36.915496\n ],\n [\n 116.452467,\n 36.906417\n ],\n [\n 116.447966,\n 36.899977\n ],\n [\n 116.433988,\n 36.908417\n ],\n [\n 116.421591,\n 36.905257\n ],\n [\n 116.417958,\n 36.894297\n ],\n [\n 116.422143,\n 36.890536\n ],\n [\n 116.415905,\n 36.881374\n ],\n [\n 116.419537,\n 36.877213\n ],\n [\n 116.434146,\n 36.876453\n ],\n [\n 116.429645,\n 36.865208\n ],\n [\n 116.412746,\n 36.861086\n ],\n [\n 116.415352,\n 36.855923\n ],\n [\n 116.407218,\n 36.846717\n ],\n [\n 116.409587,\n 36.83759\n ],\n [\n 116.399874,\n 36.823857\n ],\n [\n 116.408008,\n 36.815729\n ],\n [\n 116.409193,\n 36.807038\n ],\n [\n 116.397663,\n 36.809441\n ],\n [\n 116.391978,\n 36.802913\n ],\n [\n 116.376026,\n 36.797025\n ],\n [\n 116.396242,\n 36.792459\n ],\n [\n 116.405639,\n 36.761208\n ],\n [\n 116.401849,\n 36.74634\n ],\n [\n 116.393399,\n 36.731708\n ],\n [\n 116.397584,\n 36.715431\n ],\n [\n 116.407139,\n 36.704804\n ],\n [\n 116.40706,\n 36.689042\n ],\n [\n 116.411246,\n 36.676647\n ],\n [\n 116.41322,\n 36.643181\n ],\n [\n 116.406034,\n 36.631983\n ],\n [\n 116.411325,\n 36.615242\n ],\n [\n 116.410298,\n 36.593237\n ],\n [\n 116.403507,\n 36.564878\n ],\n [\n 116.399322,\n 36.540126\n ],\n [\n 116.400901,\n 36.524813\n ],\n [\n 116.412983,\n 36.519145\n ],\n [\n 116.431304,\n 36.500611\n ],\n [\n 116.443544,\n 36.498319\n ],\n [\n 116.445676,\n 36.488587\n ],\n [\n 116.459258,\n 36.47978\n ],\n [\n 116.455705,\n 36.46192\n ],\n [\n 116.461548,\n 36.449971\n ],\n [\n 116.481685,\n 36.448361\n ],\n [\n 116.489345,\n 36.454477\n ],\n [\n 116.507271,\n 36.447999\n ],\n [\n 116.512798,\n 36.441239\n ],\n [\n 116.511851,\n 36.430012\n ],\n [\n 116.527092,\n 36.424337\n ],\n [\n 116.539647,\n 36.427597\n ],\n [\n 116.535857,\n 36.41842\n ],\n [\n 116.549518,\n 36.417333\n ],\n [\n 116.546202,\n 36.40892\n ],\n [\n 116.528592,\n 36.387259\n ],\n [\n 116.519984,\n 36.384158\n ],\n [\n 116.503717,\n 36.369982\n ],\n [\n 116.484607,\n 36.336948\n ],\n [\n 116.449071,\n 36.337149\n ],\n [\n 116.441411,\n 36.321755\n ],\n [\n 116.430593,\n 36.318007\n ],\n [\n 116.406745,\n 36.319015\n ],\n [\n 116.374526,\n 36.3039\n ],\n [\n 116.331251,\n 36.290677\n ],\n [\n 116.322644,\n 36.284669\n ],\n [\n 116.310799,\n 36.270515\n ],\n [\n 116.307166,\n 36.259464\n ],\n [\n 116.28624,\n 36.239174\n ],\n [\n 116.280159,\n 36.221945\n ],\n [\n 116.255047,\n 36.203703\n ],\n [\n 116.234911,\n 36.180935\n ],\n [\n 116.226066,\n 36.173748\n ],\n [\n 116.213036,\n 36.169831\n ],\n [\n 116.169446,\n 36.171325\n ],\n [\n 116.164392,\n 36.168862\n ],\n [\n 116.164313,\n 36.146084\n ],\n [\n 116.123882,\n 36.136429\n ],\n [\n 116.114011,\n 36.122047\n ],\n [\n 116.099323,\n 36.112066\n ],\n [\n 116.057391,\n 36.104913\n ],\n [\n 116.028804,\n 36.072292\n ],\n [\n 116.016406,\n 36.061375\n ],\n [\n 115.989794,\n 36.045442\n ],\n [\n 115.964051,\n 36.0416\n ],\n [\n 115.935859,\n 36.031447\n ],\n [\n 115.919276,\n 36.019675\n ],\n [\n 115.895981,\n 36.026188\n ],\n [\n 115.869447,\n 36.015346\n ],\n [\n 115.859655,\n 36.003693\n ],\n [\n 115.846231,\n 36.004987\n ],\n [\n 115.837465,\n 36.011016\n ],\n [\n 115.81725,\n 36.012756\n ],\n [\n 115.797508,\n 36.00697\n ],\n [\n 115.779819,\n 35.993778\n ],\n [\n 115.786689,\n 35.991228\n ],\n [\n 115.774528,\n 35.981878\n ],\n [\n 115.774686,\n 35.974511\n ],\n [\n 115.764341,\n 35.970989\n ],\n [\n 115.73307,\n 35.96682\n ],\n [\n 115.717908,\n 35.971394\n ],\n [\n 115.698719,\n 35.96605\n ],\n [\n 115.686953,\n 35.9552\n ],\n [\n 115.68411,\n 35.944388\n ],\n [\n 115.675423,\n 35.938435\n ],\n [\n 115.651812,\n 35.928917\n ],\n [\n 115.642415,\n 35.920046\n ],\n [\n 115.607353,\n 35.925839\n ],\n [\n 115.583742,\n 35.921707\n ],\n [\n 115.548206,\n 35.898006\n ],\n [\n 115.513302,\n 35.890348\n ],\n [\n 115.504932,\n 35.8991\n ],\n [\n 115.510775,\n 35.908014\n ],\n [\n 115.505406,\n 35.914415\n ],\n [\n 115.490717,\n 35.908379\n ],\n [\n 115.495377,\n 35.896021\n ],\n [\n 115.488033,\n 35.880784\n ],\n [\n 115.460078,\n 35.867732\n ],\n [\n 115.433861,\n 35.839069\n ],\n [\n 115.432834,\n 35.833878\n ],\n [\n 115.417909,\n 35.824996\n ],\n [\n 115.407564,\n 35.80865\n ],\n [\n 115.370923,\n 35.788852\n ],\n [\n 115.3635,\n 35.779925\n ],\n [\n 115.334993,\n 35.796723\n ],\n [\n 115.335704,\n 35.814329\n ],\n [\n 115.344074,\n 35.838744\n ],\n [\n 115.349602,\n 35.860963\n ],\n [\n 115.338152,\n 35.864692\n ],\n [\n 115.3436,\n 35.87215\n ],\n [\n 115.354893,\n 35.869273\n ],\n [\n 115.36429,\n 35.894035\n ],\n [\n 115.367449,\n 35.92033\n ],\n [\n 115.364132,\n 35.929484\n ],\n [\n 115.354182,\n 35.937503\n ],\n [\n 115.356472,\n 35.954633\n ],\n [\n 115.363105,\n 35.972002\n ],\n [\n 115.386322,\n 35.974471\n ],\n [\n 115.395956,\n 35.991673\n ],\n [\n 115.419646,\n 36.004745\n ],\n [\n 115.4431,\n 36.008872\n ],\n [\n 115.447522,\n 36.011826\n ],\n [\n 115.448865,\n 36.047383\n ],\n [\n 115.441599,\n 36.055755\n ],\n [\n 115.459604,\n 36.063357\n ],\n [\n 115.455103,\n 36.071282\n ],\n [\n 115.459762,\n 36.080378\n ],\n [\n 115.466395,\n 36.079691\n ],\n [\n 115.468843,\n 36.092222\n ],\n [\n 115.473976,\n 36.098123\n ],\n [\n 115.484242,\n 36.125845\n ],\n [\n 115.48519,\n 36.139702\n ],\n [\n 115.480689,\n 36.171729\n ],\n [\n 115.47595,\n 36.193046\n ],\n [\n 115.479109,\n 36.209555\n ],\n [\n 115.47595,\n 36.218878\n ],\n [\n 115.476503,\n 36.246516\n ],\n [\n 115.465369,\n 36.250389\n ],\n [\n 115.467817,\n 36.267894\n ],\n [\n 115.462684,\n 36.27612\n ],\n [\n 115.446101,\n 36.273782\n ],\n [\n 115.436388,\n 36.276362\n ],\n [\n 115.428491,\n 36.286201\n ],\n [\n 115.41704,\n 36.292773\n ],\n [\n 115.422963,\n 36.30261\n ],\n [\n 115.41941,\n 36.310914\n ],\n [\n 115.422963,\n 36.322199\n ],\n [\n 115.414987,\n 36.326551\n ],\n [\n 115.394614,\n 36.322602\n ],\n [\n 115.366659,\n 36.308938\n ],\n [\n 115.359789,\n 36.318733\n ],\n [\n 115.370449,\n 36.332757\n ],\n [\n 115.368712,\n 36.342629\n ],\n [\n 115.349602,\n 36.363094\n ],\n [\n 115.348575,\n 36.384641\n ],\n [\n 115.339968,\n 36.39809\n ],\n [\n 115.324885,\n 36.405095\n ],\n [\n 115.313514,\n 36.406625\n ],\n [\n 115.297404,\n 36.413469\n ],\n [\n 115.312092,\n 36.433593\n ],\n [\n 115.316909,\n 36.432587\n ],\n [\n 115.317067,\n 36.454035\n ],\n [\n 115.300247,\n 36.465902\n ],\n [\n 115.291403,\n 36.460592\n ],\n [\n 115.288876,\n 36.470006\n ],\n [\n 115.293693,\n 36.476079\n ],\n [\n 115.28469,\n 36.476441\n ],\n [\n 115.283506,\n 36.486416\n ],\n [\n 115.276083,\n 36.486938\n ],\n [\n 115.272845,\n 36.497394\n ],\n [\n 115.289744,\n 36.497796\n ],\n [\n 115.296536,\n 36.508853\n ],\n [\n 115.292587,\n 36.514401\n ],\n [\n 115.295193,\n 36.523205\n ],\n [\n 115.288323,\n 36.528511\n ],\n [\n 115.295035,\n 36.533254\n ],\n [\n 115.300484,\n 36.525938\n ],\n [\n 115.307433,\n 36.527426\n ],\n [\n 115.331281,\n 36.550213\n ],\n [\n 115.334282,\n 36.582473\n ],\n [\n 115.337836,\n 36.58898\n ],\n [\n 115.35055,\n 36.590065\n ],\n [\n 115.351576,\n 36.595004\n ],\n [\n 115.340363,\n 36.595245\n ],\n [\n 115.341468,\n 36.603478\n ],\n [\n 115.350707,\n 36.60665\n ],\n [\n 115.345022,\n 36.612392\n ],\n [\n 115.35513,\n 36.627407\n ],\n [\n 115.366027,\n 36.621947\n ],\n [\n 115.378504,\n 36.632866\n ],\n [\n 115.38798,\n 36.646432\n ],\n [\n 115.386322,\n 36.656305\n ],\n [\n 115.406459,\n 36.663246\n ],\n [\n 115.412144,\n 36.676486\n ],\n [\n 115.420594,\n 36.686756\n ],\n [\n 115.446653,\n 36.694617\n ],\n [\n 115.451391,\n 36.702197\n ],\n [\n 115.450523,\n 36.713626\n ],\n [\n 115.459762,\n 36.717395\n ],\n [\n 115.460947,\n 36.731869\n ],\n [\n 115.475477,\n 36.744215\n ],\n [\n 115.478398,\n 36.758804\n ],\n [\n 115.491428,\n 36.761609\n ],\n [\n 115.506511,\n 36.770465\n ],\n [\n 115.523568,\n 36.763853\n ],\n [\n 115.52878,\n 36.77395\n ],\n [\n 115.536835,\n 36.772628\n ],\n [\n 115.53873,\n 36.784127\n ],\n [\n 115.54947,\n 36.782885\n ],\n [\n 115.552628,\n 36.775874\n ],\n [\n 115.561315,\n 36.775753\n ],\n [\n 115.560525,\n 36.783806\n ],\n [\n 115.572133,\n 36.775353\n ],\n [\n 115.584689,\n 36.781042\n ],\n [\n 115.63744,\n 36.797506\n ],\n [\n 115.650469,\n 36.807519\n ],\n [\n 115.666184,\n 36.812485\n ],\n [\n 115.671554,\n 36.809281\n ],\n [\n 115.684189,\n 36.812966\n ],\n [\n 115.692243,\n 36.829343\n ],\n [\n 115.688532,\n 36.840312\n ],\n [\n 115.700772,\n 36.860726\n ],\n [\n 115.699982,\n 36.866929\n ],\n [\n 115.711275,\n 36.882374\n ],\n [\n 115.726121,\n 36.893616\n ],\n [\n 115.735202,\n 36.897017\n ],\n [\n 115.740572,\n 36.906417\n ],\n [\n 115.757787,\n 36.903017\n ],\n [\n 115.765131,\n 36.909096\n ],\n [\n 115.768684,\n 36.921014\n ]\n ]\n ],\n [\n [\n [\n 115.495377,\n 35.896021\n ],\n [\n 115.504932,\n 35.8991\n ],\n [\n 115.513302,\n 35.890348\n ],\n [\n 115.503431,\n 35.888686\n ],\n [\n 115.488033,\n 35.880784\n ],\n [\n 115.495377,\n 35.896021\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 371600,\n \"name\": \"滨州市\",\n \"center\": [\n 118.016974,\n 37.383542\n ],\n \"centroid\": [\n 117.847396,\n 37.542717\n ],\n \"childrenNum\": 7,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 370000\n },\n \"subFeatureIndex\": 14,\n \"acroutes\": [\n 100000,\n 370000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 117.273417,\n 37.532619\n ],\n [\n 117.277681,\n 37.545391\n ],\n [\n 117.280682,\n 37.56621\n ],\n [\n 117.288973,\n 37.577112\n ],\n [\n 117.308321,\n 37.589956\n ],\n [\n 117.314875,\n 37.600458\n ],\n [\n 117.317797,\n 37.615081\n ],\n [\n 117.312585,\n 37.633701\n ],\n [\n 117.304925,\n 37.640514\n ],\n [\n 117.312506,\n 37.64194\n ],\n [\n 117.318428,\n 37.662019\n ],\n [\n 117.329405,\n 37.673343\n ],\n [\n 117.347489,\n 37.683319\n ],\n [\n 117.344567,\n 37.693136\n ],\n [\n 117.352543,\n 37.707345\n ],\n [\n 117.36573,\n 37.698361\n ],\n [\n 117.363598,\n 37.679559\n ],\n [\n 117.358149,\n 37.672947\n ],\n [\n 117.357596,\n 37.658495\n ],\n [\n 117.363835,\n 37.649624\n ],\n [\n 117.373074,\n 37.648594\n ],\n [\n 117.392974,\n 37.660039\n ],\n [\n 117.407188,\n 37.678846\n ],\n [\n 117.415401,\n 37.669582\n ],\n [\n 117.428825,\n 37.665741\n ],\n [\n 117.444224,\n 37.671918\n ],\n [\n 117.451963,\n 37.669978\n ],\n [\n 117.465625,\n 37.655564\n ],\n [\n 117.477075,\n 37.654416\n ],\n [\n 117.488604,\n 37.677025\n ],\n [\n 117.50345,\n 37.680548\n ],\n [\n 117.506451,\n 37.686803\n ],\n [\n 117.531247,\n 37.688901\n ],\n [\n 117.543092,\n 37.703625\n ],\n [\n 117.539775,\n 37.713993\n ],\n [\n 117.556201,\n 37.716683\n ],\n [\n 117.542618,\n 37.726258\n ],\n [\n 117.547198,\n 37.737494\n ],\n [\n 117.544119,\n 37.747699\n ],\n [\n 117.531563,\n 37.748213\n ],\n [\n 117.522165,\n 37.755371\n ],\n [\n 117.526509,\n 37.762964\n ],\n [\n 117.547356,\n 37.767512\n ],\n [\n 117.546567,\n 37.776368\n ],\n [\n 117.559912,\n 37.800008\n ],\n [\n 117.568599,\n 37.804987\n ],\n [\n 117.56623,\n 37.812733\n ],\n [\n 117.588025,\n 37.82273\n ],\n [\n 117.59529,\n 37.834741\n ],\n [\n 117.605003,\n 37.838968\n ],\n [\n 117.606582,\n 37.845209\n ],\n [\n 117.595685,\n 37.853504\n ],\n [\n 117.581076,\n 37.858993\n ],\n [\n 117.580602,\n 37.875302\n ],\n [\n 117.568835,\n 37.882409\n ],\n [\n 117.547198,\n 37.883198\n ],\n [\n 117.542776,\n 37.890146\n ],\n [\n 117.539302,\n 37.913552\n ],\n [\n 117.529036,\n 37.932295\n ],\n [\n 117.567809,\n 37.946772\n ],\n [\n 117.570652,\n 37.957264\n ],\n [\n 117.563545,\n 37.998585\n ],\n [\n 117.54933,\n 38.010252\n ],\n [\n 117.541039,\n 38.011237\n ],\n [\n 117.545935,\n 38.026842\n ],\n [\n 117.560386,\n 38.040987\n ],\n [\n 117.556517,\n 38.057215\n ],\n [\n 117.564887,\n 38.063674\n ],\n [\n 117.57618,\n 38.065132\n ],\n [\n 117.58376,\n 38.070645\n ],\n [\n 117.605082,\n 38.073008\n ],\n [\n 117.616769,\n 38.06903\n ],\n [\n 117.644961,\n 38.072377\n ],\n [\n 117.666045,\n 38.072535\n ],\n [\n 117.679469,\n 38.079544\n ],\n [\n 117.704502,\n 38.07604\n ],\n [\n 117.729219,\n 38.093796\n ],\n [\n 117.730641,\n 38.108321\n ],\n [\n 117.743197,\n 38.123393\n ],\n [\n 117.768782,\n 38.131893\n ],\n [\n 117.772099,\n 38.138817\n ],\n [\n 117.766966,\n 38.158682\n ],\n [\n 117.771704,\n 38.166076\n ],\n [\n 117.79421,\n 38.167846\n ],\n [\n 117.801317,\n 38.175239\n ],\n [\n 117.789235,\n 38.180744\n ],\n [\n 117.796105,\n 38.1936\n ],\n [\n 117.797842,\n 38.207712\n ],\n [\n 117.805897,\n 38.217734\n ],\n [\n 117.808582,\n 38.228383\n ],\n [\n 117.823586,\n 38.235652\n ],\n [\n 117.847513,\n 38.25392\n ],\n [\n 117.860859,\n 38.274578\n ],\n [\n 117.895683,\n 38.301629\n ],\n [\n 117.893393,\n 38.287968\n ],\n [\n 117.89671,\n 38.279605\n ],\n [\n 117.935404,\n 38.255098\n ],\n [\n 117.997631,\n 38.211918\n ],\n [\n 118.018794,\n 38.202641\n ],\n [\n 118.033009,\n 38.205904\n ],\n [\n 118.04517,\n 38.214001\n ],\n [\n 118.112134,\n 38.210227\n ],\n [\n 118.177915,\n 38.186406\n ],\n [\n 118.216846,\n 38.146921\n ],\n [\n 118.245432,\n 38.144286\n ],\n [\n 118.236272,\n 38.125754\n ],\n [\n 118.227664,\n 38.119262\n ],\n [\n 118.241247,\n 38.112138\n ],\n [\n 118.245511,\n 38.103322\n ],\n [\n 118.235324,\n 38.082969\n ],\n [\n 118.226638,\n 38.079583\n ],\n [\n 118.230665,\n 38.056743\n ],\n [\n 118.227585,\n 38.037874\n ],\n [\n 118.2234,\n 38.00095\n ],\n [\n 118.22956,\n 37.986444\n ],\n [\n 118.220873,\n 37.98258\n ],\n [\n 118.223479,\n 37.959788\n ],\n [\n 118.213529,\n 37.95541\n ],\n [\n 118.215503,\n 37.949376\n ],\n [\n 118.224742,\n 37.950559\n ],\n [\n 118.226954,\n 37.939672\n ],\n [\n 118.225611,\n 37.923417\n ],\n [\n 118.232718,\n 37.922509\n ],\n [\n 118.235403,\n 37.905343\n ],\n [\n 118.243142,\n 37.895673\n ],\n [\n 118.236588,\n 37.884501\n ],\n [\n 118.239115,\n 37.868708\n ],\n [\n 118.248749,\n 37.858164\n ],\n [\n 118.247643,\n 37.871788\n ],\n [\n 118.258146,\n 37.854886\n ],\n [\n 118.258304,\n 37.844182\n ],\n [\n 118.269754,\n 37.853109\n ],\n [\n 118.286337,\n 37.8569\n ],\n [\n 118.301657,\n 37.870208\n ],\n [\n 118.313265,\n 37.861521\n ],\n [\n 118.328111,\n 37.865272\n ],\n [\n 118.340193,\n 37.838059\n ],\n [\n 118.334271,\n 37.832134\n ],\n [\n 118.346116,\n 37.832371\n ],\n [\n 118.344932,\n 37.824627\n ],\n [\n 118.356382,\n 37.820834\n ],\n [\n 118.352355,\n 37.814274\n ],\n [\n 118.36191,\n 37.792063\n ],\n [\n 118.348406,\n 37.790719\n ],\n [\n 118.340588,\n 37.774391\n ],\n [\n 118.340667,\n 37.763913\n ],\n [\n 118.353065,\n 37.75814\n ],\n [\n 118.353697,\n 37.750151\n ],\n [\n 118.341931,\n 37.74667\n ],\n [\n 118.337509,\n 37.729502\n ],\n [\n 118.31753,\n 37.728395\n ],\n [\n 118.319425,\n 37.712924\n ],\n [\n 118.316187,\n 37.714151\n ],\n [\n 118.3045,\n 37.690722\n ],\n [\n 118.305132,\n 37.683122\n ],\n [\n 118.294076,\n 37.678529\n ],\n [\n 118.293129,\n 37.670096\n ],\n [\n 118.2846,\n 37.662058\n ],\n [\n 118.260989,\n 37.654614\n ],\n [\n 118.246459,\n 37.658376\n ],\n [\n 118.239431,\n 37.65596\n ],\n [\n 118.22569,\n 37.663682\n ],\n [\n 118.207449,\n 37.661583\n ],\n [\n 118.200657,\n 37.667404\n ],\n [\n 118.195445,\n 37.661742\n ],\n [\n 118.177125,\n 37.657623\n ],\n [\n 118.172545,\n 37.644079\n ],\n [\n 118.165596,\n 37.644633\n ],\n [\n 118.163542,\n 37.63069\n ],\n [\n 118.154935,\n 37.628036\n ],\n [\n 118.157462,\n 37.62035\n ],\n [\n 118.154935,\n 37.605491\n ],\n [\n 118.146722,\n 37.599943\n ],\n [\n 118.148696,\n 37.594078\n ],\n [\n 118.134877,\n 37.590035\n ],\n [\n 118.127612,\n 37.578103\n ],\n [\n 118.131324,\n 37.571285\n ],\n [\n 118.13922,\n 37.571364\n ],\n [\n 118.134166,\n 37.558478\n ],\n [\n 118.141431,\n 37.556297\n ],\n [\n 118.173176,\n 37.563593\n ],\n [\n 118.176098,\n 37.557129\n ],\n [\n 118.173255,\n 37.546858\n ],\n [\n 118.159831,\n 37.539164\n ],\n [\n 118.156988,\n 37.530358\n ],\n [\n 118.150987,\n 37.530517\n ],\n [\n 118.142537,\n 37.518933\n ],\n [\n 118.136772,\n 37.516791\n ],\n [\n 118.139378,\n 37.507427\n ],\n [\n 118.134245,\n 37.507387\n ],\n [\n 118.135035,\n 37.496752\n ],\n [\n 118.127849,\n 37.491831\n ],\n [\n 118.128481,\n 37.483694\n ],\n [\n 118.120426,\n 37.480757\n ],\n [\n 118.112766,\n 37.463528\n ],\n [\n 118.125322,\n 37.45912\n ],\n [\n 118.118531,\n 37.456182\n ],\n [\n 118.114898,\n 37.439742\n ],\n [\n 118.136141,\n 37.441688\n ],\n [\n 118.14996,\n 37.438351\n ],\n [\n 118.163937,\n 37.416742\n ],\n [\n 118.165596,\n 37.4082\n ],\n [\n 118.160147,\n 37.399618\n ],\n [\n 118.16141,\n 37.389961\n ],\n [\n 118.144037,\n 37.392822\n ],\n [\n 118.135509,\n 37.384834\n ],\n [\n 118.141668,\n 37.376487\n ],\n [\n 118.154935,\n 37.377401\n ],\n [\n 118.156198,\n 37.364322\n ],\n [\n 118.161015,\n 37.362573\n ],\n [\n 118.202,\n 37.382409\n ],\n [\n 118.216925,\n 37.385191\n ],\n [\n 118.217951,\n 37.371478\n ],\n [\n 118.222768,\n 37.367861\n ],\n [\n 118.245353,\n 37.367781\n ],\n [\n 118.245827,\n 37.376646\n ],\n [\n 118.258541,\n 37.37911\n ],\n [\n 118.262015,\n 37.364283\n ],\n [\n 118.273624,\n 37.360029\n ],\n [\n 118.286495,\n 37.362772\n ],\n [\n 118.291865,\n 37.358518\n ],\n [\n 118.287285,\n 37.352434\n ],\n [\n 118.315398,\n 37.352514\n ],\n [\n 118.31524,\n 37.31477\n ],\n [\n 118.319741,\n 37.305978\n ],\n [\n 118.326058,\n 37.306535\n ],\n [\n 118.325584,\n 37.296866\n ],\n [\n 118.342168,\n 37.295075\n ],\n [\n 118.342168,\n 37.287076\n ],\n [\n 118.355197,\n 37.286997\n ],\n [\n 118.358277,\n 37.280669\n ],\n [\n 118.368069,\n 37.279594\n ],\n [\n 118.36262,\n 37.273783\n ],\n [\n 118.372096,\n 37.273703\n ],\n [\n 118.375729,\n 37.258497\n ],\n [\n 118.368385,\n 37.258576\n ],\n [\n 118.36033,\n 37.244561\n ],\n [\n 118.350459,\n 37.243765\n ],\n [\n 118.346669,\n 37.233252\n ],\n [\n 118.3642,\n 37.210189\n ],\n [\n 118.375966,\n 37.206126\n ],\n [\n 118.376598,\n 37.196962\n ],\n [\n 118.383389,\n 37.190587\n ],\n [\n 118.387574,\n 37.177834\n ],\n [\n 118.380467,\n 37.175164\n ],\n [\n 118.377545,\n 37.154157\n ],\n [\n 118.366569,\n 37.146781\n ],\n [\n 118.361594,\n 37.148495\n ],\n [\n 118.356224,\n 37.139325\n ],\n [\n 118.347616,\n 37.139803\n ],\n [\n 118.340667,\n 37.131748\n ],\n [\n 118.346116,\n 37.123931\n ],\n [\n 118.338219,\n 37.123134\n ],\n [\n 118.349354,\n 37.101753\n ],\n [\n 118.338298,\n 37.10311\n ],\n [\n 118.338851,\n 37.093894\n ],\n [\n 118.332928,\n 37.081923\n ],\n [\n 118.338535,\n 37.072265\n ],\n [\n 118.337588,\n 37.053904\n ],\n [\n 118.324558,\n 37.046279\n ],\n [\n 118.3259,\n 37.035459\n ],\n [\n 118.310186,\n 37.028231\n ],\n [\n 118.308212,\n 37.019885\n ],\n [\n 118.28997,\n 37.00946\n ],\n [\n 118.288785,\n 36.999993\n ],\n [\n 118.271412,\n 37.006744\n ],\n [\n 118.262568,\n 37.00271\n ],\n [\n 118.250802,\n 37.002949\n ],\n [\n 118.247327,\n 36.98613\n ],\n [\n 118.235087,\n 36.98557\n ],\n [\n 118.231376,\n 36.974822\n ],\n [\n 118.222531,\n 36.967109\n ],\n [\n 118.209739,\n 36.963152\n ],\n [\n 118.195209,\n 36.967348\n ],\n [\n 118.192918,\n 36.977739\n ],\n [\n 118.160936,\n 36.981934\n ],\n [\n 118.161331,\n 36.988567\n ],\n [\n 118.15146,\n 36.988527\n ],\n [\n 118.153198,\n 37.000512\n ],\n [\n 118.138983,\n 37.005985\n ],\n [\n 118.139299,\n 37.014693\n ],\n [\n 118.134008,\n 37.025955\n ],\n [\n 118.139299,\n 37.033103\n ],\n [\n 118.139615,\n 37.044363\n ],\n [\n 118.15146,\n 37.047038\n ],\n [\n 118.150829,\n 37.054743\n ],\n [\n 118.15762,\n 37.057776\n ],\n [\n 118.156909,\n 37.065281\n ],\n [\n 118.13622,\n 37.06536\n ],\n [\n 118.136062,\n 37.077773\n ],\n [\n 118.130455,\n 37.091101\n ],\n [\n 118.115925,\n 37.100636\n ],\n [\n 118.111187,\n 37.094652\n ],\n [\n 118.086075,\n 37.091899\n ],\n [\n 118.063016,\n 37.082841\n ],\n [\n 118.056857,\n 37.093654\n ],\n [\n 118.045959,\n 37.098202\n ],\n [\n 118.045485,\n 37.105982\n ],\n [\n 118.057252,\n 37.106141\n ],\n [\n 118.068623,\n 37.115875\n ],\n [\n 118.079679,\n 37.120781\n ],\n [\n 118.065069,\n 37.139564\n ],\n [\n 118.059858,\n 37.151087\n ],\n [\n 118.062385,\n 37.162528\n ],\n [\n 118.074467,\n 37.170341\n ],\n [\n 118.071545,\n 37.177675\n ],\n [\n 118.082995,\n 37.185605\n ],\n [\n 118.077941,\n 37.188953\n ],\n [\n 118.074072,\n 37.204094\n ],\n [\n 118.064122,\n 37.21007\n ],\n [\n 118.048012,\n 37.205568\n ],\n [\n 118.046275,\n 37.216324\n ],\n [\n 118.036799,\n 37.220905\n ],\n [\n 118.022348,\n 37.2221\n ],\n [\n 118.019584,\n 37.210309\n ],\n [\n 118.010898,\n 37.20756\n ],\n [\n 117.994393,\n 37.212699\n ],\n [\n 117.984364,\n 37.210349\n ],\n [\n 117.98089,\n 37.218674\n ],\n [\n 117.973862,\n 37.216483\n ],\n [\n 117.981048,\n 37.238429\n ],\n [\n 117.996446,\n 37.246273\n ],\n [\n 117.990761,\n 37.248981\n ],\n [\n 117.990603,\n 37.262358\n ],\n [\n 117.963833,\n 37.271753\n ],\n [\n 117.947013,\n 37.262159\n ],\n [\n 117.948829,\n 37.26829\n ],\n [\n 117.941327,\n 37.280549\n ],\n [\n 117.909266,\n 37.265065\n ],\n [\n 117.888497,\n 37.262319\n ],\n [\n 117.8776,\n 37.273027\n ],\n [\n 117.850909,\n 37.28246\n ],\n [\n 117.83859,\n 37.282659\n ],\n [\n 117.818848,\n 37.276012\n ],\n [\n 117.782128,\n 37.248702\n ],\n [\n 117.773678,\n 37.244959\n ],\n [\n 117.760333,\n 37.244959\n ],\n [\n 117.729851,\n 37.249101\n ],\n [\n 117.693447,\n 37.257661\n ],\n [\n 117.675995,\n 37.270121\n ],\n [\n 117.659491,\n 37.274101\n ],\n [\n 117.644329,\n 37.265862\n ],\n [\n 117.63043,\n 37.247269\n ],\n [\n 117.627193,\n 37.228074\n ],\n [\n 117.615348,\n 37.212699\n ],\n [\n 117.598212,\n 37.203058\n ],\n [\n 117.592052,\n 37.169624\n ],\n [\n 117.586366,\n 37.160216\n ],\n [\n 117.574284,\n 37.151366\n ],\n [\n 117.551305,\n 37.146781\n ],\n [\n 117.557464,\n 37.124211\n ],\n [\n 117.574442,\n 37.12106\n ],\n [\n 117.576969,\n 37.114758\n ],\n [\n 117.567888,\n 37.11029\n ],\n [\n 117.575074,\n 37.089185\n ],\n [\n 117.590946,\n 37.084996\n ],\n [\n 117.608477,\n 37.090622\n ],\n [\n 117.619375,\n 37.090103\n ],\n [\n 117.644645,\n 37.083878\n ],\n [\n 117.673942,\n 37.073143\n ],\n [\n 117.703002,\n 37.068673\n ],\n [\n 117.726692,\n 37.068753\n ],\n [\n 117.739801,\n 37.064921\n ],\n [\n 117.761991,\n 37.065839\n ],\n [\n 117.771783,\n 37.069032\n ],\n [\n 117.800369,\n 37.070789\n ],\n [\n 117.847355,\n 37.065959\n ],\n [\n 117.840327,\n 37.035539\n ],\n [\n 117.841827,\n 37.026354\n ],\n [\n 117.865992,\n 37.023719\n ],\n [\n 117.870493,\n 37.013375\n ],\n [\n 117.866386,\n 37.007024\n ],\n [\n 117.866623,\n 36.993282\n ],\n [\n 117.870493,\n 36.985451\n ],\n [\n 117.906581,\n 36.981695\n ],\n [\n 117.911951,\n 36.975141\n ],\n [\n 117.910292,\n 36.962592\n ],\n [\n 117.913372,\n 36.953679\n ],\n [\n 117.931772,\n 36.941886\n ],\n [\n 117.936115,\n 36.93489\n ],\n [\n 117.935404,\n 36.915736\n ],\n [\n 117.94338,\n 36.930012\n ],\n [\n 117.949145,\n 36.918375\n ],\n [\n 117.96178,\n 36.922494\n ],\n [\n 117.960674,\n 36.910376\n ],\n [\n 117.950645,\n 36.902137\n ],\n [\n 117.9403,\n 36.901177\n ],\n [\n 117.940616,\n 36.891616\n ],\n [\n 117.929719,\n 36.890216\n ],\n [\n 117.9189,\n 36.880094\n ],\n [\n 117.917005,\n 36.86973\n ],\n [\n 117.891814,\n 36.871811\n ],\n [\n 117.891103,\n 36.864408\n ],\n [\n 117.875152,\n 36.861246\n ],\n [\n 117.865597,\n 36.866529\n ],\n [\n 117.856594,\n 36.859926\n ],\n [\n 117.832825,\n 36.859966\n ],\n [\n 117.828008,\n 36.855883\n ],\n [\n 117.831877,\n 36.836629\n ],\n [\n 117.822085,\n 36.825139\n ],\n [\n 117.820901,\n 36.801511\n ],\n [\n 117.814662,\n 36.797306\n ],\n [\n 117.815531,\n 36.788573\n ],\n [\n 117.824297,\n 36.787933\n ],\n [\n 117.825639,\n 36.775834\n ],\n [\n 117.840327,\n 36.777516\n ],\n [\n 117.850672,\n 36.764735\n ],\n [\n 117.852488,\n 36.750708\n ],\n [\n 117.832983,\n 36.744816\n ],\n [\n 117.834404,\n 36.751871\n ],\n [\n 117.826429,\n 36.763011\n ],\n [\n 117.820743,\n 36.756359\n ],\n [\n 117.810161,\n 36.734394\n ],\n [\n 117.795157,\n 36.719761\n ],\n [\n 117.793025,\n 36.707451\n ],\n [\n 117.78197,\n 36.70304\n ],\n [\n 117.777942,\n 36.695219\n ],\n [\n 117.754173,\n 36.696944\n ],\n [\n 117.725666,\n 36.695219\n ],\n [\n 117.718006,\n 36.697826\n ],\n [\n 117.71848,\n 36.704724\n ],\n [\n 117.739959,\n 36.721004\n ],\n [\n 117.736642,\n 36.729423\n ],\n [\n 117.747303,\n 36.748584\n ],\n [\n 117.724165,\n 36.755998\n ],\n [\n 117.695974,\n 36.754115\n ],\n [\n 117.687603,\n 36.763853\n ],\n [\n 117.677811,\n 36.783245\n ],\n [\n 117.648119,\n 36.805436\n ],\n [\n 117.608556,\n 36.821815\n ],\n [\n 117.580523,\n 36.85136\n ],\n [\n 117.577364,\n 36.862847\n ],\n [\n 117.579891,\n 36.878093\n ],\n [\n 117.585024,\n 36.886815\n ],\n [\n 117.58376,\n 36.894176\n ],\n [\n 117.56923,\n 36.915736\n ],\n [\n 117.534248,\n 36.931611\n ],\n [\n 117.539538,\n 36.941486\n ],\n [\n 117.551305,\n 36.93385\n ],\n [\n 117.553674,\n 36.940727\n ],\n [\n 117.56465,\n 36.945084\n ],\n [\n 117.56544,\n 36.959954\n ],\n [\n 117.54933,\n 36.96507\n ],\n [\n 117.555253,\n 36.970785\n ],\n [\n 117.549094,\n 36.979817\n ],\n [\n 117.536854,\n 36.978498\n ],\n [\n 117.519875,\n 36.957117\n ],\n [\n 117.509847,\n 36.969267\n ],\n [\n 117.494527,\n 36.972344\n ],\n [\n 117.476522,\n 36.968348\n ],\n [\n 117.477628,\n 36.961154\n ],\n [\n 117.458754,\n 36.957676\n ],\n [\n 117.444461,\n 36.958116\n ],\n [\n 117.432853,\n 36.954878\n ],\n [\n 117.415322,\n 36.964311\n ],\n [\n 117.40403,\n 36.955038\n ],\n [\n 117.391632,\n 36.952\n ],\n [\n 117.378286,\n 36.956997\n ],\n [\n 117.365335,\n 36.99496\n ],\n [\n 117.35349,\n 37.003349\n ],\n [\n 117.328457,\n 37.011218\n ],\n [\n 117.317323,\n 37.020923\n ],\n [\n 117.315349,\n 37.030547\n ],\n [\n 117.326088,\n 37.036178\n ],\n [\n 117.33667,\n 37.046838\n ],\n [\n 117.339434,\n 37.056419\n ],\n [\n 117.336433,\n 37.073941\n ],\n [\n 117.365256,\n 37.069272\n ],\n [\n 117.391158,\n 37.083479\n ],\n [\n 117.409241,\n 37.089425\n ],\n [\n 117.442092,\n 37.093574\n ],\n [\n 117.459781,\n 37.109931\n ],\n [\n 117.455596,\n 37.11767\n ],\n [\n 117.4507,\n 37.143711\n ],\n [\n 117.4507,\n 37.153957\n ],\n [\n 117.444066,\n 37.156868\n ],\n [\n 117.442724,\n 37.170859\n ],\n [\n 117.436091,\n 37.184251\n ],\n [\n 117.417928,\n 37.20003\n ],\n [\n 117.404977,\n 37.21716\n ],\n [\n 117.402371,\n 37.224808\n ],\n [\n 117.408768,\n 37.239703\n ],\n [\n 117.429141,\n 37.239783\n ],\n [\n 117.424403,\n 37.243367\n ],\n [\n 117.431037,\n 37.254396\n ],\n [\n 117.443908,\n 37.250056\n ],\n [\n 117.438302,\n 37.25786\n ],\n [\n 117.43688,\n 37.27235\n ],\n [\n 117.432379,\n 37.272032\n ],\n [\n 117.430168,\n 37.285166\n ],\n [\n 117.417612,\n 37.296587\n ],\n [\n 117.411611,\n 37.308604\n ],\n [\n 117.409163,\n 37.329488\n ],\n [\n 117.41319,\n 37.342255\n ],\n [\n 117.415401,\n 37.364203\n ],\n [\n 117.401029,\n 37.379071\n ],\n [\n 117.368652,\n 37.396399\n ],\n [\n 117.360202,\n 37.405697\n ],\n [\n 117.368257,\n 37.419563\n ],\n [\n 117.369758,\n 37.436048\n ],\n [\n 117.353332,\n 37.450901\n ],\n [\n 117.309189,\n 37.447486\n ],\n [\n 117.295449,\n 37.4538\n ],\n [\n 117.307768,\n 37.46194\n ],\n [\n 117.304609,\n 37.466069\n ],\n [\n 117.283998,\n 37.471587\n ],\n [\n 117.285894,\n 37.479328\n ],\n [\n 117.312585,\n 37.487068\n ],\n [\n 117.317718,\n 37.499371\n ],\n [\n 117.307215,\n 37.507744\n ],\n [\n 117.286525,\n 37.510046\n ],\n [\n 117.284393,\n 37.522266\n ],\n [\n 117.275549,\n 37.526193\n ],\n [\n 117.273417,\n 37.532619\n ]\n ]\n ],\n [\n [\n [\n 118.40779,\n 38.026212\n ],\n [\n 118.410001,\n 38.053277\n ],\n [\n 118.419319,\n 38.053119\n ],\n [\n 118.419951,\n 38.025503\n ],\n [\n 118.40779,\n 38.026212\n ]\n ]\n ]\n ]\n }\n },\n {\n \"type\": \"Feature\",\n \"properties\": {\n \"adcode\": 371700,\n \"name\": \"菏泽市\",\n \"center\": [\n 115.469381,\n 35.246531\n ],\n \"centroid\": [\n 115.698013,\n 35.152536\n ],\n \"childrenNum\": 9,\n \"level\": \"city\",\n \"parent\": {\n \"adcode\": 370000\n },\n \"subFeatureIndex\": 15,\n \"acroutes\": [\n 100000,\n 370000\n ]\n },\n \"geometry\": {\n \"type\": \"MultiPolygon\",\n \"coordinates\": [\n [\n [\n [\n 116.409745,\n 34.852944\n ],\n [\n 116.40635,\n 34.82014\n ],\n [\n 116.403191,\n 34.756301\n ],\n [\n 116.371525,\n 34.750136\n ],\n [\n 116.365681,\n 34.742779\n ],\n [\n 116.36197,\n 34.723705\n ],\n [\n 116.382896,\n 34.716264\n ],\n [\n 116.39182,\n 34.710343\n ],\n [\n 116.392688,\n 34.703887\n ],\n [\n 116.385502,\n 34.694716\n ],\n [\n 116.385186,\n 34.686696\n ],\n [\n 116.378079,\n 34.684146\n ],\n [\n 116.378237,\n 34.66802\n ],\n [\n 116.364418,\n 34.651851\n ],\n [\n 116.37421,\n 34.639958\n ],\n [\n 116.356521,\n 34.629504\n ],\n [\n 116.331014,\n 34.624977\n ],\n [\n 116.325171,\n 34.620572\n ],\n [\n 116.323591,\n 34.607687\n ],\n [\n 116.318064,\n 34.601017\n ],\n [\n 116.301086,\n 34.607769\n ],\n [\n 116.286082,\n 34.608799\n ],\n [\n 116.278659,\n 34.602129\n ],\n [\n 116.277079,\n 34.586029\n ],\n [\n 116.256627,\n 34.580634\n ],\n [\n 116.249204,\n 34.571614\n ],\n [\n 116.240754,\n 34.552377\n ],\n [\n 116.23341,\n 34.555137\n ],\n [\n 116.216906,\n 34.575115\n ],\n [\n 116.199059,\n 34.577463\n ],\n [\n 116.190136,\n 34.570502\n ],\n [\n 116.156653,\n 34.553737\n ],\n [\n 116.146861,\n 34.553201\n ],\n [\n 116.134542,\n 34.55971\n ],\n [\n 116.124829,\n 34.572314\n ],\n [\n 116.11788,\n 34.589776\n ],\n [\n 116.101297,\n 34.605793\n ],\n [\n 116.082661,\n 34.608305\n ],\n [\n 116.055101,\n 34.595417\n ],\n [\n 116.03757,\n 34.593029\n ],\n [\n 116.023908,\n 34.601964\n ],\n [\n 116.010168,\n 34.615838\n ],\n [\n 116.001561,\n 34.619049\n ],\n [\n 115.991374,\n 34.615344\n ],\n [\n 115.98474,\n 34.607234\n ],\n [\n 115.98403,\n 34.589282\n ],\n [\n 115.969973,\n 34.582611\n ],\n [\n 115.946204,\n 34.581622\n ],\n [\n 115.858313,\n 34.569967\n ],\n [\n 115.849705,\n 34.565601\n ],\n [\n 115.838097,\n 34.567784\n ],\n [\n 115.838808,\n 34.560575\n ],\n [\n 115.827436,\n 34.558268\n ],\n [\n 115.802404,\n 34.572479\n ],\n [\n 115.795928,\n 34.578492\n ],\n [\n 115.762051,\n 34.587717\n ],\n [\n 115.718224,\n 34.591094\n ],\n [\n 115.711433,\n 34.59867\n ],\n [\n 115.699114,\n 34.598876\n ],\n [\n 115.697297,\n 34.569019\n ],\n [\n 115.684426,\n 34.555591\n ],\n [\n 115.669422,\n 34.55695\n ],\n [\n 115.643599,\n 34.567701\n ],\n [\n 115.639493,\n 34.571532\n ],\n [\n 115.621883,\n 34.574744\n ],\n [\n 115.610354,\n 34.572067\n ],\n [\n 115.593771,\n 34.573179\n ],\n [\n 115.576792,\n 34.570667\n ],\n [\n 115.561157,\n 34.572232\n ],\n [\n 115.55476,\n 34.56906\n ],\n [\n 115.52112,\n 34.578739\n ],\n [\n 115.494982,\n 34.604723\n ],\n [\n 115.486295,\n 34.616867\n ],\n [\n 115.479583,\n 34.632673\n ],\n [\n 115.46142,\n 34.637283\n ],\n [\n 115.458183,\n 34.656171\n ],\n [\n 115.444758,\n 34.674479\n ],\n [\n 115.447048,\n 34.698623\n ],\n [\n 115.444916,\n 34.710302\n ],\n [\n 115.433861,\n 34.725103\n ],\n [\n 115.445548,\n 34.752561\n ],\n [\n 115.436546,\n 34.776805\n ],\n [\n 115.43465,\n 34.790322\n ],\n [\n 115.426754,\n 34.805396\n ],\n [\n 115.413882,\n 34.80782\n ],\n [\n 115.416172,\n 34.813323\n ],\n [\n 115.408512,\n 34.82593\n ],\n [\n 115.393982,\n 34.831801\n ],\n [\n 115.379215,\n 34.828763\n ],\n [\n 115.356946,\n 34.837303\n ],\n [\n 115.345969,\n 34.846212\n ],\n [\n 115.329623,\n 34.851466\n ],\n [\n 115.317146,\n 34.859183\n ],\n [\n 115.302379,\n 34.858813\n ],\n [\n 115.289586,\n 34.851589\n ],\n [\n 115.274661,\n 34.85475\n ],\n [\n 115.256104,\n 34.845308\n ],\n [\n 115.243469,\n 34.850152\n ],\n [\n 115.239363,\n 34.874655\n ],\n [\n 115.240784,\n 34.883847\n ],\n [\n 115.249234,\n 34.894515\n ],\n [\n 115.252156,\n 34.906576\n ],\n [\n 115.239363,\n 34.911868\n ],\n [\n 115.204933,\n 34.914247\n ],\n [\n 115.202722,\n 34.925608\n ],\n [\n 115.211724,\n 34.943364\n ],\n [\n 115.222148,\n 34.945578\n ],\n [\n 115.219147,\n 34.960624\n ],\n [\n 115.208249,\n 34.958329\n ],\n [\n 115.201616,\n 34.95099\n ],\n [\n 115.175004,\n 34.962469\n ],\n [\n 115.15692,\n 34.958001\n ],\n [\n 115.157236,\n 34.966978\n ],\n [\n 115.146576,\n 34.980135\n ],\n [\n 115.131177,\n 34.983578\n ],\n [\n 115.132993,\n 34.999683\n ],\n [\n 115.128097,\n 35.004354\n ],\n [\n 115.106144,\n 35.000789\n ],\n [\n 115.074952,\n 35.000379\n ],\n [\n 115.051656,\n 34.985996\n ],\n [\n 115.0376,\n 34.981611\n ],\n [\n 115.028835,\n 34.971815\n ],\n [\n 115.016042,\n 34.977348\n ],\n [\n 115.008066,\n 34.988496\n ],\n [\n 114.970319,\n 34.990504\n ],\n [\n 114.946787,\n 34.988701\n ],\n [\n 114.934784,\n 34.980709\n ],\n [\n 114.923807,\n 34.968741\n ],\n [\n 114.913936,\n 34.977881\n ],\n [\n 114.907935,\n 34.989356\n ],\n [\n 114.889693,\n 34.993987\n ],\n [\n 114.880296,\n 35.003493\n ],\n [\n 114.884402,\n 35.021929\n ],\n [\n 114.869951,\n 35.024468\n ],\n [\n 114.859291,\n 35.002674\n ],\n [\n 114.827072,\n 35.01013\n ],\n [\n 114.846972,\n 35.023444\n ],\n [\n 114.855263,\n 35.036183\n ],\n [\n 114.85092,\n 35.041917\n ],\n [\n 114.834021,\n 35.042162\n ],\n [\n 114.819254,\n 35.051786\n ],\n [\n 114.83181,\n 35.074182\n ],\n [\n 114.861186,\n 35.082983\n ],\n [\n 114.876269,\n 35.091128\n ],\n [\n 114.882902,\n 35.098781\n ],\n [\n 114.883613,\n 35.109667\n ],\n [\n 114.872557,\n 35.125992\n ],\n [\n 114.860633,\n 35.137405\n ],\n [\n 114.841681,\n 35.151189\n ],\n [\n 114.841049,\n 35.159246\n ],\n [\n 114.850288,\n 35.172617\n ],\n [\n 114.86166,\n 35.182389\n ],\n [\n 114.876584,\n 35.189012\n ],\n [\n 114.909356,\n 35.19449\n ],\n [\n 114.928308,\n 35.194776\n ],\n [\n 114.932494,\n 35.198659\n ],\n [\n 114.92973,\n 35.248225\n ],\n [\n 114.954605,\n 35.255455\n ],\n [\n 114.957684,\n 35.261132\n ],\n [\n 114.975531,\n 35.261541\n ],\n [\n 114.975768,\n 35.270281\n ],\n [\n 114.963607,\n 35.273752\n ],\n [\n 114.987613,\n 35.30221\n ],\n [\n 115.004749,\n 35.317273\n ],\n [\n 115.014541,\n 35.318089\n ],\n [\n 115.0177,\n 35.340575\n ],\n [\n 115.02536,\n 35.346328\n ],\n [\n 115.035152,\n 35.368316\n ],\n [\n 115.043286,\n 35.376963\n ],\n [\n 115.057737,\n 35.378472\n ],\n [\n 115.075426,\n 35.375168\n ],\n [\n 115.088613,\n 35.39299\n ],\n [\n 115.084823,\n 35.410074\n ],\n [\n 115.091614,\n 35.416066\n ],\n [\n 115.105907,\n 35.403958\n ],\n [\n 115.114831,\n 35.404121\n ],\n [\n 115.117989,\n 35.41839\n ],\n [\n 115.117831,\n 35.400125\n ],\n [\n 115.126597,\n 35.408728\n ],\n [\n 115.126439,\n 35.418023\n ],\n [\n 115.136863,\n 35.421529\n ],\n [\n 115.16766,\n 35.426094\n ],\n [\n 115.189534,\n 35.425116\n ],\n [\n 115.197905,\n 35.420673\n ],\n [\n 115.209829,\n 35.423118\n ],\n [\n 115.23731,\n 35.423118\n ],\n [\n 115.257446,\n 35.43559\n ],\n [\n 115.272608,\n 35.448305\n ],\n [\n 115.270792,\n 35.456821\n ],\n [\n 115.286665,\n 35.464481\n ],\n [\n 115.307117,\n 35.480001\n ],\n [\n 115.357973,\n 35.498451\n ],\n [\n 115.357973,\n 35.506555\n ],\n [\n 115.350313,\n 35.529476\n ],\n [\n 115.35355,\n 35.540548\n ],\n [\n 115.360499,\n 35.543275\n ],\n [\n 115.345969,\n 35.546979\n ],\n [\n 115.345101,\n 35.553612\n ],\n [\n 115.357973,\n 35.554711\n ],\n [\n 115.359236,\n 35.565454\n ],\n [\n 115.369502,\n 35.559757\n ],\n [\n 115.370765,\n 35.571028\n ],\n [\n 115.383242,\n 35.568912\n ],\n [\n 115.383716,\n 35.57766\n ],\n [\n 115.389718,\n 35.577334\n ],\n [\n 115.394456,\n 35.586894\n ],\n [\n 115.411908,\n 35.603571\n ],\n [\n 115.416251,\n 35.623985\n ],\n [\n 115.439388,\n 35.643458\n ],\n [\n 115.452418,\n 35.660732\n ],\n [\n 115.461499,\n 35.680847\n ],\n [\n 115.485979,\n 35.710137\n ],\n [\n 115.511486,\n 35.727153\n ],\n [\n 115.524121,\n 35.726341\n ],\n [\n 115.533202,\n 35.734137\n ],\n [\n 115.552786,\n 35.73032\n ],\n [\n 115.562499,\n 35.738644\n ],\n [\n 115.583031,\n 35.730564\n ],\n [\n 115.588875,\n 35.738522\n ],\n [\n 115.619514,\n 35.739212\n ],\n [\n 115.643046,\n 35.743841\n ],\n [\n 115.665079,\n 35.751067\n ],\n [\n 115.693586,\n 35.754071\n ],\n [\n 115.698245,\n 35.768399\n ],\n [\n 115.696271,\n 35.788892\n ],\n [\n 115.704404,\n 35.788933\n ],\n [\n 115.706379,\n 35.805608\n ],\n [\n 115.717434,\n 35.802727\n ],\n [\n 115.720277,\n 35.817087\n ],\n [\n 115.727937,\n 35.815627\n ],\n [\n 115.734886,\n 35.832945\n ],\n [\n 115.753128,\n 35.832945\n ],\n [\n 115.752891,\n 35.838379\n ],\n [\n 115.763709,\n 35.838379\n ],\n [\n 115.773343,\n 35.854192\n ],\n [\n 115.816776,\n 35.844259\n ],\n [\n 115.821356,\n 35.852652\n ],\n [\n 115.841335,\n 35.850016\n ],\n [\n 115.840861,\n 35.857192\n ],\n [\n 115.859971,\n 35.857882\n ],\n [\n 115.865499,\n 35.868624\n ],\n [\n 115.872606,\n 35.872799\n ],\n [\n 115.871422,\n 35.858327\n ],\n [\n 115.876002,\n 35.867124\n ],\n [\n 115.875212,\n 35.835095\n ],\n [\n 115.877107,\n 35.820657\n ],\n [\n 115.883583,\n 35.808163\n ],\n [\n 115.898192,\n 35.805202\n ],\n [\n 115.911932,\n 35.811733\n ],\n [\n 115.925988,\n 35.804756\n ],\n [\n 115.922119,\n 35.799157\n ],\n [\n 115.945493,\n 35.791976\n ],\n [\n 115.970289,\n 35.782156\n ],\n [\n 116.017591,\n 35.756263\n ],\n [\n 116.026909,\n 35.749687\n ],\n [\n 116.041518,\n 35.733893\n ],\n [\n 116.071052,\n 35.719072\n ],\n [\n 116.079897,\n 35.712452\n ],\n [\n 116.089847,\n 35.699373\n ],\n [\n 116.103034,\n 35.687348\n ],\n [\n 116.121829,\n 35.67459\n ],\n [\n 116.127514,\n 35.649433\n ],\n [\n 116.134384,\n 35.638539\n ],\n [\n 116.115906,\n 35.618414\n ],\n [\n 116.116222,\n 35.606621\n ],\n [\n 116.125145,\n 35.59385\n ],\n [\n 116.125145,\n 35.587871\n ],\n [\n 116.114327,\n 35.577456\n ],\n [\n 116.115274,\n 35.566471\n ],\n [\n 116.123408,\n 35.540589\n ],\n [\n 116.12554,\n 35.516042\n ],\n [\n 116.121276,\n 35.497881\n ],\n [\n 116.128778,\n 35.489614\n ],\n [\n 116.129567,\n 35.475235\n ],\n [\n 116.15002,\n 35.469573\n ],\n [\n 116.160918,\n 35.471569\n ],\n [\n 116.15689,\n 35.446838\n ],\n [\n 116.167946,\n 35.452217\n ],\n [\n 116.178685,\n 35.450342\n ],\n [\n 116.177817,\n 35.466151\n ],\n [\n 116.188319,\n 35.477313\n ],\n [\n 116.188319,\n 35.467781\n ],\n [\n 116.19669,\n 35.46334\n ],\n [\n 116.206798,\n 35.465703\n ],\n [\n 116.20206,\n 35.458247\n ],\n [\n 116.204429,\n 35.436079\n ],\n [\n 116.215484,\n 35.435957\n ],\n [\n 116.215958,\n 35.419857\n ],\n [\n 116.212642,\n 35.409054\n ],\n [\n 116.215879,\n 35.393438\n ],\n [\n 116.223855,\n 35.371702\n ],\n [\n 116.22117,\n 35.358608\n ],\n [\n 116.215169,\n 35.350734\n ],\n [\n 116.201744,\n 35.345185\n ],\n [\n 116.193452,\n 35.337555\n ],\n [\n 116.199612,\n 35.304986\n ],\n [\n 116.215642,\n 35.29131\n ],\n [\n 116.223539,\n 35.260438\n ],\n [\n 116.237201,\n 35.261745\n ],\n [\n 116.265866,\n 35.271547\n ],\n [\n 116.269656,\n 35.269872\n ],\n [\n 116.285608,\n 35.242669\n ],\n [\n 116.284265,\n 35.22506\n ],\n [\n 116.269104,\n 35.191178\n ],\n [\n 116.248256,\n 35.195634\n ],\n [\n 116.234437,\n 35.208264\n ],\n [\n 116.234516,\n 35.200008\n ],\n [\n 116.228356,\n 35.194367\n ],\n [\n 116.213115,\n 35.196697\n ],\n [\n 116.221881,\n 35.181817\n ],\n [\n 116.223618,\n 35.173231\n ],\n [\n 116.214537,\n 35.155606\n ],\n [\n 116.204903,\n 35.145668\n ],\n [\n 116.181765,\n 35.11204\n ],\n [\n 116.154284,\n 35.113513\n ],\n [\n 116.141018,\n 35.09076\n ],\n [\n 116.15389,\n 35.088467\n ],\n [\n 116.140228,\n 35.06018\n ],\n [\n 116.141413,\n 35.055062\n ],\n [\n 116.119381,\n 35.053383\n ],\n [\n 116.114564,\n 35.039828\n ],\n [\n 116.115748,\n 35.025574\n ],\n [\n 116.139754,\n 34.995421\n ],\n [\n 116.170789,\n 34.974684\n ],\n [\n 116.171499,\n 34.964683\n ],\n [\n 116.162023,\n 34.957632\n ],\n [\n 116.155153,\n 34.947259\n ],\n [\n 116.162181,\n 34.94361\n ],\n [\n 116.192505,\n 34.939182\n ],\n [\n 116.201586,\n 34.919702\n ],\n [\n 116.213826,\n 34.913098\n ],\n [\n 116.226935,\n 34.911786\n ],\n [\n 116.266261,\n 34.89751\n ],\n [\n 116.286713,\n 34.88159\n ],\n [\n 116.299032,\n 34.877733\n ],\n [\n 116.325803,\n 34.874943\n ],\n [\n 116.339543,\n 34.867022\n ],\n [\n 116.373815,\n 34.86538\n ],\n [\n 116.409745,\n 34.852944\n ]\n ]\n ]\n ]\n }\n }\n ]\n}', 'admin', '2020-12-07 19:27:59', 'admin', '2021-02-01 17:41:17', '0', NULL); +INSERT INTO `jimu_report_map` VALUES ('1335896227857940481', '杭州', 'hangzhou', '{\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"properties\":{\"adcode\":330102,\"name\":\"上城区\",\"center\":[120.171465,30.250236],\"centroid\":[120.173932,30.226977],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":330100},\"subFeatureIndex\":0,\"acroutes\":[100000,330000,330100]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120.188063,30.257783],[120.187445,30.250124],[120.186613,30.246239],[120.19132,30.245676],[120.197999,30.242341],[120.19983,30.240158],[120.213307,30.230548],[120.196573,30.216571],[120.182858,30.207933],[120.177628,30.205626],[120.140166,30.19284],[120.138169,30.19512],[120.1371,30.1981],[120.137551,30.201012],[120.141545,30.204061],[120.141069,30.206464],[120.138431,30.207947],[120.139405,30.210474],[120.145253,30.209581],[120.147368,30.210268],[120.150173,30.212849],[120.160347,30.227486],[120.15923,30.231578],[120.154381,30.23442],[120.154666,30.241119],[120.160442,30.246843],[120.15797,30.24672],[120.159848,30.249493],[120.16251,30.251565],[120.15923,30.256397],[120.156948,30.258058],[120.164079,30.25836],[120.171804,30.258003],[120.188063,30.257783]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":330103,\"name\":\"下城区\",\"center\":[120.172763,30.276271],\"centroid\":[120.180095,30.303745],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":330100},\"subFeatureIndex\":1,\"acroutes\":[100000,330000,330100]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120.199853,30.35099],[120.201042,30.348124],[120.20437,30.345738],[120.212285,30.34534],[120.212095,30.334149],[120.211168,30.332119],[120.205939,30.332202],[120.203157,30.329733],[120.202349,30.326236],[120.204417,30.325961],[120.202421,30.322176],[120.197833,30.322244],[120.196906,30.320118],[120.204322,30.320488],[120.207198,30.320118],[120.200186,30.312148],[120.197952,30.314329],[120.194838,30.312093],[120.190607,30.312642],[120.18987,30.308856],[120.188301,30.30876],[120.188253,30.304507],[120.193007,30.30474],[120.190892,30.300295],[120.186494,30.29714],[120.183975,30.285367],[120.184926,30.28121],[120.18899,30.274321],[120.188182,30.270849],[120.188658,30.267294],[120.188063,30.257783],[120.171804,30.258003],[120.164079,30.25836],[120.156948,30.258058],[120.156472,30.260295],[120.158469,30.259142],[120.154666,30.272688],[120.161892,30.273305],[120.160822,30.279096],[120.159681,30.280524],[120.154547,30.282637],[120.153073,30.284983],[120.154024,30.289895],[120.165553,30.293463],[120.166266,30.294807],[120.164816,30.30009],[120.157162,30.308197],[120.156972,30.309213],[120.169522,30.325399],[120.174348,30.331146],[120.17827,30.336604],[120.187041,30.347561],[120.195789,30.348892],[120.199853,30.35099]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":330104,\"name\":\"江干区\",\"center\":[120.202633,30.266603],\"centroid\":[120.296023,30.310268],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":330100},\"subFeatureIndex\":2,\"acroutes\":[100000,330000,330100]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120.188063,30.257783],[120.188658,30.267294],[120.188182,30.270849],[120.18899,30.274321],[120.184926,30.28121],[120.183975,30.285367],[120.186494,30.29714],[120.190892,30.300295],[120.193007,30.30474],[120.188253,30.304507],[120.188301,30.30876],[120.18987,30.308856],[120.190607,30.312642],[120.194838,30.312093],[120.197952,30.314329],[120.200186,30.312148],[120.207198,30.320118],[120.204322,30.320488],[120.196906,30.320118],[120.197833,30.322244],[120.202421,30.322176],[120.204417,30.325961],[120.202349,30.326236],[120.203157,30.329733],[120.205939,30.332202],[120.211168,30.332119],[120.212095,30.334149],[120.212285,30.34534],[120.20437,30.345738],[120.201042,30.348124],[120.199853,30.35099],[120.204251,30.352662],[120.210407,30.357736],[120.211739,30.359971],[120.213093,30.36503],[120.211881,30.369198],[120.208957,30.374243],[120.208815,30.376478],[120.210502,30.37911],[120.221294,30.387156],[120.228592,30.393544],[120.232395,30.392529],[120.237577,30.390062],[120.240334,30.387622],[120.23791,30.380028],[120.23482,30.376683],[120.239978,30.372146],[120.2468,30.363947],[120.247109,30.362343],[120.244233,30.359902],[120.243567,30.358188],[120.243947,30.354116],[120.242236,30.348261],[120.239883,30.344997],[120.234772,30.340691],[120.236056,30.339786],[120.243543,30.344174],[120.246015,30.342871],[120.248012,30.338853],[120.252552,30.337043],[120.261466,30.337523],[120.260872,30.335452],[120.258471,30.334355],[120.264437,30.326578],[120.268051,30.328663],[120.266553,30.331338],[120.277868,30.337948],[120.279318,30.336686],[120.281885,30.328499],[120.276251,30.3233],[120.272591,30.320516],[120.275562,30.319857],[120.291964,30.317814],[120.291631,30.315331],[120.295767,30.314851],[120.299475,30.315605],[120.300212,30.32127],[120.300117,30.324987],[120.29358,30.325001],[120.296623,30.33596],[120.299618,30.341816],[120.301567,30.343927],[120.300759,30.347575],[120.307224,30.350619],[120.310766,30.350839],[120.316281,30.352539],[120.325717,30.353389],[120.328261,30.358655],[120.335986,30.361068],[120.341192,30.36588],[120.34433,30.368087],[120.347206,30.36928],[120.350629,30.372173],[120.355953,30.374065],[120.362847,30.374682],[120.371143,30.377286],[120.379486,30.380714],[120.383194,30.381235],[120.398312,30.384799],[120.400095,30.384264],[120.400903,30.377026],[120.399596,30.37327],[120.396197,30.370624],[120.388543,30.370117],[120.380817,30.356378],[120.38241,30.355761],[120.378084,30.344929],[120.384169,30.340005],[120.383955,30.339155],[120.395198,30.332215],[120.40309,30.325248],[120.406584,30.324878],[120.413739,30.318307],[120.408866,30.305413],[120.403423,30.293188],[120.396149,30.281141],[120.389779,30.272756],[120.37642,30.259773],[120.369027,30.254763],[120.364154,30.252801],[120.355098,30.250522],[120.350676,30.25011],[120.340859,30.252595],[120.336058,30.255697],[120.324149,30.267239],[120.320535,30.270218],[120.317731,30.27395],[120.311004,30.280359],[120.3043,30.28604],[120.298952,30.287878],[120.288136,30.288235],[120.278961,30.286822],[120.270594,30.284722],[120.269786,30.284105],[120.252838,30.276091],[120.248036,30.272468],[120.241665,30.26514],[120.221057,30.23766],[120.213307,30.230548],[120.19983,30.240158],[120.197999,30.242341],[120.19132,30.245676],[120.186613,30.246239],[120.187445,30.250124],[120.188063,30.257783]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":330105,\"name\":\"拱墅区\",\"center\":[120.150053,30.314697],\"centroid\":[120.152502,30.339314],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":330100},\"subFeatureIndex\":3,\"acroutes\":[100000,330000,330100]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120.085779,30.331187],[120.090011,30.334931],[120.091746,30.333395],[120.096405,30.335685],[120.099019,30.338305],[120.097641,30.340581],[120.103702,30.3415],[120.106127,30.343283],[120.1081,30.342803],[120.108409,30.339978],[120.111737,30.33969],[120.114137,30.337262],[120.121387,30.337948],[120.123265,30.339224],[120.123764,30.33644],[120.124953,30.339498],[120.129446,30.342515],[120.129446,30.341144],[120.136957,30.343379],[120.133843,30.354568],[120.131537,30.357708],[120.130182,30.362754],[120.129279,30.371666],[120.129208,30.38203],[120.130943,30.383222],[120.1342,30.380947],[120.139073,30.380316],[120.138526,30.378095],[120.140736,30.376176],[120.146132,30.375683],[120.146204,30.377835],[120.149175,30.38033],[120.152741,30.380686],[120.153002,30.375861],[120.159254,30.375559],[120.159016,30.372543],[120.167882,30.371035],[120.170782,30.372475],[120.171044,30.37401],[120.168595,30.3746],[120.171828,30.37582],[120.173444,30.374942],[120.174348,30.371954],[120.177699,30.376807],[120.183832,30.381618],[120.186162,30.38802],[120.192485,30.396148],[120.19838,30.394174],[120.209908,30.392557],[120.212998,30.39109],[120.216778,30.387896],[120.221294,30.387156],[120.210502,30.37911],[120.208815,30.376478],[120.208957,30.374243],[120.211881,30.369198],[120.213093,30.36503],[120.211739,30.359971],[120.210407,30.357736],[120.204251,30.352662],[120.199853,30.35099],[120.195789,30.348892],[120.187041,30.347561],[120.17827,30.336604],[120.174348,30.331146],[120.169522,30.325399],[120.156972,30.309213],[120.157162,30.308197],[120.164816,30.30009],[120.166266,30.294807],[120.165553,30.293463],[120.154024,30.289895],[120.153073,30.284983],[120.154547,30.282637],[120.159681,30.280524],[120.160822,30.279096],[120.161892,30.273305],[120.154666,30.272688],[120.154024,30.27535],[120.150934,30.278506],[120.149294,30.28206],[120.146132,30.286589],[120.144112,30.291144],[120.141188,30.293902],[120.135198,30.292626],[120.132512,30.292791],[120.128709,30.294286],[120.118012,30.29264],[120.109241,30.291995],[120.104677,30.292461],[120.102205,30.298292],[120.102823,30.304672],[120.102038,30.312697],[120.095597,30.325481],[120.092007,30.326071],[120.088489,30.330529],[120.085779,30.331187]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":330106,\"name\":\"西湖区\",\"center\":[120.147376,30.272934],\"centroid\":[120.083604,30.200677],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":330100},\"subFeatureIndex\":4,\"acroutes\":[100000,330000,330100]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120.140166,30.19284],[120.134128,30.190588],[120.129659,30.186852],[120.126664,30.182827],[120.12462,30.177346],[120.124596,30.167263],[120.125999,30.15946],[120.130373,30.151161],[120.138597,30.142078],[120.146132,30.137172],[120.160014,30.12637],[120.16831,30.121793],[120.177723,30.11712],[120.181835,30.111457],[120.182953,30.10846],[120.182168,30.104818],[120.177295,30.102604],[120.170354,30.101546],[120.162011,30.097985],[120.150459,30.091455],[120.146869,30.088664],[120.134818,30.097669],[120.130349,30.099305],[120.124739,30.092953],[120.123812,30.089461],[120.118131,30.083796],[120.115088,30.082229],[120.108955,30.08062],[120.09795,30.079603],[120.091579,30.078475],[120.084615,30.078269],[120.076747,30.080868],[120.067928,30.086794],[120.061748,30.091853],[120.059513,30.092788],[120.054902,30.09272],[120.052953,30.091661],[120.049125,30.086849],[120.044894,30.086368],[120.043635,30.092156],[120.041258,30.093091],[120.036361,30.092555],[120.030846,30.094768],[120.030442,30.098837],[120.025213,30.105519],[120.02324,30.10633],[120.019151,30.10567],[120.016465,30.108323],[120.017725,30.113189],[120.016417,30.115718],[120.01095,30.116254],[120.001822,30.114357],[120.000468,30.116034],[120.001941,30.119567],[120.003819,30.12659],[120.007004,30.130026],[120.008787,30.134204],[120.008858,30.136719],[120.011663,30.142779],[120.016417,30.148935],[120.017178,30.153167],[120.014825,30.15891],[120.018438,30.162963],[120.018913,30.165202],[120.017772,30.168417],[120.014397,30.173816],[120.016156,30.177072],[120.013494,30.181042],[120.011449,30.181852],[120.005459,30.182346],[119.998994,30.182305],[119.996332,30.181536],[120.0013,30.188006],[120.003439,30.191865],[120.009096,30.195615],[120.009263,30.200202],[120.006529,30.205379],[120.007171,30.208757],[120.013351,30.210254],[120.017487,30.211792],[120.018034,30.214319],[120.015704,30.213426],[120.009999,30.215637],[120.007123,30.2208],[120.010356,30.221184],[120.013755,30.2162],[120.015443,30.218067],[120.018367,30.216447],[120.020268,30.217985],[120.01889,30.219742],[120.016845,30.224823],[120.025046,30.228461],[120.030894,30.230479],[120.032153,30.229697],[120.038571,30.233019],[120.040639,30.232841],[120.041162,30.236122],[120.044538,30.238058],[120.0443,30.240474],[120.046178,30.242725],[120.052216,30.243494],[120.052691,30.245333],[120.055234,30.245388],[120.055306,30.251483],[120.058515,30.252801],[120.05773,30.257289],[120.057255,30.268351],[120.056494,30.273374],[120.052382,30.273237],[120.049815,30.274266],[120.049815,30.27594],[120.05281,30.282897],[120.056732,30.2884],[120.052263,30.289319],[120.051621,30.29054],[120.052953,30.293847],[120.054807,30.295246],[120.053784,30.298772],[120.051907,30.299513],[120.048008,30.30319],[120.042089,30.304096],[120.030799,30.299843],[120.028493,30.303835],[120.026116,30.305948],[120.026686,30.310996],[120.02179,30.311874],[120.020554,30.315674],[120.023881,30.316195],[120.023406,30.319967],[120.023572,30.326743],[120.021362,30.329088],[120.01782,30.329733],[120.01763,30.33238],[120.026425,30.333272],[120.027185,30.335905],[120.025545,30.342474],[120.025973,30.34523],[120.023881,30.348357],[120.029444,30.350016],[120.032795,30.351634],[120.038595,30.350948],[120.046511,30.35221],[120.046463,30.353759],[120.048674,30.353526],[120.050195,30.349865],[120.053951,30.351401],[120.060607,30.351497],[120.060868,30.353348],[120.063673,30.352128],[120.065361,30.352813],[120.06517,30.355309],[120.067334,30.355446],[120.069449,30.350702],[120.074655,30.34774],[120.0762,30.345285],[120.079742,30.341816],[120.081881,30.33563],[120.085779,30.331187],[120.088489,30.330529],[120.092007,30.326071],[120.095597,30.325481],[120.102038,30.312697],[120.102823,30.304672],[120.102205,30.298292],[120.104677,30.292461],[120.109241,30.291995],[120.118012,30.29264],[120.128709,30.294286],[120.132512,30.292791],[120.135198,30.292626],[120.141188,30.293902],[120.144112,30.291144],[120.146132,30.286589],[120.149294,30.28206],[120.150934,30.278506],[120.154024,30.27535],[120.154666,30.272688],[120.158469,30.259142],[120.156472,30.260295],[120.156948,30.258058],[120.15923,30.256397],[120.16251,30.251565],[120.159848,30.249493],[120.15797,30.24672],[120.160442,30.246843],[120.154666,30.241119],[120.154381,30.23442],[120.15923,30.231578],[120.160347,30.227486],[120.150173,30.212849],[120.147368,30.210268],[120.145253,30.209581],[120.139405,30.210474],[120.138431,30.207947],[120.141069,30.206464],[120.141545,30.204061],[120.137551,30.201012],[120.1371,30.1981],[120.138169,30.19512],[120.140166,30.19284]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":330108,\"name\":\"滨江区\",\"center\":[120.21062,30.206615],\"centroid\":[120.185259,30.180456],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":330100},\"subFeatureIndex\":5,\"acroutes\":[100000,330000,330100]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120.221057,30.23766],[120.223957,30.2363],[120.226524,30.232896],[120.231896,30.230177],[120.234439,30.229793],[120.235224,30.228132],[120.234962,30.21366],[120.234463,30.21355],[120.234202,30.188788],[120.233488,30.182044],[120.224575,30.181879],[120.224646,30.179173],[120.222055,30.178885],[120.222293,30.173637],[120.224384,30.171247],[120.220557,30.170519],[120.219963,30.16703],[120.217943,30.164749],[120.216849,30.161314],[120.220534,30.162578],[120.224979,30.162716],[120.226167,30.16016],[120.223148,30.156684],[120.224598,30.153868],[120.221651,30.153758],[120.219892,30.150515],[120.216944,30.143081],[120.219464,30.139948],[120.214543,30.136911],[120.213307,30.137887],[120.211572,30.136375],[120.208743,30.137131],[120.208054,30.139302],[120.205273,30.143026],[120.204084,30.141061],[120.201375,30.139563],[120.197167,30.140759],[120.19189,30.147121],[120.186185,30.144428],[120.186661,30.146599],[120.184141,30.145362],[120.181717,30.147245],[120.180338,30.149814],[120.178864,30.149416],[120.175203,30.153881],[120.170473,30.15112],[120.168286,30.148646],[120.164816,30.150062],[120.16232,30.147382],[120.159087,30.148894],[120.154737,30.145953],[120.155902,30.144332],[120.152764,30.142751],[120.146132,30.137172],[120.138597,30.142078],[120.130373,30.151161],[120.125999,30.15946],[120.124596,30.167263],[120.12462,30.177346],[120.126664,30.182827],[120.129659,30.186852],[120.134128,30.190588],[120.140166,30.19284],[120.177628,30.205626],[120.182858,30.207933],[120.196573,30.216571],[120.213307,30.230548],[120.221057,30.23766]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":330109,\"name\":\"萧山区\",\"center\":[120.27069,30.162932],\"centroid\":[120.388786,30.16844],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":330100},\"subFeatureIndex\":6,\"acroutes\":[100000,330000,330100]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120.146132,30.137172],[120.152764,30.142751],[120.155902,30.144332],[120.154737,30.145953],[120.159087,30.148894],[120.16232,30.147382],[120.164816,30.150062],[120.168286,30.148646],[120.170473,30.15112],[120.175203,30.153881],[120.178864,30.149416],[120.180338,30.149814],[120.181717,30.147245],[120.184141,30.145362],[120.186661,30.146599],[120.186185,30.144428],[120.19189,30.147121],[120.197167,30.140759],[120.201375,30.139563],[120.204084,30.141061],[120.205273,30.143026],[120.208054,30.139302],[120.208743,30.137131],[120.211572,30.136375],[120.213307,30.137887],[120.214543,30.136911],[120.219464,30.139948],[120.216944,30.143081],[120.219892,30.150515],[120.221651,30.153758],[120.224598,30.153868],[120.223148,30.156684],[120.226167,30.16016],[120.224979,30.162716],[120.220534,30.162578],[120.216849,30.161314],[120.217943,30.164749],[120.219963,30.16703],[120.220557,30.170519],[120.224384,30.171247],[120.222293,30.173637],[120.222055,30.178885],[120.224646,30.179173],[120.224575,30.181879],[120.233488,30.182044],[120.234202,30.188788],[120.234463,30.21355],[120.234962,30.21366],[120.235224,30.228132],[120.234439,30.229793],[120.231896,30.230177],[120.226524,30.232896],[120.223957,30.2363],[120.221057,30.23766],[120.241665,30.26514],[120.248036,30.272468],[120.252838,30.276091],[120.269786,30.284105],[120.270594,30.284722],[120.278961,30.286822],[120.288136,30.288235],[120.298952,30.287878],[120.3043,30.28604],[120.311004,30.280359],[120.317731,30.27395],[120.320535,30.270218],[120.324149,30.267239],[120.336058,30.255697],[120.340859,30.252595],[120.350676,30.25011],[120.355098,30.250522],[120.364154,30.252801],[120.369027,30.254763],[120.37642,30.259773],[120.389779,30.272756],[120.396149,30.281141],[120.403423,30.293188],[120.408866,30.305413],[120.413739,30.318307],[120.418945,30.326441],[120.419159,30.331077],[120.421108,30.334643],[120.433492,30.36141],[120.438436,30.37268],[120.443262,30.376903],[120.450227,30.380042],[120.460234,30.382688],[120.47616,30.385457],[120.497791,30.388924],[120.510152,30.389144],[120.567866,30.387869],[120.589188,30.388527],[120.619543,30.389007],[120.6339,30.389459],[120.642719,30.388582],[120.659002,30.385594],[120.662686,30.384661],[120.684935,30.379973],[120.69354,30.377835],[120.698199,30.375038],[120.702478,30.369431],[120.70388,30.365853],[120.704546,30.344462],[120.704142,30.330803],[120.705045,30.315605],[120.706043,30.30946],[120.710845,30.297538],[120.71403,30.293353],[120.71926,30.28818],[120.721946,30.286314],[120.705663,30.271412],[120.700529,30.267761],[120.693944,30.262052],[120.679088,30.244249],[120.669033,30.233129],[120.646831,30.21955],[120.642695,30.217257],[120.641911,30.214758],[120.624606,30.187868],[120.612768,30.166288],[120.609179,30.152851],[120.608181,30.15182],[120.601953,30.150735],[120.593491,30.146764],[120.590852,30.146283],[120.585932,30.147272],[120.583864,30.150405],[120.568342,30.151312],[120.563421,30.147946],[120.559808,30.148179],[120.558144,30.151463],[120.550918,30.15564],[120.540411,30.156547],[120.533779,30.157454],[120.529382,30.157522],[120.524889,30.155695],[120.518495,30.155393],[120.51058,30.157536],[120.506158,30.159776],[120.50245,30.165917],[120.4981,30.169187],[120.494891,30.170148],[120.484076,30.172209],[120.483719,30.170423],[120.480867,30.170134],[120.479203,30.168664],[120.47509,30.169818],[120.466153,30.169557],[120.463728,30.162207],[120.465012,30.155489],[120.464394,30.154115],[120.461042,30.153991],[120.459545,30.151546],[120.451177,30.150982],[120.45006,30.145665],[120.447636,30.143576],[120.446923,30.135454],[120.438484,30.133792],[120.429594,30.132445],[120.424008,30.133187],[120.422891,30.13588],[120.424127,30.1408],[120.426076,30.144277],[120.422201,30.146846],[120.423152,30.151065],[120.42194,30.151037],[120.421678,30.148193],[120.419396,30.152851],[120.417923,30.148509],[120.414476,30.148042],[120.414214,30.149114],[120.410887,30.149526],[120.41072,30.146118],[120.411362,30.132623],[120.40927,30.12938],[120.404944,30.129476],[120.405562,30.1361],[120.404231,30.137296],[120.399001,30.136348],[120.397433,30.137832],[120.397813,30.143191],[120.392631,30.146091],[120.390492,30.149347],[120.387806,30.156176],[120.384763,30.157303],[120.381958,30.155352],[120.379201,30.154981],[120.373163,30.155503],[120.36646,30.153881],[120.361872,30.152068],[120.358758,30.147836],[120.355074,30.151133],[120.352031,30.150694],[120.352055,30.146736],[120.353957,30.144222],[120.35341,30.142188],[120.339623,30.142119],[120.339124,30.138464],[120.334299,30.134616],[120.331351,30.129298],[120.327999,30.125202],[120.326217,30.1249],[120.323198,30.126755],[120.318016,30.125999],[120.316542,30.132376],[120.314688,30.136471],[120.31224,30.13742],[120.303397,30.133008],[120.298904,30.129545],[120.29831,30.126549],[120.303754,30.126686],[120.300307,30.118357],[120.295624,30.115457],[120.293651,30.111911],[120.286853,30.10677],[120.28885,30.101161],[120.294483,30.098274],[120.299285,30.097366],[120.304681,30.09969],[120.309482,30.106013],[120.313333,30.107072],[120.31823,30.102893],[120.325408,30.097793],[120.33128,30.09705],[120.333704,30.095483],[120.335677,30.090877],[120.335796,30.081363],[120.333776,30.074845],[120.337579,30.071998],[120.338601,30.070211],[120.337508,30.059333],[120.33437,30.056912],[120.332088,30.053487],[120.327096,30.05108],[120.324957,30.048632],[120.325551,30.044946],[120.33185,30.037903],[120.335582,30.036885],[120.340479,30.0376],[120.343617,30.034918],[120.346279,30.023609],[120.344805,30.021381],[120.345827,30.019716],[120.351271,30.017886],[120.353291,30.016317],[120.356904,30.011694],[120.357284,30.004718],[120.358164,30.00286],[120.362847,29.997741],[120.36085,29.99214],[120.36047,29.988589],[120.362657,29.985506],[120.362276,29.982726],[120.364297,29.978528],[120.362276,29.97433],[120.357213,29.973449],[120.346469,29.973779],[120.342095,29.963758],[120.342333,29.960412],[120.340526,29.956048],[120.333681,29.95189],[120.331517,29.949302],[120.326074,29.946231],[120.325194,29.938548],[120.321676,29.937033],[120.315258,29.928867],[120.313547,29.9276],[120.307058,29.929336],[120.299309,29.932544],[120.297122,29.932654],[120.291345,29.935684],[120.288968,29.932131],[120.287233,29.926815],[120.284167,29.922161],[120.282123,29.921059],[120.277844,29.920742],[120.274373,29.91953],[120.265269,29.924516],[120.264746,29.930961],[120.262298,29.934748],[120.260753,29.938865],[120.258899,29.941206],[120.255215,29.943643],[120.25279,29.941577],[120.250722,29.936703],[120.24573,29.935808],[120.241689,29.939044],[120.239788,29.939567],[120.232038,29.939732],[120.226524,29.940545],[120.224004,29.942073],[120.221009,29.942238],[120.214567,29.939484],[120.207246,29.93377],[120.20185,29.931856],[120.200424,29.92946],[120.204798,29.924061],[120.203157,29.921541],[120.197643,29.917354],[120.190155,29.906914],[120.187184,29.904724],[120.185092,29.904503],[120.180623,29.907368],[120.175822,29.90909],[120.176273,29.91358],[120.172993,29.916238],[120.166313,29.917271],[120.160276,29.909145],[120.159729,29.906211],[120.155046,29.906101],[120.151742,29.908084],[120.150031,29.905054],[120.14946,29.899324],[120.149888,29.895191],[120.148723,29.891637],[120.150268,29.887587],[120.148486,29.881277],[120.144754,29.874112],[120.141188,29.870199],[120.136719,29.866327],[120.133748,29.86284],[120.1313,29.858816],[120.122101,29.852876],[120.118369,29.852229],[120.11226,29.847171],[120.10993,29.845972],[120.104796,29.845531],[120.102466,29.846812],[120.102442,29.849445],[120.104059,29.8534],[120.099566,29.856694],[120.096666,29.862399],[120.088156,29.871232],[120.082095,29.876688],[120.078149,29.884115],[120.077222,29.88822],[120.078268,29.88975],[120.082523,29.891788],[120.084805,29.894585],[120.085827,29.897437],[120.085542,29.906859],[120.081097,29.912933],[120.084448,29.91734],[120.089606,29.916514],[120.092126,29.916955],[120.096975,29.920866],[120.098449,29.924309],[120.097546,29.931126],[120.101325,29.936896],[120.100826,29.938039],[120.091151,29.946851],[120.090676,29.949123],[120.096001,29.952703],[120.101801,29.958499],[120.102965,29.967282],[120.104962,29.973614],[120.104463,29.981377],[120.110239,29.983524],[120.114137,29.987667],[120.118535,29.988272],[120.120294,29.990791],[120.124858,29.993337],[120.126926,29.997768],[120.134105,30.01058],[120.135555,30.021271],[120.136981,30.024806],[120.137171,30.029278],[120.134532,30.043983],[120.131133,30.044327],[120.129873,30.045757],[120.126474,30.045936],[120.124478,30.04833],[120.12569,30.050241],[120.12897,30.052208],[120.130349,30.055509],[120.136386,30.058934],[120.136886,30.061547],[120.134081,30.064999],[120.1371,30.069674],[120.137718,30.072177],[120.135079,30.080689],[120.140808,30.083769],[120.146869,30.088664],[120.150459,30.091455],[120.162011,30.097985],[120.170354,30.101546],[120.177295,30.102604],[120.182168,30.104818],[120.182953,30.10846],[120.181835,30.111457],[120.177723,30.11712],[120.16831,30.121793],[120.160014,30.12637],[120.146132,30.137172]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":330110,\"name\":\"余杭区\",\"center\":[120.301737,30.421187],\"centroid\":[119.990852,30.381676],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":330100},\"subFeatureIndex\":7,\"acroutes\":[100000,330000,330100]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120.221294,30.387156],[120.216778,30.387896],[120.212998,30.39109],[120.209908,30.392557],[120.19838,30.394174],[120.192485,30.396148],[120.186162,30.38802],[120.183832,30.381618],[120.177699,30.376807],[120.174348,30.371954],[120.173444,30.374942],[120.171828,30.37582],[120.168595,30.3746],[120.171044,30.37401],[120.170782,30.372475],[120.167882,30.371035],[120.159016,30.372543],[120.159254,30.375559],[120.153002,30.375861],[120.152741,30.380686],[120.149175,30.38033],[120.146204,30.377835],[120.146132,30.375683],[120.140736,30.376176],[120.138526,30.378095],[120.139073,30.380316],[120.1342,30.380947],[120.130943,30.383222],[120.129208,30.38203],[120.129279,30.371666],[120.130182,30.362754],[120.131537,30.357708],[120.133843,30.354568],[120.136957,30.343379],[120.129446,30.341144],[120.129446,30.342515],[120.124953,30.339498],[120.123764,30.33644],[120.123265,30.339224],[120.121387,30.337948],[120.114137,30.337262],[120.111737,30.33969],[120.108409,30.339978],[120.1081,30.342803],[120.106127,30.343283],[120.103702,30.3415],[120.097641,30.340581],[120.099019,30.338305],[120.096405,30.335685],[120.091746,30.333395],[120.090011,30.334931],[120.085779,30.331187],[120.081881,30.33563],[120.079742,30.341816],[120.0762,30.345285],[120.074655,30.34774],[120.069449,30.350702],[120.067334,30.355446],[120.06517,30.355309],[120.065361,30.352813],[120.063673,30.352128],[120.060868,30.353348],[120.060607,30.351497],[120.053951,30.351401],[120.050195,30.349865],[120.048674,30.353526],[120.046463,30.353759],[120.046511,30.35221],[120.038595,30.350948],[120.032795,30.351634],[120.029444,30.350016],[120.023881,30.348357],[120.025973,30.34523],[120.025545,30.342474],[120.027185,30.335905],[120.026425,30.333272],[120.01763,30.33238],[120.01782,30.329733],[120.021362,30.329088],[120.023572,30.326743],[120.023406,30.319967],[120.023881,30.316195],[120.020554,30.315674],[120.02179,30.311874],[120.026686,30.310996],[120.026116,30.305948],[120.028493,30.303835],[120.030799,30.299843],[120.042089,30.304096],[120.048008,30.30319],[120.051907,30.299513],[120.053784,30.298772],[120.054807,30.295246],[120.052953,30.293847],[120.051621,30.29054],[120.052263,30.289319],[120.056732,30.2884],[120.05281,30.282897],[120.049815,30.27594],[120.049815,30.274266],[120.052382,30.273237],[120.056494,30.273374],[120.057255,30.268351],[120.05773,30.257289],[120.058515,30.252801],[120.055306,30.251483],[120.055234,30.245388],[120.052691,30.245333],[120.052216,30.243494],[120.046178,30.242725],[120.0443,30.240474],[120.044538,30.238058],[120.041162,30.236122],[120.040639,30.232841],[120.038571,30.233019],[120.032153,30.229697],[120.030894,30.230479],[120.025046,30.228461],[120.016845,30.224823],[120.01889,30.219742],[120.020268,30.217985],[120.018367,30.216447],[120.015443,30.218067],[120.013755,30.2162],[120.010356,30.221184],[120.007123,30.2208],[120.009999,30.215637],[120.015704,30.213426],[120.018034,30.214319],[120.017487,30.211792],[120.013351,30.210254],[120.007171,30.208757],[120.006529,30.205379],[120.009263,30.200202],[120.009096,30.195615],[120.003439,30.191865],[120.0013,30.188006],[119.996332,30.181536],[119.987988,30.174901],[119.980168,30.17405],[119.974296,30.175107],[119.964669,30.172854],[119.963101,30.170464],[119.959274,30.168005],[119.955993,30.168733],[119.951168,30.168307],[119.945392,30.16501],[119.942016,30.160476],[119.938736,30.158704],[119.934338,30.160202],[119.933102,30.163952],[119.932841,30.169626],[119.935265,30.177896],[119.935028,30.178981],[119.929751,30.188129],[119.926613,30.189681],[119.92155,30.190904],[119.914514,30.191824],[119.909166,30.19089],[119.903936,30.187648],[119.901393,30.188843],[119.894975,30.193417],[119.887677,30.18975],[119.880499,30.187703],[119.871656,30.182662],[119.861981,30.180726],[119.85718,30.177951],[119.853472,30.174929],[119.850168,30.181357],[119.84905,30.188074],[119.845413,30.190437],[119.842656,30.191123],[119.839495,30.19387],[119.836095,30.197949],[119.836452,30.199378],[119.84161,30.20667],[119.843132,30.214442],[119.845057,30.217189],[119.844914,30.221047],[119.846412,30.222502],[119.849787,30.223093],[119.853876,30.225276],[119.856657,30.227843],[119.86298,30.237852],[119.86752,30.249795],[119.868304,30.252718],[119.864477,30.256232],[119.865,30.258922],[119.862837,30.260501],[119.863479,30.263218],[119.86569,30.265236],[119.86588,30.268392],[119.867282,30.26938],[119.864976,30.271068],[119.864715,30.273264],[119.859985,30.272825],[119.853686,30.273841],[119.846816,30.270245],[119.844225,30.272194],[119.839471,30.27148],[119.829083,30.268516],[119.828513,30.269216],[119.829273,30.278548],[119.827657,30.282074],[119.827871,30.283789],[119.830438,30.286328],[119.836761,30.289525],[119.837118,30.29382],[119.836286,30.29928],[119.833433,30.307127],[119.83108,30.307745],[119.826302,30.306743],[119.821001,30.304096],[119.808023,30.295342],[119.799893,30.297483],[119.799085,30.30175],[119.802365,30.307868],[119.803554,30.311462],[119.803839,30.316099],[119.80227,30.322614],[119.806549,30.325851],[119.807666,30.328992],[119.807262,30.334437],[119.804647,30.342392],[119.798895,30.344215],[119.795163,30.348988],[119.791764,30.356899],[119.788602,30.35971],[119.78033,30.365647],[119.774578,30.367471],[119.772771,30.3739],[119.771107,30.375998],[119.768825,30.376752],[119.757534,30.378561],[119.749904,30.381399],[119.749262,30.383757],[119.750237,30.385292],[119.753303,30.386553],[119.755585,30.388815],[119.749048,30.392543],[119.744722,30.393804],[119.742321,30.393338],[119.735571,30.395682],[119.726253,30.389624],[119.723258,30.388472],[119.718385,30.390199],[119.704027,30.399684],[119.696445,30.401918],[119.685011,30.406605],[119.681089,30.408729],[119.686033,30.417541],[119.693521,30.424488],[119.696397,30.42668],[119.707284,30.430023],[119.709209,30.434065],[119.707617,30.437422],[119.704764,30.440326],[119.704146,30.443203],[119.699749,30.448587],[119.694923,30.452738],[119.69528,30.4596],[119.694282,30.462942],[119.695375,30.464476],[119.699368,30.465339],[119.701722,30.467996],[119.702577,30.473255],[119.704408,30.476446],[119.708235,30.485156],[119.708877,30.487963],[119.704717,30.494563],[119.708568,30.498287],[119.709186,30.508829],[119.706785,30.515852],[119.706381,30.521423],[119.704883,30.525981],[119.700272,30.531142],[119.694995,30.542351],[119.692404,30.556145],[119.693735,30.558868],[119.701341,30.558307],[119.707118,30.561057],[119.711729,30.566516],[119.716911,30.564806],[119.721617,30.560934],[119.729058,30.551766],[119.743248,30.550165],[119.74843,30.550206],[119.752091,30.551232],[119.768944,30.551355],[119.770846,30.549658],[119.772034,30.546429],[119.770727,30.544048],[119.768588,30.537259],[119.767684,30.524722],[119.766876,30.520835],[119.761813,30.51885],[119.761837,30.517125],[119.766401,30.514072],[119.784062,30.511019],[119.790433,30.506899],[119.794188,30.505625],[119.798277,30.505927],[119.806905,30.507802],[119.815891,30.510663],[119.818363,30.510102],[119.823711,30.507145],[119.829582,30.502969],[119.832459,30.49878],[119.836024,30.496589],[119.841325,30.496384],[119.846032,30.498424],[119.847149,30.50197],[119.848765,30.503188],[119.851118,30.502025],[119.854113,30.493974],[119.860175,30.48621],[119.864763,30.482526],[119.867116,30.477775],[119.869612,30.47698],[119.874128,30.478281],[119.877812,30.477925],[119.880808,30.476213],[119.88038,30.474214],[119.874366,30.471174],[119.872821,30.467065],[119.872607,30.46249],[119.873676,30.460915],[119.877622,30.460038],[119.882115,30.460367],[119.888034,30.458313],[119.891005,30.456135],[119.894571,30.455327],[119.897613,30.456011],[119.90106,30.458874],[119.903033,30.459408],[119.907407,30.456696],[119.909308,30.456326],[119.91487,30.458984],[119.918816,30.4616],[119.92155,30.462531],[119.924925,30.462189],[119.929299,30.459367],[119.931415,30.456463],[119.93151,30.449299],[119.93498,30.446779],[119.939188,30.44619],[119.944179,30.447149],[119.95074,30.444231],[119.952333,30.441861],[119.952737,30.438751],[119.955874,30.433668],[119.959606,30.432339],[119.965026,30.431572],[119.970612,30.432914],[119.973369,30.437751],[119.982973,30.445286],[119.987109,30.446135],[119.990793,30.445272],[120.0037,30.444285],[120.005459,30.443505],[120.008407,30.438669],[120.011901,30.436011],[120.013827,30.4356],[120.027732,30.434832],[120.031108,30.435161],[120.041543,30.43338],[120.044134,30.431969],[120.046107,30.427434],[120.049815,30.427338],[120.057089,30.429242],[120.061938,30.429325],[120.064743,30.430092],[120.062342,30.435572],[120.065907,30.437353],[120.067952,30.441135],[120.068118,30.445943],[120.065075,30.449546],[120.062413,30.451587],[120.059252,30.459011],[120.06025,30.464956],[120.059489,30.473433],[120.060416,30.476145],[120.063839,30.479418],[120.06586,30.483581],[120.066454,30.489496],[120.068284,30.496603],[120.076081,30.495357],[120.08074,30.497151],[120.090034,30.495987],[120.093766,30.496589],[120.099233,30.495795],[120.099804,30.494125],[120.097047,30.489852],[120.096761,30.486758],[120.099542,30.483293],[120.107315,30.481226],[120.111237,30.476186],[120.115136,30.475871],[120.122623,30.479117],[120.129707,30.479897],[120.146013,30.482705],[120.147796,30.48087],[120.146655,30.474666],[120.147083,30.471283],[120.149817,30.467503],[120.160371,30.469914],[120.162463,30.473146],[120.165624,30.474159],[120.169784,30.473981],[120.172945,30.475022],[120.175061,30.47683],[120.173159,30.483266],[120.174419,30.484129],[120.178246,30.481499],[120.180219,30.481787],[120.180005,30.483964],[120.177699,30.486018],[120.177747,30.488606],[120.173801,30.49203],[120.177058,30.493782],[120.179149,30.491947],[120.1859,30.494631],[120.182287,30.496233],[120.182216,30.499629],[120.185092,30.502627],[120.194553,30.503668],[120.197001,30.505092],[120.195812,30.509459],[120.196573,30.512032],[120.200234,30.514921],[120.201755,30.514428],[120.2033,30.507816],[120.205416,30.505858],[120.208268,30.507939],[120.212523,30.509774],[120.220724,30.510253],[120.224598,30.50976],[120.233869,30.506392],[120.239288,30.505242],[120.251934,30.506543],[120.261228,30.505242],[120.2671,30.505817],[120.27744,30.504831],[120.282123,30.508692],[120.285831,30.507802],[120.286853,30.510992],[120.289277,30.513032],[120.296527,30.514798],[120.299808,30.517809],[120.299903,30.519822],[120.311598,30.520739],[120.314593,30.521861],[120.317707,30.521601],[120.319894,30.518494],[120.322295,30.509979],[120.322651,30.506488],[120.326145,30.500437],[120.325765,30.496945],[120.327667,30.491071],[120.327904,30.484197],[120.325789,30.480774],[120.326026,30.478596],[120.328332,30.473584],[120.329188,30.468421],[120.331327,30.468407],[120.335059,30.471352],[120.341382,30.472269],[120.340645,30.466038],[120.337246,30.464312],[120.336866,30.458121],[120.337864,30.451916],[120.339813,30.450149],[120.340978,30.441614],[120.339433,30.440011],[120.340336,30.433887],[120.335939,30.431243],[120.330757,30.427269],[120.332682,30.424666],[120.332967,30.417308],[120.324838,30.411963],[120.32151,30.407715],[120.322057,30.404741],[120.320512,30.40433],[120.31533,30.400657],[120.310481,30.400205],[120.306273,30.39745],[120.306677,30.395092],[120.308936,30.393338],[120.31571,30.394325],[120.318824,30.388801],[120.318372,30.38547],[120.319276,30.379329],[120.324386,30.378493],[120.332635,30.375271],[120.339409,30.373325],[120.342927,30.371611],[120.34433,30.368087],[120.341192,30.36588],[120.335986,30.361068],[120.328261,30.358655],[120.325717,30.353389],[120.316281,30.352539],[120.310766,30.350839],[120.307224,30.350619],[120.300759,30.347575],[120.301567,30.343927],[120.299618,30.341816],[120.296623,30.33596],[120.29358,30.325001],[120.300117,30.324987],[120.300212,30.32127],[120.299475,30.315605],[120.295767,30.314851],[120.291631,30.315331],[120.291964,30.317814],[120.275562,30.319857],[120.272591,30.320516],[120.276251,30.3233],[120.281885,30.328499],[120.279318,30.336686],[120.277868,30.337948],[120.266553,30.331338],[120.268051,30.328663],[120.264437,30.326578],[120.258471,30.334355],[120.260872,30.335452],[120.261466,30.337523],[120.252552,30.337043],[120.248012,30.338853],[120.246015,30.342871],[120.243543,30.344174],[120.236056,30.339786],[120.234772,30.340691],[120.239883,30.344997],[120.242236,30.348261],[120.243947,30.354116],[120.243567,30.358188],[120.244233,30.359902],[120.247109,30.362343],[120.2468,30.363947],[120.239978,30.372146],[120.23482,30.376683],[120.23791,30.380028],[120.240334,30.387622],[120.237577,30.390062],[120.232395,30.392529],[120.228592,30.393544],[120.221294,30.387156]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":330111,\"name\":\"富阳区\",\"center\":[119.949869,30.049871],\"centroid\":[119.839625,29.995216],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":330100},\"subFeatureIndex\":8,\"acroutes\":[100000,330000,330100]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[119.996332,30.181536],[119.998994,30.182305],[120.005459,30.182346],[120.011449,30.181852],[120.013494,30.181042],[120.016156,30.177072],[120.014397,30.173816],[120.017772,30.168417],[120.018913,30.165202],[120.018438,30.162963],[120.014825,30.15891],[120.017178,30.153167],[120.016417,30.148935],[120.011663,30.142779],[120.008858,30.136719],[120.008787,30.134204],[120.007004,30.130026],[120.003819,30.12659],[120.001941,30.119567],[120.000468,30.116034],[120.001822,30.114357],[120.01095,30.116254],[120.016417,30.115718],[120.017725,30.113189],[120.016465,30.108323],[120.019151,30.10567],[120.02324,30.10633],[120.025213,30.105519],[120.030442,30.098837],[120.030846,30.094768],[120.036361,30.092555],[120.041258,30.093091],[120.043635,30.092156],[120.044894,30.086368],[120.049125,30.086849],[120.052953,30.091661],[120.054902,30.09272],[120.059513,30.092788],[120.061748,30.091853],[120.067928,30.086794],[120.076747,30.080868],[120.084615,30.078269],[120.091579,30.078475],[120.09795,30.079603],[120.108955,30.08062],[120.115088,30.082229],[120.118131,30.083796],[120.123812,30.089461],[120.124739,30.092953],[120.130349,30.099305],[120.134818,30.097669],[120.146869,30.088664],[120.140808,30.083769],[120.135079,30.080689],[120.137718,30.072177],[120.1371,30.069674],[120.134081,30.064999],[120.136886,30.061547],[120.136386,30.058934],[120.130349,30.055509],[120.12897,30.052208],[120.12569,30.050241],[120.124478,30.04833],[120.126474,30.045936],[120.129873,30.045757],[120.131133,30.044327],[120.134532,30.043983],[120.137171,30.029278],[120.136981,30.024806],[120.135555,30.021271],[120.134105,30.01058],[120.126926,29.997768],[120.124858,29.993337],[120.120294,29.990791],[120.118535,29.988272],[120.114137,29.987667],[120.110239,29.983524],[120.104463,29.981377],[120.104962,29.973614],[120.102965,29.967282],[120.101801,29.958499],[120.096001,29.952703],[120.090676,29.949123],[120.091151,29.946851],[120.100826,29.938039],[120.101325,29.936896],[120.097546,29.931126],[120.098449,29.924309],[120.096975,29.920866],[120.092126,29.916955],[120.089606,29.916514],[120.084448,29.91734],[120.081097,29.912933],[120.085542,29.906859],[120.085827,29.897437],[120.084805,29.894585],[120.082523,29.891788],[120.078268,29.88975],[120.077222,29.88822],[120.078149,29.884115],[120.082095,29.876688],[120.088156,29.871232],[120.096666,29.862399],[120.099566,29.856694],[120.104059,29.8534],[120.102442,29.849445],[120.102466,29.846812],[120.104796,29.845531],[120.10993,29.845972],[120.102015,29.832905],[120.101111,29.830258],[120.102728,29.823972],[120.09871,29.819023],[120.095834,29.816596],[120.091888,29.816679],[120.085328,29.820967],[120.080384,29.826522],[120.077198,29.828149],[120.074275,29.827336],[120.065646,29.822042],[120.061961,29.821628],[120.054355,29.823559],[120.049553,29.823917],[120.038453,29.822828],[120.036076,29.816596],[120.03106,29.810254],[120.030038,29.806283],[120.032296,29.803898],[120.034649,29.799568],[120.036218,29.79346],[120.036622,29.78884],[120.035481,29.787213],[120.030062,29.782758],[120.029776,29.779324],[120.030038,29.770552],[120.02835,29.768938],[120.025522,29.769311],[120.021718,29.767049],[120.020292,29.764855],[120.015229,29.764235],[120.011497,29.761503],[120.011212,29.757324],[120.008977,29.75713],[120.003439,29.75513],[120.000087,29.754909],[119.991958,29.753157],[119.987845,29.754909],[119.986871,29.75673],[119.981214,29.757972],[119.979859,29.759641],[119.978718,29.76589],[119.977078,29.766469],[119.973132,29.765793],[119.968639,29.762897],[119.967165,29.759986],[119.962316,29.75571],[119.960272,29.755144],[119.94765,29.756179],[119.94456,29.755503],[119.93933,29.752675],[119.937024,29.750564],[119.933079,29.749046],[119.927184,29.744438],[119.924949,29.745252],[119.924331,29.748867],[119.923166,29.750357],[119.916416,29.752344],[119.913539,29.755861],[119.907692,29.754523],[119.904364,29.754606],[119.896448,29.761159],[119.892574,29.763117],[119.89053,29.763241],[119.883921,29.763421],[119.878003,29.764966],[119.872654,29.767255],[119.870301,29.769324],[119.866403,29.776552],[119.863313,29.778772],[119.860793,29.781862],[119.860222,29.786564],[119.865761,29.797404],[119.867021,29.801389],[119.868304,29.80245],[119.871822,29.801816],[119.875364,29.802423],[119.881568,29.80587],[119.884896,29.812088],[119.882971,29.819726],[119.882329,29.826729],[119.885371,29.830934],[119.886061,29.83489],[119.889103,29.838639],[119.888889,29.842622],[119.887059,29.845668],[119.885015,29.846137],[119.865642,29.837757],[119.859937,29.837591],[119.852568,29.841216],[119.843892,29.85103],[119.840659,29.855853],[119.836618,29.85945],[119.828537,29.864563],[119.827039,29.867277],[119.82528,29.874691],[119.821786,29.879458],[119.817792,29.880629],[119.813942,29.880229],[119.802841,29.876275],[119.794307,29.874677],[119.787295,29.875131],[119.777502,29.874222],[119.763952,29.871328],[119.756607,29.871949],[119.752186,29.870019],[119.744889,29.868393],[119.74042,29.868931],[119.736688,29.870901],[119.72718,29.8655],[119.712157,29.860291],[119.710731,29.860938],[119.705549,29.867897],[119.702863,29.870419],[119.699915,29.875421],[119.692261,29.880905],[119.685748,29.881993],[119.679045,29.885437],[119.675479,29.888702],[119.675384,29.893607],[119.676311,29.899035],[119.674243,29.905109],[119.675503,29.908842],[119.675146,29.912671],[119.676121,29.916665],[119.675432,29.920012],[119.673744,29.92205],[119.668087,29.92256],[119.66628,29.927876],[119.654228,29.930616],[119.643413,29.92789],[119.637874,29.925342],[119.635426,29.924943],[119.630957,29.926568],[119.626726,29.933054],[119.627677,29.938837],[119.626061,29.942968],[119.619619,29.946039],[119.617432,29.953831],[119.611632,29.95631],[119.611466,29.962587],[119.604192,29.962298],[119.60065,29.964955],[119.599081,29.970874],[119.596324,29.972141],[119.593115,29.972279],[119.587315,29.974068],[119.58218,29.973311],[119.575121,29.977179],[119.568322,29.98157],[119.565375,29.982492],[119.560526,29.981707],[119.557958,29.980427],[119.553395,29.976683],[119.547951,29.975293],[119.540392,29.980124],[119.539204,29.982547],[119.539441,29.985988],[119.541438,29.989649],[119.53937,29.993956],[119.542769,30.002874],[119.542508,30.006727],[119.535258,30.008736],[119.530932,30.012423],[119.52449,30.014831],[119.522541,30.0164],[119.514055,30.015464],[119.508873,30.011777],[119.507161,30.011447],[119.502407,30.017432],[119.500719,30.022454],[119.501385,30.025893],[119.504047,30.031974],[119.506805,30.036335],[119.509063,30.037958],[119.511369,30.041301],[119.510798,30.043845],[119.506424,30.051246],[119.50602,30.054863],[119.50892,30.06416],[119.508635,30.066457],[119.505212,30.070128],[119.502669,30.070967],[119.499816,30.073374],[119.494706,30.072947],[119.490902,30.073924],[119.485459,30.077403],[119.481679,30.079011],[119.47519,30.080043],[119.473217,30.079671],[119.467013,30.074034],[119.465634,30.074061],[119.463043,30.077306],[119.461118,30.083535],[119.459407,30.086945],[119.4576,30.088403],[119.454106,30.088801],[119.446975,30.086629],[119.440081,30.087193],[119.437229,30.089874],[119.436373,30.094411],[119.436944,30.097037],[119.440676,30.0998],[119.446523,30.10314],[119.454201,30.105725],[119.457077,30.107264],[119.459502,30.109794],[119.460785,30.112845],[119.461332,30.118343],[119.460738,30.120185],[119.458028,30.122426],[119.452466,30.123168],[119.447307,30.125655],[119.442577,30.13015],[119.441341,30.135784],[119.443766,30.139082],[119.445834,30.140072],[119.452062,30.139288],[119.455152,30.142215],[119.459502,30.143177],[119.463828,30.145527],[119.468368,30.143205],[119.479754,30.146805],[119.483676,30.141927],[119.486695,30.141982],[119.489785,30.144923],[119.492828,30.142628],[119.498651,30.141212],[119.499412,30.14337],[119.497819,30.146091],[119.503643,30.149086],[119.503429,30.156025],[119.505664,30.158567],[119.520449,30.158938],[119.526201,30.157412],[119.529434,30.158443],[119.530195,30.160147],[119.529315,30.166411],[119.535424,30.183967],[119.539774,30.185698],[119.546549,30.186275],[119.550518,30.189228],[119.556413,30.192346],[119.561595,30.194241],[119.571246,30.196947],[119.574907,30.19615],[119.577521,30.194557],[119.580231,30.191412],[119.582513,30.186852],[119.583226,30.182429],[119.580707,30.167332],[119.582109,30.1649],[119.586126,30.164103],[119.594589,30.159212],[119.605166,30.156698],[119.607948,30.153222],[119.610063,30.146544],[119.610301,30.138505],[119.611727,30.137461],[119.615673,30.137516],[119.61679,30.136238],[119.615934,30.132926],[119.616148,30.126961],[119.619191,30.123195],[119.623375,30.122055],[119.632954,30.122659],[119.64491,30.126961],[119.651733,30.130713],[119.655797,30.130081],[119.65991,30.123498],[119.662239,30.120927],[119.672246,30.116502],[119.673221,30.115581],[119.67498,30.110041],[119.67971,30.105106],[119.687578,30.099896],[119.691049,30.098356],[119.70039,30.09617],[119.701413,30.092087],[119.736165,30.084814],[119.73916,30.085625],[119.741228,30.089901],[119.744698,30.092073],[119.747432,30.091455],[119.751116,30.08733],[119.7553,30.085199],[119.76747,30.082133],[119.770822,30.082091],[119.777573,30.083054],[119.779237,30.08458],[119.780188,30.096363],[119.782113,30.099484],[119.783824,30.100034],[119.78827,30.098521],[119.790005,30.099346],[119.789791,30.105189],[119.791003,30.107361],[119.797136,30.110344],[119.80208,30.111691],[119.802532,30.117807],[119.804671,30.122302],[119.807809,30.124762],[119.81059,30.125807],[119.814512,30.130479],[119.821762,30.132582],[119.826136,30.133365],[119.828584,30.140608],[119.831199,30.14359],[119.829582,30.156464],[119.834455,30.160545],[119.840564,30.166453],[119.853472,30.174929],[119.85718,30.177951],[119.861981,30.180726],[119.871656,30.182662],[119.880499,30.187703],[119.887677,30.18975],[119.894975,30.193417],[119.901393,30.188843],[119.903936,30.187648],[119.909166,30.19089],[119.914514,30.191824],[119.92155,30.190904],[119.926613,30.189681],[119.929751,30.188129],[119.935028,30.178981],[119.935265,30.177896],[119.932841,30.169626],[119.933102,30.163952],[119.934338,30.160202],[119.938736,30.158704],[119.942016,30.160476],[119.945392,30.16501],[119.951168,30.168307],[119.955993,30.168733],[119.959274,30.168005],[119.963101,30.170464],[119.964669,30.172854],[119.974296,30.175107],[119.980168,30.17405],[119.987988,30.174901],[119.996332,30.181536]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":330112,\"name\":\"临安区\",\"center\":[119.715101,30.231153],\"centroid\":[119.343878,30.201776],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":330100},\"subFeatureIndex\":9,\"acroutes\":[100000,330000,330100]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[119.236369,29.950968],[119.235537,29.955332],[119.233184,29.957618],[119.228121,29.959614],[119.224769,29.959476],[119.217662,29.956282],[119.210673,29.958127],[119.208534,29.957989],[119.204279,29.961624],[119.197006,29.962436],[119.19363,29.963744],[119.184431,29.965588],[119.178251,29.964859],[119.173734,29.962766],[119.169741,29.964749],[119.161588,29.966318],[119.158616,29.970227],[119.153553,29.969291],[119.14937,29.970737],[119.14956,29.973366],[119.14811,29.974687],[119.142001,29.975637],[119.135512,29.980909],[119.132089,29.981721],[119.12182,29.978652],[119.12037,29.978872],[119.115901,29.98691],[119.113334,29.993447],[119.110196,29.997768],[119.11312,30.001498],[119.114546,30.009506],[119.11205,30.010965],[119.107986,30.011873],[119.097764,30.012616],[119.089896,30.013854],[119.085332,30.012754],[119.081458,30.009933],[119.077013,30.008763],[119.064414,30.008364],[119.058805,30.009217],[119.054051,30.008282],[119.051911,30.007098],[119.046824,30.011158],[119.039883,30.01058],[119.034963,30.013373],[119.031112,30.01845],[119.025122,30.021078],[119.024243,30.022454],[119.031683,30.031066],[119.032015,30.032662],[119.030138,30.035083],[119.026952,30.035],[119.021247,30.032744],[119.016161,30.032662],[119.004751,30.024311],[118.999355,30.021614],[118.988326,30.017996],[118.9864,30.025329],[118.987113,30.027283],[118.9864,30.031424],[118.982454,30.034643],[118.979721,30.032442],[118.975894,30.027943],[118.970664,30.026375],[118.969381,30.023458],[118.966457,30.022137],[118.96263,30.023444],[118.956093,30.021449],[118.95412,30.018766],[118.949199,30.016813],[118.940286,30.010249],[118.93634,30.010951],[118.932703,30.009575],[118.932109,30.008158],[118.927973,30.011584],[118.923789,30.009795],[118.917086,30.013056],[118.913211,30.012382],[118.909313,30.01391],[118.90501,30.012836],[118.898355,30.015547],[118.897404,30.01673],[118.89883,30.018766],[118.902586,30.029057],[118.901516,30.031314],[118.895597,30.032455],[118.892269,30.039017],[118.890582,30.041273],[118.891342,30.043034],[118.897333,30.049623],[118.897356,30.051864],[118.89391,30.054932],[118.88811,30.062372],[118.885067,30.064036],[118.878815,30.064655],[118.875464,30.07204],[118.87506,30.079039],[118.873729,30.081748],[118.872992,30.087028],[118.872611,30.095401],[118.868856,30.101463],[118.869117,30.107402],[118.871637,30.11301],[118.873895,30.115058],[118.878055,30.116735],[118.883855,30.116392],[118.88723,30.11745],[118.888609,30.122357],[118.888656,30.128432],[118.893387,30.133091],[118.895978,30.138794],[118.896952,30.1444],[118.896786,30.148083],[118.895098,30.148495],[118.890938,30.147451],[118.881026,30.146805],[118.874988,30.148193],[118.870543,30.151161],[118.865718,30.151491],[118.862081,30.148894],[118.8564,30.14822],[118.852145,30.149924],[118.846987,30.153881],[118.845703,30.156135],[118.846797,30.161053],[118.84808,30.163046],[118.852858,30.166549],[118.858349,30.168087],[118.864411,30.168994],[118.870282,30.171055],[118.873681,30.172923],[118.884259,30.176811],[118.891628,30.18041],[118.9028,30.183226],[118.904796,30.18655],[118.91081,30.187484],[118.912165,30.1885],[118.915707,30.194392],[118.920651,30.199021],[118.929232,30.201918],[118.92909,30.20667],[118.926142,30.212643],[118.923385,30.214511],[118.919368,30.215225],[118.911452,30.215321],[118.905201,30.216571],[118.90318,30.21793],[118.899876,30.223422],[118.896168,30.234557],[118.893529,30.23976],[118.892531,30.243247],[118.889726,30.24499],[118.882429,30.247475],[118.881549,30.251153],[118.882357,30.252348],[118.888965,30.253775],[118.889441,30.255724],[118.886541,30.260734],[118.885043,30.268379],[118.879861,30.278355],[118.878079,30.282719],[118.877199,30.288071],[118.877508,30.290815],[118.880574,30.294519],[118.881811,30.298512],[118.881549,30.304603],[118.879196,30.312189],[118.879885,30.314878],[118.889607,30.317018],[118.894124,30.319089],[118.899781,30.322587],[118.90841,30.330871],[118.911143,30.332229],[118.917894,30.332449],[118.9226,30.334753],[118.928282,30.339978],[118.933559,30.342131],[118.93634,30.345066],[118.937362,30.348713],[118.936435,30.350811],[118.94977,30.358778],[118.954191,30.360341],[118.955404,30.359189],[118.956592,30.352059],[118.959373,30.347287],[118.964056,30.350578],[118.969048,30.351332],[118.972708,30.347534],[118.975751,30.347164],[118.985735,30.34955],[118.988112,30.348672],[118.988539,30.346547],[118.987755,30.340705],[118.98804,30.333477],[118.989157,30.33238],[118.996312,30.330501],[119.004442,30.328938],[119.007152,30.327717],[119.010598,30.323561],[119.01376,30.321531],[119.018538,30.32042],[119.02158,30.315509],[119.024742,30.313657],[119.028783,30.312587],[119.037197,30.312066],[119.046872,30.313191],[119.048322,30.31267],[119.050414,30.309268],[119.050842,30.30673],[119.052672,30.305221],[119.05676,30.303876],[119.059874,30.303849],[119.062988,30.30496],[119.067077,30.308197],[119.069858,30.312135],[119.0734,30.31588],[119.08267,30.321627],[119.090253,30.324014],[119.0932,30.322957],[119.094959,30.320653],[119.102328,30.31758],[119.105466,30.314631],[119.111028,30.311298],[119.119467,30.310104],[119.125671,30.305371],[119.128499,30.304727],[119.151271,30.304603],[119.154599,30.302833],[119.156739,30.299541],[119.160875,30.298114],[119.163584,30.299664],[119.166294,30.298827],[119.170525,30.295342],[119.173996,30.294711],[119.179629,30.295384],[119.18821,30.291652],[119.19092,30.291954],[119.201046,30.291021],[119.203709,30.296262],[119.204065,30.299349],[119.205682,30.301558],[119.210602,30.299431],[119.212908,30.299239],[119.218019,30.301338],[119.222606,30.299623],[119.224032,30.296564],[119.223747,30.291281],[119.225482,30.288798],[119.229191,30.289662],[119.233731,30.293394],[119.238152,30.301365],[119.243072,30.313287],[119.245925,30.321613],[119.244095,30.324452],[119.239982,30.327031],[119.241575,30.33153],[119.247137,30.340814],[119.248849,30.341541],[119.252747,30.340334],[119.257121,30.337756],[119.261209,30.337249],[119.26506,30.338058],[119.270599,30.342062],[119.272334,30.34257],[119.275757,30.34091],[119.278158,30.341582],[119.289448,30.349646],[119.297507,30.35764],[119.300668,30.363686],[119.31077,30.366387],[119.326554,30.371762],[119.329074,30.371515],[119.336347,30.366264],[119.342647,30.363152],[119.343788,30.360684],[119.344881,30.354143],[119.349445,30.349152],[119.356077,30.349426],[119.368247,30.35295],[119.375616,30.354815],[119.381083,30.35812],[119.386146,30.363906],[119.391875,30.366305],[119.395845,30.36625],[119.399981,30.3678],[119.403047,30.373325],[119.407136,30.373325],[119.418141,30.376108],[119.421113,30.379727],[119.426556,30.383949],[119.430502,30.384058],[119.432784,30.386485],[119.434186,30.390254],[119.435708,30.391501],[119.441032,30.392461],[119.445739,30.399191],[119.448425,30.405235],[119.450231,30.410826],[119.451848,30.412169],[119.455865,30.411991],[119.467013,30.40814],[119.477329,30.40729],[119.483819,30.408318],[119.490403,30.408208],[119.498889,30.406865],[119.506092,30.404673],[119.513151,30.401671],[119.516907,30.402535],[119.522232,30.404673],[119.528626,30.408524],[119.533451,30.409414],[119.535733,30.411662],[119.536446,30.414403],[119.53483,30.420788],[119.535305,30.424049],[119.544386,30.431065],[119.54662,30.434805],[119.551731,30.439765],[119.565922,30.443381],[119.569107,30.44097],[119.571864,30.436915],[119.572839,30.431325],[119.579708,30.424748],[119.5818,30.423625],[119.591665,30.421638],[119.597893,30.422446],[119.602789,30.425886],[119.606569,30.427146],[119.613011,30.426023],[119.618026,30.427324],[119.623018,30.429763],[119.627653,30.433024],[119.633881,30.440217],[119.63709,30.441833],[119.642296,30.440217],[119.645101,30.437764],[119.645671,30.429845],[119.637161,30.428708],[119.632193,30.42716],[119.631052,30.423282],[119.634071,30.414992],[119.635878,30.406249],[119.635973,30.403617],[119.632383,30.399766],[119.640014,30.39793],[119.644411,30.395764],[119.649783,30.395449],[119.658151,30.397464],[119.661859,30.397409],[119.667397,30.399108],[119.677856,30.40618],[119.681089,30.408729],[119.685011,30.406605],[119.696445,30.401918],[119.704027,30.399684],[119.718385,30.390199],[119.723258,30.388472],[119.726253,30.389624],[119.735571,30.395682],[119.742321,30.393338],[119.744722,30.393804],[119.749048,30.392543],[119.755585,30.388815],[119.753303,30.386553],[119.750237,30.385292],[119.749262,30.383757],[119.749904,30.381399],[119.757534,30.378561],[119.768825,30.376752],[119.771107,30.375998],[119.772771,30.3739],[119.774578,30.367471],[119.78033,30.365647],[119.788602,30.35971],[119.791764,30.356899],[119.795163,30.348988],[119.798895,30.344215],[119.804647,30.342392],[119.807262,30.334437],[119.807666,30.328992],[119.806549,30.325851],[119.80227,30.322614],[119.803839,30.316099],[119.803554,30.311462],[119.802365,30.307868],[119.799085,30.30175],[119.799893,30.297483],[119.808023,30.295342],[119.821001,30.304096],[119.826302,30.306743],[119.83108,30.307745],[119.833433,30.307127],[119.836286,30.29928],[119.837118,30.29382],[119.836761,30.289525],[119.830438,30.286328],[119.827871,30.283789],[119.827657,30.282074],[119.829273,30.278548],[119.828513,30.269216],[119.829083,30.268516],[119.839471,30.27148],[119.844225,30.272194],[119.846816,30.270245],[119.853686,30.273841],[119.859985,30.272825],[119.864715,30.273264],[119.864976,30.271068],[119.867282,30.26938],[119.86588,30.268392],[119.86569,30.265236],[119.863479,30.263218],[119.862837,30.260501],[119.865,30.258922],[119.864477,30.256232],[119.868304,30.252718],[119.86752,30.249795],[119.86298,30.237852],[119.856657,30.227843],[119.853876,30.225276],[119.849787,30.223093],[119.846412,30.222502],[119.844914,30.221047],[119.845057,30.217189],[119.843132,30.214442],[119.84161,30.20667],[119.836452,30.199378],[119.836095,30.197949],[119.839495,30.19387],[119.842656,30.191123],[119.845413,30.190437],[119.84905,30.188074],[119.850168,30.181357],[119.853472,30.174929],[119.840564,30.166453],[119.834455,30.160545],[119.829582,30.156464],[119.831199,30.14359],[119.828584,30.140608],[119.826136,30.133365],[119.821762,30.132582],[119.814512,30.130479],[119.81059,30.125807],[119.807809,30.124762],[119.804671,30.122302],[119.802532,30.117807],[119.80208,30.111691],[119.797136,30.110344],[119.791003,30.107361],[119.789791,30.105189],[119.790005,30.099346],[119.78827,30.098521],[119.783824,30.100034],[119.782113,30.099484],[119.780188,30.096363],[119.779237,30.08458],[119.777573,30.083054],[119.770822,30.082091],[119.76747,30.082133],[119.7553,30.085199],[119.751116,30.08733],[119.747432,30.091455],[119.744698,30.092073],[119.741228,30.089901],[119.73916,30.085625],[119.736165,30.084814],[119.701413,30.092087],[119.70039,30.09617],[119.691049,30.098356],[119.687578,30.099896],[119.67971,30.105106],[119.67498,30.110041],[119.673221,30.115581],[119.672246,30.116502],[119.662239,30.120927],[119.65991,30.123498],[119.655797,30.130081],[119.651733,30.130713],[119.64491,30.126961],[119.632954,30.122659],[119.623375,30.122055],[119.619191,30.123195],[119.616148,30.126961],[119.615934,30.132926],[119.61679,30.136238],[119.615673,30.137516],[119.611727,30.137461],[119.610301,30.138505],[119.610063,30.146544],[119.607948,30.153222],[119.605166,30.156698],[119.594589,30.159212],[119.586126,30.164103],[119.582109,30.1649],[119.580707,30.167332],[119.583226,30.182429],[119.582513,30.186852],[119.580231,30.191412],[119.577521,30.194557],[119.574907,30.19615],[119.571246,30.196947],[119.561595,30.194241],[119.556413,30.192346],[119.550518,30.189228],[119.546549,30.186275],[119.539774,30.185698],[119.535424,30.183967],[119.529315,30.166411],[119.530195,30.160147],[119.529434,30.158443],[119.526201,30.157412],[119.520449,30.158938],[119.505664,30.158567],[119.503429,30.156025],[119.503643,30.149086],[119.497819,30.146091],[119.499412,30.14337],[119.498651,30.141212],[119.492828,30.142628],[119.489785,30.144923],[119.486695,30.141982],[119.483676,30.141927],[119.479754,30.146805],[119.468368,30.143205],[119.463828,30.145527],[119.459502,30.143177],[119.455152,30.142215],[119.452062,30.139288],[119.445834,30.140072],[119.443766,30.139082],[119.441341,30.135784],[119.442577,30.13015],[119.447307,30.125655],[119.452466,30.123168],[119.458028,30.122426],[119.460738,30.120185],[119.461332,30.118343],[119.460785,30.112845],[119.459502,30.109794],[119.457077,30.107264],[119.454201,30.105725],[119.446523,30.10314],[119.440676,30.0998],[119.436944,30.097037],[119.436373,30.094411],[119.437229,30.089874],[119.440081,30.087193],[119.43623,30.086038],[119.431785,30.082559],[119.429741,30.079314],[119.430597,30.074542],[119.433164,30.071531],[119.434044,30.068877],[119.43257,30.067405],[119.42299,30.06537],[119.420399,30.063514],[119.420304,30.062083],[119.427673,30.057173],[119.430169,30.053116],[119.430502,30.050021],[119.433497,30.044588],[119.433117,30.040407],[119.431476,30.037559],[119.430763,30.032813],[119.431096,30.029773],[119.430335,30.024683],[119.432308,30.015423],[119.433568,30.013166],[119.426603,30.000548],[119.426485,29.994741],[119.425058,29.991589],[119.420542,29.991837],[119.412817,29.99525],[119.405353,29.997245],[119.397176,29.995608],[119.38926,29.993186],[119.386978,29.989428],[119.381582,29.991438],[119.36858,29.998828],[119.358287,30.002268],[119.345071,30.004264],[119.338915,30.007195],[119.334374,30.007814],[119.321752,29.999805],[119.318543,29.996034],[119.314098,29.997493],[119.309487,29.993805],[119.30547,29.994204],[119.297958,30.001223],[119.29734,30.003342],[119.299384,30.007222],[119.296532,30.011103],[119.29444,30.012726],[119.290494,30.013744],[119.282603,30.009933],[119.278514,30.005571],[119.274901,30.002736],[119.270456,30.001016],[119.268364,30.001897],[119.265274,30.005557],[119.263135,30.005007],[119.260876,30.002846],[119.256217,30.000108],[119.250346,29.999599],[119.248373,29.998718],[119.246472,29.992291],[119.247922,29.98852],[119.253769,29.983964],[119.255148,29.981212],[119.252961,29.975775],[119.253817,29.968025],[119.255433,29.962078],[119.259569,29.95547],[119.259403,29.951395],[119.258048,29.9463],[119.258214,29.943794],[119.259854,29.940572],[119.25762,29.936799],[119.25472,29.935188],[119.24747,29.934376],[119.24476,29.935491],[119.241171,29.940641],[119.240434,29.943588],[119.237819,29.946906],[119.236369,29.950968]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":330122,\"name\":\"桐庐县\",\"center\":[119.685045,29.797437],\"centroid\":[119.553936,29.830649],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":330100},\"subFeatureIndex\":10,\"acroutes\":[100000,330000,330100]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[119.440081,30.087193],[119.446975,30.086629],[119.454106,30.088801],[119.4576,30.088403],[119.459407,30.086945],[119.461118,30.083535],[119.463043,30.077306],[119.465634,30.074061],[119.467013,30.074034],[119.473217,30.079671],[119.47519,30.080043],[119.481679,30.079011],[119.485459,30.077403],[119.490902,30.073924],[119.494706,30.072947],[119.499816,30.073374],[119.502669,30.070967],[119.505212,30.070128],[119.508635,30.066457],[119.50892,30.06416],[119.50602,30.054863],[119.506424,30.051246],[119.510798,30.043845],[119.511369,30.041301],[119.509063,30.037958],[119.506805,30.036335],[119.504047,30.031974],[119.501385,30.025893],[119.500719,30.022454],[119.502407,30.017432],[119.507161,30.011447],[119.508873,30.011777],[119.514055,30.015464],[119.522541,30.0164],[119.52449,30.014831],[119.530932,30.012423],[119.535258,30.008736],[119.542508,30.006727],[119.542769,30.002874],[119.53937,29.993956],[119.541438,29.989649],[119.539441,29.985988],[119.539204,29.982547],[119.540392,29.980124],[119.547951,29.975293],[119.553395,29.976683],[119.557958,29.980427],[119.560526,29.981707],[119.565375,29.982492],[119.568322,29.98157],[119.575121,29.977179],[119.58218,29.973311],[119.587315,29.974068],[119.593115,29.972279],[119.596324,29.972141],[119.599081,29.970874],[119.60065,29.964955],[119.604192,29.962298],[119.611466,29.962587],[119.611632,29.95631],[119.617432,29.953831],[119.619619,29.946039],[119.626061,29.942968],[119.627677,29.938837],[119.626726,29.933054],[119.630957,29.926568],[119.635426,29.924943],[119.637874,29.925342],[119.643413,29.92789],[119.654228,29.930616],[119.66628,29.927876],[119.668087,29.92256],[119.673744,29.92205],[119.675432,29.920012],[119.676121,29.916665],[119.675146,29.912671],[119.675503,29.908842],[119.674243,29.905109],[119.676311,29.899035],[119.675384,29.893607],[119.675479,29.888702],[119.679045,29.885437],[119.685748,29.881993],[119.692261,29.880905],[119.699915,29.875421],[119.702863,29.870419],[119.705549,29.867897],[119.710731,29.860938],[119.712157,29.860291],[119.72718,29.8655],[119.736688,29.870901],[119.74042,29.868931],[119.744889,29.868393],[119.752186,29.870019],[119.756607,29.871949],[119.763952,29.871328],[119.777502,29.874222],[119.787295,29.875131],[119.794307,29.874677],[119.802841,29.876275],[119.813942,29.880229],[119.817792,29.880629],[119.821786,29.879458],[119.82528,29.874691],[119.827039,29.867277],[119.828537,29.864563],[119.836618,29.85945],[119.840659,29.855853],[119.843892,29.85103],[119.852568,29.841216],[119.859937,29.837591],[119.865642,29.837757],[119.885015,29.846137],[119.887059,29.845668],[119.888889,29.842622],[119.889103,29.838639],[119.886061,29.83489],[119.885371,29.830934],[119.882329,29.826729],[119.882971,29.819726],[119.884896,29.812088],[119.881568,29.80587],[119.875364,29.802423],[119.871822,29.801816],[119.868304,29.80245],[119.867021,29.801389],[119.865761,29.797404],[119.860222,29.786564],[119.860793,29.781862],[119.863313,29.778772],[119.866403,29.776552],[119.870301,29.769324],[119.872654,29.767255],[119.878003,29.764966],[119.883921,29.763421],[119.89053,29.763241],[119.890221,29.758496],[119.888794,29.755972],[119.88908,29.753102],[119.890981,29.750426],[119.894476,29.748757],[119.900466,29.744645],[119.898612,29.740617],[119.901393,29.728612],[119.905648,29.72766],[119.911376,29.722582],[119.91247,29.720402],[119.911376,29.715944],[119.91178,29.71364],[119.915584,29.707967],[119.914252,29.705524],[119.919529,29.699562],[119.922525,29.697753],[119.928657,29.698858],[119.931676,29.696691],[119.933768,29.698582],[119.930084,29.701936],[119.930226,29.704503],[119.933578,29.706739],[119.937761,29.70747],[119.941517,29.705234],[119.94494,29.704903],[119.948149,29.703068],[119.951287,29.699299],[119.957942,29.698416],[119.960129,29.696967],[119.967403,29.694896],[119.973441,29.689941],[119.973797,29.678648],[119.973155,29.673098],[119.970778,29.670765],[119.966832,29.670958],[119.959083,29.672822],[119.948862,29.668017],[119.945653,29.667368],[119.940733,29.667506],[119.936169,29.666526],[119.924806,29.669895],[119.92281,29.668487],[119.921265,29.664027],[119.918246,29.664386],[119.914514,29.66625],[119.911709,29.666498],[119.908595,29.663074],[119.902344,29.661403],[119.895712,29.660644],[119.887178,29.662039],[119.883494,29.663433],[119.879286,29.667934],[119.875816,29.668984],[119.873058,29.668666],[119.869992,29.66995],[119.863384,29.669481],[119.859533,29.671345],[119.856538,29.671027],[119.852521,29.668887],[119.842157,29.675556],[119.837664,29.676453],[119.835454,29.678124],[119.836904,29.68076],[119.835359,29.682251],[119.824472,29.671856],[119.821738,29.671193],[119.817602,29.673057],[119.814132,29.671359],[119.810709,29.667493],[119.809972,29.665201],[119.805313,29.664952],[119.802484,29.663254],[119.79918,29.660078],[119.798253,29.656929],[119.796351,29.655687],[119.793214,29.656101],[119.79117,29.654969],[119.788151,29.645205],[119.781067,29.638618],[119.777525,29.628645],[119.776527,29.62685],[119.776218,29.620233],[119.779831,29.613285],[119.780069,29.609458],[119.779308,29.604001],[119.774364,29.599179],[119.76728,29.597659],[119.765307,29.596402],[119.762312,29.597811],[119.757843,29.598447],[119.750142,29.602978],[119.746434,29.606419],[119.742393,29.609195],[119.731126,29.613547],[119.728368,29.613506],[119.723899,29.610535],[119.718575,29.610439],[119.717315,29.608781],[119.715247,29.601804],[119.709376,29.595863],[119.708282,29.589673],[119.704075,29.587641],[119.701318,29.58959],[119.698322,29.593721],[119.695256,29.596719],[119.692998,29.602633],[119.695375,29.616034],[119.694876,29.619985],[119.693307,29.620965],[119.688363,29.62109],[119.679663,29.62685],[119.678593,29.634018],[119.676192,29.636325],[119.673031,29.636905],[119.670226,29.640979],[119.672104,29.648658],[119.674505,29.653809],[119.670844,29.657137],[119.667968,29.657316],[119.665305,29.653836],[119.658792,29.652013],[119.651043,29.651641],[119.64705,29.65229],[119.643579,29.653961],[119.636733,29.652939],[119.634689,29.653243],[119.62946,29.656239],[119.621972,29.65472],[119.616148,29.656805],[119.617479,29.662757],[119.616909,29.664648],[119.613581,29.669757],[119.612749,29.673029],[119.614128,29.684999],[119.610776,29.688229],[119.610895,29.695227],[119.602528,29.700859],[119.604144,29.708837],[119.603978,29.713419],[119.601815,29.716055],[119.596229,29.717352],[119.593448,29.723203],[119.59176,29.724818],[119.583726,29.729385],[119.581895,29.73111],[119.578306,29.738299],[119.577212,29.741569],[119.574099,29.745197],[119.571698,29.749847],[119.569131,29.751695],[119.560431,29.752316],[119.549472,29.749916],[119.544695,29.747432],[119.543696,29.746122],[119.540511,29.737319],[119.537064,29.736933],[119.531954,29.733925],[119.528269,29.733897],[119.522969,29.731013],[119.520187,29.728792],[119.50835,29.725273],[119.504879,29.722872],[119.50022,29.722679],[119.493802,29.721285],[119.492376,29.722334],[119.484556,29.731262],[119.478019,29.732338],[119.476379,29.733373],[119.472932,29.739361],[119.465753,29.741693],[119.458955,29.744935],[119.454938,29.741983],[119.451206,29.741555],[119.447094,29.743183],[119.44203,29.741651],[119.439867,29.742231],[119.434519,29.748384],[119.425938,29.753171],[119.425439,29.75582],[119.42261,29.758469],[119.417547,29.757048],[119.415431,29.750233],[119.411343,29.745266],[119.407088,29.7431],[119.398792,29.744328],[119.393563,29.748301],[119.392374,29.750357],[119.394323,29.759807],[119.391495,29.7624],[119.390924,29.764979],[119.388357,29.769628],[119.383579,29.770952],[119.380489,29.766993],[119.374142,29.760662],[119.373405,29.758758],[119.373857,29.754978],[119.370624,29.752688],[119.365823,29.750398],[119.36423,29.746397],[119.360332,29.741638],[119.358074,29.737968],[119.355768,29.73231],[119.354056,29.730185],[119.354508,29.725825],[119.352915,29.722334],[119.350015,29.719643],[119.34828,29.715116],[119.344168,29.717435],[119.341434,29.717366],[119.334184,29.714992],[119.327933,29.714316],[119.32218,29.716248],[119.31745,29.717173],[119.316547,29.719808],[119.31707,29.723617],[119.314431,29.724983],[119.308893,29.724721],[119.302451,29.725715],[119.298529,29.724831],[119.291184,29.725356],[119.287547,29.728198],[119.286881,29.730917],[119.28807,29.737954],[119.290233,29.740575],[119.292016,29.746218],[119.293299,29.760607],[119.294369,29.764028],[119.293989,29.768373],[119.294892,29.771766],[119.294369,29.775379],[119.286002,29.781793],[119.28246,29.786151],[119.273118,29.791612],[119.270765,29.795404],[119.272334,29.799624],[119.278609,29.804739],[119.279417,29.807938],[119.278823,29.813329],[119.27502,29.818527],[119.273903,29.828135],[119.274402,29.830175],[119.272215,29.83267],[119.267675,29.833759],[119.26594,29.833043],[119.257739,29.823503],[119.255409,29.821808],[119.251297,29.822235],[119.247209,29.824317],[119.241718,29.828397],[119.239079,29.831568],[119.233564,29.831568],[119.225506,29.834283],[119.222036,29.839177],[119.219017,29.839645],[119.213478,29.836213],[119.204232,29.833718],[119.196221,29.837123],[119.193939,29.83868],[119.189946,29.846495],[119.182933,29.852243],[119.182482,29.860497],[119.185382,29.865706],[119.188329,29.86776],[119.191419,29.873189],[119.191348,29.878741],[119.194581,29.884115],[119.198669,29.889612],[119.205705,29.896582],[119.207726,29.897271],[119.213692,29.896155],[119.219088,29.896541],[119.222368,29.897561],[119.225934,29.900302],[119.227669,29.902588],[119.228644,29.910605],[119.226766,29.912451],[119.227717,29.91617],[119.221703,29.917905],[119.218613,29.922298],[119.218328,29.927559],[119.222036,29.932916],[119.220277,29.936083],[119.216925,29.936662],[119.21141,29.935932],[119.208106,29.93629],[119.204113,29.937901],[119.197338,29.935119],[119.190968,29.936965],[119.18802,29.936689],[119.181127,29.941701],[119.180865,29.945144],[119.183242,29.949026],[119.190136,29.952042],[119.194462,29.953033],[119.205254,29.949192],[119.212076,29.946452],[119.217234,29.945529],[119.223509,29.946094],[119.226956,29.947787],[119.23114,29.951339],[119.236369,29.950968],[119.237819,29.946906],[119.240434,29.943588],[119.241171,29.940641],[119.24476,29.935491],[119.24747,29.934376],[119.25472,29.935188],[119.25762,29.936799],[119.259854,29.940572],[119.258214,29.943794],[119.258048,29.9463],[119.259403,29.951395],[119.259569,29.95547],[119.255433,29.962078],[119.253817,29.968025],[119.252961,29.975775],[119.255148,29.981212],[119.253769,29.983964],[119.247922,29.98852],[119.246472,29.992291],[119.248373,29.998718],[119.250346,29.999599],[119.256217,30.000108],[119.260876,30.002846],[119.263135,30.005007],[119.265274,30.005557],[119.268364,30.001897],[119.270456,30.001016],[119.274901,30.002736],[119.278514,30.005571],[119.282603,30.009933],[119.290494,30.013744],[119.29444,30.012726],[119.296532,30.011103],[119.299384,30.007222],[119.29734,30.003342],[119.297958,30.001223],[119.30547,29.994204],[119.309487,29.993805],[119.314098,29.997493],[119.318543,29.996034],[119.321752,29.999805],[119.334374,30.007814],[119.338915,30.007195],[119.345071,30.004264],[119.358287,30.002268],[119.36858,29.998828],[119.381582,29.991438],[119.386978,29.989428],[119.38926,29.993186],[119.397176,29.995608],[119.405353,29.997245],[119.412817,29.99525],[119.420542,29.991837],[119.425058,29.991589],[119.426485,29.994741],[119.426603,30.000548],[119.433568,30.013166],[119.432308,30.015423],[119.430335,30.024683],[119.431096,30.029773],[119.430763,30.032813],[119.431476,30.037559],[119.433117,30.040407],[119.433497,30.044588],[119.430502,30.050021],[119.430169,30.053116],[119.427673,30.057173],[119.420304,30.062083],[119.420399,30.063514],[119.42299,30.06537],[119.43257,30.067405],[119.434044,30.068877],[119.433164,30.071531],[119.430597,30.074542],[119.429741,30.079314],[119.431785,30.082559],[119.43623,30.086038],[119.440081,30.087193]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":330127,\"name\":\"淳安县\",\"center\":[119.044276,29.604177],\"centroid\":[118.889354,29.608818],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":330100},\"subFeatureIndex\":11,\"acroutes\":[100000,330000,330100]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[118.897404,30.01673],[118.898355,30.015547],[118.90501,30.012836],[118.909313,30.01391],[118.913211,30.012382],[118.917086,30.013056],[118.923789,30.009795],[118.927973,30.011584],[118.932109,30.008158],[118.932703,30.009575],[118.93634,30.010951],[118.940286,30.010249],[118.949199,30.016813],[118.95412,30.018766],[118.956093,30.021449],[118.96263,30.023444],[118.966457,30.022137],[118.969381,30.023458],[118.970664,30.026375],[118.975894,30.027943],[118.979721,30.032442],[118.982454,30.034643],[118.9864,30.031424],[118.987113,30.027283],[118.9864,30.025329],[118.988326,30.017996],[118.999355,30.021614],[119.004751,30.024311],[119.016161,30.032662],[119.021247,30.032744],[119.026952,30.035],[119.030138,30.035083],[119.032015,30.032662],[119.031683,30.031066],[119.024243,30.022454],[119.025122,30.021078],[119.031112,30.01845],[119.034963,30.013373],[119.039883,30.01058],[119.046824,30.011158],[119.051911,30.007098],[119.054051,30.008282],[119.058805,30.009217],[119.064414,30.008364],[119.077013,30.008763],[119.081458,30.009933],[119.085332,30.012754],[119.089896,30.013854],[119.097764,30.012616],[119.107986,30.011873],[119.11205,30.010965],[119.114546,30.009506],[119.11312,30.001498],[119.110196,29.997768],[119.113334,29.993447],[119.115901,29.98691],[119.12037,29.978872],[119.12182,29.978652],[119.132089,29.981721],[119.135512,29.980909],[119.142001,29.975637],[119.14811,29.974687],[119.14956,29.973366],[119.14937,29.970737],[119.153553,29.969291],[119.158616,29.970227],[119.161588,29.966318],[119.169741,29.964749],[119.173734,29.962766],[119.178251,29.964859],[119.184431,29.965588],[119.19363,29.963744],[119.197006,29.962436],[119.204279,29.961624],[119.208534,29.957989],[119.210673,29.958127],[119.217662,29.956282],[119.224769,29.959476],[119.228121,29.959614],[119.233184,29.957618],[119.235537,29.955332],[119.236369,29.950968],[119.23114,29.951339],[119.226956,29.947787],[119.223509,29.946094],[119.217234,29.945529],[119.212076,29.946452],[119.205254,29.949192],[119.194462,29.953033],[119.190136,29.952042],[119.183242,29.949026],[119.180865,29.945144],[119.181127,29.941701],[119.18802,29.936689],[119.190968,29.936965],[119.197338,29.935119],[119.204113,29.937901],[119.208106,29.93629],[119.21141,29.935932],[119.216925,29.936662],[119.220277,29.936083],[119.222036,29.932916],[119.218328,29.927559],[119.218613,29.922298],[119.221703,29.917905],[119.227717,29.91617],[119.226766,29.912451],[119.228644,29.910605],[119.227669,29.902588],[119.225934,29.900302],[119.222368,29.897561],[119.219088,29.896541],[119.213692,29.896155],[119.207726,29.897271],[119.205705,29.896582],[119.198669,29.889612],[119.194581,29.884115],[119.191348,29.878741],[119.191419,29.873189],[119.188329,29.86776],[119.185382,29.865706],[119.182482,29.860497],[119.182933,29.852243],[119.189946,29.846495],[119.193939,29.83868],[119.196221,29.837123],[119.204232,29.833718],[119.213478,29.836213],[119.219017,29.839645],[119.222036,29.839177],[119.225506,29.834283],[119.233564,29.831568],[119.239079,29.831568],[119.241718,29.828397],[119.247209,29.824317],[119.251297,29.822235],[119.255409,29.821808],[119.257739,29.823503],[119.26594,29.833043],[119.267675,29.833759],[119.272215,29.83267],[119.274402,29.830175],[119.273903,29.828135],[119.27502,29.818527],[119.278823,29.813329],[119.279417,29.807938],[119.278609,29.804739],[119.272334,29.799624],[119.270765,29.795404],[119.273118,29.791612],[119.28246,29.786151],[119.286002,29.781793],[119.294369,29.775379],[119.294892,29.771766],[119.293989,29.768373],[119.294369,29.764028],[119.293299,29.760607],[119.292016,29.746218],[119.290233,29.740575],[119.28807,29.737954],[119.286881,29.730917],[119.287547,29.728198],[119.291184,29.725356],[119.298529,29.724831],[119.302451,29.725715],[119.308893,29.724721],[119.314431,29.724983],[119.31707,29.723617],[119.316547,29.719808],[119.31745,29.717173],[119.32218,29.716248],[119.327933,29.714316],[119.334184,29.714992],[119.341434,29.717366],[119.344168,29.717435],[119.34828,29.715116],[119.345642,29.711224],[119.336942,29.702336],[119.33504,29.701715],[119.332924,29.702791],[119.330619,29.702115],[119.329763,29.699769],[119.323297,29.693171],[119.321657,29.688422],[119.320588,29.6792],[119.31852,29.676964],[119.315548,29.670309],[119.314621,29.669453],[119.309035,29.668017],[119.30673,29.661776],[119.306706,29.654154],[119.305517,29.651392],[119.303259,29.649735],[119.299194,29.649113],[119.293085,29.65066],[119.286572,29.647401],[119.277777,29.640758],[119.276969,29.63812],[119.274853,29.636228],[119.267508,29.633093],[119.263824,29.630745],[119.257382,29.628866],[119.254292,29.626629],[119.252913,29.623314],[119.251654,29.61747],[119.248849,29.614887],[119.251249,29.610826],[119.248231,29.605617],[119.246971,29.599483],[119.247304,29.59759],[119.243025,29.590087],[119.234967,29.582086],[119.237582,29.581202],[119.241955,29.577706],[119.243072,29.575246],[119.243667,29.56951],[119.24602,29.567893],[119.254078,29.566152],[119.255837,29.564784],[119.264371,29.564825],[119.274996,29.569856],[119.278229,29.572896],[119.282626,29.572896],[119.284457,29.571625],[119.285954,29.568474],[119.282531,29.565544],[119.279441,29.56148],[119.274449,29.560969],[119.268222,29.561895],[119.26613,29.559324],[119.267675,29.548832],[119.265702,29.546704],[119.249562,29.535851],[119.241575,29.533045],[119.230569,29.523961],[119.2295,29.522246],[119.230997,29.51955],[119.2295,29.517877],[119.226552,29.516964],[119.223795,29.519965],[119.216878,29.524279],[119.215499,29.526464],[119.210388,29.529409],[119.206276,29.529063],[119.202092,29.527252],[119.199145,29.524846],[119.199929,29.52226],[119.202401,29.51991],[119.204042,29.516632],[119.20542,29.510382],[119.206656,29.508142],[119.205919,29.504989],[119.201546,29.501739],[119.198646,29.495211],[119.193559,29.49149],[119.191705,29.483703],[119.192941,29.470796],[119.192608,29.465581],[119.190897,29.462606],[119.185929,29.460434],[119.179083,29.453931],[119.172023,29.454927],[119.167316,29.453668],[119.159139,29.452202],[119.156192,29.450721],[119.146303,29.447829],[119.141335,29.447373],[119.138459,29.449393],[119.132255,29.448549],[119.126883,29.450334],[119.122248,29.445975],[119.11728,29.445588],[119.114784,29.44639],[119.110719,29.443982],[119.106583,29.440025],[119.101948,29.436468],[119.099595,29.431085],[119.102399,29.426213],[119.102281,29.423002],[119.098881,29.417673],[119.096504,29.416358],[119.083597,29.414116],[119.078154,29.414462],[119.070428,29.413825],[119.067196,29.412552],[119.061633,29.408122],[119.059328,29.405603],[119.057878,29.402045],[119.057236,29.398086],[119.055405,29.395497],[119.052767,29.394459],[119.050865,29.391482],[119.04806,29.389987],[119.044637,29.386595],[119.039717,29.385889],[119.034725,29.382787],[119.030518,29.376404],[119.016874,29.372],[119.01124,29.368428],[119.007556,29.367444],[119.003206,29.368289],[118.99453,29.368372],[118.990607,29.365436],[118.98621,29.360146],[118.984308,29.358872],[118.98148,29.359218],[118.976036,29.364813],[118.972209,29.364689],[118.967431,29.362431],[118.962368,29.363899],[118.959611,29.362985],[118.958375,29.360922],[118.9574,29.355756],[118.95576,29.353637],[118.946704,29.349759],[118.94214,29.348374],[118.936102,29.345673],[118.92909,29.341808],[118.923195,29.342196],[118.919391,29.341614],[118.91314,29.336627],[118.908219,29.336156],[118.900446,29.332652],[118.893054,29.3288],[118.890629,29.324049],[118.886327,29.322372],[118.87834,29.326556],[118.873206,29.324492],[118.869545,29.322317],[118.863222,29.317495],[118.860679,29.314974],[118.857161,29.309182],[118.855734,29.303335],[118.849412,29.298346],[118.842684,29.297487],[118.838786,29.293191],[118.835078,29.290488],[118.828755,29.287453],[118.828636,29.285042],[118.826544,29.280288],[118.824476,29.279484],[118.819699,29.280343],[118.816894,29.281716],[118.812377,29.280801],[118.809525,29.278278],[118.80073,29.272942],[118.793622,29.267952],[118.786373,29.266732],[118.78478,29.259108],[118.781832,29.258068],[118.778267,29.252564],[118.77501,29.251011],[118.768188,29.251912],[118.766382,29.251164],[118.763886,29.248294],[118.762412,29.240322],[118.766691,29.235621],[118.767261,29.234137],[118.766239,29.229256],[118.767,29.223058],[118.765431,29.220589],[118.759298,29.218065],[118.757349,29.215985],[118.753023,29.213863],[118.743752,29.213655],[118.734173,29.207427],[118.73258,29.205416],[118.731701,29.201519],[118.72949,29.199674],[118.723333,29.198911],[118.718651,29.192807],[118.715442,29.189867],[118.708834,29.188757],[118.70137,29.192169],[118.693882,29.196955],[118.688748,29.20095],[118.684612,29.202531],[118.676577,29.200659],[118.670159,29.200506],[118.655374,29.196886],[118.651904,29.196414],[118.638307,29.192169],[118.628894,29.19235],[118.62685,29.195665],[118.628205,29.199063],[118.631984,29.202004],[118.633672,29.205624],[118.632317,29.214168],[118.631841,29.219618],[118.628109,29.220229],[118.624377,29.218883],[118.620123,29.219272],[118.618863,29.220714],[118.616486,29.226316],[118.613847,29.229464],[118.613063,29.231919],[118.607786,29.238228],[118.607596,29.239711],[118.614632,29.246325],[118.615464,29.250762],[118.611423,29.25768],[118.610091,29.262324],[118.606669,29.267134],[118.606669,29.268492],[118.609854,29.273108],[118.609497,29.277003],[118.610614,29.27947],[118.615511,29.278971],[118.619196,29.276809],[118.621145,29.278084],[118.623997,29.272346],[118.630582,29.265207],[118.634908,29.261852],[118.636928,29.263627],[118.636382,29.267078],[118.634147,29.27297],[118.629916,29.279886],[118.62452,29.284238],[118.619124,29.292928],[118.614394,29.296586],[118.617223,29.303127],[118.6138,29.307311],[118.604814,29.314614],[118.603483,29.316442],[118.60384,29.323564],[118.60094,29.327789],[118.596043,29.330823],[118.594593,29.330698],[118.589031,29.327872],[118.587533,29.328496],[118.587129,29.332056],[118.584253,29.333663],[118.579856,29.332153],[118.575149,29.336558],[118.571679,29.338317],[118.562266,29.338539],[118.551498,29.335713],[118.54237,29.33696],[118.541039,29.342528],[118.528559,29.345257],[118.523401,29.345368],[118.519099,29.344384],[118.518885,29.346448],[118.523995,29.355229],[118.524352,29.36142],[118.517482,29.363484],[118.509994,29.361642],[118.50574,29.359274],[118.502887,29.360991],[118.498989,29.361891],[118.494163,29.362057],[118.491596,29.365215],[118.488839,29.367237],[118.479164,29.366544],[118.473341,29.362764],[118.470132,29.360091],[118.464664,29.360312],[118.45625,29.365893],[118.448738,29.375241],[118.445957,29.37639],[118.441251,29.375919],[118.437685,29.377705],[118.430102,29.382455],[118.423637,29.387356],[118.422733,29.390471],[118.425847,29.395179],[118.4258,29.397643],[118.422139,29.400232],[118.418122,29.40163],[118.415293,29.403762],[118.409684,29.404495],[118.407021,29.405575],[118.405405,29.408136],[118.410825,29.413479],[118.413297,29.41813],[118.413154,29.420552],[118.40859,29.42339],[118.40203,29.425175],[118.395231,29.423473],[118.390263,29.423971],[118.386698,29.427652],[118.384154,29.433258],[118.378093,29.43388],[118.375169,29.435195],[118.372935,29.437824],[118.366374,29.450154],[118.363426,29.451067],[118.357341,29.451565],[118.35254,29.452797],[118.350686,29.454775],[118.350186,29.458746],[118.345741,29.465138],[118.345028,29.468251],[118.344957,29.475707],[118.347619,29.473978],[118.353609,29.47503],[118.35872,29.477063],[118.360479,29.479097],[118.362951,29.484159],[118.365708,29.48629],[118.371104,29.492154],[118.373505,29.496483],[118.379804,29.502555],[118.381444,29.504933],[118.383013,29.510133],[118.393044,29.507298],[118.402814,29.507464],[118.407473,29.508059],[118.41256,29.509677],[118.414984,29.509746],[118.420238,29.508031],[118.425491,29.504754],[118.430578,29.50373],[118.436544,29.505749],[118.439872,29.510036],[118.443105,29.50893],[118.448976,29.513397],[118.45045,29.512733],[118.45827,29.506358],[118.459815,29.50557],[118.464213,29.505888],[118.470393,29.507464],[118.479022,29.510935],[118.481969,29.512996],[118.489433,29.51684],[118.495162,29.518361],[118.496065,29.520642],[118.495162,29.525703],[118.4949,29.5314],[118.495875,29.533321],[118.497563,29.540331],[118.497848,29.544008],[118.494948,29.550602],[118.4949,29.553712],[118.498371,29.56137],[118.49868,29.567672],[118.499678,29.573615],[118.50177,29.576379],[118.50574,29.57725],[118.515462,29.583316],[118.521547,29.585956],[118.532172,29.588954],[118.535239,29.590612],[118.540896,29.599331],[118.542037,29.603821],[118.54855,29.611212],[118.549905,29.613395],[118.553447,29.612373],[118.555087,29.613409],[118.559746,29.620689],[118.567519,29.627292],[118.568065,29.633438],[118.569302,29.635496],[118.573865,29.638383],[118.584015,29.640523],[118.595544,29.644059],[118.602057,29.643672],[118.614228,29.650425],[118.620004,29.654112],[118.633482,29.648782],[118.636928,29.644832],[118.640945,29.641932],[118.642918,29.641656],[118.647316,29.643382],[118.653401,29.648685],[118.656872,29.654444],[118.659629,29.65646],[118.666712,29.663309],[118.672275,29.667009],[118.673915,29.669094],[118.674153,29.674009],[118.67508,29.675625],[118.681498,29.67978],[118.682353,29.68105],[118.682924,29.688326],[118.685467,29.69052],[118.691648,29.69393],[118.692884,29.699148],[118.700823,29.706463],[118.718698,29.709182],[118.72407,29.715958],[118.724641,29.72261],[118.726947,29.725825],[118.733626,29.730089],[118.737406,29.735029],[118.739711,29.736809],[118.744703,29.738768],[118.745559,29.740327],[118.74651,29.746287],[118.748673,29.750426],[118.749029,29.761145],[118.745535,29.76738],[118.747365,29.772428],[118.746628,29.775352],[118.744299,29.779641],[118.738356,29.784799],[118.736526,29.788454],[118.738618,29.807952],[118.739925,29.813288],[118.742278,29.816321],[118.74601,29.818168],[118.754972,29.816982],[118.759441,29.817162],[118.765906,29.82309],[118.765669,29.824524],[118.76013,29.828921],[118.753855,29.829541],[118.750955,29.831609],[118.75471,29.839232],[118.754164,29.843697],[118.755614,29.84542],[118.766952,29.848949],[118.770066,29.846826],[118.774178,29.845324],[118.778742,29.841906],[118.781975,29.842595],[118.786634,29.845227],[118.788916,29.851016],[118.798091,29.858816],[118.802608,29.860663],[118.807718,29.867649],[118.812972,29.87086],[118.81649,29.873946],[118.819057,29.874815],[118.823383,29.87881],[118.830134,29.882489],[118.84133,29.891306],[118.843968,29.89515],[118.845537,29.899103],[118.844848,29.905288],[118.844895,29.915261],[118.843112,29.920591],[118.8419,29.928151],[118.840141,29.929859],[118.838715,29.9345],[118.838976,29.938273],[118.841163,29.939925],[118.848294,29.941261],[118.857921,29.938011],[118.863911,29.936978],[118.867239,29.939484],[118.868951,29.943904],[118.87197,29.946892],[118.876248,29.945736],[118.880337,29.942982],[118.883688,29.939429],[118.887634,29.939223],[118.893553,29.937598],[118.89467,29.938066],[118.894005,29.943106],[118.892365,29.9482],[118.893006,29.957081],[118.891533,29.959889],[118.893173,29.969291],[118.896453,29.975761],[118.898093,29.977495],[118.899472,29.981446],[118.897214,29.987116],[118.893197,29.990956],[118.892079,29.994796],[118.893981,29.997411],[118.895098,30.001195],[118.894028,30.006713],[118.889845,30.010593],[118.890344,30.012024],[118.897404,30.01673]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":330182,\"name\":\"建德市\",\"center\":[119.279089,29.472284],\"centroid\":[119.372981,29.48107],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":330100},\"subFeatureIndex\":12,\"acroutes\":[100000,330000,330100]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[119.765307,29.596402],[119.766829,29.589341],[119.765236,29.587572],[119.765616,29.584712],[119.768421,29.582459],[119.769182,29.579544],[119.766187,29.570906],[119.761647,29.566525],[119.764832,29.563111],[119.765521,29.560015],[119.76419,29.557334],[119.758842,29.556034],[119.756417,29.553726],[119.750665,29.550726],[119.747266,29.550588],[119.741109,29.551901],[119.730412,29.548197],[119.724803,29.545128],[119.72264,29.542764],[119.724755,29.538188],[119.731862,29.532962],[119.734311,29.528385],[119.744033,29.520781],[119.745602,29.518389],[119.744936,29.516425],[119.740348,29.513341],[119.735404,29.510935],[119.726894,29.511557],[119.727536,29.509442],[119.72554,29.506925],[119.718836,29.505293],[119.717862,29.502652],[119.718337,29.496691],[119.719549,29.491158],[119.718741,29.48853],[119.716673,29.486331],[119.712632,29.484132],[119.706785,29.472374],[119.708449,29.467725],[119.707118,29.464225],[119.709518,29.458885],[119.71344,29.456187],[119.715817,29.449005],[119.71344,29.445006],[119.710659,29.442266],[119.709518,29.439111],[119.710636,29.436122],[119.709637,29.434185],[119.70726,29.433216],[119.700509,29.433008],[119.697372,29.434116],[119.693663,29.438765],[119.691168,29.438779],[119.689836,29.433327],[119.690312,29.42685],[119.688909,29.421756],[119.683442,29.418628],[119.678973,29.41777],[119.676311,29.41921],[119.673387,29.425023],[119.67006,29.425424],[119.664402,29.424068],[119.6601,29.426891],[119.655488,29.425922],[119.649094,29.428344],[119.646741,29.43323],[119.644459,29.434102],[119.642486,29.432953],[119.638659,29.428275],[119.633596,29.423348],[119.626631,29.42022],[119.62492,29.41777],[119.625633,29.415293],[119.625538,29.410476],[119.617361,29.399733],[119.612155,29.394763],[119.607068,29.393877],[119.605547,29.392742],[119.606236,29.388076],[119.613866,29.383244],[119.617598,29.38035],[119.618573,29.378467],[119.619643,29.372956],[119.619381,29.371059],[119.616291,29.368261],[119.614057,29.368275],[119.608518,29.370242],[119.604596,29.369632],[119.597988,29.372928],[119.592925,29.377705],[119.589454,29.378702],[119.582085,29.379132],[119.578425,29.378121],[119.574598,29.372762],[119.565898,29.371183],[119.560573,29.372083],[119.55677,29.371585],[119.551469,29.36732],[119.545408,29.367361],[119.540915,29.369799],[119.538847,29.371931],[119.536042,29.37315],[119.529838,29.370546],[119.523872,29.36599],[119.525773,29.36347],[119.526605,29.360021],[119.52506,29.35516],[119.522707,29.350022],[119.512082,29.336724],[119.510418,29.333469],[119.501979,29.335879],[119.50003,29.335713],[119.492329,29.331059],[119.485364,29.332541],[119.480206,29.33297],[119.477543,29.335048],[119.47771,29.341586],[119.476022,29.345216],[119.471482,29.349025],[119.469652,29.349662],[119.464565,29.349177],[119.461427,29.350908],[119.459834,29.356656],[119.454819,29.365284],[119.457576,29.370366],[119.453369,29.378827],[119.451824,29.385598],[119.453607,29.389253],[119.451348,29.397283],[119.448876,29.400688],[119.443148,29.404565],[119.440676,29.408745],[119.441674,29.413036],[119.438798,29.415749],[119.439416,29.421424],[119.438964,29.423597],[119.437134,29.424123],[119.427768,29.422158],[119.428553,29.419057],[119.432332,29.415154],[119.426746,29.405548],[119.421255,29.404758],[119.415883,29.403],[119.410725,29.402557],[119.409204,29.400716],[119.405614,29.399927],[119.404758,29.400688],[119.404901,29.405326],[119.403974,29.407223],[119.399933,29.411237],[119.393515,29.411251],[119.391709,29.416884],[119.389783,29.425826],[119.388547,29.429715],[119.382129,29.43186],[119.378112,29.429798],[119.375283,29.424538],[119.372455,29.421037],[119.370814,29.417715],[119.368319,29.415708],[119.362162,29.416746],[119.360237,29.416289],[119.355578,29.410794],[119.353201,29.409866],[119.346378,29.408731],[119.343906,29.409008],[119.338392,29.411707],[119.334897,29.40815],[119.334042,29.405354],[119.331094,29.400356],[119.32779,29.396923],[119.328646,29.39342],[119.333875,29.390734],[119.336038,29.385847],[119.339105,29.384296],[119.340151,29.382358],[119.339295,29.379145],[119.340198,29.377304],[119.336466,29.372499],[119.335016,29.366987],[119.336704,29.363373],[119.332806,29.353748],[119.334303,29.348983],[119.340008,29.348581],[119.34557,29.342265],[119.348447,29.336253],[119.348233,29.333441],[119.344287,29.324395],[119.347092,29.322719],[119.348779,29.319504],[119.347282,29.317163],[119.340531,29.315389],[119.324201,29.30799],[119.323131,29.305011],[119.328646,29.299274],[119.329026,29.294383],[119.328337,29.292789],[119.32577,29.292248],[119.324177,29.295408],[119.322632,29.29617],[119.322608,29.290488],[119.323345,29.288146],[119.322727,29.284931],[119.318306,29.2799],[119.312672,29.278639],[119.305066,29.279332],[119.298648,29.279276],[119.292562,29.281799],[119.288117,29.280995],[119.286026,29.279332],[119.286216,29.275257],[119.288094,29.268839],[119.287167,29.267453],[119.282317,29.264944],[119.282056,29.26127],[119.278657,29.260646],[119.275781,29.258636],[119.273475,29.25377],[119.270646,29.251649],[119.260924,29.247809],[119.257644,29.247989],[119.249205,29.250193],[119.244237,29.250997],[119.238746,29.250152],[119.237772,29.25072],[119.239293,29.258913],[119.236298,29.26346],[119.234016,29.270682],[119.231544,29.273274],[119.228786,29.27437],[119.227099,29.276837],[119.229,29.282575],[119.228739,29.284183],[119.225031,29.285153],[119.219397,29.2827],[119.214833,29.283753],[119.208178,29.284404],[119.205111,29.288257],[119.200286,29.290391],[119.198836,29.286026],[119.200737,29.280524],[119.200999,29.275811],[119.204255,29.274771],[119.203328,29.272318],[119.200405,29.272152],[119.19779,29.26992],[119.192299,29.263571],[119.191515,29.261741],[119.192228,29.258456],[119.195484,29.256446],[119.198622,29.257985],[119.200904,29.257472],[119.204303,29.252356],[119.210293,29.248724],[119.214786,29.246935],[119.212195,29.246076],[119.211268,29.244426],[119.211648,29.235413],[119.210269,29.230657],[119.213645,29.225207],[119.211838,29.222905],[119.209033,29.222059],[119.204469,29.223557],[119.203233,29.228383],[119.201736,29.229367],[119.196102,29.227883],[119.194153,29.22927],[119.190825,29.22848],[119.189518,29.227093],[119.189779,29.223709],[119.193963,29.220145],[119.194938,29.216304],[119.189518,29.205194],[119.181032,29.206304],[119.177704,29.207233],[119.175826,29.211893],[119.168053,29.219022],[119.165652,29.219202],[119.160257,29.220991],[119.156453,29.223806],[119.15372,29.227024],[119.151771,29.227897],[119.145709,29.222974],[119.141525,29.223377],[119.138126,29.220242],[119.131542,29.221116],[119.130163,29.2226],[119.129117,29.227079],[119.132588,29.235441],[119.126455,29.237119],[119.123508,29.236716],[119.106393,29.227509],[119.10045,29.228313],[119.094222,29.228258],[119.091893,29.230546],[119.08519,29.230601],[119.082908,29.228826],[119.081981,29.22658],[119.07775,29.224222],[119.075658,29.223987],[119.068384,29.226455],[119.062941,29.226275],[119.055144,29.222239],[119.050033,29.221546],[119.045588,29.221823],[119.037126,29.217205],[119.030589,29.215069],[119.01307,29.212379],[119.003253,29.207691],[119.001851,29.208551],[118.998903,29.216345],[118.995742,29.21708],[118.993127,29.219244],[118.991867,29.221837],[118.987137,29.226053],[118.985711,29.229728],[118.98583,29.235344],[118.984831,29.239476],[118.988254,29.243552],[118.982597,29.249736],[118.981408,29.254325],[118.979245,29.258955],[118.977344,29.258775],[118.970189,29.264944],[118.966837,29.269352],[118.963295,29.267674],[118.959492,29.271403],[118.958565,29.273801],[118.954881,29.277918],[118.952337,29.278763],[118.949651,29.281743],[118.949176,29.283919],[118.951268,29.286275],[118.961893,29.290211],[118.963533,29.291999],[118.962083,29.29617],[118.952622,29.298554],[118.948035,29.301117],[118.944113,29.306286],[118.927069,29.310374],[118.923456,29.31478],[118.916753,29.31816],[118.911262,29.324409],[118.908362,29.325143],[118.905414,29.327374],[118.903917,29.330186],[118.900446,29.332652],[118.908219,29.336156],[118.91314,29.336627],[118.919391,29.341614],[118.923195,29.342196],[118.92909,29.341808],[118.936102,29.345673],[118.94214,29.348374],[118.946704,29.349759],[118.95576,29.353637],[118.9574,29.355756],[118.958375,29.360922],[118.959611,29.362985],[118.962368,29.363899],[118.967431,29.362431],[118.972209,29.364689],[118.976036,29.364813],[118.98148,29.359218],[118.984308,29.358872],[118.98621,29.360146],[118.990607,29.365436],[118.99453,29.368372],[119.003206,29.368289],[119.007556,29.367444],[119.01124,29.368428],[119.016874,29.372],[119.030518,29.376404],[119.034725,29.382787],[119.039717,29.385889],[119.044637,29.386595],[119.04806,29.389987],[119.050865,29.391482],[119.052767,29.394459],[119.055405,29.395497],[119.057236,29.398086],[119.057878,29.402045],[119.059328,29.405603],[119.061633,29.408122],[119.067196,29.412552],[119.070428,29.413825],[119.078154,29.414462],[119.083597,29.414116],[119.096504,29.416358],[119.098881,29.417673],[119.102281,29.423002],[119.102399,29.426213],[119.099595,29.431085],[119.101948,29.436468],[119.106583,29.440025],[119.110719,29.443982],[119.114784,29.44639],[119.11728,29.445588],[119.122248,29.445975],[119.126883,29.450334],[119.132255,29.448549],[119.138459,29.449393],[119.141335,29.447373],[119.146303,29.447829],[119.156192,29.450721],[119.159139,29.452202],[119.167316,29.453668],[119.172023,29.454927],[119.179083,29.453931],[119.185929,29.460434],[119.190897,29.462606],[119.192608,29.465581],[119.192941,29.470796],[119.191705,29.483703],[119.193559,29.49149],[119.198646,29.495211],[119.201546,29.501739],[119.205919,29.504989],[119.206656,29.508142],[119.20542,29.510382],[119.204042,29.516632],[119.202401,29.51991],[119.199929,29.52226],[119.199145,29.524846],[119.202092,29.527252],[119.206276,29.529063],[119.210388,29.529409],[119.215499,29.526464],[119.216878,29.524279],[119.223795,29.519965],[119.226552,29.516964],[119.2295,29.517877],[119.230997,29.51955],[119.2295,29.522246],[119.230569,29.523961],[119.241575,29.533045],[119.249562,29.535851],[119.265702,29.546704],[119.267675,29.548832],[119.26613,29.559324],[119.268222,29.561895],[119.274449,29.560969],[119.279441,29.56148],[119.282531,29.565544],[119.285954,29.568474],[119.284457,29.571625],[119.282626,29.572896],[119.278229,29.572896],[119.274996,29.569856],[119.264371,29.564825],[119.255837,29.564784],[119.254078,29.566152],[119.24602,29.567893],[119.243667,29.56951],[119.243072,29.575246],[119.241955,29.577706],[119.237582,29.581202],[119.234967,29.582086],[119.243025,29.590087],[119.247304,29.59759],[119.246971,29.599483],[119.248231,29.605617],[119.251249,29.610826],[119.248849,29.614887],[119.251654,29.61747],[119.252913,29.623314],[119.254292,29.626629],[119.257382,29.628866],[119.263824,29.630745],[119.267508,29.633093],[119.274853,29.636228],[119.276969,29.63812],[119.277777,29.640758],[119.286572,29.647401],[119.293085,29.65066],[119.299194,29.649113],[119.303259,29.649735],[119.305517,29.651392],[119.306706,29.654154],[119.30673,29.661776],[119.309035,29.668017],[119.314621,29.669453],[119.315548,29.670309],[119.31852,29.676964],[119.320588,29.6792],[119.321657,29.688422],[119.323297,29.693171],[119.329763,29.699769],[119.330619,29.702115],[119.332924,29.702791],[119.33504,29.701715],[119.336942,29.702336],[119.345642,29.711224],[119.34828,29.715116],[119.350015,29.719643],[119.352915,29.722334],[119.354508,29.725825],[119.354056,29.730185],[119.355768,29.73231],[119.358074,29.737968],[119.360332,29.741638],[119.36423,29.746397],[119.365823,29.750398],[119.370624,29.752688],[119.373857,29.754978],[119.373405,29.758758],[119.374142,29.760662],[119.380489,29.766993],[119.383579,29.770952],[119.388357,29.769628],[119.390924,29.764979],[119.391495,29.7624],[119.394323,29.759807],[119.392374,29.750357],[119.393563,29.748301],[119.398792,29.744328],[119.407088,29.7431],[119.411343,29.745266],[119.415431,29.750233],[119.417547,29.757048],[119.42261,29.758469],[119.425439,29.75582],[119.425938,29.753171],[119.434519,29.748384],[119.439867,29.742231],[119.44203,29.741651],[119.447094,29.743183],[119.451206,29.741555],[119.454938,29.741983],[119.458955,29.744935],[119.465753,29.741693],[119.472932,29.739361],[119.476379,29.733373],[119.478019,29.732338],[119.484556,29.731262],[119.492376,29.722334],[119.493802,29.721285],[119.50022,29.722679],[119.504879,29.722872],[119.50835,29.725273],[119.520187,29.728792],[119.522969,29.731013],[119.528269,29.733897],[119.531954,29.733925],[119.537064,29.736933],[119.540511,29.737319],[119.543696,29.746122],[119.544695,29.747432],[119.549472,29.749916],[119.560431,29.752316],[119.569131,29.751695],[119.571698,29.749847],[119.574099,29.745197],[119.577212,29.741569],[119.578306,29.738299],[119.581895,29.73111],[119.583726,29.729385],[119.59176,29.724818],[119.593448,29.723203],[119.596229,29.717352],[119.601815,29.716055],[119.603978,29.713419],[119.604144,29.708837],[119.602528,29.700859],[119.610895,29.695227],[119.610776,29.688229],[119.614128,29.684999],[119.612749,29.673029],[119.613581,29.669757],[119.616909,29.664648],[119.617479,29.662757],[119.616148,29.656805],[119.621972,29.65472],[119.62946,29.656239],[119.634689,29.653243],[119.636733,29.652939],[119.643579,29.653961],[119.64705,29.65229],[119.651043,29.651641],[119.658792,29.652013],[119.665305,29.653836],[119.667968,29.657316],[119.670844,29.657137],[119.674505,29.653809],[119.672104,29.648658],[119.670226,29.640979],[119.673031,29.636905],[119.676192,29.636325],[119.678593,29.634018],[119.679663,29.62685],[119.688363,29.62109],[119.693307,29.620965],[119.694876,29.619985],[119.695375,29.616034],[119.692998,29.602633],[119.695256,29.596719],[119.698322,29.593721],[119.701318,29.58959],[119.704075,29.587641],[119.708282,29.589673],[119.709376,29.595863],[119.715247,29.601804],[119.717315,29.608781],[119.718575,29.610439],[119.723899,29.610535],[119.728368,29.613506],[119.731126,29.613547],[119.742393,29.609195],[119.746434,29.606419],[119.750142,29.602978],[119.757843,29.598447],[119.762312,29.597811],[119.765307,29.596402]]]]}}]}', 'admin', '2020-12-07 18:37:35', NULL, '2020-12-07 18:37:35', '0', NULL); +INSERT INTO `jimu_report_map` VALUES ('1335907956524433409', '上海', 'shanghai', '{\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"properties\":{\"adcode\":310101,\"name\":\"黄浦区\",\"center\":[121.490317,31.222771],\"centroid\":[121.483572,31.215946],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":310000},\"subFeatureIndex\":0,\"acroutes\":[100000,310000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[121.475987,31.187885],[121.474944,31.189886],[121.470356,31.191431],[121.469605,31.196404],[121.46745,31.203065],[121.466449,31.204395],[121.462264,31.203173],[121.461555,31.210194],[121.460707,31.213488],[121.457689,31.220196],[121.456758,31.223898],[121.467464,31.223862],[121.467658,31.225634],[121.466129,31.234917],[121.462973,31.241396],[121.469563,31.239216],[121.474847,31.24142],[121.47892,31.240294],[121.482994,31.241923],[121.485969,31.244091],[121.487805,31.244186],[121.494826,31.24221],[121.493491,31.240163],[121.493491,31.23615],[121.495744,31.232977],[121.502014,31.228018],[121.506741,31.223119],[121.509397,31.218459],[121.509911,31.214506],[121.508368,31.210158],[121.501319,31.199747],[121.498066,31.195601],[121.494631,31.192857],[121.490752,31.191467],[121.475987,31.187885]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":310104,\"name\":\"徐汇区\",\"center\":[121.43752,31.179973],\"centroid\":[121.439404,31.162992],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":310000},\"subFeatureIndex\":1,\"acroutes\":[100000,310000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[121.412572,31.19112],[121.419719,31.190796],[121.422027,31.192294],[121.421638,31.19535],[121.423793,31.197314],[121.433025,31.20128],[121.437933,31.203976],[121.435235,31.21114],[121.43746,31.211535],[121.439462,31.214482],[121.44697,31.215812],[121.452184,31.217429],[121.457689,31.220196],[121.460707,31.213488],[121.461555,31.210194],[121.462264,31.203173],[121.466449,31.204395],[121.46745,31.203065],[121.469605,31.196404],[121.470356,31.191431],[121.474944,31.189886],[121.475987,31.187885],[121.468729,31.184122],[121.466254,31.18109],[121.464905,31.178022],[121.464905,31.17541],[121.468159,31.167092],[121.469369,31.162298],[121.468354,31.158091],[121.46574,31.155118],[121.460387,31.150276],[121.457453,31.146451],[121.457453,31.142232],[121.462431,31.134463],[121.468729,31.127868],[121.469674,31.124859],[121.469299,31.118731],[121.465211,31.1121],[121.463237,31.108586],[121.462862,31.101954],[121.455423,31.100755],[121.452629,31.101234],[121.451878,31.103849],[121.446275,31.105744],[121.447623,31.107423],[121.452364,31.108586],[121.450154,31.112819],[121.450807,31.115398],[121.446706,31.114282],[121.445788,31.114954],[121.441547,31.112568],[121.438002,31.1121],[121.435736,31.113539],[121.438836,31.119103],[121.43853,31.121729],[121.436445,31.129043],[121.421526,31.127137],[121.418398,31.131669],[121.41381,31.13728],[121.411293,31.14174],[121.404953,31.156689],[121.400977,31.155214],[121.401449,31.153776],[121.396931,31.152685],[121.395874,31.15585],[121.401867,31.157528],[121.404578,31.157588],[121.402645,31.162226],[121.394567,31.159601],[121.391508,31.168686],[121.394053,31.169489],[121.39269,31.173085],[121.395415,31.174595],[121.394442,31.177879],[121.398071,31.178226],[121.398349,31.179904],[121.400101,31.178813],[121.41146,31.182037],[121.415158,31.183391],[121.415256,31.187357],[121.41356,31.18683],[121.412572,31.19112]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":310105,\"name\":\"长宁区\",\"center\":[121.4222,31.218123],\"centroid\":[121.380949,31.20737],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":310000},\"subFeatureIndex\":2,\"acroutes\":[100000,310000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[121.439462,31.214482],[121.43746,31.211535],[121.435235,31.21114],[121.437933,31.203976],[121.433025,31.20128],[121.423793,31.197314],[121.421638,31.19535],[121.422027,31.192294],[121.419719,31.190796],[121.412572,31.19112],[121.391425,31.191911],[121.38001,31.190065],[121.365954,31.185572],[121.360253,31.185296],[121.358321,31.186015],[121.356958,31.182768],[121.353301,31.181629],[121.351424,31.183499],[121.341414,31.179436],[121.338341,31.180108],[121.331806,31.189622],[121.338049,31.192618],[121.33734,31.195817],[121.338925,31.196644],[121.338438,31.20666],[121.338508,31.212182],[121.339996,31.212278],[121.33937,31.216615],[121.342457,31.217789],[121.343096,31.223071],[121.345627,31.223526],[121.340997,31.224269],[121.341581,31.226293],[121.345362,31.227886],[121.345376,31.23039],[121.343513,31.234306],[121.338355,31.237528],[121.340872,31.239947],[121.345585,31.239887],[121.344612,31.243552],[121.346822,31.241037],[121.347281,31.243192],[121.348922,31.243863],[121.350131,31.241839],[121.348741,31.239372],[121.352856,31.238342],[121.354177,31.237121],[121.359071,31.229827],[121.362102,31.22597],[121.366065,31.226006],[121.366691,31.224065],[121.371404,31.222508],[121.373197,31.220089],[121.37691,31.220687],[121.388658,31.218639],[121.399712,31.218711],[121.400462,31.220807],[121.403799,31.22058],[121.408707,31.222364],[121.414157,31.223359],[121.415965,31.224473],[121.414853,31.228054],[121.415617,31.228581],[121.419941,31.225191],[121.423334,31.228114],[121.427519,31.229288],[121.427713,31.224221],[121.429034,31.223095],[121.434304,31.225886],[121.435416,31.225071],[121.436167,31.220675],[121.439462,31.214482]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":310106,\"name\":\"静安区\",\"center\":[121.448224,31.229003],\"centroid\":[121.450659,31.270821],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":310000},\"subFeatureIndex\":3,\"acroutes\":[100000,310000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[121.482994,31.241923],[121.47892,31.240294],[121.474847,31.24142],[121.469563,31.239216],[121.462973,31.241396],[121.466129,31.234917],[121.467658,31.225634],[121.467464,31.223862],[121.456758,31.223898],[121.457689,31.220196],[121.452184,31.217429],[121.44697,31.215812],[121.439462,31.214482],[121.436167,31.220675],[121.435416,31.225071],[121.434304,31.225886],[121.429034,31.223095],[121.427713,31.224221],[121.427519,31.229288],[121.427908,31.231144],[121.431009,31.235108],[121.435166,31.235252],[121.445774,31.241348],[121.449987,31.2433],[121.448318,31.245216],[121.450404,31.247743],[121.451461,31.251994],[121.44932,31.252928],[121.451044,31.256269],[121.442952,31.267117],[121.437098,31.269439],[121.432413,31.271942],[121.429841,31.274923],[121.425252,31.270661],[121.424571,31.27193],[121.424432,31.280238],[121.422833,31.28426],[121.423806,31.291011],[121.419691,31.291071],[121.418648,31.292256],[121.420039,31.296912],[121.42364,31.297259],[121.426935,31.298528],[121.426434,31.303207],[121.431287,31.303638],[121.432441,31.305912],[121.431676,31.309478],[121.432163,31.31168],[121.434623,31.312303],[121.432468,31.318669],[121.433595,31.32087],[121.436459,31.32087],[121.436765,31.319662],[121.44672,31.319817],[121.447887,31.317101],[121.4547,31.319243],[121.457133,31.321002],[121.465378,31.321397],[121.468145,31.32032],[121.468312,31.316036],[121.467672,31.306307],[121.463529,31.306008],[121.46453,31.297989],[121.462445,31.292747],[121.460081,31.289778],[121.461805,31.284691],[121.461457,31.278921],[121.462834,31.275389],[121.464627,31.274396],[121.469605,31.267799],[121.474124,31.263453],[121.480491,31.258568],[121.480589,31.255239],[121.479629,31.253383],[121.481673,31.250689],[121.479588,31.249815],[121.481228,31.247959],[121.482994,31.241923]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":310107,\"name\":\"普陀区\",\"center\":[121.392499,31.241701],\"centroid\":[121.392058,31.257885],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":310000},\"subFeatureIndex\":4,\"acroutes\":[100000,310000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[121.354177,31.237121],[121.356054,31.237803],[121.356068,31.240151],[121.360086,31.240498],[121.36067,31.238642],[121.363117,31.240091],[121.366718,31.246342],[121.368387,31.247384],[121.372349,31.243755],[121.3731,31.245683],[121.375686,31.244486],[121.377216,31.247719],[121.380886,31.257766],[121.377508,31.259478],[121.375158,31.25949],[121.374574,31.257059],[121.365884,31.257682],[121.366023,31.259358],[121.361783,31.259945],[121.358918,31.263609],[121.35985,31.266997],[121.362227,31.26756],[121.366996,31.266662],[121.367441,31.269631],[121.361268,31.27084],[121.358918,31.268793],[121.35732,31.271415],[121.344723,31.273917],[121.343541,31.271439],[121.338272,31.272839],[121.338883,31.275006],[121.336228,31.275461],[121.336061,31.280046],[121.335004,31.279711],[121.332738,31.286067],[121.328998,31.284595],[121.327316,31.285182],[121.326384,31.288928],[121.33353,31.291107],[121.332891,31.292998],[121.336506,31.294901],[121.338675,31.293225],[121.341011,31.293716],[121.340927,31.297439],[121.34685,31.297654],[121.346892,31.296349],[121.349659,31.297582],[121.348894,31.299246],[121.352954,31.301663],[121.354803,31.299808],[121.360309,31.302717],[121.363534,31.302741],[121.360295,31.294674],[121.358585,31.293465],[121.363785,31.292028],[121.363785,31.291334],[121.369666,31.28912],[121.370153,31.290329],[121.374838,31.289096],[121.376242,31.290592],[121.38154,31.289431],[121.381623,31.292711],[121.384765,31.294446],[121.388394,31.29526],[121.394762,31.294674],[121.393483,31.291274],[121.39789,31.29052],[121.399559,31.288904],[121.398446,31.287145],[121.400379,31.286115],[121.404453,31.286223],[121.400087,31.278071],[121.404564,31.276227],[121.406496,31.276862],[121.40544,31.273067],[121.41096,31.273175],[121.410598,31.270373],[121.41527,31.26914],[121.41577,31.265896],[121.419496,31.265237],[121.425252,31.270661],[121.429841,31.274923],[121.432413,31.271942],[121.437098,31.269439],[121.442952,31.267117],[121.451044,31.256269],[121.44932,31.252928],[121.451461,31.251994],[121.450404,31.247743],[121.448318,31.245216],[121.449987,31.2433],[121.445774,31.241348],[121.435166,31.235252],[121.431009,31.235108],[121.427908,31.231144],[121.427519,31.229288],[121.423334,31.228114],[121.419941,31.225191],[121.415617,31.228581],[121.414853,31.228054],[121.415965,31.224473],[121.414157,31.223359],[121.408707,31.222364],[121.403799,31.22058],[121.400462,31.220807],[121.399712,31.218711],[121.388658,31.218639],[121.37691,31.220687],[121.373197,31.220089],[121.371404,31.222508],[121.366691,31.224065],[121.366065,31.226006],[121.362102,31.22597],[121.359071,31.229827],[121.354177,31.237121]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":310109,\"name\":\"虹口区\",\"center\":[121.491832,31.26097],\"centroid\":[121.485443,31.276649],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":310000},\"subFeatureIndex\":5,\"acroutes\":[100000,310000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[121.485413,31.311573],[121.485664,31.303483],[121.490168,31.292603],[121.493644,31.293884],[121.500652,31.295488],[121.502709,31.289658],[121.498149,31.286259],[121.496049,31.282991],[121.496564,31.276407],[121.499915,31.275904],[121.506505,31.270589],[121.50631,31.266746],[121.508479,31.262639],[121.514569,31.256317],[121.517642,31.251862],[121.516001,31.251599],[121.516488,31.246953],[121.50688,31.246474],[121.500012,31.244989],[121.494826,31.24221],[121.487805,31.244186],[121.485969,31.244091],[121.482994,31.241923],[121.481228,31.247959],[121.479588,31.249815],[121.481673,31.250689],[121.479629,31.253383],[121.480589,31.255239],[121.480491,31.258568],[121.474124,31.263453],[121.469605,31.267799],[121.464627,31.274396],[121.462834,31.275389],[121.461457,31.278921],[121.461805,31.284691],[121.460081,31.289778],[121.462445,31.292747],[121.46453,31.297989],[121.463529,31.306008],[121.467672,31.306307],[121.468312,31.316036],[121.472956,31.315797],[121.479171,31.314696],[121.485372,31.314636],[121.485413,31.311573]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":310110,\"name\":\"杨浦区\",\"center\":[121.522797,31.270755],\"centroid\":[121.529302,31.29835],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":310000},\"subFeatureIndex\":6,\"acroutes\":[100000,310000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[121.516488,31.246953],[121.516001,31.251599],[121.517642,31.251862],[121.514569,31.256317],[121.508479,31.262639],[121.50631,31.266746],[121.506505,31.270589],[121.499915,31.275904],[121.496564,31.276407],[121.496049,31.282991],[121.498149,31.286259],[121.502709,31.289658],[121.500652,31.295488],[121.493644,31.293884],[121.490168,31.292603],[121.485664,31.303483],[121.485413,31.311573],[121.496717,31.311489],[121.496216,31.323347],[121.498928,31.325322],[121.497593,31.328109],[121.493575,31.330299],[121.50556,31.345732],[121.517628,31.340779],[121.520256,31.344033],[121.522883,31.342885],[121.525483,31.346797],[121.549398,31.337789],[121.555779,31.333948],[121.558574,31.331256],[121.560493,31.32781],[121.561883,31.321158],[121.561758,31.303339],[121.562523,31.29976],[121.565456,31.294135],[121.569141,31.285254],[121.56953,31.279567],[121.568515,31.275701],[121.563537,31.268805],[121.559074,31.264219],[121.541542,31.251826],[121.536384,31.249623],[121.527555,31.247252],[121.516488,31.246953]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":310112,\"name\":\"闵行区\",\"center\":[121.375972,31.111658],\"centroid\":[121.418901,31.087213],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":310000},\"subFeatureIndex\":7,\"acroutes\":[100000,310000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[121.35871,30.97786],[121.351258,30.975986],[121.34375,30.976599],[121.334406,30.980694],[121.329554,30.981318],[121.327371,30.980658],[121.3258,30.9833],[121.326898,30.989964],[121.326773,30.994479],[121.327482,30.995896],[121.330347,30.996905],[121.33823,31.006197],[121.339829,31.010267],[121.34425,31.013941],[121.34279,31.014817],[121.339898,31.013857],[121.333072,31.01334],[121.333725,31.015657],[121.333892,31.026917],[121.333308,31.030686],[121.334017,31.031922],[121.33367,31.040695],[121.335102,31.04564],[121.335338,31.060435],[121.341456,31.062763],[121.343444,31.059139],[121.35344,31.061287],[121.358195,31.064047],[121.357278,31.066758],[121.363743,31.068354],[121.364424,31.069878],[121.362116,31.072601],[121.364341,31.073705],[121.365481,31.077892],[121.368804,31.079127],[121.370625,31.078372],[121.372016,31.079871],[121.368289,31.088976],[121.362756,31.099771],[121.359085,31.098931],[121.35839,31.100791],[121.351341,31.099255],[121.348532,31.106655],[121.351675,31.107735],[121.352217,31.106487],[121.357014,31.110529],[121.356026,31.112532],[121.353774,31.111512],[121.35066,31.115554],[121.353065,31.117604],[121.349589,31.117748],[121.346753,31.121657],[121.347545,31.121969],[121.34489,31.12577],[121.346002,31.126202],[121.344014,31.129451],[121.344681,31.130338],[121.342095,31.134655],[121.33677,31.138971],[121.338814,31.14017],[121.336728,31.14355],[121.335477,31.143862],[121.333711,31.148765],[121.331292,31.149772],[121.331528,31.15205],[121.328775,31.156665],[121.327218,31.156856],[121.323854,31.162933],[121.318584,31.170256],[121.318042,31.173624],[121.316304,31.176836],[121.310784,31.18423],[121.30856,31.188388],[121.300565,31.197027],[121.297506,31.201412],[121.294837,31.203077],[121.292431,31.202514],[121.292126,31.200621],[121.287329,31.196332],[121.284034,31.194391],[121.277388,31.193576],[121.271701,31.198309],[121.266724,31.203257],[121.264777,31.203317],[121.263053,31.205701],[121.26468,31.206731],[121.263846,31.208912],[121.259397,31.212769],[121.261218,31.215081],[121.259675,31.218148],[121.25745,31.220208],[121.258215,31.222772],[121.256588,31.226329],[121.258006,31.226868],[121.257158,31.230701],[121.254155,31.23312],[121.252792,31.236965],[121.251082,31.238198],[121.249692,31.236534],[121.247912,31.240917],[121.241391,31.240222],[121.239932,31.241061],[121.241683,31.247348],[121.24591,31.248821],[121.247314,31.253287],[121.254183,31.258688],[121.254405,31.259634],[121.260217,31.258328],[121.263985,31.259155],[121.264444,31.256496],[121.271284,31.252258],[121.275302,31.253527],[121.280363,31.251886],[121.284228,31.251838],[121.28142,31.248174],[121.283742,31.245192],[121.287301,31.243276],[121.288538,31.238198],[121.29264,31.232761],[121.296922,31.231048],[121.302998,31.230605],[121.315386,31.227204],[121.322853,31.229623],[121.32612,31.229575],[121.333878,31.232006],[121.334935,31.235887],[121.338355,31.237528],[121.343513,31.234306],[121.345376,31.23039],[121.345362,31.227886],[121.341581,31.226293],[121.340997,31.224269],[121.345627,31.223526],[121.343096,31.223071],[121.342457,31.217789],[121.33937,31.216615],[121.339996,31.212278],[121.338508,31.212182],[121.338438,31.20666],[121.338925,31.196644],[121.33734,31.195817],[121.338049,31.192618],[121.331806,31.189622],[121.338341,31.180108],[121.341414,31.179436],[121.351424,31.183499],[121.353301,31.181629],[121.356958,31.182768],[121.358321,31.186015],[121.360253,31.185296],[121.365954,31.185572],[121.38001,31.190065],[121.391425,31.191911],[121.412572,31.19112],[121.41356,31.18683],[121.415256,31.187357],[121.415158,31.183391],[121.41146,31.182037],[121.400101,31.178813],[121.398349,31.179904],[121.398071,31.178226],[121.394442,31.177879],[121.395415,31.174595],[121.39269,31.173085],[121.394053,31.169489],[121.391508,31.168686],[121.394567,31.159601],[121.402645,31.162226],[121.404578,31.157588],[121.401867,31.157528],[121.395874,31.15585],[121.396931,31.152685],[121.401449,31.153776],[121.400977,31.155214],[121.404953,31.156689],[121.411293,31.14174],[121.41381,31.13728],[121.418398,31.131669],[121.421526,31.127137],[121.436445,31.129043],[121.43853,31.121729],[121.438836,31.119103],[121.435736,31.113539],[121.438002,31.1121],[121.441547,31.112568],[121.445788,31.114954],[121.446706,31.114282],[121.450807,31.115398],[121.450154,31.112819],[121.452364,31.108586],[121.447623,31.107423],[121.446275,31.105744],[121.451878,31.103849],[121.452629,31.101234],[121.455423,31.100755],[121.462862,31.101954],[121.463237,31.108586],[121.465211,31.1121],[121.470286,31.110937],[121.473984,31.112915],[121.474137,31.114354],[121.477321,31.110853],[121.481353,31.110697],[121.477446,31.117328],[121.481256,31.118024],[121.48191,31.120086],[121.485705,31.121933],[121.485969,31.124523],[121.490266,31.124283],[121.49281,31.118719],[121.498538,31.121501],[121.501583,31.114666],[121.505295,31.115494],[121.503863,31.118324],[121.50549,31.120002],[121.511343,31.12119],[121.513749,31.118012],[121.514513,31.115278],[121.521424,31.116309],[121.522869,31.115242],[121.525289,31.116741],[121.53142,31.11842],[121.532254,31.117208],[121.535341,31.117976],[121.537885,31.113983],[121.539526,31.115626],[121.542251,31.116153],[121.544225,31.111464],[121.547687,31.109653],[121.550426,31.11162],[121.549217,31.113419],[121.552317,31.113899],[121.553332,31.112688],[121.555279,31.114882],[121.556697,31.113083],[121.559867,31.111896],[121.557851,31.109797],[121.561396,31.106224],[121.561132,31.105264],[121.563649,31.101858],[121.562064,31.101258],[121.563315,31.098955],[121.566819,31.096569],[121.567264,31.09363],[121.564358,31.091891],[121.561855,31.091867],[121.561563,31.09357],[121.559088,31.091951],[121.551608,31.090128],[121.551539,31.088148],[121.548549,31.086889],[121.550565,31.082834],[121.553555,31.080303],[121.556405,31.081059],[121.557031,31.082702],[121.561563,31.08365],[121.563579,31.082486],[121.569766,31.081611],[121.571643,31.080063],[121.572658,31.081323],[121.575272,31.080063],[121.567639,31.0762],[121.56262,31.075121],[121.562675,31.074305],[121.557531,31.073357],[121.559033,31.072169],[121.555599,31.071689],[121.55279,31.069506],[121.556753,31.06737],[121.551789,31.065643],[121.551094,31.063795],[121.548549,31.063639],[121.547201,31.061647],[121.548383,31.056896],[121.543308,31.055696],[121.54328,31.054016],[121.540791,31.052528],[121.542307,31.049072],[121.541472,31.046396],[121.54588,31.047044],[121.547799,31.048544],[121.54955,31.047908],[121.550538,31.049396],[121.552693,31.0493],[121.554737,31.050824],[121.556127,31.047632],[121.557031,31.04798],[121.559811,31.044812],[121.562119,31.043635],[121.559464,31.041391],[121.559505,31.030278],[121.558254,31.029533],[121.558407,31.024528],[121.555765,31.022908],[121.552804,31.023268],[121.552262,31.020915],[121.554139,31.01861],[121.556516,31.01873],[121.556474,31.020255],[121.558699,31.020255],[121.56027,31.024132],[121.564302,31.021191],[121.569057,31.024396],[121.56839,31.025284],[121.572325,31.026677],[121.574758,31.020951],[121.574674,31.018634],[121.571018,31.016426],[121.569822,31.012452],[121.565859,31.011912],[121.568181,31.010063],[121.569725,31.010603],[121.571463,31.005633],[121.570253,31.004565],[121.570712,31.002295],[121.567959,31.000879],[121.570475,30.998345],[121.561494,30.995644],[121.555918,30.995152],[121.556224,30.993374],[121.553304,30.993026],[121.55279,30.98886],[121.549537,30.988307],[121.54613,30.99305],[121.543294,30.994203],[121.538233,30.993146],[121.537774,30.994683],[121.534507,30.995848],[121.531962,30.994815],[121.528612,30.99592],[121.522897,30.99981],[121.520325,30.999354],[121.520089,31.00256],[121.522105,31.002199],[121.520853,31.004445],[121.517002,31.007626],[121.510412,31.004553],[121.507881,31.004745],[121.503057,31.002716],[121.49883,30.999426],[121.498872,30.998213],[121.495924,30.998297],[121.491948,31.010039],[121.492879,31.012752],[121.489153,31.014949],[121.485872,31.014073],[121.476362,31.01334],[121.47144,31.011948],[121.465587,31.008755],[121.459942,31.007398],[121.448305,31.007458],[121.440811,31.005789],[121.436834,31.00406],[121.433636,31.001779],[121.431426,30.999174],[121.423973,30.994515],[121.413184,30.991069],[121.409333,30.990229],[121.394261,30.988247],[121.375227,30.982832],[121.35871,30.97786]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":310113,\"name\":\"宝山区\",\"center\":[121.489934,31.398896],\"centroid\":[121.404861,31.392111],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":310000},\"subFeatureIndex\":8,\"acroutes\":[100000,310000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[121.425252,31.270661],[121.419496,31.265237],[121.41577,31.265896],[121.41527,31.26914],[121.410598,31.270373],[121.41096,31.273175],[121.40544,31.273067],[121.406496,31.276862],[121.404564,31.276227],[121.400087,31.278071],[121.404453,31.286223],[121.400379,31.286115],[121.398446,31.287145],[121.399559,31.288904],[121.39789,31.29052],[121.393483,31.291274],[121.394762,31.294674],[121.388394,31.29526],[121.384765,31.294446],[121.381623,31.292711],[121.38154,31.289431],[121.376242,31.290592],[121.374838,31.289096],[121.370153,31.290329],[121.369666,31.28912],[121.363785,31.291334],[121.363785,31.292028],[121.358585,31.293465],[121.360295,31.294674],[121.363534,31.302741],[121.360309,31.302717],[121.354803,31.299808],[121.352954,31.301663],[121.348894,31.299246],[121.349659,31.297582],[121.346892,31.296349],[121.34685,31.297654],[121.340927,31.297439],[121.341011,31.293716],[121.338675,31.293225],[121.336506,31.294901],[121.33588,31.297044],[121.334198,31.296122],[121.331306,31.301436],[121.335686,31.303339],[121.338981,31.310101],[121.340357,31.311525],[121.343458,31.317185],[121.347698,31.316706],[121.347782,31.319542],[121.3492,31.321313],[121.345585,31.320835],[121.344848,31.323335],[121.347517,31.324077],[121.345932,31.32513],[121.342318,31.331005],[121.341692,31.33329],[121.342846,31.336066],[121.34628,31.336329],[121.344347,31.341928],[121.342401,31.341306],[121.338925,31.344775],[121.337521,31.344536],[121.336464,31.346821],[121.332502,31.347084],[121.332251,31.351307],[121.334643,31.3509],[121.337743,31.3534],[121.337118,31.356019],[121.341428,31.357802],[121.340329,31.360517],[121.338911,31.360995],[121.337576,31.364189],[121.335018,31.366963],[121.335991,31.370097],[121.333336,31.371281],[121.334003,31.37262],[121.331389,31.37433],[121.328734,31.377344],[121.331306,31.378456],[121.330527,31.381135],[121.326607,31.381063],[121.323061,31.388489],[121.320419,31.389123],[121.323339,31.393331],[121.323145,31.395866],[121.321476,31.397576],[121.317444,31.39742],[121.314747,31.398365],[121.315637,31.402729],[121.317375,31.403661],[121.314316,31.4072],[121.32847,31.411958],[121.330444,31.410308],[121.333141,31.410739],[121.332488,31.413117],[121.334101,31.413655],[121.33239,31.416943],[121.336561,31.419058],[121.336422,31.424999],[121.335143,31.429158],[121.336645,31.429493],[121.336603,31.432254],[121.333656,31.440118],[121.331236,31.439652],[121.328261,31.441098],[121.326106,31.448041],[121.327399,31.448829],[121.324132,31.455007],[121.319794,31.454876],[121.318654,31.456895],[121.320531,31.457289],[121.317778,31.460109],[121.317277,31.466262],[121.320058,31.466728],[121.320572,31.469058],[121.317958,31.468472],[121.31426,31.472474],[121.318807,31.475055],[121.315956,31.481219],[121.313342,31.480598],[121.310214,31.487311],[121.308629,31.488649],[121.31027,31.489735],[121.309171,31.492495],[121.306544,31.493307],[121.304667,31.495779],[121.300857,31.496747],[121.299926,31.499756],[121.302595,31.502599],[121.305876,31.503435],[121.305529,31.505333],[121.310353,31.505919],[121.311938,31.502909],[121.315345,31.501273],[121.316652,31.505775],[121.320169,31.505883],[121.321879,31.503399],[121.32003,31.502993],[121.319905,31.49972],[121.323701,31.499649],[121.323131,31.502288],[121.327218,31.504247],[121.329512,31.504247],[121.335838,31.508295],[121.343499,31.512057],[121.357751,31.508259],[121.362255,31.50679],[121.376298,31.501106],[121.405426,31.487215],[121.406288,31.485388],[121.403966,31.481494],[121.404328,31.479212],[121.409694,31.476321],[121.41869,31.470682],[121.434276,31.458496],[121.446024,31.450717],[121.463696,31.438277],[121.481339,31.427294],[121.49427,31.417851],[121.505991,31.407021],[121.507228,31.409722],[121.501319,31.411982],[121.502362,31.413404],[121.510801,31.409973],[121.517239,31.406303],[121.516585,31.405287],[121.509425,31.408288],[121.507353,31.405933],[121.521229,31.39479],[121.512372,31.385858],[121.507284,31.379102],[121.503835,31.373744],[121.50346,31.369403],[121.503835,31.36493],[121.508424,31.357251],[121.514903,31.352],[121.525483,31.346797],[121.522883,31.342885],[121.520256,31.344033],[121.517628,31.340779],[121.50556,31.345732],[121.493575,31.330299],[121.497593,31.328109],[121.498928,31.325322],[121.496216,31.323347],[121.496717,31.311489],[121.485413,31.311573],[121.485372,31.314636],[121.479171,31.314696],[121.472956,31.315797],[121.468312,31.316036],[121.468145,31.32032],[121.465378,31.321397],[121.457133,31.321002],[121.4547,31.319243],[121.447887,31.317101],[121.44672,31.319817],[121.436765,31.319662],[121.436459,31.32087],[121.433595,31.32087],[121.432468,31.318669],[121.434623,31.312303],[121.432163,31.31168],[121.431676,31.309478],[121.432441,31.305912],[121.431287,31.303638],[121.426434,31.303207],[121.426935,31.298528],[121.42364,31.297259],[121.420039,31.296912],[121.418648,31.292256],[121.419691,31.291071],[121.423806,31.291011],[121.422833,31.28426],[121.424432,31.280238],[121.424571,31.27193],[121.425252,31.270661]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":310114,\"name\":\"嘉定区\",\"center\":[121.250333,31.383524],\"centroid\":[121.244394,31.358136],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":310000},\"subFeatureIndex\":9,\"acroutes\":[100000,310000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[121.336506,31.294901],[121.332891,31.292998],[121.33353,31.291107],[121.326384,31.288928],[121.327316,31.285182],[121.328998,31.284595],[121.332738,31.286067],[121.335004,31.279711],[121.336061,31.280046],[121.336228,31.275461],[121.338883,31.275006],[121.338272,31.272839],[121.343541,31.271439],[121.344723,31.273917],[121.35732,31.271415],[121.358918,31.268793],[121.361268,31.27084],[121.367441,31.269631],[121.366996,31.266662],[121.362227,31.26756],[121.35985,31.266997],[121.358918,31.263609],[121.361783,31.259945],[121.366023,31.259358],[121.365884,31.257682],[121.374574,31.257059],[121.375158,31.25949],[121.377508,31.259478],[121.380886,31.257766],[121.377216,31.247719],[121.375686,31.244486],[121.3731,31.245683],[121.372349,31.243755],[121.368387,31.247384],[121.366718,31.246342],[121.363117,31.240091],[121.36067,31.238642],[121.360086,31.240498],[121.356068,31.240151],[121.356054,31.237803],[121.354177,31.237121],[121.352856,31.238342],[121.348741,31.239372],[121.350131,31.241839],[121.348922,31.243863],[121.347281,31.243192],[121.346822,31.241037],[121.344612,31.243552],[121.345585,31.239887],[121.340872,31.239947],[121.338355,31.237528],[121.334935,31.235887],[121.333878,31.232006],[121.32612,31.229575],[121.322853,31.229623],[121.315386,31.227204],[121.302998,31.230605],[121.296922,31.231048],[121.29264,31.232761],[121.288538,31.238198],[121.287301,31.243276],[121.283742,31.245192],[121.28142,31.248174],[121.284228,31.251838],[121.280363,31.251886],[121.275302,31.253527],[121.271284,31.252258],[121.264444,31.256496],[121.263985,31.259155],[121.260217,31.258328],[121.254405,31.259634],[121.254183,31.258688],[121.246758,31.258448],[121.246577,31.259801],[121.242253,31.25937],[121.237693,31.262088],[121.235177,31.262699],[121.229087,31.262711],[121.229198,31.261717],[121.223539,31.260532],[121.223859,31.259035],[121.220216,31.257406],[121.221273,31.256293],[121.214182,31.254353],[121.212625,31.259837],[121.209761,31.260831],[121.209816,31.258017],[121.208482,31.25749],[121.206368,31.260065],[121.202865,31.257131],[121.203143,31.255814],[121.199848,31.255239],[121.19608,31.253395],[121.19626,31.251228],[121.193368,31.251455],[121.193021,31.253623],[121.188377,31.25476],[121.186444,31.252329],[121.183928,31.252246],[121.181537,31.254413],[121.17934,31.253419],[121.178798,31.255862],[121.176768,31.254605],[121.174251,31.256856],[121.171415,31.254928],[121.16894,31.256197],[121.170386,31.259119],[121.168036,31.259622],[121.167661,31.263944],[121.162614,31.269176],[121.161057,31.26762],[121.157845,31.270541],[121.155537,31.266147],[121.151783,31.267632],[121.153924,31.272061],[121.153743,31.276646],[121.155481,31.278442],[121.155537,31.280765],[121.159402,31.281579],[121.161293,31.283985],[121.159305,31.28766],[121.156399,31.287408],[121.154967,31.290209],[121.153145,31.28997],[121.151282,31.291933],[121.152714,31.294075],[121.148933,31.298875],[121.150782,31.299018],[121.146903,31.305936],[121.143774,31.309706],[121.13895,31.305625],[121.139645,31.302992],[121.133778,31.30207],[121.129954,31.302597],[121.129134,31.307528],[121.129773,31.308306],[121.127966,31.311884],[121.128633,31.314265],[121.127076,31.316934],[121.127257,31.319315],[121.131637,31.32324],[121.131539,31.325441],[121.133305,31.325585],[121.132582,31.331962],[121.13115,31.332106],[121.130121,31.334702],[121.130816,31.341509],[121.130441,31.344213],[121.123948,31.342753],[121.117969,31.343447],[121.11733,31.34712],[121.120194,31.347562],[121.117246,31.351689],[121.111838,31.350517],[121.111157,31.351534],[121.10832,31.350649],[121.108418,31.354034],[121.107361,31.354763],[121.108251,31.360457],[121.106749,31.364535],[121.106958,31.366593],[121.10889,31.366509],[121.10928,31.364703],[121.112853,31.365133],[121.113173,31.36688],[121.120208,31.368674],[121.119082,31.370563],[121.11523,31.371137],[121.113757,31.37445],[121.118206,31.375837],[121.12328,31.37848],[121.124268,31.376722],[121.131247,31.379664],[121.131762,31.378815],[121.138408,31.381147],[121.137518,31.382785],[121.141049,31.384531],[121.141425,31.38355],[121.148432,31.385404],[121.148988,31.38691],[121.147097,31.3899],[121.14383,31.392327],[121.149475,31.394503],[121.147653,31.397325],[121.152742,31.398174],[121.149586,31.399381],[121.15049,31.402215],[121.153896,31.403685],[121.153104,31.405837],[121.157887,31.407893],[121.15886,31.410117],[121.154508,31.411575],[121.155523,31.413835],[121.153493,31.413679],[121.148905,31.415867],[121.149266,31.41913],[121.146208,31.419704],[121.146249,31.421078],[121.151157,31.421796],[121.155273,31.42574],[121.161362,31.425776],[121.162002,31.427951],[121.16431,31.427222],[121.16253,31.429565],[121.162711,31.432218],[121.158484,31.432254],[121.152492,31.433604],[121.14782,31.436186],[121.146569,31.439006],[121.147348,31.44393],[121.160917,31.449678],[121.163045,31.448865],[121.166048,31.450168],[121.16773,31.448315],[121.16983,31.450024],[121.174974,31.449295],[121.180814,31.451458],[121.186055,31.454362],[121.185457,31.457468],[121.186055,31.460814],[121.195051,31.467827],[121.202906,31.469356],[121.203421,31.472331],[121.206368,31.474995],[121.214377,31.479128],[121.21503,31.477528],[121.21364,31.475939],[121.219062,31.475222],[121.220731,31.47607],[121.225361,31.476022],[121.226209,31.477683],[121.230352,31.477432],[121.230839,31.481111],[121.22867,31.482127],[121.232994,31.487896],[121.235413,31.488099],[121.234746,31.492686],[121.237234,31.491957],[121.240877,31.493701],[121.241141,31.490906],[121.243797,31.487311],[121.244409,31.481183],[121.248176,31.481876],[121.245813,31.479881],[121.247064,31.477062],[121.249692,31.477623],[121.251221,31.479606],[121.253362,31.479809],[121.253627,31.483082],[121.255643,31.483632],[121.254794,31.477635],[121.261454,31.478854],[121.261732,31.480777],[121.265153,31.48313],[121.267433,31.483357],[121.267322,31.486224],[121.268879,31.487466],[121.272049,31.484337],[121.27622,31.485376],[121.276442,31.486654],[121.280321,31.488672],[121.279696,31.490404],[121.283686,31.489795],[121.285355,31.490679],[121.289387,31.489031],[121.29061,31.491694],[121.293488,31.489807],[121.298605,31.491515],[121.298563,31.493713],[121.300496,31.494537],[121.300857,31.496747],[121.304667,31.495779],[121.306544,31.493307],[121.309171,31.492495],[121.31027,31.489735],[121.308629,31.488649],[121.310214,31.487311],[121.313342,31.480598],[121.315956,31.481219],[121.318807,31.475055],[121.31426,31.472474],[121.317958,31.468472],[121.320572,31.469058],[121.320058,31.466728],[121.317277,31.466262],[121.317778,31.460109],[121.320531,31.457289],[121.318654,31.456895],[121.319794,31.454876],[121.324132,31.455007],[121.327399,31.448829],[121.326106,31.448041],[121.328261,31.441098],[121.331236,31.439652],[121.333656,31.440118],[121.336603,31.432254],[121.336645,31.429493],[121.335143,31.429158],[121.336422,31.424999],[121.336561,31.419058],[121.33239,31.416943],[121.334101,31.413655],[121.332488,31.413117],[121.333141,31.410739],[121.330444,31.410308],[121.32847,31.411958],[121.314316,31.4072],[121.317375,31.403661],[121.315637,31.402729],[121.314747,31.398365],[121.317444,31.39742],[121.321476,31.397576],[121.323145,31.395866],[121.323339,31.393331],[121.320419,31.389123],[121.323061,31.388489],[121.326607,31.381063],[121.330527,31.381135],[121.331306,31.378456],[121.328734,31.377344],[121.331389,31.37433],[121.334003,31.37262],[121.333336,31.371281],[121.335991,31.370097],[121.335018,31.366963],[121.337576,31.364189],[121.338911,31.360995],[121.340329,31.360517],[121.341428,31.357802],[121.337118,31.356019],[121.337743,31.3534],[121.334643,31.3509],[121.332251,31.351307],[121.332502,31.347084],[121.336464,31.346821],[121.337521,31.344536],[121.338925,31.344775],[121.342401,31.341306],[121.344347,31.341928],[121.34628,31.336329],[121.342846,31.336066],[121.341692,31.33329],[121.342318,31.331005],[121.345932,31.32513],[121.347517,31.324077],[121.344848,31.323335],[121.345585,31.320835],[121.3492,31.321313],[121.347782,31.319542],[121.347698,31.316706],[121.343458,31.317185],[121.340357,31.311525],[121.338981,31.310101],[121.335686,31.303339],[121.331306,31.301436],[121.334198,31.296122],[121.33588,31.297044],[121.336506,31.294901]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":310115,\"name\":\"浦东新区\",\"center\":[121.567706,31.245944],\"centroid\":[121.742177,31.083823],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":310000},\"subFeatureIndex\":10,\"acroutes\":[100000,310000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[121.570475,30.998345],[121.567959,31.000879],[121.570712,31.002295],[121.570253,31.004565],[121.571463,31.005633],[121.569725,31.010603],[121.568181,31.010063],[121.565859,31.011912],[121.569822,31.012452],[121.571018,31.016426],[121.574674,31.018634],[121.574758,31.020951],[121.572325,31.026677],[121.56839,31.025284],[121.569057,31.024396],[121.564302,31.021191],[121.56027,31.024132],[121.558699,31.020255],[121.556474,31.020255],[121.556516,31.01873],[121.554139,31.01861],[121.552262,31.020915],[121.552804,31.023268],[121.555765,31.022908],[121.558407,31.024528],[121.558254,31.029533],[121.559505,31.030278],[121.559464,31.041391],[121.562119,31.043635],[121.559811,31.044812],[121.557031,31.04798],[121.556127,31.047632],[121.554737,31.050824],[121.552693,31.0493],[121.550538,31.049396],[121.54955,31.047908],[121.547799,31.048544],[121.54588,31.047044],[121.541472,31.046396],[121.542307,31.049072],[121.540791,31.052528],[121.54328,31.054016],[121.543308,31.055696],[121.548383,31.056896],[121.547201,31.061647],[121.548549,31.063639],[121.551094,31.063795],[121.551789,31.065643],[121.556753,31.06737],[121.55279,31.069506],[121.555599,31.071689],[121.559033,31.072169],[121.557531,31.073357],[121.562675,31.074305],[121.56262,31.075121],[121.567639,31.0762],[121.575272,31.080063],[121.572658,31.081323],[121.571643,31.080063],[121.569766,31.081611],[121.563579,31.082486],[121.561563,31.08365],[121.557031,31.082702],[121.556405,31.081059],[121.553555,31.080303],[121.550565,31.082834],[121.548549,31.086889],[121.551539,31.088148],[121.551608,31.090128],[121.559088,31.091951],[121.561563,31.09357],[121.561855,31.091867],[121.564358,31.091891],[121.567264,31.09363],[121.566819,31.096569],[121.563315,31.098955],[121.562064,31.101258],[121.563649,31.101858],[121.561132,31.105264],[121.561396,31.106224],[121.557851,31.109797],[121.559867,31.111896],[121.556697,31.113083],[121.555279,31.114882],[121.553332,31.112688],[121.552317,31.113899],[121.549217,31.113419],[121.550426,31.11162],[121.547687,31.109653],[121.544225,31.111464],[121.542251,31.116153],[121.539526,31.115626],[121.537885,31.113983],[121.535341,31.117976],[121.532254,31.117208],[121.53142,31.11842],[121.525289,31.116741],[121.522869,31.115242],[121.521424,31.116309],[121.514513,31.115278],[121.513749,31.118012],[121.511343,31.12119],[121.50549,31.120002],[121.503863,31.118324],[121.505295,31.115494],[121.501583,31.114666],[121.498538,31.121501],[121.49281,31.118719],[121.490266,31.124283],[121.485969,31.124523],[121.485705,31.121933],[121.48191,31.120086],[121.481256,31.118024],[121.477446,31.117328],[121.481353,31.110697],[121.477321,31.110853],[121.474137,31.114354],[121.473984,31.112915],[121.470286,31.110937],[121.465211,31.1121],[121.469299,31.118731],[121.469674,31.124859],[121.468729,31.127868],[121.462431,31.134463],[121.457453,31.142232],[121.457453,31.146451],[121.460387,31.150276],[121.46574,31.155118],[121.468354,31.158091],[121.469369,31.162298],[121.468159,31.167092],[121.464905,31.17541],[121.464905,31.178022],[121.466254,31.18109],[121.468729,31.184122],[121.475987,31.187885],[121.490752,31.191467],[121.494631,31.192857],[121.498066,31.195601],[121.501319,31.199747],[121.508368,31.210158],[121.509911,31.214506],[121.509397,31.218459],[121.506741,31.223119],[121.502014,31.228018],[121.495744,31.232977],[121.493491,31.23615],[121.493491,31.240163],[121.494826,31.24221],[121.500012,31.244989],[121.50688,31.246474],[121.516488,31.246953],[121.527555,31.247252],[121.536384,31.249623],[121.541542,31.251826],[121.559074,31.264219],[121.563537,31.268805],[121.568515,31.275701],[121.56953,31.279567],[121.569141,31.285254],[121.565456,31.294135],[121.562523,31.29976],[121.561758,31.303339],[121.561883,31.321158],[121.560493,31.32781],[121.558574,31.331256],[121.555779,31.333948],[121.549398,31.337789],[121.525483,31.346797],[121.514903,31.352],[121.508424,31.357251],[121.503835,31.36493],[121.50346,31.369403],[121.503835,31.373744],[121.507284,31.379102],[121.512372,31.385858],[121.521229,31.39479],[121.538011,31.388489],[121.559811,31.38361],[121.593708,31.376411],[121.603038,31.372656],[121.610559,31.368195],[121.689448,31.322462],[121.712431,31.309407],[121.722511,31.303518],[121.729101,31.298288],[121.743742,31.283207],[121.809812,31.196907],[121.853358,31.155346],[121.884029,31.130638],[121.889465,31.121705],[121.94679,31.065883],[121.962682,31.047284],[121.977558,31.016101],[121.990934,30.968432],[121.996231,30.935458],[121.998497,30.899961],[121.996982,30.874898],[121.993951,30.863055],[121.985372,30.850694],[121.970732,30.839077],[121.954715,30.825811],[121.954326,30.821409],[121.955466,30.817138],[121.969703,30.789202],[121.943689,30.777096],[121.9246,30.8066],[121.915284,30.812892],[121.904467,30.814155],[121.793767,30.816862],[121.769338,30.85043],[121.768143,30.863272],[121.771605,30.875427],[121.772481,30.875703],[121.773134,30.880596],[121.776679,30.881005],[121.776012,30.886426],[121.778807,30.894588],[121.778987,30.899468],[121.778334,30.903807],[121.77896,30.910116],[121.780239,30.911811],[121.781115,30.917567],[121.777653,30.926723],[121.777806,30.931025],[121.77337,30.931553],[121.773023,30.933932],[121.769769,30.935278],[121.76799,30.93833],[121.766432,30.936539],[121.763846,30.936852],[121.764277,30.938522],[121.761469,30.938414],[121.761677,30.940132],[121.764542,30.941766],[121.760927,30.944613],[121.761024,30.947604],[121.759286,30.949154],[121.751987,30.952721],[121.749234,30.953046],[121.747857,30.951893],[121.743742,30.956589],[121.739988,30.956721],[121.73686,30.958703],[121.737916,30.960637],[121.733954,30.964469],[121.73191,30.967784],[121.712792,30.980934],[121.705507,30.984981],[121.699459,30.987419],[121.69298,30.98934],[121.688086,30.990145],[121.683595,30.989808],[121.674558,30.991802],[121.673348,30.989832],[121.669525,30.991609],[121.663115,30.992714],[121.654536,30.993254],[121.646695,30.99335],[121.62057,30.992678],[121.61772,30.995692],[121.614717,31.001251],[121.604066,31.001131],[121.595585,31.002043],[121.594682,31.000699],[121.584309,31.000819],[121.582933,30.999498],[121.576746,30.999474],[121.570475,30.998345]]],[[[121.943244,31.215465],[121.946595,31.224365],[121.951044,31.228821],[121.957259,31.230414],[121.969188,31.230282],[121.980659,31.22809],[121.989655,31.224521],[122.008563,31.220987],[122.011038,31.217405],[122.012609,31.210002],[122.012011,31.192043],[122.010593,31.188004],[121.999554,31.165079],[121.99573,31.1608],[121.975862,31.158834],[121.970773,31.157552],[121.965685,31.15754],[121.959637,31.159278],[121.952629,31.1672],[121.948027,31.176405],[121.944843,31.186878],[121.942619,31.198465],[121.941826,31.207678],[121.943244,31.215465]]],[[[121.882625,31.240857],[121.88991,31.242594],[121.897363,31.242115],[121.915451,31.236558],[121.923557,31.233863],[121.926727,31.229731],[121.927519,31.224017],[121.925448,31.205438],[121.922445,31.196859],[121.918788,31.194319],[121.913852,31.19384],[121.908777,31.195266],[121.901645,31.20146],[121.889271,31.214997],[121.885155,31.22052],[121.882541,31.225611],[121.880873,31.23633],[121.882625,31.240857]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":310116,\"name\":\"金山区\",\"center\":[121.330736,30.724697],\"centroid\":[121.255144,30.818932],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":310000},\"subFeatureIndex\":11,\"acroutes\":[100000,310000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120.99673,30.950307],[121.002055,30.95104],[121.002653,30.947015],[121.00763,30.947628],[121.010175,30.950727],[121.015361,30.948169],[121.013345,30.946811],[121.011079,30.947184],[121.011607,30.943604],[121.013831,30.944168],[121.015291,30.940288],[121.017697,30.939219],[121.016932,30.941333],[121.019462,30.941165],[121.028041,30.94394],[121.02989,30.944457],[121.029612,30.941874],[121.031851,30.939771],[121.031503,30.936083],[121.028694,30.92754],[121.028319,30.922602],[121.025872,30.91675],[121.024885,30.911618],[121.025288,30.909059],[121.034659,30.90615],[121.034395,30.902737],[121.038788,30.902148],[121.040332,30.904504],[121.040874,30.900706],[121.04232,30.899408],[121.045184,30.901896],[121.053026,30.903374],[121.056529,30.90335],[121.067944,30.904504],[121.068973,30.902124],[121.072491,30.903182],[121.072421,30.904924],[121.080833,30.905946],[121.081806,30.904251],[121.083725,30.905285],[121.091664,30.90341],[121.094347,30.904804],[121.09425,30.902545],[121.097128,30.903206],[121.098782,30.906607],[121.096196,30.910332],[121.093805,30.909708],[121.089092,30.911979],[121.089022,30.915296],[121.091358,30.916185],[121.100395,30.926459],[121.104358,30.922758],[121.105122,30.920138],[121.110962,30.921749],[121.114591,30.921676],[121.121445,30.919958],[121.119346,30.911991],[121.117802,30.910705],[121.113506,30.903602],[121.110851,30.90103],[121.111087,30.899228],[121.113451,30.897425],[121.118164,30.901487],[121.122224,30.901114],[121.123545,30.902857],[121.130163,30.902593],[121.131706,30.899732],[121.134417,30.901812],[121.141258,30.901331],[121.14098,30.904984],[121.139673,30.907388],[121.14009,30.910332],[121.13742,30.913349],[121.139061,30.91961],[121.143246,30.918108],[121.142162,30.915596],[121.149836,30.912616],[121.152895,30.9102],[121.156649,30.909972],[121.156288,30.912616],[121.156746,30.918961],[121.158206,30.920295],[121.164616,30.919934],[121.16691,30.916978],[121.171262,30.914683],[121.174654,30.915115],[121.186472,30.915404],[121.187765,30.916593],[121.194828,30.917314],[121.207522,30.919886],[121.211026,30.92128],[121.218145,30.927684],[121.222997,30.930748],[121.227335,30.926783],[121.234495,30.928562],[121.234773,30.925978],[121.238166,30.924861],[121.240655,30.925149],[121.242935,30.91991],[121.244589,30.920307],[121.245507,30.917074],[121.243686,30.917855],[121.246619,30.9099],[121.255226,30.909551],[121.255893,30.907977],[121.258952,30.907208],[121.262122,30.908097],[121.262525,30.906835],[121.266932,30.906258],[121.266168,30.901715],[121.269046,30.901679],[121.270422,30.900165],[121.27298,30.900405],[121.274663,30.896078],[121.279098,30.897112],[121.27964,30.894456],[121.282073,30.894804],[121.28231,30.896571],[121.285257,30.896631],[121.285799,30.895429],[121.288413,30.896066],[121.288719,30.899961],[121.290151,30.900021],[121.291013,30.902677],[121.290068,30.909804],[121.288705,30.909912],[121.288844,30.916894],[121.294948,30.918504],[121.294809,30.914947],[121.296269,30.914959],[121.29848,30.909744],[121.301775,30.908458],[121.303443,30.909287],[121.303721,30.912099],[121.306502,30.912123],[121.306808,30.910212],[121.313829,30.910717],[121.314608,30.909143],[121.320127,30.91109],[121.321518,30.908986],[121.325939,30.908962],[121.327635,30.91014],[121.331097,30.907508],[121.334657,30.907737],[121.336631,30.906739],[121.340162,30.908554],[121.343819,30.909119],[121.347573,30.913145],[121.350604,30.911402],[121.351814,30.913217],[121.35668,30.908614],[121.358418,30.900598],[121.360476,30.897785],[121.361185,30.892977],[121.36327,30.886955],[121.367233,30.886667],[121.370166,30.883914],[121.371751,30.883698],[121.377535,30.879983],[121.382207,30.878961],[121.381498,30.876605],[121.382791,30.874489],[121.38286,30.869043],[121.381873,30.867324],[121.381929,30.863765],[121.384001,30.863488],[121.383472,30.859232],[121.384376,30.856238],[121.383722,30.851765],[121.384918,30.848073],[121.385446,30.843178],[121.379065,30.843238],[121.379259,30.840112],[121.383764,30.833906],[121.387588,30.832799],[121.387588,30.829864],[121.391717,30.829913],[121.392051,30.82782],[121.396986,30.827988],[121.397376,30.833292],[121.399712,30.834182],[121.404202,30.833797],[121.403632,30.829877],[121.400685,30.830105],[121.400991,30.827399],[121.404786,30.823081],[121.41235,30.821505],[121.414171,30.821757],[121.41552,30.819941],[121.415131,30.815803],[121.419288,30.81602],[121.420525,30.819797],[121.425989,30.81869],[121.437029,30.818101],[121.441645,30.806829],[121.445427,30.804868],[121.44672,30.805577],[121.451711,30.798323],[121.465072,30.776483],[121.478767,30.756347],[121.426365,30.730283],[121.406997,30.718086],[121.361894,30.67952],[121.35433,30.676991],[121.346642,30.675593],[121.326718,30.67593],[121.291041,30.678328],[121.274649,30.6774],[121.271604,30.69689],[121.270422,30.69807],[121.270672,30.701563],[121.268656,30.702129],[121.268031,30.706103],[121.266668,30.706296],[121.265862,30.709488],[121.268448,30.712149],[121.267057,30.715039],[121.270339,30.716894],[121.270102,30.72047],[121.272035,30.723252],[121.270339,30.725864],[121.271451,30.726948],[121.269755,30.730729],[121.271451,30.73227],[121.26817,30.734931],[121.266835,30.733498],[121.261343,30.738217],[121.256393,30.743948],[121.244756,30.749185],[121.243102,30.750533],[121.23729,30.752651],[121.232298,30.755817],[121.230686,30.763737],[121.229115,30.767974],[121.226918,30.770826],[121.226209,30.775087],[121.224624,30.776976],[121.2234,30.775977],[121.217992,30.784954],[121.213723,30.785929],[121.205534,30.785905],[121.200098,30.783294],[121.199166,30.780755],[121.20032,30.773618],[121.196956,30.773354],[121.191839,30.778853],[121.190963,30.781092],[121.189517,30.778974],[121.186361,30.779034],[121.185791,30.776651],[121.183441,30.775038],[121.179965,30.774376],[121.174668,30.772018],[121.170984,30.774677],[121.170789,30.777084],[121.168968,30.775953],[121.163434,30.775279],[121.160737,30.773221],[121.160681,30.776579],[121.155815,30.777205],[121.152687,30.778974],[121.144122,30.779479],[121.140618,30.776928],[121.1387,30.77842],[121.13603,30.777337],[121.131817,30.777313],[121.127521,30.778673],[121.12342,30.77895],[121.117219,30.786073],[121.120041,30.788552],[121.125255,30.788179],[121.126576,30.788998],[121.126047,30.79304],[121.128202,30.810221],[121.130218,30.815574],[121.132373,30.819279],[121.13742,30.825029],[121.13742,30.829985],[121.136239,30.827868],[121.134264,30.828505],[121.132916,30.831608],[121.134612,30.833028],[121.131609,30.83601],[121.129982,30.834892],[121.127688,30.83565],[121.120639,30.836335],[121.117747,30.835301],[121.119832,30.83773],[121.12025,30.843299],[121.123545,30.847267],[121.121153,30.850165],[121.120055,30.849119],[121.114744,30.851476],[121.113159,30.854049],[121.110906,30.851416],[121.104789,30.849335],[121.102272,30.850261],[121.097684,30.854927],[121.097712,30.857103],[121.080471,30.848746],[121.066999,30.84877],[121.06052,30.845187],[121.061674,30.843383],[121.060228,30.842793],[121.062049,30.83779],[121.056335,30.835602],[121.046755,30.831091],[121.048896,30.825186],[121.045101,30.825907],[121.043516,30.828157],[121.039956,30.827218],[121.04175,30.825378],[121.040276,30.82438],[121.039192,30.820867],[121.03769,30.820266],[121.03908,30.818582],[121.043752,30.820013],[121.044976,30.815526],[121.037912,30.81389],[121.036647,30.818449],[121.030057,30.828553],[121.014874,30.833954],[121.014402,30.835818],[121.010898,30.834615],[121.006935,30.830779],[121.003446,30.826304],[121.00054,30.829431],[120.994603,30.821493],[120.990918,30.822708],[120.992754,30.825691],[120.989153,30.828698],[120.992462,30.831572],[120.989125,30.832318],[120.989987,30.834724],[120.992865,30.838392],[120.995659,30.838572],[120.997759,30.84408],[120.9999,30.843335],[121.000985,30.845632],[121.003974,30.846101],[121.006463,30.850454],[121.008006,30.850574],[121.010133,30.853135],[121.013359,30.851692],[121.015013,30.853604],[121.010981,30.856033],[121.015403,30.86053],[121.016265,30.862851],[121.013971,30.86439],[121.01778,30.86938],[121.014819,30.871027],[121.01778,30.873359],[121.020463,30.87188],[121.019796,30.873996],[121.021896,30.875162],[121.019421,30.876665],[121.021465,30.878793],[121.0186,30.880716],[121.017474,30.882724],[121.011092,30.882219],[121.008298,30.882964],[121.00852,30.888121],[121.005017,30.888794],[120.993824,30.88966],[120.992907,30.893915],[120.99046,30.89579],[120.992656,30.899732],[120.992809,30.90216],[120.995715,30.903723],[120.998635,30.903386],[120.998704,30.905946],[121.00257,30.904852],[121.004516,30.906955],[121.004572,30.909299],[120.998982,30.909527],[120.999622,30.91395],[121.000025,30.934701],[121.000818,30.937729],[120.997481,30.941141],[120.995673,30.944336],[120.996813,30.944625],[120.99673,30.950307]]],[[[121.426671,30.682183],[121.428589,30.681749],[121.426796,30.680315],[121.426671,30.682183]]],[[[121.422458,30.691482],[121.426615,30.691277],[121.428909,30.689109],[121.425364,30.687374],[121.419482,30.689856],[121.419469,30.691626],[121.422458,30.691482]]],[[[121.406775,30.704995],[121.409291,30.704514],[121.406622,30.703093],[121.406775,30.704995]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":310117,\"name\":\"松江区\",\"center\":[121.223543,31.03047],\"centroid\":[121.220231,31.015194],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":310000},\"subFeatureIndex\":12,\"acroutes\":[100000,310000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[121.323854,31.162933],[121.327218,31.156856],[121.328775,31.156665],[121.331528,31.15205],[121.331292,31.149772],[121.333711,31.148765],[121.335477,31.143862],[121.336728,31.14355],[121.338814,31.14017],[121.33677,31.138971],[121.342095,31.134655],[121.344681,31.130338],[121.344014,31.129451],[121.346002,31.126202],[121.34489,31.12577],[121.347545,31.121969],[121.346753,31.121657],[121.349589,31.117748],[121.353065,31.117604],[121.35066,31.115554],[121.353774,31.111512],[121.356026,31.112532],[121.357014,31.110529],[121.352217,31.106487],[121.351675,31.107735],[121.348532,31.106655],[121.351341,31.099255],[121.35839,31.100791],[121.359085,31.098931],[121.362756,31.099771],[121.368289,31.088976],[121.372016,31.079871],[121.370625,31.078372],[121.368804,31.079127],[121.365481,31.077892],[121.364341,31.073705],[121.362116,31.072601],[121.364424,31.069878],[121.363743,31.068354],[121.357278,31.066758],[121.358195,31.064047],[121.35344,31.061287],[121.343444,31.059139],[121.341456,31.062763],[121.335338,31.060435],[121.335102,31.04564],[121.33367,31.040695],[121.334017,31.031922],[121.333308,31.030686],[121.333892,31.026917],[121.333725,31.015657],[121.333072,31.01334],[121.339898,31.013857],[121.34279,31.014817],[121.34425,31.013941],[121.339829,31.010267],[121.33823,31.006197],[121.330347,30.996905],[121.327482,30.995896],[121.326773,30.994479],[121.326898,30.989964],[121.3258,30.9833],[121.327371,30.980658],[121.329554,30.981318],[121.334406,30.980694],[121.34375,30.976599],[121.351258,30.975986],[121.35871,30.97786],[121.359961,30.976251],[121.361435,30.970438],[121.36099,30.965574],[121.362853,30.959544],[121.363117,30.956109],[121.362255,30.9517],[121.362478,30.948901],[121.365467,30.947232],[121.363868,30.945165],[121.361129,30.944048],[121.362408,30.939122],[121.362658,30.934761],[121.359336,30.935086],[121.357361,30.933632],[121.354706,30.933512],[121.355679,30.932058],[121.35116,30.930628],[121.352203,30.928213],[121.352161,30.923803],[121.355373,30.921388],[121.356054,30.919742],[121.355081,30.916341],[121.351814,30.913217],[121.350604,30.911402],[121.347573,30.913145],[121.343819,30.909119],[121.340162,30.908554],[121.336631,30.906739],[121.334657,30.907737],[121.331097,30.907508],[121.327635,30.91014],[121.325939,30.908962],[121.321518,30.908986],[121.320127,30.91109],[121.314608,30.909143],[121.313829,30.910717],[121.306808,30.910212],[121.306502,30.912123],[121.303721,30.912099],[121.303443,30.909287],[121.301775,30.908458],[121.29848,30.909744],[121.296269,30.914959],[121.294809,30.914947],[121.294948,30.918504],[121.288844,30.916894],[121.288705,30.909912],[121.290068,30.909804],[121.291013,30.902677],[121.290151,30.900021],[121.288719,30.899961],[121.288413,30.896066],[121.285799,30.895429],[121.285257,30.896631],[121.28231,30.896571],[121.282073,30.894804],[121.27964,30.894456],[121.279098,30.897112],[121.274663,30.896078],[121.27298,30.900405],[121.270422,30.900165],[121.269046,30.901679],[121.266168,30.901715],[121.266932,30.906258],[121.262525,30.906835],[121.262122,30.908097],[121.258952,30.907208],[121.255893,30.907977],[121.255226,30.909551],[121.246619,30.9099],[121.243686,30.917855],[121.245507,30.917074],[121.244589,30.920307],[121.242935,30.91991],[121.240655,30.925149],[121.238166,30.924861],[121.234773,30.925978],[121.234495,30.928562],[121.227335,30.926783],[121.222997,30.930748],[121.218145,30.927684],[121.211026,30.92128],[121.207522,30.919886],[121.194828,30.917314],[121.187765,30.916593],[121.186472,30.915404],[121.174654,30.915115],[121.171262,30.914683],[121.16691,30.916978],[121.164616,30.919934],[121.158206,30.920295],[121.156746,30.918961],[121.156288,30.912616],[121.156649,30.909972],[121.152895,30.9102],[121.149836,30.912616],[121.142162,30.915596],[121.143246,30.918108],[121.139061,30.91961],[121.13742,30.913349],[121.14009,30.910332],[121.139673,30.907388],[121.14098,30.904984],[121.141258,30.901331],[121.134417,30.901812],[121.131706,30.899732],[121.130163,30.902593],[121.123545,30.902857],[121.122224,30.901114],[121.118164,30.901487],[121.113451,30.897425],[121.111087,30.899228],[121.110851,30.90103],[121.113506,30.903602],[121.117802,30.910705],[121.119346,30.911991],[121.121445,30.919958],[121.114591,30.921676],[121.110962,30.921749],[121.105122,30.920138],[121.104358,30.922758],[121.100395,30.926459],[121.091358,30.916185],[121.089022,30.915296],[121.089092,30.911979],[121.093805,30.909708],[121.096196,30.910332],[121.098782,30.906607],[121.097128,30.903206],[121.09425,30.902545],[121.094347,30.904804],[121.091664,30.90341],[121.083725,30.905285],[121.081806,30.904251],[121.080833,30.905946],[121.072421,30.904924],[121.072491,30.903182],[121.068973,30.902124],[121.067944,30.904504],[121.056529,30.90335],[121.053026,30.903374],[121.045184,30.901896],[121.04232,30.899408],[121.040874,30.900706],[121.040332,30.904504],[121.038788,30.902148],[121.034395,30.902737],[121.034659,30.90615],[121.025288,30.909059],[121.024885,30.911618],[121.025872,30.91675],[121.028319,30.922602],[121.028694,30.92754],[121.031503,30.936083],[121.031851,30.939771],[121.029612,30.941874],[121.02989,30.944457],[121.028041,30.94394],[121.027902,30.945826],[121.033213,30.947111],[121.034659,30.952974],[121.036258,30.957094],[121.040401,30.956493],[121.043516,30.957514],[121.042626,30.960433],[121.045949,30.963448],[121.043112,30.969429],[121.0467,30.970246],[121.047409,30.969033],[121.051024,30.969369],[121.053262,30.964445],[121.05735,30.965346],[121.056891,30.96191],[121.059505,30.959184],[121.060339,30.956517],[121.065344,30.95516],[121.07231,30.955088],[121.076495,30.955809],[121.076634,30.957574],[121.079109,30.958283],[121.078539,30.960025],[121.080736,30.960181],[121.081236,30.962283],[121.088174,30.962151],[121.088035,30.964168],[121.093555,30.964673],[121.097489,30.965634],[121.095779,30.968408],[121.095557,30.974245],[121.099172,30.973068],[121.099686,30.980994],[121.099227,30.981979],[121.100145,30.994935],[121.104107,30.99508],[121.104205,31.007998],[121.10205,31.011756],[121.093026,31.020207],[121.085532,31.0255],[121.089509,31.027901],[121.091177,31.025933],[121.096405,31.026437],[121.096975,31.031454],[121.099936,31.031202],[121.100284,31.03341],[121.097767,31.038871],[121.095863,31.040479],[121.09311,31.040719],[121.09621,31.044812],[121.090259,31.048136],[121.089926,31.05194],[121.087159,31.052948],[121.085866,31.050224],[121.082404,31.054208],[121.080972,31.056896],[121.08442,31.058779],[121.086519,31.061167],[121.085935,31.062847],[121.088202,31.064671],[121.092929,31.064539],[121.094542,31.061899],[121.093012,31.058443],[121.094639,31.056332],[121.098337,31.05662],[121.101146,31.053644],[121.101813,31.05728],[121.10839,31.057939],[121.10864,31.05662],[121.118206,31.056068],[121.117997,31.058407],[121.120708,31.057268],[121.12588,31.057376],[121.127757,31.059751],[121.126395,31.059811],[121.126228,31.06665],[121.122238,31.067178],[121.121543,31.07019],[121.118386,31.075948],[121.117121,31.075624],[121.112603,31.077628],[121.107264,31.082115],[121.102912,31.080219],[121.100687,31.080939],[121.099408,31.085941],[121.10084,31.088688],[121.097601,31.093534],[121.099519,31.094158],[121.099853,31.096593],[121.097976,31.099339],[121.100618,31.098428],[121.103843,31.100539],[121.103551,31.102638],[121.108751,31.107159],[121.112589,31.111932],[121.114368,31.109797],[121.11612,31.110973],[121.117733,31.108874],[121.120959,31.107747],[121.125505,31.103369],[121.127688,31.103309],[121.130691,31.100527],[121.131942,31.10205],[121.133319,31.099075],[121.135766,31.09808],[121.141605,31.09868],[121.141897,31.096893],[121.144483,31.097456],[121.14586,31.093954],[121.149461,31.095297],[121.151157,31.091651],[121.152867,31.092035],[121.153465,31.09014],[121.155161,31.090475],[121.155384,31.093162],[121.156733,31.09315],[121.156788,31.098943],[121.154341,31.098884],[121.154397,31.101846],[121.159569,31.100539],[121.165492,31.101438],[121.1652,31.104269],[121.166799,31.104293],[121.166451,31.10831],[121.170567,31.107819],[121.170497,31.109054],[121.174487,31.108538],[121.172986,31.114091],[121.17521,31.115242],[121.174321,31.117868],[121.17642,31.119007],[121.178839,31.117149],[121.183817,31.118695],[121.183858,31.124295],[121.181815,31.124295],[121.181842,31.126957],[121.180341,31.127425],[121.179868,31.131873],[121.181662,31.131777],[121.181968,31.143478],[121.194717,31.138179],[121.199653,31.139582],[121.201627,31.140937],[121.200348,31.137832],[121.206174,31.138299],[121.208287,31.135686],[121.22055,31.138383],[121.227988,31.139091],[121.226765,31.134139],[121.223581,31.126442],[121.221732,31.119931],[121.221301,31.115074],[121.224095,31.115146],[121.233884,31.117316],[121.235816,31.118959],[121.236831,31.125698],[121.239848,31.126238],[121.244534,31.125398],[121.245326,31.129295],[121.239348,31.129955],[121.245479,31.130758],[121.246995,31.134163],[121.25378,31.13264],[121.258048,31.132353],[121.257965,31.127077],[121.261607,31.127173],[121.26062,31.132269],[121.263623,31.135422],[121.26557,31.134787],[121.265737,31.136393],[121.280989,31.133252],[121.287482,31.139954],[121.284173,31.142627],[121.281781,31.142016],[121.279293,31.145708],[121.277012,31.144174],[121.276415,31.145852],[121.278723,31.14825],[121.277763,31.152265],[121.28028,31.150539],[121.283825,31.150839],[121.28313,31.152158],[121.285438,31.153452],[121.287134,31.152313],[121.295435,31.15392],[121.301441,31.15549],[121.316221,31.160189],[121.318056,31.157564],[121.320934,31.158487],[121.322491,31.162394],[121.323854,31.162933]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":310118,\"name\":\"青浦区\",\"center\":[121.113021,31.151209],\"centroid\":[121.085182,31.124658],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":310000},\"subFeatureIndex\":13,\"acroutes\":[100000,310000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[121.323854,31.162933],[121.322491,31.162394],[121.320934,31.158487],[121.318056,31.157564],[121.316221,31.160189],[121.301441,31.15549],[121.295435,31.15392],[121.287134,31.152313],[121.285438,31.153452],[121.28313,31.152158],[121.283825,31.150839],[121.28028,31.150539],[121.277763,31.152265],[121.278723,31.14825],[121.276415,31.145852],[121.277012,31.144174],[121.279293,31.145708],[121.281781,31.142016],[121.284173,31.142627],[121.287482,31.139954],[121.280989,31.133252],[121.265737,31.136393],[121.26557,31.134787],[121.263623,31.135422],[121.26062,31.132269],[121.261607,31.127173],[121.257965,31.127077],[121.258048,31.132353],[121.25378,31.13264],[121.246995,31.134163],[121.245479,31.130758],[121.239348,31.129955],[121.245326,31.129295],[121.244534,31.125398],[121.239848,31.126238],[121.236831,31.125698],[121.235816,31.118959],[121.233884,31.117316],[121.224095,31.115146],[121.221301,31.115074],[121.221732,31.119931],[121.223581,31.126442],[121.226765,31.134139],[121.227988,31.139091],[121.22055,31.138383],[121.208287,31.135686],[121.206174,31.138299],[121.200348,31.137832],[121.201627,31.140937],[121.199653,31.139582],[121.194717,31.138179],[121.181968,31.143478],[121.181662,31.131777],[121.179868,31.131873],[121.180341,31.127425],[121.181842,31.126957],[121.181815,31.124295],[121.183858,31.124295],[121.183817,31.118695],[121.178839,31.117149],[121.17642,31.119007],[121.174321,31.117868],[121.17521,31.115242],[121.172986,31.114091],[121.174487,31.108538],[121.170497,31.109054],[121.170567,31.107819],[121.166451,31.10831],[121.166799,31.104293],[121.1652,31.104269],[121.165492,31.101438],[121.159569,31.100539],[121.154397,31.101846],[121.154341,31.098884],[121.156788,31.098943],[121.156733,31.09315],[121.155384,31.093162],[121.155161,31.090475],[121.153465,31.09014],[121.152867,31.092035],[121.151157,31.091651],[121.149461,31.095297],[121.14586,31.093954],[121.144483,31.097456],[121.141897,31.096893],[121.141605,31.09868],[121.135766,31.09808],[121.133319,31.099075],[121.131942,31.10205],[121.130691,31.100527],[121.127688,31.103309],[121.125505,31.103369],[121.120959,31.107747],[121.117733,31.108874],[121.11612,31.110973],[121.114368,31.109797],[121.112589,31.111932],[121.108751,31.107159],[121.103551,31.102638],[121.103843,31.100539],[121.100618,31.098428],[121.097976,31.099339],[121.099853,31.096593],[121.099519,31.094158],[121.097601,31.093534],[121.10084,31.088688],[121.099408,31.085941],[121.100687,31.080939],[121.102912,31.080219],[121.107264,31.082115],[121.112603,31.077628],[121.117121,31.075624],[121.118386,31.075948],[121.121543,31.07019],[121.122238,31.067178],[121.126228,31.06665],[121.126395,31.059811],[121.127757,31.059751],[121.12588,31.057376],[121.120708,31.057268],[121.117997,31.058407],[121.118206,31.056068],[121.10864,31.05662],[121.10839,31.057939],[121.101813,31.05728],[121.101146,31.053644],[121.098337,31.05662],[121.094639,31.056332],[121.093012,31.058443],[121.094542,31.061899],[121.092929,31.064539],[121.088202,31.064671],[121.085935,31.062847],[121.086519,31.061167],[121.08442,31.058779],[121.080972,31.056896],[121.082404,31.054208],[121.085866,31.050224],[121.087159,31.052948],[121.089926,31.05194],[121.090259,31.048136],[121.09621,31.044812],[121.09311,31.040719],[121.095863,31.040479],[121.097767,31.038871],[121.100284,31.03341],[121.099936,31.031202],[121.096975,31.031454],[121.096405,31.026437],[121.091177,31.025933],[121.089509,31.027901],[121.085532,31.0255],[121.093026,31.020207],[121.10205,31.011756],[121.104205,31.007998],[121.104107,30.99508],[121.100145,30.994935],[121.099227,30.981979],[121.099686,30.980994],[121.099172,30.973068],[121.095557,30.974245],[121.095779,30.968408],[121.097489,30.965634],[121.093555,30.964673],[121.088035,30.964168],[121.088174,30.962151],[121.081236,30.962283],[121.080736,30.960181],[121.078539,30.960025],[121.079109,30.958283],[121.076634,30.957574],[121.076495,30.955809],[121.07231,30.955088],[121.065344,30.95516],[121.060339,30.956517],[121.059505,30.959184],[121.056891,30.96191],[121.05735,30.965346],[121.053262,30.964445],[121.051024,30.969369],[121.047409,30.969033],[121.0467,30.970246],[121.043112,30.969429],[121.045949,30.963448],[121.042626,30.960433],[121.043516,30.957514],[121.040401,30.956493],[121.036258,30.957094],[121.034659,30.952974],[121.033213,30.947111],[121.027902,30.945826],[121.028041,30.94394],[121.019462,30.941165],[121.016932,30.941333],[121.017697,30.939219],[121.015291,30.940288],[121.013831,30.944168],[121.011607,30.943604],[121.011079,30.947184],[121.013345,30.946811],[121.015361,30.948169],[121.010175,30.950727],[121.00763,30.947628],[121.002653,30.947015],[121.002055,30.95104],[120.99673,30.950307],[120.995368,30.950367],[120.994797,30.954824],[120.992531,30.955028],[120.991683,30.958211],[120.994756,30.958703],[120.992601,30.962835],[120.993699,30.964024],[120.991433,30.968372],[120.993143,30.972119],[120.99737,30.972444],[121.000512,30.973933],[121.000567,30.977007],[121.002361,30.97762],[121.000832,30.980466],[120.999344,30.980106],[120.997133,30.989232],[120.994603,30.991922],[120.994839,30.99526],[120.990515,30.994551],[120.989834,30.996664],[120.992045,30.997109],[120.992086,31.003424],[120.991057,31.00747],[120.991933,31.008154],[120.989987,31.010495],[120.989514,31.014397],[120.983855,31.014445],[120.982993,31.016089],[120.970202,31.016149],[120.963209,31.016594],[120.964849,31.019751],[120.964293,31.020771],[120.960483,31.021659],[120.958301,31.028573],[120.952197,31.030254],[120.951085,31.029077],[120.949124,31.029953],[120.948735,31.025068],[120.951168,31.024012],[120.949972,31.017638],[120.936305,31.01711],[120.935749,31.015381],[120.940087,31.010027],[120.938085,31.009007],[120.933789,31.010027],[120.931383,31.01178],[120.92699,31.012068],[120.926155,31.010423],[120.918105,31.012788],[120.911014,31.010555],[120.909944,31.012644],[120.910055,31.016942],[120.901365,31.017494],[120.900559,31.020423],[120.901338,31.0255],[120.901977,31.037647],[120.899739,31.039603],[120.897027,31.04558],[120.897208,31.04822],[120.895442,31.050332],[120.894567,31.053896],[120.894622,31.058659],[120.895915,31.063075],[120.898863,31.070514],[120.899614,31.07836],[120.904619,31.078528],[120.90473,31.080495],[120.901671,31.084094],[120.902116,31.085653],[120.899294,31.086937],[120.896694,31.086649],[120.895415,31.090703],[120.892175,31.094194],[120.892842,31.096533],[120.891216,31.09718],[120.891021,31.094302],[120.887476,31.094074],[120.878077,31.095753],[120.878967,31.09838],[120.876005,31.097864],[120.876631,31.099939],[120.873169,31.100323],[120.872543,31.098884],[120.869818,31.098943],[120.869582,31.097216],[120.865744,31.097624],[120.863993,31.100299],[120.859766,31.100287],[120.856804,31.102829],[120.857917,31.108526],[120.860225,31.10933],[120.862241,31.112508],[120.865967,31.11475],[120.870597,31.119715],[120.871014,31.123804],[120.872349,31.127161],[120.876422,31.131489],[120.881289,31.134727],[120.89921,31.136057],[120.905397,31.134211],[120.916923,31.136189],[120.93034,31.141404],[120.952642,31.138251],[120.983911,31.131705],[120.991252,31.13318],[121.007269,31.13342],[121.018489,31.134103],[121.022813,31.138311],[121.022271,31.140457],[121.025677,31.140769],[121.02672,31.143766],[121.028375,31.143874],[121.028778,31.141249],[121.033088,31.142208],[121.036119,31.140325],[121.036258,31.137376],[121.038649,31.136909],[121.041819,31.138899],[121.044781,31.145528],[121.041541,31.146931],[121.041472,31.14982],[121.045254,31.151582],[121.04542,31.154028],[121.049133,31.154615],[121.050273,31.150719],[121.055834,31.150659],[121.057378,31.152781],[121.062564,31.153129],[121.064135,31.150839],[121.066067,31.150947],[121.06572,31.148597],[121.069126,31.148705],[121.067777,31.152289],[121.072046,31.153512],[121.073839,31.157072],[121.077023,31.158451],[121.07605,31.160536],[121.076787,31.162622],[121.0737,31.161711],[121.07313,31.163257],[121.077371,31.16454],[121.075466,31.170316],[121.072379,31.169609],[121.072532,31.172701],[121.075424,31.173444],[121.074229,31.176225],[121.071406,31.179472],[121.071225,31.181462],[121.075591,31.182852],[121.074993,31.184386],[121.069474,31.182888],[121.068751,31.184889],[121.071684,31.185955],[121.07035,31.188735],[121.070614,31.1913],[121.07256,31.191527],[121.072185,31.193169],[121.070113,31.193612],[121.069599,31.195314],[121.06679,31.194966],[121.066609,31.197183],[121.069209,31.196524],[121.067805,31.201005],[121.065608,31.211871],[121.062633,31.224664],[121.0628,31.226964],[121.064719,31.227275],[121.064649,31.230785],[121.06718,31.230917],[121.067388,31.232929],[121.06458,31.232965],[121.062605,31.234689],[121.061243,31.237827],[121.063898,31.238438],[121.063565,31.242222],[121.064343,31.246138],[121.061646,31.24524],[121.057669,31.246749],[121.060979,31.246486],[121.061952,31.257945],[121.063245,31.267907],[121.068695,31.268098],[121.072741,31.26914],[121.080416,31.270158],[121.082154,31.271535],[121.084545,31.275713],[121.081361,31.277257],[121.084698,31.2876],[121.087326,31.290664],[121.086909,31.291717],[121.090134,31.291909],[121.093096,31.28821],[121.095404,31.287001],[121.09881,31.276251],[121.105442,31.273654],[121.103829,31.27533],[121.106666,31.276706],[121.111115,31.281746],[121.114994,31.285265],[121.117719,31.285684],[121.131053,31.280106],[121.131678,31.281363],[121.138032,31.278753],[121.137601,31.277592],[121.140535,31.276491],[121.142885,31.277664],[121.142996,31.275473],[121.150392,31.275437],[121.153743,31.276646],[121.153924,31.272061],[121.151783,31.267632],[121.155537,31.266147],[121.157845,31.270541],[121.161057,31.26762],[121.162614,31.269176],[121.167661,31.263944],[121.168036,31.259622],[121.170386,31.259119],[121.16894,31.256197],[121.171415,31.254928],[121.174251,31.256856],[121.176768,31.254605],[121.178798,31.255862],[121.17934,31.253419],[121.181537,31.254413],[121.183928,31.252246],[121.186444,31.252329],[121.188377,31.25476],[121.193021,31.253623],[121.193368,31.251455],[121.19626,31.251228],[121.19608,31.253395],[121.199848,31.255239],[121.203143,31.255814],[121.202865,31.257131],[121.206368,31.260065],[121.208482,31.25749],[121.209816,31.258017],[121.209761,31.260831],[121.212625,31.259837],[121.214182,31.254353],[121.221273,31.256293],[121.220216,31.257406],[121.223859,31.259035],[121.223539,31.260532],[121.229198,31.261717],[121.229087,31.262711],[121.235177,31.262699],[121.237693,31.262088],[121.242253,31.25937],[121.246577,31.259801],[121.246758,31.258448],[121.254183,31.258688],[121.247314,31.253287],[121.24591,31.248821],[121.241683,31.247348],[121.239932,31.241061],[121.241391,31.240222],[121.247912,31.240917],[121.249692,31.236534],[121.251082,31.238198],[121.252792,31.236965],[121.254155,31.23312],[121.257158,31.230701],[121.258006,31.226868],[121.256588,31.226329],[121.258215,31.222772],[121.25745,31.220208],[121.259675,31.218148],[121.261218,31.215081],[121.259397,31.212769],[121.263846,31.208912],[121.26468,31.206731],[121.263053,31.205701],[121.264777,31.203317],[121.266724,31.203257],[121.271701,31.198309],[121.277388,31.193576],[121.284034,31.194391],[121.287329,31.196332],[121.292126,31.200621],[121.292431,31.202514],[121.294837,31.203077],[121.297506,31.201412],[121.300565,31.197027],[121.30856,31.188388],[121.310784,31.18423],[121.316304,31.176836],[121.318042,31.173624],[121.318584,31.170256],[121.323854,31.162933]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":310120,\"name\":\"奉贤区\",\"center\":[121.458472,30.912345],\"centroid\":[121.56251,30.897998],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":310000},\"subFeatureIndex\":14,\"acroutes\":[100000,310000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[121.570475,30.998345],[121.576746,30.999474],[121.582933,30.999498],[121.584309,31.000819],[121.594682,31.000699],[121.595585,31.002043],[121.604066,31.001131],[121.614717,31.001251],[121.61772,30.995692],[121.62057,30.992678],[121.646695,30.99335],[121.654536,30.993254],[121.663115,30.992714],[121.669525,30.991609],[121.673348,30.989832],[121.674558,30.991802],[121.683595,30.989808],[121.688086,30.990145],[121.69298,30.98934],[121.699459,30.987419],[121.705507,30.984981],[121.712792,30.980934],[121.73191,30.967784],[121.733954,30.964469],[121.737916,30.960637],[121.73686,30.958703],[121.739988,30.956721],[121.743742,30.956589],[121.747857,30.951893],[121.749234,30.953046],[121.751987,30.952721],[121.759286,30.949154],[121.761024,30.947604],[121.760927,30.944613],[121.764542,30.941766],[121.761677,30.940132],[121.761469,30.938414],[121.764277,30.938522],[121.763846,30.936852],[121.766432,30.936539],[121.76799,30.93833],[121.769769,30.935278],[121.773023,30.933932],[121.77337,30.931553],[121.777806,30.931025],[121.777653,30.926723],[121.781115,30.917567],[121.780239,30.911811],[121.77896,30.910116],[121.778334,30.903807],[121.778987,30.899468],[121.778807,30.894588],[121.776012,30.886426],[121.776679,30.881005],[121.773134,30.880596],[121.772481,30.875703],[121.771605,30.875427],[121.768143,30.863272],[121.769338,30.85043],[121.793767,30.816862],[121.77914,30.817222],[121.727071,30.817716],[121.68119,30.818401],[121.648419,30.8162],[121.601327,30.805084],[121.552832,30.789395],[121.517197,30.775387],[121.478767,30.756347],[121.465072,30.776483],[121.451711,30.798323],[121.44672,30.805577],[121.445427,30.804868],[121.441645,30.806829],[121.437029,30.818101],[121.425989,30.81869],[121.420525,30.819797],[121.419288,30.81602],[121.415131,30.815803],[121.41552,30.819941],[121.414171,30.821757],[121.41235,30.821505],[121.404786,30.823081],[121.400991,30.827399],[121.400685,30.830105],[121.403632,30.829877],[121.404202,30.833797],[121.399712,30.834182],[121.397376,30.833292],[121.396986,30.827988],[121.392051,30.82782],[121.391717,30.829913],[121.387588,30.829864],[121.387588,30.832799],[121.383764,30.833906],[121.379259,30.840112],[121.379065,30.843238],[121.385446,30.843178],[121.384918,30.848073],[121.383722,30.851765],[121.384376,30.856238],[121.383472,30.859232],[121.384001,30.863488],[121.381929,30.863765],[121.381873,30.867324],[121.38286,30.869043],[121.382791,30.874489],[121.381498,30.876605],[121.382207,30.878961],[121.377535,30.879983],[121.371751,30.883698],[121.370166,30.883914],[121.367233,30.886667],[121.36327,30.886955],[121.361185,30.892977],[121.360476,30.897785],[121.358418,30.900598],[121.35668,30.908614],[121.351814,30.913217],[121.355081,30.916341],[121.356054,30.919742],[121.355373,30.921388],[121.352161,30.923803],[121.352203,30.928213],[121.35116,30.930628],[121.355679,30.932058],[121.354706,30.933512],[121.357361,30.933632],[121.359336,30.935086],[121.362658,30.934761],[121.362408,30.939122],[121.361129,30.944048],[121.363868,30.945165],[121.365467,30.947232],[121.362478,30.948901],[121.362255,30.9517],[121.363117,30.956109],[121.362853,30.959544],[121.36099,30.965574],[121.361435,30.970438],[121.359961,30.976251],[121.35871,30.97786],[121.375227,30.982832],[121.394261,30.988247],[121.409333,30.990229],[121.413184,30.991069],[121.423973,30.994515],[121.431426,30.999174],[121.433636,31.001779],[121.436834,31.00406],[121.440811,31.005789],[121.448305,31.007458],[121.459942,31.007398],[121.465587,31.008755],[121.47144,31.011948],[121.476362,31.01334],[121.485872,31.014073],[121.489153,31.014949],[121.492879,31.012752],[121.491948,31.010039],[121.495924,30.998297],[121.498872,30.998213],[121.49883,30.999426],[121.503057,31.002716],[121.507881,31.004745],[121.510412,31.004553],[121.517002,31.007626],[121.520853,31.004445],[121.522105,31.002199],[121.520089,31.00256],[121.520325,30.999354],[121.522897,30.99981],[121.528612,30.99592],[121.531962,30.994815],[121.534507,30.995848],[121.537774,30.994683],[121.538233,30.993146],[121.543294,30.994203],[121.54613,30.99305],[121.549537,30.988307],[121.55279,30.98886],[121.553304,30.993026],[121.556224,30.993374],[121.555918,30.995152],[121.561494,30.995644],[121.570475,30.998345]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":310151,\"name\":\"崇明区\",\"center\":[121.397516,31.626946],\"centroid\":[121.568484,31.635916],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":310000},\"subFeatureIndex\":15,\"acroutes\":[100000,310000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[121.975181,31.617034],[121.98825,31.529597],[121.993867,31.51189],[121.995716,31.493104],[121.991698,31.476763],[121.981813,31.4641],[121.967284,31.456656],[121.934304,31.442364],[121.918051,31.434692],[121.901144,31.430126],[121.89055,31.428788],[121.882096,31.428656],[121.87299,31.429338],[121.857807,31.430043],[121.845377,31.431895],[121.834212,31.433975],[121.819183,31.438206],[121.763443,31.458233],[121.72988,31.471973],[121.682858,31.491061],[121.670609,31.494214],[121.638645,31.49972],[121.625784,31.501775],[121.617678,31.503673],[121.608794,31.50691],[121.547673,31.531125],[121.471176,31.57443],[121.43422,31.590336],[121.414797,31.591076],[121.403521,31.590002],[121.395457,31.585444],[121.37221,31.55321],[121.345585,31.571685],[121.289109,31.616283],[121.179868,31.720774],[121.145332,31.753927],[121.142064,31.755308],[121.118498,31.759084],[121.149225,31.787294],[121.181509,31.820411],[121.200334,31.835144],[121.225305,31.847043],[121.242073,31.853397],[121.252111,31.857727],[121.265584,31.864128],[121.281336,31.869041],[121.291166,31.870992],[121.3019,31.872716],[121.310367,31.872502],[121.315859,31.871479],[121.323061,31.868529],[121.369291,31.843283],[121.376381,31.838571],[121.385043,31.833525],[121.395388,31.821291],[121.399142,31.817483],[121.405468,31.809841],[121.411488,31.806341],[121.416312,31.79764],[121.410904,31.79558],[121.420915,31.779602],[121.425781,31.774267],[121.431481,31.769266],[121.445385,31.7643],[121.449751,31.761668],[121.455576,31.759346],[121.464141,31.757142],[121.476807,31.756142],[121.487749,31.753415],[121.498566,31.75326],[121.51304,31.743695],[121.514986,31.742873],[121.526693,31.740217],[121.528361,31.738347],[121.539429,31.735499],[121.540124,31.733307],[121.549509,31.726969],[121.551386,31.727386],[121.565025,31.716711],[121.578539,31.710527],[121.592262,31.706487],[121.593249,31.705379],[121.599659,31.703115],[121.60091,31.707],[121.602746,31.70694],[121.611755,31.704283],[121.627341,31.697776],[121.633278,31.696167],[121.642649,31.697454],[121.715267,31.673842],[121.817806,31.652025],[121.887616,31.63638],[121.975181,31.617034]]],[[[121.778862,31.310196],[121.770951,31.31168],[121.76425,31.315306],[121.76076,31.320344],[121.751166,31.337801],[121.744659,31.343675],[121.740766,31.346486],[121.727933,31.354799],[121.686682,31.376591],[121.641036,31.401115],[121.601425,31.421855],[121.590371,31.427545],[121.572255,31.436066],[121.558463,31.448793],[121.549773,31.457062],[121.54328,31.462403],[121.537413,31.466704],[121.529515,31.471172],[121.516849,31.477313],[121.510134,31.482581],[121.509105,31.485352],[121.509355,31.489795],[121.513457,31.493355],[121.516933,31.494298],[121.521132,31.493976],[121.549926,31.489747],[121.562356,31.486367],[121.567347,31.4835],[121.572811,31.469452],[121.575828,31.463813],[121.58303,31.456262],[121.585561,31.454672],[121.599812,31.450681],[121.606319,31.449403],[121.621752,31.444145],[121.673835,31.427748],[121.688294,31.425883],[121.697193,31.423995],[121.708316,31.419728],[121.723707,31.412364],[121.729296,31.410356],[121.737485,31.408814],[121.742185,31.407212],[121.753725,31.400362],[121.760857,31.395185],[121.76938,31.390749],[121.774135,31.386982],[121.780572,31.380154],[121.787886,31.37164],[121.790875,31.367059],[121.792377,31.363304],[121.793002,31.355074],[121.796005,31.345624],[121.796478,31.33542],[121.795866,31.329976],[121.794073,31.319542],[121.790986,31.314313],[121.7879,31.312003],[121.782004,31.310328],[121.778862,31.310196]]],[[[122.242018,31.419082],[122.245369,31.421318],[122.247149,31.419333],[122.243562,31.417839],[122.242018,31.419082]]],[[[121.801775,31.356976],[121.800566,31.363997],[121.797674,31.369642],[121.792808,31.377571],[121.793864,31.380477],[121.796756,31.381075],[121.803458,31.381219],[121.817445,31.380585],[121.824744,31.378588],[121.828401,31.376447],[121.831752,31.375526],[121.845586,31.374582],[121.852885,31.371376],[121.858516,31.369379],[121.870376,31.366007],[121.913074,31.350445],[121.951726,31.337274],[122.001556,31.329246],[122.04107,31.323814],[122.078012,31.323527],[122.116678,31.321229],[122.121975,31.315438],[122.122684,31.307205],[122.105207,31.262136],[122.097769,31.255658],[122.087285,31.257538],[122.072005,31.266829],[122.016447,31.282285],[121.975779,31.279998],[121.932261,31.283147],[121.900755,31.291167],[121.88959,31.292028],[121.865968,31.294937],[121.860782,31.294949],[121.856681,31.292818],[121.852885,31.292364],[121.840566,31.29544],[121.833601,31.299653],[121.832043,31.301711],[121.822617,31.307372],[121.81319,31.316228],[121.806642,31.324173],[121.80375,31.328445],[121.803152,31.332106],[121.802693,31.342789],[121.801775,31.356976]]],[[[121.627049,31.444993],[121.616872,31.446643],[121.613855,31.447885],[121.594153,31.458568],[121.58627,31.464076],[121.577886,31.472486],[121.57612,31.474768],[121.575814,31.478197],[121.577149,31.479343],[121.586896,31.479535],[121.595293,31.478292],[121.602134,31.476835],[121.608571,31.474446],[121.61366,31.471339],[121.625172,31.462212],[121.631609,31.456823],[121.635044,31.452988],[121.636295,31.449881],[121.634001,31.445937],[121.631512,31.445101],[121.627049,31.444993]]]]}}]}', 'admin', '2020-12-07 19:24:11', NULL, '2020-12-07 19:24:11', '0', NULL); +INSERT INTO `jimu_report_map` VALUES ('1336859680042913794', '北京', 'beijing', '{\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"properties\":{\"adcode\":110101,\"name\":\"东城区\",\"center\":[116.418757,39.917544],\"centroid\":[116.416739,39.912912],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":110000},\"subFeatureIndex\":0,\"acroutes\":[100000,110000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[116.387658,39.96093],[116.389498,39.96314],[116.40788,39.962182],[116.407504,39.973995],[116.411101,39.97146],[116.411415,39.964928],[116.414196,39.962182],[116.424861,39.962279],[116.429002,39.957274],[116.429483,39.950155],[116.436698,39.949245],[116.435422,39.952121],[116.442239,39.9497],[116.440566,39.945295],[116.446338,39.946205],[116.443703,39.936663],[116.443682,39.928664],[116.434314,39.92868],[116.434983,39.913964],[116.436488,39.902042],[116.448722,39.903246],[116.446819,39.900042],[116.447154,39.894186],[116.450876,39.894088],[116.450939,39.890249],[116.444059,39.890038],[116.445648,39.879283],[116.44364,39.87284],[116.442574,39.87188],[116.423209,39.872824],[116.413652,39.871148],[116.41589,39.863645],[116.41246,39.858942],[116.406856,39.859967],[116.3955,39.858682],[116.394956,39.862734],[116.387888,39.867372],[116.380632,39.866054],[116.38059,39.871148],[116.399097,39.872205],[116.397612,39.898675],[116.396086,39.89944],[116.395563,39.907995],[116.392259,39.907881],[116.392175,39.92242],[116.399474,39.923574],[116.396692,39.928306],[116.396169,39.94006],[116.394266,39.940629],[116.393723,39.957371],[116.38678,39.957014],[116.387658,39.96093]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":110102,\"name\":\"西城区\",\"center\":[116.366794,39.915309],\"centroid\":[116.365684,39.912236],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":110000},\"subFeatureIndex\":1,\"acroutes\":[100000,110000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[116.380903,39.972712],[116.394099,39.972858],[116.394162,39.969397],[116.390084,39.968406],[116.387658,39.96093],[116.38678,39.957014],[116.393723,39.957371],[116.394266,39.940629],[116.396169,39.94006],[116.396692,39.928306],[116.399474,39.923574],[116.392175,39.92242],[116.392259,39.907881],[116.395563,39.907995],[116.396086,39.89944],[116.397612,39.898675],[116.399097,39.872205],[116.38059,39.871148],[116.35058,39.86869],[116.349472,39.873588],[116.344286,39.873653],[116.341567,39.876159],[116.335273,39.875183],[116.326636,39.876859],[116.321345,39.875004],[116.325799,39.896789],[116.337301,39.89739],[116.335356,39.898448],[116.334645,39.922664],[116.333056,39.938565],[116.327953,39.942369],[116.332889,39.944092],[116.341442,39.941979],[116.35171,39.94375],[116.351814,39.950854],[116.355265,39.951796],[116.35698,39.944466],[116.371974,39.948594],[116.370384,39.967902],[116.380401,39.968178],[116.380903,39.972712]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":110105,\"name\":\"朝阳区\",\"center\":[116.486409,39.921489],\"centroid\":[116.513687,39.951064],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":110000},\"subFeatureIndex\":2,\"acroutes\":[100000,110000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[116.595548,40.01751],[116.60132,40.013873],[116.61989,40.011794],[116.628129,40.007653],[116.625766,40.003122],[116.63273,39.999825],[116.637582,40.002359],[116.642684,39.996755],[116.643751,39.989608],[116.640321,39.990177],[116.639129,39.986879],[116.63365,39.986197],[116.634026,39.981696],[116.639819,39.982606],[116.641827,39.969575],[116.643081,39.952983],[116.645277,39.945977],[116.632228,39.950545],[116.630492,39.946156],[116.633441,39.940906],[116.629677,39.938727],[116.6293,39.931314],[116.624156,39.929981],[116.630576,39.921672],[116.620956,39.923103],[116.623006,39.913818],[116.620245,39.90767],[116.623361,39.904271],[116.621019,39.898854],[116.61531,39.895503],[116.615603,39.889794],[116.627585,39.890477],[116.628987,39.881594],[116.624323,39.881155],[116.62493,39.87725],[116.619994,39.868951],[116.626958,39.860683],[116.613449,39.850185],[116.604185,39.850071],[116.604666,39.846132],[116.608367,39.846539],[116.601905,39.840727],[116.60224,39.831675],[116.598977,39.831659],[116.599228,39.825585],[116.59147,39.826367],[116.591595,39.823875],[116.583732,39.824917],[116.587015,39.828223],[116.577479,39.827539],[116.577145,39.830682],[116.569386,39.833498],[116.558596,39.834687],[116.543664,39.835078],[116.542681,39.830209],[116.533187,39.832733],[116.538143,39.828207],[116.534944,39.82482],[116.525868,39.826904],[116.525366,39.829754],[116.516164,39.829835],[116.510602,39.827637],[116.510142,39.821449],[116.502801,39.819006],[116.505813,39.817866],[116.498201,39.8157],[116.495357,39.818795],[116.485632,39.816889],[116.485256,39.81272],[116.474256,39.809772],[116.468463,39.814511],[116.462775,39.815945],[116.452737,39.823012],[116.443912,39.82096],[116.44592,39.826692],[116.436677,39.827425],[116.43699,39.830649],[116.430068,39.830112],[116.425217,39.831903],[116.432055,39.832929],[116.436739,39.841329],[116.440587,39.839653],[116.442323,39.843674],[116.446694,39.84426],[116.445983,39.848329],[116.450479,39.848704],[116.451148,39.852008],[116.460308,39.848622],[116.467794,39.856012],[116.463319,39.856224],[116.456062,39.86122],[116.454222,39.859381],[116.448178,39.863645],[116.446359,39.860862],[116.442971,39.866087],[116.44364,39.87284],[116.445648,39.879283],[116.444059,39.890038],[116.450939,39.890249],[116.450876,39.894088],[116.447154,39.894186],[116.446819,39.900042],[116.448722,39.903246],[116.436488,39.902042],[116.434983,39.913964],[116.434314,39.92868],[116.443682,39.928664],[116.443703,39.936663],[116.446338,39.946205],[116.440566,39.945295],[116.442239,39.9497],[116.435422,39.952121],[116.436698,39.949245],[116.429483,39.950155],[116.429002,39.957274],[116.424861,39.962279],[116.414196,39.962182],[116.411415,39.964928],[116.411101,39.97146],[116.407504,39.973995],[116.40788,39.962182],[116.389498,39.96314],[116.387658,39.96093],[116.390084,39.968406],[116.394162,39.969397],[116.394099,39.972858],[116.380903,39.972712],[116.381196,39.977976],[116.376554,39.992971],[116.350873,40.0267],[116.378708,40.031181],[116.395103,40.032854],[116.390251,40.036587],[116.390649,40.041279],[116.39297,40.041733],[116.395333,40.036766],[116.405266,40.038974],[116.408884,40.043291],[116.406124,40.049768],[116.409595,40.055626],[116.415618,40.056],[116.433268,40.06228],[116.442867,40.061323],[116.451629,40.058759],[116.45142,40.06129],[116.459408,40.059992],[116.462127,40.06731],[116.458635,40.070377],[116.458823,40.075796],[116.462608,40.076786],[116.461855,40.080825],[116.466247,40.08235],[116.466832,40.090185],[116.471015,40.08939],[116.473545,40.085562],[116.482935,40.083745],[116.486657,40.081036],[116.49933,40.080387],[116.506775,40.074352],[116.513948,40.070426],[116.525993,40.071334],[116.534379,40.066791],[116.543183,40.059408],[116.547784,40.062718],[116.551757,40.059765],[116.552761,40.05488],[116.54655,40.048956],[116.550753,40.045499],[116.564242,40.039655],[116.570474,40.032431],[116.578797,40.033097],[116.577814,40.027512],[116.595548,40.01751]]],[[[116.603683,40.052949],[116.598517,40.052543],[116.601633,40.047658],[116.599417,40.047171],[116.599814,40.041408],[116.590006,40.043616],[116.591198,40.051796],[116.587957,40.05053],[116.590131,40.056162],[116.586597,40.074336],[116.58139,40.073817],[116.581411,40.067846],[116.578149,40.076461],[116.574322,40.096138],[116.574071,40.107815],[116.578316,40.102739],[116.580365,40.088352],[116.595903,40.090218],[116.598705,40.09351],[116.598392,40.103874],[116.602909,40.093883],[116.603473,40.086811],[116.608409,40.054912],[116.603683,40.052949]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":110106,\"name\":\"丰台区\",\"center\":[116.286968,39.863642],\"centroid\":[116.250298,39.83569],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":110000},\"subFeatureIndex\":3,\"acroutes\":[100000,110000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[116.167033,39.888752],[116.179099,39.882684],[116.19035,39.881529],[116.199426,39.883286],[116.20457,39.879885],[116.208126,39.874125],[116.212099,39.874679],[116.210907,39.878079],[116.219105,39.876713],[116.219523,39.881334],[116.222952,39.883986],[116.22772,39.883839],[116.227783,39.889078],[116.234642,39.88955],[116.233534,39.89212],[116.252899,39.896382],[116.259089,39.896658],[116.266199,39.896252],[116.294975,39.896496],[116.294995,39.886735],[116.29922,39.889566],[116.30656,39.890883],[116.30449,39.892478],[116.313189,39.896772],[116.325799,39.896789],[116.321345,39.875004],[116.326636,39.876859],[116.335273,39.875183],[116.341567,39.876159],[116.344286,39.873653],[116.349472,39.873588],[116.35058,39.86869],[116.38059,39.871148],[116.380632,39.866054],[116.387888,39.867372],[116.394956,39.862734],[116.3955,39.858682],[116.406856,39.859967],[116.41246,39.858942],[116.41589,39.863645],[116.413652,39.871148],[116.423209,39.872824],[116.442574,39.87188],[116.44364,39.87284],[116.442971,39.866087],[116.446359,39.860862],[116.448178,39.863645],[116.454222,39.859381],[116.456062,39.86122],[116.463319,39.856224],[116.467794,39.856012],[116.460308,39.848622],[116.451148,39.852008],[116.450479,39.848704],[116.445983,39.848329],[116.446694,39.84426],[116.442323,39.843674],[116.440587,39.839653],[116.436739,39.841329],[116.432055,39.832929],[116.425217,39.831903],[116.420072,39.826611],[116.415785,39.829428],[116.414426,39.824282],[116.418441,39.822915],[116.419759,39.815375],[116.41016,39.817052],[116.410013,39.811336],[116.415262,39.812525],[116.417772,39.81013],[116.422456,39.81044],[116.425719,39.805358],[116.429399,39.803583],[116.429274,39.794102],[116.421034,39.794134],[116.42024,39.787439],[116.396023,39.786738],[116.397905,39.781068],[116.398888,39.765864],[116.391903,39.765277],[116.390649,39.780465],[116.385609,39.778852],[116.379209,39.77939],[116.378478,39.785646],[116.367582,39.784962],[116.365742,39.794151],[116.368189,39.794819],[116.367039,39.79982],[116.356833,39.800471],[116.355704,39.805668],[116.341755,39.807589],[116.340124,39.802149],[116.328225,39.801416],[116.326824,39.798386],[116.322872,39.798386],[116.321784,39.783626],[116.317978,39.783447],[116.31068,39.772057],[116.307062,39.770085],[116.301541,39.774941],[116.295205,39.790958],[116.291148,39.793271],[116.296083,39.795568],[116.289182,39.795894],[116.287237,39.799103],[116.27423,39.796936],[116.262184,39.792782],[116.259298,39.797621],[116.251519,39.793059],[116.250933,39.801432],[116.25361,39.807231],[116.251644,39.81329],[116.244304,39.818567],[116.243007,39.825145],[116.23962,39.826872],[116.228306,39.827197],[116.227219,39.825048],[116.214127,39.824706],[116.214462,39.818974],[116.216762,39.816905],[116.207415,39.810814],[116.208063,39.806352],[116.201852,39.799657],[116.201852,39.788269],[116.200388,39.778151],[116.194449,39.778493],[116.194407,39.780579],[116.188008,39.781785],[116.183365,39.780204],[116.182989,39.783707],[116.16971,39.784278],[116.166113,39.775039],[116.159923,39.767494],[116.150554,39.766565],[116.143444,39.764381],[116.133427,39.766336],[116.12847,39.762409],[116.121465,39.761626],[116.117491,39.77336],[116.121486,39.779047],[116.124351,39.77675],[116.127467,39.779047],[116.132569,39.778624],[116.131503,39.783121],[116.125062,39.785353],[116.120754,39.784848],[116.119792,39.789654],[116.106366,39.788612],[116.107014,39.78532],[116.101368,39.78576],[116.094613,39.781557],[116.091581,39.784082],[116.091916,39.787927],[116.0856,39.795324],[116.087127,39.803289],[116.084826,39.811596],[116.086186,39.816401],[116.089594,39.816352],[116.088214,39.82692],[116.089741,39.829721],[116.085747,39.832163],[116.084366,39.828581],[116.078615,39.831593],[116.07619,39.837015],[116.068975,39.840792],[116.061488,39.841899],[116.05465,39.845953],[116.056553,39.85095],[116.070982,39.853717],[116.070188,39.860423],[116.067344,39.865761],[116.07046,39.868446],[116.078323,39.870318],[116.087169,39.866152],[116.095826,39.869032],[116.104149,39.868837],[116.105425,39.872547],[116.112242,39.873247],[116.119729,39.877477],[116.125898,39.877949],[116.13167,39.881268],[116.147605,39.885287],[116.150972,39.884051],[116.156137,39.889029],[116.163352,39.886881],[116.167033,39.888752]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":110107,\"name\":\"石景山区\",\"center\":[116.195445,39.914601],\"centroid\":[116.176243,39.9332],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":110000},\"subFeatureIndex\":4,\"acroutes\":[100000,110000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[116.259089,39.896658],[116.252899,39.896382],[116.233534,39.89212],[116.234642,39.88955],[116.227783,39.889078],[116.22772,39.883839],[116.222952,39.883986],[116.219523,39.881334],[116.219105,39.876713],[116.210907,39.878079],[116.212099,39.874679],[116.208126,39.874125],[116.20457,39.879885],[116.199426,39.883286],[116.19035,39.881529],[116.179099,39.882684],[116.167033,39.888752],[116.161094,39.896805],[116.153503,39.900985],[116.152792,39.906629],[116.146852,39.910077],[116.139282,39.922095],[116.13029,39.924518],[116.127341,39.926615],[116.127822,39.930338],[116.124769,39.934907],[116.119875,39.932761],[116.11195,39.942921],[116.114522,39.949196],[116.120545,39.951],[116.115254,39.957745],[116.120712,39.96119],[116.122971,39.967561],[116.116592,39.971932],[116.113455,39.981518],[116.118934,39.986115],[116.144678,39.989186],[116.151579,39.993442],[116.156117,39.989137],[116.158124,39.984133],[116.166845,39.987561],[116.169229,39.979357],[116.171487,39.977001],[116.178012,39.982216],[116.178911,39.988292],[116.186586,39.983906],[116.18531,39.977976],[116.185812,39.970274],[116.190685,39.968259],[116.190747,39.965367],[116.20112,39.961109],[116.212831,39.948952],[116.215466,39.94375],[116.216281,39.936386],[116.213186,39.933232],[116.216198,39.931233],[116.213061,39.928891],[116.215696,39.927103],[116.207707,39.9259],[116.206787,39.916663],[116.230899,39.919525],[116.232426,39.91694],[116.237696,39.918452],[116.250975,39.919834],[116.252983,39.915558],[116.252983,39.896951],[116.259089,39.896658]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":110108,\"name\":\"海淀区\",\"center\":[116.310316,39.956074],\"centroid\":[116.233161,40.026971],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":110000},\"subFeatureIndex\":5,\"acroutes\":[100000,110000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[116.259089,39.896658],[116.252983,39.896951],[116.252983,39.915558],[116.250975,39.919834],[116.237696,39.918452],[116.232426,39.91694],[116.230899,39.919525],[116.206787,39.916663],[116.207707,39.9259],[116.215696,39.927103],[116.213061,39.928891],[116.216198,39.931233],[116.213186,39.933232],[116.216281,39.936386],[116.215466,39.94375],[116.212831,39.948952],[116.20112,39.961109],[116.190747,39.965367],[116.190685,39.968259],[116.185812,39.970274],[116.18531,39.977976],[116.186586,39.983906],[116.178911,39.988292],[116.178012,39.982216],[116.171487,39.977001],[116.169229,39.979357],[116.166845,39.987561],[116.158124,39.984133],[116.156117,39.989137],[116.151579,39.993442],[116.154527,39.997275],[116.161658,39.999987],[116.172115,40.000637],[116.175335,40.006403],[116.164774,40.014328],[116.163938,40.016796],[116.157309,40.021034],[116.149278,40.022154],[116.140098,40.02873],[116.129558,40.0311],[116.123598,40.029655],[116.114522,40.033],[116.105488,40.032204],[116.098398,40.033811],[116.095073,40.031782],[116.084241,40.030905],[116.078176,40.032756],[116.075123,40.039915],[116.068055,40.051926],[116.071129,40.062037],[116.064981,40.067456],[116.064019,40.073022],[116.054587,40.07823],[116.051325,40.084345],[116.048878,40.085303],[116.051848,40.091661],[116.055905,40.09643],[116.061969,40.09956],[116.062931,40.10282],[116.069456,40.104912],[116.072676,40.109258],[116.073847,40.115436],[116.077883,40.115047],[116.08445,40.120252],[116.089783,40.119327],[116.096056,40.121257],[116.102246,40.115987],[116.105864,40.118014],[116.113309,40.115598],[116.127676,40.116393],[116.132214,40.115079],[116.132925,40.121354],[116.152708,40.121776],[116.169563,40.124564],[116.167409,40.128455],[116.17178,40.127936],[116.168622,40.135442],[116.167681,40.141844],[116.174122,40.143595],[116.180417,40.14729],[116.183094,40.153335],[116.182696,40.158099],[116.192065,40.155669],[116.194282,40.160076],[116.202166,40.160984],[116.203211,40.153773],[116.205658,40.150175],[116.206285,40.143092],[116.212224,40.140548],[116.215445,40.143174],[116.233785,40.136577],[116.247043,40.136204],[116.245036,40.118825],[116.241836,40.118403],[116.243363,40.113279],[116.240498,40.108009],[116.245956,40.10535],[116.252732,40.106517],[116.255868,40.104474],[116.25957,40.106907],[116.258022,40.11195],[116.263334,40.110588],[116.263899,40.10402],[116.258273,40.101522],[116.265237,40.094694],[116.27333,40.09557],[116.2731,40.092699],[116.279897,40.079754],[116.290353,40.083145],[116.302942,40.060803],[116.305995,40.063043],[116.309446,40.060609],[116.318292,40.061663],[116.325946,40.054799],[116.338828,40.058921],[116.340271,40.055091],[116.343366,40.055448],[116.342676,40.059635],[116.346963,40.06043],[116.34667,40.063659],[116.357293,40.066012],[116.363023,40.065931],[116.363149,40.068965],[116.372538,40.06843],[116.373354,40.065623],[116.381928,40.066402],[116.382848,40.061582],[116.379272,40.059002],[116.372267,40.05785],[116.372999,40.054344],[116.367394,40.053436],[116.36959,40.04696],[116.376114,40.045466],[116.376888,40.042756],[116.38519,40.042853],[116.390649,40.041279],[116.390251,40.036587],[116.395103,40.032854],[116.378708,40.031181],[116.350873,40.0267],[116.376554,39.992971],[116.381196,39.977976],[116.380903,39.972712],[116.380401,39.968178],[116.370384,39.967902],[116.371974,39.948594],[116.35698,39.944466],[116.355265,39.951796],[116.351814,39.950854],[116.35171,39.94375],[116.341442,39.941979],[116.332889,39.944092],[116.327953,39.942369],[116.333056,39.938565],[116.334645,39.922664],[116.335356,39.898448],[116.337301,39.89739],[116.325799,39.896789],[116.313189,39.896772],[116.30449,39.892478],[116.30656,39.890883],[116.29922,39.889566],[116.294995,39.886735],[116.294975,39.896496],[116.266199,39.896252],[116.259089,39.896658]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":110109,\"name\":\"门头沟区\",\"center\":[116.105381,39.937183],\"centroid\":[115.791703,39.994114],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":110000},\"subFeatureIndex\":6,\"acroutes\":[100000,110000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[115.853348,40.149332],[115.856547,40.147468],[115.865184,40.148635],[115.870768,40.144276],[115.874155,40.14387],[115.8816,40.139073],[115.900442,40.138716],[115.904457,40.136123],[115.906549,40.138181],[115.921438,40.134485],[115.933588,40.124824],[115.947913,40.107409],[115.943229,40.103339],[115.952681,40.10102],[115.956717,40.096041],[115.957449,40.100679],[115.962552,40.10235],[115.962092,40.094419],[115.960461,40.092456],[115.966588,40.084556],[115.968575,40.075488],[115.977232,40.079041],[115.979993,40.081669],[115.986434,40.083469],[115.99735,40.082074],[116.005129,40.079803],[116.007785,40.080614],[116.020856,40.074579],[116.030914,40.082188],[116.033926,40.079657],[116.037899,40.084524],[116.043775,40.083502],[116.048878,40.085303],[116.051325,40.084345],[116.054587,40.07823],[116.064019,40.073022],[116.064981,40.067456],[116.071129,40.062037],[116.068055,40.051926],[116.075123,40.039915],[116.078176,40.032756],[116.084241,40.030905],[116.095073,40.031782],[116.098398,40.033811],[116.105488,40.032204],[116.114522,40.033],[116.123598,40.029655],[116.129558,40.0311],[116.140098,40.02873],[116.149278,40.022154],[116.157309,40.021034],[116.163938,40.016796],[116.164774,40.014328],[116.175335,40.006403],[116.172115,40.000637],[116.161658,39.999987],[116.154527,39.997275],[116.151579,39.993442],[116.144678,39.989186],[116.118934,39.986115],[116.113455,39.981518],[116.116592,39.971932],[116.122971,39.967561],[116.120712,39.96119],[116.115254,39.957745],[116.120545,39.951],[116.114522,39.949196],[116.11195,39.942921],[116.119875,39.932761],[116.124769,39.934907],[116.127822,39.930338],[116.127341,39.926615],[116.13029,39.924518],[116.139282,39.922095],[116.146852,39.910077],[116.152792,39.906629],[116.153503,39.900985],[116.161094,39.896805],[116.167033,39.888752],[116.163352,39.886881],[116.156137,39.889029],[116.150972,39.884051],[116.147605,39.885287],[116.13167,39.881268],[116.125898,39.877949],[116.119729,39.877477],[116.112242,39.873247],[116.105425,39.872547],[116.104149,39.868837],[116.095826,39.869032],[116.087169,39.866152],[116.078323,39.870318],[116.07046,39.868446],[116.067344,39.865761],[116.070188,39.860423],[116.070982,39.853717],[116.056553,39.85095],[116.05465,39.845953],[116.045825,39.84732],[116.04181,39.844878],[116.033089,39.845904],[116.030308,39.843462],[116.021023,39.840662],[116.018367,39.841525],[116.016694,39.849225],[116.00789,39.849469],[115.991285,39.840222],[115.98428,39.849111],[115.98817,39.859837],[115.986789,39.864703],[115.992875,39.867356],[115.997245,39.875167],[115.990177,39.876338],[115.97627,39.870497],[115.976563,39.868251],[115.968742,39.867714],[115.967822,39.872059],[115.961318,39.867877],[115.954145,39.866786],[115.949837,39.871278],[115.92744,39.876192],[115.921856,39.884164],[115.935805,39.898236],[115.944965,39.901847],[115.945697,39.910972],[115.941159,39.917509],[115.935868,39.917753],[115.927858,39.914257],[115.903935,39.914029],[115.890112,39.917281],[115.87884,39.915964],[115.87311,39.912484],[115.868321,39.905572],[115.860897,39.901359],[115.845255,39.897049],[115.838772,39.900644],[115.835112,39.899586],[115.826914,39.910581],[115.8188,39.913948],[115.811084,39.913785],[115.806839,39.919656],[115.797344,39.92216],[115.792848,39.920859],[115.774257,39.920599],[115.769385,39.925233],[115.76148,39.920989],[115.749622,39.917655],[115.74889,39.9152],[115.731261,39.907865],[115.721621,39.906824],[115.719592,39.904612],[115.709178,39.905117],[115.691779,39.8997],[115.68929,39.896187],[115.682556,39.893047],[115.678144,39.886556],[115.671055,39.88597],[115.667541,39.883888],[115.654869,39.882505],[115.648867,39.875411],[115.644705,39.875964],[115.640021,39.871554],[115.630987,39.871977],[115.623103,39.866949],[115.621973,39.863271],[115.616369,39.857542],[115.613086,39.843755],[115.607586,39.84089],[115.604533,39.834443],[115.599325,39.829151],[115.596649,39.821498],[115.59117,39.818534],[115.587322,39.813762],[115.577367,39.812541],[115.569274,39.813274],[115.563461,39.816417],[115.548027,39.822703],[115.546396,39.825992],[115.534957,39.830714],[115.530482,39.829916],[115.526509,39.835241],[115.514505,39.83835],[115.510992,39.84509],[115.515948,39.847678],[115.522368,39.858779],[115.521929,39.868186],[115.527345,39.869862],[115.529185,39.875948],[115.526299,39.875655],[115.516659,39.880406],[115.51003,39.88148],[115.509026,39.884164],[115.523016,39.898919],[115.52013,39.902547],[115.50386,39.915818],[115.494994,39.917948],[115.487277,39.923835],[115.48069,39.93585],[115.472387,39.93876],[115.464462,39.940142],[115.456787,39.944271],[115.452312,39.948188],[115.447042,39.948806],[115.444595,39.951358],[115.438468,39.95256],[115.43577,39.950919],[115.42615,39.95035],[115.423745,39.955697],[115.426924,39.965302],[115.423411,39.969819],[115.427635,39.979471],[115.428513,39.984328],[115.436815,39.991427],[115.443905,39.994644],[115.450346,39.993247],[115.449196,40.001985],[115.442817,40.007345],[115.442169,40.010885],[115.452082,40.02079],[115.454528,40.029704],[115.460656,40.032172],[115.468414,40.031896],[115.478557,40.036165],[115.488992,40.043746],[115.488323,40.046132],[115.500954,40.052478],[115.510427,40.062913],[115.509695,40.065477],[115.514944,40.066937],[115.527324,40.076072],[115.537885,40.077775],[115.544263,40.07591],[115.552168,40.079252],[115.555472,40.082626],[115.553736,40.091661],[115.563419,40.097922],[115.567769,40.096543],[115.576196,40.100825],[115.578538,40.096365],[115.584038,40.094889],[115.590709,40.096397],[115.592403,40.110182],[115.594432,40.108982],[115.59485,40.116279],[115.599116,40.120008],[115.606979,40.120057],[115.616223,40.117138],[115.621388,40.118711],[115.625048,40.116295],[115.631468,40.117852],[115.635943,40.115793],[115.643722,40.117511],[115.641882,40.120819],[115.64458,40.126639],[115.654806,40.131276],[115.657734,40.128098],[115.678667,40.130935],[115.681197,40.13267],[115.68699,40.13053],[115.693096,40.131924],[115.697216,40.12672],[115.702172,40.128196],[115.712064,40.126899],[115.711039,40.128941],[115.704765,40.129655],[115.699746,40.132394],[115.708697,40.134291],[115.715891,40.133383],[115.724841,40.128812],[115.734126,40.129379],[115.741111,40.132216],[115.749246,40.137711],[115.75485,40.145459],[115.749539,40.152995],[115.754328,40.163252],[115.762212,40.16262],[115.768213,40.165553],[115.773023,40.176197],[115.787014,40.178708],[115.78693,40.170414],[115.789837,40.168939],[115.802091,40.156754],[115.806567,40.153254],[115.822272,40.152606],[115.829047,40.149981],[115.83576,40.145426],[115.834234,40.15024],[115.846384,40.147096],[115.853348,40.149332]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":110111,\"name\":\"房山区\",\"center\":[116.139157,39.735535],\"centroid\":[115.853935,39.719211],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":110000},\"subFeatureIndex\":7,\"acroutes\":[100000,110000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[116.05465,39.845953],[116.061488,39.841899],[116.068975,39.840792],[116.07619,39.837015],[116.078615,39.831593],[116.084366,39.828581],[116.085747,39.832163],[116.089741,39.829721],[116.088214,39.82692],[116.089594,39.816352],[116.086186,39.816401],[116.084826,39.811596],[116.087127,39.803289],[116.0856,39.795324],[116.091916,39.787927],[116.091581,39.784082],[116.094613,39.781557],[116.101368,39.78576],[116.107014,39.78532],[116.106366,39.788612],[116.119792,39.789654],[116.120754,39.784848],[116.125062,39.785353],[116.131503,39.783121],[116.132569,39.778624],[116.127467,39.779047],[116.124351,39.77675],[116.121486,39.779047],[116.117491,39.77336],[116.121465,39.761626],[116.12847,39.762409],[116.133427,39.766336],[116.143444,39.764381],[116.150554,39.766565],[116.159923,39.767494],[116.166113,39.775039],[116.16971,39.784278],[116.182989,39.783707],[116.183365,39.780204],[116.188008,39.781785],[116.194407,39.780579],[116.194449,39.778493],[116.200388,39.778151],[116.201852,39.788269],[116.201852,39.799657],[116.208063,39.806352],[116.207415,39.810814],[116.216762,39.816905],[116.214462,39.818974],[116.214127,39.824706],[116.227219,39.825048],[116.228306,39.827197],[116.23962,39.826872],[116.243007,39.825145],[116.244304,39.818567],[116.251644,39.81329],[116.25361,39.807231],[116.250933,39.801432],[116.251519,39.793059],[116.251602,39.782518],[116.253777,39.77952],[116.252481,39.771747],[116.254426,39.76324],[116.252481,39.758676],[116.251895,39.749092],[116.243948,39.741658],[116.248026,39.732641],[116.248466,39.728027],[116.245768,39.72408],[116.245036,39.718421],[116.236629,39.71286],[116.231945,39.706025],[116.23435,39.703823],[116.230941,39.692355],[116.221238,39.678453],[116.22565,39.67359],[116.221342,39.667486],[116.223162,39.664728],[116.216992,39.651572],[116.215487,39.64305],[116.218875,39.628011],[116.219502,39.618931],[116.21808,39.608102],[116.223141,39.597222],[116.222597,39.593938],[116.226089,39.591993],[116.225085,39.584085],[116.221175,39.578921],[116.208105,39.577728],[116.206243,39.583219],[116.201726,39.586373],[116.196394,39.586095],[116.196854,39.588987],[116.19058,39.587386],[116.190768,39.589396],[116.184432,39.590915],[116.177071,39.590016],[116.176924,39.585899],[116.165527,39.583562],[116.151788,39.583415],[116.149613,39.573087],[116.13878,39.571044],[116.138425,39.568887],[116.130373,39.567743],[116.130311,39.569459],[116.121528,39.570554],[116.121465,39.574917],[116.116634,39.574002],[116.11379,39.570668],[116.106282,39.570979],[116.105801,39.576568],[116.101368,39.580049],[116.102016,39.576143],[116.098817,39.575146],[116.039237,39.571943],[116.032964,39.572302],[116.032859,39.574607],[116.024766,39.575604],[116.02623,39.587402],[116.020667,39.585981],[116.014038,39.588072],[116.013703,39.583039],[116.010588,39.583023],[116.007618,39.577205],[115.995196,39.577075],[115.996953,39.583203],[115.990721,39.586471],[115.990993,39.593791],[115.978445,39.595686],[115.977086,39.590931],[115.978153,39.572842],[115.974576,39.570832],[115.968909,39.570995],[115.967592,39.564604],[115.963409,39.565503],[115.957554,39.560927],[115.954982,39.566092],[115.950423,39.56637],[115.949147,39.573299],[115.943083,39.574672],[115.943187,39.577385],[115.937938,39.577467],[115.938105,39.581699],[115.934969,39.581814],[115.934174,39.588072],[115.929991,39.589935],[115.930221,39.593382],[115.924178,39.59384],[115.923759,39.597287],[115.912488,39.599149],[115.910187,39.600832],[115.9068,39.590016],[115.909665,39.588284],[115.908744,39.58402],[115.915604,39.582958],[115.911777,39.574182],[115.91276,39.572842],[115.907866,39.566876],[115.896009,39.569916],[115.890028,39.567873],[115.893416,39.561875],[115.89306,39.556219],[115.888752,39.555614],[115.887686,39.55066],[115.883587,39.551102],[115.88296,39.54811],[115.873298,39.548829],[115.872315,39.546099],[115.866355,39.546361],[115.866041,39.549843],[115.862026,39.548551],[115.855481,39.554993],[115.851361,39.550448],[115.847555,39.550284],[115.846028,39.543287],[115.84216,39.54157],[115.828692,39.541309],[115.828399,39.535455],[115.824321,39.534212],[115.822753,39.530533],[115.819219,39.530762],[115.819804,39.524923],[115.824112,39.522405],[115.824447,39.518774],[115.819762,39.518528],[115.822146,39.514145],[115.829487,39.512885],[115.828692,39.507045],[115.821456,39.509499],[115.792681,39.510742],[115.785006,39.51035],[115.777917,39.513834],[115.776537,39.512722],[115.767419,39.515862],[115.770828,39.510971],[115.768736,39.508878],[115.765328,39.514848],[115.759451,39.513916],[115.752508,39.515453],[115.743934,39.526771],[115.741487,39.536289],[115.73879,39.539314],[115.739124,39.545363],[115.726765,39.548143],[115.726953,39.543908],[115.7216,39.543499],[115.72022,39.554747],[115.717104,39.560403],[115.710161,39.563019],[115.698722,39.563248],[115.692072,39.565781],[115.694393,39.56941],[115.698596,39.570586],[115.697906,39.579248],[115.693431,39.580327],[115.694226,39.587778],[115.689269,39.592941],[115.68929,39.599035],[115.685317,39.603675],[115.673271,39.608526],[115.667479,39.615256],[115.667583,39.609637],[115.665304,39.605325],[115.657273,39.600081],[115.650268,39.600996],[115.643576,39.598937],[115.641589,39.603332],[115.634688,39.603871],[115.632555,39.597695],[115.625947,39.599394],[115.618439,39.604067],[115.6125,39.601126],[115.605285,39.600032],[115.599785,39.600865],[115.598719,39.597761],[115.592445,39.59665],[115.586109,39.589412],[115.571867,39.591569],[115.573875,39.596552],[115.567267,39.599623],[115.564569,39.605619],[115.55451,39.609408],[115.551875,39.614064],[115.545978,39.618751],[115.539119,39.616285],[115.533263,39.611434],[115.533891,39.608608],[115.530586,39.602874],[115.524229,39.598937],[115.518311,39.597156],[115.518834,39.593072],[115.515948,39.591193],[115.512121,39.605129],[115.514358,39.613508],[115.523414,39.620384],[115.521699,39.622311],[115.520423,39.633416],[115.522452,39.639964],[115.515864,39.641237],[115.511493,39.644388],[115.506705,39.652127],[115.496771,39.652551],[115.494659,39.649237],[115.478515,39.650331],[115.477971,39.654216],[115.482593,39.66303],[115.491334,39.668694],[115.486733,39.673362],[115.489724,39.678012],[115.488783,39.681619],[115.494408,39.686481],[115.496395,39.685665],[115.499783,39.691278],[115.49926,39.696189],[115.492631,39.701719],[115.490247,39.701409],[115.493404,39.707494],[115.491229,39.714719],[115.488866,39.733163],[115.492108,39.73887],[115.482321,39.742473],[115.470568,39.742391],[115.46672,39.740451],[115.457728,39.744918],[115.439158,39.752678],[115.434411,39.763859],[115.435414,39.769938],[115.430918,39.772073],[115.427029,39.769775],[115.425209,39.77336],[115.431169,39.775756],[115.434076,39.782274],[115.443382,39.785646],[115.452751,39.781964],[115.45777,39.782143],[115.475859,39.791821],[115.483241,39.798679],[115.49238,39.796057],[115.497336,39.791088],[115.508712,39.784082],[115.513815,39.788693],[115.536275,39.792131],[115.539432,39.794754],[115.554866,39.795601],[115.56229,39.803713],[115.566577,39.804609],[115.566367,39.809788],[115.569274,39.813274],[115.577367,39.812541],[115.587322,39.813762],[115.59117,39.818534],[115.596649,39.821498],[115.599325,39.829151],[115.604533,39.834443],[115.607586,39.84089],[115.613086,39.843755],[115.616369,39.857542],[115.621973,39.863271],[115.623103,39.866949],[115.630987,39.871977],[115.640021,39.871554],[115.644705,39.875964],[115.648867,39.875411],[115.654869,39.882505],[115.667541,39.883888],[115.671055,39.88597],[115.678144,39.886556],[115.682556,39.893047],[115.68929,39.896187],[115.691779,39.8997],[115.709178,39.905117],[115.719592,39.904612],[115.721621,39.906824],[115.731261,39.907865],[115.74889,39.9152],[115.749622,39.917655],[115.76148,39.920989],[115.769385,39.925233],[115.774257,39.920599],[115.792848,39.920859],[115.797344,39.92216],[115.806839,39.919656],[115.811084,39.913785],[115.8188,39.913948],[115.826914,39.910581],[115.835112,39.899586],[115.838772,39.900644],[115.845255,39.897049],[115.860897,39.901359],[115.868321,39.905572],[115.87311,39.912484],[115.87884,39.915964],[115.890112,39.917281],[115.903935,39.914029],[115.927858,39.914257],[115.935868,39.917753],[115.941159,39.917509],[115.945697,39.910972],[115.944965,39.901847],[115.935805,39.898236],[115.921856,39.884164],[115.92744,39.876192],[115.949837,39.871278],[115.954145,39.866786],[115.961318,39.867877],[115.967822,39.872059],[115.968742,39.867714],[115.976563,39.868251],[115.97627,39.870497],[115.990177,39.876338],[115.997245,39.875167],[115.992875,39.867356],[115.986789,39.864703],[115.98817,39.859837],[115.98428,39.849111],[115.991285,39.840222],[116.00789,39.849469],[116.016694,39.849225],[116.018367,39.841525],[116.021023,39.840662],[116.030308,39.843462],[116.033089,39.845904],[116.04181,39.844878],[116.045825,39.84732],[116.05465,39.845953]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":110112,\"name\":\"通州区\",\"center\":[116.658603,39.902486],\"centroid\":[116.73624,39.803923],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":110000},\"subFeatureIndex\":8,\"acroutes\":[100000,110000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[116.534944,39.82482],[116.538143,39.828207],[116.533187,39.832733],[116.542681,39.830209],[116.543664,39.835078],[116.558596,39.834687],[116.569386,39.833498],[116.577145,39.830682],[116.577479,39.827539],[116.587015,39.828223],[116.583732,39.824917],[116.591595,39.823875],[116.59147,39.826367],[116.599228,39.825585],[116.598977,39.831659],[116.60224,39.831675],[116.601905,39.840727],[116.608367,39.846539],[116.604666,39.846132],[116.604185,39.850071],[116.613449,39.850185],[116.626958,39.860683],[116.619994,39.868951],[116.62493,39.87725],[116.624323,39.881155],[116.628987,39.881594],[116.627585,39.890477],[116.615603,39.889794],[116.61531,39.895503],[116.621019,39.898854],[116.623361,39.904271],[116.620245,39.90767],[116.623006,39.913818],[116.620956,39.923103],[116.630576,39.921672],[116.624156,39.929981],[116.6293,39.931314],[116.629677,39.938727],[116.633441,39.940906],[116.630492,39.946156],[116.632228,39.950545],[116.645277,39.945977],[116.643081,39.952983],[116.641827,39.969575],[116.639819,39.982606],[116.634026,39.981696],[116.63365,39.986197],[116.639129,39.986879],[116.640321,39.990177],[116.643751,39.989608],[116.642684,39.996755],[116.637582,40.002359],[116.63273,39.999825],[116.625766,40.003122],[116.628129,40.007653],[116.61989,40.011794],[116.60132,40.013873],[116.595548,40.01751],[116.600839,40.018858],[116.602762,40.028503],[116.610061,40.031214],[116.614055,40.03175],[116.614139,40.028178],[116.619388,40.026733],[116.620099,40.022512],[116.624239,40.023664],[116.627063,40.021505],[116.633504,40.023664],[116.636159,40.019703],[116.651195,40.025759],[116.651676,40.021911],[116.655629,40.018566],[116.660125,40.021651],[116.664705,40.019037],[116.668615,40.013938],[116.678465,40.015058],[116.683777,40.014458],[116.686286,40.00827],[116.688378,40.00918],[116.685575,40.016569],[116.697244,40.016098],[116.703936,40.020141],[116.708621,40.026587],[116.716337,40.023762],[116.717383,40.019605],[116.719725,40.022512],[116.724221,40.021278],[116.724828,40.024265],[116.732043,40.022219],[116.732335,40.025109],[116.737145,40.02761],[116.747058,40.025385],[116.747037,40.021976],[116.751763,40.019962],[116.75329,40.015919],[116.764791,40.016049],[116.771755,40.014474],[116.770459,40.011632],[116.775749,40.002943],[116.775373,39.992759],[116.766757,39.982281],[116.766443,39.976351],[116.759605,39.969933],[116.757326,39.961483],[116.762826,39.956006],[116.78058,39.949716],[116.782567,39.947554],[116.78332,39.936045],[116.782358,39.928273],[116.78217,39.910419],[116.78424,39.902221],[116.7847,39.89142],[116.787084,39.886833],[116.794738,39.881252],[116.804148,39.877933],[116.804253,39.88488],[116.808247,39.884913],[116.80831,39.889631],[116.812304,39.889712],[116.81312,39.881301],[116.817009,39.878649],[116.823681,39.879137],[116.827277,39.877071],[116.836897,39.864736],[116.839407,39.865777],[116.847249,39.858616],[116.85254,39.859056],[116.85829,39.84846],[116.865505,39.846913],[116.866049,39.843902],[116.871507,39.842062],[116.878638,39.842257],[116.878304,39.84522],[116.885665,39.844585],[116.897501,39.832587],[116.903357,39.830682],[116.907581,39.834117],[116.902896,39.841346],[116.902813,39.848248],[116.910383,39.850608],[116.917431,39.846913],[116.9259,39.835403],[116.92887,39.820912],[116.92818,39.814153],[116.92979,39.811368],[116.942881,39.801677],[116.934809,39.801139],[116.938301,39.793124],[116.950828,39.791528],[116.953797,39.78607],[116.948004,39.785369],[116.94974,39.778542],[116.945788,39.777369],[116.939284,39.781361],[116.933784,39.781801],[116.921718,39.780628],[116.91649,39.775935],[116.920902,39.769107],[116.910613,39.762278],[116.908292,39.766711],[116.901809,39.763615],[116.901558,39.755204],[116.907163,39.75597],[116.913185,39.745962],[116.914461,39.741755],[116.910718,39.740989],[116.912934,39.73569],[116.916364,39.73587],[116.916678,39.731353],[116.911533,39.731516],[116.90229,39.729413],[116.89976,39.726168],[116.887589,39.725515],[116.8828,39.71847],[116.887108,39.714311],[116.886376,39.707004],[116.893841,39.695879],[116.89336,39.693187],[116.887819,39.690952],[116.88991,39.687656],[116.902896,39.690576],[116.909024,39.682859],[116.905197,39.681651],[116.906661,39.677425],[116.891144,39.67408],[116.883239,39.675352],[116.87318,39.671387],[116.863979,39.670391],[116.860486,39.667258],[116.849946,39.667552],[116.85141,39.652845],[116.839135,39.647523],[116.840766,39.644241],[116.833572,39.644127],[116.834555,39.641841],[116.826901,39.638217],[116.82893,39.635163],[116.826357,39.633122],[116.838445,39.62223],[116.834116,39.621495],[116.835391,39.617004],[116.82504,39.613884],[116.823994,39.617183],[116.81954,39.618996],[116.809711,39.614521],[116.802078,39.6123],[116.790012,39.610535],[116.792835,39.602155],[116.789384,39.602596],[116.790702,39.596045],[116.785474,39.596209],[116.785055,39.593497],[116.778196,39.593382],[116.774892,39.599166],[116.774202,39.605439],[116.762616,39.613819],[116.748689,39.619943],[116.744004,39.616824],[116.737877,39.61537],[116.730516,39.619143],[116.730202,39.622932],[116.725518,39.624075],[116.721398,39.629415],[116.723489,39.639033],[116.716003,39.640356],[116.710419,39.639686],[116.70609,39.642903],[116.702891,39.649923],[116.702138,39.657644],[116.704857,39.667192],[116.703769,39.674145],[116.693543,39.674944],[116.692706,39.676789],[116.685554,39.676886],[116.680786,39.674896],[116.675203,39.676234],[116.668574,39.674602],[116.666022,39.679693],[116.669577,39.683642],[116.666566,39.687101],[116.65818,39.68857],[116.658097,39.686155],[116.651321,39.687868],[116.651509,39.694459],[116.647097,39.694786],[116.64626,39.700447],[116.647912,39.703579],[116.653098,39.703823],[116.652994,39.708619],[116.644587,39.709647],[116.638502,39.717166],[116.637623,39.723934],[116.631203,39.722971],[116.628129,39.727749],[116.621646,39.728076],[116.621876,39.725825],[116.616251,39.725581],[116.609141,39.719367],[116.604561,39.718731],[116.604017,39.714752],[116.598371,39.711963],[116.590194,39.711522],[116.590152,39.713349],[116.581202,39.712517],[116.579884,39.710234],[116.573464,39.709125],[116.573276,39.714507],[116.544961,39.715045],[116.535676,39.711881],[116.530552,39.713268],[116.53256,39.71529],[116.527332,39.716578],[116.52936,39.719808],[116.534609,39.718079],[116.536972,39.72152],[116.53783,39.728043],[116.531849,39.730016],[116.532413,39.73962],[116.537997,39.738071],[116.53624,39.740663],[116.527562,39.743304],[116.536408,39.753917],[116.540716,39.760502],[116.548119,39.765554],[116.561565,39.771111],[116.576957,39.771943],[116.594377,39.776685],[116.574677,39.798386],[116.565078,39.793988],[116.562423,39.796936],[116.555145,39.793548],[116.546634,39.803501],[116.538373,39.81513],[116.533375,39.819658],[116.539586,39.821563],[116.534944,39.82482]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":110113,\"name\":\"顺义区\",\"center\":[116.653525,40.128936],\"centroid\":[116.726467,40.152366],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":110000},\"subFeatureIndex\":9,\"acroutes\":[100000,110000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[116.771755,40.014474],[116.764791,40.016049],[116.75329,40.015919],[116.751763,40.019962],[116.747037,40.021976],[116.747058,40.025385],[116.737145,40.02761],[116.732335,40.025109],[116.732043,40.022219],[116.724828,40.024265],[116.724221,40.021278],[116.719725,40.022512],[116.717383,40.019605],[116.716337,40.023762],[116.708621,40.026587],[116.703936,40.020141],[116.697244,40.016098],[116.685575,40.016569],[116.688378,40.00918],[116.686286,40.00827],[116.683777,40.014458],[116.678465,40.015058],[116.668615,40.013938],[116.664705,40.019037],[116.660125,40.021651],[116.655629,40.018566],[116.651676,40.021911],[116.651195,40.025759],[116.636159,40.019703],[116.633504,40.023664],[116.627063,40.021505],[116.624239,40.023664],[116.620099,40.022512],[116.619388,40.026733],[116.614139,40.028178],[116.614055,40.03175],[116.610061,40.031214],[116.603683,40.052949],[116.608409,40.054912],[116.603473,40.086811],[116.602909,40.093883],[116.598392,40.103874],[116.598705,40.09351],[116.595903,40.090218],[116.580365,40.088352],[116.578316,40.102739],[116.574071,40.107815],[116.574322,40.096138],[116.578149,40.076461],[116.551757,40.059765],[116.547784,40.062718],[116.543183,40.059408],[116.534379,40.066791],[116.525993,40.071334],[116.513948,40.070426],[116.506775,40.074352],[116.49933,40.080387],[116.486657,40.081036],[116.482935,40.083745],[116.473545,40.085562],[116.471015,40.08939],[116.466832,40.090185],[116.466498,40.094954],[116.473357,40.097516],[116.480885,40.096965],[116.489292,40.101668],[116.492199,40.111561],[116.487222,40.124678],[116.484754,40.140078],[116.482307,40.140629],[116.480781,40.14742],[116.490777,40.148992],[116.492303,40.156981],[116.484629,40.160465],[116.477916,40.159979],[116.476912,40.163576],[116.480802,40.171937],[116.483332,40.171742],[116.485151,40.176764],[116.490129,40.181316],[116.487975,40.184686],[116.488016,40.191796],[116.484503,40.196493],[116.472249,40.205092],[116.473712,40.221203],[116.477979,40.225201],[116.483771,40.225185],[116.481094,40.238248],[116.482098,40.245385],[116.493705,40.251179],[116.501024,40.251599],[116.503011,40.25969],[116.505959,40.261356],[116.509201,40.258056],[116.523965,40.257522],[116.526181,40.261324],[116.535717,40.261373],[116.540088,40.267165],[116.53693,40.277178],[116.540904,40.274946],[116.546236,40.276224],[116.552176,40.27383],[116.566187,40.27802],[116.565371,40.273377],[116.570516,40.273102],[116.570202,40.268863],[116.58254,40.268362],[116.585238,40.266226],[116.588396,40.269462],[116.590842,40.264139],[116.599647,40.265385],[116.600755,40.258978],[116.604624,40.256146],[116.603787,40.251324],[116.61324,40.251761],[116.622044,40.250467],[116.6238,40.252667],[116.623654,40.26058],[116.63526,40.261454],[116.637038,40.25846],[116.641492,40.259463],[116.643081,40.25715],[116.648519,40.260143],[116.666901,40.262085],[116.669494,40.253153],[116.673321,40.246777],[116.668783,40.238539],[116.670247,40.234865],[116.676311,40.238604],[116.678131,40.234379],[116.684007,40.234282],[116.69072,40.240886],[116.697265,40.243216],[116.696554,40.248072],[116.704585,40.251551],[116.704668,40.257101],[116.710837,40.256227],[116.738421,40.284392],[116.738965,40.284101],[116.741098,40.283001],[116.738337,40.278764],[116.74298,40.279087],[116.752788,40.275512],[116.762658,40.269058],[116.768597,40.270109],[116.771651,40.266501],[116.773512,40.269527],[116.782964,40.273248],[116.784073,40.279443],[116.787795,40.281449],[116.788025,40.289439],[116.794487,40.287417],[116.800572,40.289196],[116.809607,40.28601],[116.811823,40.282387],[116.825123,40.285347],[116.82458,40.290991],[116.827215,40.298333],[116.830101,40.299206],[116.828992,40.304413],[116.838382,40.310185],[116.848984,40.311204],[116.854547,40.303152],[116.857182,40.2929],[116.859462,40.290878],[116.871319,40.290943],[116.871737,40.281481],[116.876338,40.274348],[116.874247,40.268281],[116.879893,40.264139],[116.881273,40.259221],[116.886104,40.255256],[116.886585,40.251907],[116.892252,40.245709],[116.894343,40.240028],[116.901746,40.23684],[116.893946,40.233457],[116.900701,40.228763],[116.906598,40.228682],[116.908606,40.222401],[116.913917,40.220118],[116.915507,40.222271],[116.922031,40.220134],[116.92544,40.225768],[116.931065,40.230624],[116.935206,40.229847],[116.940978,40.223922],[116.938029,40.210549],[116.929685,40.211585],[116.930898,40.207084],[116.939556,40.192347],[116.945913,40.193141],[116.94997,40.186354],[116.945809,40.186224],[116.945349,40.1813],[116.951371,40.174788],[116.962037,40.175549],[116.961242,40.171937],[116.968749,40.163495],[116.972054,40.156301],[116.977763,40.151374],[116.970025,40.140321],[116.967829,40.129849],[116.96578,40.127823],[116.971594,40.124224],[116.969189,40.118776],[116.971301,40.114009],[116.976069,40.111188],[116.973329,40.103712],[116.967976,40.101214],[116.975462,40.095051],[116.979938,40.093867],[116.981862,40.089828],[116.981192,40.08149],[116.986274,40.078359],[116.982844,40.070685],[116.980816,40.071188],[116.978599,40.064893],[116.973476,40.066304],[116.970652,40.063805],[116.962288,40.063529],[116.961932,40.051358],[116.945265,40.041425],[116.945014,40.048631],[116.937632,40.046911],[116.938824,40.050887],[116.931693,40.052024],[116.928096,40.054929],[116.924164,40.047463],[116.917974,40.044704],[116.914252,40.052592],[116.906431,40.051423],[116.90137,40.047723],[116.890265,40.04597],[116.88075,40.046164],[116.873619,40.041522],[116.867826,40.041863],[116.857809,40.051894],[116.850197,40.054977],[116.849486,40.051926],[116.831502,40.051196],[116.831732,40.048485],[116.822739,40.046473],[116.823158,40.039834],[116.820816,40.038779],[116.82,40.028357],[116.815295,40.030905],[116.803375,40.032155],[116.800259,40.028844],[116.789531,40.032318],[116.790221,40.034477],[116.781542,40.034818],[116.77782,40.032448],[116.777485,40.027204],[116.771755,40.014474]]],[[[116.578149,40.076461],[116.581411,40.067846],[116.58139,40.073817],[116.586597,40.074336],[116.590131,40.056162],[116.587957,40.05053],[116.591198,40.051796],[116.590006,40.043616],[116.599814,40.041408],[116.599417,40.047171],[116.601633,40.047658],[116.598517,40.052543],[116.603683,40.052949],[116.610061,40.031214],[116.602762,40.028503],[116.600839,40.018858],[116.595548,40.01751],[116.577814,40.027512],[116.578797,40.033097],[116.570474,40.032431],[116.564242,40.039655],[116.550753,40.045499],[116.54655,40.048956],[116.552761,40.05488],[116.551757,40.059765],[116.578149,40.076461]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":110114,\"name\":\"昌平区\",\"center\":[116.235906,40.218085],\"centroid\":[116.210635,40.215461],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":110000},\"subFeatureIndex\":10,\"acroutes\":[100000,110000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[116.466832,40.090185],[116.466247,40.08235],[116.461855,40.080825],[116.462608,40.076786],[116.458823,40.075796],[116.458635,40.070377],[116.462127,40.06731],[116.459408,40.059992],[116.45142,40.06129],[116.451629,40.058759],[116.442867,40.061323],[116.433268,40.06228],[116.415618,40.056],[116.409595,40.055626],[116.406124,40.049768],[116.408884,40.043291],[116.405266,40.038974],[116.395333,40.036766],[116.39297,40.041733],[116.390649,40.041279],[116.38519,40.042853],[116.376888,40.042756],[116.376114,40.045466],[116.36959,40.04696],[116.367394,40.053436],[116.372999,40.054344],[116.372267,40.05785],[116.379272,40.059002],[116.382848,40.061582],[116.381928,40.066402],[116.373354,40.065623],[116.372538,40.06843],[116.363149,40.068965],[116.363023,40.065931],[116.357293,40.066012],[116.34667,40.063659],[116.346963,40.06043],[116.342676,40.059635],[116.343366,40.055448],[116.340271,40.055091],[116.338828,40.058921],[116.325946,40.054799],[116.318292,40.061663],[116.309446,40.060609],[116.305995,40.063043],[116.302942,40.060803],[116.290353,40.083145],[116.279897,40.079754],[116.2731,40.092699],[116.27333,40.09557],[116.265237,40.094694],[116.258273,40.101522],[116.263899,40.10402],[116.263334,40.110588],[116.258022,40.11195],[116.25957,40.106907],[116.255868,40.104474],[116.252732,40.106517],[116.245956,40.10535],[116.240498,40.108009],[116.243363,40.113279],[116.241836,40.118403],[116.245036,40.118825],[116.247043,40.136204],[116.233785,40.136577],[116.215445,40.143174],[116.212224,40.140548],[116.206285,40.143092],[116.205658,40.150175],[116.203211,40.153773],[116.202166,40.160984],[116.194282,40.160076],[116.192065,40.155669],[116.182696,40.158099],[116.183094,40.153335],[116.180417,40.14729],[116.174122,40.143595],[116.167681,40.141844],[116.168622,40.135442],[116.17178,40.127936],[116.167409,40.128455],[116.169563,40.124564],[116.152708,40.121776],[116.132925,40.121354],[116.132214,40.115079],[116.127676,40.116393],[116.113309,40.115598],[116.105864,40.118014],[116.102246,40.115987],[116.096056,40.121257],[116.089783,40.119327],[116.08445,40.120252],[116.077883,40.115047],[116.073847,40.115436],[116.072676,40.109258],[116.069456,40.104912],[116.062931,40.10282],[116.061969,40.09956],[116.055905,40.09643],[116.051848,40.091661],[116.048878,40.085303],[116.043775,40.083502],[116.037899,40.084524],[116.033926,40.079657],[116.030914,40.082188],[116.020856,40.074579],[116.007785,40.080614],[116.005129,40.079803],[115.99735,40.082074],[115.986434,40.083469],[115.979993,40.081669],[115.977232,40.079041],[115.968575,40.075488],[115.966588,40.084556],[115.960461,40.092456],[115.962092,40.094419],[115.962552,40.10235],[115.957449,40.100679],[115.956717,40.096041],[115.952681,40.10102],[115.943229,40.103339],[115.947913,40.107409],[115.933588,40.124824],[115.921438,40.134485],[115.906549,40.138181],[115.904457,40.136123],[115.900442,40.138716],[115.8816,40.139073],[115.874155,40.14387],[115.870768,40.144276],[115.865184,40.148635],[115.856547,40.147468],[115.853348,40.149332],[115.853557,40.154162],[115.84676,40.163171],[115.844418,40.168016],[115.846865,40.169458],[115.854205,40.179939],[115.848099,40.183843],[115.855502,40.188865],[115.863072,40.186095],[115.870308,40.186079],[115.873695,40.192687],[115.87633,40.193918],[115.877313,40.200849],[115.886326,40.206663],[115.883169,40.209594],[115.885072,40.212039],[115.883106,40.216119],[115.891366,40.225379],[115.891994,40.228147],[115.898476,40.234509],[115.898079,40.236419],[115.906695,40.23412],[115.911965,40.234477],[115.916628,40.242391],[115.916984,40.247068],[115.935826,40.25558],[115.942706,40.253557],[115.950276,40.256163],[115.960001,40.256648],[115.965605,40.259415],[115.968888,40.264269],[115.967006,40.265612],[115.976396,40.270983],[115.981812,40.276903],[115.978822,40.281627],[115.981227,40.28525],[115.978675,40.289633],[115.982732,40.297977],[115.990323,40.299498],[115.987919,40.303799],[115.975538,40.308698],[115.976417,40.311511],[115.973259,40.318997],[115.979658,40.320532],[115.982711,40.324202],[115.993398,40.328986],[115.999065,40.325463],[116.007597,40.33314],[116.01684,40.33466],[116.026481,40.324283],[116.026167,40.320484],[116.031144,40.312352],[116.040095,40.312724],[116.042479,40.316846],[116.051116,40.315812],[116.056971,40.322181],[116.053353,40.326853],[116.061802,40.336809],[116.06841,40.336971],[116.073429,40.339831],[116.077716,40.339346],[116.083342,40.33571],[116.086353,40.330813],[116.098649,40.330005],[116.102978,40.331524],[116.110381,40.330813],[116.116634,40.323668],[116.116237,40.321955],[116.122385,40.312805],[116.132737,40.31198],[116.141959,40.316879],[116.138383,40.324671],[116.13809,40.330974],[116.143904,40.336082],[116.137651,40.336534],[116.137567,40.340769],[116.140809,40.343047],[116.138404,40.345229],[116.144782,40.348541],[116.147543,40.340655],[116.144719,40.336631],[116.152603,40.337714],[116.155677,40.344906],[116.1507,40.349252],[116.145514,40.351046],[116.148651,40.35696],[116.148233,40.361807],[116.159295,40.366265],[116.168789,40.366718],[116.170713,40.369351],[116.177154,40.370934],[116.180354,40.367687],[116.192985,40.372775],[116.209129,40.376232],[116.211451,40.381756],[116.222221,40.382111],[116.226989,40.38111],[116.23184,40.374988],[116.23665,40.377427],[116.241962,40.377508],[116.24353,40.379818],[116.247796,40.374471],[116.252104,40.376297],[116.25338,40.381239],[116.258336,40.383193],[116.261264,40.380561],[116.270863,40.382693],[116.282845,40.375263],[116.290729,40.383177],[116.289872,40.391672],[116.293762,40.392415],[116.295581,40.384437],[116.302691,40.387473],[116.313106,40.389459],[116.32078,40.386859],[116.32398,40.387295],[116.337364,40.379769],[116.34506,40.373163],[116.355369,40.37137],[116.360033,40.366815],[116.357356,40.364084],[116.352797,40.364391],[116.348866,40.356427],[116.355641,40.356814],[116.363923,40.359028],[116.369673,40.356362],[116.367101,40.350351],[116.364508,40.349107],[116.369903,40.342401],[116.368231,40.334805],[116.365909,40.331702],[116.376135,40.334352],[116.375069,40.337375],[116.384563,40.339055],[116.391422,40.338393],[116.396358,40.334853],[116.408633,40.334886],[116.408989,40.333205],[116.417061,40.329843],[116.424359,40.331265],[116.427914,40.329213],[116.43423,40.329116],[116.438245,40.333221],[116.443745,40.322682],[116.449182,40.32113],[116.455184,40.316345],[116.44822,40.305982],[116.443766,40.302457],[116.448011,40.300484],[116.45096,40.293045],[116.449412,40.286722],[116.45533,40.284845],[116.460308,40.28711],[116.469634,40.283001],[116.472081,40.280122],[116.478794,40.280025],[116.484001,40.2759],[116.484273,40.267634],[116.493245,40.262489],[116.501839,40.262974],[116.505959,40.261356],[116.503011,40.25969],[116.501024,40.251599],[116.493705,40.251179],[116.482098,40.245385],[116.481094,40.238248],[116.483771,40.225185],[116.477979,40.225201],[116.473712,40.221203],[116.472249,40.205092],[116.484503,40.196493],[116.488016,40.191796],[116.487975,40.184686],[116.490129,40.181316],[116.485151,40.176764],[116.483332,40.171742],[116.480802,40.171937],[116.476912,40.163576],[116.477916,40.159979],[116.484629,40.160465],[116.492303,40.156981],[116.490777,40.148992],[116.480781,40.14742],[116.482307,40.140629],[116.484754,40.140078],[116.487222,40.124678],[116.492199,40.111561],[116.489292,40.101668],[116.480885,40.096965],[116.473357,40.097516],[116.466498,40.094954],[116.466832,40.090185]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":110115,\"name\":\"大兴区\",\"center\":[116.338033,39.728908],\"centroid\":[116.421058,39.649884],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":110000},\"subFeatureIndex\":11,\"acroutes\":[100000,110000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[116.534944,39.82482],[116.539586,39.821563],[116.533375,39.819658],[116.538373,39.81513],[116.546634,39.803501],[116.555145,39.793548],[116.562423,39.796936],[116.565078,39.793988],[116.574677,39.798386],[116.594377,39.776685],[116.576957,39.771943],[116.561565,39.771111],[116.548119,39.765554],[116.540716,39.760502],[116.536408,39.753917],[116.527562,39.743304],[116.53624,39.740663],[116.537997,39.738071],[116.532413,39.73962],[116.531849,39.730016],[116.53783,39.728043],[116.536972,39.72152],[116.534609,39.718079],[116.52936,39.719808],[116.527332,39.716578],[116.53256,39.71529],[116.530552,39.713268],[116.535676,39.711881],[116.544961,39.715045],[116.573276,39.714507],[116.573464,39.709125],[116.579884,39.710234],[116.581202,39.712517],[116.590152,39.713349],[116.590194,39.711522],[116.598371,39.711963],[116.604017,39.714752],[116.604561,39.718731],[116.609141,39.719367],[116.616251,39.725581],[116.621876,39.725825],[116.621646,39.728076],[116.628129,39.727749],[116.631203,39.722971],[116.637623,39.723934],[116.638502,39.717166],[116.644587,39.709647],[116.652994,39.708619],[116.653098,39.703823],[116.647912,39.703579],[116.64626,39.700447],[116.647097,39.694786],[116.651509,39.694459],[116.651321,39.687868],[116.658097,39.686155],[116.65818,39.68857],[116.666566,39.687101],[116.669577,39.683642],[116.666022,39.679693],[116.668574,39.674602],[116.675203,39.676234],[116.680786,39.674896],[116.685554,39.676886],[116.692706,39.676789],[116.693543,39.674944],[116.703769,39.674145],[116.704857,39.667192],[116.702138,39.657644],[116.702891,39.649923],[116.70609,39.642903],[116.710419,39.639686],[116.716003,39.640356],[116.723489,39.639033],[116.721398,39.629415],[116.725518,39.624075],[116.721858,39.621756],[116.716149,39.62156],[116.70929,39.618114],[116.705338,39.621462],[116.700737,39.62107],[116.702577,39.610421],[116.718282,39.603021],[116.718324,39.601077],[116.724953,39.598006],[116.727065,39.593055],[116.705108,39.587974],[116.700695,39.590964],[116.699127,39.595457],[116.696408,39.595392],[116.694087,39.601355],[116.6889,39.598496],[116.669975,39.603381],[116.670037,39.604916],[116.662384,39.60521],[116.6568,39.602776],[116.657678,39.60075],[116.646532,39.599117],[116.645549,39.60209],[116.635595,39.604818],[116.635407,39.599934],[116.628338,39.599558],[116.620517,39.601665],[116.620182,39.606893],[116.616857,39.607301],[116.616648,39.614096],[116.613177,39.613802],[116.611755,39.618882],[116.607781,39.619698],[116.607886,39.624696],[116.602177,39.624533],[116.600128,39.619649],[116.593561,39.618588],[116.591993,39.621299],[116.579194,39.623487],[116.579382,39.619666],[116.565936,39.61978],[116.565978,39.616138],[116.569637,39.61176],[116.566103,39.61114],[116.566605,39.604361],[116.562276,39.601714],[116.557132,39.601502],[116.549436,39.596143],[116.544187,39.596519],[116.544124,39.603609],[116.540883,39.60142],[116.541803,39.59348],[116.530866,39.596715],[116.530615,39.598774],[116.524446,39.596535],[116.525052,39.593807],[116.521267,39.590229],[116.52317,39.586242],[116.519699,39.581863],[116.520389,39.577156],[116.52614,39.577271],[116.527248,39.57294],[116.520389,39.57191],[116.519385,39.566484],[116.511564,39.565503],[116.510581,39.560502],[116.50805,39.560256],[116.508448,39.551053],[116.489773,39.550268],[116.48948,39.553472],[116.473378,39.553096],[116.470952,39.5546],[116.475134,39.545756],[116.47802,39.543205],[116.478188,39.535487],[116.468819,39.534359],[116.464595,39.531628],[116.464553,39.527638],[116.453846,39.528652],[116.45372,39.526477],[116.440985,39.527311],[116.436802,39.526346],[116.439876,39.523353],[116.440378,39.516271],[116.442741,39.516189],[116.443829,39.509875],[116.433017,39.507438],[116.431699,39.51053],[116.424631,39.509728],[116.423125,39.516337],[116.424046,39.522732],[116.421473,39.525103],[116.411247,39.524678],[116.402652,39.526886],[116.40282,39.51439],[116.407253,39.512116],[116.40857,39.508011],[116.418734,39.506391],[116.422895,39.496608],[116.418504,39.496575],[116.415827,39.48823],[116.411582,39.485105],[116.412376,39.482077],[116.423544,39.485154],[116.427329,39.487788],[116.429964,39.481325],[116.425342,39.481259],[116.428333,39.476219],[116.433644,39.478183],[116.436258,39.482912],[116.444142,39.482192],[116.444059,39.47887],[116.448764,39.476284],[116.448638,39.465122],[116.453992,39.45751],[116.454682,39.453302],[116.450667,39.452648],[116.450353,39.448522],[116.437241,39.445951],[116.434397,39.442758],[116.425635,39.446885],[116.408947,39.450257],[116.399787,39.450044],[116.391903,39.452893],[116.388557,39.450732],[116.373563,39.452058],[116.367791,39.451633],[116.362187,39.454874],[116.351124,39.455529],[116.350162,39.45291],[116.334499,39.457019],[116.325611,39.462961],[116.325088,39.466153],[116.320048,39.468543],[116.319944,39.473436],[116.314779,39.476104],[116.312708,39.480556],[116.306957,39.485023],[116.305284,39.489179],[116.283201,39.493941],[116.279269,39.491306],[116.275631,39.495201],[116.269315,39.495495],[116.257939,39.500518],[116.25706,39.505491],[116.253861,39.510055],[116.245831,39.514897],[116.246709,39.520098],[116.24353,39.524236],[116.246479,39.525299],[116.248256,39.530271],[116.245601,39.53014],[116.246521,39.539788],[116.242505,39.552966],[116.246186,39.557167],[116.243007,39.55836],[116.240644,39.564098],[116.234684,39.563934],[116.236462,39.568396],[116.229373,39.565471],[116.225817,39.568151],[116.221175,39.578921],[116.225085,39.584085],[116.226089,39.591993],[116.222597,39.593938],[116.223141,39.597222],[116.21808,39.608102],[116.219502,39.618931],[116.218875,39.628011],[116.215487,39.64305],[116.216992,39.651572],[116.223162,39.664728],[116.221342,39.667486],[116.22565,39.67359],[116.221238,39.678453],[116.230941,39.692355],[116.23435,39.703823],[116.231945,39.706025],[116.236629,39.71286],[116.245036,39.718421],[116.245768,39.72408],[116.248466,39.728027],[116.248026,39.732641],[116.243948,39.741658],[116.251895,39.749092],[116.252481,39.758676],[116.254426,39.76324],[116.252481,39.771747],[116.253777,39.77952],[116.251602,39.782518],[116.251519,39.793059],[116.259298,39.797621],[116.262184,39.792782],[116.27423,39.796936],[116.287237,39.799103],[116.289182,39.795894],[116.296083,39.795568],[116.291148,39.793271],[116.295205,39.790958],[116.301541,39.774941],[116.307062,39.770085],[116.31068,39.772057],[116.317978,39.783447],[116.321784,39.783626],[116.322872,39.798386],[116.326824,39.798386],[116.328225,39.801416],[116.340124,39.802149],[116.341755,39.807589],[116.355704,39.805668],[116.356833,39.800471],[116.367039,39.79982],[116.368189,39.794819],[116.365742,39.794151],[116.367582,39.784962],[116.378478,39.785646],[116.379209,39.77939],[116.385609,39.778852],[116.390649,39.780465],[116.391903,39.765277],[116.398888,39.765864],[116.397905,39.781068],[116.396023,39.786738],[116.42024,39.787439],[116.421034,39.794134],[116.429274,39.794102],[116.429399,39.803583],[116.425719,39.805358],[116.422456,39.81044],[116.417772,39.81013],[116.415262,39.812525],[116.410013,39.811336],[116.41016,39.817052],[116.419759,39.815375],[116.418441,39.822915],[116.414426,39.824282],[116.415785,39.829428],[116.420072,39.826611],[116.425217,39.831903],[116.430068,39.830112],[116.43699,39.830649],[116.436677,39.827425],[116.44592,39.826692],[116.443912,39.82096],[116.452737,39.823012],[116.462775,39.815945],[116.468463,39.814511],[116.474256,39.809772],[116.485256,39.81272],[116.485632,39.816889],[116.495357,39.818795],[116.498201,39.8157],[116.505813,39.817866],[116.502801,39.819006],[116.510142,39.821449],[116.510602,39.827637],[116.516164,39.829835],[116.525366,39.829754],[116.525868,39.826904],[116.534944,39.82482]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":110116,\"name\":\"怀柔区\",\"center\":[116.637122,40.324272],\"centroid\":[116.586079,40.63069],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":110000},\"subFeatureIndex\":12,\"acroutes\":[100000,110000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[116.289872,40.391672],[116.286003,40.396032],[116.289746,40.402539],[116.287864,40.404719],[116.291608,40.408448],[116.288513,40.413437],[116.289433,40.418021],[116.291942,40.416617],[116.296648,40.420701],[116.294452,40.429304],[116.290667,40.435856],[116.289788,40.440907],[116.294368,40.449975],[116.293824,40.452831],[116.300955,40.458429],[116.306853,40.466092],[116.301646,40.468108],[116.294786,40.47535],[116.291691,40.485317],[116.29717,40.486768],[116.303779,40.485817],[116.31022,40.491702],[116.31321,40.491799],[116.323227,40.500151],[116.330567,40.500748],[116.336653,40.498636],[116.34232,40.500457],[116.348636,40.499071],[116.357042,40.501941],[116.365909,40.499635],[116.369632,40.500312],[116.377537,40.49683],[116.378603,40.491525],[116.376825,40.485736],[116.387344,40.482043],[116.38609,40.475802],[116.393702,40.47256],[116.4065,40.481995],[116.413673,40.481527],[116.416664,40.483011],[116.420971,40.480301],[116.433142,40.478189],[116.443201,40.481801],[116.455937,40.480914],[116.457903,40.488445],[116.465577,40.48701],[116.468212,40.48493],[116.483541,40.484994],[116.487347,40.481737],[116.492157,40.481027],[116.508322,40.483172],[116.511543,40.486929],[116.519092,40.491799],[116.519155,40.496604],[116.51194,40.501135],[116.506398,40.508212],[116.500459,40.510904],[116.497762,40.518093],[116.492073,40.518093],[116.488581,40.515853],[116.476306,40.514192],[116.470345,40.518963],[116.46587,40.518802],[116.460956,40.524363],[116.467125,40.530068],[116.470617,40.535418],[116.479651,40.541396],[116.484587,40.552867],[116.496277,40.555106],[116.499999,40.560921],[116.505144,40.562581],[116.509577,40.57276],[116.513153,40.572792],[116.517796,40.579749],[116.525136,40.583002],[116.531577,40.59131],[116.530929,40.595883],[116.535948,40.59944],[116.532915,40.606459],[116.535634,40.615698],[116.538938,40.619673],[116.539294,40.625612],[116.545003,40.627076],[116.551674,40.625209],[116.561231,40.628557],[116.568989,40.625483],[116.574092,40.631678],[116.573903,40.63628],[116.563886,40.636908],[116.55389,40.642877],[116.551151,40.642828],[116.550335,40.647606],[116.545023,40.650116],[116.544103,40.653767],[116.540046,40.656679],[116.529507,40.654588],[116.527039,40.6584],[116.518381,40.660925],[116.520096,40.66411],[116.517273,40.665734],[116.513488,40.672344],[116.505938,40.673067],[116.501568,40.671186],[116.492826,40.673984],[116.487138,40.674338],[116.483374,40.679403],[116.488811,40.69196],[116.496653,40.696879],[116.502676,40.697361],[116.501066,40.70228],[116.501923,40.706796],[116.506064,40.710879],[116.503115,40.715893],[116.504119,40.720135],[116.506858,40.720039],[116.510748,40.72645],[116.509493,40.73548],[116.513697,40.741456],[116.506461,40.743432],[116.501819,40.746581],[116.502906,40.756635],[116.50025,40.760811],[116.495482,40.759735],[116.491404,40.7633],[116.485193,40.765179],[116.4803,40.771586],[116.471517,40.771233],[116.465452,40.772742],[116.465849,40.774525],[116.460663,40.78244],[116.461416,40.78854],[116.457233,40.7983],[116.452152,40.798059],[116.450981,40.801927],[116.440002,40.809133],[116.439897,40.815038],[116.436823,40.820735],[116.422477,40.822772],[116.414991,40.829318],[116.406458,40.833361],[116.406145,40.837933],[116.399306,40.850492],[116.391778,40.854838],[116.389707,40.861814],[116.38174,40.863465],[116.374881,40.871531],[116.366599,40.876645],[116.365972,40.880188],[116.360514,40.884885],[116.353864,40.887786],[116.344683,40.894694],[116.342236,40.899887],[116.334436,40.90463],[116.33544,40.910495],[116.334122,40.920829],[116.338828,40.925732],[116.339894,40.929416],[116.35012,40.936048],[116.358925,40.93608],[116.364801,40.942999],[116.370343,40.943655],[116.379941,40.935775],[116.379732,40.933228],[116.384019,40.928535],[116.384877,40.922848],[116.39274,40.913123],[116.396316,40.911264],[116.398533,40.906024],[116.404764,40.905736],[116.413715,40.899758],[116.418922,40.902339],[116.430905,40.903364],[116.436614,40.89939],[116.448492,40.899919],[116.45073,40.901345],[116.458676,40.900592],[116.464344,40.896329],[116.474047,40.896008],[116.477581,40.901746],[116.473608,40.91974],[116.468422,40.925091],[116.467209,40.931322],[116.461541,40.932684],[116.462315,40.935231],[116.455372,40.945433],[116.454829,40.949533],[116.447446,40.95384],[116.453302,40.964584],[116.451713,40.968667],[116.455519,40.980481],[116.464135,40.984498],[116.474193,40.978608],[116.47894,40.979104],[116.485612,40.982465],[116.493726,40.977919],[116.496737,40.978432],[116.504516,40.975919],[116.51629,40.975198],[116.519573,40.981569],[116.524718,40.981073],[116.533417,40.985698],[116.535634,40.988675],[116.541991,40.99026],[116.547826,40.988003],[116.558617,40.988627],[116.561231,40.993461],[116.569177,40.991636],[116.574928,40.986307],[116.589692,40.976703],[116.597764,40.97475],[116.614515,40.983314],[116.617067,40.998725],[116.614892,41.003574],[116.619179,41.01423],[116.621897,41.015749],[116.62288,41.020693],[116.621228,41.028978],[116.617589,41.034704],[116.614118,41.036096],[116.613491,41.040782],[116.617736,41.048649],[116.61646,41.053382],[116.624093,41.054437],[116.630848,41.0608],[116.637937,41.060497],[116.641158,41.058322],[116.647431,41.059393],[116.653914,41.05626],[116.657009,41.051303],[116.665207,41.046682],[116.673279,41.046378],[116.67698,41.042732],[116.682878,41.041789],[116.688629,41.044651],[116.692246,41.040813],[116.691347,41.037503],[116.69509,41.033265],[116.695739,41.025396],[116.698855,41.021253],[116.693836,41.013686],[116.690866,41.012982],[116.69095,41.007254],[116.683066,41.000486],[116.682543,40.986259],[116.685304,40.982641],[116.681267,40.980737],[116.677921,40.975983],[116.677921,40.970972],[116.687248,40.962551],[116.689298,40.951118],[116.696178,40.94452],[116.702368,40.940628],[116.702786,40.936512],[116.70722,40.934029],[116.712197,40.934846],[116.713891,40.929416],[116.722318,40.92743],[116.717111,40.921695],[116.713347,40.910431],[116.716881,40.910175],[116.723678,40.906313],[116.726145,40.901185],[116.730432,40.897771],[116.739759,40.896665],[116.750257,40.891665],[116.759501,40.889854],[116.758539,40.881983],[116.762135,40.880765],[116.769392,40.882961],[116.772362,40.87852],[116.776795,40.878376],[116.797226,40.860034],[116.796996,40.854886],[116.802413,40.851198],[116.802496,40.842392],[116.805947,40.840836],[116.813622,40.848423],[116.820732,40.848263],[116.823471,40.842681],[116.828009,40.841109],[116.831815,40.842585],[116.837775,40.841542],[116.839741,40.839024],[116.84819,40.839313],[116.848587,40.837147],[116.855425,40.835447],[116.860633,40.830457],[116.861448,40.825356],[116.870378,40.821601],[116.876171,40.8212],[116.876735,40.818456],[116.882172,40.814172],[116.880207,40.804367],[116.886961,40.801076],[116.878575,40.797545],[116.873326,40.798781],[116.871277,40.794785],[116.862577,40.792858],[116.867471,40.784559],[116.858039,40.78305],[116.856806,40.77955],[116.851264,40.778924],[116.850448,40.775006],[116.834785,40.770221],[116.840076,40.760682],[116.831795,40.751303],[116.826211,40.749343],[116.818662,40.75042],[116.810527,40.749118],[116.802977,40.745986],[116.793629,40.748267],[116.783759,40.757631],[116.780727,40.751512],[116.782818,40.747817],[116.786352,40.736026],[116.790472,40.728973],[116.789091,40.712454],[116.786687,40.7103],[116.787105,40.704482],[116.783989,40.700496],[116.769246,40.70281],[116.762867,40.706427],[116.756155,40.705687],[116.754963,40.702891],[116.748668,40.700544],[116.747518,40.697072],[116.74252,40.69593],[116.735807,40.69167],[116.725581,40.689114],[116.725413,40.68466],[116.714915,40.680014],[116.713221,40.669867],[116.714309,40.666104],[116.709855,40.662598],[116.712636,40.653896],[116.711151,40.648218],[116.712197,40.641268],[116.70149,40.632917],[116.70195,40.628444],[116.705128,40.626947],[116.704689,40.620076],[116.701322,40.621379],[116.697955,40.618402],[116.702598,40.612785],[116.70655,40.610998],[116.707993,40.606507],[116.705609,40.60303],[116.711235,40.600213],[116.708495,40.595206],[116.711611,40.59189],[116.708955,40.590054],[116.714351,40.58028],[116.71456,40.570682],[116.710503,40.568685],[116.709855,40.565512],[116.699336,40.563563],[116.686349,40.564497],[116.679636,40.562001],[116.682397,40.556766],[116.66872,40.557507],[116.665771,40.552432],[116.67698,40.554462],[116.68225,40.548904],[116.690699,40.549468],[116.702138,40.545456],[116.701469,40.539913],[116.706948,40.532582],[116.712573,40.529955],[116.717216,40.524798],[116.712239,40.522058],[116.711402,40.516465],[116.701071,40.510549],[116.699106,40.50444],[116.698353,40.493266],[116.693376,40.490783],[116.694149,40.485462],[116.704334,40.479043],[116.69348,40.481704],[116.693397,40.476108],[116.695571,40.466721],[116.698667,40.468043],[116.706174,40.459929],[116.716902,40.457074],[116.719223,40.460397],[116.723594,40.458542],[116.7196,40.455735],[116.719265,40.448636],[116.725811,40.443085],[116.72098,40.440988],[116.716421,40.441714],[116.723552,40.435065],[116.722339,40.423832],[116.72556,40.418053],[116.73244,40.420604],[116.733235,40.418312],[116.741139,40.414631],[116.728801,40.40982],[116.724389,40.409191],[116.723427,40.405316],[116.718512,40.402055],[116.713242,40.40157],[116.713849,40.395806],[116.711716,40.386908],[116.716254,40.384114],[116.707115,40.377007],[116.706509,40.373809],[116.714079,40.368608],[116.719872,40.369044],[116.718094,40.361338],[116.726773,40.361193],[116.725769,40.355619],[116.729031,40.355619],[116.727484,40.346522],[116.723887,40.344033],[116.722967,40.339152],[116.731185,40.339023],[116.73129,40.335031],[116.744046,40.339136],[116.744653,40.333706],[116.751491,40.335742],[116.758559,40.333884],[116.759689,40.326853],[116.762846,40.326707],[116.768639,40.317816],[116.773324,40.315973],[116.762888,40.310428],[116.756845,40.302586],[116.754461,40.303686],[116.738965,40.284101],[116.738421,40.284392],[116.710837,40.256227],[116.704668,40.257101],[116.704585,40.251551],[116.696554,40.248072],[116.697265,40.243216],[116.69072,40.240886],[116.684007,40.234282],[116.678131,40.234379],[116.676311,40.238604],[116.670247,40.234865],[116.668783,40.238539],[116.673321,40.246777],[116.669494,40.253153],[116.666901,40.262085],[116.648519,40.260143],[116.643081,40.25715],[116.641492,40.259463],[116.637038,40.25846],[116.63526,40.261454],[116.623654,40.26058],[116.6238,40.252667],[116.622044,40.250467],[116.61324,40.251761],[116.603787,40.251324],[116.604624,40.256146],[116.600755,40.258978],[116.599647,40.265385],[116.590842,40.264139],[116.588396,40.269462],[116.585238,40.266226],[116.58254,40.268362],[116.570202,40.268863],[116.570516,40.273102],[116.565371,40.273377],[116.566187,40.27802],[116.552176,40.27383],[116.546236,40.276224],[116.540904,40.274946],[116.53693,40.277178],[116.540088,40.267165],[116.535717,40.261373],[116.526181,40.261324],[116.523965,40.257522],[116.509201,40.258056],[116.505959,40.261356],[116.501839,40.262974],[116.493245,40.262489],[116.484273,40.267634],[116.484001,40.2759],[116.478794,40.280025],[116.472081,40.280122],[116.469634,40.283001],[116.460308,40.28711],[116.45533,40.284845],[116.449412,40.286722],[116.45096,40.293045],[116.448011,40.300484],[116.443766,40.302457],[116.44822,40.305982],[116.455184,40.316345],[116.449182,40.32113],[116.443745,40.322682],[116.438245,40.333221],[116.43423,40.329116],[116.427914,40.329213],[116.424359,40.331265],[116.417061,40.329843],[116.408989,40.333205],[116.408633,40.334886],[116.396358,40.334853],[116.391422,40.338393],[116.384563,40.339055],[116.375069,40.337375],[116.376135,40.334352],[116.365909,40.331702],[116.368231,40.334805],[116.369903,40.342401],[116.364508,40.349107],[116.367101,40.350351],[116.369673,40.356362],[116.363923,40.359028],[116.355641,40.356814],[116.348866,40.356427],[116.352797,40.364391],[116.357356,40.364084],[116.360033,40.366815],[116.355369,40.37137],[116.34506,40.373163],[116.337364,40.379769],[116.32398,40.387295],[116.32078,40.386859],[116.313106,40.389459],[116.302691,40.387473],[116.295581,40.384437],[116.293762,40.392415],[116.289872,40.391672]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":110117,\"name\":\"平谷区\",\"center\":[117.112335,40.144783],\"centroid\":[117.145392,40.208997],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":110000},\"subFeatureIndex\":13,\"acroutes\":[100000,110000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[116.961932,40.051358],[116.962288,40.063529],[116.970652,40.063805],[116.973476,40.066304],[116.978599,40.064893],[116.980816,40.071188],[116.982844,40.070685],[116.986274,40.078359],[116.981192,40.08149],[116.981862,40.089828],[116.979938,40.093867],[116.975462,40.095051],[116.967976,40.101214],[116.973329,40.103712],[116.976069,40.111188],[116.971301,40.114009],[116.969189,40.118776],[116.971594,40.124224],[116.96578,40.127823],[116.967829,40.129849],[116.970025,40.140321],[116.977763,40.151374],[116.972054,40.156301],[116.968749,40.163495],[116.961242,40.171937],[116.962037,40.175549],[116.951371,40.174788],[116.945349,40.1813],[116.945809,40.186224],[116.94997,40.186354],[116.945913,40.193141],[116.939556,40.192347],[116.930898,40.207084],[116.929685,40.211585],[116.938029,40.210549],[116.940978,40.223922],[116.935206,40.229847],[116.936837,40.232259],[116.945641,40.233441],[116.946896,40.236095],[116.953567,40.236079],[116.956286,40.232615],[116.959924,40.23268],[116.974082,40.24456],[116.975881,40.249463],[116.969293,40.253962],[116.961786,40.252635],[116.954341,40.25715],[116.950953,40.261081],[116.960468,40.2704],[116.961995,40.273442],[116.970527,40.276531],[116.971343,40.281724],[116.983765,40.287886],[116.991042,40.287724],[116.990833,40.290603],[116.99834,40.29083],[117.004091,40.293918],[117.002,40.299675],[117.011306,40.307113],[117.007563,40.314599],[117.006998,40.319255],[117.01024,40.320726],[117.012686,40.32674],[117.020842,40.336179],[117.026133,40.338458],[117.032762,40.33752],[117.039266,40.340057],[117.048279,40.341528],[117.052817,40.337649],[117.060931,40.337795],[117.066933,40.342983],[117.072286,40.342999],[117.072705,40.345584],[117.085231,40.350432],[117.0946,40.358285],[117.100915,40.360546],[117.117457,40.353744],[117.125362,40.35641],[117.128122,40.358866],[117.142385,40.362824],[117.147466,40.369965],[117.155329,40.371402],[117.157609,40.374859],[117.16796,40.371467],[117.170491,40.374342],[117.179943,40.375021],[117.185799,40.377767],[117.199747,40.375861],[117.204536,40.373082],[117.211124,40.373825],[117.218527,40.377718],[117.223901,40.375538],[117.22618,40.369044],[117.237055,40.370627],[117.242283,40.369981],[117.247762,40.364101],[117.250188,40.358381],[117.254182,40.357105],[117.25437,40.351191],[117.257089,40.341463],[117.261125,40.338781],[117.259828,40.336195],[117.267127,40.335694],[117.274969,40.331944],[117.271288,40.325285],[117.271853,40.319853],[117.274697,40.314405],[117.274342,40.308552],[117.285739,40.302214],[117.293309,40.296748],[117.294647,40.290894],[117.292368,40.286236],[117.29632,40.2781],[117.304309,40.278181],[117.316835,40.281999],[117.316794,40.285104],[117.32336,40.284441],[117.331244,40.289665],[117.334005,40.285654],[117.337999,40.265903],[117.337622,40.263266],[117.342202,40.256502],[117.339881,40.246194],[117.343457,40.242909],[117.345464,40.234946],[117.348246,40.234574],[117.351613,40.229459],[117.355691,40.229556],[117.36027,40.23255],[117.373989,40.232777],[117.386829,40.227111],[117.390029,40.227969],[117.39373,40.221656],[117.377586,40.218612],[117.378443,40.21029],[117.385679,40.207894],[117.393145,40.203376],[117.379552,40.201319],[117.381455,40.194906],[117.384382,40.195278],[117.38409,40.187828],[117.388356,40.188249],[117.397704,40.192914],[117.4077,40.187504],[117.404751,40.183244],[117.401217,40.183617],[117.391618,40.177607],[117.393186,40.174901],[117.380597,40.17691],[117.381225,40.172455],[117.377021,40.176327],[117.372023,40.176538],[117.368844,40.17299],[117.364014,40.176683],[117.359413,40.173346],[117.353746,40.17367],[117.351111,40.171661],[117.357343,40.164273],[117.360626,40.156965],[117.351717,40.150564],[117.355272,40.148587],[117.350525,40.144827],[117.356883,40.145037],[117.35636,40.140904],[117.351404,40.139932],[117.349082,40.136528],[117.330617,40.133691],[117.33093,40.13575],[117.323276,40.14071],[117.318571,40.138522],[117.313761,40.139964],[117.307613,40.136982],[117.302991,40.125926],[117.297073,40.121273],[117.297094,40.118857],[117.285425,40.121322],[117.275659,40.113636],[117.276663,40.109307],[117.274362,40.105804],[117.269908,40.107198],[117.266834,40.112177],[117.260393,40.114155],[117.255541,40.113279],[117.249268,40.116474],[117.245357,40.113215],[117.238226,40.111755],[117.236009,40.108382],[117.229025,40.103533],[117.228606,40.100257],[117.224403,40.098619],[117.224487,40.094662],[117.211249,40.096608],[117.21104,40.090785],[117.213989,40.086243],[117.204285,40.079657],[117.203616,40.076704],[117.208175,40.076834],[117.205247,40.07028],[117.197572,40.067748],[117.198576,40.070101],[117.191842,40.072973],[117.189207,40.082853],[117.18538,40.083875],[117.181533,40.080095],[117.186426,40.076202],[117.183603,40.072081],[117.175593,40.071642],[117.172227,40.074157],[117.158466,40.077435],[117.160139,40.075553],[117.15625,40.069338],[117.139227,40.064049],[117.128896,40.06546],[117.119507,40.072421],[117.107775,40.071805],[117.103927,40.075585],[117.085608,40.075131],[117.085064,40.068592],[117.080986,40.065087],[117.081049,40.068819],[117.069652,40.06757],[117.070634,40.064179],[117.064382,40.062783],[117.061182,40.060105],[117.052022,40.059375],[117.053382,40.052884],[117.051437,40.051163],[117.038639,40.049378],[117.033159,40.04235],[117.027032,40.038828],[117.028517,40.033957],[117.023916,40.033746],[117.024836,40.03011],[117.020884,40.032448],[117.018061,40.030467],[117.011369,40.031246],[117.000683,40.029915],[117.00016,40.032253],[116.991837,40.036896],[116.985626,40.038828],[116.972095,40.036977],[116.969293,40.048583],[116.964902,40.047836],[116.961932,40.051358]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":110118,\"name\":\"密云区\",\"center\":[116.843352,40.377362],\"centroid\":[116.994846,40.526834],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":110000},\"subFeatureIndex\":14,\"acroutes\":[100000,110000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[116.886961,40.801076],[116.889073,40.798348],[116.896686,40.796438],[116.89495,40.790675],[116.895013,40.781733],[116.898589,40.77674],[116.904569,40.777286],[116.923391,40.773722],[116.923181,40.766897],[116.927908,40.757824],[116.923516,40.750596],[116.926548,40.744894],[116.940706,40.739786],[116.942714,40.729857],[116.946645,40.726916],[116.960134,40.721083],[116.96647,40.71525],[116.965111,40.709593],[116.969628,40.706362],[116.977533,40.705559],[116.979938,40.702826],[116.988177,40.703164],[116.990456,40.701203],[117.002481,40.697345],[117.005513,40.694853],[117.013418,40.694082],[117.018291,40.696011],[117.027848,40.694355],[117.031047,40.692136],[117.035585,40.694467],[117.036108,40.697265],[117.044494,40.700367],[117.054887,40.699804],[117.058338,40.70154],[117.076804,40.700029],[117.081153,40.702617],[117.086047,40.702055],[117.095144,40.705559],[117.110661,40.708243],[117.117792,40.700078],[117.128792,40.700913],[117.132493,40.698663],[117.142531,40.6972],[117.147571,40.698968],[117.159491,40.696332],[117.16474,40.699628],[117.169236,40.699097],[117.176639,40.693567],[117.180947,40.694082],[117.182453,40.697072],[117.193996,40.696268],[117.197802,40.694291],[117.202361,40.695577],[117.208405,40.694435],[117.210622,40.691976],[117.217335,40.69196],[117.218715,40.689484],[117.233207,40.683583],[117.234336,40.680577],[117.241635,40.676669],[117.256775,40.679467],[117.261397,40.681155],[117.267754,40.676669],[117.273401,40.670076],[117.278629,40.667551],[117.278608,40.664463],[117.290423,40.660185],[117.321164,40.658287],[117.331851,40.661504],[117.337622,40.664447],[117.336681,40.666956],[117.342411,40.673437],[117.359748,40.673919],[117.37058,40.679708],[117.378192,40.678808],[117.386996,40.684178],[117.397223,40.683776],[117.409226,40.687281],[117.414852,40.685947],[117.419348,40.68696],[117.426437,40.685304],[117.432711,40.681622],[117.437332,40.683599],[117.442226,40.676605],[117.453958,40.677618],[117.465188,40.673534],[117.471503,40.674338],[117.482399,40.679033],[117.484741,40.677087],[117.493357,40.67527],[117.502934,40.669674],[117.514583,40.660523],[117.513913,40.656196],[117.50283,40.653076],[117.505026,40.646142],[117.501972,40.644518],[117.500425,40.6362],[117.489948,40.636023],[117.486163,40.633496],[117.477986,40.635331],[117.475539,40.644421],[117.473093,40.644453],[117.467885,40.649521],[117.464309,40.648652],[117.462009,40.653076],[117.449106,40.651596],[117.456467,40.649167],[117.451448,40.646577],[117.45402,40.642844],[117.448876,40.62838],[117.442289,40.627977],[117.438002,40.625692],[117.431561,40.625596],[117.42857,40.631887],[117.428884,40.637632],[117.421188,40.635427],[117.42054,40.629232],[117.424701,40.621862],[117.422987,40.618305],[117.41918,40.617114],[117.412739,40.605123],[117.414747,40.600728],[117.421753,40.593178],[117.420623,40.590875],[117.423217,40.58144],[117.429804,40.579298],[117.429992,40.576126],[117.42123,40.569104],[117.413471,40.569893],[117.40358,40.574257],[117.400589,40.569345],[117.39465,40.567912],[117.389297,40.561244],[117.378422,40.56337],[117.375453,40.567799],[117.369221,40.57036],[117.365917,40.575965],[117.353014,40.578831],[117.350023,40.582197],[117.342767,40.581585],[117.334611,40.576464],[117.328442,40.575948],[117.325451,40.578155],[117.311837,40.578026],[117.299562,40.566801],[117.285592,40.565061],[117.279256,40.560342],[117.273191,40.561501],[117.268507,40.559842],[117.25964,40.552867],[117.24954,40.548179],[117.250606,40.542024],[117.247427,40.540236],[117.252007,40.53632],[117.255123,40.527973],[117.26146,40.51906],[117.264115,40.517271],[117.263133,40.513145],[117.255562,40.514934],[117.246821,40.511968],[117.239543,40.516723],[117.230405,40.511162],[117.219969,40.514321],[117.215013,40.513273],[117.212504,40.507906],[117.214449,40.506922],[117.208572,40.501102],[117.208426,40.498071],[117.212065,40.494685],[117.21792,40.494589],[117.22846,40.481301],[117.225783,40.47585],[117.230907,40.470463],[117.237243,40.468785],[117.233207,40.463204],[117.236532,40.456558],[117.243308,40.455428],[117.252154,40.450459],[117.252635,40.446038],[117.263342,40.442375],[117.257654,40.435372],[117.246737,40.426883],[117.243872,40.422848],[117.234085,40.417149],[117.237515,40.407786],[117.236616,40.400844],[117.240484,40.39763],[117.240694,40.394417],[117.23695,40.394078],[117.235382,40.389556],[117.229045,40.386843],[117.226661,40.378558],[117.223901,40.375538],[117.218527,40.377718],[117.211124,40.373825],[117.204536,40.373082],[117.199747,40.375861],[117.185799,40.377767],[117.179943,40.375021],[117.170491,40.374342],[117.16796,40.371467],[117.157609,40.374859],[117.155329,40.371402],[117.147466,40.369965],[117.142385,40.362824],[117.128122,40.358866],[117.125362,40.35641],[117.117457,40.353744],[117.100915,40.360546],[117.0946,40.358285],[117.085231,40.350432],[117.072705,40.345584],[117.072286,40.342999],[117.066933,40.342983],[117.060931,40.337795],[117.052817,40.337649],[117.048279,40.341528],[117.039266,40.340057],[117.032762,40.33752],[117.026133,40.338458],[117.020842,40.336179],[117.012686,40.32674],[117.01024,40.320726],[117.006998,40.319255],[117.007563,40.314599],[117.011306,40.307113],[117.002,40.299675],[117.004091,40.293918],[116.99834,40.29083],[116.990833,40.290603],[116.991042,40.287724],[116.983765,40.287886],[116.971343,40.281724],[116.970527,40.276531],[116.961995,40.273442],[116.960468,40.2704],[116.950953,40.261081],[116.954341,40.25715],[116.961786,40.252635],[116.969293,40.253962],[116.975881,40.249463],[116.974082,40.24456],[116.959924,40.23268],[116.956286,40.232615],[116.953567,40.236079],[116.946896,40.236095],[116.945641,40.233441],[116.936837,40.232259],[116.935206,40.229847],[116.931065,40.230624],[116.92544,40.225768],[116.922031,40.220134],[116.915507,40.222271],[116.913917,40.220118],[116.908606,40.222401],[116.906598,40.228682],[116.900701,40.228763],[116.893946,40.233457],[116.901746,40.23684],[116.894343,40.240028],[116.892252,40.245709],[116.886585,40.251907],[116.886104,40.255256],[116.881273,40.259221],[116.879893,40.264139],[116.874247,40.268281],[116.876338,40.274348],[116.871737,40.281481],[116.871319,40.290943],[116.859462,40.290878],[116.857182,40.2929],[116.854547,40.303152],[116.848984,40.311204],[116.838382,40.310185],[116.828992,40.304413],[116.830101,40.299206],[116.827215,40.298333],[116.82458,40.290991],[116.825123,40.285347],[116.811823,40.282387],[116.809607,40.28601],[116.800572,40.289196],[116.794487,40.287417],[116.788025,40.289439],[116.787795,40.281449],[116.784073,40.279443],[116.782964,40.273248],[116.773512,40.269527],[116.771651,40.266501],[116.768597,40.270109],[116.762658,40.269058],[116.752788,40.275512],[116.74298,40.279087],[116.738337,40.278764],[116.741098,40.283001],[116.738965,40.284101],[116.754461,40.303686],[116.756845,40.302586],[116.762888,40.310428],[116.773324,40.315973],[116.768639,40.317816],[116.762846,40.326707],[116.759689,40.326853],[116.758559,40.333884],[116.751491,40.335742],[116.744653,40.333706],[116.744046,40.339136],[116.73129,40.335031],[116.731185,40.339023],[116.722967,40.339152],[116.723887,40.344033],[116.727484,40.346522],[116.729031,40.355619],[116.725769,40.355619],[116.726773,40.361193],[116.718094,40.361338],[116.719872,40.369044],[116.714079,40.368608],[116.706509,40.373809],[116.707115,40.377007],[116.716254,40.384114],[116.711716,40.386908],[116.713849,40.395806],[116.713242,40.40157],[116.718512,40.402055],[116.723427,40.405316],[116.724389,40.409191],[116.728801,40.40982],[116.741139,40.414631],[116.733235,40.418312],[116.73244,40.420604],[116.72556,40.418053],[116.722339,40.423832],[116.723552,40.435065],[116.716421,40.441714],[116.72098,40.440988],[116.725811,40.443085],[116.719265,40.448636],[116.7196,40.455735],[116.723594,40.458542],[116.719223,40.460397],[116.716902,40.457074],[116.706174,40.459929],[116.698667,40.468043],[116.695571,40.466721],[116.693397,40.476108],[116.69348,40.481704],[116.704334,40.479043],[116.694149,40.485462],[116.693376,40.490783],[116.698353,40.493266],[116.699106,40.50444],[116.701071,40.510549],[116.711402,40.516465],[116.712239,40.522058],[116.717216,40.524798],[116.712573,40.529955],[116.706948,40.532582],[116.701469,40.539913],[116.702138,40.545456],[116.690699,40.549468],[116.68225,40.548904],[116.67698,40.554462],[116.665771,40.552432],[116.66872,40.557507],[116.682397,40.556766],[116.679636,40.562001],[116.686349,40.564497],[116.699336,40.563563],[116.709855,40.565512],[116.710503,40.568685],[116.71456,40.570682],[116.714351,40.58028],[116.708955,40.590054],[116.711611,40.59189],[116.708495,40.595206],[116.711235,40.600213],[116.705609,40.60303],[116.707993,40.606507],[116.70655,40.610998],[116.702598,40.612785],[116.697955,40.618402],[116.701322,40.621379],[116.704689,40.620076],[116.705128,40.626947],[116.70195,40.628444],[116.70149,40.632917],[116.712197,40.641268],[116.711151,40.648218],[116.712636,40.653896],[116.709855,40.662598],[116.714309,40.666104],[116.713221,40.669867],[116.714915,40.680014],[116.725413,40.68466],[116.725581,40.689114],[116.735807,40.69167],[116.74252,40.69593],[116.747518,40.697072],[116.748668,40.700544],[116.754963,40.702891],[116.756155,40.705687],[116.762867,40.706427],[116.769246,40.70281],[116.783989,40.700496],[116.787105,40.704482],[116.786687,40.7103],[116.789091,40.712454],[116.790472,40.728973],[116.786352,40.736026],[116.782818,40.747817],[116.780727,40.751512],[116.783759,40.757631],[116.793629,40.748267],[116.802977,40.745986],[116.810527,40.749118],[116.818662,40.75042],[116.826211,40.749343],[116.831795,40.751303],[116.840076,40.760682],[116.834785,40.770221],[116.850448,40.775006],[116.851264,40.778924],[116.856806,40.77955],[116.858039,40.78305],[116.867471,40.784559],[116.862577,40.792858],[116.871277,40.794785],[116.873326,40.798781],[116.878575,40.797545],[116.886961,40.801076]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":110119,\"name\":\"延庆区\",\"center\":[115.985006,40.465325],\"centroid\":[116.16401,40.540016],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":110000},\"subFeatureIndex\":15,\"acroutes\":[100000,110000]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[115.967006,40.265612],[115.961611,40.269219],[115.960231,40.274914],[115.955212,40.276984],[115.951698,40.282015],[115.950088,40.289228],[115.946115,40.289034],[115.945885,40.296199],[115.939757,40.304397],[115.943814,40.310945],[115.937185,40.313047],[115.935721,40.316717],[115.929239,40.32105],[115.926792,40.319611],[115.922672,40.325899],[115.92721,40.329601],[115.922881,40.332898],[115.921417,40.338668],[115.924094,40.341059],[115.920581,40.346473],[115.918301,40.35389],[115.909539,40.357622],[115.892997,40.355554],[115.890927,40.357897],[115.88526,40.357024],[115.883169,40.359545],[115.878066,40.359367],[115.876226,40.362146],[115.872754,40.359593],[115.864452,40.359335],[115.861901,40.363422],[115.861859,40.373422],[115.855962,40.37712],[115.846865,40.375085],[115.840633,40.381094],[115.837454,40.381255],[115.836555,40.38568],[115.796445,40.426834],[115.796884,40.432531],[115.78992,40.432483],[115.786679,40.437066],[115.77043,40.444166],[115.773546,40.44812],[115.77248,40.452831],[115.77547,40.45204],[115.7734,40.457397],[115.779527,40.464075],[115.772856,40.462301],[115.770367,40.46493],[115.771559,40.47285],[115.776683,40.477511],[115.776202,40.482704],[115.782204,40.492073],[115.774529,40.493911],[115.768088,40.498345],[115.744039,40.498249],[115.743077,40.494959],[115.73605,40.503988],[115.743098,40.513854],[115.743788,40.518464],[115.748702,40.526087],[115.755624,40.531019],[115.752968,40.536288],[115.75506,40.540042],[115.759577,40.538914],[115.763885,40.540574],[115.770179,40.548002],[115.773902,40.548582],[115.776327,40.552158],[115.784713,40.558376],[115.7922,40.561292],[115.79908,40.5577],[115.804915,40.55865],[115.815036,40.55741],[115.819804,40.559343],[115.82154,40.563305],[115.820662,40.568234],[115.827374,40.587027],[115.846175,40.593049],[115.854895,40.590151],[115.86623,40.593371],[115.867777,40.595786],[115.885406,40.595223],[115.888146,40.597026],[115.894733,40.606878],[115.897849,40.608101],[115.907803,40.617291],[115.920372,40.616632],[115.928297,40.612753],[115.935031,40.613316],[115.944672,40.611095],[115.948331,40.608809],[115.955107,40.609534],[115.967404,40.605896],[115.965877,40.601002],[115.971983,40.60237],[115.97512,40.590779],[115.982147,40.579008],[115.995238,40.579862],[115.996116,40.58392],[116.005109,40.584097],[116.025268,40.60654],[116.028509,40.607328],[116.030036,40.597364],[116.032357,40.599875],[116.04457,40.602032],[116.050907,40.606121],[116.058289,40.607006],[116.062722,40.610322],[116.069811,40.610258],[116.073492,40.612125],[116.076691,40.619883],[116.08583,40.623825],[116.088507,40.626626],[116.098879,40.630584],[116.1044,40.626996],[116.118349,40.627961],[116.122071,40.629989],[116.120419,40.633287],[116.112744,40.640946],[116.111531,40.646287],[116.113225,40.648845],[116.125229,40.654089],[116.13694,40.667648],[116.142858,40.666972],[116.151432,40.663338],[116.162683,40.662437],[116.167597,40.672633],[116.168413,40.67892],[116.171487,40.68167],[116.173683,40.689034],[116.171341,40.695979],[116.176213,40.700544],[116.177907,40.707889],[116.181128,40.712438],[116.184913,40.713675],[116.192274,40.724779],[116.197753,40.7269],[116.2057,40.733038],[116.204717,40.739946],[116.210551,40.741713],[116.213249,40.740139],[116.220359,40.744669],[116.220485,40.749183],[116.223308,40.753793],[116.23366,40.759896],[116.229979,40.762417],[116.231757,40.77149],[116.235625,40.775135],[116.235019,40.78313],[116.245224,40.78838],[116.247943,40.791831],[116.257834,40.787898],[116.261013,40.782938],[116.269587,40.777158],[116.26988,40.770703],[116.274167,40.766335],[116.273456,40.762883],[116.277366,40.76163],[116.281402,40.763926],[116.290918,40.763814],[116.29786,40.756812],[116.304762,40.755656],[116.30794,40.752122],[116.311119,40.75511],[116.30794,40.763734],[116.313168,40.770205],[116.31756,40.77218],[116.330149,40.77377],[116.33314,40.772694],[116.342947,40.773096],[116.353111,40.770221],[116.361204,40.772646],[116.367687,40.77088],[116.37097,40.772453],[116.379837,40.772325],[116.392635,40.778394],[116.403217,40.778635],[116.407838,40.780417],[116.4143,40.777912],[116.416496,40.76937],[116.424861,40.767443],[116.431846,40.768246],[116.437722,40.766865],[116.444414,40.76921],[116.45395,40.76587],[116.465452,40.772742],[116.471517,40.771233],[116.4803,40.771586],[116.485193,40.765179],[116.491404,40.7633],[116.495482,40.759735],[116.50025,40.760811],[116.502906,40.756635],[116.501819,40.746581],[116.506461,40.743432],[116.513697,40.741456],[116.509493,40.73548],[116.510748,40.72645],[116.506858,40.720039],[116.504119,40.720135],[116.503115,40.715893],[116.506064,40.710879],[116.501923,40.706796],[116.501066,40.70228],[116.502676,40.697361],[116.496653,40.696879],[116.488811,40.69196],[116.483374,40.679403],[116.487138,40.674338],[116.492826,40.673984],[116.501568,40.671186],[116.505938,40.673067],[116.513488,40.672344],[116.517273,40.665734],[116.520096,40.66411],[116.518381,40.660925],[116.527039,40.6584],[116.529507,40.654588],[116.540046,40.656679],[116.544103,40.653767],[116.545023,40.650116],[116.550335,40.647606],[116.551151,40.642828],[116.55389,40.642877],[116.563886,40.636908],[116.573903,40.63628],[116.574092,40.631678],[116.568989,40.625483],[116.561231,40.628557],[116.551674,40.625209],[116.545003,40.627076],[116.539294,40.625612],[116.538938,40.619673],[116.535634,40.615698],[116.532915,40.606459],[116.535948,40.59944],[116.530929,40.595883],[116.531577,40.59131],[116.525136,40.583002],[116.517796,40.579749],[116.513153,40.572792],[116.509577,40.57276],[116.505144,40.562581],[116.499999,40.560921],[116.496277,40.555106],[116.484587,40.552867],[116.479651,40.541396],[116.470617,40.535418],[116.467125,40.530068],[116.460956,40.524363],[116.46587,40.518802],[116.470345,40.518963],[116.476306,40.514192],[116.488581,40.515853],[116.492073,40.518093],[116.497762,40.518093],[116.500459,40.510904],[116.506398,40.508212],[116.51194,40.501135],[116.519155,40.496604],[116.519092,40.491799],[116.511543,40.486929],[116.508322,40.483172],[116.492157,40.481027],[116.487347,40.481737],[116.483541,40.484994],[116.468212,40.48493],[116.465577,40.48701],[116.457903,40.488445],[116.455937,40.480914],[116.443201,40.481801],[116.433142,40.478189],[116.420971,40.480301],[116.416664,40.483011],[116.413673,40.481527],[116.4065,40.481995],[116.393702,40.47256],[116.38609,40.475802],[116.387344,40.482043],[116.376825,40.485736],[116.378603,40.491525],[116.377537,40.49683],[116.369632,40.500312],[116.365909,40.499635],[116.357042,40.501941],[116.348636,40.499071],[116.34232,40.500457],[116.336653,40.498636],[116.330567,40.500748],[116.323227,40.500151],[116.31321,40.491799],[116.31022,40.491702],[116.303779,40.485817],[116.29717,40.486768],[116.291691,40.485317],[116.294786,40.47535],[116.301646,40.468108],[116.306853,40.466092],[116.300955,40.458429],[116.293824,40.452831],[116.294368,40.449975],[116.289788,40.440907],[116.290667,40.435856],[116.294452,40.429304],[116.296648,40.420701],[116.291942,40.416617],[116.289433,40.418021],[116.288513,40.413437],[116.291608,40.408448],[116.287864,40.404719],[116.289746,40.402539],[116.286003,40.396032],[116.289872,40.391672],[116.290729,40.383177],[116.282845,40.375263],[116.270863,40.382693],[116.261264,40.380561],[116.258336,40.383193],[116.25338,40.381239],[116.252104,40.376297],[116.247796,40.374471],[116.24353,40.379818],[116.241962,40.377508],[116.23665,40.377427],[116.23184,40.374988],[116.226989,40.38111],[116.222221,40.382111],[116.211451,40.381756],[116.209129,40.376232],[116.192985,40.372775],[116.180354,40.367687],[116.177154,40.370934],[116.170713,40.369351],[116.168789,40.366718],[116.159295,40.366265],[116.148233,40.361807],[116.148651,40.35696],[116.145514,40.351046],[116.1507,40.349252],[116.155677,40.344906],[116.152603,40.337714],[116.144719,40.336631],[116.147543,40.340655],[116.144782,40.348541],[116.138404,40.345229],[116.140809,40.343047],[116.137567,40.340769],[116.137651,40.336534],[116.143904,40.336082],[116.13809,40.330974],[116.138383,40.324671],[116.141959,40.316879],[116.132737,40.31198],[116.122385,40.312805],[116.116237,40.321955],[116.116634,40.323668],[116.110381,40.330813],[116.102978,40.331524],[116.098649,40.330005],[116.086353,40.330813],[116.083342,40.33571],[116.077716,40.339346],[116.073429,40.339831],[116.06841,40.336971],[116.061802,40.336809],[116.053353,40.326853],[116.056971,40.322181],[116.051116,40.315812],[116.042479,40.316846],[116.040095,40.312724],[116.031144,40.312352],[116.026167,40.320484],[116.026481,40.324283],[116.01684,40.33466],[116.007597,40.33314],[115.999065,40.325463],[115.993398,40.328986],[115.982711,40.324202],[115.979658,40.320532],[115.973259,40.318997],[115.976417,40.311511],[115.975538,40.308698],[115.987919,40.303799],[115.990323,40.299498],[115.982732,40.297977],[115.978675,40.289633],[115.981227,40.28525],[115.978822,40.281627],[115.981812,40.276903],[115.976396,40.270983],[115.967006,40.265612]]]]}}]}', 'admin', '2020-12-10 10:26:00', NULL, '2020-12-10 10:26:00', '0', NULL); +INSERT INTO `jimu_report_map` VALUES ('1338695077400154114', '无锡市', 'wuxi', '{\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"properties\":{\"adcode\":320205,\"name\":\"锡山区\",\"center\":[120.357298,31.585559],\"centroid\":[120.482864,31.624824],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":320200},\"subFeatureIndex\":0,\"acroutes\":[100000,320000,320200]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120.581713,31.727632],[120.582451,31.721169],[120.58458,31.71792],[120.58509,31.714432],[120.589848,31.714115],[120.590836,31.712997],[120.596788,31.710822],[120.599079,31.710716],[120.600806,31.708849],[120.600231,31.706876],[120.595734,31.705608],[120.592802,31.700817],[120.587024,31.696166],[120.584917,31.69281],[120.578118,31.6937],[120.578367,31.689947],[120.575587,31.691824],[120.576836,31.689463],[120.572405,31.689692],[120.570059,31.688908],[120.568049,31.685199],[120.566235,31.685393],[120.566094,31.683112],[120.562858,31.680513],[120.564161,31.67891],[120.566626,31.678672],[120.566377,31.676143],[120.568766,31.668593],[120.568625,31.665174],[120.566789,31.659931],[120.558589,31.658504],[120.561066,31.655693],[120.571731,31.655781],[120.583429,31.651957],[120.586643,31.651816],[120.592128,31.650282],[120.595854,31.643761],[120.589587,31.636525],[120.595571,31.631395],[120.592107,31.62504],[120.6006,31.617115],[120.596266,31.613298],[120.591488,31.611499],[120.584482,31.613439],[120.577086,31.614162],[120.570026,31.609445],[120.567126,31.609172],[120.568343,31.606183],[120.566464,31.601933],[120.557058,31.600302],[120.553104,31.60561],[120.546251,31.604693],[120.54309,31.601739],[120.545078,31.585717],[120.547782,31.583283],[120.546848,31.579685],[120.548,31.576599],[120.550215,31.575011],[120.553072,31.575082],[120.563629,31.579597],[120.568256,31.576299],[120.573035,31.577472],[120.567419,31.583998],[120.570428,31.585665],[120.573838,31.585947],[120.584254,31.585144],[120.587045,31.583389],[120.594572,31.576008],[120.595962,31.571492],[120.597548,31.563862],[120.599264,31.54846],[120.60502,31.546078],[120.602805,31.541182],[120.602913,31.53827],[120.605118,31.535685],[120.60426,31.530867],[120.605759,31.525247],[120.602349,31.51899],[120.600035,31.51861],[120.598569,31.516166],[120.595636,31.517145],[120.593986,31.525502],[120.592758,31.52755],[120.589826,31.526967],[120.585775,31.524532],[120.576923,31.517498],[120.568549,31.512371],[120.559849,31.508964],[120.555201,31.507579],[120.551616,31.500632],[120.548499,31.497402],[120.548043,31.495089],[120.549086,31.489175],[120.553007,31.486738],[120.555244,31.480294],[120.555233,31.477866],[120.553441,31.477027],[120.551236,31.48213],[120.552062,31.483825],[120.547793,31.486244],[120.546197,31.487912],[120.542971,31.487612],[120.534999,31.487921],[120.533055,31.490675],[120.531024,31.495327],[120.528613,31.497887],[120.5253,31.499229],[120.525267,31.502583],[120.522389,31.504631],[120.519804,31.500888],[120.518295,31.501718],[120.519598,31.504604],[120.521118,31.504507],[120.521129,31.507402],[120.519196,31.508929],[120.518251,31.512759],[120.521542,31.512609],[120.523519,31.514524],[120.521455,31.515672],[120.52265,31.517869],[120.522606,31.521452],[120.528786,31.526588],[120.523888,31.529244],[120.518914,31.527453],[120.516959,31.529817],[120.513016,31.531547],[120.508096,31.534926],[120.506782,31.537476],[120.504544,31.538791],[120.505967,31.542099],[120.502774,31.544552],[120.504523,31.549493],[120.503295,31.552686],[120.498647,31.554697],[120.490707,31.557414],[120.486971,31.555941],[120.481334,31.554883],[120.481693,31.55954],[120.477033,31.558905],[120.47623,31.560511],[120.472819,31.561066],[120.473112,31.563986],[120.46614,31.564674],[120.466715,31.566791],[120.46085,31.565838],[120.457831,31.564171],[120.455116,31.568061],[120.45176,31.5665],[120.451477,31.568255],[120.448545,31.569631],[120.448968,31.571095],[120.444178,31.576475],[120.439237,31.574676],[120.434099,31.576466],[120.429288,31.577286],[120.422543,31.580823],[120.419404,31.581026],[120.415733,31.583425],[120.414267,31.580691],[120.399615,31.580197],[120.394522,31.57674],[120.394804,31.573635],[120.39374,31.573538],[120.39677,31.569516],[120.392588,31.567408],[120.388646,31.570919],[120.387321,31.573441],[120.385051,31.573776],[120.380435,31.575875],[120.37811,31.576025],[120.372028,31.573679],[120.369367,31.573397],[120.366913,31.57009],[120.362753,31.569031],[120.351881,31.568035],[120.348905,31.565847],[120.346135,31.569516],[120.348394,31.570857],[120.349557,31.574455],[120.345886,31.575858],[120.347135,31.581326],[120.34581,31.590876],[120.342334,31.598274],[120.340792,31.599958],[120.341096,31.60308],[120.349231,31.602762],[120.352848,31.603847],[120.352587,31.607479],[120.350013,31.610838],[120.340042,31.610486],[120.321741,31.613562],[120.31794,31.613792],[120.314432,31.612989],[120.314606,31.619072],[120.315779,31.632012],[120.317723,31.634551],[120.323903,31.636146],[120.329985,31.638737],[120.334123,31.637821],[120.334905,31.636199],[120.340683,31.635485],[120.343257,31.63664],[120.346668,31.636128],[120.345266,31.646017],[120.345288,31.65245],[120.357811,31.652714],[120.360461,31.655323],[120.362644,31.655349],[120.366326,31.653419],[120.368075,31.653499],[120.368716,31.655781],[120.374765,31.660962],[120.378751,31.665685],[120.382629,31.667377],[120.391176,31.674478],[120.390981,31.676689],[120.389373,31.677932],[120.383204,31.679491],[120.379349,31.682037],[120.378056,31.684407],[120.376981,31.690978],[120.3776,31.693383],[120.382857,31.694202],[120.384909,31.695171],[120.390307,31.699513],[120.394174,31.699231],[120.398106,31.697408],[120.399398,31.699998],[120.402982,31.699522],[120.411041,31.703538],[120.415375,31.704604],[120.41986,31.704498],[120.427376,31.70249],[120.430309,31.704604],[120.432948,31.705309],[120.44685,31.706084],[120.451173,31.707255],[120.452824,31.711456],[120.456701,31.710725],[120.458309,31.7132],[120.461339,31.714503],[120.46261,31.716132],[120.471907,31.712513],[120.485125,31.713728],[120.487297,31.715445],[120.491272,31.713719],[120.492163,31.711905],[120.491022,31.70965],[120.496312,31.710417],[120.498288,31.713402],[120.504827,31.713825],[120.507336,31.724119],[120.50853,31.724762],[120.518284,31.734896],[120.528504,31.725818],[120.535129,31.721653],[120.541755,31.723397],[120.546968,31.725977],[120.551953,31.726734],[120.562412,31.723062],[120.56806,31.722957],[120.576,31.726153],[120.580257,31.726329],[120.581713,31.727632]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":320206,\"name\":\"惠山区\",\"center\":[120.303543,31.681019],\"centroid\":[120.210639,31.65177],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":320200},\"subFeatureIndex\":1,\"acroutes\":[100000,320000,320200]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120.074955,31.554424],[120.071827,31.554371],[120.069188,31.552492],[120.063899,31.555571],[120.058208,31.559523],[120.056155,31.563404],[120.05937,31.56904],[120.059457,31.57263],[120.055775,31.576669],[120.057067,31.5804],[120.061814,31.583072],[120.064692,31.586961],[120.068526,31.590127],[120.070622,31.590956],[120.07489,31.595364],[120.075585,31.607118],[120.084242,31.611808],[120.093962,31.618085],[120.10238,31.625877],[120.104476,31.628769],[120.116423,31.62995],[120.119486,31.630893],[120.121115,31.638147],[120.124482,31.648238],[120.125883,31.657843],[120.126024,31.673844],[120.126709,31.678725],[120.128533,31.684636],[120.143272,31.676073],[120.151037,31.682398],[120.151027,31.684829],[120.149365,31.686221],[120.143,31.688327],[120.143858,31.689965],[120.14527,31.697065],[120.147703,31.69821],[120.15359,31.699143],[120.153166,31.70212],[120.156837,31.703829],[120.155979,31.712601],[120.158912,31.713948],[120.159477,31.717206],[120.16141,31.718069],[120.158075,31.722393],[120.158108,31.725924],[120.155176,31.727086],[120.155979,31.729569],[120.157684,31.730696],[120.156131,31.737942],[120.154752,31.741429],[120.155968,31.742045],[120.156077,31.751509],[120.155241,31.752283],[120.155621,31.756843],[120.159998,31.759079],[120.169023,31.760962],[120.17239,31.75804],[120.178657,31.758401],[120.183121,31.753296],[120.183947,31.749915],[120.197056,31.752706],[120.201161,31.753269],[120.203779,31.740381],[120.202921,31.735372],[120.203942,31.728891],[120.206451,31.726065],[120.215357,31.724321],[120.220494,31.723969],[120.224991,31.724779],[120.228857,31.727306],[120.237361,31.728363],[120.248646,31.726928],[120.254446,31.724365],[120.256933,31.72013],[120.261104,31.721002],[120.264384,31.722692],[120.273714,31.724603],[120.276157,31.723168],[120.282435,31.70338],[120.283662,31.7019],[120.292558,31.69909],[120.298423,31.698932],[120.311336,31.700253],[120.319395,31.700746],[120.333862,31.698192],[120.336013,31.694396],[120.346624,31.691145],[120.349209,31.689128],[120.360135,31.687481],[120.366619,31.689137],[120.371322,31.691612],[120.3776,31.693383],[120.376981,31.690978],[120.378056,31.684407],[120.379349,31.682037],[120.383204,31.679491],[120.389373,31.677932],[120.390981,31.676689],[120.391176,31.674478],[120.382629,31.667377],[120.378751,31.665685],[120.374765,31.660962],[120.368716,31.655781],[120.368075,31.653499],[120.366326,31.653419],[120.362644,31.655349],[120.360461,31.655323],[120.357811,31.652714],[120.345288,31.65245],[120.345266,31.646017],[120.346668,31.636128],[120.343257,31.63664],[120.340683,31.635485],[120.334905,31.636199],[120.334123,31.637821],[120.329985,31.638737],[120.323903,31.636146],[120.317723,31.634551],[120.315779,31.632012],[120.314606,31.619072],[120.312553,31.618825],[120.305287,31.62288],[120.300258,31.624881],[120.290168,31.626538],[120.282935,31.626521],[120.283108,31.6292],[120.269728,31.630778],[120.266491,31.625578],[120.265481,31.621567],[120.262331,31.619583],[120.253012,31.626741],[120.248233,31.626627],[120.243878,31.625384],[120.246289,31.6208],[120.24516,31.618102],[120.241565,31.615969],[120.244106,31.608846],[120.246105,31.600523],[120.242531,31.59249],[120.240576,31.592331],[120.234787,31.594359],[120.228358,31.594553],[120.222156,31.592666],[120.215476,31.592578],[120.214043,31.590832],[120.220983,31.579562],[120.220266,31.576528],[120.217084,31.57681],[120.213684,31.574605],[120.197914,31.568634],[120.196947,31.566738],[120.199054,31.564974],[120.197371,31.561551],[120.194482,31.561269],[120.186336,31.565935],[120.184435,31.564991],[120.183697,31.560458],[120.181611,31.556991],[120.179157,31.555474],[120.176735,31.556585],[120.175323,31.561631],[120.173346,31.564118],[120.168144,31.5647],[120.165189,31.566844],[120.163061,31.573662],[120.16255,31.576987],[120.161551,31.59413],[120.153927,31.589501],[120.14956,31.587384],[120.135995,31.582146],[120.134018,31.582225],[120.132063,31.579227],[120.128913,31.577533],[120.122408,31.577128],[120.119301,31.575381],[120.118661,31.572859],[120.113762,31.572083],[120.111514,31.570733],[120.112882,31.568864],[120.102054,31.563545],[120.091562,31.559258],[120.085143,31.557194],[120.074955,31.554424]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":320211,\"name\":\"滨湖区\",\"center\":[120.266053,31.550228],\"centroid\":[120.196866,31.446924],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":320200},\"subFeatureIndex\":2,\"acroutes\":[100000,320000,320200]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120.100153,31.335332],[120.100436,31.33939],[120.096145,31.352493],[120.093658,31.353138],[120.057252,31.356126],[120.044859,31.358805],[120.041905,31.361024],[120.040157,31.364498],[120.039711,31.378127],[120.044566,31.406228],[120.054786,31.434286],[120.060966,31.440424],[120.078757,31.450007],[120.087793,31.453416],[120.089987,31.45474],[120.091356,31.453186],[120.110069,31.461531],[120.105682,31.470493],[120.108733,31.480991],[120.111188,31.48514],[120.117607,31.493235],[120.123581,31.499202],[120.127501,31.501471],[120.129739,31.504701],[120.12319,31.511338],[120.12206,31.508479],[120.121984,31.505354],[120.118834,31.505504],[120.118378,31.51193],[120.120257,31.514983],[120.11626,31.516228],[120.117542,31.518037],[120.115771,31.519105],[120.111025,31.514039],[120.10743,31.511983],[120.102738,31.513545],[120.100501,31.516828],[120.103412,31.518557],[120.103955,31.521011],[120.10238,31.523146],[120.102358,31.527391],[120.103857,31.52815],[120.101587,31.529959],[120.102054,31.533523],[120.100729,31.533797],[120.10112,31.536841],[120.103151,31.538782],[120.101717,31.542002],[120.09948,31.542338],[120.096786,31.541138],[120.094169,31.541932],[120.095038,31.544173],[120.096732,31.543573],[120.099056,31.546299],[120.096949,31.547252],[120.097329,31.548743],[120.085339,31.550904],[120.082319,31.550286],[120.080191,31.55146],[120.081537,31.553418],[120.079561,31.555033],[120.074955,31.554424],[120.085143,31.557194],[120.091562,31.559258],[120.102054,31.563545],[120.112882,31.568864],[120.111514,31.570733],[120.113762,31.572083],[120.118661,31.572859],[120.119301,31.575381],[120.122408,31.577128],[120.128913,31.577533],[120.132063,31.579227],[120.134018,31.582225],[120.135995,31.582146],[120.14956,31.587384],[120.153927,31.589501],[120.161551,31.59413],[120.16255,31.576987],[120.163061,31.573662],[120.165189,31.566844],[120.168144,31.5647],[120.173346,31.564118],[120.175323,31.561631],[120.176735,31.556585],[120.179157,31.555474],[120.181611,31.556991],[120.183697,31.560458],[120.184435,31.564991],[120.186336,31.565935],[120.194482,31.561269],[120.197371,31.561551],[120.199054,31.564974],[120.196947,31.566738],[120.197914,31.568634],[120.213684,31.574605],[120.217084,31.57681],[120.220266,31.576528],[120.220983,31.579562],[120.214043,31.590832],[120.215476,31.592578],[120.222156,31.592666],[120.228358,31.594553],[120.234787,31.594359],[120.240576,31.592331],[120.242531,31.59249],[120.244454,31.587657],[120.250102,31.583045],[120.255489,31.580603],[120.25904,31.580259],[120.263189,31.578495],[120.269065,31.578856],[120.268011,31.580338],[120.271009,31.581229],[120.271954,31.579915],[120.27707,31.580497],[120.280643,31.577904],[120.279524,31.574755],[120.27985,31.570195],[120.283,31.565512],[120.289907,31.558191],[120.288267,31.554936],[120.285368,31.551451],[120.285096,31.549828],[120.287637,31.537626],[120.287855,31.535306],[120.291971,31.535262],[120.293046,31.532332],[120.297076,31.531432],[120.29675,31.528291],[120.295316,31.525847],[120.298227,31.523596],[120.303842,31.525114],[120.307937,31.524946],[120.310294,31.526605],[120.311532,31.521699],[120.310087,31.520269],[120.308241,31.520737],[120.307329,31.517401],[120.31126,31.514013],[120.313639,31.513227],[120.322121,31.513836],[120.323533,31.513077],[120.325695,31.516898],[120.330495,31.518805],[120.331679,31.522511],[120.334612,31.52657],[120.338055,31.529138],[120.347135,31.527338],[120.357453,31.518399],[120.362579,31.513439],[120.356269,31.509379],[120.351718,31.507879],[120.354031,31.500765],[120.354792,31.500879],[120.360429,31.491408],[120.359755,31.489907],[120.354998,31.488539],[120.357083,31.47384],[120.361221,31.471853],[120.359169,31.46795],[120.353293,31.461496],[120.355823,31.416459],[120.335546,31.407359],[120.308143,31.393266],[120.253121,31.366098],[120.209611,31.345668],[120.173715,31.30881],[120.110232,31.264001],[120.100153,31.335332]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":320213,\"name\":\"梁溪区\",\"center\":[120.296595,31.575706],\"centroid\":[120.299797,31.580629],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":320200},\"subFeatureIndex\":3,\"acroutes\":[100000,320000,320200]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120.345886,31.575858],[120.342844,31.576228],[120.340346,31.575038],[120.336784,31.575187],[120.336762,31.573706],[120.334253,31.573812],[120.334156,31.576493],[120.332005,31.577992],[120.330593,31.576819],[120.332516,31.573873],[120.329844,31.574014],[120.330202,31.572427],[120.333015,31.571527],[120.333167,31.569746],[120.331332,31.568343],[120.326346,31.569349],[120.326879,31.570866],[120.329518,31.569657],[120.32967,31.574041],[120.327052,31.5742],[120.32702,31.575778],[120.323631,31.575461],[120.325673,31.573679],[120.323805,31.572321],[120.319189,31.578953],[120.321046,31.579553],[120.319015,31.581326],[120.317506,31.579624],[120.319091,31.577551],[120.316843,31.576475],[120.316571,31.578415],[120.315094,31.575919],[120.317017,31.574438],[120.313954,31.573891],[120.317332,31.572912],[120.317614,31.574755],[120.319656,31.573723],[120.31958,31.569993],[120.323718,31.569869],[120.320405,31.568687],[120.322491,31.567946],[120.323077,31.562248],[120.32122,31.559558],[120.323642,31.559911],[120.324391,31.556762],[120.334514,31.55677],[120.343073,31.545408],[120.33799,31.543652],[120.335502,31.538967],[120.346505,31.528573],[120.347135,31.527338],[120.338055,31.529138],[120.334612,31.52657],[120.331679,31.522511],[120.330495,31.518805],[120.325695,31.516898],[120.323533,31.513077],[120.322121,31.513836],[120.313639,31.513227],[120.31126,31.514013],[120.307329,31.517401],[120.308241,31.520737],[120.310087,31.520269],[120.311532,31.521699],[120.310294,31.526605],[120.307937,31.524946],[120.303842,31.525114],[120.298227,31.523596],[120.295316,31.525847],[120.29675,31.528291],[120.297076,31.531432],[120.293046,31.532332],[120.291971,31.535262],[120.287855,31.535306],[120.287637,31.537626],[120.285096,31.549828],[120.285368,31.551451],[120.288267,31.554936],[120.289907,31.558191],[120.283,31.565512],[120.27985,31.570195],[120.279524,31.574755],[120.280643,31.577904],[120.27707,31.580497],[120.271954,31.579915],[120.271009,31.581229],[120.268011,31.580338],[120.269065,31.578856],[120.263189,31.578495],[120.25904,31.580259],[120.255489,31.580603],[120.250102,31.583045],[120.244454,31.587657],[120.242531,31.59249],[120.246105,31.600523],[120.244106,31.608846],[120.241565,31.615969],[120.24516,31.618102],[120.246289,31.6208],[120.243878,31.625384],[120.248233,31.626627],[120.253012,31.626741],[120.262331,31.619583],[120.265481,31.621567],[120.266491,31.625578],[120.269728,31.630778],[120.283108,31.6292],[120.282935,31.626521],[120.290168,31.626538],[120.300258,31.624881],[120.305287,31.62288],[120.312553,31.618825],[120.314606,31.619072],[120.314432,31.612989],[120.31794,31.613792],[120.321741,31.613562],[120.340042,31.610486],[120.350013,31.610838],[120.352587,31.607479],[120.352848,31.603847],[120.349231,31.602762],[120.341096,31.60308],[120.340792,31.599958],[120.342334,31.598274],[120.34581,31.590876],[120.347135,31.581326],[120.345886,31.575858]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":320214,\"name\":\"新吴区\",\"center\":[120.352782,31.550966],\"centroid\":[120.429487,31.506686],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":320200},\"subFeatureIndex\":4,\"acroutes\":[100000,320000,320200]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120.347135,31.527338],[120.346505,31.528573],[120.335502,31.538967],[120.33799,31.543652],[120.343073,31.545408],[120.334514,31.55677],[120.324391,31.556762],[120.323642,31.559911],[120.32122,31.559558],[120.323077,31.562248],[120.322491,31.567946],[120.320405,31.568687],[120.323718,31.569869],[120.31958,31.569993],[120.319656,31.573723],[120.317614,31.574755],[120.317332,31.572912],[120.313954,31.573891],[120.317017,31.574438],[120.315094,31.575919],[120.316571,31.578415],[120.316843,31.576475],[120.319091,31.577551],[120.317506,31.579624],[120.319015,31.581326],[120.321046,31.579553],[120.319189,31.578953],[120.323805,31.572321],[120.325673,31.573679],[120.323631,31.575461],[120.32702,31.575778],[120.327052,31.5742],[120.32967,31.574041],[120.329518,31.569657],[120.326879,31.570866],[120.326346,31.569349],[120.331332,31.568343],[120.333167,31.569746],[120.333015,31.571527],[120.330202,31.572427],[120.329844,31.574014],[120.332516,31.573873],[120.330593,31.576819],[120.332005,31.577992],[120.334156,31.576493],[120.334253,31.573812],[120.336762,31.573706],[120.336784,31.575187],[120.340346,31.575038],[120.342844,31.576228],[120.345886,31.575858],[120.349557,31.574455],[120.348394,31.570857],[120.346135,31.569516],[120.348905,31.565847],[120.351881,31.568035],[120.362753,31.569031],[120.366913,31.57009],[120.369367,31.573397],[120.372028,31.573679],[120.37811,31.576025],[120.380435,31.575875],[120.385051,31.573776],[120.387321,31.573441],[120.388646,31.570919],[120.392588,31.567408],[120.39677,31.569516],[120.39374,31.573538],[120.394804,31.573635],[120.394522,31.57674],[120.399615,31.580197],[120.414267,31.580691],[120.415733,31.583425],[120.419404,31.581026],[120.422543,31.580823],[120.429288,31.577286],[120.434099,31.576466],[120.439237,31.574676],[120.444178,31.576475],[120.448968,31.571095],[120.448545,31.569631],[120.451477,31.568255],[120.45176,31.5665],[120.455116,31.568061],[120.457831,31.564171],[120.46085,31.565838],[120.466715,31.566791],[120.46614,31.564674],[120.473112,31.563986],[120.472819,31.561066],[120.47623,31.560511],[120.477033,31.558905],[120.481693,31.55954],[120.481334,31.554883],[120.486971,31.555941],[120.490707,31.557414],[120.498647,31.554697],[120.503295,31.552686],[120.504523,31.549493],[120.502774,31.544552],[120.505967,31.542099],[120.504544,31.538791],[120.506782,31.537476],[120.508096,31.534926],[120.513016,31.531547],[120.516959,31.529817],[120.518914,31.527453],[120.523888,31.529244],[120.528786,31.526588],[120.522606,31.521452],[120.52265,31.517869],[120.521455,31.515672],[120.523519,31.514524],[120.521542,31.512609],[120.518251,31.512759],[120.519196,31.508929],[120.521129,31.507402],[120.521118,31.504507],[120.519598,31.504604],[120.518295,31.501718],[120.519804,31.500888],[120.522389,31.504631],[120.525267,31.502583],[120.5253,31.499229],[120.528613,31.497887],[120.531024,31.495327],[120.533055,31.490675],[120.534999,31.487921],[120.542971,31.487612],[120.546197,31.487912],[120.547793,31.486244],[120.552062,31.483825],[120.551236,31.48213],[120.553441,31.477027],[120.54636,31.473133],[120.543568,31.470264],[120.537312,31.468365],[120.53615,31.467094],[120.5311,31.466608],[120.526017,31.46833],[120.523845,31.468357],[120.516003,31.464427],[120.515981,31.460233],[120.517361,31.457831],[120.513852,31.456189],[120.512364,31.45708],[120.50853,31.45565],[120.505044,31.457964],[120.501406,31.457557],[120.495421,31.451093],[120.495758,31.447931],[120.487026,31.44862],[120.484799,31.447481],[120.485418,31.449901],[120.480552,31.449132],[120.474437,31.446571],[120.460177,31.445485],[120.438172,31.44877],[120.431721,31.448647],[120.437477,31.443047],[120.435001,31.442606],[120.430537,31.446395],[120.426584,31.445441],[120.422641,31.448991],[120.418818,31.448382],[120.355823,31.416459],[120.353293,31.461496],[120.359169,31.46795],[120.361221,31.471853],[120.357083,31.47384],[120.354998,31.488539],[120.359755,31.489907],[120.360429,31.491408],[120.354792,31.500879],[120.354031,31.500765],[120.351718,31.507879],[120.356269,31.509379],[120.362579,31.513439],[120.357453,31.518399],[120.347135,31.527338]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":320281,\"name\":\"江阴市\",\"center\":[120.275891,31.910984],\"centroid\":[120.303787,31.832204],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":320200},\"subFeatureIndex\":5,\"acroutes\":[100000,320000,320200]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120.581713,31.727632],[120.580257,31.726329],[120.576,31.726153],[120.56806,31.722957],[120.562412,31.723062],[120.551953,31.726734],[120.546968,31.725977],[120.541755,31.723397],[120.535129,31.721653],[120.528504,31.725818],[120.518284,31.734896],[120.50853,31.724762],[120.507336,31.724119],[120.504827,31.713825],[120.498288,31.713402],[120.496312,31.710417],[120.491022,31.70965],[120.492163,31.711905],[120.491272,31.713719],[120.487297,31.715445],[120.485125,31.713728],[120.471907,31.712513],[120.46261,31.716132],[120.461339,31.714503],[120.458309,31.7132],[120.456701,31.710725],[120.452824,31.711456],[120.451173,31.707255],[120.44685,31.706084],[120.432948,31.705309],[120.430309,31.704604],[120.427376,31.70249],[120.41986,31.704498],[120.415375,31.704604],[120.411041,31.703538],[120.402982,31.699522],[120.399398,31.699998],[120.398106,31.697408],[120.394174,31.699231],[120.390307,31.699513],[120.384909,31.695171],[120.382857,31.694202],[120.3776,31.693383],[120.371322,31.691612],[120.366619,31.689137],[120.360135,31.687481],[120.349209,31.689128],[120.346624,31.691145],[120.336013,31.694396],[120.333862,31.698192],[120.319395,31.700746],[120.311336,31.700253],[120.298423,31.698932],[120.292558,31.69909],[120.283662,31.7019],[120.282435,31.70338],[120.276157,31.723168],[120.273714,31.724603],[120.264384,31.722692],[120.261104,31.721002],[120.256933,31.72013],[120.254446,31.724365],[120.248646,31.726928],[120.237361,31.728363],[120.228857,31.727306],[120.224991,31.724779],[120.220494,31.723969],[120.215357,31.724321],[120.206451,31.726065],[120.203942,31.728891],[120.202921,31.735372],[120.203779,31.740381],[120.201161,31.753269],[120.200043,31.757767],[120.196556,31.764774],[120.192527,31.767352],[120.186108,31.783633],[120.185098,31.787681],[120.181242,31.79399],[120.174248,31.801029],[120.176192,31.807267],[120.179244,31.812853],[120.177886,31.814137],[120.172217,31.814947],[120.17049,31.817251],[120.172043,31.823004],[120.165494,31.825564],[120.163919,31.830287],[120.164093,31.832697],[120.167079,31.835485],[120.16999,31.836065],[120.173194,31.838774],[120.172521,31.840867],[120.1768,31.844499],[120.180493,31.849002],[120.184251,31.856124],[120.185185,31.860415],[120.182719,31.864855],[120.175888,31.870209],[120.168795,31.870165],[120.158119,31.867835],[120.151657,31.864187],[120.146161,31.862481],[120.144228,31.858929],[120.122809,31.859342],[120.117401,31.855007],[120.114088,31.855342],[120.098665,31.855553],[120.085469,31.853055],[120.080299,31.84748],[120.060489,31.834517],[120.056405,31.833348],[120.056698,31.831976],[120.051887,31.829152],[120.047966,31.825713],[120.044979,31.821755],[120.032011,31.826074],[120.030251,31.831272],[120.028763,31.832116],[120.025277,31.831677],[120.02279,31.828669],[120.022225,31.826654],[120.019292,31.822802],[120.014557,31.824948],[120.011331,31.823849],[120.009811,31.826989],[120.006292,31.825317],[120.003359,31.828246],[120.003685,31.838598],[120.000709,31.837859],[120.001187,31.840559],[120.000459,31.845616],[119.997342,31.845941],[119.99681,31.848984],[119.992911,31.84945],[119.990152,31.852809],[119.990217,31.854867],[119.995029,31.855939],[120.003272,31.859158],[120.005097,31.862543],[120.007997,31.8638],[120.007997,31.866886],[120.010506,31.867809],[120.013199,31.871686],[120.010223,31.873814],[120.01069,31.875546],[120.014774,31.881787],[120.009018,31.882868],[120.008518,31.885496],[120.006324,31.889127],[120.002555,31.8891],[120.000188,31.892537],[119.997831,31.894348],[120.001915,31.901484],[120.000894,31.905571],[120.005477,31.911889],[120.014991,31.914754],[120.022409,31.919692],[120.014405,31.927073],[120.011342,31.929331],[120.007399,31.935929],[120.008192,31.94033],[120.007649,31.947999],[120.008779,31.951293],[120.010832,31.953805],[120.01485,31.955149],[120.022399,31.967752],[120.064909,31.955465],[120.134811,31.939381],[120.175247,31.933829],[120.205875,31.931519],[120.236601,31.932907],[120.262994,31.941841],[120.294165,31.954886],[120.353054,31.980635],[120.370703,31.99082],[120.368878,31.961086],[120.371594,31.954956],[120.373527,31.946435],[120.375341,31.941727],[120.385996,31.935621],[120.390307,31.932195],[120.391252,31.928602],[120.390481,31.925852],[120.381065,31.918884],[120.379349,31.914148],[120.379761,31.912188],[120.38265,31.910949],[120.385214,31.911722],[120.385138,31.909534],[120.38857,31.909218],[120.390905,31.907926],[120.392067,31.905307],[120.396411,31.908181],[120.39791,31.90616],[120.40131,31.90536],[120.402385,31.907381],[120.40774,31.905518],[120.424998,31.898399],[120.436847,31.895604],[120.449544,31.891948],[120.466498,31.889979],[120.466574,31.887791],[120.468822,31.879616],[120.471299,31.879203],[120.484593,31.87442],[120.490881,31.871335],[120.492261,31.86547],[120.496073,31.860881],[120.502057,31.85215],[120.503274,31.841711],[120.508292,31.84369],[120.514428,31.841527],[120.517393,31.837947],[120.521977,31.834183],[120.528808,31.831351],[120.531306,31.827851],[120.529319,31.821324],[120.530839,31.81704],[120.529959,31.814674],[120.523693,31.810531],[120.522541,31.80629],[120.523942,31.801293],[120.526516,31.795548],[120.531154,31.793207],[120.531556,31.787796],[120.544394,31.787136],[120.544502,31.789468],[120.546229,31.791922],[120.548923,31.792054],[120.555483,31.794069],[120.555852,31.786872],[120.558383,31.78571],[120.57071,31.793779],[120.580735,31.784795],[120.584243,31.782146],[120.58874,31.771603],[120.589402,31.766182],[120.588533,31.762556],[120.594833,31.760434],[120.597668,31.75503],[120.600024,31.744625],[120.598754,31.742802],[120.594822,31.741138],[120.593323,31.738171],[120.589435,31.73494],[120.585601,31.735407],[120.584352,31.734465],[120.581713,31.727632]]]]}},{\"type\":\"Feature\",\"properties\":{\"adcode\":320282,\"name\":\"宜兴市\",\"center\":[119.820538,31.364384],\"centroid\":[119.787423,31.352315],\"childrenNum\":0,\"level\":\"district\",\"parent\":{\"adcode\":320200},\"subFeatureIndex\":6,\"acroutes\":[100000,320000,320200]},\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[[[120.100153,31.335332],[120.110232,31.264001],[119.920011,31.170918],[119.913103,31.169572],[119.900211,31.169182],[119.891305,31.16431],[119.885245,31.162875],[119.883463,31.161538],[119.878359,31.16082],[119.875242,31.162353],[119.86664,31.168314],[119.859406,31.168828],[119.856267,31.170121],[119.851304,31.167827],[119.8476,31.167579],[119.842148,31.168757],[119.837575,31.173673],[119.831808,31.172451],[119.82817,31.17447],[119.826464,31.173204],[119.823782,31.168226],[119.823445,31.165825],[119.82792,31.163363],[119.829744,31.161387],[119.829375,31.158269],[119.823304,31.154132],[119.813583,31.149614],[119.809858,31.148524],[119.806599,31.149392],[119.800995,31.156338],[119.798019,31.157436],[119.794066,31.156205],[119.791274,31.156612],[119.789233,31.159686],[119.789352,31.162158],[119.793392,31.168057],[119.792513,31.171459],[119.790492,31.173204],[119.786626,31.173762],[119.784606,31.176011],[119.779327,31.178784],[119.773039,31.178049],[119.765653,31.173779],[119.762286,31.173363],[119.755357,31.170777],[119.753163,31.171406],[119.747754,31.169661],[119.74467,31.169882],[119.74051,31.173416],[119.738609,31.173585],[119.732864,31.171494],[119.723708,31.169758],[119.715888,31.169572],[119.713107,31.167614],[119.710316,31.158862],[119.707937,31.154025],[119.703875,31.151899],[119.698727,31.153069],[119.693297,31.156958],[119.68275,31.160501],[119.679275,31.167118],[119.678048,31.16819],[119.672606,31.167995],[119.663733,31.165958],[119.66294,31.164798],[119.662516,31.159855],[119.660072,31.15896],[119.656401,31.155283],[119.649374,31.154105],[119.645768,31.150464],[119.641554,31.148116],[119.637775,31.140488],[119.638122,31.135526],[119.63078,31.131255],[119.621972,31.130032],[119.616052,31.130094],[119.613728,31.129181],[119.609775,31.123811],[119.602802,31.112139],[119.599782,31.10917],[119.592115,31.110056],[119.581992,31.108647],[119.576507,31.110269],[119.574096,31.113991],[119.571326,31.129013],[119.564039,31.135871],[119.560259,31.140718],[119.554188,31.143996],[119.545835,31.14785],[119.541382,31.152333],[119.534518,31.158109],[119.532596,31.159093],[119.536625,31.167889],[119.543022,31.17548],[119.546378,31.176038],[119.548963,31.177942],[119.552374,31.177969],[119.553579,31.179156],[119.553188,31.183168],[119.554296,31.191678],[119.552765,31.201083],[119.552971,31.208635],[119.552558,31.212389],[119.550745,31.21617],[119.553851,31.221048],[119.551233,31.224952],[119.544152,31.226864],[119.536115,31.233494],[119.534475,31.236761],[119.530793,31.237283],[119.529066,31.23931],[119.522593,31.242169],[119.528588,31.247506],[119.527122,31.25232],[119.531553,31.2564],[119.532183,31.258586],[119.530478,31.268965],[119.535669,31.272505],[119.535528,31.275964],[119.530956,31.277663],[119.530912,31.279946],[119.533041,31.285404],[119.531401,31.287864],[119.535094,31.290907],[119.533671,31.294269],[119.527187,31.29794],[119.523679,31.301142],[119.522929,31.310924],[119.51966,31.313418],[119.520029,31.318247],[119.52672,31.327152],[119.53051,31.330875],[119.530728,31.339293],[119.528523,31.344969],[119.527589,31.360334],[119.528164,31.36524],[119.530434,31.370826],[119.534833,31.378039],[119.535702,31.381733],[119.540687,31.390155],[119.541741,31.394715],[119.541111,31.398585],[119.539666,31.400732],[119.537364,31.40143],[119.535974,31.406078],[119.536484,31.408216],[119.546639,31.413243],[119.553351,31.411724],[119.553797,31.415399],[119.556034,31.415143],[119.553905,31.417263],[119.553004,31.421981],[119.554383,31.422051],[119.554818,31.426141],[119.554557,31.433888],[119.556914,31.433897],[119.567514,31.432369],[119.576703,31.430726],[119.578256,31.432228],[119.578343,31.434551],[119.582524,31.437501],[119.582589,31.444823],[119.583317,31.446059],[119.587868,31.445803],[119.589595,31.447658],[119.590029,31.45225],[119.588433,31.454873],[119.589519,31.458352],[119.59143,31.460878],[119.591745,31.463059],[119.588357,31.464577],[119.588335,31.466688],[119.58411,31.465822],[119.565146,31.464339],[119.563572,31.468507],[119.565179,31.471385],[119.571891,31.471103],[119.57301,31.472039],[119.57515,31.480797],[119.573118,31.482624],[119.571652,31.488566],[119.567981,31.490419],[119.566406,31.492812],[119.567025,31.494798],[119.567015,31.504719],[119.568883,31.506775],[119.574259,31.505805],[119.579266,31.503148],[119.583621,31.504542],[119.584783,31.507314],[119.58613,31.514171],[119.58852,31.520111],[119.59307,31.529279],[119.593603,31.532209],[119.595883,31.535306],[119.601227,31.539029],[119.605278,31.549219],[119.607863,31.55318],[119.613315,31.557899],[119.61779,31.559364],[119.627934,31.55992],[119.63078,31.563677],[119.637655,31.568211],[119.640653,31.569084],[119.644443,31.572956],[119.646789,31.577683],[119.642684,31.582357],[119.642488,31.588672],[119.640055,31.590797],[119.641131,31.592851],[119.641239,31.596176],[119.639382,31.600258],[119.644128,31.604711],[119.64982,31.60516],[119.657944,31.609304],[119.661148,31.610186],[119.666774,31.6106],[119.67303,31.609322],[119.674985,31.604226],[119.677885,31.603318],[119.684955,31.604023],[119.690342,31.595241],[119.694122,31.587966],[119.694567,31.584192],[119.698021,31.581414],[119.699791,31.576554],[119.707318,31.577472],[119.709968,31.575999],[119.710044,31.568555],[119.712694,31.560325],[119.712901,31.558305],[119.715247,31.555985],[119.721199,31.556867],[119.725619,31.561031],[119.727759,31.562125],[119.733265,31.563157],[119.737251,31.561481],[119.746114,31.560272],[119.74795,31.558773],[119.755976,31.557026],[119.763905,31.554442],[119.768553,31.553789],[119.778904,31.554689],[119.792176,31.553383],[119.804101,31.54989],[119.807403,31.548504],[119.820697,31.537247],[119.832351,31.529191],[119.84192,31.528467],[119.847796,31.5298],[119.852955,31.534282],[119.856202,31.538835],[119.860069,31.543052],[119.861882,31.546264],[119.864,31.546017],[119.87762,31.546925],[119.890121,31.546546],[119.897594,31.546749],[119.90247,31.547746],[119.911062,31.548257],[119.921369,31.549863],[119.935629,31.552712],[119.94157,31.547684],[119.942483,31.546325],[119.948359,31.543379],[119.958796,31.540264],[119.966171,31.537194],[119.971721,31.535967],[119.973795,31.528361],[119.973567,31.515857],[119.981539,31.511471],[119.989924,31.50373],[119.996115,31.497499],[119.996919,31.501338],[119.997157,31.508117],[120.005553,31.503316],[120.009083,31.504454],[120.015795,31.505443],[120.018489,31.50464],[120.022084,31.501736],[120.030979,31.500209],[120.036203,31.497878],[120.037626,31.494754],[120.045489,31.490252],[120.043361,31.486094],[120.046195,31.479782],[120.044251,31.46969],[120.037604,31.425894],[120.03453,31.418597],[120.027851,31.409047],[120.021074,31.383006],[120.020943,31.374203],[120.023702,31.364948],[120.032076,31.353377],[120.041764,31.34588],[120.060662,31.339143],[120.068743,31.336879],[120.089585,31.332449],[120.100153,31.335332]]]]}}]}', 'admin', '2020-12-15 11:59:13', NULL, '2020-12-15 11:59:13', '0', NULL); +INSERT INTO `jimu_report_map` VALUES ('570159017392984064', NULL, '100000', '{\n\"type\": \"FeatureCollection\",\n\"name\": \"100000_full\",\n\"features\": [\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"110000\", \"name\": \"北京市\", \"center\": [ 116.405285, 39.904989 ], \"centroid\": [ 116.41995, 40.18994 ], \"childrenNum\": 16, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 0, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 117.348611, 40.581141 ], [ 117.348611, 40.581141 ], [ 117.269771, 40.560684 ], [ 117.247597, 40.539766 ], [ 117.262995, 40.512927 ], [ 117.208793, 40.501552 ], [ 117.263611, 40.442367 ], [ 117.234046, 40.417312 ], [ 117.226039, 40.368997 ], [ 117.243285, 40.369453 ], [ 117.271618, 40.325211 ], [ 117.271618, 40.325211 ], [ 117.295024, 40.2782 ], [ 117.331365, 40.289613 ], [ 117.351075, 40.229786 ], [ 117.389879, 40.227958 ], [ 117.383719, 40.188195 ], [ 117.367089, 40.172649 ], [ 117.367089, 40.173106 ], [ 117.367089, 40.173106 ], [ 117.367089, 40.172649 ], [ 117.349227, 40.136513 ], [ 117.307343, 40.136971 ], [ 117.274082, 40.105852 ], [ 117.254988, 40.114548 ], [ 117.254988, 40.114548 ], [ 117.254988, 40.114548 ], [ 117.224191, 40.094865 ], [ 117.224191, 40.094865 ], [ 117.210024, 40.082045 ], [ 117.204481, 40.069681 ], [ 117.159517, 40.077008 ], [ 117.140423, 40.064185 ], [ 117.105315, 40.074261 ], [ 117.105315, 40.074261 ], [ 117.051728, 40.059605 ], [ 117.025243, 40.030283 ], [ 116.945171, 40.04128 ], [ 116.927924, 40.055024 ], [ 116.867562, 40.041739 ], [ 116.831222, 40.051359 ], [ 116.820135, 40.02845 ], [ 116.781331, 40.034866 ], [ 116.757925, 39.967934 ], [ 116.782563, 39.947749 ], [ 116.78441, 39.891294 ], [ 116.812128, 39.889916 ], [ 116.865714, 39.843982 ], [ 116.907598, 39.832494 ], [ 116.918069, 39.84628 ], [ 116.949482, 39.778703 ], [ 116.902055, 39.763523 ], [ 116.916837, 39.731314 ], [ 116.887272, 39.72533 ], [ 116.889736, 39.687576 ], [ 116.90575, 39.688037 ], [ 116.906366, 39.677444 ], [ 116.8497, 39.66777 ], [ 116.812128, 39.615695 ], [ 116.79057, 39.595868 ], [ 116.748686, 39.619844 ], [ 116.709266, 39.618 ], [ 116.726512, 39.595407 ], [ 116.726512, 39.595407 ], [ 116.724048, 39.59264 ], [ 116.723432, 39.59264 ], [ 116.724048, 39.59264 ], [ 116.723432, 39.59264 ], [ 116.664918, 39.605552 ], [ 116.620571, 39.601863 ], [ 116.592237, 39.621227 ], [ 116.592237, 39.621227 ], [ 116.524484, 39.596329 ], [ 116.50847, 39.551122 ], [ 116.473361, 39.552968 ], [ 116.478289, 39.535431 ], [ 116.437637, 39.526661 ], [ 116.443796, 39.510041 ], [ 116.401912, 39.528046 ], [ 116.411767, 39.482794 ], [ 116.444412, 39.482332 ], [ 116.454883, 39.453226 ], [ 116.434557, 39.442597 ], [ 116.361876, 39.455074 ], [ 116.361876, 39.455074 ], [ 116.337854, 39.455536 ], [ 116.307057, 39.488337 ], [ 116.257782, 39.500344 ], [ 116.240536, 39.564041 ], [ 116.198652, 39.589412 ], [ 116.151841, 39.583416 ], [ 116.130283, 39.567732 ], [ 116.09887, 39.575113 ], [ 116.036044, 39.571884 ], [ 116.026189, 39.587567 ], [ 115.995392, 39.576958 ], [ 115.978146, 39.595868 ], [ 115.957204, 39.560812 ], [ 115.910393, 39.600479 ], [ 115.910393, 39.600479 ], [ 115.91532, 39.582955 ], [ 115.91532, 39.582955 ], [ 115.867893, 39.546507 ], [ 115.867893, 39.546507 ], [ 115.828473, 39.541431 ], [ 115.821081, 39.522968 ], [ 115.821081, 39.522968 ], [ 115.806299, 39.510041 ], [ 115.806299, 39.510041 ], [ 115.752712, 39.515581 ], [ 115.738545, 39.539585 ], [ 115.738545, 39.540046 ], [ 115.738545, 39.539585 ], [ 115.738545, 39.540046 ], [ 115.724995, 39.5442 ], [ 115.724995, 39.5442 ], [ 115.722531, 39.543738 ], [ 115.721299, 39.543738 ], [ 115.722531, 39.543738 ], [ 115.722531, 39.5442 ], [ 115.721299, 39.543738 ], [ 115.722531, 39.5442 ], [ 115.720683, 39.551122 ], [ 115.720683, 39.551122 ], [ 115.718835, 39.553891 ], [ 115.718835, 39.553891 ], [ 115.716988, 39.56035 ], [ 115.716988, 39.56035 ], [ 115.699125, 39.570039 ], [ 115.699125, 39.570039 ], [ 115.698509, 39.577881 ], [ 115.698509, 39.577881 ], [ 115.667712, 39.615234 ], [ 115.633836, 39.599557 ], [ 115.633836, 39.599557 ], [ 115.587024, 39.589873 ], [ 115.545756, 39.618922 ], [ 115.518039, 39.597252 ], [ 115.522351, 39.640124 ], [ 115.478619, 39.650723 ], [ 115.478619, 39.650723 ], [ 115.491554, 39.670074 ], [ 115.486626, 39.741899 ], [ 115.439815, 39.752022 ], [ 115.443511, 39.785601 ], [ 115.483547, 39.798477 ], [ 115.483547, 39.798477 ], [ 115.50572, 39.784222 ], [ 115.552532, 39.794799 ], [ 115.567314, 39.816407 ], [ 115.514344, 39.837549 ], [ 115.526046, 39.87568 ], [ 115.515575, 39.892212 ], [ 115.515575, 39.892212 ], [ 115.522967, 39.899099 ], [ 115.481083, 39.935819 ], [ 115.426264, 39.950502 ], [ 115.428728, 39.984443 ], [ 115.450286, 39.992697 ], [ 115.454597, 40.029825 ], [ 115.485394, 40.040364 ], [ 115.527278, 40.076092 ], [ 115.59072, 40.096239 ], [ 115.599959, 40.119583 ], [ 115.75456, 40.145663 ], [ 115.75456, 40.145663 ], [ 115.773654, 40.176307 ], [ 115.806299, 40.15344 ], [ 115.847567, 40.147036 ], [ 115.855574, 40.188652 ], [ 115.870356, 40.185909 ], [ 115.89869, 40.234354 ], [ 115.968907, 40.264045 ], [ 115.95166, 40.281852 ], [ 115.917784, 40.354405 ], [ 115.864197, 40.359422 ], [ 115.771806, 40.443734 ], [ 115.781045, 40.49336 ], [ 115.736082, 40.503372 ], [ 115.755176, 40.540221 ], [ 115.784741, 40.55841 ], [ 115.819849, 40.55932 ], [ 115.827857, 40.587504 ], [ 115.885139, 40.595229 ], [ 115.907929, 40.617493 ], [ 115.971986, 40.6025 ], [ 115.982457, 40.578868 ], [ 116.005247, 40.583868 ], [ 116.09887, 40.630665 ], [ 116.133979, 40.666536 ], [ 116.162928, 40.662451 ], [ 116.171551, 40.695582 ], [ 116.204812, 40.740035 ], [ 116.22021, 40.744115 ], [ 116.247311, 40.791707 ], [ 116.273181, 40.762703 ], [ 116.311369, 40.754996 ], [ 116.316912, 40.772221 ], [ 116.453651, 40.765876 ], [ 116.46597, 40.774487 ], [ 116.438253, 40.81934 ], [ 116.334159, 40.90443 ], [ 116.339702, 40.929303 ], [ 116.370499, 40.94377 ], [ 116.398216, 40.90624 ], [ 116.477057, 40.899907 ], [ 116.447492, 40.953715 ], [ 116.455499, 40.980828 ], [ 116.519557, 40.98128 ], [ 116.519557, 40.98128 ], [ 116.5676, 40.992574 ], [ 116.598397, 40.974503 ], [ 116.623034, 41.021026 ], [ 116.615643, 41.053076 ], [ 116.647672, 41.059394 ], [ 116.688324, 41.044501 ], [ 116.698795, 41.021477 ], [ 116.677853, 40.970888 ], [ 116.722201, 40.927495 ], [ 116.713577, 40.909858 ], [ 116.759773, 40.889954 ], [ 116.81336, 40.848319 ], [ 116.848468, 40.839264 ], [ 116.924229, 40.773581 ], [ 116.926692, 40.745022 ], [ 116.964881, 40.709647 ], [ 117.012308, 40.693767 ], [ 117.11209, 40.707379 ], [ 117.117018, 40.70012 ], [ 117.208177, 40.694675 ], [ 117.278394, 40.664267 ], [ 117.319662, 40.657911 ], [ 117.342451, 40.673799 ], [ 117.408973, 40.686961 ], [ 117.493973, 40.675161 ], [ 117.514914, 40.660181 ], [ 117.501364, 40.636569 ], [ 117.467487, 40.649738 ], [ 117.467487, 40.649738 ], [ 117.412669, 40.605226 ], [ 117.429915, 40.576141 ], [ 117.389879, 40.561593 ], [ 117.348611, 40.581141 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"120000\", \"name\": \"天津市\", \"center\": [ 117.190182, 39.125596 ], \"centroid\": [ 117.347019, 39.28803 ], \"childrenNum\": 16, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 1, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 117.765602, 39.400527 ], [ 117.699696, 39.407463 ], [ 117.673211, 39.386652 ], [ 117.668899, 39.412087 ], [ 117.614081, 39.407001 ], [ 117.601146, 39.419485 ], [ 117.570965, 39.404689 ], [ 117.521074, 39.357043 ], [ 117.536472, 39.338068 ], [ 117.594987, 39.349176 ], [ 117.669515, 39.322792 ], [ 117.670747, 39.35658 ], [ 117.74466, 39.354729 ], [ 117.784696, 39.376938 ], [ 117.805022, 39.373237 ], [ 117.810565, 39.354729 ], [ 117.850601, 39.363984 ], [ 117.850601, 39.363984 ], [ 117.854297, 39.328348 ], [ 117.854913, 39.328348 ], [ 117.854297, 39.328348 ], [ 117.854913, 39.328348 ], [ 117.88879, 39.332051 ], [ 117.919587, 39.318162 ], [ 117.919587, 39.318162 ], [ 117.965782, 39.314921 ], [ 117.965782, 39.314921 ], [ 117.973173, 39.312143 ], [ 117.973173, 39.312143 ], [ 117.979333, 39.300566 ], [ 117.979333, 39.300566 ], [ 117.982412, 39.298714 ], [ 117.982412, 39.298714 ], [ 118.024296, 39.289451 ], [ 118.024296, 39.289451 ], [ 118.036615, 39.264898 ], [ 118.064948, 39.256094 ], [ 118.064948, 39.231065 ], [ 118.037231, 39.220402 ], [ 117.977485, 39.206028 ], [ 117.96455, 39.172631 ], [ 117.871543, 39.122506 ], [ 117.837667, 39.057011 ], [ 117.855529, 38.957492 ], [ 117.898029, 38.948649 ], [ 117.875855, 38.920252 ], [ 117.847522, 38.855502 ], [ 117.778536, 38.869016 ], [ 117.752051, 38.847579 ], [ 117.64611, 38.828933 ], [ 117.646725, 38.788827 ], [ 117.671363, 38.772032 ], [ 117.740964, 38.753833 ], [ 117.740964, 38.700141 ], [ 117.729261, 38.680055 ], [ 117.65658, 38.66043 ], [ 117.639334, 38.626776 ], [ 117.55803, 38.613683 ], [ 117.47919, 38.616489 ], [ 117.432379, 38.601524 ], [ 117.368937, 38.564566 ], [ 117.25314, 38.556143 ], [ 117.238358, 38.580943 ], [ 117.258684, 38.608072 ], [ 117.258684, 38.608072 ], [ 117.213104, 38.639866 ], [ 117.213104, 38.639866 ], [ 117.183539, 38.61836 ], [ 117.183539, 38.61836 ], [ 117.150894, 38.617892 ], [ 117.109626, 38.584685 ], [ 117.070822, 38.608072 ], [ 117.055424, 38.639398 ], [ 117.068358, 38.680522 ], [ 117.038793, 38.688464 ], [ 116.95133, 38.689398 ], [ 116.948866, 38.689398 ], [ 116.950714, 38.689398 ], [ 116.95133, 38.689398 ], [ 116.950714, 38.689398 ], [ 116.948866, 38.689398 ], [ 116.877417, 38.680522 ], [ 116.858939, 38.741231 ], [ 116.794265, 38.744498 ], [ 116.794265, 38.744498 ], [ 116.746222, 38.754299 ], [ 116.737599, 38.784629 ], [ 116.75115, 38.831264 ], [ 116.723432, 38.852706 ], [ 116.722201, 38.896968 ], [ 116.708034, 38.931892 ], [ 116.72836, 38.975174 ], [ 116.754845, 39.003084 ], [ 116.754229, 39.034701 ], [ 116.754229, 39.034701 ], [ 116.783179, 39.05097 ], [ 116.783179, 39.05097 ], [ 116.812744, 39.05097 ], [ 116.812744, 39.05097 ], [ 116.871874, 39.054688 ], [ 116.912526, 39.110898 ], [ 116.91191, 39.111362 ], [ 116.91191, 39.111362 ], [ 116.912526, 39.110898 ], [ 116.909446, 39.150822 ], [ 116.870026, 39.153607 ], [ 116.855859, 39.215766 ], [ 116.881729, 39.225966 ], [ 116.881729, 39.225966 ], [ 116.87249, 39.291304 ], [ 116.889736, 39.338068 ], [ 116.870642, 39.357506 ], [ 116.829374, 39.338994 ], [ 116.818287, 39.3737 ], [ 116.840461, 39.378326 ], [ 116.839845, 39.413474 ], [ 116.876185, 39.43474 ], [ 116.832454, 39.435664 ], [ 116.785026, 39.465702 ], [ 116.820751, 39.482332 ], [ 116.819519, 39.528507 ], [ 116.78749, 39.554352 ], [ 116.808432, 39.576497 ], [ 116.812128, 39.615695 ], [ 116.8497, 39.66777 ], [ 116.906366, 39.677444 ], [ 116.90575, 39.688037 ], [ 116.932236, 39.706456 ], [ 116.932236, 39.706456 ], [ 116.944555, 39.695405 ], [ 116.944555, 39.695405 ], [ 116.948866, 39.680668 ], [ 116.948866, 39.680668 ], [ 116.964265, 39.64335 ], [ 116.983359, 39.638742 ], [ 116.983359, 39.638742 ], [ 117.016004, 39.653949 ], [ 117.10901, 39.625375 ], [ 117.10901, 39.625375 ], [ 117.152742, 39.623532 ], [ 117.177996, 39.645194 ], [ 117.165061, 39.718886 ], [ 117.165061, 39.718886 ], [ 117.161981, 39.748801 ], [ 117.205713, 39.763984 ], [ 117.15767, 39.796638 ], [ 117.156438, 39.817326 ], [ 117.192162, 39.832953 ], [ 117.251908, 39.834332 ], [ 117.247597, 39.860981 ], [ 117.227887, 39.852712 ], [ 117.162597, 39.876598 ], [ 117.162597, 39.876598 ], [ 117.150894, 39.944996 ], [ 117.198322, 39.992697 ], [ 117.192162, 40.066475 ], [ 117.210024, 40.082045 ], [ 117.224191, 40.094865 ], [ 117.224191, 40.094865 ], [ 117.254988, 40.114548 ], [ 117.254988, 40.114548 ], [ 117.254988, 40.114548 ], [ 117.274082, 40.105852 ], [ 117.307343, 40.136971 ], [ 117.349227, 40.136513 ], [ 117.367089, 40.172649 ], [ 117.367089, 40.173106 ], [ 117.367089, 40.173106 ], [ 117.367089, 40.172649 ], [ 117.383719, 40.188195 ], [ 117.389879, 40.227958 ], [ 117.415748, 40.248973 ], [ 117.450241, 40.252627 ], [ 117.505059, 40.227044 ], [ 117.548791, 40.232527 ], [ 117.571581, 40.219276 ], [ 117.576508, 40.178593 ], [ 117.609769, 40.160301 ], [ 117.609769, 40.160301 ], [ 117.613465, 40.158014 ], [ 117.613465, 40.158014 ], [ 117.651653, 40.122786 ], [ 117.651653, 40.122786 ], [ 117.654117, 40.114548 ], [ 117.654117, 40.114548 ], [ 117.655965, 40.109514 ], [ 117.655965, 40.109514 ], [ 117.675059, 40.082045 ], [ 117.71879, 40.082045 ], [ 117.71879, 40.082045 ], [ 117.752667, 40.081588 ], [ 117.776073, 40.059605 ], [ 117.74774, 40.047236 ], [ 117.744044, 40.018368 ], [ 117.768681, 40.022034 ], [ 117.768681, 40.022034 ], [ 117.793319, 40.005534 ], [ 117.793319, 40.005534 ], [ 117.795167, 39.996823 ], [ 117.795167, 39.996823 ], [ 117.781616, 39.966558 ], [ 117.781616, 39.966558 ], [ 117.756363, 39.965181 ], [ 117.691073, 39.984902 ], [ 117.671363, 39.973896 ], [ 117.614697, 39.97252 ], [ 117.594987, 39.994531 ], [ 117.594987, 39.994531 ], [ 117.546327, 39.999116 ], [ 117.534625, 39.954631 ], [ 117.514914, 39.946832 ], [ 117.513067, 39.910576 ], [ 117.513067, 39.910576 ], [ 117.512451, 39.90874 ], [ 117.512451, 39.90874 ], [ 117.508139, 39.901854 ], [ 117.508139, 39.901854 ], [ 117.529081, 39.859144 ], [ 117.529081, 39.859144 ], [ 117.561726, 39.799856 ], [ 117.546327, 39.775943 ], [ 117.56111, 39.754782 ], [ 117.595603, 39.74604 ], [ 117.57774, 39.726711 ], [ 117.627015, 39.703693 ], [ 117.668899, 39.666849 ], [ 117.66274, 39.636437 ], [ 117.637486, 39.603246 ], [ 117.654117, 39.575113 ], [ 117.684914, 39.58895 ], [ 117.707088, 39.576036 ], [ 117.715711, 39.529892 ], [ 117.745276, 39.547892 ], [ 117.753899, 39.579726 ], [ 117.753899, 39.579726 ], [ 117.766834, 39.598635 ], [ 117.829659, 39.589873 ], [ 117.868464, 39.59679 ], [ 117.933753, 39.574191 ], [ 117.904804, 39.533585 ], [ 117.912195, 39.517428 ], [ 117.912195, 39.517428 ], [ 117.899877, 39.474479 ], [ 117.870311, 39.455074 ], [ 117.871543, 39.411625 ], [ 117.846906, 39.407926 ], [ 117.765602, 39.400527 ] ] ], [ [ [ 117.805022, 39.373237 ], [ 117.784696, 39.376938 ], [ 117.765602, 39.400527 ], [ 117.846906, 39.407926 ], [ 117.852449, 39.380639 ], [ 117.805022, 39.373237 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"130000\", \"name\": \"河北省\", \"center\": [ 114.502461, 38.045474 ], \"childrenNum\": 11, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 2, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 117.467487, 40.649738 ], [ 117.467487, 40.649738 ], [ 117.501364, 40.636569 ], [ 117.514914, 40.660181 ], [ 117.493973, 40.675161 ], [ 117.408973, 40.686961 ], [ 117.342451, 40.673799 ], [ 117.319662, 40.657911 ], [ 117.278394, 40.664267 ], [ 117.208177, 40.694675 ], [ 117.117018, 40.70012 ], [ 117.11209, 40.707379 ], [ 117.012308, 40.693767 ], [ 116.964881, 40.709647 ], [ 116.926692, 40.745022 ], [ 116.924229, 40.773581 ], [ 116.848468, 40.839264 ], [ 116.81336, 40.848319 ], [ 116.759773, 40.889954 ], [ 116.713577, 40.909858 ], [ 116.722201, 40.927495 ], [ 116.677853, 40.970888 ], [ 116.698795, 41.021477 ], [ 116.688324, 41.044501 ], [ 116.647672, 41.059394 ], [ 116.615643, 41.053076 ], [ 116.623034, 41.021026 ], [ 116.598397, 40.974503 ], [ 116.5676, 40.992574 ], [ 116.519557, 40.98128 ], [ 116.519557, 40.98128 ], [ 116.455499, 40.980828 ], [ 116.447492, 40.953715 ], [ 116.477057, 40.899907 ], [ 116.398216, 40.90624 ], [ 116.370499, 40.94377 ], [ 116.339702, 40.929303 ], [ 116.334159, 40.90443 ], [ 116.438253, 40.81934 ], [ 116.46597, 40.774487 ], [ 116.453651, 40.765876 ], [ 116.316912, 40.772221 ], [ 116.311369, 40.754996 ], [ 116.273181, 40.762703 ], [ 116.247311, 40.791707 ], [ 116.22021, 40.744115 ], [ 116.204812, 40.740035 ], [ 116.171551, 40.695582 ], [ 116.162928, 40.662451 ], [ 116.133979, 40.666536 ], [ 116.09887, 40.630665 ], [ 116.005247, 40.583868 ], [ 115.982457, 40.578868 ], [ 115.971986, 40.6025 ], [ 115.907929, 40.617493 ], [ 115.885139, 40.595229 ], [ 115.827857, 40.587504 ], [ 115.819849, 40.55932 ], [ 115.784741, 40.55841 ], [ 115.755176, 40.540221 ], [ 115.736082, 40.503372 ], [ 115.781045, 40.49336 ], [ 115.771806, 40.443734 ], [ 115.864197, 40.359422 ], [ 115.917784, 40.354405 ], [ 115.95166, 40.281852 ], [ 115.968907, 40.264045 ], [ 115.89869, 40.234354 ], [ 115.870356, 40.185909 ], [ 115.855574, 40.188652 ], [ 115.847567, 40.147036 ], [ 115.806299, 40.15344 ], [ 115.773654, 40.176307 ], [ 115.75456, 40.145663 ], [ 115.75456, 40.145663 ], [ 115.599959, 40.119583 ], [ 115.59072, 40.096239 ], [ 115.527278, 40.076092 ], [ 115.485394, 40.040364 ], [ 115.454597, 40.029825 ], [ 115.450286, 39.992697 ], [ 115.428728, 39.984443 ], [ 115.426264, 39.950502 ], [ 115.481083, 39.935819 ], [ 115.522967, 39.899099 ], [ 115.515575, 39.892212 ], [ 115.515575, 39.892212 ], [ 115.526046, 39.87568 ], [ 115.514344, 39.837549 ], [ 115.567314, 39.816407 ], [ 115.552532, 39.794799 ], [ 115.50572, 39.784222 ], [ 115.483547, 39.798477 ], [ 115.483547, 39.798477 ], [ 115.443511, 39.785601 ], [ 115.439815, 39.752022 ], [ 115.486626, 39.741899 ], [ 115.491554, 39.670074 ], [ 115.478619, 39.650723 ], [ 115.478619, 39.650723 ], [ 115.522351, 39.640124 ], [ 115.518039, 39.597252 ], [ 115.545756, 39.618922 ], [ 115.587024, 39.589873 ], [ 115.633836, 39.599557 ], [ 115.633836, 39.599557 ], [ 115.667712, 39.615234 ], [ 115.698509, 39.577881 ], [ 115.698509, 39.577881 ], [ 115.699125, 39.570039 ], [ 115.699125, 39.570039 ], [ 115.716988, 39.56035 ], [ 115.716988, 39.56035 ], [ 115.718835, 39.553891 ], [ 115.718835, 39.553891 ], [ 115.720683, 39.551122 ], [ 115.720683, 39.551122 ], [ 115.722531, 39.5442 ], [ 115.721299, 39.543738 ], [ 115.722531, 39.5442 ], [ 115.722531, 39.543738 ], [ 115.721299, 39.543738 ], [ 115.722531, 39.543738 ], [ 115.724995, 39.5442 ], [ 115.724995, 39.5442 ], [ 115.738545, 39.540046 ], [ 115.738545, 39.539585 ], [ 115.738545, 39.540046 ], [ 115.738545, 39.539585 ], [ 115.752712, 39.515581 ], [ 115.806299, 39.510041 ], [ 115.806299, 39.510041 ], [ 115.821081, 39.522968 ], [ 115.821081, 39.522968 ], [ 115.828473, 39.541431 ], [ 115.867893, 39.546507 ], [ 115.867893, 39.546507 ], [ 115.91532, 39.582955 ], [ 115.91532, 39.582955 ], [ 115.910393, 39.600479 ], [ 115.910393, 39.600479 ], [ 115.957204, 39.560812 ], [ 115.978146, 39.595868 ], [ 115.995392, 39.576958 ], [ 116.026189, 39.587567 ], [ 116.036044, 39.571884 ], [ 116.09887, 39.575113 ], [ 116.130283, 39.567732 ], [ 116.151841, 39.583416 ], [ 116.198652, 39.589412 ], [ 116.240536, 39.564041 ], [ 116.257782, 39.500344 ], [ 116.307057, 39.488337 ], [ 116.337854, 39.455536 ], [ 116.361876, 39.455074 ], [ 116.361876, 39.455074 ], [ 116.434557, 39.442597 ], [ 116.454883, 39.453226 ], [ 116.444412, 39.482332 ], [ 116.411767, 39.482794 ], [ 116.401912, 39.528046 ], [ 116.443796, 39.510041 ], [ 116.437637, 39.526661 ], [ 116.478289, 39.535431 ], [ 116.473361, 39.552968 ], [ 116.50847, 39.551122 ], [ 116.524484, 39.596329 ], [ 116.592237, 39.621227 ], [ 116.592237, 39.621227 ], [ 116.620571, 39.601863 ], [ 116.664918, 39.605552 ], [ 116.723432, 39.59264 ], [ 116.724048, 39.59264 ], [ 116.723432, 39.59264 ], [ 116.724048, 39.59264 ], [ 116.726512, 39.595407 ], [ 116.726512, 39.595407 ], [ 116.709266, 39.618 ], [ 116.748686, 39.619844 ], [ 116.79057, 39.595868 ], [ 116.812128, 39.615695 ], [ 116.808432, 39.576497 ], [ 116.78749, 39.554352 ], [ 116.819519, 39.528507 ], [ 116.820751, 39.482332 ], [ 116.785026, 39.465702 ], [ 116.832454, 39.435664 ], [ 116.876185, 39.43474 ], [ 116.839845, 39.413474 ], [ 116.840461, 39.378326 ], [ 116.818287, 39.3737 ], [ 116.829374, 39.338994 ], [ 116.870642, 39.357506 ], [ 116.889736, 39.338068 ], [ 116.87249, 39.291304 ], [ 116.881729, 39.225966 ], [ 116.881729, 39.225966 ], [ 116.855859, 39.215766 ], [ 116.870026, 39.153607 ], [ 116.909446, 39.150822 ], [ 116.912526, 39.110898 ], [ 116.91191, 39.111362 ], [ 116.91191, 39.111362 ], [ 116.912526, 39.110898 ], [ 116.871874, 39.054688 ], [ 116.812744, 39.05097 ], [ 116.812744, 39.05097 ], [ 116.783179, 39.05097 ], [ 116.783179, 39.05097 ], [ 116.754229, 39.034701 ], [ 116.754229, 39.034701 ], [ 116.754845, 39.003084 ], [ 116.72836, 38.975174 ], [ 116.708034, 38.931892 ], [ 116.722201, 38.896968 ], [ 116.723432, 38.852706 ], [ 116.75115, 38.831264 ], [ 116.737599, 38.784629 ], [ 116.746222, 38.754299 ], [ 116.794265, 38.744498 ], [ 116.794265, 38.744498 ], [ 116.858939, 38.741231 ], [ 116.877417, 38.680522 ], [ 116.948866, 38.689398 ], [ 116.950714, 38.689398 ], [ 116.95133, 38.689398 ], [ 116.950714, 38.689398 ], [ 116.948866, 38.689398 ], [ 116.95133, 38.689398 ], [ 117.038793, 38.688464 ], [ 117.068358, 38.680522 ], [ 117.055424, 38.639398 ], [ 117.070822, 38.608072 ], [ 117.109626, 38.584685 ], [ 117.150894, 38.617892 ], [ 117.183539, 38.61836 ], [ 117.183539, 38.61836 ], [ 117.213104, 38.639866 ], [ 117.213104, 38.639866 ], [ 117.258684, 38.608072 ], [ 117.258684, 38.608072 ], [ 117.238358, 38.580943 ], [ 117.25314, 38.556143 ], [ 117.368937, 38.564566 ], [ 117.432379, 38.601524 ], [ 117.47919, 38.616489 ], [ 117.55803, 38.613683 ], [ 117.639334, 38.626776 ], [ 117.638102, 38.54491 ], [ 117.68553, 38.539293 ], [ 117.644878, 38.52759 ], [ 117.678754, 38.477008 ], [ 117.72495, 38.457328 ], [ 117.730493, 38.424985 ], [ 117.781, 38.373862 ], [ 117.84629, 38.368232 ], [ 117.937449, 38.387936 ], [ 117.957775, 38.376208 ], [ 117.948536, 38.346644 ], [ 117.895565, 38.301572 ], [ 117.848754, 38.255062 ], [ 117.808718, 38.22827 ], [ 117.789007, 38.180772 ], [ 117.766834, 38.158658 ], [ 117.771145, 38.134655 ], [ 117.746508, 38.12524 ], [ 117.704624, 38.076262 ], [ 117.586979, 38.071551 ], [ 117.557414, 38.046105 ], [ 117.557414, 38.046105 ], [ 117.524154, 37.989527 ], [ 117.513067, 37.94329 ], [ 117.481038, 37.914967 ], [ 117.438538, 37.854035 ], [ 117.400966, 37.844584 ], [ 117.320278, 37.861596 ], [ 117.271618, 37.839858 ], [ 117.185387, 37.849783 ], [ 117.150278, 37.839385 ], [ 117.074518, 37.848837 ], [ 117.027091, 37.832296 ], [ 116.919301, 37.846002 ], [ 116.837997, 37.835132 ], [ 116.804736, 37.848837 ], [ 116.753613, 37.793054 ], [ 116.753613, 37.77035 ], [ 116.724664, 37.744327 ], [ 116.679085, 37.728708 ], [ 116.66307, 37.686096 ], [ 116.604556, 37.624975 ], [ 116.575607, 37.610754 ], [ 116.4826, 37.521573 ], [ 116.448108, 37.503059 ], [ 116.433941, 37.473142 ], [ 116.38097, 37.522522 ], [ 116.379738, 37.522047 ], [ 116.38097, 37.522522 ], [ 116.379738, 37.522047 ], [ 116.36742, 37.566177 ], [ 116.336007, 37.581355 ], [ 116.295355, 37.554316 ], [ 116.278724, 37.524895 ], [ 116.290427, 37.484065 ], [ 116.27626, 37.466967 ], [ 116.240536, 37.489764 ], [ 116.240536, 37.489764 ], [ 116.224522, 37.479791 ], [ 116.243, 37.447965 ], [ 116.226369, 37.428007 ], [ 116.2855, 37.404241 ], [ 116.236224, 37.361442 ], [ 116.193109, 37.365723 ], [ 116.169087, 37.384271 ], [ 116.106261, 37.368577 ], [ 116.085935, 37.373809 ], [ 116.024341, 37.360015 ], [ 115.975682, 37.337179 ], [ 115.969523, 37.239572 ], [ 115.909777, 37.20669 ], [ 115.91224, 37.177132 ], [ 115.879596, 37.150901 ], [ 115.888219, 37.112254 ], [ 115.85619, 37.060694 ], [ 115.776734, 36.992848 ], [ 115.79706, 36.968945 ], [ 115.75764, 36.902453 ], [ 115.71206, 36.883308 ], [ 115.688654, 36.838777 ], [ 115.686807, 36.810034 ], [ 115.524815, 36.763543 ], [ 115.479851, 36.760187 ], [ 115.451518, 36.702151 ], [ 115.420105, 36.686795 ], [ 115.365902, 36.621979 ], [ 115.355431, 36.627262 ], [ 115.33141, 36.550378 ], [ 115.272895, 36.497476 ], [ 115.291374, 36.460423 ], [ 115.317243, 36.454166 ], [ 115.297533, 36.413239 ], [ 115.340033, 36.398307 ], [ 115.368982, 36.342409 ], [ 115.366518, 36.30914 ], [ 115.423185, 36.32216 ], [ 115.417025, 36.292742 ], [ 115.462605, 36.276339 ], [ 115.466916, 36.258969 ], [ 115.466916, 36.258969 ], [ 115.474923, 36.248352 ], [ 115.483547, 36.148865 ], [ 115.465068, 36.170125 ], [ 115.450902, 36.152248 ], [ 115.376989, 36.128083 ], [ 115.365902, 36.099074 ], [ 115.312931, 36.088436 ], [ 115.30246, 36.127599 ], [ 115.279055, 36.13775 ], [ 115.242098, 36.19138 ], [ 115.202678, 36.208765 ], [ 115.202678, 36.208765 ], [ 115.202678, 36.209248 ], [ 115.202678, 36.209248 ], [ 115.201446, 36.210214 ], [ 115.201446, 36.210214 ], [ 115.1842, 36.193312 ], [ 115.12507, 36.209731 ], [ 115.104744, 36.172058 ], [ 115.06286, 36.178338 ], [ 115.048693, 36.161912 ], [ 115.04623, 36.112613 ], [ 114.998186, 36.069572 ], [ 114.914419, 36.052155 ], [ 114.926737, 36.089403 ], [ 114.912571, 36.140649 ], [ 114.858368, 36.144516 ], [ 114.857752, 36.127599 ], [ 114.771521, 36.124699 ], [ 114.734564, 36.15563 ], [ 114.720398, 36.140166 ], [ 114.640326, 36.137266 ], [ 114.588587, 36.118414 ], [ 114.586739, 36.141133 ], [ 114.533152, 36.171575 ], [ 114.480181, 36.177855 ], [ 114.466015, 36.197658 ], [ 114.417356, 36.205868 ], [ 114.408117, 36.224699 ], [ 114.356378, 36.230492 ], [ 114.345291, 36.255591 ], [ 114.299095, 36.245938 ], [ 114.257827, 36.263794 ], [ 114.241197, 36.251247 ], [ 114.2104, 36.272962 ], [ 114.203009, 36.245456 ], [ 114.170364, 36.245938 ], [ 114.170364, 36.245938 ], [ 114.175907, 36.264759 ], [ 114.129096, 36.280199 ], [ 114.080437, 36.269585 ], [ 114.04348, 36.303353 ], [ 114.056415, 36.329392 ], [ 114.002828, 36.334214 ], [ 113.981887, 36.31782 ], [ 113.962792, 36.353977 ], [ 113.911054, 36.314927 ], [ 113.882104, 36.353977 ], [ 113.84946, 36.347711 ], [ 113.856851, 36.329392 ], [ 113.813119, 36.332285 ], [ 113.755221, 36.366026 ], [ 113.731199, 36.363135 ], [ 113.708409, 36.423352 ], [ 113.670221, 36.425278 ], [ 113.635729, 36.451277 ], [ 113.587069, 36.460904 ], [ 113.554425, 36.494589 ], [ 113.559968, 36.528741 ], [ 113.588917, 36.547974 ], [ 113.569823, 36.585947 ], [ 113.539642, 36.594116 ], [ 113.54457, 36.62342 ], [ 113.486671, 36.635427 ], [ 113.476816, 36.655114 ], [ 113.506997, 36.705029 ], [ 113.465113, 36.707908 ], [ 113.499606, 36.740527 ], [ 113.535946, 36.732373 ], [ 113.549497, 36.752515 ], [ 113.600004, 36.752995 ], [ 113.680692, 36.789907 ], [ 113.676381, 36.855539 ], [ 113.696707, 36.882351 ], [ 113.731815, 36.878521 ], [ 113.731815, 36.858891 ], [ 113.773083, 36.85506 ], [ 113.792793, 36.894796 ], [ 113.76138, 36.956034 ], [ 113.791561, 36.98759 ], [ 113.771851, 37.016745 ], [ 113.788482, 37.059739 ], [ 113.758301, 37.075497 ], [ 113.773699, 37.107004 ], [ 113.773083, 37.151855 ], [ 113.832213, 37.167594 ], [ 113.853155, 37.215269 ], [ 113.886416, 37.239095 ], [ 113.90243, 37.310052 ], [ 113.962792, 37.355734 ], [ 113.973879, 37.40329 ], [ 114.014531, 37.42468 ], [ 114.036705, 37.494037 ], [ 114.118625, 37.59084 ], [ 114.115545, 37.619761 ], [ 114.139567, 37.675676 ], [ 114.12848, 37.698409 ], [ 114.068118, 37.721608 ], [ 113.993589, 37.706932 ], [ 113.996669, 37.730128 ], [ 114.044712, 37.761834 ], [ 114.006524, 37.813386 ], [ 113.976959, 37.816696 ], [ 113.959097, 37.906468 ], [ 113.936307, 37.922993 ], [ 113.901198, 37.984811 ], [ 113.872249, 37.990471 ], [ 113.876561, 38.055059 ], [ 113.811271, 38.117707 ], [ 113.831597, 38.16854 ], [ 113.797105, 38.162894 ], [ 113.720728, 38.174656 ], [ 113.711489, 38.213695 ], [ 113.678844, 38.20523 ], [ 113.64312, 38.232031 ], [ 113.598772, 38.22733 ], [ 113.570439, 38.237202 ], [ 113.54457, 38.270569 ], [ 113.557504, 38.343359 ], [ 113.525475, 38.383245 ], [ 113.537794, 38.417952 ], [ 113.583374, 38.459671 ], [ 113.5612, 38.485909 ], [ 113.561816, 38.558483 ], [ 113.603084, 38.587024 ], [ 113.612939, 38.645942 ], [ 113.70225, 38.651551 ], [ 113.720728, 38.713218 ], [ 113.775547, 38.709949 ], [ 113.802648, 38.763166 ], [ 113.839605, 38.7585 ], [ 113.836525, 38.795824 ], [ 113.855619, 38.828933 ], [ 113.795257, 38.860628 ], [ 113.776163, 38.885788 ], [ 113.76754, 38.959819 ], [ 113.776779, 38.986804 ], [ 113.80696, 38.989595 ], [ 113.898119, 39.067699 ], [ 113.930148, 39.063517 ], [ 113.961561, 39.100681 ], [ 113.994821, 39.095572 ], [ 114.006524, 39.122971 ], [ 114.050872, 39.135969 ], [ 114.064422, 39.094179 ], [ 114.082901, 39.09325 ], [ 114.082901, 39.09325 ], [ 114.10877, 39.052364 ], [ 114.157429, 39.061194 ], [ 114.180835, 39.049111 ], [ 114.252284, 39.073739 ], [ 114.345907, 39.075133 ], [ 114.369928, 39.107648 ], [ 114.360689, 39.134112 ], [ 114.388406, 39.176807 ], [ 114.443841, 39.174023 ], [ 114.47587, 39.21623 ], [ 114.416124, 39.242654 ], [ 114.437066, 39.259337 ], [ 114.430906, 39.307513 ], [ 114.466631, 39.329736 ], [ 114.469095, 39.400989 ], [ 114.496812, 39.438437 ], [ 114.501739, 39.476789 ], [ 114.532536, 39.486027 ], [ 114.568877, 39.573729 ], [ 114.51529, 39.564964 ], [ 114.49558, 39.608318 ], [ 114.431522, 39.613851 ], [ 114.408117, 39.652106 ], [ 114.409964, 39.761683 ], [ 114.41674, 39.775943 ], [ 114.390254, 39.819165 ], [ 114.406885, 39.833413 ], [ 114.395182, 39.867412 ], [ 114.285545, 39.858225 ], [ 114.286776, 39.871087 ], [ 114.215943, 39.8619 ], [ 114.204241, 39.885324 ], [ 114.229494, 39.899558 ], [ 114.212248, 39.918839 ], [ 114.17406, 39.897722 ], [ 114.067502, 39.922511 ], [ 114.047176, 39.916085 ], [ 114.028082, 39.959218 ], [ 114.029314, 39.985819 ], [ 113.910438, 40.015618 ], [ 113.959097, 40.033491 ], [ 113.989278, 40.11226 ], [ 114.018227, 40.103563 ], [ 114.045944, 40.056856 ], [ 114.086596, 40.071513 ], [ 114.101995, 40.099901 ], [ 114.073046, 40.168533 ], [ 114.073046, 40.168533 ], [ 114.097683, 40.193681 ], [ 114.135871, 40.175392 ], [ 114.180219, 40.191395 ], [ 114.235654, 40.198252 ], [ 114.255364, 40.236182 ], [ 114.292936, 40.230242 ], [ 114.362537, 40.249886 ], [ 114.406269, 40.246232 ], [ 114.46971, 40.268155 ], [ 114.510978, 40.302851 ], [ 114.530688, 40.345283 ], [ 114.481413, 40.34802 ], [ 114.438914, 40.371733 ], [ 114.390254, 40.351213 ], [ 114.381015, 40.36307 ], [ 114.31203, 40.372645 ], [ 114.286161, 40.425057 ], [ 114.299711, 40.44009 ], [ 114.267066, 40.474242 ], [ 114.282465, 40.494725 ], [ 114.293552, 40.55159 ], [ 114.273842, 40.552954 ], [ 114.283081, 40.590685 ], [ 114.236269, 40.607043 ], [ 114.183299, 40.67153 ], [ 114.162357, 40.71373 ], [ 114.134639, 40.737314 ], [ 114.103227, 40.770861 ], [ 114.104458, 40.797597 ], [ 114.080437, 40.790348 ], [ 114.044712, 40.830661 ], [ 114.073661, 40.857372 ], [ 114.055183, 40.867782 ], [ 114.041633, 40.917546 ], [ 114.057647, 40.925234 ], [ 113.994821, 40.938798 ], [ 113.973263, 40.983087 ], [ 113.868554, 41.06887 ], [ 113.819279, 41.09774 ], [ 113.877793, 41.115777 ], [ 113.920293, 41.172112 ], [ 113.960945, 41.171211 ], [ 113.996669, 41.19238 ], [ 114.016379, 41.231999 ], [ 113.992357, 41.269794 ], [ 113.971416, 41.239649 ], [ 113.95109, 41.282837 ], [ 113.914749, 41.294529 ], [ 113.899351, 41.316108 ], [ 113.92522, 41.325546 ], [ 113.94493, 41.392477 ], [ 113.871017, 41.413126 ], [ 113.877793, 41.431076 ], [ 113.919677, 41.454404 ], [ 113.933227, 41.487139 ], [ 113.953553, 41.483553 ], [ 113.976959, 41.505966 ], [ 114.032394, 41.529715 ], [ 114.101379, 41.537779 ], [ 114.230726, 41.513584 ], [ 114.221487, 41.582111 ], [ 114.226414, 41.616572 ], [ 114.259059, 41.623282 ], [ 114.215328, 41.68499 ], [ 114.237501, 41.698843 ], [ 114.206704, 41.7386 ], [ 114.215328, 41.75646 ], [ 114.200545, 41.789934 ], [ 114.282465, 41.863517 ], [ 114.343443, 41.926774 ], [ 114.352066, 41.953484 ], [ 114.419203, 41.942356 ], [ 114.478334, 41.951704 ], [ 114.511594, 41.981962 ], [ 114.467863, 42.025989 ], [ 114.480181, 42.064654 ], [ 114.502355, 42.06732 ], [ 114.510978, 42.110844 ], [ 114.560254, 42.132595 ], [ 114.647717, 42.109512 ], [ 114.675434, 42.12061 ], [ 114.75489, 42.115727 ], [ 114.789383, 42.130819 ], [ 114.79431, 42.149457 ], [ 114.825723, 42.139695 ], [ 114.86268, 42.097967 ], [ 114.860832, 42.054879 ], [ 114.9021, 42.015763 ], [ 114.915035, 41.960605 ], [ 114.923658, 41.871093 ], [ 114.939056, 41.846132 ], [ 114.922426, 41.825175 ], [ 114.868839, 41.813579 ], [ 114.89594, 41.76762 ], [ 114.902716, 41.695715 ], [ 114.895325, 41.636255 ], [ 114.860832, 41.60091 ], [ 115.016049, 41.615229 ], [ 115.056085, 41.602253 ], [ 115.0992, 41.62373 ], [ 115.195287, 41.602253 ], [ 115.20391, 41.571367 ], [ 115.256881, 41.580768 ], [ 115.26612, 41.616124 ], [ 115.290142, 41.622835 ], [ 115.310468, 41.592854 ], [ 115.377605, 41.603148 ], [ 115.345576, 41.635807 ], [ 115.360975, 41.661297 ], [ 115.319091, 41.691693 ], [ 115.346808, 41.712247 ], [ 115.42996, 41.728775 ], [ 115.488474, 41.760924 ], [ 115.519887, 41.76762 ], [ 115.57409, 41.80555 ], [ 115.654162, 41.829189 ], [ 115.688038, 41.867528 ], [ 115.726227, 41.870202 ], [ 115.811226, 41.912525 ], [ 115.834632, 41.93835 ], [ 115.85311, 41.927665 ], [ 115.916552, 41.945027 ], [ 115.954124, 41.874213 ], [ 115.994776, 41.828743 ], [ 116.007095, 41.797966 ], [ 116.007095, 41.79752 ], [ 116.007095, 41.797966 ], [ 116.007095, 41.79752 ], [ 116.034196, 41.782795 ], [ 116.09887, 41.776547 ], [ 116.129051, 41.805996 ], [ 116.106877, 41.831419 ], [ 116.122892, 41.861734 ], [ 116.194341, 41.861734 ], [ 116.212819, 41.885352 ], [ 116.223906, 41.932562 ], [ 116.298434, 41.96817 ], [ 116.310137, 41.997086 ], [ 116.373579, 42.009983 ], [ 116.414231, 41.982407 ], [ 116.393289, 41.942802 ], [ 116.453651, 41.945917 ], [ 116.4826, 41.975734 ], [ 116.510933, 41.974399 ], [ 116.553433, 41.928555 ], [ 116.597165, 41.935679 ], [ 116.639049, 41.929891 ], [ 116.66923, 41.947698 ], [ 116.727744, 41.951259 ], [ 116.748686, 41.984186 ], [ 116.796113, 41.977958 ], [ 116.879881, 42.018431 ], [ 116.890352, 42.092639 ], [ 116.850316, 42.156556 ], [ 116.825062, 42.155669 ], [ 116.789338, 42.200462 ], [ 116.903287, 42.190708 ], [ 116.918685, 42.229716 ], [ 116.897743, 42.297479 ], [ 116.886656, 42.366496 ], [ 116.910678, 42.394789 ], [ 116.910678, 42.394789 ], [ 116.910062, 42.395231 ], [ 116.910062, 42.395231 ], [ 116.921765, 42.403628 ], [ 116.921765, 42.403628 ], [ 116.936547, 42.410256 ], [ 116.936547, 42.410256 ], [ 116.944555, 42.415116 ], [ 116.944555, 42.415116 ], [ 116.97104, 42.427486 ], [ 116.97104, 42.427486 ], [ 116.974736, 42.426603 ], [ 116.974736, 42.426603 ], [ 116.99075, 42.425719 ], [ 116.99075, 42.425719 ], [ 117.005533, 42.43367 ], [ 117.005533, 42.43367 ], [ 117.009228, 42.44957 ], [ 117.009228, 42.44957 ], [ 117.01662, 42.456193 ], [ 117.01662, 42.456193 ], [ 117.080061, 42.463699 ], [ 117.080061, 42.463699 ], [ 117.09546, 42.484004 ], [ 117.135496, 42.468996 ], [ 117.188467, 42.468114 ], [ 117.188467, 42.468114 ], [ 117.275314, 42.481797 ], [ 117.275314, 42.481797 ], [ 117.332596, 42.46105 ], [ 117.332596, 42.46105 ], [ 117.390495, 42.461933 ], [ 117.413284, 42.471645 ], [ 117.410205, 42.519743 ], [ 117.387415, 42.517537 ], [ 117.387415, 42.517537 ], [ 117.434226, 42.557224 ], [ 117.435458, 42.585431 ], [ 117.475494, 42.602613 ], [ 117.530313, 42.590278 ], [ 117.537088, 42.603054 ], [ 117.60053, 42.603054 ], [ 117.667051, 42.582347 ], [ 117.708935, 42.588515 ], [ 117.779768, 42.61847 ], [ 117.801326, 42.612744 ], [ 117.797631, 42.585431 ], [ 117.856761, 42.539148 ], [ 117.874007, 42.510038 ], [ 117.997811, 42.416884 ], [ 118.024296, 42.385064 ], [ 118.008898, 42.346595 ], [ 118.060021, 42.298364 ], [ 118.047702, 42.280656 ], [ 117.974405, 42.25054 ], [ 117.977485, 42.229716 ], [ 118.033535, 42.199132 ], [ 118.106216, 42.172082 ], [ 118.089586, 42.12283 ], [ 118.097593, 42.105072 ], [ 118.155491, 42.081091 ], [ 118.116687, 42.037102 ], [ 118.194296, 42.031324 ], [ 118.220165, 42.058434 ], [ 118.212774, 42.081091 ], [ 118.239259, 42.092639 ], [ 118.27252, 42.083312 ], [ 118.296541, 42.057545 ], [ 118.286686, 42.033991 ], [ 118.239875, 42.024655 ], [ 118.291614, 42.007759 ], [ 118.313788, 41.98819 ], [ 118.306396, 41.940131 ], [ 118.268824, 41.930336 ], [ 118.340273, 41.87243 ], [ 118.335346, 41.845241 ], [ 118.29223, 41.772976 ], [ 118.247266, 41.773869 ], [ 118.236179, 41.80778 ], [ 118.178281, 41.814917 ], [ 118.140093, 41.784134 ], [ 118.132702, 41.733241 ], [ 118.155491, 41.712694 ], [ 118.159187, 41.67605 ], [ 118.206614, 41.650566 ], [ 118.215237, 41.59554 ], [ 118.302701, 41.55256 ], [ 118.315636, 41.512688 ], [ 118.271904, 41.471446 ], [ 118.327338, 41.450816 ], [ 118.348896, 41.428384 ], [ 118.361215, 41.384844 ], [ 118.348896, 41.342622 ], [ 118.380309, 41.312062 ], [ 118.412338, 41.331838 ], [ 118.528135, 41.355202 ], [ 118.629765, 41.346666 ], [ 118.677192, 41.35026 ], [ 118.741866, 41.324198 ], [ 118.770199, 41.352956 ], [ 118.843496, 41.374516 ], [ 118.844727, 41.342622 ], [ 118.890923, 41.300823 ], [ 118.949437, 41.317906 ], [ 118.980234, 41.305769 ], [ 119.092951, 41.293629 ], [ 119.168712, 41.294978 ], [ 119.197661, 41.282837 ], [ 119.211827, 41.308016 ], [ 119.239545, 41.31431 ], [ 119.2494, 41.279689 ], [ 119.209364, 41.244599 ], [ 119.204436, 41.222546 ], [ 119.169943, 41.222996 ], [ 119.189038, 41.198234 ], [ 119.126212, 41.138767 ], [ 119.081248, 41.131555 ], [ 119.080632, 41.095936 ], [ 119.037516, 41.067516 ], [ 118.964836, 41.079246 ], [ 118.937118, 41.052625 ], [ 118.951901, 41.018317 ], [ 119.013495, 41.007479 ], [ 119.00056, 40.967273 ], [ 118.977154, 40.959138 ], [ 118.977154, 40.959138 ], [ 118.916792, 40.969984 ], [ 118.90201, 40.960946 ], [ 118.873061, 40.847866 ], [ 118.845959, 40.822057 ], [ 118.878604, 40.783098 ], [ 118.907553, 40.775394 ], [ 118.895234, 40.75409 ], [ 118.950053, 40.747743 ], [ 118.96114, 40.72008 ], [ 119.011031, 40.687414 ], [ 119.028277, 40.692406 ], [ 119.054763, 40.664721 ], [ 119.115125, 40.666536 ], [ 119.165632, 40.69286 ], [ 119.184726, 40.680153 ], [ 119.14469, 40.632482 ], [ 119.162552, 40.600228 ], [ 119.177951, 40.609315 ], [ 119.230921, 40.603863 ], [ 119.22045, 40.569322 ], [ 119.256175, 40.543404 ], [ 119.30237, 40.530215 ], [ 119.429254, 40.540221 ], [ 119.477913, 40.533399 ], [ 119.503783, 40.553864 ], [ 119.559217, 40.547952 ], [ 119.572152, 40.523846 ], [ 119.553674, 40.502007 ], [ 119.604797, 40.455119 ], [ 119.586934, 40.375381 ], [ 119.598021, 40.334335 ], [ 119.651608, 40.271808 ], [ 119.639289, 40.231613 ], [ 119.639289, 40.231613 ], [ 119.671934, 40.23938 ], [ 119.716898, 40.195966 ], [ 119.745847, 40.207851 ], [ 119.760629, 40.136056 ], [ 119.736608, 40.104936 ], [ 119.772332, 40.08113 ], [ 119.783419, 40.046778 ], [ 119.783419, 40.046778 ], [ 119.787115, 40.041739 ], [ 119.787115, 40.041739 ], [ 119.81668, 40.050443 ], [ 119.81668, 40.050443 ], [ 119.854252, 40.033033 ], [ 119.845629, 40.000949 ], [ 119.845629, 40.000949 ], [ 119.854252, 39.98857 ], [ 119.872114, 39.960594 ], [ 119.842549, 39.956007 ], [ 119.820375, 39.979399 ], [ 119.787115, 39.950502 ], [ 119.726137, 39.940867 ], [ 119.681789, 39.922511 ], [ 119.642369, 39.925264 ], [ 119.620195, 39.904609 ], [ 119.588166, 39.910576 ], [ 119.540739, 39.888079 ], [ 119.520413, 39.840306 ], [ 119.536427, 39.809052 ], [ 119.474217, 39.813189 ], [ 119.366428, 39.734996 ], [ 119.269726, 39.498497 ], [ 119.316537, 39.437051 ], [ 119.317153, 39.4107 ], [ 119.272805, 39.363521 ], [ 119.185342, 39.342234 ], [ 119.121284, 39.281576 ], [ 119.096031, 39.24219 ], [ 119.038132, 39.211593 ], [ 119.023966, 39.187012 ], [ 118.97777, 39.163352 ], [ 118.926031, 39.123435 ], [ 118.890307, 39.118792 ], [ 118.896466, 39.139683 ], [ 118.951285, 39.178662 ], [ 118.920488, 39.171703 ], [ 118.897082, 39.151286 ], [ 118.857662, 39.162888 ], [ 118.814546, 39.138754 ], [ 118.76096, 39.133648 ], [ 118.637156, 39.157319 ], [ 118.578642, 39.130863 ], [ 118.588497, 39.107648 ], [ 118.533062, 39.090928 ], [ 118.570634, 38.999363 ], [ 118.604511, 38.971452 ], [ 118.539837, 38.910008 ], [ 118.491178, 38.909077 ], [ 118.377845, 38.971917 ], [ 118.366143, 39.016104 ], [ 118.319331, 39.009594 ], [ 118.225092, 39.034701 ], [ 118.1906, 39.080708 ], [ 118.162883, 39.136433 ], [ 118.12531, 39.182838 ], [ 118.065564, 39.218084 ], [ 118.056941, 39.219939 ], [ 118.037231, 39.220402 ], [ 118.064948, 39.231065 ], [ 118.064948, 39.256094 ], [ 118.036615, 39.264898 ], [ 118.024296, 39.289451 ], [ 118.024296, 39.289451 ], [ 117.982412, 39.298714 ], [ 117.982412, 39.298714 ], [ 117.979333, 39.300566 ], [ 117.979333, 39.300566 ], [ 117.973173, 39.312143 ], [ 117.973173, 39.312143 ], [ 117.965782, 39.314921 ], [ 117.965782, 39.314921 ], [ 117.919587, 39.318162 ], [ 117.919587, 39.318162 ], [ 117.88879, 39.332051 ], [ 117.854913, 39.328348 ], [ 117.854297, 39.328348 ], [ 117.854913, 39.328348 ], [ 117.854297, 39.328348 ], [ 117.850601, 39.363984 ], [ 117.850601, 39.363984 ], [ 117.810565, 39.354729 ], [ 117.805022, 39.373237 ], [ 117.852449, 39.380639 ], [ 117.846906, 39.407926 ], [ 117.871543, 39.411625 ], [ 117.870311, 39.455074 ], [ 117.899877, 39.474479 ], [ 117.912195, 39.517428 ], [ 117.912195, 39.517428 ], [ 117.904804, 39.533585 ], [ 117.933753, 39.574191 ], [ 117.868464, 39.59679 ], [ 117.829659, 39.589873 ], [ 117.766834, 39.598635 ], [ 117.753899, 39.579726 ], [ 117.753899, 39.579726 ], [ 117.745276, 39.547892 ], [ 117.715711, 39.529892 ], [ 117.707088, 39.576036 ], [ 117.684914, 39.58895 ], [ 117.654117, 39.575113 ], [ 117.637486, 39.603246 ], [ 117.66274, 39.636437 ], [ 117.668899, 39.666849 ], [ 117.627015, 39.703693 ], [ 117.57774, 39.726711 ], [ 117.595603, 39.74604 ], [ 117.56111, 39.754782 ], [ 117.546327, 39.775943 ], [ 117.561726, 39.799856 ], [ 117.529081, 39.859144 ], [ 117.529081, 39.859144 ], [ 117.508139, 39.901854 ], [ 117.508139, 39.901854 ], [ 117.512451, 39.90874 ], [ 117.512451, 39.90874 ], [ 117.513067, 39.910576 ], [ 117.513067, 39.910576 ], [ 117.514914, 39.946832 ], [ 117.534625, 39.954631 ], [ 117.546327, 39.999116 ], [ 117.594987, 39.994531 ], [ 117.594987, 39.994531 ], [ 117.614697, 39.97252 ], [ 117.671363, 39.973896 ], [ 117.691073, 39.984902 ], [ 117.756363, 39.965181 ], [ 117.781616, 39.966558 ], [ 117.781616, 39.966558 ], [ 117.795167, 39.996823 ], [ 117.795167, 39.996823 ], [ 117.793319, 40.005534 ], [ 117.793319, 40.005534 ], [ 117.768681, 40.022034 ], [ 117.768681, 40.022034 ], [ 117.744044, 40.018368 ], [ 117.74774, 40.047236 ], [ 117.776073, 40.059605 ], [ 117.752667, 40.081588 ], [ 117.71879, 40.082045 ], [ 117.71879, 40.082045 ], [ 117.675059, 40.082045 ], [ 117.655965, 40.109514 ], [ 117.655965, 40.109514 ], [ 117.654117, 40.114548 ], [ 117.654117, 40.114548 ], [ 117.651653, 40.122786 ], [ 117.651653, 40.122786 ], [ 117.613465, 40.158014 ], [ 117.613465, 40.158014 ], [ 117.609769, 40.160301 ], [ 117.609769, 40.160301 ], [ 117.576508, 40.178593 ], [ 117.571581, 40.219276 ], [ 117.548791, 40.232527 ], [ 117.505059, 40.227044 ], [ 117.450241, 40.252627 ], [ 117.415748, 40.248973 ], [ 117.389879, 40.227958 ], [ 117.351075, 40.229786 ], [ 117.331365, 40.289613 ], [ 117.295024, 40.2782 ], [ 117.271618, 40.325211 ], [ 117.271618, 40.325211 ], [ 117.243285, 40.369453 ], [ 117.226039, 40.368997 ], [ 117.234046, 40.417312 ], [ 117.263611, 40.442367 ], [ 117.208793, 40.501552 ], [ 117.262995, 40.512927 ], [ 117.247597, 40.539766 ], [ 117.269771, 40.560684 ], [ 117.348611, 40.581141 ], [ 117.348611, 40.581141 ], [ 117.389879, 40.561593 ], [ 117.429915, 40.576141 ], [ 117.412669, 40.605226 ], [ 117.467487, 40.649738 ] ] ], [ [ [ 117.210024, 40.082045 ], [ 117.192162, 40.066475 ], [ 117.198322, 39.992697 ], [ 117.150894, 39.944996 ], [ 117.162597, 39.876598 ], [ 117.162597, 39.876598 ], [ 117.227887, 39.852712 ], [ 117.247597, 39.860981 ], [ 117.251908, 39.834332 ], [ 117.192162, 39.832953 ], [ 117.156438, 39.817326 ], [ 117.15767, 39.796638 ], [ 117.205713, 39.763984 ], [ 117.161981, 39.748801 ], [ 117.165061, 39.718886 ], [ 117.165061, 39.718886 ], [ 117.177996, 39.645194 ], [ 117.152742, 39.623532 ], [ 117.10901, 39.625375 ], [ 117.10901, 39.625375 ], [ 117.016004, 39.653949 ], [ 116.983359, 39.638742 ], [ 116.983359, 39.638742 ], [ 116.964265, 39.64335 ], [ 116.948866, 39.680668 ], [ 116.948866, 39.680668 ], [ 116.944555, 39.695405 ], [ 116.944555, 39.695405 ], [ 116.932236, 39.706456 ], [ 116.932236, 39.706456 ], [ 116.90575, 39.688037 ], [ 116.889736, 39.687576 ], [ 116.887272, 39.72533 ], [ 116.916837, 39.731314 ], [ 116.902055, 39.763523 ], [ 116.949482, 39.778703 ], [ 116.918069, 39.84628 ], [ 116.907598, 39.832494 ], [ 116.865714, 39.843982 ], [ 116.812128, 39.889916 ], [ 116.78441, 39.891294 ], [ 116.782563, 39.947749 ], [ 116.757925, 39.967934 ], [ 116.781331, 40.034866 ], [ 116.820135, 40.02845 ], [ 116.831222, 40.051359 ], [ 116.867562, 40.041739 ], [ 116.927924, 40.055024 ], [ 116.945171, 40.04128 ], [ 117.025243, 40.030283 ], [ 117.051728, 40.059605 ], [ 117.105315, 40.074261 ], [ 117.105315, 40.074261 ], [ 117.140423, 40.064185 ], [ 117.159517, 40.077008 ], [ 117.204481, 40.069681 ], [ 117.210024, 40.082045 ] ] ], [ [ [ 117.784696, 39.376938 ], [ 117.74466, 39.354729 ], [ 117.670747, 39.35658 ], [ 117.669515, 39.322792 ], [ 117.594987, 39.349176 ], [ 117.536472, 39.338068 ], [ 117.521074, 39.357043 ], [ 117.570965, 39.404689 ], [ 117.601146, 39.419485 ], [ 117.614081, 39.407001 ], [ 117.668899, 39.412087 ], [ 117.673211, 39.386652 ], [ 117.699696, 39.407463 ], [ 117.765602, 39.400527 ], [ 117.784696, 39.376938 ] ] ], [ [ [ 118.869365, 39.142932 ], [ 118.857662, 39.098824 ], [ 118.82009, 39.108576 ], [ 118.869365, 39.142932 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"140000\", \"name\": \"山西省\", \"center\": [ 112.549248, 37.857014 ], \"centroid\": [ 112.304761, 37.618555 ], \"childrenNum\": 11, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 3, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 114.134639, 40.737314 ], [ 114.162357, 40.71373 ], [ 114.183299, 40.67153 ], [ 114.236269, 40.607043 ], [ 114.283081, 40.590685 ], [ 114.273842, 40.552954 ], [ 114.293552, 40.55159 ], [ 114.282465, 40.494725 ], [ 114.267066, 40.474242 ], [ 114.299711, 40.44009 ], [ 114.286161, 40.425057 ], [ 114.31203, 40.372645 ], [ 114.381015, 40.36307 ], [ 114.390254, 40.351213 ], [ 114.438914, 40.371733 ], [ 114.481413, 40.34802 ], [ 114.530688, 40.345283 ], [ 114.510978, 40.302851 ], [ 114.46971, 40.268155 ], [ 114.406269, 40.246232 ], [ 114.362537, 40.249886 ], [ 114.292936, 40.230242 ], [ 114.255364, 40.236182 ], [ 114.235654, 40.198252 ], [ 114.180219, 40.191395 ], [ 114.135871, 40.175392 ], [ 114.097683, 40.193681 ], [ 114.073046, 40.168533 ], [ 114.073046, 40.168533 ], [ 114.101995, 40.099901 ], [ 114.086596, 40.071513 ], [ 114.045944, 40.056856 ], [ 114.018227, 40.103563 ], [ 113.989278, 40.11226 ], [ 113.959097, 40.033491 ], [ 113.910438, 40.015618 ], [ 114.029314, 39.985819 ], [ 114.028082, 39.959218 ], [ 114.047176, 39.916085 ], [ 114.067502, 39.922511 ], [ 114.17406, 39.897722 ], [ 114.212248, 39.918839 ], [ 114.229494, 39.899558 ], [ 114.204241, 39.885324 ], [ 114.215943, 39.8619 ], [ 114.286776, 39.871087 ], [ 114.285545, 39.858225 ], [ 114.395182, 39.867412 ], [ 114.406885, 39.833413 ], [ 114.390254, 39.819165 ], [ 114.41674, 39.775943 ], [ 114.409964, 39.761683 ], [ 114.408117, 39.652106 ], [ 114.431522, 39.613851 ], [ 114.49558, 39.608318 ], [ 114.51529, 39.564964 ], [ 114.568877, 39.573729 ], [ 114.532536, 39.486027 ], [ 114.501739, 39.476789 ], [ 114.496812, 39.438437 ], [ 114.469095, 39.400989 ], [ 114.466631, 39.329736 ], [ 114.430906, 39.307513 ], [ 114.437066, 39.259337 ], [ 114.416124, 39.242654 ], [ 114.47587, 39.21623 ], [ 114.443841, 39.174023 ], [ 114.388406, 39.176807 ], [ 114.360689, 39.134112 ], [ 114.369928, 39.107648 ], [ 114.345907, 39.075133 ], [ 114.252284, 39.073739 ], [ 114.180835, 39.049111 ], [ 114.157429, 39.061194 ], [ 114.10877, 39.052364 ], [ 114.082901, 39.09325 ], [ 114.082901, 39.09325 ], [ 114.064422, 39.094179 ], [ 114.050872, 39.135969 ], [ 114.006524, 39.122971 ], [ 113.994821, 39.095572 ], [ 113.961561, 39.100681 ], [ 113.930148, 39.063517 ], [ 113.898119, 39.067699 ], [ 113.80696, 38.989595 ], [ 113.776779, 38.986804 ], [ 113.76754, 38.959819 ], [ 113.776163, 38.885788 ], [ 113.795257, 38.860628 ], [ 113.855619, 38.828933 ], [ 113.836525, 38.795824 ], [ 113.839605, 38.7585 ], [ 113.802648, 38.763166 ], [ 113.775547, 38.709949 ], [ 113.720728, 38.713218 ], [ 113.70225, 38.651551 ], [ 113.612939, 38.645942 ], [ 113.603084, 38.587024 ], [ 113.561816, 38.558483 ], [ 113.5612, 38.485909 ], [ 113.583374, 38.459671 ], [ 113.537794, 38.417952 ], [ 113.525475, 38.383245 ], [ 113.557504, 38.343359 ], [ 113.54457, 38.270569 ], [ 113.570439, 38.237202 ], [ 113.598772, 38.22733 ], [ 113.64312, 38.232031 ], [ 113.678844, 38.20523 ], [ 113.711489, 38.213695 ], [ 113.720728, 38.174656 ], [ 113.797105, 38.162894 ], [ 113.831597, 38.16854 ], [ 113.811271, 38.117707 ], [ 113.876561, 38.055059 ], [ 113.872249, 37.990471 ], [ 113.901198, 37.984811 ], [ 113.936307, 37.922993 ], [ 113.959097, 37.906468 ], [ 113.976959, 37.816696 ], [ 114.006524, 37.813386 ], [ 114.044712, 37.761834 ], [ 113.996669, 37.730128 ], [ 113.993589, 37.706932 ], [ 114.068118, 37.721608 ], [ 114.12848, 37.698409 ], [ 114.139567, 37.675676 ], [ 114.115545, 37.619761 ], [ 114.118625, 37.59084 ], [ 114.036705, 37.494037 ], [ 114.014531, 37.42468 ], [ 113.973879, 37.40329 ], [ 113.962792, 37.355734 ], [ 113.90243, 37.310052 ], [ 113.886416, 37.239095 ], [ 113.853155, 37.215269 ], [ 113.832213, 37.167594 ], [ 113.773083, 37.151855 ], [ 113.773699, 37.107004 ], [ 113.758301, 37.075497 ], [ 113.788482, 37.059739 ], [ 113.771851, 37.016745 ], [ 113.791561, 36.98759 ], [ 113.76138, 36.956034 ], [ 113.792793, 36.894796 ], [ 113.773083, 36.85506 ], [ 113.731815, 36.858891 ], [ 113.731815, 36.878521 ], [ 113.696707, 36.882351 ], [ 113.676381, 36.855539 ], [ 113.680692, 36.789907 ], [ 113.600004, 36.752995 ], [ 113.549497, 36.752515 ], [ 113.535946, 36.732373 ], [ 113.499606, 36.740527 ], [ 113.465113, 36.707908 ], [ 113.506997, 36.705029 ], [ 113.476816, 36.655114 ], [ 113.486671, 36.635427 ], [ 113.54457, 36.62342 ], [ 113.539642, 36.594116 ], [ 113.569823, 36.585947 ], [ 113.588917, 36.547974 ], [ 113.559968, 36.528741 ], [ 113.554425, 36.494589 ], [ 113.587069, 36.460904 ], [ 113.635729, 36.451277 ], [ 113.670221, 36.425278 ], [ 113.708409, 36.423352 ], [ 113.731199, 36.363135 ], [ 113.736127, 36.324571 ], [ 113.712105, 36.303353 ], [ 113.716417, 36.262347 ], [ 113.681924, 36.216491 ], [ 113.697939, 36.181719 ], [ 113.651127, 36.174473 ], [ 113.705946, 36.148865 ], [ 113.712721, 36.129533 ], [ 113.655439, 36.125182 ], [ 113.671453, 36.115514 ], [ 113.68562, 36.056026 ], [ 113.660366, 36.034735 ], [ 113.694859, 36.026991 ], [ 113.678844, 35.985841 ], [ 113.648663, 35.994073 ], [ 113.654207, 35.931586 ], [ 113.637576, 35.870019 ], [ 113.660982, 35.837035 ], [ 113.582758, 35.818111 ], [ 113.604932, 35.797727 ], [ 113.587685, 35.736542 ], [ 113.592613, 35.691838 ], [ 113.622794, 35.674825 ], [ 113.625258, 35.632518 ], [ 113.578446, 35.633491 ], [ 113.547649, 35.656835 ], [ 113.55812, 35.621816 ], [ 113.513773, 35.57364 ], [ 113.49899, 35.532254 ], [ 113.439244, 35.507412 ], [ 113.391817, 35.506925 ], [ 113.348085, 35.468429 ], [ 113.31236, 35.481101 ], [ 113.304353, 35.426989 ], [ 113.243375, 35.449418 ], [ 113.189789, 35.44893 ], [ 113.188557, 35.412357 ], [ 113.165151, 35.412845 ], [ 113.149137, 35.350878 ], [ 113.126347, 35.332327 ], [ 113.067217, 35.353806 ], [ 112.996384, 35.362104 ], [ 112.985913, 35.33965 ], [ 112.992072, 35.29619 ], [ 112.936022, 35.284466 ], [ 112.934174, 35.262968 ], [ 112.884283, 35.243909 ], [ 112.822073, 35.258082 ], [ 112.772798, 35.207732 ], [ 112.720443, 35.206265 ], [ 112.628052, 35.263457 ], [ 112.637291, 35.225822 ], [ 112.513487, 35.218489 ], [ 112.390915, 35.239021 ], [ 112.36751, 35.219956 ], [ 112.288053, 35.219956 ], [ 112.304684, 35.251728 ], [ 112.242474, 35.234622 ], [ 112.21722, 35.253195 ], [ 112.094033, 35.279092 ], [ 112.058924, 35.280069 ], [ 112.078634, 35.219467 ], [ 112.03983, 35.194039 ], [ 112.066315, 35.153437 ], [ 112.05646, 35.098615 ], [ 112.062004, 35.056005 ], [ 112.039214, 35.045717 ], [ 112.018888, 35.068742 ], [ 111.97762, 35.067272 ], [ 111.933272, 35.083435 ], [ 111.810084, 35.062374 ], [ 111.807005, 35.032977 ], [ 111.739251, 35.00406 ], [ 111.664107, 34.984449 ], [ 111.681969, 34.9511 ], [ 111.646861, 34.938836 ], [ 111.617911, 34.894671 ], [ 111.592042, 34.881416 ], [ 111.570484, 34.843114 ], [ 111.543999, 34.853428 ], [ 111.502731, 34.829851 ], [ 111.439289, 34.838202 ], [ 111.389398, 34.815113 ], [ 111.345666, 34.831816 ], [ 111.29208, 34.806759 ], [ 111.255123, 34.819535 ], [ 111.232949, 34.789559 ], [ 111.148566, 34.807742 ], [ 111.118385, 34.756623 ], [ 111.035233, 34.740887 ], [ 110.976103, 34.706456 ], [ 110.929907, 34.731543 ], [ 110.89911, 34.661673 ], [ 110.870777, 34.636072 ], [ 110.812263, 34.624746 ], [ 110.780234, 34.648874 ], [ 110.749437, 34.65232 ], [ 110.710017, 34.605045 ], [ 110.610851, 34.607508 ], [ 110.533242, 34.583368 ], [ 110.488279, 34.610956 ], [ 110.424837, 34.588295 ], [ 110.379257, 34.600612 ], [ 110.29549, 34.610956 ], [ 110.23636, 34.670533 ], [ 110.231432, 34.701044 ], [ 110.259149, 34.737937 ], [ 110.232664, 34.80332 ], [ 110.233896, 34.83722 ], [ 110.259149, 34.884853 ], [ 110.257301, 34.934912 ], [ 110.272084, 34.942761 ], [ 110.325671, 35.014844 ], [ 110.369402, 35.158329 ], [ 110.374946, 35.251728 ], [ 110.45009, 35.327933 ], [ 110.477808, 35.413821 ], [ 110.531394, 35.511309 ], [ 110.567735, 35.539559 ], [ 110.609619, 35.632031 ], [ 110.57759, 35.701559 ], [ 110.571431, 35.800639 ], [ 110.550489, 35.838005 ], [ 110.549257, 35.877778 ], [ 110.511684, 35.879718 ], [ 110.516612, 35.918501 ], [ 110.502445, 35.947575 ], [ 110.516612, 35.971796 ], [ 110.49259, 35.994073 ], [ 110.491974, 36.034735 ], [ 110.467953, 36.074893 ], [ 110.447011, 36.164328 ], [ 110.45625, 36.22663 ], [ 110.474112, 36.248352 ], [ 110.474112, 36.306729 ], [ 110.459946, 36.327946 ], [ 110.487047, 36.393972 ], [ 110.489511, 36.430094 ], [ 110.47288, 36.453203 ], [ 110.503677, 36.488335 ], [ 110.488895, 36.556628 ], [ 110.496902, 36.582102 ], [ 110.447627, 36.621018 ], [ 110.426685, 36.657514 ], [ 110.394656, 36.676716 ], [ 110.402663, 36.697352 ], [ 110.438388, 36.685835 ], [ 110.447011, 36.737649 ], [ 110.407591, 36.776007 ], [ 110.423605, 36.818179 ], [ 110.406975, 36.824886 ], [ 110.424221, 36.855539 ], [ 110.376178, 36.882351 ], [ 110.408823, 36.892403 ], [ 110.424221, 36.963685 ], [ 110.381721, 37.002408 ], [ 110.382953, 37.022001 ], [ 110.426685, 37.008621 ], [ 110.417446, 37.027257 ], [ 110.460561, 37.044932 ], [ 110.49567, 37.086956 ], [ 110.535706, 37.115118 ], [ 110.53509, 37.138021 ], [ 110.590525, 37.187145 ], [ 110.651503, 37.256722 ], [ 110.660126, 37.281011 ], [ 110.690307, 37.287201 ], [ 110.678604, 37.317668 ], [ 110.695234, 37.34955 ], [ 110.641648, 37.360015 ], [ 110.630561, 37.372858 ], [ 110.644111, 37.435135 ], [ 110.740198, 37.44939 ], [ 110.759292, 37.474567 ], [ 110.770995, 37.538184 ], [ 110.795017, 37.558586 ], [ 110.771611, 37.594634 ], [ 110.763604, 37.639668 ], [ 110.793169, 37.650567 ], [ 110.775306, 37.680886 ], [ 110.706321, 37.705511 ], [ 110.716792, 37.728708 ], [ 110.750669, 37.736281 ], [ 110.735886, 37.77035 ], [ 110.680452, 37.790216 ], [ 110.59422, 37.922049 ], [ 110.522771, 37.955088 ], [ 110.528315, 37.990471 ], [ 110.507989, 38.013107 ], [ 110.501829, 38.097929 ], [ 110.519692, 38.130889 ], [ 110.509221, 38.192061 ], [ 110.528315, 38.211814 ], [ 110.565887, 38.215105 ], [ 110.57759, 38.297345 ], [ 110.601612, 38.308147 ], [ 110.661358, 38.308617 ], [ 110.701394, 38.353215 ], [ 110.746973, 38.366355 ], [ 110.77777, 38.440924 ], [ 110.796864, 38.453579 ], [ 110.840596, 38.439986 ], [ 110.874473, 38.453579 ], [ 110.870777, 38.510265 ], [ 110.907733, 38.521035 ], [ 110.920052, 38.581878 ], [ 110.898494, 38.587024 ], [ 110.880632, 38.626776 ], [ 110.916357, 38.673981 ], [ 110.915125, 38.704345 ], [ 110.965016, 38.755699 ], [ 111.009363, 38.847579 ], [ 110.995813, 38.868084 ], [ 111.016755, 38.889981 ], [ 111.009979, 38.932823 ], [ 110.980414, 38.970056 ], [ 110.998276, 38.998433 ], [ 111.038313, 39.020289 ], [ 111.094363, 39.030053 ], [ 111.138095, 39.064447 ], [ 111.147334, 39.100681 ], [ 111.173819, 39.135041 ], [ 111.163348, 39.152678 ], [ 111.219399, 39.244044 ], [ 111.213239, 39.257021 ], [ 111.247732, 39.302419 ], [ 111.202152, 39.305197 ], [ 111.179363, 39.326959 ], [ 111.186138, 39.35149 ], [ 111.155341, 39.338531 ], [ 111.159037, 39.362596 ], [ 111.125776, 39.366297 ], [ 111.143022, 39.407926 ], [ 111.171971, 39.423183 ], [ 111.287152, 39.417173 ], [ 111.358601, 39.432428 ], [ 111.385086, 39.489722 ], [ 111.431282, 39.508656 ], [ 111.422043, 39.539123 ], [ 111.441137, 39.59679 ], [ 111.460847, 39.606935 ], [ 111.445448, 39.640124 ], [ 111.497187, 39.661781 ], [ 111.525521, 39.662242 ], [ 111.61668, 39.633211 ], [ 111.646245, 39.644272 ], [ 111.707839, 39.621227 ], [ 111.722621, 39.606013 ], [ 111.783599, 39.58895 ], [ 111.842729, 39.620305 ], [ 111.87907, 39.606013 ], [ 111.9382, 39.623071 ], [ 111.925265, 39.66731 ], [ 111.959758, 39.692642 ], [ 111.970229, 39.796638 ], [ 112.012729, 39.827438 ], [ 112.042294, 39.886243 ], [ 112.07617, 39.919298 ], [ 112.133453, 40.001866 ], [ 112.142076, 40.027076 ], [ 112.182112, 40.061437 ], [ 112.183344, 40.083877 ], [ 112.232003, 40.133311 ], [ 112.232619, 40.169905 ], [ 112.299756, 40.21105 ], [ 112.310227, 40.256281 ], [ 112.349031, 40.257194 ], [ 112.418017, 40.295091 ], [ 112.456205, 40.300112 ], [ 112.511639, 40.269068 ], [ 112.6299, 40.235725 ], [ 112.712436, 40.178593 ], [ 112.744464, 40.167161 ], [ 112.848558, 40.206937 ], [ 112.898449, 40.329317 ], [ 113.03334, 40.368997 ], [ 113.083231, 40.374925 ], [ 113.251382, 40.413211 ], [ 113.27602, 40.388601 ], [ 113.316672, 40.319736 ], [ 113.387505, 40.319279 ], [ 113.500222, 40.334335 ], [ 113.559968, 40.348476 ], [ 113.688699, 40.448288 ], [ 113.763228, 40.473787 ], [ 113.794641, 40.517932 ], [ 113.850691, 40.460583 ], [ 113.890112, 40.466503 ], [ 113.948626, 40.514747 ], [ 114.011452, 40.515657 ], [ 114.061959, 40.52885 ], [ 114.080437, 40.547952 ], [ 114.076741, 40.575686 ], [ 114.041633, 40.608861 ], [ 114.07243, 40.679246 ], [ 114.063806, 40.706925 ], [ 114.084748, 40.729605 ], [ 114.134639, 40.737314 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"150000\", \"name\": \"内蒙古自治区\", \"center\": [ 111.670801, 40.818311 ], \"centroid\": [ 114.077404, 44.331072 ], \"childrenNum\": 12, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 4, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"Polygon\", \"coordinates\": [ [ [ 111.125776, 39.366297 ], [ 111.087588, 39.376013 ], [ 111.098059, 39.401914 ], [ 111.064182, 39.400989 ], [ 111.058639, 39.447681 ], [ 111.10545, 39.472631 ], [ 111.10545, 39.497573 ], [ 111.148566, 39.531277 ], [ 111.154725, 39.569116 ], [ 111.136863, 39.587106 ], [ 111.101138, 39.559428 ], [ 111.017371, 39.552045 ], [ 110.958856, 39.519275 ], [ 110.891103, 39.509118 ], [ 110.869545, 39.494341 ], [ 110.782698, 39.38804 ], [ 110.73835, 39.348713 ], [ 110.731575, 39.30705 ], [ 110.702626, 39.273701 ], [ 110.626249, 39.266751 ], [ 110.596684, 39.282966 ], [ 110.566503, 39.320014 ], [ 110.559728, 39.351027 ], [ 110.524003, 39.382952 ], [ 110.482735, 39.360745 ], [ 110.434692, 39.381101 ], [ 110.429764, 39.341308 ], [ 110.385417, 39.310291 ], [ 110.257917, 39.407001 ], [ 110.243751, 39.423645 ], [ 110.152592, 39.45415 ], [ 110.12549, 39.432891 ], [ 110.136577, 39.39174 ], [ 110.161831, 39.387115 ], [ 110.184005, 39.355192 ], [ 110.217881, 39.281113 ], [ 110.109476, 39.249606 ], [ 110.041107, 39.21623 ], [ 109.962267, 39.212056 ], [ 109.90252, 39.271848 ], [ 109.871723, 39.243581 ], [ 109.961035, 39.191651 ], [ 109.893897, 39.141075 ], [ 109.92223, 39.107183 ], [ 109.890818, 39.103932 ], [ 109.851397, 39.122971 ], [ 109.793499, 39.074204 ], [ 109.762086, 39.057476 ], [ 109.72513, 39.018429 ], [ 109.665384, 38.981687 ], [ 109.685094, 38.968195 ], [ 109.672159, 38.928167 ], [ 109.624116, 38.85457 ], [ 109.549587, 38.805618 ], [ 109.511399, 38.833595 ], [ 109.444262, 38.782763 ], [ 109.404226, 38.720689 ], [ 109.338936, 38.701542 ], [ 109.329081, 38.66043 ], [ 109.367269, 38.627711 ], [ 109.331545, 38.597783 ], [ 109.276726, 38.623035 ], [ 109.196654, 38.552867 ], [ 109.175712, 38.518694 ], [ 109.128901, 38.480288 ], [ 109.054372, 38.433892 ], [ 109.051292, 38.385122 ], [ 109.007561, 38.359316 ], [ 108.961981, 38.26493 ], [ 108.976148, 38.245192 ], [ 108.938575, 38.207582 ], [ 108.964445, 38.154894 ], [ 109.069155, 38.091336 ], [ 109.050676, 38.055059 ], [ 109.06977, 38.023008 ], [ 109.037742, 38.021593 ], [ 109.018648, 37.971602 ], [ 108.982923, 37.964053 ], [ 108.9743, 37.931962 ], [ 108.93488, 37.922521 ], [ 108.893612, 37.978207 ], [ 108.883141, 38.01405 ], [ 108.830786, 38.049875 ], [ 108.797525, 38.04799 ], [ 108.82709, 37.989056 ], [ 108.798141, 37.93385 ], [ 108.791982, 37.872934 ], [ 108.799989, 37.784068 ], [ 108.784591, 37.764673 ], [ 108.791982, 37.700303 ], [ 108.777815, 37.683728 ], [ 108.720533, 37.683728 ], [ 108.699591, 37.669518 ], [ 108.628142, 37.651988 ], [ 108.532671, 37.690832 ], [ 108.485244, 37.678044 ], [ 108.422418, 37.648672 ], [ 108.301078, 37.640616 ], [ 108.293071, 37.656726 ], [ 108.24626, 37.665728 ], [ 108.205608, 37.655779 ], [ 108.193905, 37.638246 ], [ 108.134159, 37.622131 ], [ 108.055318, 37.652462 ], [ 108.025137, 37.649619 ], [ 108.012819, 37.66857 ], [ 108.025753, 37.696041 ], [ 107.993109, 37.735335 ], [ 107.982022, 37.787378 ], [ 107.884703, 37.808186 ], [ 107.842819, 37.828987 ], [ 107.732566, 37.84931 ], [ 107.684523, 37.888522 ], [ 107.65003, 37.86443 ], [ 107.560719, 37.893717 ], [ 107.49235, 37.944706 ], [ 107.448618, 37.933378 ], [ 107.411662, 37.948009 ], [ 107.440611, 37.995659 ], [ 107.3938, 38.014993 ], [ 107.33159, 38.086625 ], [ 107.240431, 38.111586 ], [ 107.19054, 38.153953 ], [ 107.138801, 38.161011 ], [ 107.119091, 38.134185 ], [ 107.071047, 38.138892 ], [ 107.051337, 38.122886 ], [ 107.010069, 38.120532 ], [ 106.942316, 38.132302 ], [ 106.858548, 38.156306 ], [ 106.779092, 38.171833 ], [ 106.737824, 38.197706 ], [ 106.654672, 38.22921 ], [ 106.627571, 38.232501 ], [ 106.555506, 38.263521 ], [ 106.482209, 38.319417 ], [ 106.599854, 38.389812 ], [ 106.647897, 38.470917 ], [ 106.66268, 38.601524 ], [ 106.709491, 38.718821 ], [ 106.756302, 38.748699 ], [ 106.837606, 38.847579 ], [ 106.954019, 38.941202 ], [ 106.971881, 39.026333 ], [ 106.96757, 39.054688 ], [ 106.933693, 39.076527 ], [ 106.878874, 39.091392 ], [ 106.859164, 39.107648 ], [ 106.825288, 39.19397 ], [ 106.795723, 39.214375 ], [ 106.790795, 39.241263 ], [ 106.806193, 39.277407 ], [ 106.806809, 39.318625 ], [ 106.781556, 39.371849 ], [ 106.751375, 39.381564 ], [ 106.683622, 39.357506 ], [ 106.643586, 39.357969 ], [ 106.602318, 39.37555 ], [ 106.556122, 39.322329 ], [ 106.525325, 39.308439 ], [ 106.511774, 39.272311 ], [ 106.402753, 39.291767 ], [ 106.280181, 39.262118 ], [ 106.29558, 39.167992 ], [ 106.285109, 39.146181 ], [ 106.251232, 39.131327 ], [ 106.192718, 39.142932 ], [ 106.170544, 39.163352 ], [ 106.145907, 39.153142 ], [ 106.096631, 39.084889 ], [ 106.078153, 39.026333 ], [ 106.087392, 39.006339 ], [ 106.060907, 38.96866 ], [ 106.021487, 38.953769 ], [ 105.97098, 38.909077 ], [ 105.992538, 38.857366 ], [ 105.909386, 38.791159 ], [ 105.908154, 38.737496 ], [ 105.88598, 38.716953 ], [ 105.894603, 38.696405 ], [ 105.852719, 38.641735 ], [ 105.874277, 38.593105 ], [ 105.856415, 38.569714 ], [ 105.863806, 38.53508 ], [ 105.836705, 38.476071 ], [ 105.850872, 38.443736 ], [ 105.827466, 38.432486 ], [ 105.835473, 38.387467 ], [ 105.821307, 38.366824 ], [ 105.86627, 38.296406 ], [ 105.842248, 38.240962 ], [ 105.802828, 38.220277 ], [ 105.775111, 38.186887 ], [ 105.76772, 38.121474 ], [ 105.780655, 38.084741 ], [ 105.840401, 38.004147 ], [ 105.799749, 37.939986 ], [ 105.80406, 37.862068 ], [ 105.760944, 37.799674 ], [ 105.677177, 37.771769 ], [ 105.622358, 37.777919 ], [ 105.616199, 37.722555 ], [ 105.598952, 37.699356 ], [ 105.467141, 37.695094 ], [ 105.4037, 37.710246 ], [ 105.315004, 37.702197 ], [ 105.221998, 37.677097 ], [ 105.187505, 37.657674 ], [ 105.111128, 37.633981 ], [ 105.027977, 37.580881 ], [ 104.866601, 37.566651 ], [ 104.805007, 37.539133 ], [ 104.623305, 37.522522 ], [ 104.433595, 37.515402 ], [ 104.419429, 37.511604 ], [ 104.407726, 37.464592 ], [ 104.322726, 37.44844 ], [ 104.287002, 37.428007 ], [ 104.237727, 37.411847 ], [ 104.183524, 37.406618 ], [ 104.089285, 37.465067 ], [ 103.935916, 37.572818 ], [ 103.874938, 37.604117 ], [ 103.841062, 37.64725 ], [ 103.683381, 37.777919 ], [ 103.627947, 37.797783 ], [ 103.40744, 37.860651 ], [ 103.362477, 38.037621 ], [ 103.368636, 38.08898 ], [ 103.53494, 38.156776 ], [ 103.507838, 38.280905 ], [ 103.465339, 38.353215 ], [ 103.416063, 38.404821 ], [ 103.85954, 38.64454 ], [ 104.011677, 38.85923 ], [ 104.044322, 38.895105 ], [ 104.173053, 38.94446 ], [ 104.196459, 38.9882 ], [ 104.190915, 39.042139 ], [ 104.207546, 39.083495 ], [ 104.171205, 39.160567 ], [ 104.047401, 39.297788 ], [ 104.073271, 39.351953 ], [ 104.089901, 39.419947 ], [ 103.955626, 39.456923 ], [ 103.85338, 39.461543 ], [ 103.728961, 39.430117 ], [ 103.595302, 39.386652 ], [ 103.428998, 39.353341 ], [ 103.344615, 39.331588 ], [ 103.259615, 39.263971 ], [ 103.188166, 39.215302 ], [ 103.133347, 39.192579 ], [ 103.007696, 39.099753 ], [ 102.883892, 39.120649 ], [ 102.616574, 39.171703 ], [ 102.579002, 39.183301 ], [ 102.45335, 39.255167 ], [ 102.3548, 39.231993 ], [ 102.276576, 39.188868 ], [ 102.050526, 39.141075 ], [ 102.012338, 39.127149 ], [ 101.902701, 39.111827 ], [ 101.833715, 39.08907 ], [ 101.926106, 39.000758 ], [ 101.955055, 38.985874 ], [ 102.045599, 38.904885 ], [ 102.075164, 38.891378 ], [ 101.941505, 38.808883 ], [ 101.873751, 38.733761 ], [ 101.777049, 38.66043 ], [ 101.672955, 38.6908 ], [ 101.601506, 38.65529 ], [ 101.562702, 38.713218 ], [ 101.412413, 38.764099 ], [ 101.331109, 38.777164 ], [ 101.307087, 38.80282 ], [ 101.34158, 38.822406 ], [ 101.33542, 38.847113 ], [ 101.24303, 38.860628 ], [ 101.237486, 38.907214 ], [ 101.198682, 38.943064 ], [ 101.228863, 39.020754 ], [ 101.117378, 38.975174 ], [ 100.969553, 38.946788 ], [ 100.961545, 39.005874 ], [ 100.901799, 39.030053 ], [ 100.875314, 39.002619 ], [ 100.835278, 39.025869 ], [ 100.829118, 39.075133 ], [ 100.864227, 39.106719 ], [ 100.842669, 39.199999 ], [ 100.842053, 39.405614 ], [ 100.707778, 39.404689 ], [ 100.606764, 39.387577 ], [ 100.498975, 39.400527 ], [ 100.500823, 39.481408 ], [ 100.44354, 39.485565 ], [ 100.326512, 39.509118 ], [ 100.301258, 39.572345 ], [ 100.314193, 39.606935 ], [ 100.250135, 39.685274 ], [ 100.128179, 39.702312 ], [ 100.040716, 39.757083 ], [ 99.958796, 39.769504 ], [ 99.904593, 39.785601 ], [ 99.822058, 39.860063 ], [ 99.672384, 39.888079 ], [ 99.469124, 39.875221 ], [ 99.440791, 39.885783 ], [ 99.459885, 39.898181 ], [ 99.491298, 39.884406 ], [ 99.533182, 39.891753 ], [ 99.714268, 39.972061 ], [ 99.751225, 40.006909 ], [ 99.841152, 40.013326 ], [ 99.927383, 40.063727 ], [ 99.955716, 40.150695 ], [ 100.007455, 40.20008 ], [ 100.169447, 40.277743 ], [ 100.169447, 40.541131 ], [ 100.242744, 40.618855 ], [ 100.237201, 40.716905 ], [ 100.224882, 40.727337 ], [ 100.107853, 40.875475 ], [ 100.057346, 40.908049 ], [ 99.985897, 40.909858 ], [ 99.673, 40.93292 ], [ 99.565827, 40.846961 ], [ 99.174705, 40.858278 ], [ 99.172858, 40.747289 ], [ 99.12543, 40.715091 ], [ 99.102025, 40.676522 ], [ 99.041662, 40.693767 ], [ 98.984996, 40.782644 ], [ 98.790975, 40.705564 ], [ 98.80699, 40.660181 ], [ 98.802678, 40.607043 ], [ 98.762642, 40.639748 ], [ 98.72199, 40.657911 ], [ 98.689345, 40.691952 ], [ 98.668403, 40.773128 ], [ 98.569853, 40.746836 ], [ 98.627751, 40.677884 ], [ 98.344419, 40.568413 ], [ 98.333332, 40.918903 ], [ 98.25018, 40.93925 ], [ 98.184891, 40.988056 ], [ 98.142391, 41.001607 ], [ 97.971776, 41.09774 ], [ 97.903407, 41.168057 ], [ 97.629314, 41.440498 ], [ 97.613915, 41.477276 ], [ 97.84674, 41.656379 ], [ 97.653335, 41.986856 ], [ 97.500582, 42.243894 ], [ 97.371235, 42.457076 ], [ 97.172903, 42.795257 ], [ 97.28254, 42.782081 ], [ 97.831958, 42.706047 ], [ 98.195362, 42.653251 ], [ 98.546447, 42.638284 ], [ 98.962822, 42.607018 ], [ 99.51224, 42.568244 ], [ 99.969267, 42.647969 ], [ 100.004376, 42.648849 ], [ 100.272309, 42.636523 ], [ 100.32528, 42.690213 ], [ 100.826655, 42.675255 ], [ 100.862995, 42.671295 ], [ 101.291689, 42.586312 ], [ 101.557775, 42.529887 ], [ 101.770274, 42.509597 ], [ 101.803534, 42.503861 ], [ 101.877447, 42.432345 ], [ 102.070236, 42.232374 ], [ 102.093642, 42.223512 ], [ 102.449039, 42.144133 ], [ 102.540814, 42.162323 ], [ 102.621502, 42.154338 ], [ 102.712045, 42.153007 ], [ 103.021862, 42.028212 ], [ 103.20726, 41.96283 ], [ 103.418527, 41.882233 ], [ 103.454868, 41.877332 ], [ 103.868779, 41.802427 ], [ 104.080046, 41.805104 ], [ 104.30856, 41.840782 ], [ 104.418813, 41.860397 ], [ 104.530298, 41.875104 ], [ 104.524138, 41.661745 ], [ 104.68921, 41.6452 ], [ 104.803775, 41.652355 ], [ 104.923267, 41.654143 ], [ 105.009498, 41.583007 ], [ 105.230621, 41.751103 ], [ 105.291599, 41.749763 ], [ 105.385221, 41.797073 ], [ 105.589713, 41.888471 ], [ 105.74185, 41.949033 ], [ 106.01348, 42.032213 ], [ 106.344855, 42.149457 ], [ 106.372572, 42.161436 ], [ 106.612789, 42.241679 ], [ 106.785867, 42.291281 ], [ 107.051337, 42.319166 ], [ 107.271844, 42.364285 ], [ 107.303872, 42.412465 ], [ 107.46648, 42.458842 ], [ 107.501589, 42.456635 ], [ 107.57427, 42.412907 ], [ 107.736262, 42.415116 ], [ 107.939522, 42.403628 ], [ 107.986949, 42.413349 ], [ 108.022058, 42.433229 ], [ 108.089195, 42.436321 ], [ 108.238252, 42.460167 ], [ 108.298614, 42.438529 ], [ 108.532671, 42.442945 ], [ 108.705134, 42.413349 ], [ 108.798757, 42.415116 ], [ 108.845569, 42.395673 ], [ 108.983539, 42.449128 ], [ 109.026039, 42.458401 ], [ 109.291509, 42.435879 ], [ 109.486761, 42.458842 ], [ 109.544044, 42.472528 ], [ 109.683862, 42.558988 ], [ 109.733753, 42.579262 ], [ 109.906216, 42.635643 ], [ 110.108244, 42.642687 ], [ 110.139657, 42.674815 ], [ 110.34846, 42.742098 ], [ 110.437156, 42.781203 ], [ 110.469801, 42.839156 ], [ 110.631177, 42.936061 ], [ 110.689691, 43.02144 ], [ 110.687227, 43.036314 ], [ 110.736502, 43.089657 ], [ 110.769763, 43.099272 ], [ 110.82027, 43.149067 ], [ 111.02045, 43.329998 ], [ 111.069725, 43.357852 ], [ 111.151029, 43.38004 ], [ 111.183674, 43.396132 ], [ 111.354289, 43.436125 ], [ 111.400485, 43.472618 ], [ 111.456535, 43.494329 ], [ 111.564325, 43.490422 ], [ 111.606209, 43.513863 ], [ 111.79407, 43.672068 ], [ 111.891388, 43.6738 ], [ 111.951135, 43.693275 ], [ 111.970845, 43.748205 ], [ 111.959758, 43.823382 ], [ 111.870447, 43.940279 ], [ 111.773128, 44.010479 ], [ 111.702295, 44.034147 ], [ 111.662875, 44.061247 ], [ 111.559397, 44.171238 ], [ 111.541535, 44.206855 ], [ 111.534144, 44.26217 ], [ 111.507042, 44.294305 ], [ 111.428818, 44.319573 ], [ 111.415883, 44.35724 ], [ 111.427586, 44.394455 ], [ 111.478709, 44.488884 ], [ 111.514434, 44.507666 ], [ 111.530448, 44.55033 ], [ 111.569868, 44.57634 ], [ 111.560629, 44.647062 ], [ 111.585267, 44.705789 ], [ 111.624687, 44.778477 ], [ 111.69244, 44.859983 ], [ 111.764505, 44.969325 ], [ 111.903707, 45.052252 ], [ 112.002874, 45.090713 ], [ 112.071243, 45.096206 ], [ 112.113743, 45.072965 ], [ 112.396459, 45.064512 ], [ 112.438959, 45.071697 ], [ 112.540589, 45.001072 ], [ 112.599719, 44.930783 ], [ 112.712436, 44.879494 ], [ 112.850406, 44.840466 ], [ 112.937869, 44.840042 ], [ 113.037652, 44.822641 ], [ 113.11526, 44.799714 ], [ 113.503918, 44.777628 ], [ 113.540874, 44.759358 ], [ 113.631417, 44.745333 ], [ 113.712105, 44.788247 ], [ 113.798953, 44.849377 ], [ 113.861778, 44.863377 ], [ 113.907358, 44.915104 ], [ 114.065038, 44.931206 ], [ 114.116777, 44.957045 ], [ 114.158045, 44.994301 ], [ 114.19069, 45.036607 ], [ 114.313262, 45.107189 ], [ 114.347139, 45.119436 ], [ 114.409348, 45.179371 ], [ 114.459855, 45.21353 ], [ 114.519602, 45.283893 ], [ 114.539928, 45.325985 ], [ 114.551014, 45.387383 ], [ 114.600906, 45.403773 ], [ 114.745035, 45.438217 ], [ 114.920578, 45.386122 ], [ 114.983404, 45.379397 ], [ 115.178041, 45.396209 ], [ 115.36467, 45.392427 ], [ 115.586408, 45.440317 ], [ 115.699741, 45.45963 ], [ 115.864197, 45.572853 ], [ 115.936878, 45.632727 ], [ 116.026805, 45.661177 ], [ 116.035428, 45.685013 ], [ 116.1155, 45.679577 ], [ 116.17463, 45.688775 ], [ 116.217746, 45.72221 ], [ 116.22329, 45.747273 ], [ 116.260862, 45.776082 ], [ 116.286731, 45.775247 ], [ 116.278108, 45.831152 ], [ 116.288579, 45.839074 ], [ 116.243, 45.876169 ], [ 116.271949, 45.966926 ], [ 116.414231, 46.133896 ], [ 116.439484, 46.137628 ], [ 116.536187, 46.23251 ], [ 116.573143, 46.258998 ], [ 116.585462, 46.292504 ], [ 116.673541, 46.325163 ], [ 116.745606, 46.327642 ], [ 116.81336, 46.355737 ], [ 116.834302, 46.384229 ], [ 116.876801, 46.375559 ], [ 117.097308, 46.356976 ], [ 117.247597, 46.366888 ], [ 117.372017, 46.36028 ], [ 117.383719, 46.394962 ], [ 117.375712, 46.416421 ], [ 117.392343, 46.463023 ], [ 117.447777, 46.528117 ], [ 117.42006, 46.582029 ], [ 117.49582, 46.600535 ], [ 117.596218, 46.603414 ], [ 117.622704, 46.596012 ], [ 117.641182, 46.558166 ], [ 117.704008, 46.516587 ], [ 117.748355, 46.521941 ], [ 117.769913, 46.537586 ], [ 117.813645, 46.530588 ], [ 117.870927, 46.549935 ], [ 117.868464, 46.575447 ], [ 117.914659, 46.607936 ], [ 117.982412, 46.614925 ], [ 117.992883, 46.631366 ], [ 118.04647, 46.631366 ], [ 118.124078, 46.678195 ], [ 118.192448, 46.682711 ], [ 118.238643, 46.709392 ], [ 118.274984, 46.715957 ], [ 118.316252, 46.73934 ], [ 118.41049, 46.728265 ], [ 118.446831, 46.704467 ], [ 118.586033, 46.692975 ], [ 118.639004, 46.721291 ], [ 118.677192, 46.6979 ], [ 118.788061, 46.687227 ], [ 118.788061, 46.717598 ], [ 118.845343, 46.771731 ], [ 118.914329, 46.77501 ], [ 118.912481, 46.733188 ], [ 118.951285, 46.722111 ], [ 119.011647, 46.745902 ], [ 119.073857, 46.676552 ], [ 119.123132, 46.642872 ], [ 119.152081, 46.658072 ], [ 119.20074, 46.648213 ], [ 119.26295, 46.649034 ], [ 119.325776, 46.608759 ], [ 119.357805, 46.619447 ], [ 119.374435, 46.603414 ], [ 119.431718, 46.638763 ], [ 119.491464, 46.629311 ], [ 119.557985, 46.633832 ], [ 119.598637, 46.618214 ], [ 119.656535, 46.625612 ], [ 119.682405, 46.605058 ], [ 119.677477, 46.584908 ], [ 119.739687, 46.615336 ], [ 119.783419, 46.626023 ], [ 119.8136, 46.66834 ], [ 119.804361, 46.68189 ], [ 119.859179, 46.669572 ], [ 119.911534, 46.669572 ], [ 119.93494, 46.712674 ], [ 119.917078, 46.758203 ], [ 119.936172, 46.790173 ], [ 119.920157, 46.853238 ], [ 119.926933, 46.903963 ], [ 119.859795, 46.917046 ], [ 119.845013, 46.964852 ], [ 119.795122, 47.013024 ], [ 119.79081, 47.04525 ], [ 119.806825, 47.055037 ], [ 119.763093, 47.13082 ], [ 119.716282, 47.195518 ], [ 119.627586, 47.247544 ], [ 119.56784, 47.248357 ], [ 119.559217, 47.303172 ], [ 119.450812, 47.353065 ], [ 119.437877, 47.378602 ], [ 119.386138, 47.397645 ], [ 119.365812, 47.423161 ], [ 119.32208, 47.42721 ], [ 119.365812, 47.47739 ], [ 119.205052, 47.520249 ], [ 119.152081, 47.540453 ], [ 119.134219, 47.664335 ], [ 118.773278, 47.771034 ], [ 118.568171, 47.992187 ], [ 118.441903, 47.995791 ], [ 118.422193, 48.01461 ], [ 118.37415, 48.016612 ], [ 118.351976, 48.006203 ], [ 118.284839, 48.011007 ], [ 118.238027, 48.031422 ], [ 118.238643, 48.041826 ], [ 118.150564, 48.036224 ], [ 118.124694, 48.047427 ], [ 118.107448, 48.031021 ], [ 118.052014, 48.01421 ], [ 117.96147, 48.011007 ], [ 117.886942, 48.025418 ], [ 117.813645, 48.016212 ], [ 117.529081, 47.782697 ], [ 117.519226, 47.761782 ], [ 117.493357, 47.758563 ], [ 117.384335, 47.641356 ], [ 117.094844, 47.8241 ], [ 116.879265, 47.893968 ], [ 116.791186, 47.89758 ], [ 116.669846, 47.890758 ], [ 116.453035, 47.837358 ], [ 116.26579, 47.876711 ], [ 116.130283, 47.823296 ], [ 116.111189, 47.811642 ], [ 115.968291, 47.689721 ], [ 115.939342, 47.683275 ], [ 115.580249, 47.921649 ], [ 115.539597, 48.104607 ], [ 115.545141, 48.134971 ], [ 115.529126, 48.155336 ], [ 115.81061, 48.257042 ], [ 115.822929, 48.259432 ], [ 115.799523, 48.514982 ], [ 115.83032, 48.560156 ], [ 116.069305, 48.811437 ], [ 116.077928, 48.822471 ], [ 116.048363, 48.873274 ], [ 116.428397, 49.430659 ], [ 116.717889, 49.847288 ], [ 116.736367, 49.847674 ], [ 117.068974, 49.695389 ], [ 117.278394, 49.636512 ], [ 117.485349, 49.633024 ], [ 117.638102, 49.574847 ], [ 117.809333, 49.521263 ], [ 117.849369, 49.551557 ], [ 117.866, 49.591532 ], [ 117.950999, 49.596187 ], [ 117.995963, 49.623332 ], [ 118.011362, 49.614803 ], [ 118.082811, 49.616741 ], [ 118.129622, 49.669446 ], [ 118.156723, 49.660149 ], [ 118.211542, 49.690744 ], [ 118.220781, 49.729831 ], [ 118.284223, 49.743755 ], [ 118.315636, 49.766953 ], [ 118.384005, 49.783958 ], [ 118.398787, 49.802502 ], [ 118.385853, 49.827217 ], [ 118.443751, 49.835709 ], [ 118.483787, 49.830691 ], [ 118.485019, 49.866194 ], [ 118.531214, 49.887791 ], [ 118.574946, 49.931342 ], [ 118.605127, 49.926719 ], [ 118.672264, 49.955991 ], [ 118.739402, 49.946364 ], [ 118.761576, 49.959456 ], [ 118.791757, 49.955606 ], [ 118.964836, 49.988708 ], [ 118.982082, 49.979087 ], [ 119.090487, 49.985629 ], [ 119.12498, 50.019095 ], [ 119.163168, 50.027554 ], [ 119.193965, 50.069826 ], [ 119.190269, 50.087877 ], [ 119.236465, 50.075204 ], [ 119.290052, 50.121655 ], [ 119.309762, 50.161161 ], [ 119.350414, 50.166145 ], [ 119.339327, 50.192206 ], [ 119.358421, 50.197953 ], [ 119.319001, 50.220933 ], [ 119.339943, 50.244668 ], [ 119.35103, 50.303953 ], [ 119.381827, 50.324208 ], [ 119.358421, 50.358965 ], [ 119.322696, 50.352474 ], [ 119.277117, 50.366218 ], [ 119.259871, 50.345218 ], [ 119.232153, 50.365455 ], [ 119.188422, 50.347509 ], [ 119.155777, 50.364691 ], [ 119.176719, 50.378814 ], [ 119.125596, 50.389118 ], [ 119.165016, 50.422683 ], [ 119.217371, 50.414675 ], [ 119.22353, 50.441363 ], [ 119.250631, 50.448604 ], [ 119.262334, 50.490124 ], [ 119.264182, 50.536933 ], [ 119.295595, 50.573814 ], [ 119.281428, 50.601551 ], [ 119.298059, 50.616743 ], [ 119.361501, 50.632689 ], [ 119.394145, 50.667219 ], [ 119.385522, 50.682769 ], [ 119.430486, 50.684286 ], [ 119.450196, 50.695281 ], [ 119.506862, 50.763846 ], [ 119.496391, 50.771795 ], [ 119.515485, 50.814165 ], [ 119.498855, 50.827776 ], [ 119.491464, 50.87878 ], [ 119.569688, 50.933879 ], [ 119.598637, 50.984767 ], [ 119.630666, 51.00925 ], [ 119.678093, 51.016404 ], [ 119.726753, 51.051028 ], [ 119.719361, 51.075099 ], [ 119.764325, 51.092017 ], [ 119.752622, 51.117193 ], [ 119.771716, 51.124331 ], [ 119.788346, 51.174636 ], [ 119.760629, 51.212516 ], [ 119.784035, 51.22601 ], [ 119.821607, 51.21439 ], [ 119.797586, 51.243622 ], [ 119.828383, 51.263099 ], [ 119.811136, 51.281071 ], [ 119.885049, 51.302777 ], [ 119.883817, 51.336813 ], [ 119.946643, 51.360736 ], [ 119.914614, 51.374187 ], [ 119.910918, 51.390994 ], [ 119.97128, 51.40033 ], [ 119.982983, 51.445112 ], [ 120.002693, 51.459283 ], [ 119.982367, 51.482396 ], [ 119.985447, 51.505125 ], [ 120.017476, 51.52114 ], [ 120.052584, 51.560967 ], [ 120.035954, 51.583657 ], [ 120.05936, 51.634203 ], [ 120.100628, 51.649058 ], [ 120.087077, 51.678013 ], [ 120.172693, 51.679868 ], [ 120.226279, 51.717703 ], [ 120.294649, 51.752171 ], [ 120.317438, 51.785873 ], [ 120.363634, 51.789945 ], [ 120.40675, 51.81659 ], [ 120.40059, 51.833605 ], [ 120.480046, 51.855049 ], [ 120.481278, 51.885719 ], [ 120.549032, 51.882394 ], [ 120.548416, 51.907877 ], [ 120.656821, 51.926333 ], [ 120.66298, 51.958061 ], [ 120.704864, 51.983501 ], [ 120.717799, 52.015556 ], [ 120.691929, 52.026973 ], [ 120.690698, 52.047221 ], [ 120.717183, 52.072978 ], [ 120.753523, 52.085483 ], [ 120.76769, 52.10938 ], [ 120.760299, 52.136937 ], [ 120.786784, 52.15787 ], [ 120.745516, 52.20594 ], [ 120.755371, 52.258355 ], [ 120.715951, 52.261286 ], [ 120.695625, 52.290214 ], [ 120.653741, 52.302658 ], [ 120.627256, 52.323878 ], [ 120.62356, 52.361172 ], [ 120.653741, 52.371038 ], [ 120.64943, 52.3904 ], [ 120.688234, 52.427637 ], [ 120.68269, 52.464479 ], [ 120.706712, 52.492909 ], [ 120.687002, 52.511489 ], [ 120.734429, 52.536977 ], [ 120.690698, 52.547532 ], [ 120.658669, 52.56718 ], [ 120.62664, 52.570818 ], [ 120.605082, 52.589364 ], [ 120.56135, 52.595544 ], [ 120.483742, 52.630066 ], [ 120.462184, 52.64532 ], [ 120.396895, 52.616261 ], [ 120.289721, 52.623527 ], [ 120.194866, 52.578819 ], [ 120.125265, 52.586819 ], [ 120.07599, 52.586092 ], [ 120.049505, 52.598453 ], [ 120.035338, 52.646409 ], [ 120.071063, 52.70628 ], [ 120.031642, 52.773674 ], [ 120.101244, 52.788877 ], [ 120.14128, 52.813119 ], [ 120.181316, 52.806969 ], [ 120.222584, 52.84277 ], [ 120.297112, 52.869872 ], [ 120.295265, 52.891542 ], [ 120.350699, 52.906343 ], [ 120.363018, 52.94134 ], [ 120.411061, 52.957927 ], [ 120.452945, 53.01017 ], [ 120.529321, 53.045803 ], [ 120.562582, 53.082845 ], [ 120.643886, 53.106923 ], [ 120.659901, 53.137091 ], [ 120.687002, 53.142476 ], [ 120.690698, 53.174771 ], [ 120.736277, 53.204892 ], [ 120.821893, 53.241797 ], [ 120.838523, 53.239648 ], [ 120.820661, 53.269007 ], [ 120.867472, 53.278669 ], [ 120.882871, 53.294411 ], [ 120.936457, 53.28833 ], [ 120.950624, 53.29763 ], [ 121.055334, 53.29155 ], [ 121.098449, 53.306929 ], [ 121.129246, 53.277238 ], [ 121.155732, 53.285468 ], [ 121.227797, 53.280459 ], [ 121.308485, 53.301565 ], [ 121.336818, 53.325877 ], [ 121.416274, 53.319443 ], [ 121.499426, 53.337314 ], [ 121.504969, 53.323018 ], [ 121.575802, 53.29155 ], [ 121.615222, 53.258984 ], [ 121.642324, 53.262564 ], [ 121.679896, 53.240722 ], [ 121.67928, 53.199515 ], [ 121.660186, 53.195213 ], [ 121.665114, 53.170467 ], [ 121.722396, 53.145706 ], [ 121.753193, 53.147501 ], [ 121.784606, 53.104408 ], [ 121.775367, 53.089674 ], [ 121.817867, 53.061631 ], [ 121.785838, 53.018451 ], [ 121.715621, 52.997926 ], [ 121.677432, 52.948192 ], [ 121.66265, 52.912478 ], [ 121.610295, 52.892264 ], [ 121.604136, 52.872401 ], [ 121.620766, 52.853251 ], [ 121.591201, 52.824693 ], [ 121.537614, 52.801542 ], [ 121.511129, 52.779104 ], [ 121.476636, 52.772225 ], [ 121.455078, 52.73528 ], [ 121.373158, 52.683067 ], [ 121.309717, 52.676173 ], [ 121.29247, 52.651855 ], [ 121.237036, 52.619167 ], [ 121.182217, 52.59918 ], [ 121.225333, 52.577364 ], [ 121.280151, 52.586819 ], [ 121.323883, 52.573727 ], [ 121.353448, 52.534793 ], [ 121.411963, 52.52205 ], [ 121.416274, 52.499468 ], [ 121.474172, 52.482706 ], [ 121.495114, 52.484892 ], [ 121.519136, 52.456821 ], [ 121.565331, 52.460468 ], [ 121.590585, 52.443326 ], [ 121.63986, 52.44442 ], [ 121.678664, 52.419973 ], [ 121.658338, 52.3904 ], [ 121.715621, 52.342894 ], [ 121.714389, 52.318025 ], [ 121.769207, 52.308147 ], [ 121.841272, 52.282526 ], [ 121.901018, 52.280695 ], [ 121.94783, 52.298266 ], [ 121.976779, 52.343626 ], [ 122.035909, 52.377615 ], [ 122.040837, 52.413038 ], [ 122.091344, 52.427272 ], [ 122.080873, 52.440407 ], [ 122.107358, 52.452445 ], [ 122.142467, 52.495096 ], [ 122.140003, 52.510032 ], [ 122.168952, 52.513674 ], [ 122.178191, 52.48963 ], [ 122.207756, 52.469218 ], [ 122.310618, 52.475416 ], [ 122.326016, 52.459374 ], [ 122.342031, 52.414133 ], [ 122.367284, 52.413768 ], [ 122.378987, 52.395512 ], [ 122.419023, 52.375057 ], [ 122.447356, 52.394052 ], [ 122.484313, 52.341432 ], [ 122.478153, 52.29607 ], [ 122.560689, 52.282526 ], [ 122.585943, 52.266413 ], [ 122.67895, 52.276667 ], [ 122.710979, 52.256157 ], [ 122.76087, 52.26678 ], [ 122.787355, 52.252494 ], [ 122.766413, 52.232705 ], [ 122.769493, 52.179893 ], [ 122.73808, 52.153464 ], [ 122.690653, 52.140243 ], [ 122.629059, 52.13657 ], [ 122.643841, 52.111585 ], [ 122.625363, 52.067459 ], [ 122.650616, 52.058997 ], [ 122.664783, 51.99861 ], [ 122.683877, 51.974654 ], [ 122.726377, 51.978709 ], [ 122.729457, 51.919321 ], [ 122.706051, 51.890151 ], [ 122.725761, 51.87833 ], [ 122.732536, 51.832495 ], [ 122.771957, 51.779579 ], [ 122.749167, 51.746613 ], [ 122.778732, 51.698048 ], [ 122.816304, 51.655371 ], [ 122.820616, 51.633088 ], [ 122.85634, 51.606707 ], [ 122.832935, 51.581797 ], [ 122.874202, 51.561339 ], [ 122.880362, 51.537894 ], [ 122.858804, 51.524864 ], [ 122.880362, 51.511085 ], [ 122.854492, 51.477551 ], [ 122.871123, 51.455181 ], [ 122.900072, 51.445112 ], [ 122.903768, 51.415262 ], [ 122.946267, 51.405183 ], [ 122.965977, 51.386886 ], [ 122.965977, 51.345786 ], [ 123.002934, 51.31213 ], [ 123.069455, 51.321108 ], [ 123.127969, 51.297913 ], [ 123.231447, 51.279199 ], [ 123.231447, 51.268716 ], [ 123.294273, 51.254111 ], [ 123.339853, 51.27246 ], [ 123.376809, 51.266844 ], [ 123.414381, 51.278825 ], [ 123.440251, 51.270963 ], [ 123.46304, 51.286686 ], [ 123.582533, 51.294545 ], [ 123.582533, 51.306893 ], [ 123.661989, 51.319237 ], [ 123.660141, 51.342795 ], [ 123.711264, 51.398089 ], [ 123.794416, 51.361109 ], [ 123.842459, 51.367462 ], [ 123.887423, 51.320734 ], [ 123.926227, 51.300532 ], [ 123.939777, 51.313253 ], [ 123.994596, 51.322604 ], [ 124.071588, 51.320734 ], [ 124.090067, 51.3413 ], [ 124.128255, 51.347281 ], [ 124.192313, 51.33943 ], [ 124.239124, 51.344664 ], [ 124.271769, 51.308389 ], [ 124.297638, 51.298661 ], [ 124.339522, 51.293422 ], [ 124.406659, 51.272086 ], [ 124.430065, 51.301281 ], [ 124.426985, 51.331953 ], [ 124.443616, 51.35812 ], [ 124.478108, 51.36223 ], [ 124.490427, 51.380537 ], [ 124.555717, 51.375307 ], [ 124.58713, 51.363725 ], [ 124.62655, 51.327465 ], [ 124.693687, 51.3327 ], [ 124.752817, 51.35812 ], [ 124.76452, 51.38726 ], [ 124.783614, 51.392115 ], [ 124.864302, 51.37979 ], [ 124.885244, 51.40817 ], [ 124.942527, 51.447349 ], [ 124.917889, 51.474196 ], [ 124.928976, 51.498419 ], [ 124.983795, 51.508478 ], [ 125.004737, 51.529332 ], [ 125.047236, 51.529704 ], [ 125.073106, 51.553526 ], [ 125.060171, 51.59667 ], [ 125.098975, 51.658341 ], [ 125.12854, 51.659083 ], [ 125.130388, 51.635317 ], [ 125.175968, 51.639403 ], [ 125.214772, 51.627888 ], [ 125.228938, 51.640517 ], [ 125.289301, 51.633831 ], [ 125.316402, 51.610052 ], [ 125.35151, 51.623801 ], [ 125.38046, 51.585516 ], [ 125.424807, 51.562827 ], [ 125.528285, 51.488359 ], [ 125.559082, 51.461521 ], [ 125.595422, 51.416755 ], [ 125.60035, 51.413396 ], [ 125.600966, 51.410409 ], [ 125.62314, 51.398089 ], [ 125.623756, 51.387633 ], [ 125.626219, 51.380163 ], [ 125.700132, 51.327465 ], [ 125.740784, 51.27583 ], [ 125.76111, 51.261976 ], [ 125.761726, 51.226385 ], [ 125.819008, 51.227134 ], [ 125.850421, 51.21364 ], [ 125.864588, 51.146487 ], [ 125.909551, 51.138977 ], [ 125.946508, 51.108176 ], [ 125.970529, 51.123955 ], [ 125.993935, 51.119072 ], [ 125.976073, 51.084498 ], [ 126.059225, 51.043503 ], [ 126.033971, 51.011132 ], [ 126.041978, 50.981753 ], [ 126.068464, 50.967434 ], [ 126.042594, 50.92558 ], [ 126.02042, 50.927466 ], [ 125.996399, 50.906715 ], [ 125.997631, 50.872738 ], [ 125.961906, 50.901054 ], [ 125.939732, 50.85423 ], [ 125.913247, 50.825885 ], [ 125.878138, 50.816812 ], [ 125.890457, 50.805845 ], [ 125.836255, 50.793363 ], [ 125.846726, 50.769524 ], [ 125.828863, 50.756654 ], [ 125.804226, 50.773309 ], [ 125.758646, 50.746809 ], [ 125.795603, 50.738856 ], [ 125.78082, 50.725598 ], [ 125.825784, 50.70362 ], [ 125.789443, 50.679735 ], [ 125.804226, 50.658874 ], [ 125.793139, 50.643316 ], [ 125.814697, 50.62092 ], [ 125.807921, 50.60383 ], [ 125.829479, 50.56165 ], [ 125.794987, 50.532748 ], [ 125.770349, 50.531227 ], [ 125.754335, 50.506874 ], [ 125.740784, 50.523237 ], [ 125.699516, 50.487078 ], [ 125.654553, 50.471082 ], [ 125.627451, 50.443268 ], [ 125.580024, 50.449366 ], [ 125.562162, 50.438314 ], [ 125.583104, 50.409717 ], [ 125.567089, 50.402852 ], [ 125.536292, 50.420014 ], [ 125.522126, 50.404759 ], [ 125.546763, 50.358965 ], [ 125.520278, 50.3498 ], [ 125.530749, 50.331085 ], [ 125.463611, 50.295925 ], [ 125.466075, 50.266861 ], [ 125.442053, 50.260357 ], [ 125.448829, 50.216338 ], [ 125.417416, 50.195654 ], [ 125.39093, 50.199868 ], [ 125.382923, 50.172278 ], [ 125.335496, 50.161161 ], [ 125.376148, 50.137385 ], [ 125.311474, 50.140453 ], [ 125.27883, 50.127411 ], [ 125.258504, 50.103618 ], [ 125.287453, 50.093636 ], [ 125.283757, 50.070211 ], [ 125.328105, 50.065985 ], [ 125.315786, 50.04562 ], [ 125.289916, 50.057917 ], [ 125.25296, 50.041393 ], [ 125.283757, 50.036012 ], [ 125.297924, 50.014481 ], [ 125.278214, 49.996402 ], [ 125.241873, 49.987938 ], [ 125.231402, 49.957531 ], [ 125.190134, 49.959841 ], [ 125.199373, 49.935194 ], [ 125.225859, 49.922481 ], [ 125.212924, 49.907452 ], [ 125.245569, 49.87198 ], [ 125.225243, 49.867351 ], [ 125.239409, 49.844587 ], [ 125.177815, 49.829533 ], [ 125.222779, 49.799026 ], [ 125.221547, 49.754969 ], [ 125.204301, 49.734086 ], [ 125.225243, 49.726349 ], [ 125.219699, 49.669058 ], [ 125.185207, 49.634574 ], [ 125.189518, 49.652401 ], [ 125.164881, 49.669446 ], [ 125.132236, 49.672157 ], [ 125.127308, 49.655113 ], [ 125.15441, 49.616741 ], [ 125.16796, 49.629923 ], [ 125.205533, 49.593859 ], [ 125.23017, 49.595411 ], [ 125.233866, 49.536801 ], [ 125.211076, 49.539908 ], [ 125.228323, 49.487063 ], [ 125.270822, 49.454395 ], [ 125.256656, 49.437275 ], [ 125.25604, 49.395227 ], [ 125.277598, 49.379644 ], [ 125.256656, 49.359769 ], [ 125.261583, 49.322336 ], [ 125.214772, 49.277066 ], [ 125.233866, 49.255587 ], [ 125.219699, 49.189139 ], [ 125.187671, 49.186792 ], [ 125.158721, 49.144921 ], [ 125.117453, 49.126127 ], [ 125.034302, 49.157056 ], [ 125.039845, 49.17623 ], [ 124.983179, 49.162535 ], [ 124.906802, 49.184054 ], [ 124.860607, 49.166448 ], [ 124.847672, 49.129651 ], [ 124.809484, 49.115943 ], [ 124.828578, 49.077933 ], [ 124.808252, 49.020666 ], [ 124.756513, 48.967262 ], [ 124.744194, 48.920487 ], [ 124.709086, 48.920487 ], [ 124.715861, 48.885475 ], [ 124.697383, 48.841775 ], [ 124.654267, 48.83429 ], [ 124.644412, 48.80789 ], [ 124.656115, 48.783842 ], [ 124.612383, 48.747945 ], [ 124.624702, 48.701755 ], [ 124.601912, 48.632587 ], [ 124.579122, 48.596582 ], [ 124.520608, 48.556195 ], [ 124.548941, 48.535593 ], [ 124.533543, 48.515379 ], [ 124.555717, 48.467784 ], [ 124.507674, 48.445558 ], [ 124.52492, 48.426897 ], [ 124.51876, 48.378027 ], [ 124.547094, 48.35775 ], [ 124.540934, 48.335476 ], [ 124.579738, 48.297269 ], [ 124.558796, 48.268197 ], [ 124.579122, 48.262221 ], [ 124.547094, 48.200829 ], [ 124.512601, 48.164518 ], [ 124.529847, 48.146951 ], [ 124.505826, 48.124985 ], [ 124.478108, 48.123387 ], [ 124.46579, 48.098213 ], [ 124.415899, 48.08782 ], [ 124.430065, 48.12099 ], [ 124.471333, 48.133373 ], [ 124.467637, 48.178886 ], [ 124.418978, 48.181679 ], [ 124.412819, 48.219175 ], [ 124.422058, 48.245884 ], [ 124.365392, 48.283731 ], [ 124.353689, 48.315978 ], [ 124.317964, 48.35099 ], [ 124.331515, 48.380015 ], [ 124.309957, 48.413393 ], [ 124.330283, 48.435633 ], [ 124.302566, 48.456673 ], [ 124.314269, 48.503881 ], [ 124.25945, 48.536385 ], [ 124.136878, 48.463023 ], [ 124.07898, 48.43603 ], [ 124.019234, 48.39313 ], [ 123.862785, 48.271782 ], [ 123.746373, 48.197638 ], [ 123.705105, 48.152142 ], [ 123.579453, 48.045427 ], [ 123.537569, 48.021816 ], [ 123.300432, 47.953723 ], [ 123.256085, 47.876711 ], [ 123.214201, 47.824502 ], [ 123.161846, 47.781892 ], [ 123.041122, 47.746492 ], [ 122.926557, 47.697777 ], [ 122.848949, 47.67441 ], [ 122.765181, 47.614333 ], [ 122.59395, 47.54732 ], [ 122.543443, 47.495589 ], [ 122.507103, 47.401291 ], [ 122.418407, 47.350632 ], [ 122.441197, 47.310476 ], [ 122.462755, 47.27841 ], [ 122.498479, 47.255262 ], [ 122.531124, 47.198771 ], [ 122.582863, 47.158092 ], [ 122.615508, 47.124306 ], [ 122.679566, 47.094164 ], [ 122.710363, 47.093349 ], [ 122.821232, 47.065636 ], [ 122.852645, 47.072158 ], [ 122.845869, 47.046881 ], [ 122.778116, 47.002822 ], [ 122.77442, 46.973837 ], [ 122.798442, 46.9575 ], [ 122.791051, 46.941567 ], [ 122.83971, 46.937072 ], [ 122.895144, 46.960359 ], [ 122.893913, 46.895376 ], [ 122.906847, 46.80738 ], [ 122.996774, 46.761483 ], [ 123.00355, 46.730726 ], [ 123.026339, 46.718829 ], [ 123.076846, 46.745082 ], [ 123.103332, 46.734828 ], [ 123.163694, 46.74016 ], [ 123.198802, 46.803283 ], [ 123.22344, 46.821305 ], [ 123.221592, 46.850373 ], [ 123.295505, 46.865105 ], [ 123.341084, 46.826628 ], [ 123.374345, 46.837683 ], [ 123.40699, 46.906416 ], [ 123.404526, 46.935438 ], [ 123.360179, 46.970978 ], [ 123.304128, 46.964852 ], [ 123.301664, 46.999965 ], [ 123.337389, 46.988943 ], [ 123.42362, 46.934212 ], [ 123.487678, 46.959951 ], [ 123.52833, 46.944836 ], [ 123.483366, 46.84587 ], [ 123.506772, 46.827038 ], [ 123.562823, 46.82581 ], [ 123.575757, 46.845461 ], [ 123.576989, 46.891286 ], [ 123.605322, 46.891286 ], [ 123.599163, 46.868378 ], [ 123.625648, 46.847508 ], [ 123.580069, 46.827447 ], [ 123.629344, 46.813524 ], [ 123.631808, 46.728675 ], [ 123.603475, 46.68928 ], [ 123.474743, 46.686817 ], [ 123.366338, 46.677784 ], [ 123.318295, 46.662179 ], [ 123.276411, 46.660947 ], [ 123.279491, 46.616981 ], [ 123.228368, 46.588198 ], [ 123.18094, 46.614103 ], [ 123.098404, 46.603002 ], [ 123.077462, 46.622324 ], [ 123.04605, 46.617803 ], [ 123.052825, 46.579972 ], [ 123.002318, 46.574624 ], [ 123.010325, 46.524823 ], [ 123.011557, 46.434984 ], [ 123.089781, 46.347888 ], [ 123.142136, 46.298293 ], [ 123.178476, 46.248239 ], [ 123.128585, 46.210565 ], [ 123.127354, 46.174523 ], [ 123.102716, 46.172037 ], [ 123.112571, 46.130163 ], [ 123.070071, 46.123527 ], [ 123.04605, 46.099878 ], [ 122.792898, 46.073313 ], [ 122.828623, 45.912406 ], [ 122.80029, 45.856583 ], [ 122.772572, 45.856583 ], [ 122.752246, 45.834905 ], [ 122.792283, 45.766063 ], [ 122.751015, 45.735996 ], [ 122.741775, 45.705077 ], [ 122.671558, 45.70048 ], [ 122.650001, 45.731401 ], [ 122.640761, 45.771072 ], [ 122.603189, 45.778169 ], [ 122.556378, 45.82156 ], [ 122.522501, 45.786933 ], [ 122.504639, 45.786933 ], [ 122.496016, 45.85825 ], [ 122.446125, 45.916986 ], [ 122.362357, 45.917403 ], [ 122.372828, 45.856166 ], [ 122.337719, 45.859917 ], [ 122.301379, 45.813218 ], [ 122.253952, 45.7982 ], [ 122.236705, 45.831569 ], [ 122.200981, 45.857 ], [ 122.091344, 45.882002 ], [ 122.085184, 45.912406 ], [ 122.040221, 45.959022 ], [ 121.92812, 45.988552 ], [ 121.923808, 46.004767 ], [ 121.864062, 46.002272 ], [ 121.843736, 46.024301 ], [ 121.819098, 46.023054 ], [ 121.761816, 45.998947 ], [ 121.809243, 45.961102 ], [ 121.821562, 45.918235 ], [ 121.805548, 45.900746 ], [ 121.817251, 45.875336 ], [ 121.769823, 45.84366 ], [ 121.766744, 45.830318 ], [ 121.754425, 45.794862 ], [ 121.697142, 45.76314 ], [ 121.657106, 45.770238 ], [ 121.644172, 45.752284 ], [ 121.666345, 45.727641 ], [ 121.713773, 45.701734 ], [ 121.811091, 45.687103 ], [ 121.812323, 45.704659 ], [ 121.867142, 45.719703 ], [ 121.934279, 45.71051 ], [ 121.970004, 45.692956 ], [ 122.003264, 45.623102 ], [ 121.995873, 45.59882 ], [ 121.966308, 45.596308 ], [ 121.993409, 45.552741 ], [ 122.002648, 45.507882 ], [ 122.064242, 45.472641 ], [ 122.168336, 45.439897 ], [ 122.180039, 45.409655 ], [ 122.146778, 45.374352 ], [ 122.147394, 45.295682 ], [ 122.239169, 45.276313 ], [ 122.22993, 45.206784 ], [ 122.192358, 45.180636 ], [ 122.143082, 45.183167 ], [ 122.109822, 45.142236 ], [ 122.119677, 45.068739 ], [ 122.098735, 45.02138 ], [ 122.074713, 45.006573 ], [ 122.087032, 44.95281 ], [ 122.079025, 44.914256 ], [ 122.04946, 44.912985 ], [ 122.098119, 44.81882 ], [ 122.099967, 44.7823 ], [ 122.168952, 44.770405 ], [ 122.142467, 44.753833 ], [ 122.110438, 44.767856 ], [ 122.10243, 44.736406 ], [ 122.152322, 44.744057 ], [ 122.161561, 44.728328 ], [ 122.117213, 44.701961 ], [ 122.103046, 44.67388 ], [ 122.113517, 44.615546 ], [ 122.13138, 44.577619 ], [ 122.196053, 44.559712 ], [ 122.224386, 44.526016 ], [ 122.228082, 44.480345 ], [ 122.28598, 44.477783 ], [ 122.294604, 44.41113 ], [ 122.291524, 44.310152 ], [ 122.271198, 44.255741 ], [ 122.319241, 44.233018 ], [ 122.483081, 44.236877 ], [ 122.515726, 44.251025 ], [ 122.641993, 44.283595 ], [ 122.675254, 44.285738 ], [ 122.702971, 44.319145 ], [ 122.76087, 44.369648 ], [ 122.85634, 44.398304 ], [ 123.025108, 44.493153 ], [ 123.06576, 44.505959 ], [ 123.12489, 44.5098 ], [ 123.137209, 44.486322 ], [ 123.125506, 44.455147 ], [ 123.142136, 44.428228 ], [ 123.114419, 44.40258 ], [ 123.128585, 44.367081 ], [ 123.196955, 44.34483 ], [ 123.277027, 44.25274 ], [ 123.286882, 44.211574 ], [ 123.323838, 44.179823 ], [ 123.386664, 44.161794 ], [ 123.362642, 44.133452 ], [ 123.350939, 44.092633 ], [ 123.32815, 44.084035 ], [ 123.331229, 44.028984 ], [ 123.365722, 44.013922 ], [ 123.400831, 43.979481 ], [ 123.37065, 43.970006 ], [ 123.397135, 43.954929 ], [ 123.467968, 43.853599 ], [ 123.461809, 43.822518 ], [ 123.498149, 43.771114 ], [ 123.48275, 43.737396 ], [ 123.520323, 43.708419 ], [ 123.518475, 43.682024 ], [ 123.536953, 43.633964 ], [ 123.510468, 43.624867 ], [ 123.5117, 43.592801 ], [ 123.421157, 43.598435 ], [ 123.434091, 43.575461 ], [ 123.461193, 43.568523 ], [ 123.452569, 43.545971 ], [ 123.360179, 43.567223 ], [ 123.304744, 43.550742 ], [ 123.329998, 43.519071 ], [ 123.315831, 43.492159 ], [ 123.36449, 43.483475 ], [ 123.382968, 43.469143 ], [ 123.419925, 43.410046 ], [ 123.442098, 43.437863 ], [ 123.486446, 43.44525 ], [ 123.519707, 43.402219 ], [ 123.54496, 43.415262 ], [ 123.608402, 43.366119 ], [ 123.703873, 43.37047 ], [ 123.698329, 43.272071 ], [ 123.664453, 43.264663 ], [ 123.676771, 43.223684 ], [ 123.645974, 43.208855 ], [ 123.666916, 43.179623 ], [ 123.636119, 43.141644 ], [ 123.631192, 43.088346 ], [ 123.580685, 43.036314 ], [ 123.572678, 43.003498 ], [ 123.536337, 43.007 ], [ 123.474743, 43.042438 ], [ 123.434707, 43.027565 ], [ 123.323222, 43.000872 ], [ 123.259165, 42.993431 ], [ 123.18402, 42.925983 ], [ 123.188947, 42.895739 ], [ 123.169853, 42.859777 ], [ 123.227752, 42.831695 ], [ 123.118114, 42.801405 ], [ 123.058368, 42.768903 ], [ 122.980144, 42.777689 ], [ 122.945651, 42.753524 ], [ 122.925941, 42.772417 ], [ 122.887137, 42.770221 ], [ 122.883442, 42.751766 ], [ 122.848949, 42.712203 ], [ 122.786123, 42.757479 ], [ 122.73808, 42.77066 ], [ 122.733152, 42.786034 ], [ 122.653696, 42.78252 ], [ 122.624747, 42.773296 ], [ 122.580399, 42.789987 ], [ 122.576088, 42.819405 ], [ 122.556378, 42.827745 ], [ 122.436886, 42.843105 ], [ 122.35127, 42.830378 ], [ 122.371596, 42.776371 ], [ 122.439349, 42.770221 ], [ 122.460907, 42.755282 ], [ 122.396234, 42.707366 ], [ 122.396234, 42.684054 ], [ 122.338951, 42.669975 ], [ 122.324785, 42.684934 ], [ 122.261343, 42.695931 ], [ 122.204676, 42.732867 ], [ 122.204676, 42.685374 ], [ 122.160945, 42.684934 ], [ 122.072865, 42.710444 ], [ 122.062394, 42.723635 ], [ 122.018663, 42.69901 ], [ 121.939207, 42.688453 ], [ 121.94167, 42.666014 ], [ 121.915801, 42.656332 ], [ 121.921344, 42.605697 ], [ 121.889931, 42.556784 ], [ 121.844352, 42.522389 ], [ 121.831417, 42.533856 ], [ 121.817867, 42.504303 ], [ 121.803084, 42.514891 ], [ 121.747649, 42.484887 ], [ 121.69899, 42.438529 ], [ 121.66573, 42.437204 ], [ 121.604136, 42.495037 ], [ 121.607831, 42.516214 ], [ 121.570875, 42.487093 ], [ 121.506201, 42.482239 ], [ 121.4791, 42.49636 ], [ 121.434752, 42.475176 ], [ 121.386093, 42.474294 ], [ 121.304789, 42.435879 ], [ 121.314644, 42.42837 ], [ 121.285079, 42.387717 ], [ 121.218558, 42.371802 ], [ 121.184681, 42.333324 ], [ 121.133558, 42.300135 ], [ 121.120623, 42.280656 ], [ 121.087978, 42.278885 ], [ 121.070732, 42.254083 ], [ 121.028848, 42.242565 ], [ 120.992508, 42.264714 ], [ 120.933994, 42.27977 ], [ 120.883487, 42.269585 ], [ 120.883487, 42.242565 ], [ 120.8299, 42.252755 ], [ 120.820661, 42.227943 ], [ 120.79048, 42.218636 ], [ 120.745516, 42.223512 ], [ 120.72211, 42.203565 ], [ 120.624792, 42.154338 ], [ 120.58414, 42.167203 ], [ 120.56751, 42.152119 ], [ 120.466496, 42.105516 ], [ 120.493597, 42.073539 ], [ 120.450481, 42.057101 ], [ 120.456641, 42.016208 ], [ 120.399358, 41.984631 ], [ 120.373489, 41.994862 ], [ 120.309431, 41.951704 ], [ 120.318054, 41.93746 ], [ 120.271859, 41.925439 ], [ 120.260156, 41.904062 ], [ 120.290337, 41.897381 ], [ 120.286641, 41.880005 ], [ 120.251533, 41.884016 ], [ 120.215808, 41.853265 ], [ 120.188707, 41.848361 ], [ 120.183164, 41.826513 ], [ 120.127113, 41.77253 ], [ 120.1382, 41.729221 ], [ 120.096316, 41.697056 ], [ 120.035954, 41.708226 ], [ 120.024867, 41.737707 ], [ 120.050737, 41.776101 ], [ 120.041498, 41.818932 ], [ 120.023019, 41.816701 ], [ 119.989759, 41.899163 ], [ 119.954034, 41.923212 ], [ 119.950954, 41.974399 ], [ 119.924469, 41.98908 ], [ 119.921389, 42.014429 ], [ 119.897368, 42.030879 ], [ 119.87581, 42.077982 ], [ 119.845629, 42.097079 ], [ 119.837622, 42.135257 ], [ 119.854868, 42.170308 ], [ 119.841933, 42.215534 ], [ 119.744615, 42.211545 ], [ 119.679941, 42.240793 ], [ 119.617115, 42.252755 ], [ 119.609108, 42.276671 ], [ 119.557985, 42.289068 ], [ 119.539507, 42.297922 ], [ 119.571536, 42.335536 ], [ 119.572152, 42.359421 ], [ 119.540123, 42.363401 ], [ 119.502551, 42.388159 ], [ 119.482841, 42.347037 ], [ 119.432949, 42.317396 ], [ 119.34795, 42.300578 ], [ 119.280197, 42.260728 ], [ 119.274037, 42.239021 ], [ 119.237697, 42.200905 ], [ 119.277733, 42.185387 ], [ 119.286972, 42.154781 ], [ 119.30853, 42.147239 ], [ 119.314689, 42.119723 ], [ 119.352261, 42.118391 ], [ 119.384906, 42.08953 ], [ 119.375667, 42.023322 ], [ 119.324544, 41.969505 ], [ 119.323928, 41.937014 ], [ 119.340559, 41.926774 ], [ 119.323312, 41.889807 ], [ 119.334399, 41.871539 ], [ 119.312841, 41.80555 ], [ 119.292515, 41.790827 ], [ 119.317769, 41.764049 ], [ 119.319001, 41.727435 ], [ 119.299907, 41.705545 ], [ 119.307914, 41.657273 ], [ 119.342406, 41.617914 ], [ 119.415703, 41.590169 ], [ 119.420015, 41.567785 ], [ 119.362116, 41.566442 ], [ 119.361501, 41.545841 ], [ 119.406464, 41.503276 ], [ 119.401537, 41.472343 ], [ 119.378131, 41.459787 ], [ 119.376283, 41.422102 ], [ 119.309762, 41.405944 ], [ 119.330704, 41.385293 ], [ 119.296211, 41.325097 ], [ 119.239545, 41.31431 ], [ 119.211827, 41.308016 ], [ 119.197661, 41.282837 ], [ 119.168712, 41.294978 ], [ 119.092951, 41.293629 ], [ 118.980234, 41.305769 ], [ 118.949437, 41.317906 ], [ 118.890923, 41.300823 ], [ 118.844727, 41.342622 ], [ 118.843496, 41.374516 ], [ 118.770199, 41.352956 ], [ 118.741866, 41.324198 ], [ 118.677192, 41.35026 ], [ 118.629765, 41.346666 ], [ 118.528135, 41.355202 ], [ 118.412338, 41.331838 ], [ 118.380309, 41.312062 ], [ 118.348896, 41.342622 ], [ 118.361215, 41.384844 ], [ 118.348896, 41.428384 ], [ 118.327338, 41.450816 ], [ 118.271904, 41.471446 ], [ 118.315636, 41.512688 ], [ 118.302701, 41.55256 ], [ 118.215237, 41.59554 ], [ 118.206614, 41.650566 ], [ 118.159187, 41.67605 ], [ 118.155491, 41.712694 ], [ 118.132702, 41.733241 ], [ 118.140093, 41.784134 ], [ 118.178281, 41.814917 ], [ 118.236179, 41.80778 ], [ 118.247266, 41.773869 ], [ 118.29223, 41.772976 ], [ 118.335346, 41.845241 ], [ 118.340273, 41.87243 ], [ 118.268824, 41.930336 ], [ 118.306396, 41.940131 ], [ 118.313788, 41.98819 ], [ 118.291614, 42.007759 ], [ 118.239875, 42.024655 ], [ 118.286686, 42.033991 ], [ 118.296541, 42.057545 ], [ 118.27252, 42.083312 ], [ 118.239259, 42.092639 ], [ 118.212774, 42.081091 ], [ 118.220165, 42.058434 ], [ 118.194296, 42.031324 ], [ 118.116687, 42.037102 ], [ 118.155491, 42.081091 ], [ 118.097593, 42.105072 ], [ 118.089586, 42.12283 ], [ 118.106216, 42.172082 ], [ 118.033535, 42.199132 ], [ 117.977485, 42.229716 ], [ 117.974405, 42.25054 ], [ 118.047702, 42.280656 ], [ 118.060021, 42.298364 ], [ 118.008898, 42.346595 ], [ 118.024296, 42.385064 ], [ 117.997811, 42.416884 ], [ 117.874007, 42.510038 ], [ 117.856761, 42.539148 ], [ 117.797631, 42.585431 ], [ 117.801326, 42.612744 ], [ 117.779768, 42.61847 ], [ 117.708935, 42.588515 ], [ 117.667051, 42.582347 ], [ 117.60053, 42.603054 ], [ 117.537088, 42.603054 ], [ 117.530313, 42.590278 ], [ 117.475494, 42.602613 ], [ 117.435458, 42.585431 ], [ 117.434226, 42.557224 ], [ 117.387415, 42.517537 ], [ 117.410205, 42.519743 ], [ 117.413284, 42.471645 ], [ 117.390495, 42.461933 ], [ 117.332596, 42.46105 ], [ 117.275314, 42.481797 ], [ 117.188467, 42.468114 ], [ 117.135496, 42.468996 ], [ 117.09546, 42.484004 ], [ 117.080061, 42.463699 ], [ 117.01662, 42.456193 ], [ 117.009228, 42.44957 ], [ 117.005533, 42.43367 ], [ 116.99075, 42.425719 ], [ 116.974736, 42.426603 ], [ 116.97104, 42.427486 ], [ 116.944555, 42.415116 ], [ 116.936547, 42.410256 ], [ 116.921765, 42.403628 ], [ 116.910062, 42.395231 ], [ 116.910678, 42.394789 ], [ 116.886656, 42.366496 ], [ 116.897743, 42.297479 ], [ 116.918685, 42.229716 ], [ 116.903287, 42.190708 ], [ 116.789338, 42.200462 ], [ 116.825062, 42.155669 ], [ 116.850316, 42.156556 ], [ 116.890352, 42.092639 ], [ 116.879881, 42.018431 ], [ 116.796113, 41.977958 ], [ 116.748686, 41.984186 ], [ 116.727744, 41.951259 ], [ 116.66923, 41.947698 ], [ 116.639049, 41.929891 ], [ 116.597165, 41.935679 ], [ 116.553433, 41.928555 ], [ 116.510933, 41.974399 ], [ 116.4826, 41.975734 ], [ 116.453651, 41.945917 ], [ 116.393289, 41.942802 ], [ 116.414231, 41.982407 ], [ 116.373579, 42.009983 ], [ 116.310137, 41.997086 ], [ 116.298434, 41.96817 ], [ 116.223906, 41.932562 ], [ 116.212819, 41.885352 ], [ 116.194341, 41.861734 ], [ 116.122892, 41.861734 ], [ 116.106877, 41.831419 ], [ 116.129051, 41.805996 ], [ 116.09887, 41.776547 ], [ 116.034196, 41.782795 ], [ 116.007095, 41.79752 ], [ 116.007095, 41.797966 ], [ 116.007095, 41.79752 ], [ 116.007095, 41.797966 ], [ 115.994776, 41.828743 ], [ 115.954124, 41.874213 ], [ 115.916552, 41.945027 ], [ 115.85311, 41.927665 ], [ 115.834632, 41.93835 ], [ 115.811226, 41.912525 ], [ 115.726227, 41.870202 ], [ 115.688038, 41.867528 ], [ 115.654162, 41.829189 ], [ 115.57409, 41.80555 ], [ 115.519887, 41.76762 ], [ 115.488474, 41.760924 ], [ 115.42996, 41.728775 ], [ 115.346808, 41.712247 ], [ 115.319091, 41.691693 ], [ 115.360975, 41.661297 ], [ 115.345576, 41.635807 ], [ 115.377605, 41.603148 ], [ 115.310468, 41.592854 ], [ 115.290142, 41.622835 ], [ 115.26612, 41.616124 ], [ 115.256881, 41.580768 ], [ 115.20391, 41.571367 ], [ 115.195287, 41.602253 ], [ 115.0992, 41.62373 ], [ 115.056085, 41.602253 ], [ 115.016049, 41.615229 ], [ 114.860832, 41.60091 ], [ 114.895325, 41.636255 ], [ 114.902716, 41.695715 ], [ 114.89594, 41.76762 ], [ 114.868839, 41.813579 ], [ 114.922426, 41.825175 ], [ 114.939056, 41.846132 ], [ 114.923658, 41.871093 ], [ 114.915035, 41.960605 ], [ 114.9021, 42.015763 ], [ 114.860832, 42.054879 ], [ 114.86268, 42.097967 ], [ 114.825723, 42.139695 ], [ 114.79431, 42.149457 ], [ 114.789383, 42.130819 ], [ 114.75489, 42.115727 ], [ 114.675434, 42.12061 ], [ 114.647717, 42.109512 ], [ 114.560254, 42.132595 ], [ 114.510978, 42.110844 ], [ 114.502355, 42.06732 ], [ 114.480181, 42.064654 ], [ 114.467863, 42.025989 ], [ 114.511594, 41.981962 ], [ 114.478334, 41.951704 ], [ 114.419203, 41.942356 ], [ 114.352066, 41.953484 ], [ 114.343443, 41.926774 ], [ 114.282465, 41.863517 ], [ 114.200545, 41.789934 ], [ 114.215328, 41.75646 ], [ 114.206704, 41.7386 ], [ 114.237501, 41.698843 ], [ 114.215328, 41.68499 ], [ 114.259059, 41.623282 ], [ 114.226414, 41.616572 ], [ 114.221487, 41.582111 ], [ 114.230726, 41.513584 ], [ 114.101379, 41.537779 ], [ 114.032394, 41.529715 ], [ 113.976959, 41.505966 ], [ 113.953553, 41.483553 ], [ 113.933227, 41.487139 ], [ 113.919677, 41.454404 ], [ 113.877793, 41.431076 ], [ 113.871017, 41.413126 ], [ 113.94493, 41.392477 ], [ 113.92522, 41.325546 ], [ 113.899351, 41.316108 ], [ 113.914749, 41.294529 ], [ 113.95109, 41.282837 ], [ 113.971416, 41.239649 ], [ 113.992357, 41.269794 ], [ 114.016379, 41.231999 ], [ 113.996669, 41.19238 ], [ 113.960945, 41.171211 ], [ 113.920293, 41.172112 ], [ 113.877793, 41.115777 ], [ 113.819279, 41.09774 ], [ 113.868554, 41.06887 ], [ 113.973263, 40.983087 ], [ 113.994821, 40.938798 ], [ 114.057647, 40.925234 ], [ 114.041633, 40.917546 ], [ 114.055183, 40.867782 ], [ 114.073661, 40.857372 ], [ 114.044712, 40.830661 ], [ 114.080437, 40.790348 ], [ 114.104458, 40.797597 ], [ 114.103227, 40.770861 ], [ 114.134639, 40.737314 ], [ 114.084748, 40.729605 ], [ 114.063806, 40.706925 ], [ 114.07243, 40.679246 ], [ 114.041633, 40.608861 ], [ 114.076741, 40.575686 ], [ 114.080437, 40.547952 ], [ 114.061959, 40.52885 ], [ 114.011452, 40.515657 ], [ 113.948626, 40.514747 ], [ 113.890112, 40.466503 ], [ 113.850691, 40.460583 ], [ 113.794641, 40.517932 ], [ 113.763228, 40.473787 ], [ 113.688699, 40.448288 ], [ 113.559968, 40.348476 ], [ 113.500222, 40.334335 ], [ 113.387505, 40.319279 ], [ 113.316672, 40.319736 ], [ 113.27602, 40.388601 ], [ 113.251382, 40.413211 ], [ 113.083231, 40.374925 ], [ 113.03334, 40.368997 ], [ 112.898449, 40.329317 ], [ 112.848558, 40.206937 ], [ 112.744464, 40.167161 ], [ 112.712436, 40.178593 ], [ 112.6299, 40.235725 ], [ 112.511639, 40.269068 ], [ 112.456205, 40.300112 ], [ 112.418017, 40.295091 ], [ 112.349031, 40.257194 ], [ 112.310227, 40.256281 ], [ 112.299756, 40.21105 ], [ 112.232619, 40.169905 ], [ 112.232003, 40.133311 ], [ 112.183344, 40.083877 ], [ 112.182112, 40.061437 ], [ 112.142076, 40.027076 ], [ 112.133453, 40.001866 ], [ 112.07617, 39.919298 ], [ 112.042294, 39.886243 ], [ 112.012729, 39.827438 ], [ 111.970229, 39.796638 ], [ 111.959758, 39.692642 ], [ 111.925265, 39.66731 ], [ 111.9382, 39.623071 ], [ 111.87907, 39.606013 ], [ 111.842729, 39.620305 ], [ 111.783599, 39.58895 ], [ 111.722621, 39.606013 ], [ 111.707839, 39.621227 ], [ 111.646245, 39.644272 ], [ 111.61668, 39.633211 ], [ 111.525521, 39.662242 ], [ 111.497187, 39.661781 ], [ 111.445448, 39.640124 ], [ 111.460847, 39.606935 ], [ 111.441137, 39.59679 ], [ 111.422043, 39.539123 ], [ 111.431282, 39.508656 ], [ 111.385086, 39.489722 ], [ 111.358601, 39.432428 ], [ 111.287152, 39.417173 ], [ 111.171971, 39.423183 ], [ 111.143022, 39.407926 ], [ 111.125776, 39.366297 ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"210000\", \"name\": \"辽宁省\", \"center\": [ 123.429096, 41.796767 ], \"centroid\": [ 122.605251, 41.299975 ], \"childrenNum\": 14, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 5, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 119.557985, 42.289068 ], [ 119.557985, 42.289068 ], [ 119.609108, 42.276671 ], [ 119.617115, 42.252755 ], [ 119.679941, 42.240793 ], [ 119.744615, 42.211545 ], [ 119.841933, 42.215534 ], [ 119.854868, 42.170308 ], [ 119.837622, 42.135257 ], [ 119.845629, 42.097079 ], [ 119.87581, 42.077982 ], [ 119.897368, 42.030879 ], [ 119.921389, 42.014429 ], [ 119.924469, 41.98908 ], [ 119.950954, 41.974399 ], [ 119.954034, 41.923212 ], [ 119.989759, 41.899163 ], [ 120.023019, 41.816701 ], [ 120.041498, 41.818932 ], [ 120.050737, 41.776101 ], [ 120.024867, 41.737707 ], [ 120.035954, 41.708226 ], [ 120.096316, 41.697056 ], [ 120.1382, 41.729221 ], [ 120.127113, 41.77253 ], [ 120.183164, 41.826513 ], [ 120.188707, 41.848361 ], [ 120.215808, 41.853265 ], [ 120.251533, 41.884016 ], [ 120.286641, 41.880005 ], [ 120.290337, 41.897381 ], [ 120.260156, 41.904062 ], [ 120.271859, 41.925439 ], [ 120.318054, 41.93746 ], [ 120.309431, 41.951704 ], [ 120.373489, 41.994862 ], [ 120.399358, 41.984631 ], [ 120.456641, 42.016208 ], [ 120.450481, 42.057101 ], [ 120.493597, 42.073539 ], [ 120.466496, 42.105516 ], [ 120.56751, 42.152119 ], [ 120.58414, 42.167203 ], [ 120.624792, 42.154338 ], [ 120.72211, 42.203565 ], [ 120.745516, 42.223512 ], [ 120.79048, 42.218636 ], [ 120.820661, 42.227943 ], [ 120.8299, 42.252755 ], [ 120.883487, 42.242565 ], [ 120.883487, 42.269585 ], [ 120.883487, 42.269585 ], [ 120.933994, 42.27977 ], [ 120.992508, 42.264714 ], [ 121.028848, 42.242565 ], [ 121.070732, 42.254083 ], [ 121.087978, 42.278885 ], [ 121.120623, 42.280656 ], [ 121.133558, 42.300135 ], [ 121.184681, 42.333324 ], [ 121.218558, 42.371802 ], [ 121.285079, 42.387717 ], [ 121.314644, 42.42837 ], [ 121.304789, 42.435879 ], [ 121.386093, 42.474294 ], [ 121.434752, 42.475176 ], [ 121.4791, 42.49636 ], [ 121.506201, 42.482239 ], [ 121.570875, 42.487093 ], [ 121.607831, 42.516214 ], [ 121.604136, 42.495037 ], [ 121.66573, 42.437204 ], [ 121.69899, 42.438529 ], [ 121.747649, 42.484887 ], [ 121.803084, 42.514891 ], [ 121.817867, 42.504303 ], [ 121.831417, 42.533856 ], [ 121.844352, 42.522389 ], [ 121.889931, 42.556784 ], [ 121.921344, 42.605697 ], [ 121.915801, 42.656332 ], [ 121.94167, 42.666014 ], [ 121.939207, 42.688453 ], [ 122.018663, 42.69901 ], [ 122.062394, 42.723635 ], [ 122.072865, 42.710444 ], [ 122.160945, 42.684934 ], [ 122.204676, 42.685374 ], [ 122.204676, 42.732867 ], [ 122.261343, 42.695931 ], [ 122.324785, 42.684934 ], [ 122.338951, 42.669975 ], [ 122.396234, 42.684054 ], [ 122.396234, 42.707366 ], [ 122.460907, 42.755282 ], [ 122.439349, 42.770221 ], [ 122.371596, 42.776371 ], [ 122.35127, 42.830378 ], [ 122.436886, 42.843105 ], [ 122.556378, 42.827745 ], [ 122.576088, 42.819405 ], [ 122.580399, 42.789987 ], [ 122.624747, 42.773296 ], [ 122.653696, 42.78252 ], [ 122.733152, 42.786034 ], [ 122.73808, 42.77066 ], [ 122.786123, 42.757479 ], [ 122.848949, 42.712203 ], [ 122.848949, 42.712203 ], [ 122.883442, 42.751766 ], [ 122.883442, 42.751766 ], [ 122.887137, 42.770221 ], [ 122.925941, 42.772417 ], [ 122.945651, 42.753524 ], [ 122.980144, 42.777689 ], [ 123.058368, 42.768903 ], [ 123.118114, 42.801405 ], [ 123.227752, 42.831695 ], [ 123.169853, 42.859777 ], [ 123.188947, 42.895739 ], [ 123.18402, 42.925983 ], [ 123.259165, 42.993431 ], [ 123.323222, 43.000872 ], [ 123.434707, 43.027565 ], [ 123.474743, 43.042438 ], [ 123.536337, 43.007 ], [ 123.572678, 43.003498 ], [ 123.580685, 43.036314 ], [ 123.631192, 43.088346 ], [ 123.636119, 43.141644 ], [ 123.666916, 43.179623 ], [ 123.645974, 43.208855 ], [ 123.676771, 43.223684 ], [ 123.664453, 43.264663 ], [ 123.698329, 43.272071 ], [ 123.703873, 43.37047 ], [ 123.710032, 43.417001 ], [ 123.749452, 43.439167 ], [ 123.747604, 43.472184 ], [ 123.79688, 43.489988 ], [ 123.857858, 43.459153 ], [ 123.857858, 43.459153 ], [ 123.852314, 43.406133 ], [ 123.881263, 43.392218 ], [ 123.881263, 43.392218 ], [ 123.896046, 43.361333 ], [ 123.964415, 43.34088 ], [ 124.032784, 43.280786 ], [ 124.099306, 43.292983 ], [ 124.117168, 43.2773 ], [ 124.114088, 43.247229 ], [ 124.168291, 43.244177 ], [ 124.215102, 43.255947 ], [ 124.228653, 43.235022 ], [ 124.27608, 43.233278 ], [ 124.287167, 43.207983 ], [ 124.273617, 43.17875 ], [ 124.366007, 43.121554 ], [ 124.425754, 43.076107 ], [ 124.333363, 42.997371 ], [ 124.369703, 42.972854 ], [ 124.42329, 42.975482 ], [ 124.442384, 42.958841 ], [ 124.431913, 42.930803 ], [ 124.38079, 42.912835 ], [ 124.371551, 42.880831 ], [ 124.435609, 42.880831 ], [ 124.466406, 42.847054 ], [ 124.586514, 42.905384 ], [ 124.607456, 42.937376 ], [ 124.632093, 42.949642 ], [ 124.635173, 42.972854 ], [ 124.658579, 42.972854 ], [ 124.677673, 43.002185 ], [ 124.686912, 43.051185 ], [ 124.719557, 43.069987 ], [ 124.755281, 43.074359 ], [ 124.785462, 43.117185 ], [ 124.882781, 43.13422 ], [ 124.88894, 43.074796 ], [ 124.840897, 43.032377 ], [ 124.869846, 42.988178 ], [ 124.87231, 42.962344 ], [ 124.84952, 42.882585 ], [ 124.856911, 42.824234 ], [ 124.874157, 42.789987 ], [ 124.897563, 42.787791 ], [ 124.92836, 42.819844 ], [ 124.975171, 42.802722 ], [ 124.996729, 42.745174 ], [ 124.968396, 42.722756 ], [ 124.99057, 42.677455 ], [ 125.014592, 42.666014 ], [ 125.010896, 42.63212 ], [ 125.038613, 42.615387 ], [ 125.097127, 42.622433 ], [ 125.082961, 42.591159 ], [ 125.089736, 42.567803 ], [ 125.066946, 42.534738 ], [ 125.090968, 42.515773 ], [ 125.068794, 42.499449 ], [ 125.105135, 42.490624 ], [ 125.150098, 42.458842 ], [ 125.140243, 42.44692 ], [ 125.186439, 42.427928 ], [ 125.185823, 42.38197 ], [ 125.203685, 42.366938 ], [ 125.167345, 42.351903 ], [ 125.175352, 42.308102 ], [ 125.224011, 42.30102 ], [ 125.264047, 42.312528 ], [ 125.299156, 42.289953 ], [ 125.27575, 42.266928 ], [ 125.27575, 42.231045 ], [ 125.312706, 42.219966 ], [ 125.280677, 42.175187 ], [ 125.312706, 42.197359 ], [ 125.305931, 42.146351 ], [ 125.357054, 42.145464 ], [ 125.368141, 42.182726 ], [ 125.41372, 42.156112 ], [ 125.458068, 42.160105 ], [ 125.458068, 42.160105 ], [ 125.490097, 42.136145 ], [ 125.446365, 42.098411 ], [ 125.414336, 42.101964 ], [ 125.416184, 42.063766 ], [ 125.363213, 42.017097 ], [ 125.369989, 42.002868 ], [ 125.29854, 41.974399 ], [ 125.291764, 41.958825 ], [ 125.35151, 41.92811 ], [ 125.307779, 41.924548 ], [ 125.294844, 41.822945 ], [ 125.319482, 41.776993 ], [ 125.319482, 41.776993 ], [ 125.323177, 41.771191 ], [ 125.323177, 41.771191 ], [ 125.336112, 41.768067 ], [ 125.336112, 41.768067 ], [ 125.332416, 41.711354 ], [ 125.317018, 41.676944 ], [ 125.344119, 41.672474 ], [ 125.412488, 41.691246 ], [ 125.446981, 41.67605 ], [ 125.461148, 41.642516 ], [ 125.450061, 41.597777 ], [ 125.479626, 41.544946 ], [ 125.507343, 41.534195 ], [ 125.493176, 41.509103 ], [ 125.533212, 41.479069 ], [ 125.534444, 41.428833 ], [ 125.547995, 41.401006 ], [ 125.581256, 41.396517 ], [ 125.589879, 41.359245 ], [ 125.610205, 41.365084 ], [ 125.637306, 41.34442 ], [ 125.62006, 41.318355 ], [ 125.642234, 41.296327 ], [ 125.646545, 41.264396 ], [ 125.685349, 41.273842 ], [ 125.695205, 41.244599 ], [ 125.749407, 41.245499 ], [ 125.758646, 41.232449 ], [ 125.73832, 41.178418 ], [ 125.791291, 41.167607 ], [ 125.759878, 41.132908 ], [ 125.734009, 41.125695 ], [ 125.712451, 41.095485 ], [ 125.739552, 41.08917 ], [ 125.726617, 41.055332 ], [ 125.684118, 41.021929 ], [ 125.674879, 40.974503 ], [ 125.650241, 40.970888 ], [ 125.635458, 40.94151 ], [ 125.589263, 40.931112 ], [ 125.584335, 40.891764 ], [ 125.652089, 40.91619 ], [ 125.687813, 40.897645 ], [ 125.707523, 40.866877 ], [ 125.648393, 40.826133 ], [ 125.641002, 40.798503 ], [ 125.67611, 40.788082 ], [ 125.685349, 40.769048 ], [ 125.61698, 40.763609 ], [ 125.585567, 40.788535 ], [ 125.551075, 40.761796 ], [ 125.544915, 40.729605 ], [ 125.49564, 40.728697 ], [ 125.459916, 40.707379 ], [ 125.453756, 40.676522 ], [ 125.418648, 40.673345 ], [ 125.422343, 40.635661 ], [ 125.375532, 40.658365 ], [ 125.329337, 40.643835 ], [ 125.305315, 40.661089 ], [ 125.279445, 40.655187 ], [ 125.262815, 40.620218 ], [ 125.181511, 40.611132 ], [ 125.113758, 40.569322 ], [ 125.076801, 40.562048 ], [ 125.015823, 40.533853 ], [ 125.004737, 40.496091 ], [ 125.042925, 40.483802 ], [ 125.044157, 40.466503 ], [ 124.985642, 40.475153 ], [ 124.945606, 40.45603 ], [ 124.913578, 40.481981 ], [ 124.834121, 40.423235 ], [ 124.739267, 40.371733 ], [ 124.722636, 40.321561 ], [ 124.62655, 40.291896 ], [ 124.513833, 40.22019 ], [ 124.490427, 40.18408 ], [ 124.457782, 40.177679 ], [ 124.428217, 40.144291 ], [ 124.346913, 40.079756 ], [ 124.336442, 40.049985 ], [ 124.372167, 40.021576 ], [ 124.349377, 39.989029 ], [ 124.288399, 39.962888 ], [ 124.286551, 39.931689 ], [ 124.241588, 39.928477 ], [ 124.216334, 39.89313 ], [ 124.214486, 39.865116 ], [ 124.173218, 39.841225 ], [ 124.151045, 39.74558 ], [ 124.099306, 39.777323 ], [ 124.103001, 39.823302 ], [ 124.002603, 39.800316 ], [ 123.95148, 39.817786 ], [ 123.812278, 39.831115 ], [ 123.795032, 39.822842 ], [ 123.687858, 39.808132 ], [ 123.674924, 39.826979 ], [ 123.645358, 39.823761 ], [ 123.642279, 39.796178 ], [ 123.612714, 39.775023 ], [ 123.579453, 39.781002 ], [ 123.546808, 39.756163 ], [ 123.536337, 39.788361 ], [ 123.484598, 39.763063 ], [ 123.477823, 39.74696 ], [ 123.392823, 39.723949 ], [ 123.388512, 39.74742 ], [ 123.350939, 39.750641 ], [ 123.274563, 39.753862 ], [ 123.270251, 39.714743 ], [ 123.286882, 39.704154 ], [ 123.253005, 39.689879 ], [ 123.215433, 39.696786 ], [ 123.212969, 39.665928 ], [ 123.166774, 39.674219 ], [ 123.146448, 39.647037 ], [ 123.103332, 39.676983 ], [ 123.010941, 39.655331 ], [ 123.021412, 39.64335 ], [ 122.978912, 39.616156 ], [ 122.972753, 39.594946 ], [ 122.941956, 39.604629 ], [ 122.860652, 39.604629 ], [ 122.847101, 39.581571 ], [ 122.808913, 39.559889 ], [ 122.682645, 39.514658 ], [ 122.649385, 39.516505 ], [ 122.637066, 39.488799 ], [ 122.581631, 39.464316 ], [ 122.532972, 39.419947 ], [ 122.489856, 39.403764 ], [ 122.412864, 39.411625 ], [ 122.366053, 39.370461 ], [ 122.30877, 39.346399 ], [ 122.274893, 39.322329 ], [ 122.242865, 39.267678 ], [ 122.160329, 39.238019 ], [ 122.117213, 39.213911 ], [ 122.123988, 39.172631 ], [ 122.167104, 39.158711 ], [ 122.127684, 39.144788 ], [ 122.088264, 39.112291 ], [ 122.048228, 39.101146 ], [ 122.071634, 39.074204 ], [ 122.061778, 39.060264 ], [ 122.013735, 39.073275 ], [ 121.963228, 39.030053 ], [ 121.913953, 39.0598 ], [ 121.929352, 39.024939 ], [ 121.864062, 39.037026 ], [ 121.855439, 39.025869 ], [ 121.905946, 38.997503 ], [ 121.920728, 38.969591 ], [ 121.863446, 38.942598 ], [ 121.804932, 38.970986 ], [ 121.790149, 39.022614 ], [ 121.756889, 39.025869 ], [ 121.73841, 38.998898 ], [ 121.671273, 39.010059 ], [ 121.66265, 38.966333 ], [ 121.618918, 38.950046 ], [ 121.655874, 38.946788 ], [ 121.719316, 38.920252 ], [ 121.708845, 38.872744 ], [ 121.675585, 38.86156 ], [ 121.618302, 38.862492 ], [ 121.564715, 38.874607 ], [ 121.509897, 38.817743 ], [ 121.399028, 38.812613 ], [ 121.359608, 38.822406 ], [ 121.302325, 38.78976 ], [ 121.259825, 38.786495 ], [ 121.198848, 38.721623 ], [ 121.13787, 38.723023 ], [ 121.112, 38.776231 ], [ 121.12863, 38.799089 ], [ 121.110768, 38.862026 ], [ 121.129862, 38.879266 ], [ 121.094138, 38.894173 ], [ 121.08921, 38.922115 ], [ 121.128014, 38.958888 ], [ 121.180369, 38.959819 ], [ 121.204391, 38.941202 ], [ 121.275224, 38.971917 ], [ 121.341129, 38.980757 ], [ 121.317108, 39.012384 ], [ 121.370695, 39.060264 ], [ 121.431057, 39.027263 ], [ 121.508049, 39.034237 ], [ 121.581962, 39.075598 ], [ 121.599208, 39.098824 ], [ 121.562252, 39.127149 ], [ 121.590585, 39.154999 ], [ 121.642324, 39.11972 ], [ 121.605983, 39.080708 ], [ 121.631853, 39.077921 ], [ 121.68236, 39.117863 ], [ 121.639244, 39.166136 ], [ 121.604136, 39.166136 ], [ 121.586889, 39.193506 ], [ 121.591201, 39.228748 ], [ 121.631237, 39.22643 ], [ 121.589353, 39.263044 ], [ 121.623846, 39.285745 ], [ 121.672505, 39.275554 ], [ 121.667577, 39.310754 ], [ 121.70207, 39.326496 ], [ 121.72486, 39.364447 ], [ 121.621382, 39.326033 ], [ 121.562252, 39.322792 ], [ 121.51544, 39.286672 ], [ 121.464933, 39.30103 ], [ 121.466781, 39.320014 ], [ 121.435984, 39.329736 ], [ 121.432904, 39.357506 ], [ 121.35468, 39.377863 ], [ 121.324499, 39.371386 ], [ 121.307869, 39.391277 ], [ 121.270296, 39.374162 ], [ 121.245659, 39.389427 ], [ 121.246891, 39.421334 ], [ 121.304173, 39.48187 ], [ 121.286927, 39.507271 ], [ 121.268449, 39.482794 ], [ 121.224717, 39.519275 ], [ 121.226565, 39.554814 ], [ 121.263521, 39.589873 ], [ 121.299246, 39.606013 ], [ 121.325731, 39.601402 ], [ 121.450151, 39.624914 ], [ 121.451999, 39.658095 ], [ 121.482796, 39.659478 ], [ 121.502506, 39.703233 ], [ 121.45939, 39.747881 ], [ 121.487107, 39.760303 ], [ 121.472325, 39.802155 ], [ 121.530223, 39.851334 ], [ 121.541926, 39.874302 ], [ 121.572107, 39.865116 ], [ 121.626925, 39.882569 ], [ 121.699606, 39.937196 ], [ 121.76428, 39.933525 ], [ 121.779062, 39.942702 ], [ 121.796309, 39.999116 ], [ 121.824642, 40.025701 ], [ 121.910257, 40.072887 ], [ 121.956453, 40.133311 ], [ 121.995257, 40.128277 ], [ 122.003264, 40.172191 ], [ 121.98109, 40.173106 ], [ 121.950293, 40.204194 ], [ 121.940438, 40.242121 ], [ 122.02667, 40.244862 ], [ 122.039605, 40.260391 ], [ 122.040221, 40.322017 ], [ 122.079641, 40.332967 ], [ 122.110438, 40.315629 ], [ 122.138155, 40.338897 ], [ 122.111054, 40.348932 ], [ 122.135691, 40.374925 ], [ 122.152322, 40.357597 ], [ 122.198517, 40.382219 ], [ 122.186814, 40.422779 ], [ 122.229314, 40.424146 ], [ 122.250872, 40.445555 ], [ 122.241633, 40.465137 ], [ 122.278589, 40.482891 ], [ 122.244712, 40.485167 ], [ 122.245944, 40.519752 ], [ 122.150474, 40.588413 ], [ 122.133843, 40.614313 ], [ 122.148626, 40.671983 ], [ 122.122141, 40.657457 ], [ 122.06609, 40.64883 ], [ 122.025438, 40.674253 ], [ 121.951525, 40.680607 ], [ 121.936127, 40.711462 ], [ 121.934279, 40.79805 ], [ 121.883772, 40.802127 ], [ 121.84312, 40.831567 ], [ 121.816019, 40.894931 ], [ 121.778446, 40.886787 ], [ 121.735331, 40.862351 ], [ 121.732251, 40.846961 ], [ 121.682976, 40.829755 ], [ 121.626309, 40.844244 ], [ 121.576418, 40.837906 ], [ 121.553013, 40.817528 ], [ 121.55486, 40.849677 ], [ 121.526527, 40.85194 ], [ 121.499426, 40.880001 ], [ 121.440296, 40.88181 ], [ 121.440912, 40.84017 ], [ 121.342977, 40.841528 ], [ 121.290622, 40.851488 ], [ 121.274608, 40.886335 ], [ 121.251202, 40.880453 ], [ 121.23642, 40.851035 ], [ 121.177906, 40.873665 ], [ 121.126167, 40.86914 ], [ 121.076892, 40.815716 ], [ 121.086747, 40.79805 ], [ 121.010986, 40.784457 ], [ 121.00729, 40.807563 ], [ 120.971566, 40.805751 ], [ 120.994356, 40.790801 ], [ 120.980189, 40.766329 ], [ 120.991276, 40.744115 ], [ 121.028848, 40.746382 ], [ 121.032544, 40.709193 ], [ 120.983269, 40.712822 ], [ 120.945081, 40.687868 ], [ 120.861313, 40.684692 ], [ 120.8299, 40.671076 ], [ 120.837291, 40.644289 ], [ 120.822509, 40.59432 ], [ 120.72827, 40.539311 ], [ 120.72211, 40.515657 ], [ 120.693777, 40.505647 ], [ 120.666676, 40.467413 ], [ 120.615553, 40.453298 ], [ 120.617401, 40.41959 ], [ 120.596459, 40.399084 ], [ 120.602618, 40.36079 ], [ 120.537329, 40.325211 ], [ 120.52193, 40.304676 ], [ 120.523778, 40.256737 ], [ 120.491749, 40.20008 ], [ 120.451097, 40.177679 ], [ 120.371641, 40.174478 ], [ 120.273091, 40.127362 ], [ 120.161606, 40.096239 ], [ 120.134504, 40.074719 ], [ 120.092005, 40.077466 ], [ 119.947259, 40.040364 ], [ 119.941715, 40.009659 ], [ 119.91831, 39.989946 ], [ 119.854252, 39.98857 ], [ 119.845629, 40.000949 ], [ 119.845629, 40.000949 ], [ 119.854252, 40.033033 ], [ 119.81668, 40.050443 ], [ 119.81668, 40.050443 ], [ 119.787115, 40.041739 ], [ 119.787115, 40.041739 ], [ 119.783419, 40.046778 ], [ 119.783419, 40.046778 ], [ 119.772332, 40.08113 ], [ 119.736608, 40.104936 ], [ 119.760629, 40.136056 ], [ 119.745847, 40.207851 ], [ 119.716898, 40.195966 ], [ 119.671934, 40.23938 ], [ 119.639289, 40.231613 ], [ 119.639289, 40.231613 ], [ 119.651608, 40.271808 ], [ 119.598021, 40.334335 ], [ 119.586934, 40.375381 ], [ 119.604797, 40.455119 ], [ 119.553674, 40.502007 ], [ 119.572152, 40.523846 ], [ 119.559217, 40.547952 ], [ 119.503783, 40.553864 ], [ 119.477913, 40.533399 ], [ 119.429254, 40.540221 ], [ 119.30237, 40.530215 ], [ 119.256175, 40.543404 ], [ 119.22045, 40.569322 ], [ 119.230921, 40.603863 ], [ 119.177951, 40.609315 ], [ 119.162552, 40.600228 ], [ 119.14469, 40.632482 ], [ 119.184726, 40.680153 ], [ 119.165632, 40.69286 ], [ 119.115125, 40.666536 ], [ 119.054763, 40.664721 ], [ 119.028277, 40.692406 ], [ 119.011031, 40.687414 ], [ 118.96114, 40.72008 ], [ 118.950053, 40.747743 ], [ 118.895234, 40.75409 ], [ 118.907553, 40.775394 ], [ 118.878604, 40.783098 ], [ 118.845959, 40.822057 ], [ 118.873061, 40.847866 ], [ 118.90201, 40.960946 ], [ 118.916792, 40.969984 ], [ 118.977154, 40.959138 ], [ 118.977154, 40.959138 ], [ 119.00056, 40.967273 ], [ 119.013495, 41.007479 ], [ 118.951901, 41.018317 ], [ 118.937118, 41.052625 ], [ 118.964836, 41.079246 ], [ 119.037516, 41.067516 ], [ 119.080632, 41.095936 ], [ 119.081248, 41.131555 ], [ 119.126212, 41.138767 ], [ 119.189038, 41.198234 ], [ 119.169943, 41.222996 ], [ 119.204436, 41.222546 ], [ 119.209364, 41.244599 ], [ 119.2494, 41.279689 ], [ 119.239545, 41.31431 ], [ 119.296211, 41.325097 ], [ 119.330704, 41.385293 ], [ 119.309762, 41.405944 ], [ 119.376283, 41.422102 ], [ 119.378131, 41.459787 ], [ 119.401537, 41.472343 ], [ 119.406464, 41.503276 ], [ 119.361501, 41.545841 ], [ 119.362116, 41.566442 ], [ 119.420015, 41.567785 ], [ 119.415703, 41.590169 ], [ 119.342406, 41.617914 ], [ 119.307914, 41.657273 ], [ 119.299907, 41.705545 ], [ 119.319001, 41.727435 ], [ 119.317769, 41.764049 ], [ 119.292515, 41.790827 ], [ 119.312841, 41.80555 ], [ 119.334399, 41.871539 ], [ 119.323312, 41.889807 ], [ 119.340559, 41.926774 ], [ 119.323928, 41.937014 ], [ 119.324544, 41.969505 ], [ 119.375667, 42.023322 ], [ 119.384906, 42.08953 ], [ 119.352261, 42.118391 ], [ 119.314689, 42.119723 ], [ 119.30853, 42.147239 ], [ 119.286972, 42.154781 ], [ 119.277733, 42.185387 ], [ 119.237697, 42.200905 ], [ 119.274037, 42.239021 ], [ 119.280197, 42.260728 ], [ 119.34795, 42.300578 ], [ 119.432949, 42.317396 ], [ 119.482841, 42.347037 ], [ 119.502551, 42.388159 ], [ 119.540123, 42.363401 ], [ 119.572152, 42.359421 ], [ 119.571536, 42.335536 ], [ 119.539507, 42.297922 ], [ 119.557985, 42.289068 ] ] ], [ [ [ 122.673406, 39.269531 ], [ 122.67895, 39.268605 ], [ 122.57732, 39.269994 ], [ 122.497248, 39.300566 ], [ 122.540979, 39.308439 ], [ 122.593334, 39.278334 ], [ 122.641993, 39.288061 ], [ 122.673406, 39.269531 ] ] ], [ [ [ 122.335256, 39.149894 ], [ 122.316161, 39.185157 ], [ 122.343263, 39.203246 ], [ 122.393154, 39.213448 ], [ 122.383299, 39.190723 ], [ 122.398697, 39.16196 ], [ 122.366053, 39.174951 ], [ 122.335256, 39.149894 ] ] ], [ [ [ 122.691884, 39.23292 ], [ 122.691268, 39.23431 ], [ 122.690037, 39.234774 ], [ 122.628443, 39.231993 ], [ 122.635834, 39.241727 ], [ 122.740544, 39.248679 ], [ 122.751631, 39.229675 ], [ 122.696812, 39.206492 ], [ 122.691884, 39.23292 ] ] ], [ [ [ 122.759022, 39.025404 ], [ 122.732536, 39.013779 ], [ 122.704819, 39.044463 ], [ 122.725145, 39.048181 ], [ 122.759022, 39.025404 ] ] ], [ [ [ 123.022644, 39.546507 ], [ 123.036194, 39.533123 ], [ 122.995542, 39.495264 ], [ 122.945035, 39.520198 ], [ 122.96105, 39.551122 ], [ 123.022644, 39.546507 ] ] ], [ [ [ 122.503407, 39.241263 ], [ 122.547755, 39.229211 ], [ 122.502175, 39.224112 ], [ 122.503407, 39.241263 ] ] ], [ [ [ 120.786784, 40.473787 ], [ 120.774465, 40.48016 ], [ 120.805262, 40.525666 ], [ 120.8299, 40.516112 ], [ 120.83298, 40.491995 ], [ 120.786784, 40.473787 ] ] ], [ [ [ 123.086702, 39.426881 ], [ 123.054057, 39.457847 ], [ 123.090397, 39.450915 ], [ 123.086702, 39.426881 ] ] ], [ [ [ 123.160614, 39.025404 ], [ 123.143984, 39.038885 ], [ 123.145832, 39.091857 ], [ 123.20065, 39.077921 ], [ 123.205578, 39.057011 ], [ 123.160614, 39.025404 ] ] ], [ [ [ 123.716807, 39.74512 ], [ 123.719887, 39.763063 ], [ 123.756843, 39.754322 ], [ 123.716807, 39.74512 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"220000\", \"name\": \"吉林省\", \"center\": [ 125.3245, 43.886841 ], \"centroid\": [ 126.171249, 43.70394 ], \"childrenNum\": 9, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 6, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 126.188572, 41.114875 ], [ 126.187956, 41.113072 ], [ 126.16763, 41.094583 ], [ 126.124514, 41.092327 ], [ 126.133753, 41.063906 ], [ 126.099877, 41.036376 ], [ 126.1085, 41.011995 ], [ 126.066, 40.997542 ], [ 126.08263, 40.976762 ], [ 126.051833, 40.96185 ], [ 126.041362, 40.928851 ], [ 126.008102, 40.936537 ], [ 125.959442, 40.88181 ], [ 125.921254, 40.882715 ], [ 125.875059, 40.908501 ], [ 125.860892, 40.888597 ], [ 125.817161, 40.866877 ], [ 125.778356, 40.897645 ], [ 125.707523, 40.866877 ], [ 125.687813, 40.897645 ], [ 125.652089, 40.91619 ], [ 125.584335, 40.891764 ], [ 125.589263, 40.931112 ], [ 125.635458, 40.94151 ], [ 125.650241, 40.970888 ], [ 125.674879, 40.974503 ], [ 125.684118, 41.021929 ], [ 125.726617, 41.055332 ], [ 125.739552, 41.08917 ], [ 125.712451, 41.095485 ], [ 125.734009, 41.125695 ], [ 125.759878, 41.132908 ], [ 125.791291, 41.167607 ], [ 125.73832, 41.178418 ], [ 125.758646, 41.232449 ], [ 125.749407, 41.245499 ], [ 125.695205, 41.244599 ], [ 125.685349, 41.273842 ], [ 125.646545, 41.264396 ], [ 125.642234, 41.296327 ], [ 125.62006, 41.318355 ], [ 125.637306, 41.34442 ], [ 125.610205, 41.365084 ], [ 125.589879, 41.359245 ], [ 125.581256, 41.396517 ], [ 125.547995, 41.401006 ], [ 125.534444, 41.428833 ], [ 125.533212, 41.479069 ], [ 125.493176, 41.509103 ], [ 125.507343, 41.534195 ], [ 125.479626, 41.544946 ], [ 125.450061, 41.597777 ], [ 125.461148, 41.642516 ], [ 125.446981, 41.67605 ], [ 125.412488, 41.691246 ], [ 125.344119, 41.672474 ], [ 125.317018, 41.676944 ], [ 125.332416, 41.711354 ], [ 125.336112, 41.768067 ], [ 125.336112, 41.768067 ], [ 125.323177, 41.771191 ], [ 125.323177, 41.771191 ], [ 125.319482, 41.776993 ], [ 125.319482, 41.776993 ], [ 125.294844, 41.822945 ], [ 125.307779, 41.924548 ], [ 125.35151, 41.92811 ], [ 125.291764, 41.958825 ], [ 125.29854, 41.974399 ], [ 125.369989, 42.002868 ], [ 125.363213, 42.017097 ], [ 125.416184, 42.063766 ], [ 125.414336, 42.101964 ], [ 125.446365, 42.098411 ], [ 125.490097, 42.136145 ], [ 125.458068, 42.160105 ], [ 125.458068, 42.160105 ], [ 125.41372, 42.156112 ], [ 125.368141, 42.182726 ], [ 125.357054, 42.145464 ], [ 125.305931, 42.146351 ], [ 125.312706, 42.197359 ], [ 125.280677, 42.175187 ], [ 125.312706, 42.219966 ], [ 125.27575, 42.231045 ], [ 125.27575, 42.266928 ], [ 125.299156, 42.289953 ], [ 125.264047, 42.312528 ], [ 125.224011, 42.30102 ], [ 125.175352, 42.308102 ], [ 125.167345, 42.351903 ], [ 125.203685, 42.366938 ], [ 125.185823, 42.38197 ], [ 125.186439, 42.427928 ], [ 125.140243, 42.44692 ], [ 125.150098, 42.458842 ], [ 125.105135, 42.490624 ], [ 125.068794, 42.499449 ], [ 125.090968, 42.515773 ], [ 125.066946, 42.534738 ], [ 125.089736, 42.567803 ], [ 125.082961, 42.591159 ], [ 125.097127, 42.622433 ], [ 125.038613, 42.615387 ], [ 125.010896, 42.63212 ], [ 125.014592, 42.666014 ], [ 124.99057, 42.677455 ], [ 124.968396, 42.722756 ], [ 124.996729, 42.745174 ], [ 124.975171, 42.802722 ], [ 124.92836, 42.819844 ], [ 124.897563, 42.787791 ], [ 124.874157, 42.789987 ], [ 124.856911, 42.824234 ], [ 124.84952, 42.882585 ], [ 124.87231, 42.962344 ], [ 124.869846, 42.988178 ], [ 124.840897, 43.032377 ], [ 124.88894, 43.074796 ], [ 124.882781, 43.13422 ], [ 124.785462, 43.117185 ], [ 124.755281, 43.074359 ], [ 124.719557, 43.069987 ], [ 124.686912, 43.051185 ], [ 124.677673, 43.002185 ], [ 124.658579, 42.972854 ], [ 124.635173, 42.972854 ], [ 124.632093, 42.949642 ], [ 124.607456, 42.937376 ], [ 124.586514, 42.905384 ], [ 124.466406, 42.847054 ], [ 124.435609, 42.880831 ], [ 124.371551, 42.880831 ], [ 124.38079, 42.912835 ], [ 124.431913, 42.930803 ], [ 124.442384, 42.958841 ], [ 124.42329, 42.975482 ], [ 124.369703, 42.972854 ], [ 124.333363, 42.997371 ], [ 124.425754, 43.076107 ], [ 124.366007, 43.121554 ], [ 124.273617, 43.17875 ], [ 124.287167, 43.207983 ], [ 124.27608, 43.233278 ], [ 124.228653, 43.235022 ], [ 124.215102, 43.255947 ], [ 124.168291, 43.244177 ], [ 124.114088, 43.247229 ], [ 124.117168, 43.2773 ], [ 124.099306, 43.292983 ], [ 124.032784, 43.280786 ], [ 123.964415, 43.34088 ], [ 123.896046, 43.361333 ], [ 123.881263, 43.392218 ], [ 123.881263, 43.392218 ], [ 123.852314, 43.406133 ], [ 123.857858, 43.459153 ], [ 123.857858, 43.459153 ], [ 123.79688, 43.489988 ], [ 123.747604, 43.472184 ], [ 123.749452, 43.439167 ], [ 123.710032, 43.417001 ], [ 123.703873, 43.37047 ], [ 123.608402, 43.366119 ], [ 123.54496, 43.415262 ], [ 123.519707, 43.402219 ], [ 123.486446, 43.44525 ], [ 123.442098, 43.437863 ], [ 123.419925, 43.410046 ], [ 123.382968, 43.469143 ], [ 123.36449, 43.483475 ], [ 123.315831, 43.492159 ], [ 123.329998, 43.519071 ], [ 123.304744, 43.550742 ], [ 123.360179, 43.567223 ], [ 123.452569, 43.545971 ], [ 123.452569, 43.545971 ], [ 123.461193, 43.568523 ], [ 123.434091, 43.575461 ], [ 123.421157, 43.598435 ], [ 123.5117, 43.592801 ], [ 123.510468, 43.624867 ], [ 123.536953, 43.633964 ], [ 123.518475, 43.682024 ], [ 123.520323, 43.708419 ], [ 123.48275, 43.737396 ], [ 123.498149, 43.771114 ], [ 123.461809, 43.822518 ], [ 123.467968, 43.853599 ], [ 123.397135, 43.954929 ], [ 123.37065, 43.970006 ], [ 123.400831, 43.979481 ], [ 123.365722, 44.013922 ], [ 123.331229, 44.028984 ], [ 123.32815, 44.084035 ], [ 123.350939, 44.092633 ], [ 123.362642, 44.133452 ], [ 123.386664, 44.161794 ], [ 123.323838, 44.179823 ], [ 123.286882, 44.211574 ], [ 123.277027, 44.25274 ], [ 123.196955, 44.34483 ], [ 123.128585, 44.367081 ], [ 123.114419, 44.40258 ], [ 123.142136, 44.428228 ], [ 123.125506, 44.455147 ], [ 123.137209, 44.486322 ], [ 123.12489, 44.5098 ], [ 123.06576, 44.505959 ], [ 123.025108, 44.493153 ], [ 122.85634, 44.398304 ], [ 122.76087, 44.369648 ], [ 122.702971, 44.319145 ], [ 122.675254, 44.285738 ], [ 122.641993, 44.283595 ], [ 122.515726, 44.251025 ], [ 122.483081, 44.236877 ], [ 122.319241, 44.233018 ], [ 122.271198, 44.255741 ], [ 122.291524, 44.310152 ], [ 122.294604, 44.41113 ], [ 122.28598, 44.477783 ], [ 122.228082, 44.480345 ], [ 122.224386, 44.526016 ], [ 122.196053, 44.559712 ], [ 122.13138, 44.577619 ], [ 122.113517, 44.615546 ], [ 122.103046, 44.67388 ], [ 122.117213, 44.701961 ], [ 122.161561, 44.728328 ], [ 122.152322, 44.744057 ], [ 122.10243, 44.736406 ], [ 122.110438, 44.767856 ], [ 122.142467, 44.753833 ], [ 122.168952, 44.770405 ], [ 122.099967, 44.7823 ], [ 122.098119, 44.81882 ], [ 122.04946, 44.912985 ], [ 122.079025, 44.914256 ], [ 122.087032, 44.95281 ], [ 122.074713, 45.006573 ], [ 122.098735, 45.02138 ], [ 122.119677, 45.068739 ], [ 122.109822, 45.142236 ], [ 122.143082, 45.183167 ], [ 122.192358, 45.180636 ], [ 122.22993, 45.206784 ], [ 122.239169, 45.276313 ], [ 122.147394, 45.295682 ], [ 122.146778, 45.374352 ], [ 122.180039, 45.409655 ], [ 122.168336, 45.439897 ], [ 122.064242, 45.472641 ], [ 122.002648, 45.507882 ], [ 121.993409, 45.552741 ], [ 121.966308, 45.596308 ], [ 121.995873, 45.59882 ], [ 122.003264, 45.623102 ], [ 121.970004, 45.692956 ], [ 121.934279, 45.71051 ], [ 121.867142, 45.719703 ], [ 121.812323, 45.704659 ], [ 121.811091, 45.687103 ], [ 121.713773, 45.701734 ], [ 121.666345, 45.727641 ], [ 121.644172, 45.752284 ], [ 121.657106, 45.770238 ], [ 121.697142, 45.76314 ], [ 121.754425, 45.794862 ], [ 121.766744, 45.830318 ], [ 121.766744, 45.830318 ], [ 121.769823, 45.84366 ], [ 121.817251, 45.875336 ], [ 121.805548, 45.900746 ], [ 121.821562, 45.918235 ], [ 121.809243, 45.961102 ], [ 121.761816, 45.998947 ], [ 121.819098, 46.023054 ], [ 121.843736, 46.024301 ], [ 121.864062, 46.002272 ], [ 121.923808, 46.004767 ], [ 121.92812, 45.988552 ], [ 122.040221, 45.959022 ], [ 122.085184, 45.912406 ], [ 122.091344, 45.882002 ], [ 122.200981, 45.857 ], [ 122.236705, 45.831569 ], [ 122.253952, 45.7982 ], [ 122.301379, 45.813218 ], [ 122.337719, 45.859917 ], [ 122.372828, 45.856166 ], [ 122.362357, 45.917403 ], [ 122.446125, 45.916986 ], [ 122.496016, 45.85825 ], [ 122.504639, 45.786933 ], [ 122.522501, 45.786933 ], [ 122.556378, 45.82156 ], [ 122.603189, 45.778169 ], [ 122.640761, 45.771072 ], [ 122.650001, 45.731401 ], [ 122.671558, 45.70048 ], [ 122.741775, 45.705077 ], [ 122.751015, 45.735996 ], [ 122.792283, 45.766063 ], [ 122.752246, 45.834905 ], [ 122.772572, 45.856583 ], [ 122.80029, 45.856583 ], [ 122.828623, 45.912406 ], [ 122.792898, 46.073313 ], [ 123.04605, 46.099878 ], [ 123.070071, 46.123527 ], [ 123.112571, 46.130163 ], [ 123.102716, 46.172037 ], [ 123.127354, 46.174523 ], [ 123.128585, 46.210565 ], [ 123.178476, 46.248239 ], [ 123.248078, 46.273065 ], [ 123.286266, 46.250308 ], [ 123.320758, 46.254447 ], [ 123.357099, 46.232096 ], [ 123.357099, 46.232096 ], [ 123.430396, 46.243687 ], [ 123.452569, 46.233338 ], [ 123.499381, 46.259826 ], [ 123.569598, 46.223816 ], [ 123.569598, 46.223816 ], [ 123.604706, 46.251964 ], [ 123.673692, 46.258585 ], [ 123.726047, 46.255688 ], [ 123.775938, 46.263136 ], [ 123.84985, 46.302428 ], [ 123.896046, 46.303668 ], [ 123.917604, 46.25693 ], [ 123.936082, 46.286715 ], [ 123.960103, 46.288369 ], [ 123.952096, 46.256516 ], [ 123.979814, 46.228784 ], [ 123.956408, 46.206009 ], [ 123.971806, 46.170379 ], [ 124.001987, 46.166649 ], [ 123.991516, 46.143019 ], [ 124.01677, 46.118549 ], [ 123.99398, 46.101123 ], [ 124.015538, 46.088257 ], [ 124.009995, 46.057534 ], [ 124.034016, 46.045074 ], [ 124.040176, 46.01973 ], [ 123.989053, 46.011833 ], [ 124.011842, 45.981899 ], [ 123.973654, 45.973997 ], [ 123.968727, 45.936551 ], [ 123.996444, 45.906993 ], [ 124.061118, 45.886168 ], [ 124.067277, 45.840325 ], [ 124.03648, 45.83824 ], [ 124.064197, 45.802372 ], [ 124.001987, 45.770655 ], [ 124.014922, 45.749779 ], [ 124.054342, 45.751449 ], [ 124.098074, 45.722628 ], [ 124.10177, 45.700898 ], [ 124.13503, 45.690448 ], [ 124.122096, 45.669123 ], [ 124.147349, 45.665359 ], [ 124.128255, 45.641933 ], [ 124.162132, 45.616404 ], [ 124.226805, 45.633564 ], [ 124.238508, 45.591702 ], [ 124.273001, 45.584163 ], [ 124.264377, 45.555256 ], [ 124.287783, 45.539329 ], [ 124.348761, 45.546874 ], [ 124.369087, 45.512915 ], [ 124.352457, 45.496557 ], [ 124.374015, 45.45795 ], [ 124.398652, 45.440737 ], [ 124.480572, 45.456271 ], [ 124.507058, 45.424778 ], [ 124.544014, 45.411756 ], [ 124.579738, 45.424358 ], [ 124.575427, 45.451234 ], [ 124.625318, 45.437377 ], [ 124.690607, 45.452493 ], [ 124.729412, 45.444096 ], [ 124.776223, 45.468024 ], [ 124.792853, 45.436958 ], [ 124.839665, 45.455852 ], [ 124.886476, 45.442836 ], [ 124.884628, 45.495299 ], [ 124.911114, 45.535976 ], [ 124.936983, 45.53388 ], [ 124.961005, 45.495299 ], [ 125.025678, 45.493201 ], [ 125.0497, 45.428558 ], [ 125.08912, 45.420998 ], [ 125.06633, 45.39915 ], [ 125.097127, 45.38276 ], [ 125.137779, 45.409655 ], [ 125.189518, 45.39915 ], [ 125.248649, 45.417637 ], [ 125.301619, 45.402092 ], [ 125.319482, 45.422678 ], [ 125.361981, 45.392847 ], [ 125.398322, 45.416797 ], [ 125.434662, 45.462988 ], [ 125.424807, 45.485649 ], [ 125.480242, 45.486488 ], [ 125.497488, 45.469283 ], [ 125.583104, 45.491942 ], [ 125.61698, 45.517947 ], [ 125.660096, 45.507043 ], [ 125.687813, 45.514173 ], [ 125.711835, 45.477677 ], [ 125.712451, 45.389485 ], [ 125.695205, 45.352066 ], [ 125.726001, 45.336503 ], [ 125.761726, 45.291472 ], [ 125.815929, 45.264942 ], [ 125.823936, 45.237978 ], [ 125.849805, 45.23882 ], [ 125.915095, 45.196664 ], [ 125.957595, 45.201303 ], [ 125.992703, 45.192447 ], [ 125.998247, 45.162072 ], [ 126.047522, 45.170933 ], [ 126.091869, 45.149411 ], [ 126.142992, 45.147723 ], [ 126.166398, 45.13337 ], [ 126.225528, 45.154054 ], [ 126.235383, 45.140125 ], [ 126.285274, 45.162494 ], [ 126.293282, 45.180214 ], [ 126.356107, 45.185698 ], [ 126.402919, 45.222805 ], [ 126.519331, 45.248091 ], [ 126.540273, 45.23882 ], [ 126.569222, 45.252725 ], [ 126.644983, 45.225334 ], [ 126.640055, 45.214373 ], [ 126.685635, 45.187807 ], [ 126.732446, 45.187385 ], [ 126.787265, 45.159118 ], [ 126.792808, 45.135481 ], [ 126.85625, 45.145613 ], [ 126.96404, 45.132104 ], [ 126.970815, 45.070852 ], [ 126.984981, 45.067893 ], [ 127.018242, 45.024341 ], [ 127.050271, 45.004034 ], [ 127.092771, 44.94688 ], [ 127.073061, 44.907051 ], [ 127.021938, 44.898997 ], [ 126.999764, 44.87398 ], [ 126.984366, 44.823914 ], [ 126.9973, 44.764882 ], [ 127.041032, 44.712169 ], [ 127.030561, 44.673454 ], [ 127.044112, 44.653874 ], [ 127.041648, 44.591258 ], [ 127.049655, 44.566961 ], [ 127.089691, 44.593816 ], [ 127.094619, 44.615972 ], [ 127.138966, 44.607451 ], [ 127.182082, 44.644507 ], [ 127.228893, 44.642804 ], [ 127.214111, 44.624917 ], [ 127.261538, 44.61299 ], [ 127.275705, 44.640249 ], [ 127.392733, 44.632158 ], [ 127.557189, 44.575488 ], [ 127.570124, 44.55033 ], [ 127.536247, 44.522176 ], [ 127.485124, 44.528576 ], [ 127.465414, 44.516628 ], [ 127.463566, 44.484615 ], [ 127.50853, 44.437202 ], [ 127.486356, 44.410275 ], [ 127.579363, 44.310581 ], [ 127.623711, 44.278025 ], [ 127.59045, 44.227872 ], [ 127.626174, 44.187977 ], [ 127.641573, 44.193555 ], [ 127.681609, 44.166946 ], [ 127.712406, 44.199133 ], [ 127.735811, 44.11412 ], [ 127.729036, 44.09908 ], [ 127.783239, 44.071997 ], [ 127.808492, 44.086615 ], [ 127.846065, 44.081886 ], [ 127.862695, 44.062967 ], [ 127.912586, 44.064687 ], [ 127.950158, 44.088334 ], [ 128.042549, 44.103807 ], [ 128.091208, 44.133022 ], [ 128.088129, 44.158359 ], [ 128.060411, 44.168663 ], [ 128.09244, 44.181539 ], [ 128.104143, 44.230017 ], [ 128.064107, 44.251454 ], [ 128.101679, 44.293449 ], [ 128.065339, 44.307155 ], [ 128.049941, 44.349965 ], [ 128.074578, 44.370075 ], [ 128.094904, 44.354673 ], [ 128.137404, 44.357668 ], [ 128.172512, 44.34697 ], [ 128.211317, 44.431647 ], [ 128.228563, 44.445748 ], [ 128.293237, 44.467961 ], [ 128.295084, 44.480772 ], [ 128.372693, 44.514495 ], [ 128.397946, 44.483761 ], [ 128.427511, 44.473512 ], [ 128.463236, 44.431647 ], [ 128.457076, 44.409848 ], [ 128.481714, 44.375637 ], [ 128.475555, 44.346114 ], [ 128.446605, 44.339694 ], [ 128.472475, 44.320001 ], [ 128.453997, 44.257884 ], [ 128.471859, 44.247596 ], [ 128.450301, 44.203423 ], [ 128.471859, 44.157501 ], [ 128.529141, 44.112401 ], [ 128.574721, 44.047914 ], [ 128.584576, 43.990246 ], [ 128.610445, 43.960529 ], [ 128.64001, 43.948035 ], [ 128.636315, 43.891132 ], [ 128.696061, 43.903207 ], [ 128.729938, 43.889838 ], [ 128.760734, 43.857482 ], [ 128.719467, 43.816905 ], [ 128.739177, 43.806972 ], [ 128.760119, 43.755554 ], [ 128.729322, 43.736964 ], [ 128.768126, 43.732207 ], [ 128.78722, 43.686784 ], [ 128.821097, 43.637429 ], [ 128.834647, 43.587599 ], [ 128.878379, 43.539898 ], [ 128.949828, 43.553779 ], [ 128.962763, 43.53903 ], [ 129.013886, 43.522976 ], [ 129.037907, 43.540332 ], [ 129.093958, 43.547706 ], [ 129.145081, 43.570258 ], [ 129.169102, 43.561585 ], [ 129.23008, 43.593234 ], [ 129.232544, 43.635263 ], [ 129.217146, 43.648689 ], [ 129.214066, 43.695006 ], [ 129.232544, 43.709284 ], [ 129.211602, 43.784509 ], [ 129.254718, 43.819496 ], [ 129.289826, 43.797038 ], [ 129.30892, 43.812155 ], [ 129.348341, 43.798333 ], [ 129.406855, 43.819496 ], [ 129.417942, 43.843672 ], [ 129.449971, 43.850578 ], [ 129.467833, 43.874741 ], [ 129.529427, 43.870427 ], [ 129.650767, 43.873016 ], [ 129.699426, 43.8838 ], [ 129.743158, 43.876035 ], [ 129.739462, 43.895876 ], [ 129.780114, 43.892857 ], [ 129.802904, 43.964837 ], [ 129.868193, 44.012631 ], [ 129.881128, 44.000148 ], [ 129.907614, 44.023821 ], [ 129.951345, 44.027263 ], [ 129.979062, 44.015644 ], [ 130.017867, 43.961821 ], [ 130.022794, 43.917866 ], [ 130.009243, 43.889407 ], [ 130.027722, 43.851872 ], [ 130.079461, 43.835039 ], [ 130.110873, 43.852735 ], [ 130.116417, 43.878192 ], [ 130.143518, 43.878624 ], [ 130.153373, 43.915711 ], [ 130.208192, 43.948466 ], [ 130.262395, 43.949328 ], [ 130.27225, 43.981634 ], [ 130.307358, 44.002731 ], [ 130.319061, 44.03974 ], [ 130.365256, 44.044042 ], [ 130.364025, 43.992399 ], [ 130.338155, 43.963975 ], [ 130.381887, 43.910106 ], [ 130.368336, 43.894151 ], [ 130.386198, 43.85403 ], [ 130.362793, 43.844967 ], [ 130.381887, 43.817768 ], [ 130.382503, 43.777164 ], [ 130.423155, 43.745179 ], [ 130.394206, 43.703227 ], [ 130.412684, 43.652586 ], [ 130.437937, 43.646091 ], [ 130.488444, 43.65605 ], [ 130.501995, 43.636563 ], [ 130.57098, 43.626167 ], [ 130.57098, 43.626167 ], [ 130.630726, 43.622268 ], [ 130.623335, 43.589767 ], [ 130.665835, 43.583698 ], [ 130.671378, 43.565054 ], [ 130.727429, 43.560284 ], [ 130.776704, 43.52341 ], [ 130.822899, 43.503446 ], [ 130.841378, 43.454374 ], [ 130.864167, 43.437863 ], [ 130.907283, 43.434387 ], [ 130.959638, 43.48608 ], [ 131.026775, 43.508655 ], [ 131.142572, 43.425695 ], [ 131.175217, 43.444816 ], [ 131.201086, 43.442209 ], [ 131.234963, 43.475224 ], [ 131.294093, 43.470012 ], [ 131.304564, 43.502144 ], [ 131.31873, 43.499539 ], [ 131.314419, 43.461325 ], [ 131.295941, 43.441774 ], [ 131.314419, 43.392653 ], [ 131.275615, 43.369165 ], [ 131.269455, 43.297775 ], [ 131.255289, 43.265099 ], [ 131.206014, 43.237202 ], [ 131.201086, 43.203185 ], [ 131.218948, 43.191405 ], [ 131.207861, 43.1316 ], [ 131.173985, 43.111506 ], [ 131.171521, 43.06955 ], [ 131.120398, 43.068238 ], [ 131.102536, 43.021002 ], [ 131.11855, 43.007875 ], [ 131.115471, 42.975482 ], [ 131.151195, 42.968475 ], [ 131.14442, 42.939566 ], [ 131.114855, 42.915027 ], [ 131.034167, 42.929051 ], [ 131.017536, 42.915027 ], [ 131.045869, 42.866796 ], [ 130.981812, 42.857145 ], [ 130.949783, 42.876884 ], [ 130.890653, 42.852758 ], [ 130.845073, 42.881269 ], [ 130.801957, 42.879515 ], [ 130.784095, 42.842227 ], [ 130.75453, 42.845738 ], [ 130.719422, 42.831695 ], [ 130.708335, 42.846615 ], [ 130.665835, 42.847932 ], [ 130.603625, 42.819405 ], [ 130.562357, 42.815015 ], [ 130.532792, 42.787352 ], [ 130.46627, 42.772417 ], [ 130.40714, 42.731548 ], [ 130.425003, 42.706926 ], [ 130.464423, 42.688453 ], [ 130.529096, 42.703408 ], [ 130.592538, 42.671295 ], [ 130.633806, 42.603494 ], [ 130.622719, 42.573092 ], [ 130.570364, 42.557224 ], [ 130.565437, 42.506509 ], [ 130.599929, 42.486211 ], [ 130.600545, 42.450453 ], [ 130.645509, 42.426603 ], [ 130.581451, 42.435437 ], [ 130.585763, 42.485328 ], [ 130.558661, 42.495919 ], [ 130.556198, 42.523712 ], [ 130.520473, 42.583228 ], [ 130.522937, 42.622433 ], [ 130.482285, 42.626837 ], [ 130.459495, 42.588075 ], [ 130.476125, 42.570007 ], [ 130.435474, 42.553257 ], [ 130.423771, 42.574855 ], [ 130.44656, 42.607459 ], [ 130.420691, 42.617148 ], [ 130.388046, 42.603054 ], [ 130.373264, 42.630799 ], [ 130.333228, 42.64973 ], [ 130.290112, 42.702968 ], [ 130.257467, 42.710884 ], [ 130.242069, 42.738582 ], [ 130.245148, 42.799209 ], [ 130.258083, 42.860655 ], [ 130.277793, 42.892232 ], [ 130.258083, 42.90626 ], [ 130.21004, 42.902315 ], [ 130.17062, 42.912397 ], [ 130.136127, 42.90363 ], [ 130.10225, 42.922916 ], [ 130.127504, 42.932556 ], [ 130.120729, 42.954461 ], [ 130.144134, 42.976357 ], [ 130.10841, 42.989929 ], [ 130.072685, 42.971541 ], [ 130.027106, 42.9676 ], [ 130.002468, 42.981174 ], [ 129.963664, 42.978547 ], [ 129.954425, 43.010938 ], [ 129.897143, 43.001748 ], [ 129.903918, 42.968475 ], [ 129.868193, 42.97373 ], [ 129.856491, 42.951833 ], [ 129.874969, 42.923792 ], [ 129.846636, 42.918533 ], [ 129.835549, 42.866796 ], [ 129.816454, 42.851003 ], [ 129.810911, 42.795257 ], [ 129.78381, 42.762752 ], [ 129.767179, 42.707806 ], [ 129.796744, 42.681854 ], [ 129.754245, 42.645768 ], [ 129.786889, 42.615387 ], [ 129.746237, 42.58455 ], [ 129.749933, 42.546644 ], [ 129.738846, 42.500332 ], [ 129.748701, 42.471204 ], [ 129.704354, 42.427045 ], [ 129.643991, 42.43102 ], [ 129.624281, 42.459284 ], [ 129.60026, 42.41114 ], [ 129.546057, 42.361632 ], [ 129.49863, 42.412023 ], [ 129.452434, 42.441179 ], [ 129.400695, 42.449128 ], [ 129.368051, 42.425719 ], [ 129.376058, 42.447803 ], [ 129.344029, 42.451777 ], [ 129.356348, 42.427045 ], [ 129.331094, 42.429695 ], [ 129.30892, 42.403628 ], [ 129.326167, 42.389927 ], [ 129.240551, 42.376223 ], [ 129.231312, 42.356325 ], [ 129.260261, 42.335536 ], [ 129.208522, 42.293052 ], [ 129.231312, 42.283755 ], [ 129.215914, 42.265157 ], [ 129.183269, 42.262056 ], [ 129.181421, 42.242122 ], [ 129.209138, 42.237692 ], [ 129.215914, 42.208442 ], [ 129.166639, 42.188047 ], [ 129.113668, 42.140583 ], [ 129.048378, 42.137476 ], [ 129.039139, 42.107736 ], [ 129.008958, 42.09175 ], [ 128.971386, 42.097079 ], [ 128.954755, 42.083756 ], [ 128.952908, 42.025545 ], [ 128.898089, 42.016653 ], [ 128.795227, 42.042436 ], [ 128.779213, 42.033546 ], [ 128.737945, 42.050435 ], [ 128.70222, 42.02021 ], [ 128.658489, 42.018876 ], [ 128.637547, 42.035324 ], [ 128.60675, 42.02999 ], [ 128.598127, 42.007315 ], [ 128.49896, 42.000644 ], [ 128.466316, 42.020654 ], [ 128.405338, 42.018876 ], [ 128.294468, 42.026434 ], [ 128.090593, 42.022877 ], [ 128.033926, 42.000199 ], [ 128.106607, 41.949923 ], [ 128.115846, 41.896935 ], [ 128.104143, 41.843457 ], [ 128.112766, 41.793504 ], [ 128.147875, 41.78101 ], [ 128.163889, 41.721628 ], [ 128.208853, 41.688565 ], [ 128.248889, 41.681414 ], [ 128.30186, 41.627756 ], [ 128.317874, 41.575844 ], [ 128.301244, 41.544498 ], [ 128.238418, 41.497898 ], [ 128.243345, 41.477276 ], [ 128.203925, 41.410882 ], [ 128.169433, 41.404149 ], [ 128.114614, 41.364186 ], [ 128.090593, 41.374516 ], [ 128.110919, 41.393375 ], [ 128.040085, 41.393375 ], [ 128.000049, 41.442741 ], [ 127.991426, 41.421204 ], [ 127.970484, 41.438704 ], [ 127.93168, 41.444984 ], [ 127.909506, 41.42973 ], [ 127.882405, 41.448124 ], [ 127.86947, 41.4037 ], [ 127.854688, 41.420755 ], [ 127.780159, 41.427038 ], [ 127.684073, 41.422999 ], [ 127.636645, 41.413575 ], [ 127.618783, 41.432871 ], [ 127.563964, 41.432871 ], [ 127.547334, 41.477276 ], [ 127.526392, 41.467859 ], [ 127.465414, 41.479069 ], [ 127.459255, 41.461581 ], [ 127.419835, 41.460235 ], [ 127.405668, 41.478621 ], [ 127.360088, 41.479518 ], [ 127.360704, 41.466065 ], [ 127.296031, 41.486243 ], [ 127.253531, 41.486691 ], [ 127.28864, 41.501932 ], [ 127.241212, 41.520754 ], [ 127.188241, 41.527475 ], [ 127.164836, 41.542706 ], [ 127.14143, 41.530163 ], [ 127.125416, 41.566442 ], [ 127.178386, 41.600015 ], [ 127.135887, 41.600463 ], [ 127.127263, 41.622388 ], [ 127.093387, 41.629993 ], [ 127.103242, 41.647883 ], [ 127.037952, 41.676944 ], [ 127.057662, 41.703758 ], [ 127.050887, 41.744852 ], [ 127.005923, 41.749317 ], [ 126.979438, 41.776993 ], [ 126.940018, 41.773423 ], [ 126.952953, 41.804212 ], [ 126.931395, 41.812687 ], [ 126.861178, 41.768067 ], [ 126.83962, 41.727435 ], [ 126.809439, 41.749317 ], [ 126.8002, 41.702865 ], [ 126.723207, 41.753335 ], [ 126.694874, 41.751103 ], [ 126.690562, 41.728328 ], [ 126.724439, 41.710907 ], [ 126.688099, 41.674262 ], [ 126.644983, 41.661297 ], [ 126.608027, 41.669345 ], [ 126.592628, 41.624624 ], [ 126.564295, 41.608965 ], [ 126.582773, 41.563307 ], [ 126.559983, 41.548081 ], [ 126.497158, 41.406842 ], [ 126.539041, 41.366881 ], [ 126.524259, 41.349362 ], [ 126.497158, 41.374965 ], [ 126.437411, 41.353405 ], [ 126.373354, 41.289133 ], [ 126.35426, 41.244599 ], [ 126.332086, 41.236949 ], [ 126.295129, 41.171661 ], [ 126.188572, 41.114875 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"230000\", \"name\": \"黑龙江省\", \"center\": [ 126.642464, 45.756967 ], \"centroid\": [ 127.693016, 48.04047 ], \"childrenNum\": 13, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 7, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 123.569598, 46.223816 ], [ 123.569598, 46.223816 ], [ 123.499381, 46.259826 ], [ 123.452569, 46.233338 ], [ 123.430396, 46.243687 ], [ 123.357099, 46.232096 ], [ 123.357099, 46.232096 ], [ 123.320758, 46.254447 ], [ 123.286266, 46.250308 ], [ 123.248078, 46.273065 ], [ 123.178476, 46.248239 ], [ 123.142136, 46.298293 ], [ 123.089781, 46.347888 ], [ 123.011557, 46.434984 ], [ 123.010325, 46.524823 ], [ 123.002318, 46.574624 ], [ 123.052825, 46.579972 ], [ 123.04605, 46.617803 ], [ 123.077462, 46.622324 ], [ 123.098404, 46.603002 ], [ 123.18094, 46.614103 ], [ 123.228368, 46.588198 ], [ 123.279491, 46.616981 ], [ 123.276411, 46.660947 ], [ 123.318295, 46.662179 ], [ 123.366338, 46.677784 ], [ 123.474743, 46.686817 ], [ 123.603475, 46.68928 ], [ 123.631808, 46.728675 ], [ 123.629344, 46.813524 ], [ 123.580069, 46.827447 ], [ 123.625648, 46.847508 ], [ 123.599163, 46.868378 ], [ 123.605322, 46.891286 ], [ 123.576989, 46.891286 ], [ 123.575757, 46.845461 ], [ 123.562823, 46.82581 ], [ 123.506772, 46.827038 ], [ 123.483366, 46.84587 ], [ 123.52833, 46.944836 ], [ 123.487678, 46.959951 ], [ 123.42362, 46.934212 ], [ 123.337389, 46.988943 ], [ 123.301664, 46.999965 ], [ 123.304128, 46.964852 ], [ 123.360179, 46.970978 ], [ 123.404526, 46.935438 ], [ 123.40699, 46.906416 ], [ 123.374345, 46.837683 ], [ 123.341084, 46.826628 ], [ 123.295505, 46.865105 ], [ 123.221592, 46.850373 ], [ 123.22344, 46.821305 ], [ 123.198802, 46.803283 ], [ 123.163694, 46.74016 ], [ 123.103332, 46.734828 ], [ 123.076846, 46.745082 ], [ 123.026339, 46.718829 ], [ 123.00355, 46.730726 ], [ 122.996774, 46.761483 ], [ 122.906847, 46.80738 ], [ 122.893913, 46.895376 ], [ 122.895144, 46.960359 ], [ 122.83971, 46.937072 ], [ 122.791051, 46.941567 ], [ 122.798442, 46.9575 ], [ 122.77442, 46.973837 ], [ 122.778116, 47.002822 ], [ 122.845869, 47.046881 ], [ 122.852645, 47.072158 ], [ 122.821232, 47.065636 ], [ 122.710363, 47.093349 ], [ 122.710363, 47.093349 ], [ 122.679566, 47.094164 ], [ 122.615508, 47.124306 ], [ 122.582863, 47.158092 ], [ 122.582863, 47.158092 ], [ 122.531124, 47.198771 ], [ 122.498479, 47.255262 ], [ 122.462755, 47.27841 ], [ 122.441197, 47.310476 ], [ 122.441197, 47.310476 ], [ 122.418407, 47.350632 ], [ 122.507103, 47.401291 ], [ 122.543443, 47.495589 ], [ 122.59395, 47.54732 ], [ 122.765181, 47.614333 ], [ 122.848949, 47.67441 ], [ 122.926557, 47.697777 ], [ 123.041122, 47.746492 ], [ 123.161846, 47.781892 ], [ 123.214201, 47.824502 ], [ 123.256085, 47.876711 ], [ 123.300432, 47.953723 ], [ 123.537569, 48.021816 ], [ 123.579453, 48.045427 ], [ 123.705105, 48.152142 ], [ 123.746373, 48.197638 ], [ 123.862785, 48.271782 ], [ 124.019234, 48.39313 ], [ 124.07898, 48.43603 ], [ 124.136878, 48.463023 ], [ 124.25945, 48.536385 ], [ 124.25945, 48.536385 ], [ 124.314269, 48.503881 ], [ 124.302566, 48.456673 ], [ 124.330283, 48.435633 ], [ 124.309957, 48.413393 ], [ 124.331515, 48.380015 ], [ 124.317964, 48.35099 ], [ 124.353689, 48.315978 ], [ 124.365392, 48.283731 ], [ 124.422058, 48.245884 ], [ 124.412819, 48.219175 ], [ 124.418978, 48.181679 ], [ 124.467637, 48.178886 ], [ 124.471333, 48.133373 ], [ 124.430065, 48.12099 ], [ 124.415899, 48.08782 ], [ 124.46579, 48.098213 ], [ 124.478108, 48.123387 ], [ 124.505826, 48.124985 ], [ 124.529847, 48.146951 ], [ 124.512601, 48.164518 ], [ 124.547094, 48.200829 ], [ 124.579122, 48.262221 ], [ 124.558796, 48.268197 ], [ 124.579738, 48.297269 ], [ 124.540934, 48.335476 ], [ 124.547094, 48.35775 ], [ 124.51876, 48.378027 ], [ 124.52492, 48.426897 ], [ 124.507674, 48.445558 ], [ 124.555717, 48.467784 ], [ 124.533543, 48.515379 ], [ 124.548941, 48.535593 ], [ 124.520608, 48.556195 ], [ 124.579122, 48.596582 ], [ 124.601912, 48.632587 ], [ 124.624702, 48.701755 ], [ 124.612383, 48.747945 ], [ 124.656115, 48.783842 ], [ 124.644412, 48.80789 ], [ 124.654267, 48.83429 ], [ 124.697383, 48.841775 ], [ 124.715861, 48.885475 ], [ 124.709086, 48.920487 ], [ 124.744194, 48.920487 ], [ 124.756513, 48.967262 ], [ 124.808252, 49.020666 ], [ 124.828578, 49.077933 ], [ 124.809484, 49.115943 ], [ 124.847672, 49.129651 ], [ 124.860607, 49.166448 ], [ 124.906802, 49.184054 ], [ 124.983179, 49.162535 ], [ 125.039845, 49.17623 ], [ 125.034302, 49.157056 ], [ 125.117453, 49.126127 ], [ 125.158721, 49.144921 ], [ 125.187671, 49.186792 ], [ 125.219699, 49.189139 ], [ 125.233866, 49.255587 ], [ 125.214772, 49.277066 ], [ 125.261583, 49.322336 ], [ 125.256656, 49.359769 ], [ 125.277598, 49.379644 ], [ 125.25604, 49.395227 ], [ 125.256656, 49.437275 ], [ 125.270822, 49.454395 ], [ 125.228323, 49.487063 ], [ 125.211076, 49.539908 ], [ 125.233866, 49.536801 ], [ 125.23017, 49.595411 ], [ 125.205533, 49.593859 ], [ 125.16796, 49.629923 ], [ 125.15441, 49.616741 ], [ 125.127308, 49.655113 ], [ 125.132236, 49.672157 ], [ 125.164881, 49.669446 ], [ 125.189518, 49.652401 ], [ 125.185207, 49.634574 ], [ 125.219699, 49.669058 ], [ 125.225243, 49.726349 ], [ 125.204301, 49.734086 ], [ 125.221547, 49.754969 ], [ 125.222779, 49.799026 ], [ 125.177815, 49.829533 ], [ 125.239409, 49.844587 ], [ 125.225243, 49.867351 ], [ 125.245569, 49.87198 ], [ 125.212924, 49.907452 ], [ 125.225859, 49.922481 ], [ 125.199373, 49.935194 ], [ 125.190134, 49.959841 ], [ 125.231402, 49.957531 ], [ 125.241873, 49.987938 ], [ 125.278214, 49.996402 ], [ 125.297924, 50.014481 ], [ 125.283757, 50.036012 ], [ 125.25296, 50.041393 ], [ 125.289916, 50.057917 ], [ 125.315786, 50.04562 ], [ 125.328105, 50.065985 ], [ 125.283757, 50.070211 ], [ 125.287453, 50.093636 ], [ 125.258504, 50.103618 ], [ 125.27883, 50.127411 ], [ 125.311474, 50.140453 ], [ 125.376148, 50.137385 ], [ 125.335496, 50.161161 ], [ 125.382923, 50.172278 ], [ 125.39093, 50.199868 ], [ 125.417416, 50.195654 ], [ 125.448829, 50.216338 ], [ 125.442053, 50.260357 ], [ 125.466075, 50.266861 ], [ 125.463611, 50.295925 ], [ 125.530749, 50.331085 ], [ 125.520278, 50.3498 ], [ 125.546763, 50.358965 ], [ 125.522126, 50.404759 ], [ 125.536292, 50.420014 ], [ 125.567089, 50.402852 ], [ 125.583104, 50.409717 ], [ 125.562162, 50.438314 ], [ 125.580024, 50.449366 ], [ 125.627451, 50.443268 ], [ 125.654553, 50.471082 ], [ 125.699516, 50.487078 ], [ 125.740784, 50.523237 ], [ 125.754335, 50.506874 ], [ 125.770349, 50.531227 ], [ 125.794987, 50.532748 ], [ 125.829479, 50.56165 ], [ 125.807921, 50.60383 ], [ 125.814697, 50.62092 ], [ 125.793139, 50.643316 ], [ 125.804226, 50.658874 ], [ 125.789443, 50.679735 ], [ 125.825784, 50.70362 ], [ 125.78082, 50.725598 ], [ 125.795603, 50.738856 ], [ 125.758646, 50.746809 ], [ 125.804226, 50.773309 ], [ 125.828863, 50.756654 ], [ 125.846726, 50.769524 ], [ 125.836255, 50.793363 ], [ 125.890457, 50.805845 ], [ 125.878138, 50.816812 ], [ 125.913247, 50.825885 ], [ 125.939732, 50.85423 ], [ 125.961906, 50.901054 ], [ 125.997631, 50.872738 ], [ 125.996399, 50.906715 ], [ 126.02042, 50.927466 ], [ 126.042594, 50.92558 ], [ 126.068464, 50.967434 ], [ 126.041978, 50.981753 ], [ 126.033971, 51.011132 ], [ 126.059225, 51.043503 ], [ 125.976073, 51.084498 ], [ 125.993935, 51.119072 ], [ 125.970529, 51.123955 ], [ 125.946508, 51.108176 ], [ 125.909551, 51.138977 ], [ 125.864588, 51.146487 ], [ 125.850421, 51.21364 ], [ 125.819008, 51.227134 ], [ 125.761726, 51.226385 ], [ 125.76111, 51.261976 ], [ 125.76111, 51.261976 ], [ 125.740784, 51.27583 ], [ 125.740784, 51.27583 ], [ 125.700132, 51.327465 ], [ 125.700132, 51.327465 ], [ 125.626219, 51.380163 ], [ 125.626219, 51.380163 ], [ 125.623756, 51.387633 ], [ 125.623756, 51.387633 ], [ 125.62314, 51.398089 ], [ 125.62314, 51.398089 ], [ 125.600966, 51.410409 ], [ 125.600966, 51.410409 ], [ 125.60035, 51.413396 ], [ 125.60035, 51.413396 ], [ 125.595422, 51.416755 ], [ 125.595422, 51.416755 ], [ 125.559082, 51.461521 ], [ 125.559082, 51.461521 ], [ 125.528285, 51.488359 ], [ 125.424807, 51.562827 ], [ 125.38046, 51.585516 ], [ 125.35151, 51.623801 ], [ 125.316402, 51.610052 ], [ 125.289301, 51.633831 ], [ 125.228938, 51.640517 ], [ 125.214772, 51.627888 ], [ 125.175968, 51.639403 ], [ 125.130388, 51.635317 ], [ 125.12854, 51.659083 ], [ 125.098975, 51.658341 ], [ 125.060171, 51.59667 ], [ 125.073106, 51.553526 ], [ 125.047236, 51.529704 ], [ 125.004737, 51.529332 ], [ 124.983795, 51.508478 ], [ 124.928976, 51.498419 ], [ 124.917889, 51.474196 ], [ 124.942527, 51.447349 ], [ 124.885244, 51.40817 ], [ 124.864302, 51.37979 ], [ 124.783614, 51.392115 ], [ 124.76452, 51.38726 ], [ 124.752817, 51.35812 ], [ 124.693687, 51.3327 ], [ 124.62655, 51.327465 ], [ 124.58713, 51.363725 ], [ 124.555717, 51.375307 ], [ 124.490427, 51.380537 ], [ 124.478108, 51.36223 ], [ 124.443616, 51.35812 ], [ 124.426985, 51.331953 ], [ 124.430065, 51.301281 ], [ 124.406659, 51.272086 ], [ 124.339522, 51.293422 ], [ 124.297638, 51.298661 ], [ 124.271769, 51.308389 ], [ 124.239124, 51.344664 ], [ 124.192313, 51.33943 ], [ 124.128255, 51.347281 ], [ 124.090067, 51.3413 ], [ 124.071588, 51.320734 ], [ 123.994596, 51.322604 ], [ 123.939777, 51.313253 ], [ 123.926227, 51.300532 ], [ 123.887423, 51.320734 ], [ 123.842459, 51.367462 ], [ 123.794416, 51.361109 ], [ 123.711264, 51.398089 ], [ 123.660141, 51.342795 ], [ 123.661989, 51.319237 ], [ 123.582533, 51.306893 ], [ 123.582533, 51.294545 ], [ 123.46304, 51.286686 ], [ 123.440251, 51.270963 ], [ 123.414381, 51.278825 ], [ 123.376809, 51.266844 ], [ 123.339853, 51.27246 ], [ 123.294273, 51.254111 ], [ 123.231447, 51.268716 ], [ 123.231447, 51.279199 ], [ 123.127969, 51.297913 ], [ 123.069455, 51.321108 ], [ 123.002934, 51.31213 ], [ 122.965977, 51.345786 ], [ 122.965977, 51.386886 ], [ 122.946267, 51.405183 ], [ 122.903768, 51.415262 ], [ 122.900072, 51.445112 ], [ 122.871123, 51.455181 ], [ 122.854492, 51.477551 ], [ 122.880362, 51.511085 ], [ 122.858804, 51.524864 ], [ 122.880362, 51.537894 ], [ 122.874202, 51.561339 ], [ 122.832935, 51.581797 ], [ 122.85634, 51.606707 ], [ 122.820616, 51.633088 ], [ 122.816304, 51.655371 ], [ 122.778732, 51.698048 ], [ 122.749167, 51.746613 ], [ 122.771957, 51.779579 ], [ 122.732536, 51.832495 ], [ 122.725761, 51.87833 ], [ 122.706051, 51.890151 ], [ 122.729457, 51.919321 ], [ 122.726377, 51.978709 ], [ 122.683877, 51.974654 ], [ 122.664783, 51.99861 ], [ 122.650616, 52.058997 ], [ 122.625363, 52.067459 ], [ 122.643841, 52.111585 ], [ 122.629059, 52.13657 ], [ 122.690653, 52.140243 ], [ 122.73808, 52.153464 ], [ 122.769493, 52.179893 ], [ 122.766413, 52.232705 ], [ 122.787355, 52.252494 ], [ 122.76087, 52.26678 ], [ 122.710979, 52.256157 ], [ 122.67895, 52.276667 ], [ 122.585943, 52.266413 ], [ 122.560689, 52.282526 ], [ 122.478153, 52.29607 ], [ 122.484313, 52.341432 ], [ 122.447356, 52.394052 ], [ 122.419023, 52.375057 ], [ 122.378987, 52.395512 ], [ 122.367284, 52.413768 ], [ 122.342031, 52.414133 ], [ 122.326016, 52.459374 ], [ 122.310618, 52.475416 ], [ 122.207756, 52.469218 ], [ 122.178191, 52.48963 ], [ 122.168952, 52.513674 ], [ 122.140003, 52.510032 ], [ 122.142467, 52.495096 ], [ 122.107358, 52.452445 ], [ 122.080873, 52.440407 ], [ 122.091344, 52.427272 ], [ 122.040837, 52.413038 ], [ 122.035909, 52.377615 ], [ 121.976779, 52.343626 ], [ 121.94783, 52.298266 ], [ 121.901018, 52.280695 ], [ 121.841272, 52.282526 ], [ 121.769207, 52.308147 ], [ 121.714389, 52.318025 ], [ 121.715621, 52.342894 ], [ 121.658338, 52.3904 ], [ 121.678664, 52.419973 ], [ 121.63986, 52.44442 ], [ 121.590585, 52.443326 ], [ 121.565331, 52.460468 ], [ 121.519136, 52.456821 ], [ 121.495114, 52.484892 ], [ 121.474172, 52.482706 ], [ 121.416274, 52.499468 ], [ 121.411963, 52.52205 ], [ 121.353448, 52.534793 ], [ 121.323883, 52.573727 ], [ 121.280151, 52.586819 ], [ 121.225333, 52.577364 ], [ 121.182217, 52.59918 ], [ 121.237036, 52.619167 ], [ 121.29247, 52.651855 ], [ 121.309717, 52.676173 ], [ 121.373158, 52.683067 ], [ 121.455078, 52.73528 ], [ 121.476636, 52.772225 ], [ 121.511129, 52.779104 ], [ 121.537614, 52.801542 ], [ 121.591201, 52.824693 ], [ 121.620766, 52.853251 ], [ 121.604136, 52.872401 ], [ 121.610295, 52.892264 ], [ 121.66265, 52.912478 ], [ 121.677432, 52.948192 ], [ 121.715621, 52.997926 ], [ 121.785838, 53.018451 ], [ 121.817867, 53.061631 ], [ 121.775367, 53.089674 ], [ 121.784606, 53.104408 ], [ 121.753193, 53.147501 ], [ 121.722396, 53.145706 ], [ 121.665114, 53.170467 ], [ 121.660186, 53.195213 ], [ 121.67928, 53.199515 ], [ 121.679896, 53.240722 ], [ 121.642324, 53.262564 ], [ 121.615222, 53.258984 ], [ 121.575802, 53.29155 ], [ 121.504969, 53.323018 ], [ 121.499426, 53.337314 ], [ 121.589969, 53.350891 ], [ 121.697758, 53.392666 ], [ 121.754425, 53.389454 ], [ 121.816019, 53.41336 ], [ 121.875765, 53.426556 ], [ 122.026054, 53.428339 ], [ 122.077177, 53.422277 ], [ 122.111054, 53.426913 ], [ 122.161561, 53.468614 ], [ 122.227466, 53.461845 ], [ 122.266886, 53.470039 ], [ 122.350038, 53.505647 ], [ 122.37406, 53.47467 ], [ 122.435038, 53.444739 ], [ 122.496016, 53.458638 ], [ 122.5379, 53.453293 ], [ 122.608117, 53.465408 ], [ 122.673406, 53.459351 ], [ 122.763949, 53.463626 ], [ 122.826775, 53.457213 ], [ 122.894528, 53.462914 ], [ 122.943804, 53.483929 ], [ 123.052209, 53.506715 ], [ 123.093477, 53.508138 ], [ 123.137209, 53.498172 ], [ 123.179092, 53.509918 ], [ 123.231447, 53.549404 ], [ 123.274563, 53.563269 ], [ 123.309672, 53.56078 ], [ 123.394055, 53.538024 ], [ 123.454417, 53.536602 ], [ 123.47228, 53.509206 ], [ 123.499381, 53.497816 ], [ 123.510468, 53.509206 ], [ 123.490758, 53.542648 ], [ 123.517243, 53.558292 ], [ 123.546808, 53.551537 ], [ 123.557895, 53.531978 ], [ 123.53141, 53.507071 ], [ 123.569598, 53.505291 ], [ 123.58746, 53.546915 ], [ 123.620721, 53.550115 ], [ 123.668764, 53.533756 ], [ 123.698329, 53.498528 ], [ 123.746373, 53.500308 ], [ 123.797495, 53.489983 ], [ 123.865249, 53.489627 ], [ 123.985973, 53.434401 ], [ 124.01369, 53.403371 ], [ 124.058038, 53.404085 ], [ 124.125791, 53.348033 ], [ 124.19416, 53.37339 ], [ 124.239124, 53.379817 ], [ 124.327819, 53.331954 ], [ 124.375863, 53.258984 ], [ 124.412203, 53.248601 ], [ 124.435609, 53.223886 ], [ 124.487348, 53.217436 ], [ 124.496587, 53.207759 ], [ 124.563108, 53.201666 ], [ 124.590209, 53.208476 ], [ 124.678905, 53.207043 ], [ 124.720789, 53.192344 ], [ 124.712165, 53.162574 ], [ 124.734339, 53.146783 ], [ 124.787926, 53.140681 ], [ 124.832889, 53.145347 ], [ 124.87231, 53.099018 ], [ 124.909266, 53.118059 ], [ 124.887708, 53.164368 ], [ 124.970244, 53.194137 ], [ 125.038613, 53.202741 ], [ 125.142091, 53.204175 ], [ 125.195062, 53.198439 ], [ 125.252344, 53.18051 ], [ 125.315786, 53.144989 ], [ 125.343503, 53.14463 ], [ 125.452524, 53.107641 ], [ 125.503647, 53.095424 ], [ 125.504263, 53.061271 ], [ 125.530749, 53.0512 ], [ 125.588647, 53.081047 ], [ 125.613901, 53.083564 ], [ 125.640386, 53.06199 ], [ 125.643466, 53.039686 ], [ 125.684118, 53.00801 ], [ 125.742632, 52.993964 ], [ 125.737088, 52.943504 ], [ 125.665023, 52.913561 ], [ 125.666871, 52.869872 ], [ 125.678574, 52.86084 ], [ 125.722306, 52.880347 ], [ 125.751255, 52.88143 ], [ 125.772197, 52.89804 ], [ 125.827631, 52.899123 ], [ 125.854117, 52.891542 ], [ 125.855349, 52.866259 ], [ 125.923718, 52.815651 ], [ 125.937269, 52.786705 ], [ 125.966834, 52.759914 ], [ 125.985312, 52.758465 ], [ 126.02042, 52.795753 ], [ 126.052449, 52.800095 ], [ 126.116507, 52.768243 ], [ 126.112195, 52.757016 ], [ 126.044442, 52.739628 ], [ 126.072775, 52.691048 ], [ 126.061688, 52.673271 ], [ 125.995783, 52.675085 ], [ 125.971145, 52.654033 ], [ 125.968682, 52.630429 ], [ 125.989008, 52.603178 ], [ 126.030891, 52.576273 ], [ 126.055529, 52.582455 ], [ 126.066616, 52.603905 ], [ 126.147304, 52.573 ], [ 126.213209, 52.525327 ], [ 126.192883, 52.492181 ], [ 126.205202, 52.466302 ], [ 126.268644, 52.475051 ], [ 126.326542, 52.424353 ], [ 126.353644, 52.389304 ], [ 126.348716, 52.357882 ], [ 126.320999, 52.342163 ], [ 126.327774, 52.310342 ], [ 126.4331, 52.298632 ], [ 126.436795, 52.277034 ], [ 126.401071, 52.279597 ], [ 126.357955, 52.264216 ], [ 126.312992, 52.235271 ], [ 126.306832, 52.205574 ], [ 126.34502, 52.192002 ], [ 126.403535, 52.185031 ], [ 126.457121, 52.165212 ], [ 126.499005, 52.16044 ], [ 126.556288, 52.136203 ], [ 126.563679, 52.119302 ], [ 126.514404, 52.037282 ], [ 126.487918, 52.041699 ], [ 126.450962, 52.027709 ], [ 126.447882, 52.009294 ], [ 126.468208, 51.982395 ], [ 126.462665, 51.948471 ], [ 126.510092, 51.922274 ], [ 126.555056, 51.874266 ], [ 126.580925, 51.824728 ], [ 126.622809, 51.777357 ], [ 126.658534, 51.762544 ], [ 126.6727, 51.73179 ], [ 126.724439, 51.7266 ], [ 126.734294, 51.711399 ], [ 126.723823, 51.679126 ], [ 126.741069, 51.642374 ], [ 126.67886, 51.602246 ], [ 126.69549, 51.57845 ], [ 126.837156, 51.536033 ], [ 126.843931, 51.521885 ], [ 126.812518, 51.493948 ], [ 126.784185, 51.448095 ], [ 126.791577, 51.432428 ], [ 126.835308, 51.413769 ], [ 126.908605, 51.407423 ], [ 126.930163, 51.359241 ], [ 126.904293, 51.340552 ], [ 126.837156, 51.345038 ], [ 126.813134, 51.311756 ], [ 126.820526, 51.281071 ], [ 126.863025, 51.248492 ], [ 126.908605, 51.246619 ], [ 126.92154, 51.259729 ], [ 126.908605, 51.283691 ], [ 126.877808, 51.300906 ], [ 126.887047, 51.321856 ], [ 126.970815, 51.332327 ], [ 126.98375, 51.318863 ], [ 126.976358, 51.291551 ], [ 126.926467, 51.246244 ], [ 126.899982, 51.200518 ], [ 126.917844, 51.138977 ], [ 126.922772, 51.061937 ], [ 126.985597, 51.029202 ], [ 127.052119, 50.962911 ], [ 127.113713, 50.93765 ], [ 127.143894, 50.910111 ], [ 127.236285, 50.781256 ], [ 127.295415, 50.755139 ], [ 127.305886, 50.733932 ], [ 127.28864, 50.699451 ], [ 127.294799, 50.663426 ], [ 127.370559, 50.581415 ], [ 127.36132, 50.547582 ], [ 127.323132, 50.52552 ], [ 127.293567, 50.46575 ], [ 127.30527, 50.45432 ], [ 127.3644, 50.438314 ], [ 127.369944, 50.403996 ], [ 127.332371, 50.340634 ], [ 127.371791, 50.29669 ], [ 127.44632, 50.270686 ], [ 127.603385, 50.239309 ], [ 127.60708, 50.178794 ], [ 127.58737, 50.137768 ], [ 127.501755, 50.056764 ], [ 127.495595, 49.994479 ], [ 127.543638, 49.944438 ], [ 127.547334, 49.928645 ], [ 127.529472, 49.864265 ], [ 127.531936, 49.826059 ], [ 127.583059, 49.786277 ], [ 127.653892, 49.780094 ], [ 127.674833, 49.764247 ], [ 127.677913, 49.697712 ], [ 127.705015, 49.665185 ], [ 127.782007, 49.630698 ], [ 127.815268, 49.593859 ], [ 127.897804, 49.579116 ], [ 127.949542, 49.596187 ], [ 128.001281, 49.592307 ], [ 128.070882, 49.556604 ], [ 128.122005, 49.55311 ], [ 128.185447, 49.53952 ], [ 128.243345, 49.563203 ], [ 128.287077, 49.566309 ], [ 128.343128, 49.544956 ], [ 128.389939, 49.58998 ], [ 128.500192, 49.593859 ], [ 128.537764, 49.604332 ], [ 128.619684, 49.593471 ], [ 128.656025, 49.577564 ], [ 128.715155, 49.564756 ], [ 128.744104, 49.595023 ], [ 128.802618, 49.58222 ], [ 128.813089, 49.558157 ], [ 128.763198, 49.515824 ], [ 128.76135, 49.482009 ], [ 128.792147, 49.473065 ], [ 128.871604, 49.492506 ], [ 128.932582, 49.46801 ], [ 129.013886, 49.457119 ], [ 129.061929, 49.374189 ], [ 129.084719, 49.359769 ], [ 129.143849, 49.357431 ], [ 129.180805, 49.386657 ], [ 129.215298, 49.399122 ], [ 129.266421, 49.396006 ], [ 129.320623, 49.3586 ], [ 129.358196, 49.355871 ], [ 129.379138, 49.367175 ], [ 129.374826, 49.414309 ], [ 129.390224, 49.432605 ], [ 129.448739, 49.441167 ], [ 129.51834, 49.423652 ], [ 129.546057, 49.395227 ], [ 129.562687, 49.299706 ], [ 129.604571, 49.279018 ], [ 129.696962, 49.298535 ], [ 129.730223, 49.288387 ], [ 129.761636, 49.25754 ], [ 129.753629, 49.208692 ], [ 129.784426, 49.184054 ], [ 129.847867, 49.181316 ], [ 129.864498, 49.158621 ], [ 129.855259, 49.133567 ], [ 129.866962, 49.113985 ], [ 129.913157, 49.1085 ], [ 129.934715, 49.078717 ], [ 129.9187, 49.060681 ], [ 129.937179, 49.040285 ], [ 130.020946, 49.021058 ], [ 130.059135, 48.979047 ], [ 130.113337, 48.956653 ], [ 130.219895, 48.893739 ], [ 130.237757, 48.868551 ], [ 130.279641, 48.866976 ], [ 130.412068, 48.905148 ], [ 130.471198, 48.905541 ], [ 130.501995, 48.865795 ], [ 130.559277, 48.861071 ], [ 130.609168, 48.881146 ], [ 130.680617, 48.881146 ], [ 130.689856, 48.849651 ], [ 130.622103, 48.783842 ], [ 130.576524, 48.688719 ], [ 130.538951, 48.635751 ], [ 130.538335, 48.612016 ], [ 130.605473, 48.594207 ], [ 130.615944, 48.575601 ], [ 130.620871, 48.49595 ], [ 130.647357, 48.484844 ], [ 130.711414, 48.511414 ], [ 130.767465, 48.507846 ], [ 130.776704, 48.480084 ], [ 130.745907, 48.449131 ], [ 130.747755, 48.404256 ], [ 130.785327, 48.357353 ], [ 130.81982, 48.341444 ], [ 130.845073, 48.296473 ], [ 130.817972, 48.265409 ], [ 130.787791, 48.256643 ], [ 130.769313, 48.231136 ], [ 130.765617, 48.18926 ], [ 130.673842, 48.12818 ], [ 130.666451, 48.105007 ], [ 130.699711, 48.044227 ], [ 130.737284, 48.034223 ], [ 130.770544, 47.998194 ], [ 130.870943, 47.943301 ], [ 130.891269, 47.927263 ], [ 130.961486, 47.828118 ], [ 130.966413, 47.733211 ], [ 130.983659, 47.713081 ], [ 131.029855, 47.694555 ], [ 131.115471, 47.689721 ], [ 131.183224, 47.702611 ], [ 131.236811, 47.733211 ], [ 131.273767, 47.738846 ], [ 131.359998, 47.730796 ], [ 131.456085, 47.747297 ], [ 131.543548, 47.736028 ], [ 131.559563, 47.724757 ], [ 131.568186, 47.682469 ], [ 131.59036, 47.660707 ], [ 131.641483, 47.663932 ], [ 131.690142, 47.707041 ], [ 131.741881, 47.706638 ], [ 131.825649, 47.677231 ], [ 131.900793, 47.685692 ], [ 131.976554, 47.673201 ], [ 132.000575, 47.712276 ], [ 132.086191, 47.703013 ], [ 132.157024, 47.70543 ], [ 132.19706, 47.714289 ], [ 132.242639, 47.70986 ], [ 132.272205, 47.718718 ], [ 132.288835, 47.742065 ], [ 132.325175, 47.762184 ], [ 132.371987, 47.765402 ], [ 132.469305, 47.726368 ], [ 132.558, 47.718316 ], [ 132.6005, 47.740858 ], [ 132.599268, 47.792347 ], [ 132.621442, 47.82852 ], [ 132.662094, 47.854227 ], [ 132.687348, 47.88514 ], [ 132.662094, 47.922451 ], [ 132.661478, 47.944905 ], [ 132.691043, 47.962941 ], [ 132.723072, 47.962941 ], [ 132.769268, 47.93849 ], [ 132.819159, 47.936887 ], [ 132.883216, 48.002599 ], [ 132.992238, 48.035424 ], [ 133.016259, 48.054228 ], [ 133.02673, 48.085421 ], [ 133.053216, 48.110202 ], [ 133.130208, 48.134971 ], [ 133.182563, 48.135769 ], [ 133.239845, 48.126583 ], [ 133.302055, 48.103009 ], [ 133.407997, 48.124585 ], [ 133.451728, 48.112999 ], [ 133.545967, 48.121389 ], [ 133.573068, 48.182078 ], [ 133.59709, 48.194846 ], [ 133.667307, 48.183275 ], [ 133.693177, 48.186866 ], [ 133.740604, 48.254651 ], [ 133.791111, 48.261026 ], [ 133.824372, 48.277359 ], [ 133.876111, 48.282536 ], [ 133.940784, 48.302047 ], [ 133.995603, 48.303639 ], [ 134.029479, 48.327519 ], [ 134.0689, 48.338659 ], [ 134.116327, 48.333089 ], [ 134.150819, 48.346217 ], [ 134.20379, 48.3824 ], [ 134.369478, 48.382797 ], [ 134.438463, 48.405448 ], [ 134.501905, 48.418954 ], [ 134.578281, 48.405448 ], [ 134.696542, 48.407037 ], [ 134.764295, 48.370076 ], [ 134.820961, 48.37604 ], [ 134.848679, 48.393925 ], [ 134.886867, 48.437618 ], [ 134.927519, 48.451513 ], [ 134.996504, 48.439603 ], [ 135.035924, 48.440795 ], [ 135.068569, 48.459451 ], [ 135.09567, 48.437618 ], [ 135.090743, 48.403461 ], [ 135.009439, 48.365703 ], [ 134.864077, 48.332293 ], [ 134.77107, 48.288908 ], [ 134.679295, 48.256245 ], [ 134.67252, 48.170505 ], [ 134.632484, 48.099412 ], [ 134.551796, 48.032622 ], [ 134.55426, 47.982173 ], [ 134.599839, 47.947711 ], [ 134.607846, 47.909214 ], [ 134.658969, 47.901191 ], [ 134.677448, 47.884738 ], [ 134.670056, 47.864667 ], [ 134.678679, 47.819278 ], [ 134.772918, 47.763391 ], [ 134.779694, 47.7159 ], [ 134.689766, 47.63813 ], [ 134.678064, 47.588507 ], [ 134.627556, 47.546512 ], [ 134.576434, 47.519036 ], [ 134.568426, 47.478199 ], [ 134.522847, 47.468086 ], [ 134.490202, 47.446235 ], [ 134.339297, 47.439759 ], [ 134.307268, 47.428829 ], [ 134.266616, 47.391974 ], [ 134.263536, 47.371307 ], [ 134.203174, 47.347389 ], [ 134.177305, 47.326299 ], [ 134.156979, 47.248357 ], [ 134.210566, 47.210155 ], [ 134.230276, 47.182097 ], [ 134.232739, 47.134892 ], [ 134.222268, 47.105164 ], [ 134.142812, 47.093349 ], [ 134.118175, 47.061968 ], [ 134.10216, 47.005678 ], [ 134.063972, 46.979962 ], [ 134.076291, 46.938298 ], [ 134.042414, 46.886787 ], [ 134.041182, 46.848326 ], [ 134.025168, 46.810657 ], [ 134.052885, 46.779928 ], [ 134.033175, 46.759023 ], [ 134.030711, 46.708981 ], [ 134.011001, 46.637941 ], [ 133.919842, 46.596012 ], [ 133.890893, 46.525235 ], [ 133.849625, 46.475389 ], [ 133.852089, 46.450242 ], [ 133.902596, 46.446119 ], [ 133.948791, 46.401153 ], [ 133.940784, 46.38134 ], [ 133.876726, 46.362345 ], [ 133.869335, 46.338386 ], [ 133.922922, 46.330948 ], [ 133.908139, 46.308216 ], [ 133.91861, 46.280924 ], [ 133.909987, 46.254447 ], [ 133.867487, 46.250722 ], [ 133.87919, 46.233752 ], [ 133.849625, 46.203939 ], [ 133.814517, 46.230854 ], [ 133.794807, 46.193583 ], [ 133.764626, 46.17328 ], [ 133.706111, 46.163333 ], [ 133.690713, 46.133896 ], [ 133.745531, 46.075389 ], [ 133.740604, 46.048812 ], [ 133.681474, 45.986473 ], [ 133.676546, 45.94321 ], [ 133.614952, 45.942794 ], [ 133.618032, 45.903662 ], [ 133.583539, 45.868669 ], [ 133.55459, 45.893249 ], [ 133.51209, 45.887001 ], [ 133.491764, 45.867002 ], [ 133.494228, 45.840325 ], [ 133.467743, 45.834905 ], [ 133.469591, 45.799451 ], [ 133.505315, 45.785681 ], [ 133.469591, 45.777751 ], [ 133.486837, 45.740173 ], [ 133.454192, 45.731819 ], [ 133.445569, 45.705077 ], [ 133.484989, 45.691702 ], [ 133.485605, 45.658667 ], [ 133.448649, 45.647372 ], [ 133.471438, 45.631053 ], [ 133.412924, 45.618079 ], [ 133.423395, 45.584163 ], [ 133.393214, 45.580393 ], [ 133.342707, 45.554836 ], [ 133.333468, 45.562379 ], [ 133.246005, 45.517528 ], [ 133.201657, 45.515431 ], [ 133.170244, 45.465506 ], [ 133.164701, 45.437377 ], [ 133.143759, 45.430658 ], [ 133.144991, 45.367205 ], [ 133.119121, 45.352908 ], [ 133.128976, 45.336924 ], [ 133.097563, 45.281788 ], [ 133.109266, 45.232077 ], [ 133.124665, 45.222805 ], [ 133.137599, 45.178105 ], [ 133.139447, 45.127459 ], [ 133.107418, 45.124504 ], [ 133.089556, 45.097473 ], [ 133.070462, 45.097051 ], [ 133.045824, 45.066203 ], [ 132.986078, 45.031109 ], [ 132.954049, 45.023072 ], [ 132.916477, 45.031109 ], [ 132.867202, 45.061976 ], [ 132.76434, 45.081417 ], [ 132.394161, 45.16376 ], [ 132.17427, 45.216903 ], [ 132.003655, 45.25441 ], [ 131.976554, 45.277156 ], [ 131.93159, 45.287683 ], [ 131.917423, 45.339448 ], [ 131.887858, 45.342393 ], [ 131.82996, 45.311677 ], [ 131.825649, 45.291472 ], [ 131.788692, 45.245984 ], [ 131.79362, 45.211844 ], [ 131.759127, 45.213952 ], [ 131.721555, 45.234606 ], [ 131.681519, 45.215217 ], [ 131.650722, 45.159962 ], [ 131.687678, 45.1511 ], [ 131.695685, 45.132104 ], [ 131.63286, 45.075078 ], [ 131.566338, 45.045487 ], [ 131.529382, 45.012073 ], [ 131.484418, 44.99557 ], [ 131.501664, 44.977793 ], [ 131.464708, 44.963397 ], [ 131.409889, 44.985836 ], [ 131.380324, 44.978216 ], [ 131.355071, 44.990068 ], [ 131.313803, 44.965938 ], [ 131.311955, 44.94688 ], [ 131.274999, 44.919766 ], [ 131.263296, 44.929935 ], [ 131.207861, 44.913833 ], [ 131.20355, 44.932901 ], [ 131.16105, 44.948151 ], [ 131.090217, 44.924427 ], [ 131.10192, 44.898997 ], [ 131.07913, 44.881614 ], [ 130.965181, 44.85065 ], [ 130.972573, 44.820094 ], [ 131.016304, 44.814575 ], [ 131.016304, 44.789521 ], [ 131.064348, 44.786973 ], [ 131.069275, 44.759783 ], [ 131.093297, 44.746183 ], [ 131.090833, 44.717272 ], [ 131.111775, 44.710042 ], [ 131.310723, 44.046623 ], [ 131.26576, 44.034578 ], [ 131.245434, 43.95579 ], [ 131.26268, 43.948897 ], [ 131.254057, 43.893289 ], [ 131.2171, 43.836334 ], [ 131.213405, 43.801357 ], [ 131.232499, 43.742585 ], [ 131.215869, 43.72745 ], [ 131.221412, 43.682024 ], [ 131.239274, 43.670337 ], [ 131.216485, 43.613169 ], [ 131.222028, 43.593234 ], [ 131.20047, 43.532089 ], [ 131.276847, 43.495632 ], [ 131.304564, 43.502144 ], [ 131.294093, 43.470012 ], [ 131.234963, 43.475224 ], [ 131.201086, 43.442209 ], [ 131.175217, 43.444816 ], [ 131.142572, 43.425695 ], [ 131.026775, 43.508655 ], [ 130.959638, 43.48608 ], [ 130.907283, 43.434387 ], [ 130.864167, 43.437863 ], [ 130.841378, 43.454374 ], [ 130.822899, 43.503446 ], [ 130.776704, 43.52341 ], [ 130.727429, 43.560284 ], [ 130.671378, 43.565054 ], [ 130.665835, 43.583698 ], [ 130.623335, 43.589767 ], [ 130.630726, 43.622268 ], [ 130.57098, 43.626167 ], [ 130.57098, 43.626167 ], [ 130.501995, 43.636563 ], [ 130.488444, 43.65605 ], [ 130.437937, 43.646091 ], [ 130.412684, 43.652586 ], [ 130.394206, 43.703227 ], [ 130.423155, 43.745179 ], [ 130.382503, 43.777164 ], [ 130.381887, 43.817768 ], [ 130.362793, 43.844967 ], [ 130.386198, 43.85403 ], [ 130.368336, 43.894151 ], [ 130.381887, 43.910106 ], [ 130.338155, 43.963975 ], [ 130.364025, 43.992399 ], [ 130.365256, 44.044042 ], [ 130.319061, 44.03974 ], [ 130.307358, 44.002731 ], [ 130.27225, 43.981634 ], [ 130.262395, 43.949328 ], [ 130.208192, 43.948466 ], [ 130.153373, 43.915711 ], [ 130.143518, 43.878624 ], [ 130.116417, 43.878192 ], [ 130.110873, 43.852735 ], [ 130.079461, 43.835039 ], [ 130.027722, 43.851872 ], [ 130.009243, 43.889407 ], [ 130.022794, 43.917866 ], [ 130.017867, 43.961821 ], [ 129.979062, 44.015644 ], [ 129.951345, 44.027263 ], [ 129.907614, 44.023821 ], [ 129.881128, 44.000148 ], [ 129.868193, 44.012631 ], [ 129.802904, 43.964837 ], [ 129.780114, 43.892857 ], [ 129.739462, 43.895876 ], [ 129.743158, 43.876035 ], [ 129.699426, 43.8838 ], [ 129.650767, 43.873016 ], [ 129.529427, 43.870427 ], [ 129.467833, 43.874741 ], [ 129.449971, 43.850578 ], [ 129.417942, 43.843672 ], [ 129.406855, 43.819496 ], [ 129.348341, 43.798333 ], [ 129.30892, 43.812155 ], [ 129.289826, 43.797038 ], [ 129.254718, 43.819496 ], [ 129.211602, 43.784509 ], [ 129.232544, 43.709284 ], [ 129.214066, 43.695006 ], [ 129.217146, 43.648689 ], [ 129.232544, 43.635263 ], [ 129.23008, 43.593234 ], [ 129.169102, 43.561585 ], [ 129.145081, 43.570258 ], [ 129.093958, 43.547706 ], [ 129.037907, 43.540332 ], [ 129.013886, 43.522976 ], [ 128.962763, 43.53903 ], [ 128.949828, 43.553779 ], [ 128.878379, 43.539898 ], [ 128.834647, 43.587599 ], [ 128.821097, 43.637429 ], [ 128.78722, 43.686784 ], [ 128.768126, 43.732207 ], [ 128.729322, 43.736964 ], [ 128.760119, 43.755554 ], [ 128.739177, 43.806972 ], [ 128.719467, 43.816905 ], [ 128.760734, 43.857482 ], [ 128.729938, 43.889838 ], [ 128.696061, 43.903207 ], [ 128.636315, 43.891132 ], [ 128.64001, 43.948035 ], [ 128.610445, 43.960529 ], [ 128.584576, 43.990246 ], [ 128.574721, 44.047914 ], [ 128.529141, 44.112401 ], [ 128.471859, 44.157501 ], [ 128.450301, 44.203423 ], [ 128.471859, 44.247596 ], [ 128.453997, 44.257884 ], [ 128.472475, 44.320001 ], [ 128.446605, 44.339694 ], [ 128.475555, 44.346114 ], [ 128.481714, 44.375637 ], [ 128.457076, 44.409848 ], [ 128.463236, 44.431647 ], [ 128.427511, 44.473512 ], [ 128.397946, 44.483761 ], [ 128.372693, 44.514495 ], [ 128.295084, 44.480772 ], [ 128.293237, 44.467961 ], [ 128.228563, 44.445748 ], [ 128.211317, 44.431647 ], [ 128.172512, 44.34697 ], [ 128.137404, 44.357668 ], [ 128.094904, 44.354673 ], [ 128.074578, 44.370075 ], [ 128.049941, 44.349965 ], [ 128.065339, 44.307155 ], [ 128.101679, 44.293449 ], [ 128.064107, 44.251454 ], [ 128.104143, 44.230017 ], [ 128.09244, 44.181539 ], [ 128.060411, 44.168663 ], [ 128.088129, 44.158359 ], [ 128.091208, 44.133022 ], [ 128.042549, 44.103807 ], [ 127.950158, 44.088334 ], [ 127.912586, 44.064687 ], [ 127.862695, 44.062967 ], [ 127.846065, 44.081886 ], [ 127.808492, 44.086615 ], [ 127.783239, 44.071997 ], [ 127.729036, 44.09908 ], [ 127.735811, 44.11412 ], [ 127.712406, 44.199133 ], [ 127.681609, 44.166946 ], [ 127.641573, 44.193555 ], [ 127.626174, 44.187977 ], [ 127.59045, 44.227872 ], [ 127.623711, 44.278025 ], [ 127.579363, 44.310581 ], [ 127.486356, 44.410275 ], [ 127.50853, 44.437202 ], [ 127.463566, 44.484615 ], [ 127.465414, 44.516628 ], [ 127.485124, 44.528576 ], [ 127.536247, 44.522176 ], [ 127.570124, 44.55033 ], [ 127.557189, 44.575488 ], [ 127.392733, 44.632158 ], [ 127.275705, 44.640249 ], [ 127.261538, 44.61299 ], [ 127.214111, 44.624917 ], [ 127.228893, 44.642804 ], [ 127.182082, 44.644507 ], [ 127.138966, 44.607451 ], [ 127.094619, 44.615972 ], [ 127.089691, 44.593816 ], [ 127.049655, 44.566961 ], [ 127.041648, 44.591258 ], [ 127.044112, 44.653874 ], [ 127.030561, 44.673454 ], [ 127.041032, 44.712169 ], [ 126.9973, 44.764882 ], [ 126.984366, 44.823914 ], [ 126.999764, 44.87398 ], [ 127.021938, 44.898997 ], [ 127.073061, 44.907051 ], [ 127.092771, 44.94688 ], [ 127.050271, 45.004034 ], [ 127.018242, 45.024341 ], [ 126.984981, 45.067893 ], [ 126.970815, 45.070852 ], [ 126.96404, 45.132104 ], [ 126.85625, 45.145613 ], [ 126.792808, 45.135481 ], [ 126.787265, 45.159118 ], [ 126.732446, 45.187385 ], [ 126.685635, 45.187807 ], [ 126.640055, 45.214373 ], [ 126.644983, 45.225334 ], [ 126.569222, 45.252725 ], [ 126.540273, 45.23882 ], [ 126.519331, 45.248091 ], [ 126.402919, 45.222805 ], [ 126.356107, 45.185698 ], [ 126.293282, 45.180214 ], [ 126.285274, 45.162494 ], [ 126.235383, 45.140125 ], [ 126.225528, 45.154054 ], [ 126.166398, 45.13337 ], [ 126.142992, 45.147723 ], [ 126.091869, 45.149411 ], [ 126.047522, 45.170933 ], [ 125.998247, 45.162072 ], [ 125.992703, 45.192447 ], [ 125.957595, 45.201303 ], [ 125.915095, 45.196664 ], [ 125.849805, 45.23882 ], [ 125.823936, 45.237978 ], [ 125.815929, 45.264942 ], [ 125.761726, 45.291472 ], [ 125.726001, 45.336503 ], [ 125.695205, 45.352066 ], [ 125.712451, 45.389485 ], [ 125.711835, 45.477677 ], [ 125.687813, 45.514173 ], [ 125.660096, 45.507043 ], [ 125.61698, 45.517947 ], [ 125.583104, 45.491942 ], [ 125.497488, 45.469283 ], [ 125.480242, 45.486488 ], [ 125.424807, 45.485649 ], [ 125.434662, 45.462988 ], [ 125.398322, 45.416797 ], [ 125.361981, 45.392847 ], [ 125.319482, 45.422678 ], [ 125.301619, 45.402092 ], [ 125.248649, 45.417637 ], [ 125.189518, 45.39915 ], [ 125.137779, 45.409655 ], [ 125.097127, 45.38276 ], [ 125.06633, 45.39915 ], [ 125.08912, 45.420998 ], [ 125.0497, 45.428558 ], [ 125.025678, 45.493201 ], [ 124.961005, 45.495299 ], [ 124.936983, 45.53388 ], [ 124.911114, 45.535976 ], [ 124.884628, 45.495299 ], [ 124.886476, 45.442836 ], [ 124.839665, 45.455852 ], [ 124.792853, 45.436958 ], [ 124.776223, 45.468024 ], [ 124.729412, 45.444096 ], [ 124.690607, 45.452493 ], [ 124.625318, 45.437377 ], [ 124.575427, 45.451234 ], [ 124.579738, 45.424358 ], [ 124.544014, 45.411756 ], [ 124.507058, 45.424778 ], [ 124.480572, 45.456271 ], [ 124.398652, 45.440737 ], [ 124.374015, 45.45795 ], [ 124.352457, 45.496557 ], [ 124.369087, 45.512915 ], [ 124.348761, 45.546874 ], [ 124.287783, 45.539329 ], [ 124.264377, 45.555256 ], [ 124.273001, 45.584163 ], [ 124.238508, 45.591702 ], [ 124.226805, 45.633564 ], [ 124.162132, 45.616404 ], [ 124.128255, 45.641933 ], [ 124.147349, 45.665359 ], [ 124.122096, 45.669123 ], [ 124.13503, 45.690448 ], [ 124.10177, 45.700898 ], [ 124.098074, 45.722628 ], [ 124.054342, 45.751449 ], [ 124.014922, 45.749779 ], [ 124.001987, 45.770655 ], [ 124.064197, 45.802372 ], [ 124.03648, 45.83824 ], [ 124.067277, 45.840325 ], [ 124.061118, 45.886168 ], [ 123.996444, 45.906993 ], [ 123.968727, 45.936551 ], [ 123.973654, 45.973997 ], [ 124.011842, 45.981899 ], [ 123.989053, 46.011833 ], [ 124.040176, 46.01973 ], [ 124.034016, 46.045074 ], [ 124.009995, 46.057534 ], [ 124.015538, 46.088257 ], [ 123.99398, 46.101123 ], [ 124.01677, 46.118549 ], [ 123.991516, 46.143019 ], [ 124.001987, 46.166649 ], [ 123.971806, 46.170379 ], [ 123.956408, 46.206009 ], [ 123.979814, 46.228784 ], [ 123.952096, 46.256516 ], [ 123.960103, 46.288369 ], [ 123.936082, 46.286715 ], [ 123.917604, 46.25693 ], [ 123.896046, 46.303668 ], [ 123.84985, 46.302428 ], [ 123.775938, 46.263136 ], [ 123.726047, 46.255688 ], [ 123.673692, 46.258585 ], [ 123.604706, 46.251964 ], [ 123.569598, 46.223816 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"310000\", \"name\": \"上海市\", \"center\": [ 121.472644, 31.231706 ], \"centroid\": [ 121.438734, 31.07256 ], \"childrenNum\": 16, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 8, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 120.901349, 31.017327 ], [ 120.890878, 31.094229 ], [ 120.859465, 31.100379 ], [ 120.881023, 31.134706 ], [ 120.930298, 31.141365 ], [ 121.018377, 31.134194 ], [ 121.076892, 31.158267 ], [ 121.060261, 31.245289 ], [ 121.090442, 31.291838 ], [ 121.138485, 31.276495 ], [ 121.160659, 31.283144 ], [ 121.129862, 31.302577 ], [ 121.130478, 31.343987 ], [ 121.113848, 31.37465 ], [ 121.143413, 31.392021 ], [ 121.174826, 31.44922 ], [ 121.240731, 31.493627 ], [ 121.247507, 31.476785 ], [ 121.301093, 31.49873 ], [ 121.301093, 31.49873 ], [ 121.343593, 31.511996 ], [ 121.404571, 31.479337 ], [ 121.520984, 31.394575 ], [ 121.599208, 31.37465 ], [ 121.722396, 31.3036 ], [ 121.809859, 31.196669 ], [ 121.946598, 31.066039 ], [ 121.977395, 31.016301 ], [ 121.990945, 30.96859 ], [ 121.994025, 30.862823 ], [ 121.954605, 30.825828 ], [ 121.970004, 30.789333 ], [ 121.943518, 30.776993 ], [ 121.904714, 30.814007 ], [ 121.681128, 30.818633 ], [ 121.601056, 30.805269 ], [ 121.517288, 30.775451 ], [ 121.426129, 30.730192 ], [ 121.362071, 30.679764 ], [ 121.274608, 30.677191 ], [ 121.272144, 30.723504 ], [ 121.232108, 30.755909 ], [ 121.21671, 30.785734 ], [ 121.174826, 30.771851 ], [ 121.123087, 30.77905 ], [ 121.13787, 30.826342 ], [ 121.097833, 30.857171 ], [ 121.060261, 30.845354 ], [ 121.038087, 30.814007 ], [ 120.991892, 30.837133 ], [ 121.020225, 30.872069 ], [ 120.993124, 30.889532 ], [ 121.000515, 30.938309 ], [ 120.989428, 31.01425 ], [ 120.949392, 31.030148 ], [ 120.940153, 31.010146 ], [ 120.901349, 31.017327 ] ] ], [ [ [ 121.974931, 31.61704 ], [ 121.995873, 31.493117 ], [ 121.981706, 31.464024 ], [ 121.890547, 31.428795 ], [ 121.819098, 31.437987 ], [ 121.682976, 31.491075 ], [ 121.625693, 31.501792 ], [ 121.547469, 31.531382 ], [ 121.434136, 31.590535 ], [ 121.395332, 31.585437 ], [ 121.371926, 31.553314 ], [ 121.289391, 31.61653 ], [ 121.145261, 31.75403 ], [ 121.118775, 31.759119 ], [ 121.200079, 31.834907 ], [ 121.265369, 31.863883 ], [ 121.323267, 31.868458 ], [ 121.384861, 31.833382 ], [ 121.431673, 31.769295 ], [ 121.49881, 31.753012 ], [ 121.599824, 31.703128 ], [ 121.64294, 31.697527 ], [ 121.715005, 31.673592 ], [ 121.974931, 31.61704 ] ] ], [ [ [ 121.779062, 31.310247 ], [ 121.727939, 31.35472 ], [ 121.572107, 31.435944 ], [ 121.509897, 31.4824 ], [ 121.520984, 31.494137 ], [ 121.567179, 31.48342 ], [ 121.585657, 31.454836 ], [ 121.742106, 31.407345 ], [ 121.792613, 31.363408 ], [ 121.793845, 31.31945 ], [ 121.779062, 31.310247 ] ] ], [ [ [ 121.801852, 31.356765 ], [ 121.792613, 31.377715 ], [ 121.845584, 31.37465 ], [ 121.951525, 31.337343 ], [ 122.040837, 31.324051 ], [ 122.116597, 31.320984 ], [ 122.122756, 31.307179 ], [ 122.097503, 31.255522 ], [ 122.016199, 31.282121 ], [ 121.932431, 31.283144 ], [ 121.840656, 31.295418 ], [ 121.8037, 31.328652 ], [ 121.801852, 31.356765 ] ] ], [ [ [ 121.626925, 31.445135 ], [ 121.579498, 31.479848 ], [ 121.631853, 31.456878 ], [ 121.626925, 31.445135 ] ] ], [ [ [ 121.943518, 31.215608 ], [ 121.950909, 31.228915 ], [ 122.008808, 31.221238 ], [ 121.995873, 31.160828 ], [ 121.959533, 31.159291 ], [ 121.943518, 31.215608 ] ] ], [ [ [ 121.88254, 31.240684 ], [ 121.923808, 31.234032 ], [ 121.909026, 31.195133 ], [ 121.88254, 31.240684 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"320000\", \"name\": \"江苏省\", \"center\": [ 118.767413, 32.041544 ], \"centroid\": [ 119.486395, 32.983908 ], \"childrenNum\": 13, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 9, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 117.311654, 34.561686 ], [ 117.311654, 34.561686 ], [ 117.32151, 34.566614 ], [ 117.32151, 34.566614 ], [ 117.325205, 34.573021 ], [ 117.325205, 34.573021 ], [ 117.362777, 34.589281 ], [ 117.402813, 34.569571 ], [ 117.402813, 34.550843 ], [ 117.465023, 34.484767 ], [ 117.53832, 34.467006 ], [ 117.592523, 34.462566 ], [ 117.609769, 34.490686 ], [ 117.659044, 34.501044 ], [ 117.684298, 34.547392 ], [ 117.801942, 34.518798 ], [ 117.791471, 34.583368 ], [ 117.793935, 34.651827 ], [ 117.902956, 34.644443 ], [ 117.909732, 34.670533 ], [ 117.951615, 34.678408 ], [ 118.053861, 34.650843 ], [ 118.084042, 34.655766 ], [ 118.114839, 34.614404 ], [ 118.079115, 34.569571 ], [ 118.185056, 34.543942 ], [ 118.16473, 34.50499 ], [ 118.132702, 34.483287 ], [ 118.177665, 34.45319 ], [ 118.179513, 34.379628 ], [ 118.217701, 34.379134 ], [ 118.220165, 34.405802 ], [ 118.277447, 34.404814 ], [ 118.290382, 34.424563 ], [ 118.379693, 34.415183 ], [ 118.404947, 34.427525 ], [ 118.416034, 34.473914 ], [ 118.439439, 34.507949 ], [ 118.424657, 34.595193 ], [ 118.439439, 34.626223 ], [ 118.473932, 34.623269 ], [ 118.460997, 34.656258 ], [ 118.545997, 34.705964 ], [ 118.601431, 34.714327 ], [ 118.607591, 34.694155 ], [ 118.664257, 34.693663 ], [ 118.690127, 34.678408 ], [ 118.739402, 34.693663 ], [ 118.783749, 34.723181 ], [ 118.764039, 34.740396 ], [ 118.719076, 34.745313 ], [ 118.739402, 34.792508 ], [ 118.772047, 34.794474 ], [ 118.80038, 34.843114 ], [ 118.805307, 34.87307 ], [ 118.860742, 34.944233 ], [ 118.86259, 35.025626 ], [ 118.928495, 35.051106 ], [ 118.942662, 35.040817 ], [ 119.027045, 35.055516 ], [ 119.114509, 35.055026 ], [ 119.137915, 35.096167 ], [ 119.217371, 35.106939 ], [ 119.250016, 35.124562 ], [ 119.286972, 35.115261 ], [ 119.306066, 35.076578 ], [ 119.292515, 35.068742 ], [ 119.307298, 35.032977 ], [ 119.291899, 35.028567 ], [ 119.285124, 35.068252 ], [ 119.238313, 35.048657 ], [ 119.211211, 34.981507 ], [ 119.214907, 34.925589 ], [ 119.202588, 34.890253 ], [ 119.217371, 34.827886 ], [ 119.238313, 34.799388 ], [ 119.272189, 34.797914 ], [ 119.312841, 34.774813 ], [ 119.378747, 34.764489 ], [ 119.440957, 34.769406 ], [ 119.439725, 34.785136 ], [ 119.497007, 34.754164 ], [ 119.494543, 34.754656 ], [ 119.381827, 34.752198 ], [ 119.456971, 34.748264 ], [ 119.525956, 34.73351 ], [ 119.465594, 34.672994 ], [ 119.569072, 34.615389 ], [ 119.610956, 34.592729 ], [ 119.641137, 34.569078 ], [ 119.781571, 34.515839 ], [ 119.811752, 34.485754 ], [ 119.962657, 34.459112 ], [ 120.103707, 34.391481 ], [ 120.311895, 34.306991 ], [ 120.314359, 34.255563 ], [ 120.347619, 34.179352 ], [ 120.367329, 34.091674 ], [ 120.48559, 33.859411 ], [ 120.500372, 33.818152 ], [ 120.534249, 33.782346 ], [ 120.583524, 33.668362 ], [ 120.651277, 33.57567 ], [ 120.717183, 33.436945 ], [ 120.741205, 33.337505 ], [ 120.769538, 33.307 ], [ 120.813885, 33.303499 ], [ 120.833595, 33.274984 ], [ 120.819429, 33.237951 ], [ 120.843451, 33.209915 ], [ 120.874247, 33.093672 ], [ 120.871784, 33.047032 ], [ 120.917979, 33.02596 ], [ 120.932762, 33.005887 ], [ 120.957399, 32.893395 ], [ 120.981421, 32.85972 ], [ 120.972182, 32.761134 ], [ 120.953088, 32.714318 ], [ 120.916131, 32.701225 ], [ 120.963559, 32.68259 ], [ 120.979573, 32.636236 ], [ 120.961711, 32.612042 ], [ 121.020225, 32.605489 ], [ 121.153268, 32.52933 ], [ 121.269681, 32.483402 ], [ 121.352216, 32.474315 ], [ 121.390405, 32.460682 ], [ 121.425513, 32.430885 ], [ 121.450151, 32.282256 ], [ 121.493882, 32.263533 ], [ 121.499426, 32.211394 ], [ 121.458774, 32.177462 ], [ 121.542542, 32.152132 ], [ 121.525295, 32.136423 ], [ 121.759352, 32.059362 ], [ 121.772287, 32.032984 ], [ 121.856055, 31.955328 ], [ 121.889315, 31.866425 ], [ 121.970004, 31.718911 ], [ 121.974931, 31.61704 ], [ 121.715005, 31.673592 ], [ 121.64294, 31.697527 ], [ 121.599824, 31.703128 ], [ 121.49881, 31.753012 ], [ 121.431673, 31.769295 ], [ 121.384861, 31.833382 ], [ 121.323267, 31.868458 ], [ 121.265369, 31.863883 ], [ 121.200079, 31.834907 ], [ 121.118775, 31.759119 ], [ 121.145261, 31.75403 ], [ 121.289391, 31.61653 ], [ 121.371926, 31.553314 ], [ 121.343593, 31.511996 ], [ 121.301093, 31.49873 ], [ 121.301093, 31.49873 ], [ 121.247507, 31.476785 ], [ 121.240731, 31.493627 ], [ 121.174826, 31.44922 ], [ 121.143413, 31.392021 ], [ 121.113848, 31.37465 ], [ 121.130478, 31.343987 ], [ 121.129862, 31.302577 ], [ 121.160659, 31.283144 ], [ 121.138485, 31.276495 ], [ 121.090442, 31.291838 ], [ 121.060261, 31.245289 ], [ 121.076892, 31.158267 ], [ 121.018377, 31.134194 ], [ 120.930298, 31.141365 ], [ 120.881023, 31.134706 ], [ 120.859465, 31.100379 ], [ 120.890878, 31.094229 ], [ 120.901349, 31.017327 ], [ 120.865624, 30.989627 ], [ 120.820661, 31.006556 ], [ 120.770154, 30.996809 ], [ 120.746132, 30.962432 ], [ 120.698089, 30.970643 ], [ 120.684538, 30.955247 ], [ 120.709176, 30.933176 ], [ 120.713487, 30.88491 ], [ 120.68269, 30.882342 ], [ 120.653741, 30.846896 ], [ 120.589068, 30.854603 ], [ 120.563814, 30.835592 ], [ 120.503452, 30.757967 ], [ 120.489285, 30.763624 ], [ 120.460336, 30.839702 ], [ 120.441858, 30.860768 ], [ 120.435083, 30.920855 ], [ 120.42338, 30.902884 ], [ 120.35809, 30.886964 ], [ 120.371025, 30.948575 ], [ 120.316206, 30.933689 ], [ 120.223816, 30.926502 ], [ 120.149903, 30.937283 ], [ 120.111099, 30.955761 ], [ 120.052584, 31.00553 ], [ 120.001461, 31.027071 ], [ 119.988527, 31.059375 ], [ 119.946027, 31.106016 ], [ 119.921389, 31.170045 ], [ 119.878274, 31.160828 ], [ 119.827151, 31.174142 ], [ 119.809904, 31.148536 ], [ 119.779723, 31.17875 ], [ 119.715666, 31.169533 ], [ 119.705811, 31.152634 ], [ 119.678093, 31.167997 ], [ 119.623891, 31.130096 ], [ 119.599869, 31.10909 ], [ 119.532732, 31.159291 ], [ 119.461283, 31.156219 ], [ 119.439109, 31.177214 ], [ 119.391682, 31.174142 ], [ 119.360269, 31.213049 ], [ 119.374435, 31.258591 ], [ 119.350414, 31.301043 ], [ 119.338095, 31.259103 ], [ 119.294363, 31.263195 ], [ 119.266646, 31.250405 ], [ 119.198277, 31.270357 ], [ 119.197661, 31.295418 ], [ 119.158241, 31.294907 ], [ 119.107118, 31.250917 ], [ 119.10527, 31.235055 ], [ 119.014727, 31.241707 ], [ 118.984546, 31.237102 ], [ 118.870597, 31.242219 ], [ 118.794836, 31.229426 ], [ 118.756648, 31.279564 ], [ 118.726467, 31.282121 ], [ 118.720924, 31.322518 ], [ 118.745561, 31.372606 ], [ 118.767735, 31.363919 ], [ 118.824401, 31.375672 ], [ 118.852119, 31.393553 ], [ 118.883532, 31.500261 ], [ 118.885995, 31.519139 ], [ 118.881684, 31.564023 ], [ 118.858894, 31.623665 ], [ 118.802844, 31.619078 ], [ 118.773894, 31.682759 ], [ 118.748025, 31.675629 ], [ 118.736322, 31.633347 ], [ 118.643315, 31.649651 ], [ 118.643315, 31.671555 ], [ 118.697518, 31.709747 ], [ 118.653786, 31.73011 ], [ 118.641467, 31.75861 ], [ 118.571866, 31.746397 ], [ 118.5577, 31.73011 ], [ 118.521975, 31.743343 ], [ 118.533678, 31.76726 ], [ 118.481939, 31.778453 ], [ 118.504729, 31.841516 ], [ 118.466541, 31.857784 ], [ 118.472084, 31.879639 ], [ 118.363679, 31.930443 ], [ 118.389548, 31.985281 ], [ 118.394476, 32.076098 ], [ 118.433896, 32.086746 ], [ 118.501033, 32.121726 ], [ 118.49549, 32.165304 ], [ 118.510888, 32.194176 ], [ 118.643931, 32.209875 ], [ 118.674728, 32.250375 ], [ 118.657482, 32.30148 ], [ 118.703061, 32.328792 ], [ 118.685199, 32.403604 ], [ 118.691359, 32.472295 ], [ 118.628533, 32.467751 ], [ 118.592192, 32.481383 ], [ 118.608823, 32.536899 ], [ 118.564475, 32.562122 ], [ 118.568787, 32.585825 ], [ 118.59712, 32.600951 ], [ 118.632844, 32.578261 ], [ 118.658714, 32.594397 ], [ 118.688895, 32.588346 ], [ 118.719076, 32.614059 ], [ 118.719076, 32.614059 ], [ 118.73509, 32.58885 ], [ 118.757264, 32.603976 ], [ 118.784981, 32.582295 ], [ 118.820706, 32.60448 ], [ 118.84288, 32.56767 ], [ 118.908169, 32.59238 ], [ 118.890923, 32.553042 ], [ 118.92172, 32.557078 ], [ 118.922336, 32.557078 ], [ 118.92172, 32.557078 ], [ 118.922336, 32.557078 ], [ 118.975923, 32.505108 ], [ 119.041212, 32.515201 ], [ 119.084944, 32.452602 ], [ 119.142226, 32.499556 ], [ 119.168096, 32.536394 ], [ 119.152697, 32.557582 ], [ 119.22045, 32.576748 ], [ 119.230921, 32.607001 ], [ 119.208748, 32.641276 ], [ 119.211827, 32.708275 ], [ 119.184726, 32.825529 ], [ 119.113277, 32.823014 ], [ 119.054763, 32.8748 ], [ 119.020886, 32.955685 ], [ 118.993169, 32.958196 ], [ 118.934039, 32.93861 ], [ 118.892771, 32.941121 ], [ 118.89585, 32.957694 ], [ 118.89585, 32.957694 ], [ 118.849039, 32.956689 ], [ 118.846575, 32.922034 ], [ 118.821322, 32.920527 ], [ 118.810235, 32.853687 ], [ 118.743097, 32.853184 ], [ 118.743097, 32.853184 ], [ 118.73817, 32.772708 ], [ 118.756648, 32.737477 ], [ 118.707373, 32.72036 ], [ 118.642699, 32.744525 ], [ 118.572482, 32.719856 ], [ 118.560163, 32.729926 ], [ 118.483787, 32.721367 ], [ 118.450526, 32.743518 ], [ 118.411106, 32.715828 ], [ 118.375382, 32.718849 ], [ 118.363063, 32.770695 ], [ 118.334114, 32.761637 ], [ 118.300237, 32.783275 ], [ 118.301469, 32.846145 ], [ 118.250346, 32.848157 ], [ 118.2331, 32.914498 ], [ 118.252194, 32.936601 ], [ 118.291614, 32.946143 ], [ 118.303933, 32.96874 ], [ 118.26944, 32.969242 ], [ 118.244803, 32.998359 ], [ 118.243571, 33.027967 ], [ 118.219549, 33.114227 ], [ 118.217085, 33.191888 ], [ 118.178281, 33.217926 ], [ 118.149332, 33.169348 ], [ 118.038463, 33.134776 ], [ 118.037231, 33.152314 ], [ 117.988572, 33.180869 ], [ 117.977485, 33.226437 ], [ 117.942376, 33.224936 ], [ 117.939297, 33.262475 ], [ 117.974405, 33.279487 ], [ 117.992883, 33.333005 ], [ 118.029224, 33.374995 ], [ 118.016905, 33.402978 ], [ 118.027376, 33.455421 ], [ 118.050782, 33.491863 ], [ 118.107448, 33.475391 ], [ 118.117919, 33.594615 ], [ 118.112376, 33.617045 ], [ 118.16781, 33.663381 ], [ 118.161035, 33.735576 ], [ 118.117919, 33.766427 ], [ 118.065564, 33.76593 ], [ 118.019985, 33.738562 ], [ 117.972557, 33.74951 ], [ 117.901724, 33.720146 ], [ 117.843826, 33.736074 ], [ 117.791471, 33.733585 ], [ 117.750203, 33.710688 ], [ 117.72495, 33.74951 ], [ 117.739732, 33.758467 ], [ 117.759442, 33.874318 ], [ 117.753899, 33.891211 ], [ 117.715095, 33.879287 ], [ 117.672595, 33.934916 ], [ 117.671363, 33.992494 ], [ 117.629479, 34.028708 ], [ 117.612849, 34.000433 ], [ 117.569117, 33.985051 ], [ 117.543248, 34.038627 ], [ 117.514914, 34.060941 ], [ 117.435458, 34.028212 ], [ 117.404045, 34.03218 ], [ 117.357234, 34.088205 ], [ 117.311654, 34.067882 ], [ 117.277162, 34.078787 ], [ 117.257452, 34.065899 ], [ 117.192162, 34.068873 ], [ 117.130568, 34.101586 ], [ 117.123793, 34.128342 ], [ 117.046801, 34.151622 ], [ 117.025243, 34.167469 ], [ 117.051112, 34.221425 ], [ 116.969192, 34.283753 ], [ 116.983359, 34.348011 ], [ 116.960569, 34.363821 ], [ 116.969192, 34.389012 ], [ 116.909446, 34.408271 ], [ 116.828142, 34.389012 ], [ 116.782563, 34.429993 ], [ 116.773939, 34.453683 ], [ 116.722816, 34.472434 ], [ 116.662454, 34.472927 ], [ 116.592237, 34.493646 ], [ 116.594085, 34.511894 ], [ 116.490607, 34.573513 ], [ 116.477057, 34.614896 ], [ 116.432709, 34.630163 ], [ 116.430245, 34.650843 ], [ 116.374195, 34.640011 ], [ 116.392057, 34.710391 ], [ 116.363724, 34.715311 ], [ 116.369267, 34.749247 ], [ 116.403144, 34.756131 ], [ 116.408071, 34.850972 ], [ 116.445028, 34.895652 ], [ 116.557745, 34.908905 ], [ 116.613795, 34.922645 ], [ 116.622418, 34.939818 ], [ 116.677853, 34.939327 ], [ 116.781331, 34.916757 ], [ 116.781947, 34.961891 ], [ 116.809048, 34.968757 ], [ 116.821983, 34.929515 ], [ 116.858323, 34.928533 ], [ 116.922381, 34.894671 ], [ 116.929156, 34.843114 ], [ 116.966113, 34.844588 ], [ 116.979047, 34.815113 ], [ 116.95133, 34.81069 ], [ 116.969192, 34.771864 ], [ 117.022163, 34.759081 ], [ 117.070206, 34.713835 ], [ 117.061583, 34.675947 ], [ 117.073286, 34.639026 ], [ 117.104083, 34.648874 ], [ 117.15151, 34.559222 ], [ 117.139191, 34.526687 ], [ 117.166293, 34.434435 ], [ 117.248213, 34.451216 ], [ 117.252524, 34.48674 ], [ 117.27285, 34.499565 ], [ 117.267307, 34.528659 ], [ 117.311654, 34.561686 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"330000\", \"name\": \"浙江省\", \"center\": [ 120.153576, 30.287459 ], \"centroid\": [ 120.109921, 29.181449 ], \"childrenNum\": 11, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 10, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 118.433896, 28.288335 ], [ 118.480091, 28.327325 ], [ 118.455454, 28.384204 ], [ 118.432048, 28.402104 ], [ 118.456686, 28.424738 ], [ 118.474548, 28.478934 ], [ 118.414802, 28.497344 ], [ 118.4302, 28.515225 ], [ 118.412338, 28.55676 ], [ 118.428352, 28.617193 ], [ 118.428352, 28.617193 ], [ 118.428352, 28.681267 ], [ 118.403099, 28.702791 ], [ 118.364295, 28.813491 ], [ 118.300237, 28.826075 ], [ 118.270056, 28.918836 ], [ 118.195527, 28.904167 ], [ 118.227556, 28.942406 ], [ 118.165346, 28.986912 ], [ 118.133933, 28.983771 ], [ 118.115455, 29.009944 ], [ 118.115455, 29.009944 ], [ 118.097593, 28.998952 ], [ 118.066796, 29.053898 ], [ 118.076035, 29.074822 ], [ 118.037847, 29.102017 ], [ 118.045238, 29.149068 ], [ 118.027992, 29.167882 ], [ 118.042159, 29.210202 ], [ 118.073571, 29.216993 ], [ 118.077883, 29.290614 ], [ 118.138861, 29.283828 ], [ 118.178281, 29.297921 ], [ 118.166578, 29.314099 ], [ 118.205382, 29.343839 ], [ 118.193064, 29.395472 ], [ 118.248498, 29.431443 ], [ 118.316252, 29.422581 ], [ 118.306396, 29.479384 ], [ 118.329802, 29.495012 ], [ 118.347664, 29.474174 ], [ 118.381541, 29.504909 ], [ 118.496106, 29.519492 ], [ 118.500417, 29.57572 ], [ 118.532446, 29.588731 ], [ 118.573714, 29.638159 ], [ 118.61991, 29.654282 ], [ 118.647011, 29.64336 ], [ 118.700598, 29.706277 ], [ 118.744945, 29.73902 ], [ 118.740634, 29.814859 ], [ 118.841032, 29.891159 ], [ 118.838568, 29.934733 ], [ 118.894619, 29.937845 ], [ 118.902626, 30.029078 ], [ 118.878604, 30.064822 ], [ 118.873677, 30.11505 ], [ 118.895234, 30.148694 ], [ 118.852119, 30.149729 ], [ 118.852735, 30.166805 ], [ 118.929727, 30.2025 ], [ 118.905089, 30.216464 ], [ 118.877988, 30.282637 ], [ 118.880452, 30.31519 ], [ 118.954365, 30.360126 ], [ 118.988857, 30.332237 ], [ 119.06277, 30.304856 ], [ 119.091719, 30.323972 ], [ 119.126828, 30.304856 ], [ 119.201356, 30.290905 ], [ 119.236465, 30.297106 ], [ 119.246936, 30.341018 ], [ 119.277117, 30.341018 ], [ 119.326392, 30.372002 ], [ 119.349182, 30.349281 ], [ 119.402768, 30.374584 ], [ 119.36766, 30.38491 ], [ 119.335015, 30.448389 ], [ 119.336247, 30.508734 ], [ 119.326392, 30.532964 ], [ 119.272189, 30.510281 ], [ 119.237081, 30.546881 ], [ 119.265414, 30.574709 ], [ 119.238929, 30.609225 ], [ 119.323312, 30.630341 ], [ 119.343022, 30.664322 ], [ 119.39045, 30.685941 ], [ 119.408312, 30.645274 ], [ 119.444652, 30.650422 ], [ 119.482841, 30.704467 ], [ 119.479761, 30.772365 ], [ 119.527188, 30.77905 ], [ 119.55429, 30.825828 ], [ 119.575847, 30.829939 ], [ 119.557369, 30.874124 ], [ 119.563529, 30.919315 ], [ 119.582007, 30.932149 ], [ 119.580159, 30.967051 ], [ 119.633746, 31.019379 ], [ 119.629434, 31.085517 ], [ 119.649144, 31.104991 ], [ 119.623891, 31.130096 ], [ 119.678093, 31.167997 ], [ 119.705811, 31.152634 ], [ 119.715666, 31.169533 ], [ 119.779723, 31.17875 ], [ 119.809904, 31.148536 ], [ 119.827151, 31.174142 ], [ 119.878274, 31.160828 ], [ 119.921389, 31.170045 ], [ 119.946027, 31.106016 ], [ 119.988527, 31.059375 ], [ 120.001461, 31.027071 ], [ 120.052584, 31.00553 ], [ 120.111099, 30.955761 ], [ 120.149903, 30.937283 ], [ 120.223816, 30.926502 ], [ 120.316206, 30.933689 ], [ 120.371025, 30.948575 ], [ 120.35809, 30.886964 ], [ 120.42338, 30.902884 ], [ 120.435083, 30.920855 ], [ 120.441858, 30.860768 ], [ 120.460336, 30.839702 ], [ 120.489285, 30.763624 ], [ 120.503452, 30.757967 ], [ 120.563814, 30.835592 ], [ 120.589068, 30.854603 ], [ 120.653741, 30.846896 ], [ 120.68269, 30.882342 ], [ 120.713487, 30.88491 ], [ 120.709176, 30.933176 ], [ 120.684538, 30.955247 ], [ 120.698089, 30.970643 ], [ 120.746132, 30.962432 ], [ 120.770154, 30.996809 ], [ 120.820661, 31.006556 ], [ 120.865624, 30.989627 ], [ 120.901349, 31.017327 ], [ 120.940153, 31.010146 ], [ 120.949392, 31.030148 ], [ 120.989428, 31.01425 ], [ 121.000515, 30.938309 ], [ 120.993124, 30.889532 ], [ 121.020225, 30.872069 ], [ 120.991892, 30.837133 ], [ 121.038087, 30.814007 ], [ 121.060261, 30.845354 ], [ 121.097833, 30.857171 ], [ 121.13787, 30.826342 ], [ 121.123087, 30.77905 ], [ 121.174826, 30.771851 ], [ 121.21671, 30.785734 ], [ 121.232108, 30.755909 ], [ 121.272144, 30.723504 ], [ 121.274608, 30.677191 ], [ 121.239499, 30.648878 ], [ 121.188992, 30.632916 ], [ 121.148956, 30.599953 ], [ 121.058413, 30.563888 ], [ 121.092906, 30.515952 ], [ 121.183449, 30.434458 ], [ 121.225333, 30.404526 ], [ 121.328195, 30.397299 ], [ 121.371926, 30.37097 ], [ 121.395332, 30.338435 ], [ 121.497578, 30.258861 ], [ 121.561636, 30.184395 ], [ 121.635548, 30.070002 ], [ 121.652795, 30.071037 ], [ 121.699606, 30.007832 ], [ 121.721164, 29.992802 ], [ 121.78399, 29.99332 ], [ 121.835113, 29.958068 ], [ 121.919497, 29.920729 ], [ 121.971235, 29.955476 ], [ 122.00388, 29.92021 ], [ 122.00696, 29.891678 ], [ 122.140003, 29.901535 ], [ 122.143082, 29.877668 ], [ 122.10243, 29.859504 ], [ 122.043916, 29.822647 ], [ 122.003264, 29.762401 ], [ 121.937359, 29.748373 ], [ 121.833265, 29.653242 ], [ 121.872685, 29.632437 ], [ 121.909641, 29.650122 ], [ 121.966308, 29.636078 ], [ 122.000185, 29.582486 ], [ 121.995257, 29.545007 ], [ 121.968772, 29.515846 ], [ 121.973083, 29.477821 ], [ 121.993409, 29.45229 ], [ 121.975547, 29.411113 ], [ 121.937975, 29.384 ], [ 121.936127, 29.348012 ], [ 121.958301, 29.334448 ], [ 121.94475, 29.28435 ], [ 122.000185, 29.278608 ], [ 122.002032, 29.260336 ], [ 121.966924, 29.249894 ], [ 121.971851, 29.193485 ], [ 121.948446, 29.193485 ], [ 121.986634, 29.154817 ], [ 121.988482, 29.110906 ], [ 121.970004, 29.092604 ], [ 121.966308, 29.052852 ], [ 121.884388, 29.105677 ], [ 121.85975, 29.086328 ], [ 121.811091, 29.10986 ], [ 121.780294, 29.10986 ], [ 121.767975, 29.166837 ], [ 121.750113, 29.136523 ], [ 121.715621, 29.125022 ], [ 121.608447, 29.168927 ], [ 121.616454, 29.143318 ], [ 121.660186, 29.118226 ], [ 121.658954, 29.058606 ], [ 121.712541, 29.028783 ], [ 121.711309, 28.985865 ], [ 121.743338, 28.954451 ], [ 121.772287, 28.898404 ], [ 121.774751, 28.863818 ], [ 121.687287, 28.863294 ], [ 121.704534, 28.804577 ], [ 121.689135, 28.719062 ], [ 121.646019, 28.682842 ], [ 121.540694, 28.655537 ], [ 121.557324, 28.645033 ], [ 121.596128, 28.575156 ], [ 121.634317, 28.562542 ], [ 121.646019, 28.511544 ], [ 121.671273, 28.472621 ], [ 121.692831, 28.407368 ], [ 121.658954, 28.392628 ], [ 121.634317, 28.347868 ], [ 121.660186, 28.355768 ], [ 121.669425, 28.33312 ], [ 121.627541, 28.251966 ], [ 121.580114, 28.240368 ], [ 121.571491, 28.279376 ], [ 121.538846, 28.299401 ], [ 121.488955, 28.301509 ], [ 121.45631, 28.250385 ], [ 121.402107, 28.197127 ], [ 121.373774, 28.133287 ], [ 121.328195, 28.134343 ], [ 121.299862, 28.067297 ], [ 121.261057, 28.034551 ], [ 121.176058, 28.022401 ], [ 121.140949, 28.031382 ], [ 121.121239, 28.12537 ], [ 121.108304, 28.139092 ], [ 121.059029, 28.096338 ], [ 121.015298, 27.981714 ], [ 120.991892, 27.95 ], [ 121.05595, 27.900294 ], [ 121.099681, 27.895005 ], [ 121.162507, 27.90717 ], [ 121.162507, 27.879136 ], [ 121.193304, 27.872259 ], [ 121.192072, 27.822518 ], [ 121.152652, 27.810344 ], [ 121.153268, 27.809815 ], [ 121.149572, 27.801875 ], [ 121.149572, 27.801345 ], [ 121.13479, 27.787051 ], [ 121.134174, 27.787051 ], [ 121.152036, 27.815638 ], [ 121.107688, 27.81352 ], [ 121.070116, 27.834162 ], [ 121.027616, 27.832574 ], [ 120.97403, 27.887071 ], [ 120.942001, 27.896592 ], [ 120.910588, 27.864852 ], [ 120.840371, 27.758986 ], [ 120.797871, 27.779638 ], [ 120.760915, 27.717671 ], [ 120.709176, 27.682699 ], [ 120.685154, 27.622797 ], [ 120.634647, 27.577186 ], [ 120.637111, 27.561271 ], [ 120.703016, 27.478475 ], [ 120.673451, 27.420055 ], [ 120.665444, 27.357884 ], [ 120.580444, 27.321203 ], [ 120.554575, 27.25206 ], [ 120.574901, 27.234501 ], [ 120.545952, 27.156785 ], [ 120.492365, 27.136016 ], [ 120.461568, 27.142407 ], [ 120.404286, 27.204166 ], [ 120.401822, 27.250996 ], [ 120.430155, 27.258976 ], [ 120.343924, 27.363199 ], [ 120.340844, 27.399867 ], [ 120.273091, 27.38924 ], [ 120.26262, 27.432804 ], [ 120.221352, 27.420055 ], [ 120.134504, 27.420055 ], [ 120.136968, 27.402523 ], [ 120.096316, 27.390302 ], [ 120.052584, 27.338747 ], [ 120.026099, 27.344063 ], [ 120.008237, 27.375423 ], [ 119.960194, 27.365857 ], [ 119.938636, 27.329709 ], [ 119.843165, 27.300464 ], [ 119.768636, 27.307909 ], [ 119.782187, 27.330241 ], [ 119.739687, 27.362668 ], [ 119.750774, 27.373829 ], [ 119.711354, 27.403054 ], [ 119.685485, 27.438646 ], [ 119.703347, 27.446613 ], [ 119.70889, 27.514042 ], [ 119.690412, 27.537394 ], [ 119.659615, 27.540578 ], [ 119.675014, 27.574534 ], [ 119.630666, 27.582491 ], [ 119.626354, 27.620676 ], [ 119.644217, 27.663619 ], [ 119.606028, 27.674749 ], [ 119.541971, 27.666799 ], [ 119.501319, 27.649837 ], [ 119.501935, 27.610601 ], [ 119.466826, 27.526249 ], [ 119.438493, 27.508734 ], [ 119.416935, 27.539517 ], [ 119.360269, 27.524657 ], [ 119.334399, 27.480067 ], [ 119.285124, 27.457766 ], [ 119.26911, 27.42218 ], [ 119.224146, 27.416868 ], [ 119.14777, 27.424836 ], [ 119.121284, 27.438115 ], [ 119.129907, 27.475289 ], [ 119.092335, 27.466262 ], [ 119.03998, 27.478475 ], [ 119.020886, 27.498118 ], [ 118.983314, 27.498649 ], [ 118.986393, 27.47582 ], [ 118.955597, 27.4498 ], [ 118.907553, 27.460952 ], [ 118.869365, 27.540047 ], [ 118.909401, 27.568168 ], [ 118.913713, 27.619616 ], [ 118.879836, 27.667859 ], [ 118.873677, 27.733563 ], [ 118.829329, 27.847921 ], [ 118.818242, 27.916689 ], [ 118.753568, 27.947885 ], [ 118.730163, 27.970615 ], [ 118.733858, 28.027684 ], [ 118.719076, 28.063601 ], [ 118.767735, 28.10584 ], [ 118.802228, 28.117453 ], [ 118.805923, 28.154923 ], [ 118.771431, 28.188687 ], [ 118.804075, 28.207675 ], [ 118.802228, 28.240368 ], [ 118.756032, 28.252493 ], [ 118.719692, 28.312047 ], [ 118.699366, 28.309939 ], [ 118.674728, 28.27147 ], [ 118.651322, 28.277267 ], [ 118.595272, 28.258292 ], [ 118.588497, 28.282538 ], [ 118.493026, 28.262509 ], [ 118.490562, 28.238259 ], [ 118.444367, 28.253548 ], [ 118.433896, 28.288335 ] ] ], [ [ [ 122.163408, 29.988137 ], [ 122.118445, 29.986582 ], [ 122.106742, 30.005759 ], [ 122.027902, 29.991247 ], [ 121.978011, 30.059125 ], [ 121.989714, 30.077252 ], [ 121.983554, 30.100554 ], [ 121.934895, 30.161631 ], [ 121.955221, 30.183878 ], [ 122.048844, 30.147141 ], [ 122.095655, 30.158008 ], [ 122.152938, 30.113497 ], [ 122.293988, 30.100554 ], [ 122.288444, 30.073109 ], [ 122.310002, 30.039958 ], [ 122.343879, 30.020269 ], [ 122.341415, 29.976733 ], [ 122.322321, 29.940438 ], [ 122.279205, 29.937326 ], [ 122.239785, 29.962735 ], [ 122.163408, 29.988137 ] ] ], [ [ [ 122.213915, 30.186464 ], [ 122.168336, 30.138343 ], [ 122.143698, 30.163183 ], [ 122.152938, 30.19112 ], [ 122.178807, 30.199396 ], [ 122.213915, 30.186464 ] ] ], [ [ [ 122.229314, 29.711995 ], [ 122.231162, 29.710435 ], [ 122.269966, 29.685482 ], [ 122.210836, 29.700559 ], [ 122.229314, 29.711995 ] ] ], [ [ [ 122.427646, 30.738422 ], [ 122.445509, 30.745109 ], [ 122.475074, 30.714243 ], [ 122.528045, 30.725047 ], [ 122.532972, 30.696748 ], [ 122.427031, 30.697777 ], [ 122.427646, 30.738422 ] ] ], [ [ [ 122.162793, 30.329654 ], [ 122.176343, 30.351863 ], [ 122.191126, 30.329654 ], [ 122.228082, 30.329654 ], [ 122.247176, 30.30124 ], [ 122.231778, 30.234562 ], [ 122.154169, 30.244903 ], [ 122.058083, 30.291938 ], [ 122.162793, 30.329654 ] ] ], [ [ [ 122.317393, 30.249556 ], [ 122.333408, 30.272817 ], [ 122.40732, 30.272817 ], [ 122.417175, 30.238699 ], [ 122.365437, 30.255242 ], [ 122.358661, 30.236113 ], [ 122.277973, 30.242835 ], [ 122.317393, 30.249556 ] ] ], [ [ [ 122.026054, 29.178333 ], [ 122.036525, 29.20759 ], [ 122.075945, 29.176243 ], [ 122.056851, 29.158476 ], [ 122.013119, 29.151681 ], [ 122.026054, 29.178333 ] ] ], [ [ [ 122.372212, 29.893234 ], [ 122.362973, 29.894272 ], [ 122.353734, 29.89946 ], [ 122.338951, 29.911911 ], [ 122.330944, 29.937845 ], [ 122.351886, 29.959105 ], [ 122.398081, 29.9394 ], [ 122.411632, 29.951846 ], [ 122.43319, 29.919173 ], [ 122.433806, 29.883376 ], [ 122.401777, 29.869884 ], [ 122.415944, 29.828877 ], [ 122.386379, 29.834069 ], [ 122.372212, 29.893234 ] ] ], [ [ [ 122.43011, 30.408655 ], [ 122.352502, 30.422074 ], [ 122.318625, 30.407106 ], [ 122.281669, 30.418461 ], [ 122.277973, 30.471603 ], [ 122.37406, 30.461802 ], [ 122.432574, 30.445294 ], [ 122.43011, 30.408655 ] ] ], [ [ [ 121.837577, 28.770484 ], [ 121.861598, 28.814016 ], [ 121.86283, 28.782024 ], [ 121.837577, 28.770484 ] ] ], [ [ [ 122.265038, 29.84549 ], [ 122.319241, 29.829397 ], [ 122.299531, 29.819532 ], [ 122.325401, 29.781621 ], [ 122.310002, 29.766557 ], [ 122.248408, 29.804473 ], [ 122.221307, 29.832512 ], [ 122.265038, 29.84549 ] ] ], [ [ [ 121.790765, 29.082144 ], [ 121.82033, 29.099402 ], [ 121.84312, 29.082144 ], [ 121.832649, 29.050236 ], [ 121.790765, 29.082144 ] ] ], [ [ [ 121.943518, 30.776993 ], [ 121.970004, 30.789333 ], [ 121.987866, 30.753338 ], [ 121.992793, 30.695204 ], [ 122.011271, 30.66947 ], [ 122.075329, 30.647848 ], [ 122.133227, 30.595317 ], [ 122.087032, 30.602014 ], [ 121.997105, 30.658659 ], [ 121.968156, 30.688514 ], [ 121.943518, 30.776993 ] ] ], [ [ [ 121.889315, 28.471569 ], [ 121.881924, 28.502603 ], [ 121.918881, 28.497344 ], [ 121.889315, 28.471569 ] ] ], [ [ [ 122.182503, 29.650642 ], [ 122.138155, 29.662083 ], [ 122.095655, 29.716673 ], [ 122.074097, 29.701599 ], [ 122.047612, 29.719791 ], [ 122.083952, 29.78318 ], [ 122.13138, 29.788893 ], [ 122.146778, 29.749412 ], [ 122.200365, 29.712515 ], [ 122.211452, 29.692241 ], [ 122.182503, 29.650642 ] ] ], [ [ [ 122.461523, 29.944068 ], [ 122.459059, 29.938882 ], [ 122.467067, 29.928509 ], [ 122.462755, 29.927991 ], [ 122.457827, 29.927472 ], [ 122.45598, 29.926435 ], [ 122.452284, 29.935252 ], [ 122.4529, 29.936807 ], [ 122.449204, 29.9394 ], [ 122.450436, 29.940956 ], [ 122.451052, 29.940956 ], [ 122.451668, 29.943031 ], [ 122.460291, 29.947179 ], [ 122.459675, 29.944586 ], [ 122.461523, 29.944068 ] ] ], [ [ [ 122.570544, 30.644244 ], [ 122.546523, 30.651967 ], [ 122.559457, 30.679764 ], [ 122.570544, 30.644244 ] ] ], [ [ [ 121.869605, 28.423685 ], [ 121.889931, 28.45105 ], [ 121.910873, 28.44 ], [ 121.869605, 28.423685 ] ] ], [ [ [ 122.391306, 29.970512 ], [ 122.3679, 29.980361 ], [ 122.378371, 30.023896 ], [ 122.411632, 30.025969 ], [ 122.391306, 29.970512 ] ] ], [ [ [ 122.065474, 30.179739 ], [ 122.025438, 30.161631 ], [ 122.017431, 30.186464 ], [ 122.055619, 30.200431 ], [ 122.065474, 30.179739 ] ] ], [ [ [ 121.850511, 29.977251 ], [ 121.844968, 29.982953 ], [ 121.84004, 30.047211 ], [ 121.848663, 30.101072 ], [ 121.88562, 30.094859 ], [ 121.924424, 30.052391 ], [ 121.933047, 29.994875 ], [ 121.874533, 29.964809 ], [ 121.850511, 29.977251 ] ] ], [ [ [ 121.066421, 27.478475 ], [ 121.067036, 27.478475 ], [ 121.107073, 27.443958 ], [ 121.066421, 27.461483 ], [ 121.066421, 27.478475 ] ] ], [ [ [ 121.952141, 29.187738 ], [ 121.976779, 29.191918 ], [ 121.979243, 29.160043 ], [ 121.952141, 29.187738 ] ] ], [ [ [ 122.038373, 29.759284 ], [ 122.02975, 29.716673 ], [ 122.011271, 29.746294 ], [ 122.038373, 29.759284 ] ] ], [ [ [ 121.957685, 30.287804 ], [ 121.921344, 30.30744 ], [ 121.94167, 30.33327 ], [ 121.989098, 30.339985 ], [ 122.0008, 30.308473 ], [ 121.957685, 30.287804 ] ] ], [ [ [ 121.940438, 30.114533 ], [ 121.962612, 30.106249 ], [ 121.945982, 30.064304 ], [ 121.910257, 30.089163 ], [ 121.940438, 30.114533 ] ] ], [ [ [ 122.155401, 29.970512 ], [ 122.154169, 29.97103 ], [ 122.152322, 29.97103 ], [ 122.163408, 29.988137 ], [ 122.196053, 29.960661 ], [ 122.155401, 29.970512 ] ] ], [ [ [ 122.287828, 29.723949 ], [ 122.251488, 29.731225 ], [ 122.2133, 29.771752 ], [ 122.241633, 29.784738 ], [ 122.258263, 29.753569 ], [ 122.301379, 29.748373 ], [ 122.287828, 29.723949 ] ] ], [ [ [ 121.134174, 27.787051 ], [ 121.13479, 27.787051 ], [ 121.134174, 27.785992 ], [ 121.134174, 27.787051 ] ] ], [ [ [ 122.264423, 30.269716 ], [ 122.300147, 30.271266 ], [ 122.315545, 30.250073 ], [ 122.253952, 30.237147 ], [ 122.264423, 30.269716 ] ] ], [ [ [ 122.282901, 29.860542 ], [ 122.301379, 29.883895 ], [ 122.343263, 29.882857 ], [ 122.343263, 29.860542 ], [ 122.30877, 29.849642 ], [ 122.282901, 29.860542 ] ] ], [ [ [ 122.781196, 30.694175 ], [ 122.757174, 30.713728 ], [ 122.778732, 30.729677 ], [ 122.799674, 30.716301 ], [ 122.781196, 30.694175 ] ] ], [ [ [ 121.098449, 27.937311 ], [ 121.038087, 27.948942 ], [ 121.0695, 27.984357 ], [ 121.120623, 27.986471 ], [ 121.152652, 27.961629 ], [ 121.098449, 27.937311 ] ] ], [ [ [ 121.185913, 27.963215 ], [ 121.17113, 27.978543 ], [ 121.197616, 28.000739 ], [ 121.237652, 27.988056 ], [ 121.185913, 27.963215 ] ] ], [ [ [ 122.454132, 29.956513 ], [ 122.455364, 29.955994 ], [ 122.458443, 29.951846 ], [ 122.459059, 29.950809 ], [ 122.447972, 29.947698 ], [ 122.446741, 29.951327 ], [ 122.445509, 29.952365 ], [ 122.447972, 29.955994 ], [ 122.454132, 29.956513 ] ] ], [ [ [ 122.836014, 30.698806 ], [ 122.807681, 30.714243 ], [ 122.831087, 30.728648 ], [ 122.836014, 30.698806 ] ] ], [ [ [ 122.200365, 29.969475 ], [ 122.239785, 29.960142 ], [ 122.273662, 29.93214 ], [ 122.233626, 29.946661 ], [ 122.200365, 29.969475 ] ] ], [ [ [ 122.029134, 29.954957 ], [ 122.058699, 29.955994 ], [ 122.043916, 29.930584 ], [ 122.029134, 29.954957 ] ] ], [ [ [ 121.044247, 27.979072 ], [ 121.073812, 28.007608 ], [ 121.089826, 27.998625 ], [ 121.044247, 27.979072 ] ] ], [ [ [ 122.471378, 29.927472 ], [ 122.47261, 29.927472 ], [ 122.473226, 29.925397 ], [ 122.470762, 29.925916 ], [ 122.471378, 29.927472 ] ] ], [ [ [ 122.152322, 29.97103 ], [ 122.154169, 29.97103 ], [ 122.155401, 29.970512 ], [ 122.152322, 29.97103 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"340000\", \"name\": \"安徽省\", \"center\": [ 117.283042, 31.86119 ], \"centroid\": [ 117.226862, 31.849273 ], \"childrenNum\": 16, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 11, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 116.599629, 34.014324 ], [ 116.599629, 34.014324 ], [ 116.576223, 34.068873 ], [ 116.576223, 34.068873 ], [ 116.52818, 34.122892 ], [ 116.536187, 34.151127 ], [ 116.565752, 34.16945 ], [ 116.542962, 34.203608 ], [ 116.545426, 34.241711 ], [ 116.582382, 34.266444 ], [ 116.562056, 34.285731 ], [ 116.516477, 34.296114 ], [ 116.456731, 34.268917 ], [ 116.409303, 34.273863 ], [ 116.409303, 34.273863 ], [ 116.372347, 34.26595 ], [ 116.363724, 34.316877 ], [ 116.301514, 34.342082 ], [ 116.255934, 34.376665 ], [ 116.213435, 34.382098 ], [ 116.215898, 34.403333 ], [ 116.178942, 34.430487 ], [ 116.162312, 34.459605 ], [ 116.178326, 34.496112 ], [ 116.204196, 34.508442 ], [ 116.191261, 34.535561 ], [ 116.196804, 34.575977 ], [ 116.247927, 34.551829 ], [ 116.286116, 34.608986 ], [ 116.32492, 34.601104 ], [ 116.334159, 34.620806 ], [ 116.374195, 34.640011 ], [ 116.430245, 34.650843 ], [ 116.432709, 34.630163 ], [ 116.477057, 34.614896 ], [ 116.490607, 34.573513 ], [ 116.594085, 34.511894 ], [ 116.592237, 34.493646 ], [ 116.662454, 34.472927 ], [ 116.722816, 34.472434 ], [ 116.773939, 34.453683 ], [ 116.782563, 34.429993 ], [ 116.828142, 34.389012 ], [ 116.909446, 34.408271 ], [ 116.969192, 34.389012 ], [ 116.960569, 34.363821 ], [ 116.983359, 34.348011 ], [ 116.969192, 34.283753 ], [ 117.051112, 34.221425 ], [ 117.025243, 34.167469 ], [ 117.046801, 34.151622 ], [ 117.123793, 34.128342 ], [ 117.130568, 34.101586 ], [ 117.192162, 34.068873 ], [ 117.257452, 34.065899 ], [ 117.277162, 34.078787 ], [ 117.311654, 34.067882 ], [ 117.357234, 34.088205 ], [ 117.404045, 34.03218 ], [ 117.435458, 34.028212 ], [ 117.514914, 34.060941 ], [ 117.543248, 34.038627 ], [ 117.569117, 33.985051 ], [ 117.612849, 34.000433 ], [ 117.629479, 34.028708 ], [ 117.671363, 33.992494 ], [ 117.672595, 33.934916 ], [ 117.715095, 33.879287 ], [ 117.753899, 33.891211 ], [ 117.759442, 33.874318 ], [ 117.739732, 33.758467 ], [ 117.72495, 33.74951 ], [ 117.750203, 33.710688 ], [ 117.791471, 33.733585 ], [ 117.843826, 33.736074 ], [ 117.901724, 33.720146 ], [ 117.972557, 33.74951 ], [ 118.019985, 33.738562 ], [ 118.065564, 33.76593 ], [ 118.117919, 33.766427 ], [ 118.161035, 33.735576 ], [ 118.16781, 33.663381 ], [ 118.112376, 33.617045 ], [ 118.117919, 33.594615 ], [ 118.107448, 33.475391 ], [ 118.050782, 33.491863 ], [ 118.027376, 33.455421 ], [ 118.016905, 33.402978 ], [ 118.029224, 33.374995 ], [ 117.992883, 33.333005 ], [ 117.974405, 33.279487 ], [ 117.939297, 33.262475 ], [ 117.942376, 33.224936 ], [ 117.977485, 33.226437 ], [ 117.988572, 33.180869 ], [ 118.037231, 33.152314 ], [ 118.038463, 33.134776 ], [ 118.149332, 33.169348 ], [ 118.178281, 33.217926 ], [ 118.217085, 33.191888 ], [ 118.219549, 33.114227 ], [ 118.243571, 33.027967 ], [ 118.244803, 32.998359 ], [ 118.26944, 32.969242 ], [ 118.303933, 32.96874 ], [ 118.291614, 32.946143 ], [ 118.252194, 32.936601 ], [ 118.2331, 32.914498 ], [ 118.250346, 32.848157 ], [ 118.301469, 32.846145 ], [ 118.300237, 32.783275 ], [ 118.334114, 32.761637 ], [ 118.363063, 32.770695 ], [ 118.375382, 32.718849 ], [ 118.411106, 32.715828 ], [ 118.450526, 32.743518 ], [ 118.483787, 32.721367 ], [ 118.560163, 32.729926 ], [ 118.572482, 32.719856 ], [ 118.642699, 32.744525 ], [ 118.707373, 32.72036 ], [ 118.756648, 32.737477 ], [ 118.73817, 32.772708 ], [ 118.743097, 32.853184 ], [ 118.743097, 32.853184 ], [ 118.810235, 32.853687 ], [ 118.821322, 32.920527 ], [ 118.846575, 32.922034 ], [ 118.849039, 32.956689 ], [ 118.89585, 32.957694 ], [ 118.89585, 32.957694 ], [ 118.892771, 32.941121 ], [ 118.934039, 32.93861 ], [ 118.993169, 32.958196 ], [ 119.020886, 32.955685 ], [ 119.054763, 32.8748 ], [ 119.113277, 32.823014 ], [ 119.184726, 32.825529 ], [ 119.211827, 32.708275 ], [ 119.208748, 32.641276 ], [ 119.230921, 32.607001 ], [ 119.22045, 32.576748 ], [ 119.152697, 32.557582 ], [ 119.168096, 32.536394 ], [ 119.142226, 32.499556 ], [ 119.084944, 32.452602 ], [ 119.041212, 32.515201 ], [ 118.975923, 32.505108 ], [ 118.922336, 32.557078 ], [ 118.92172, 32.557078 ], [ 118.922336, 32.557078 ], [ 118.92172, 32.557078 ], [ 118.890923, 32.553042 ], [ 118.908169, 32.59238 ], [ 118.84288, 32.56767 ], [ 118.820706, 32.60448 ], [ 118.784981, 32.582295 ], [ 118.757264, 32.603976 ], [ 118.73509, 32.58885 ], [ 118.719076, 32.614059 ], [ 118.719076, 32.614059 ], [ 118.688895, 32.588346 ], [ 118.658714, 32.594397 ], [ 118.632844, 32.578261 ], [ 118.59712, 32.600951 ], [ 118.568787, 32.585825 ], [ 118.564475, 32.562122 ], [ 118.608823, 32.536899 ], [ 118.592192, 32.481383 ], [ 118.628533, 32.467751 ], [ 118.691359, 32.472295 ], [ 118.685199, 32.403604 ], [ 118.703061, 32.328792 ], [ 118.657482, 32.30148 ], [ 118.674728, 32.250375 ], [ 118.643931, 32.209875 ], [ 118.510888, 32.194176 ], [ 118.49549, 32.165304 ], [ 118.501033, 32.121726 ], [ 118.433896, 32.086746 ], [ 118.394476, 32.076098 ], [ 118.389548, 31.985281 ], [ 118.363679, 31.930443 ], [ 118.472084, 31.879639 ], [ 118.466541, 31.857784 ], [ 118.504729, 31.841516 ], [ 118.481939, 31.778453 ], [ 118.533678, 31.76726 ], [ 118.521975, 31.743343 ], [ 118.5577, 31.73011 ], [ 118.571866, 31.746397 ], [ 118.641467, 31.75861 ], [ 118.653786, 31.73011 ], [ 118.697518, 31.709747 ], [ 118.643315, 31.671555 ], [ 118.643315, 31.649651 ], [ 118.736322, 31.633347 ], [ 118.748025, 31.675629 ], [ 118.773894, 31.682759 ], [ 118.802844, 31.619078 ], [ 118.858894, 31.623665 ], [ 118.881684, 31.564023 ], [ 118.885995, 31.519139 ], [ 118.868133, 31.520669 ], [ 118.857046, 31.506384 ], [ 118.883532, 31.500261 ], [ 118.852119, 31.393553 ], [ 118.824401, 31.375672 ], [ 118.767735, 31.363919 ], [ 118.745561, 31.372606 ], [ 118.720924, 31.322518 ], [ 118.726467, 31.282121 ], [ 118.756648, 31.279564 ], [ 118.794836, 31.229426 ], [ 118.870597, 31.242219 ], [ 118.984546, 31.237102 ], [ 119.014727, 31.241707 ], [ 119.10527, 31.235055 ], [ 119.107118, 31.250917 ], [ 119.158241, 31.294907 ], [ 119.197661, 31.295418 ], [ 119.198277, 31.270357 ], [ 119.266646, 31.250405 ], [ 119.294363, 31.263195 ], [ 119.338095, 31.259103 ], [ 119.350414, 31.301043 ], [ 119.374435, 31.258591 ], [ 119.360269, 31.213049 ], [ 119.391682, 31.174142 ], [ 119.439109, 31.177214 ], [ 119.461283, 31.156219 ], [ 119.532732, 31.159291 ], [ 119.599869, 31.10909 ], [ 119.623891, 31.130096 ], [ 119.649144, 31.104991 ], [ 119.629434, 31.085517 ], [ 119.633746, 31.019379 ], [ 119.580159, 30.967051 ], [ 119.582007, 30.932149 ], [ 119.563529, 30.919315 ], [ 119.557369, 30.874124 ], [ 119.575847, 30.829939 ], [ 119.55429, 30.825828 ], [ 119.527188, 30.77905 ], [ 119.479761, 30.772365 ], [ 119.482841, 30.704467 ], [ 119.444652, 30.650422 ], [ 119.408312, 30.645274 ], [ 119.39045, 30.685941 ], [ 119.343022, 30.664322 ], [ 119.323312, 30.630341 ], [ 119.238929, 30.609225 ], [ 119.265414, 30.574709 ], [ 119.237081, 30.546881 ], [ 119.272189, 30.510281 ], [ 119.326392, 30.532964 ], [ 119.336247, 30.508734 ], [ 119.335015, 30.448389 ], [ 119.36766, 30.38491 ], [ 119.402768, 30.374584 ], [ 119.349182, 30.349281 ], [ 119.326392, 30.372002 ], [ 119.277117, 30.341018 ], [ 119.246936, 30.341018 ], [ 119.236465, 30.297106 ], [ 119.201356, 30.290905 ], [ 119.126828, 30.304856 ], [ 119.091719, 30.323972 ], [ 119.06277, 30.304856 ], [ 118.988857, 30.332237 ], [ 118.954365, 30.360126 ], [ 118.880452, 30.31519 ], [ 118.877988, 30.282637 ], [ 118.905089, 30.216464 ], [ 118.929727, 30.2025 ], [ 118.852735, 30.166805 ], [ 118.852119, 30.149729 ], [ 118.895234, 30.148694 ], [ 118.873677, 30.11505 ], [ 118.878604, 30.064822 ], [ 118.902626, 30.029078 ], [ 118.894619, 29.937845 ], [ 118.838568, 29.934733 ], [ 118.841032, 29.891159 ], [ 118.740634, 29.814859 ], [ 118.744945, 29.73902 ], [ 118.700598, 29.706277 ], [ 118.647011, 29.64336 ], [ 118.61991, 29.654282 ], [ 118.573714, 29.638159 ], [ 118.532446, 29.588731 ], [ 118.500417, 29.57572 ], [ 118.496106, 29.519492 ], [ 118.381541, 29.504909 ], [ 118.347664, 29.474174 ], [ 118.329802, 29.495012 ], [ 118.306396, 29.479384 ], [ 118.316252, 29.422581 ], [ 118.248498, 29.431443 ], [ 118.193064, 29.395472 ], [ 118.136397, 29.418932 ], [ 118.127774, 29.47209 ], [ 118.143788, 29.489803 ], [ 118.095129, 29.534072 ], [ 118.050782, 29.542924 ], [ 118.042774, 29.566351 ], [ 118.00397, 29.578322 ], [ 117.933753, 29.549172 ], [ 117.872775, 29.54761 ], [ 117.795167, 29.570515 ], [ 117.729877, 29.550213 ], [ 117.690457, 29.555939 ], [ 117.678754, 29.595496 ], [ 117.647957, 29.614749 ], [ 117.608537, 29.591333 ], [ 117.543248, 29.588731 ], [ 117.523538, 29.630356 ], [ 117.530313, 29.654282 ], [ 117.490277, 29.660003 ], [ 117.453936, 29.688082 ], [ 117.455168, 29.749412 ], [ 117.408973, 29.802396 ], [ 117.415132, 29.85068 ], [ 117.382487, 29.840818 ], [ 117.359082, 29.812782 ], [ 117.338756, 29.848085 ], [ 117.29256, 29.822647 ], [ 117.25314, 29.834588 ], [ 117.261763, 29.880781 ], [ 117.246365, 29.915023 ], [ 117.2168, 29.926953 ], [ 117.171836, 29.920729 ], [ 117.129952, 29.89946 ], [ 117.127489, 29.86158 ], [ 117.073286, 29.831992 ], [ 117.123177, 29.798761 ], [ 117.136728, 29.775388 ], [ 117.108395, 29.75201 ], [ 117.112706, 29.711995 ], [ 117.041873, 29.680803 ], [ 116.996294, 29.683403 ], [ 116.974736, 29.657403 ], [ 116.939627, 29.648561 ], [ 116.873722, 29.609546 ], [ 116.849084, 29.57624 ], [ 116.780715, 29.569994 ], [ 116.760389, 29.599139 ], [ 116.721585, 29.564789 ], [ 116.716657, 29.590813 ], [ 116.651983, 29.637118 ], [ 116.680317, 29.681323 ], [ 116.704954, 29.688602 ], [ 116.706802, 29.6964 ], [ 116.70557, 29.69692 ], [ 116.698795, 29.707836 ], [ 116.673541, 29.709916 ], [ 116.762237, 29.802396 ], [ 116.780715, 29.792529 ], [ 116.882961, 29.893753 ], [ 116.900207, 29.949253 ], [ 116.868794, 29.980361 ], [ 116.83307, 29.95755 ], [ 116.830606, 30.004723 ], [ 116.802889, 29.99643 ], [ 116.783794, 30.030632 ], [ 116.747454, 30.057053 ], [ 116.720353, 30.053945 ], [ 116.666766, 30.076734 ], [ 116.620571, 30.073109 ], [ 116.585462, 30.045657 ], [ 116.552201, 29.909836 ], [ 116.525716, 29.897385 ], [ 116.467818, 29.896347 ], [ 116.342782, 29.835626 ], [ 116.280572, 29.788893 ], [ 116.250391, 29.785777 ], [ 116.227601, 29.816936 ], [ 116.172783, 29.828358 ], [ 116.13521, 29.819532 ], [ 116.128435, 29.897904 ], [ 116.073616, 29.969993 ], [ 116.091479, 30.036331 ], [ 116.078544, 30.062233 ], [ 116.088399, 30.110391 ], [ 116.055754, 30.180774 ], [ 116.065609, 30.204569 ], [ 115.997856, 30.252657 ], [ 115.985537, 30.290905 ], [ 115.903001, 30.31364 ], [ 115.91532, 30.337919 ], [ 115.885139, 30.379747 ], [ 115.921479, 30.416397 ], [ 115.894994, 30.452517 ], [ 115.910393, 30.519046 ], [ 115.887603, 30.542758 ], [ 115.876516, 30.582438 ], [ 115.848799, 30.602014 ], [ 115.819234, 30.597893 ], [ 115.81369, 30.637035 ], [ 115.762567, 30.685426 ], [ 115.782893, 30.751795 ], [ 115.851262, 30.756938 ], [ 115.863581, 30.815549 ], [ 115.848799, 30.828397 ], [ 115.865429, 30.864364 ], [ 115.932566, 30.889532 ], [ 115.976298, 30.931636 ], [ 116.03974, 30.957813 ], [ 116.071769, 30.956787 ], [ 116.058834, 31.012711 ], [ 116.015102, 31.011685 ], [ 116.006479, 31.034764 ], [ 115.938726, 31.04707 ], [ 115.939958, 31.071678 ], [ 115.887603, 31.10909 ], [ 115.867277, 31.147512 ], [ 115.837712, 31.127022 ], [ 115.797676, 31.128047 ], [ 115.778582, 31.112164 ], [ 115.700973, 31.201276 ], [ 115.655394, 31.211002 ], [ 115.603655, 31.17363 ], [ 115.585793, 31.143926 ], [ 115.540213, 31.194621 ], [ 115.539597, 31.231985 ], [ 115.507568, 31.267799 ], [ 115.473076, 31.265242 ], [ 115.443511, 31.344498 ], [ 115.40717, 31.337854 ], [ 115.372062, 31.349098 ], [ 115.393004, 31.389977 ], [ 115.373909, 31.405813 ], [ 115.389924, 31.450241 ], [ 115.371446, 31.495668 ], [ 115.415793, 31.525771 ], [ 115.439815, 31.588496 ], [ 115.485394, 31.608885 ], [ 115.476771, 31.643028 ], [ 115.495249, 31.673083 ], [ 115.534054, 31.698545 ], [ 115.553764, 31.69549 ], [ 115.676336, 31.778453 ], [ 115.731154, 31.76726 ], [ 115.767495, 31.78761 ], [ 115.808147, 31.770313 ], [ 115.808147, 31.770313 ], [ 115.851878, 31.786593 ], [ 115.886371, 31.776418 ], [ 115.914704, 31.814567 ], [ 115.893762, 31.832365 ], [ 115.894994, 31.8649 ], [ 115.920248, 31.920285 ], [ 115.909161, 31.94314 ], [ 115.928871, 32.003046 ], [ 115.922095, 32.049725 ], [ 115.941805, 32.166318 ], [ 115.912856, 32.227596 ], [ 115.899306, 32.390971 ], [ 115.865429, 32.458662 ], [ 115.883291, 32.487946 ], [ 115.845719, 32.501575 ], [ 115.8759, 32.542448 ], [ 115.910393, 32.567165 ], [ 115.891298, 32.576243 ], [ 115.861117, 32.537403 ], [ 115.789052, 32.468761 ], [ 115.771806, 32.505108 ], [ 115.742241, 32.476335 ], [ 115.704669, 32.495013 ], [ 115.667712, 32.409667 ], [ 115.657857, 32.428864 ], [ 115.626445, 32.40512 ], [ 115.604271, 32.425833 ], [ 115.57101, 32.419266 ], [ 115.522967, 32.441997 ], [ 115.509416, 32.466741 ], [ 115.510648, 32.467751 ], [ 115.510648, 32.468256 ], [ 115.510648, 32.468761 ], [ 115.5088, 32.468761 ], [ 115.497713, 32.492489 ], [ 115.409018, 32.549007 ], [ 115.411482, 32.575235 ], [ 115.304924, 32.553042 ], [ 115.30554, 32.583303 ], [ 115.267352, 32.578261 ], [ 115.24333, 32.593388 ], [ 115.20083, 32.591876 ], [ 115.182968, 32.666973 ], [ 115.179273, 32.726402 ], [ 115.189744, 32.770695 ], [ 115.211301, 32.785791 ], [ 115.189744, 32.812452 ], [ 115.197135, 32.856201 ], [ 115.155867, 32.864747 ], [ 115.139237, 32.897917 ], [ 115.029599, 32.906962 ], [ 115.035143, 32.932582 ], [ 115.009273, 32.940117 ], [ 114.943368, 32.935094 ], [ 114.916266, 32.971251 ], [ 114.883006, 32.990328 ], [ 114.891629, 33.020441 ], [ 114.925506, 33.016928 ], [ 114.913187, 33.083143 ], [ 114.897172, 33.086653 ], [ 114.902716, 33.129764 ], [ 114.932897, 33.153817 ], [ 114.966158, 33.147304 ], [ 114.990795, 33.102195 ], [ 115.041302, 33.086653 ], [ 115.168186, 33.088658 ], [ 115.194671, 33.120743 ], [ 115.245178, 33.135778 ], [ 115.289526, 33.131769 ], [ 115.303692, 33.149809 ], [ 115.300613, 33.204407 ], [ 115.340033, 33.260973 ], [ 115.335105, 33.297997 ], [ 115.361591, 33.298497 ], [ 115.365286, 33.336005 ], [ 115.341881, 33.370997 ], [ 115.313547, 33.376994 ], [ 115.328946, 33.403477 ], [ 115.316627, 33.44893 ], [ 115.345576, 33.449928 ], [ 115.345576, 33.502842 ], [ 115.366518, 33.5233 ], [ 115.394851, 33.506335 ], [ 115.422569, 33.557219 ], [ 115.463837, 33.567193 ], [ 115.561771, 33.563703 ], [ 115.564851, 33.576169 ], [ 115.639995, 33.585143 ], [ 115.601191, 33.658898 ], [ 115.601807, 33.718653 ], [ 115.563003, 33.772895 ], [ 115.576553, 33.787817 ], [ 115.614126, 33.775879 ], [ 115.631988, 33.869846 ], [ 115.547604, 33.874815 ], [ 115.577785, 33.950307 ], [ 115.579017, 33.974133 ], [ 115.60735, 34.030196 ], [ 115.642459, 34.03218 ], [ 115.658473, 34.061437 ], [ 115.705901, 34.059949 ], [ 115.736082, 34.076805 ], [ 115.809378, 34.062428 ], [ 115.846335, 34.028708 ], [ 115.852494, 34.003906 ], [ 115.877132, 34.002913 ], [ 115.876516, 34.028708 ], [ 115.904233, 34.009859 ], [ 115.95782, 34.007875 ], [ 116.00032, 33.965199 ], [ 115.982457, 33.917039 ], [ 116.05945, 33.860902 ], [ 116.055754, 33.804727 ], [ 116.074232, 33.781351 ], [ 116.100102, 33.782843 ], [ 116.132747, 33.751501 ], [ 116.155536, 33.709693 ], [ 116.2005, 33.72612 ], [ 116.263326, 33.730101 ], [ 116.316912, 33.771402 ], [ 116.393905, 33.782843 ], [ 116.408071, 33.805721 ], [ 116.437021, 33.801246 ], [ 116.437637, 33.846489 ], [ 116.486296, 33.869846 ], [ 116.558361, 33.881274 ], [ 116.566984, 33.9081 ], [ 116.631042, 33.887733 ], [ 116.64336, 33.896675 ], [ 116.641512, 33.978103 ], [ 116.599629, 34.014324 ] ] ], [ [ [ 118.868133, 31.520669 ], [ 118.885995, 31.519139 ], [ 118.883532, 31.500261 ], [ 118.857046, 31.506384 ], [ 118.868133, 31.520669 ] ] ], [ [ [ 116.698795, 29.707836 ], [ 116.70557, 29.69692 ], [ 116.706802, 29.6964 ], [ 116.704954, 29.688602 ], [ 116.680317, 29.681323 ], [ 116.653831, 29.694841 ], [ 116.673541, 29.709916 ], [ 116.698795, 29.707836 ] ] ], [ [ [ 115.5088, 32.468761 ], [ 115.510648, 32.468761 ], [ 115.510648, 32.468256 ], [ 115.510648, 32.467751 ], [ 115.509416, 32.466741 ], [ 115.5088, 32.468761 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"350000\", \"name\": \"福建省\", \"center\": [ 119.306239, 26.075302 ], \"centroid\": [ 118.006365, 26.069889 ], \"childrenNum\": 9, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 12, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 119.004872, 24.970009 ], [ 119.007335, 24.963499 ], [ 119.032589, 24.961871 ], [ 119.032589, 24.961328 ], [ 119.014111, 24.941252 ], [ 118.945741, 24.954275 ], [ 118.91864, 24.932569 ], [ 118.932807, 24.906518 ], [ 118.987009, 24.898375 ], [ 118.988857, 24.878831 ], [ 118.933423, 24.870687 ], [ 118.864437, 24.887518 ], [ 118.834256, 24.854397 ], [ 118.807771, 24.870687 ], [ 118.748641, 24.84245 ], [ 118.69875, 24.848967 ], [ 118.702445, 24.865258 ], [ 118.647627, 24.843536 ], [ 118.650707, 24.808774 ], [ 118.786213, 24.77672 ], [ 118.778822, 24.743569 ], [ 118.703677, 24.665278 ], [ 118.670417, 24.679962 ], [ 118.652554, 24.653857 ], [ 118.661178, 24.622306 ], [ 118.687047, 24.63373 ], [ 118.680272, 24.58204 ], [ 118.614366, 24.521617 ], [ 118.558316, 24.51236 ], [ 118.557084, 24.572788 ], [ 118.512736, 24.60816 ], [ 118.444367, 24.614689 ], [ 118.363679, 24.567889 ], [ 118.375382, 24.536317 ], [ 118.242955, 24.51236 ], [ 118.169042, 24.559725 ], [ 118.150564, 24.583673 ], [ 118.121615, 24.570067 ], [ 118.084042, 24.528695 ], [ 118.048934, 24.418122 ], [ 118.088354, 24.408858 ], [ 118.081579, 24.35653 ], [ 118.112376, 24.357075 ], [ 118.158571, 24.269814 ], [ 118.115455, 24.229435 ], [ 118.074803, 24.225615 ], [ 118.019369, 24.197232 ], [ 118.000275, 24.152462 ], [ 117.936217, 24.100029 ], [ 117.927594, 24.039922 ], [ 117.910347, 24.012045 ], [ 117.864768, 24.004938 ], [ 117.807486, 23.947521 ], [ 117.792703, 23.906494 ], [ 117.762522, 23.886796 ], [ 117.691073, 23.888985 ], [ 117.671979, 23.878041 ], [ 117.651653, 23.815093 ], [ 117.660276, 23.789357 ], [ 117.601762, 23.70171 ], [ 117.54448, 23.715956 ], [ 117.501364, 23.70445 ], [ 117.493357, 23.642514 ], [ 117.454552, 23.628259 ], [ 117.463791, 23.584937 ], [ 117.387415, 23.555317 ], [ 117.302415, 23.550379 ], [ 117.291328, 23.571225 ], [ 117.192778, 23.5619 ], [ 117.192778, 23.629356 ], [ 117.147199, 23.654027 ], [ 117.123793, 23.647448 ], [ 117.055424, 23.694038 ], [ 117.048032, 23.758687 ], [ 117.019083, 23.801952 ], [ 117.012308, 23.855054 ], [ 116.981511, 23.855602 ], [ 116.955642, 23.922359 ], [ 116.976583, 23.931659 ], [ 116.981511, 23.999471 ], [ 116.953178, 24.008218 ], [ 116.930388, 24.064514 ], [ 116.9347, 24.126794 ], [ 116.998757, 24.179217 ], [ 116.956257, 24.216883 ], [ 116.933468, 24.220157 ], [ 116.938395, 24.28127 ], [ 116.914374, 24.287817 ], [ 116.919301, 24.321087 ], [ 116.895895, 24.350533 ], [ 116.903903, 24.369614 ], [ 116.839229, 24.442097 ], [ 116.860787, 24.460075 ], [ 116.83307, 24.496568 ], [ 116.796729, 24.502014 ], [ 116.759157, 24.545572 ], [ 116.761005, 24.583128 ], [ 116.815207, 24.654944 ], [ 116.777635, 24.679418 ], [ 116.667382, 24.658752 ], [ 116.623034, 24.64189 ], [ 116.600861, 24.654401 ], [ 116.570679, 24.621762 ], [ 116.530027, 24.604895 ], [ 116.506622, 24.621218 ], [ 116.517709, 24.652225 ], [ 116.485064, 24.720196 ], [ 116.44626, 24.714216 ], [ 116.416079, 24.744113 ], [ 116.419158, 24.767482 ], [ 116.375427, 24.803885 ], [ 116.381586, 24.82507 ], [ 116.417927, 24.840821 ], [ 116.395137, 24.877746 ], [ 116.363724, 24.87123 ], [ 116.345862, 24.828872 ], [ 116.297202, 24.801712 ], [ 116.244232, 24.793563 ], [ 116.251007, 24.82507 ], [ 116.221442, 24.829959 ], [ 116.191877, 24.877203 ], [ 116.153073, 24.846795 ], [ 116.068073, 24.850053 ], [ 116.015102, 24.905975 ], [ 115.985537, 24.899461 ], [ 115.907929, 24.923343 ], [ 115.89253, 24.936911 ], [ 115.870356, 24.959701 ], [ 115.925175, 24.960786 ], [ 115.873436, 25.019911 ], [ 115.928255, 25.050276 ], [ 115.908545, 25.084428 ], [ 115.880212, 25.092016 ], [ 115.888219, 25.128866 ], [ 115.860501, 25.165704 ], [ 115.855574, 25.20957 ], [ 115.930719, 25.236099 ], [ 115.949813, 25.292386 ], [ 115.987385, 25.290221 ], [ 116.008327, 25.319437 ], [ 115.992928, 25.374063 ], [ 116.023109, 25.435691 ], [ 116.005247, 25.490264 ], [ 116.03666, 25.514571 ], [ 116.040356, 25.548052 ], [ 116.063145, 25.56317 ], [ 116.041588, 25.62416 ], [ 116.068689, 25.646282 ], [ 116.067457, 25.703995 ], [ 116.106877, 25.701299 ], [ 116.129667, 25.758985 ], [ 116.18079, 25.778926 ], [ 116.131515, 25.824185 ], [ 116.132131, 25.860273 ], [ 116.17771, 25.894195 ], [ 116.225138, 25.908731 ], [ 116.258398, 25.902809 ], [ 116.303362, 25.924341 ], [ 116.326152, 25.956631 ], [ 116.369883, 25.963088 ], [ 116.360028, 25.991601 ], [ 116.384666, 26.030864 ], [ 116.489375, 26.113649 ], [ 116.476441, 26.172745 ], [ 116.435789, 26.159854 ], [ 116.392057, 26.171133 ], [ 116.400064, 26.202819 ], [ 116.385282, 26.238253 ], [ 116.412999, 26.297822 ], [ 116.437021, 26.308016 ], [ 116.459194, 26.345026 ], [ 116.499846, 26.361651 ], [ 116.519557, 26.410437 ], [ 116.553433, 26.400253 ], [ 116.553433, 26.365404 ], [ 116.601476, 26.372911 ], [ 116.608252, 26.429732 ], [ 116.638433, 26.477418 ], [ 116.610716, 26.476882 ], [ 116.597165, 26.512768 ], [ 116.539267, 26.559349 ], [ 116.553433, 26.575942 ], [ 116.566368, 26.650315 ], [ 116.520172, 26.684543 ], [ 116.515245, 26.720898 ], [ 116.557745, 26.773806 ], [ 116.543578, 26.803723 ], [ 116.548506, 26.84004 ], [ 116.602092, 26.888623 ], [ 116.632889, 26.933984 ], [ 116.679085, 26.978259 ], [ 116.817671, 27.018252 ], [ 116.851548, 27.009188 ], [ 116.910062, 27.034779 ], [ 116.936547, 27.019319 ], [ 116.967344, 27.061962 ], [ 117.05296, 27.100327 ], [ 117.044953, 27.146667 ], [ 117.149662, 27.241419 ], [ 117.171836, 27.29036 ], [ 117.136728, 27.303123 ], [ 117.140423, 27.322798 ], [ 117.104699, 27.330773 ], [ 117.107163, 27.393491 ], [ 117.133032, 27.42218 ], [ 117.110242, 27.458828 ], [ 117.103467, 27.533149 ], [ 117.076982, 27.566046 ], [ 117.054808, 27.5427 ], [ 117.01662, 27.563393 ], [ 117.024627, 27.592569 ], [ 117.003685, 27.625449 ], [ 117.040641, 27.669979 ], [ 117.065279, 27.665739 ], [ 117.094228, 27.627569 ], [ 117.11209, 27.645596 ], [ 117.096076, 27.667329 ], [ 117.114554, 27.692238 ], [ 117.174916, 27.677399 ], [ 117.204481, 27.683759 ], [ 117.205097, 27.714492 ], [ 117.245133, 27.71926 ], [ 117.296256, 27.764282 ], [ 117.303031, 27.833103 ], [ 117.276546, 27.847921 ], [ 117.280242, 27.871201 ], [ 117.334444, 27.8876 ], [ 117.341836, 27.855858 ], [ 117.366473, 27.88231 ], [ 117.407741, 27.893948 ], [ 117.453936, 27.939955 ], [ 117.477958, 27.930966 ], [ 117.52169, 27.982243 ], [ 117.556182, 27.966387 ], [ 117.609769, 27.863265 ], [ 117.649805, 27.851625 ], [ 117.68245, 27.823577 ], [ 117.704624, 27.834162 ], [ 117.740348, 27.800286 ], [ 117.788392, 27.855858 ], [ 117.78716, 27.896063 ], [ 117.856145, 27.94577 ], [ 117.910963, 27.949471 ], [ 117.942992, 27.974315 ], [ 117.965166, 27.962687 ], [ 117.999043, 27.991227 ], [ 118.096977, 27.970615 ], [ 118.094513, 28.003909 ], [ 118.129006, 28.017118 ], [ 118.120999, 28.041946 ], [ 118.153644, 28.062016 ], [ 118.199839, 28.049869 ], [ 118.242339, 28.075746 ], [ 118.356288, 28.091586 ], [ 118.361215, 28.155978 ], [ 118.375382, 28.186577 ], [ 118.339041, 28.193962 ], [ 118.314404, 28.221913 ], [ 118.424041, 28.291497 ], [ 118.433896, 28.288335 ], [ 118.444367, 28.253548 ], [ 118.490562, 28.238259 ], [ 118.493026, 28.262509 ], [ 118.588497, 28.282538 ], [ 118.595272, 28.258292 ], [ 118.651322, 28.277267 ], [ 118.674728, 28.27147 ], [ 118.699366, 28.309939 ], [ 118.719692, 28.312047 ], [ 118.756032, 28.252493 ], [ 118.802228, 28.240368 ], [ 118.804075, 28.207675 ], [ 118.771431, 28.188687 ], [ 118.805923, 28.154923 ], [ 118.802228, 28.117453 ], [ 118.767735, 28.10584 ], [ 118.719076, 28.063601 ], [ 118.733858, 28.027684 ], [ 118.730163, 27.970615 ], [ 118.753568, 27.947885 ], [ 118.818242, 27.916689 ], [ 118.829329, 27.847921 ], [ 118.873677, 27.733563 ], [ 118.879836, 27.667859 ], [ 118.913713, 27.619616 ], [ 118.909401, 27.568168 ], [ 118.869365, 27.540047 ], [ 118.907553, 27.460952 ], [ 118.955597, 27.4498 ], [ 118.986393, 27.47582 ], [ 118.983314, 27.498649 ], [ 119.020886, 27.498118 ], [ 119.03998, 27.478475 ], [ 119.092335, 27.466262 ], [ 119.129907, 27.475289 ], [ 119.121284, 27.438115 ], [ 119.14777, 27.424836 ], [ 119.224146, 27.416868 ], [ 119.26911, 27.42218 ], [ 119.285124, 27.457766 ], [ 119.334399, 27.480067 ], [ 119.360269, 27.524657 ], [ 119.416935, 27.539517 ], [ 119.438493, 27.508734 ], [ 119.466826, 27.526249 ], [ 119.501935, 27.610601 ], [ 119.501319, 27.649837 ], [ 119.541971, 27.666799 ], [ 119.606028, 27.674749 ], [ 119.644217, 27.663619 ], [ 119.626354, 27.620676 ], [ 119.630666, 27.582491 ], [ 119.675014, 27.574534 ], [ 119.659615, 27.540578 ], [ 119.690412, 27.537394 ], [ 119.70889, 27.514042 ], [ 119.703347, 27.446613 ], [ 119.685485, 27.438646 ], [ 119.711354, 27.403054 ], [ 119.750774, 27.373829 ], [ 119.739687, 27.362668 ], [ 119.782187, 27.330241 ], [ 119.768636, 27.307909 ], [ 119.843165, 27.300464 ], [ 119.938636, 27.329709 ], [ 119.960194, 27.365857 ], [ 120.008237, 27.375423 ], [ 120.026099, 27.344063 ], [ 120.052584, 27.338747 ], [ 120.096316, 27.390302 ], [ 120.136968, 27.402523 ], [ 120.134504, 27.420055 ], [ 120.221352, 27.420055 ], [ 120.26262, 27.432804 ], [ 120.273091, 27.38924 ], [ 120.340844, 27.399867 ], [ 120.343924, 27.363199 ], [ 120.430155, 27.258976 ], [ 120.401822, 27.250996 ], [ 120.404286, 27.204166 ], [ 120.461568, 27.142407 ], [ 120.403054, 27.10086 ], [ 120.391967, 27.081146 ], [ 120.282946, 27.089671 ], [ 120.29588, 27.035845 ], [ 120.275554, 27.027315 ], [ 120.279866, 26.987326 ], [ 120.25954, 26.982526 ], [ 120.232439, 26.907303 ], [ 120.1807, 26.920644 ], [ 120.117258, 26.916909 ], [ 120.103707, 26.873143 ], [ 120.037802, 26.86033 ], [ 120.042729, 26.828292 ], [ 120.082765, 26.822417 ], [ 120.103707, 26.794642 ], [ 120.136352, 26.797847 ], [ 120.106787, 26.752966 ], [ 120.151135, 26.750829 ], [ 120.162222, 26.717691 ], [ 120.110483, 26.692563 ], [ 120.1382, 26.638012 ], [ 120.093852, 26.613938 ], [ 120.063671, 26.627848 ], [ 120.007621, 26.595744 ], [ 119.967585, 26.597885 ], [ 119.93802, 26.576478 ], [ 119.947875, 26.56042 ], [ 119.867187, 26.509019 ], [ 119.828383, 26.524013 ], [ 119.851788, 26.595209 ], [ 119.901679, 26.624638 ], [ 119.949107, 26.624638 ], [ 119.972512, 26.654594 ], [ 119.969433, 26.686681 ], [ 119.99407, 26.720363 ], [ 120.061824, 26.768997 ], [ 120.052584, 26.786629 ], [ 119.942947, 26.784492 ], [ 119.938636, 26.747088 ], [ 119.899216, 26.693098 ], [ 119.908455, 26.661547 ], [ 119.873962, 26.642827 ], [ 119.864107, 26.671174 ], [ 119.833926, 26.690959 ], [ 119.711354, 26.686681 ], [ 119.664543, 26.726243 ], [ 119.637441, 26.703256 ], [ 119.619579, 26.649246 ], [ 119.577695, 26.622498 ], [ 119.605412, 26.595744 ], [ 119.670086, 26.618218 ], [ 119.740303, 26.610727 ], [ 119.788346, 26.583435 ], [ 119.83639, 26.454381 ], [ 119.835774, 26.434019 ], [ 119.893672, 26.355752 ], [ 119.946027, 26.374519 ], [ 119.95465, 26.352534 ], [ 119.909687, 26.310161 ], [ 119.862875, 26.307479 ], [ 119.845013, 26.323036 ], [ 119.806825, 26.307479 ], [ 119.802513, 26.268846 ], [ 119.7711, 26.285481 ], [ 119.676246, 26.262943 ], [ 119.664543, 26.202282 ], [ 119.604181, 26.168985 ], [ 119.618963, 26.11956 ], [ 119.654688, 26.090002 ], [ 119.668854, 26.026024 ], [ 119.700267, 26.032477 ], [ 119.723673, 26.011503 ], [ 119.69534, 25.904424 ], [ 119.638057, 25.889888 ], [ 119.628202, 25.87212 ], [ 119.626354, 25.723406 ], [ 119.602949, 25.714779 ], [ 119.602949, 25.68512 ], [ 119.543819, 25.684581 ], [ 119.472986, 25.662466 ], [ 119.478529, 25.631715 ], [ 119.541355, 25.6247 ], [ 119.534579, 25.585303 ], [ 119.586934, 25.59232 ], [ 119.616499, 25.556691 ], [ 119.611572, 25.519972 ], [ 119.634362, 25.475137 ], [ 119.675014, 25.475137 ], [ 119.680557, 25.497827 ], [ 119.715666, 25.51187 ], [ 119.716898, 25.551292 ], [ 119.683637, 25.592859 ], [ 119.700267, 25.616606 ], [ 119.784651, 25.667321 ], [ 119.790194, 25.614447 ], [ 119.843165, 25.597717 ], [ 119.831462, 25.579905 ], [ 119.883817, 25.546432 ], [ 119.861027, 25.531313 ], [ 119.81668, 25.532393 ], [ 119.811136, 25.507009 ], [ 119.83331, 25.48162 ], [ 119.864107, 25.48 ], [ 119.866571, 25.455145 ], [ 119.804977, 25.457847 ], [ 119.764325, 25.433529 ], [ 119.773564, 25.395691 ], [ 119.688564, 25.441095 ], [ 119.682405, 25.445959 ], [ 119.675014, 25.468113 ], [ 119.622659, 25.434069 ], [ 119.670086, 25.435691 ], [ 119.656535, 25.396772 ], [ 119.665159, 25.3719 ], [ 119.649144, 25.342697 ], [ 119.597405, 25.334584 ], [ 119.582623, 25.374063 ], [ 119.59063, 25.398394 ], [ 119.577695, 25.445959 ], [ 119.555521, 25.429205 ], [ 119.578927, 25.400556 ], [ 119.548746, 25.365952 ], [ 119.486536, 25.369737 ], [ 119.507478, 25.396231 ], [ 119.48592, 25.418935 ], [ 119.491464, 25.443257 ], [ 119.463131, 25.448661 ], [ 119.438493, 25.412449 ], [ 119.45266, 25.493505 ], [ 119.400921, 25.493505 ], [ 119.359037, 25.521592 ], [ 119.343638, 25.472436 ], [ 119.353493, 25.411908 ], [ 119.288204, 25.410827 ], [ 119.26295, 25.428124 ], [ 119.275269, 25.476758 ], [ 119.256175, 25.488643 ], [ 119.219834, 25.468654 ], [ 119.232153, 25.442176 ], [ 119.191501, 25.424341 ], [ 119.151465, 25.426503 ], [ 119.14469, 25.388121 ], [ 119.218603, 25.368115 ], [ 119.240776, 25.316733 ], [ 119.247552, 25.333502 ], [ 119.299291, 25.328634 ], [ 119.333167, 25.287516 ], [ 119.380595, 25.250173 ], [ 119.331935, 25.230685 ], [ 119.294979, 25.237182 ], [ 119.314689, 25.190076 ], [ 119.26911, 25.159746 ], [ 119.231537, 25.188993 ], [ 119.190269, 25.175995 ], [ 119.131755, 25.223106 ], [ 119.108349, 25.193867 ], [ 119.137299, 25.15487 ], [ 119.165632, 25.145661 ], [ 119.146538, 25.056782 ], [ 119.119436, 25.012861 ], [ 119.107118, 25.075214 ], [ 119.134219, 25.106107 ], [ 119.075705, 25.099604 ], [ 119.06585, 25.102855 ], [ 119.028893, 25.139702 ], [ 119.032589, 25.17437 ], [ 119.054147, 25.168412 ], [ 119.074473, 25.211195 ], [ 119.055379, 25.219316 ], [ 118.990089, 25.20199 ], [ 118.975307, 25.237723 ], [ 118.996864, 25.266411 ], [ 118.956212, 25.272905 ], [ 118.91556, 25.256668 ], [ 118.940198, 25.21715 ], [ 118.942046, 25.211195 ], [ 118.985162, 25.19495 ], [ 118.985162, 25.168954 ], [ 118.951901, 25.15162 ], [ 118.974691, 25.115319 ], [ 118.892155, 25.092558 ], [ 118.945126, 25.028588 ], [ 118.974691, 25.024792 ], [ 119.016575, 25.058409 ], [ 119.023966, 25.04377 ], [ 118.989473, 24.973807 ], [ 119.004872, 24.970009 ] ] ], [ [ [ 118.412338, 24.514538 ], [ 118.451758, 24.506915 ], [ 118.477012, 24.437738 ], [ 118.457918, 24.412128 ], [ 118.405563, 24.427931 ], [ 118.353208, 24.415398 ], [ 118.329802, 24.382152 ], [ 118.282375, 24.413218 ], [ 118.31194, 24.424661 ], [ 118.298389, 24.477506 ], [ 118.318715, 24.486765 ], [ 118.374766, 24.458986 ], [ 118.412338, 24.514538 ] ] ], [ [ [ 119.471138, 25.197116 ], [ 119.444036, 25.20199 ], [ 119.44342, 25.238806 ], [ 119.473601, 25.259916 ], [ 119.501319, 25.21715 ], [ 119.540739, 25.20199 ], [ 119.566608, 25.210112 ], [ 119.549362, 25.161912 ], [ 119.52534, 25.157579 ], [ 119.507478, 25.183036 ], [ 119.471138, 25.197116 ] ] ], [ [ [ 119.580159, 25.627398 ], [ 119.580775, 25.650059 ], [ 119.611572, 25.669479 ], [ 119.580159, 25.627398 ] ] ], [ [ [ 119.976824, 26.191005 ], [ 119.970665, 26.217852 ], [ 119.998998, 26.235569 ], [ 120.016244, 26.217316 ], [ 119.976824, 26.191005 ] ] ], [ [ [ 118.230636, 24.401228 ], [ 118.233716, 24.445911 ], [ 118.273752, 24.441007 ], [ 118.230636, 24.401228 ] ] ], [ [ [ 119.906607, 26.68989 ], [ 119.950954, 26.692563 ], [ 119.926933, 26.664756 ], [ 119.906607, 26.68989 ] ] ], [ [ [ 118.204151, 24.504737 ], [ 118.19368, 24.463344 ], [ 118.143173, 24.420847 ], [ 118.084042, 24.435559 ], [ 118.068644, 24.463344 ], [ 118.093281, 24.540672 ], [ 118.14502, 24.560814 ], [ 118.191832, 24.536861 ], [ 118.204151, 24.504737 ] ] ], [ [ [ 119.929397, 26.134067 ], [ 119.919542, 26.172208 ], [ 119.960194, 26.146961 ], [ 119.929397, 26.134067 ] ] ], [ [ [ 119.642985, 26.129231 ], [ 119.606028, 26.15287 ], [ 119.62697, 26.173282 ], [ 119.665159, 26.155556 ], [ 119.642985, 26.129231 ] ] ], [ [ [ 120.034106, 26.488667 ], [ 120.035954, 26.515981 ], [ 120.071679, 26.521336 ], [ 120.066751, 26.498308 ], [ 120.034106, 26.488667 ] ] ], [ [ [ 119.662079, 25.646822 ], [ 119.716898, 25.664624 ], [ 119.718745, 25.634952 ], [ 119.673782, 25.632794 ], [ 119.662079, 25.646822 ] ] ], [ [ [ 119.760629, 26.613402 ], [ 119.796354, 26.630523 ], [ 119.818527, 26.616613 ], [ 119.776644, 26.600025 ], [ 119.760629, 26.613402 ] ] ], [ [ [ 120.135736, 26.550784 ], [ 120.117874, 26.568984 ], [ 120.153598, 26.604841 ], [ 120.167149, 26.571661 ], [ 120.135736, 26.550784 ] ] ], [ [ [ 120.360554, 26.916909 ], [ 120.319286, 26.944654 ], [ 120.327909, 26.963858 ], [ 120.363018, 26.967592 ], [ 120.394431, 26.933984 ], [ 120.360554, 26.916909 ] ] ], [ [ [ 119.668238, 26.628383 ], [ 119.651608, 26.657269 ], [ 119.673782, 26.680799 ], [ 119.712586, 26.6685 ], [ 119.748926, 26.681334 ], [ 119.758781, 26.659408 ], [ 119.720593, 26.635873 ], [ 119.668238, 26.628383 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"360000\", \"name\": \"江西省\", \"center\": [ 115.892151, 28.676493 ], \"centroid\": [ 115.732975, 27.636112 ], \"childrenNum\": 11, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 13, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 118.193064, 29.395472 ], [ 118.205382, 29.343839 ], [ 118.166578, 29.314099 ], [ 118.178281, 29.297921 ], [ 118.138861, 29.283828 ], [ 118.077883, 29.290614 ], [ 118.073571, 29.216993 ], [ 118.042159, 29.210202 ], [ 118.027992, 29.167882 ], [ 118.045238, 29.149068 ], [ 118.037847, 29.102017 ], [ 118.076035, 29.074822 ], [ 118.066796, 29.053898 ], [ 118.097593, 28.998952 ], [ 118.115455, 29.009944 ], [ 118.115455, 29.009944 ], [ 118.133933, 28.983771 ], [ 118.165346, 28.986912 ], [ 118.227556, 28.942406 ], [ 118.195527, 28.904167 ], [ 118.270056, 28.918836 ], [ 118.300237, 28.826075 ], [ 118.364295, 28.813491 ], [ 118.403099, 28.702791 ], [ 118.428352, 28.681267 ], [ 118.428352, 28.617193 ], [ 118.428352, 28.617193 ], [ 118.412338, 28.55676 ], [ 118.4302, 28.515225 ], [ 118.414802, 28.497344 ], [ 118.474548, 28.478934 ], [ 118.456686, 28.424738 ], [ 118.432048, 28.402104 ], [ 118.455454, 28.384204 ], [ 118.480091, 28.327325 ], [ 118.433896, 28.288335 ], [ 118.424041, 28.291497 ], [ 118.314404, 28.221913 ], [ 118.339041, 28.193962 ], [ 118.375382, 28.186577 ], [ 118.361215, 28.155978 ], [ 118.356288, 28.091586 ], [ 118.242339, 28.075746 ], [ 118.199839, 28.049869 ], [ 118.153644, 28.062016 ], [ 118.120999, 28.041946 ], [ 118.129006, 28.017118 ], [ 118.094513, 28.003909 ], [ 118.096977, 27.970615 ], [ 117.999043, 27.991227 ], [ 117.965166, 27.962687 ], [ 117.942992, 27.974315 ], [ 117.910963, 27.949471 ], [ 117.856145, 27.94577 ], [ 117.78716, 27.896063 ], [ 117.788392, 27.855858 ], [ 117.740348, 27.800286 ], [ 117.704624, 27.834162 ], [ 117.68245, 27.823577 ], [ 117.649805, 27.851625 ], [ 117.609769, 27.863265 ], [ 117.556182, 27.966387 ], [ 117.52169, 27.982243 ], [ 117.477958, 27.930966 ], [ 117.453936, 27.939955 ], [ 117.407741, 27.893948 ], [ 117.366473, 27.88231 ], [ 117.341836, 27.855858 ], [ 117.334444, 27.8876 ], [ 117.280242, 27.871201 ], [ 117.276546, 27.847921 ], [ 117.303031, 27.833103 ], [ 117.296256, 27.764282 ], [ 117.245133, 27.71926 ], [ 117.205097, 27.714492 ], [ 117.204481, 27.683759 ], [ 117.174916, 27.677399 ], [ 117.114554, 27.692238 ], [ 117.096076, 27.667329 ], [ 117.11209, 27.645596 ], [ 117.094228, 27.627569 ], [ 117.065279, 27.665739 ], [ 117.040641, 27.669979 ], [ 117.003685, 27.625449 ], [ 117.024627, 27.592569 ], [ 117.01662, 27.563393 ], [ 117.054808, 27.5427 ], [ 117.076982, 27.566046 ], [ 117.103467, 27.533149 ], [ 117.110242, 27.458828 ], [ 117.133032, 27.42218 ], [ 117.107163, 27.393491 ], [ 117.104699, 27.330773 ], [ 117.140423, 27.322798 ], [ 117.136728, 27.303123 ], [ 117.171836, 27.29036 ], [ 117.149662, 27.241419 ], [ 117.044953, 27.146667 ], [ 117.05296, 27.100327 ], [ 116.967344, 27.061962 ], [ 116.936547, 27.019319 ], [ 116.910062, 27.034779 ], [ 116.851548, 27.009188 ], [ 116.817671, 27.018252 ], [ 116.679085, 26.978259 ], [ 116.632889, 26.933984 ], [ 116.602092, 26.888623 ], [ 116.548506, 26.84004 ], [ 116.543578, 26.803723 ], [ 116.557745, 26.773806 ], [ 116.515245, 26.720898 ], [ 116.520172, 26.684543 ], [ 116.566368, 26.650315 ], [ 116.553433, 26.575942 ], [ 116.539267, 26.559349 ], [ 116.597165, 26.512768 ], [ 116.610716, 26.476882 ], [ 116.638433, 26.477418 ], [ 116.608252, 26.429732 ], [ 116.601476, 26.372911 ], [ 116.553433, 26.365404 ], [ 116.553433, 26.400253 ], [ 116.519557, 26.410437 ], [ 116.499846, 26.361651 ], [ 116.459194, 26.345026 ], [ 116.437021, 26.308016 ], [ 116.412999, 26.297822 ], [ 116.385282, 26.238253 ], [ 116.400064, 26.202819 ], [ 116.392057, 26.171133 ], [ 116.435789, 26.159854 ], [ 116.476441, 26.172745 ], [ 116.489375, 26.113649 ], [ 116.384666, 26.030864 ], [ 116.360028, 25.991601 ], [ 116.369883, 25.963088 ], [ 116.326152, 25.956631 ], [ 116.303362, 25.924341 ], [ 116.258398, 25.902809 ], [ 116.225138, 25.908731 ], [ 116.17771, 25.894195 ], [ 116.132131, 25.860273 ], [ 116.131515, 25.824185 ], [ 116.18079, 25.778926 ], [ 116.129667, 25.758985 ], [ 116.106877, 25.701299 ], [ 116.067457, 25.703995 ], [ 116.068689, 25.646282 ], [ 116.041588, 25.62416 ], [ 116.063145, 25.56317 ], [ 116.040356, 25.548052 ], [ 116.03666, 25.514571 ], [ 116.005247, 25.490264 ], [ 116.023109, 25.435691 ], [ 115.992928, 25.374063 ], [ 116.008327, 25.319437 ], [ 115.987385, 25.290221 ], [ 115.949813, 25.292386 ], [ 115.930719, 25.236099 ], [ 115.855574, 25.20957 ], [ 115.860501, 25.165704 ], [ 115.888219, 25.128866 ], [ 115.880212, 25.092016 ], [ 115.908545, 25.084428 ], [ 115.928255, 25.050276 ], [ 115.873436, 25.019911 ], [ 115.925175, 24.960786 ], [ 115.870356, 24.959701 ], [ 115.89253, 24.936911 ], [ 115.885139, 24.898918 ], [ 115.907313, 24.879917 ], [ 115.861733, 24.863629 ], [ 115.863581, 24.891318 ], [ 115.824161, 24.909232 ], [ 115.807531, 24.862543 ], [ 115.790284, 24.856027 ], [ 115.764415, 24.791933 ], [ 115.776734, 24.774546 ], [ 115.756408, 24.749004 ], [ 115.769342, 24.708236 ], [ 115.801371, 24.705517 ], [ 115.780429, 24.663103 ], [ 115.797676, 24.628834 ], [ 115.840791, 24.584217 ], [ 115.843871, 24.562446 ], [ 115.785357, 24.567345 ], [ 115.752712, 24.546116 ], [ 115.68927, 24.545027 ], [ 115.671408, 24.604895 ], [ 115.605503, 24.62557 ], [ 115.569778, 24.622306 ], [ 115.555611, 24.683768 ], [ 115.522967, 24.702799 ], [ 115.476771, 24.762591 ], [ 115.412714, 24.79302 ], [ 115.372678, 24.774546 ], [ 115.358511, 24.735416 ], [ 115.306772, 24.758787 ], [ 115.269816, 24.749548 ], [ 115.258729, 24.728894 ], [ 115.1842, 24.711498 ], [ 115.104744, 24.667997 ], [ 115.083802, 24.699537 ], [ 115.057317, 24.703343 ], [ 115.024672, 24.669085 ], [ 115.00373, 24.679418 ], [ 114.940288, 24.650049 ], [ 114.909491, 24.661471 ], [ 114.893477, 24.582584 ], [ 114.868839, 24.562446 ], [ 114.846665, 24.602719 ], [ 114.827571, 24.588026 ], [ 114.781376, 24.613057 ], [ 114.729637, 24.608704 ], [ 114.73826, 24.565168 ], [ 114.704999, 24.525973 ], [ 114.664963, 24.583673 ], [ 114.627391, 24.576598 ], [ 114.589819, 24.537406 ], [ 114.534384, 24.559181 ], [ 114.429058, 24.48622 ], [ 114.403189, 24.497657 ], [ 114.391486, 24.563535 ], [ 114.363769, 24.582584 ], [ 114.300943, 24.578775 ], [ 114.289856, 24.619042 ], [ 114.258443, 24.641346 ], [ 114.19069, 24.656576 ], [ 114.169132, 24.689749 ], [ 114.27261, 24.700624 ], [ 114.281849, 24.724001 ], [ 114.336052, 24.749004 ], [ 114.342211, 24.807145 ], [ 114.378551, 24.861457 ], [ 114.403189, 24.877746 ], [ 114.395798, 24.951019 ], [ 114.454928, 24.977062 ], [ 114.45616, 24.99659 ], [ 114.506051, 24.999844 ], [ 114.532536, 25.022623 ], [ 114.561485, 25.077382 ], [ 114.604601, 25.083886 ], [ 114.640326, 25.074129 ], [ 114.664963, 25.10123 ], [ 114.735796, 25.121822 ], [ 114.73518, 25.155954 ], [ 114.685905, 25.173287 ], [ 114.693912, 25.213902 ], [ 114.73518, 25.225813 ], [ 114.743188, 25.274528 ], [ 114.714238, 25.315651 ], [ 114.63663, 25.324306 ], [ 114.599674, 25.385959 ], [ 114.541159, 25.416773 ], [ 114.477718, 25.37136 ], [ 114.438914, 25.376226 ], [ 114.43029, 25.343779 ], [ 114.382863, 25.317274 ], [ 114.31511, 25.33837 ], [ 114.2954, 25.299961 ], [ 114.260291, 25.291845 ], [ 114.204857, 25.29942 ], [ 114.190074, 25.316733 ], [ 114.115545, 25.302125 ], [ 114.083517, 25.275611 ], [ 114.055799, 25.277775 ], [ 114.039785, 25.250714 ], [ 114.017611, 25.273987 ], [ 114.029314, 25.328093 ], [ 114.050256, 25.36433 ], [ 113.983118, 25.415152 ], [ 114.003444, 25.442716 ], [ 113.94493, 25.441635 ], [ 113.962792, 25.528072 ], [ 113.986198, 25.529153 ], [ 113.983118, 25.599336 ], [ 113.957249, 25.611749 ], [ 113.913517, 25.701299 ], [ 113.920293, 25.741197 ], [ 113.961561, 25.77731 ], [ 113.971416, 25.836036 ], [ 114.028082, 25.893119 ], [ 114.028082, 25.98138 ], [ 114.008372, 26.015806 ], [ 114.044096, 26.076564 ], [ 114.087828, 26.06635 ], [ 114.121089, 26.085702 ], [ 114.10569, 26.097526 ], [ 114.188842, 26.121172 ], [ 114.237501, 26.152333 ], [ 114.216559, 26.203355 ], [ 114.181451, 26.214631 ], [ 114.102611, 26.187783 ], [ 114.088444, 26.168448 ], [ 114.013299, 26.184023 ], [ 113.962792, 26.150722 ], [ 113.949242, 26.192616 ], [ 113.972647, 26.20604 ], [ 113.978807, 26.237716 ], [ 114.029314, 26.266163 ], [ 114.021307, 26.288701 ], [ 114.047792, 26.337518 ], [ 114.030546, 26.376664 ], [ 114.062575, 26.406149 ], [ 114.085364, 26.406149 ], [ 114.090292, 26.455988 ], [ 114.110002, 26.482775 ], [ 114.07243, 26.480096 ], [ 114.10877, 26.56952 ], [ 114.019459, 26.587182 ], [ 113.996669, 26.615543 ], [ 113.912901, 26.613938 ], [ 113.860546, 26.664221 ], [ 113.853771, 26.769532 ], [ 113.835909, 26.806394 ], [ 113.877177, 26.859262 ], [ 113.890112, 26.895562 ], [ 113.927068, 26.948922 ], [ 113.892575, 26.964925 ], [ 113.86301, 27.018252 ], [ 113.824206, 27.036378 ], [ 113.803264, 27.099261 ], [ 113.771851, 27.096598 ], [ 113.779242, 27.137081 ], [ 113.846996, 27.222262 ], [ 113.872865, 27.289828 ], [ 113.854387, 27.30525 ], [ 113.872865, 27.346721 ], [ 113.872865, 27.384988 ], [ 113.72812, 27.350442 ], [ 113.699786, 27.331836 ], [ 113.657902, 27.347253 ], [ 113.616635, 27.345658 ], [ 113.605548, 27.38924 ], [ 113.632033, 27.40518 ], [ 113.59754, 27.428554 ], [ 113.591381, 27.467855 ], [ 113.627105, 27.49971 ], [ 113.583374, 27.524657 ], [ 113.579062, 27.545354 ], [ 113.608627, 27.585143 ], [ 113.607395, 27.625449 ], [ 113.652359, 27.663619 ], [ 113.696707, 27.71979 ], [ 113.69917, 27.740979 ], [ 113.763228, 27.799228 ], [ 113.756453, 27.860091 ], [ 113.72812, 27.874904 ], [ 113.752141, 27.93361 ], [ 113.822974, 27.982243 ], [ 113.845148, 27.971672 ], [ 113.864242, 28.004966 ], [ 113.914133, 27.991227 ], [ 113.936307, 28.018703 ], [ 113.966488, 28.017646 ], [ 113.970184, 28.041418 ], [ 114.025618, 28.031382 ], [ 114.047176, 28.057263 ], [ 114.025002, 28.080499 ], [ 113.992357, 28.161255 ], [ 114.012068, 28.174972 ], [ 114.068734, 28.171806 ], [ 114.107538, 28.182885 ], [ 114.109386, 28.205038 ], [ 114.143879, 28.246694 ], [ 114.182067, 28.249858 ], [ 114.198081, 28.29097 ], [ 114.2529, 28.319423 ], [ 114.252284, 28.395787 ], [ 114.214712, 28.403157 ], [ 114.172212, 28.432632 ], [ 114.217175, 28.466308 ], [ 114.218407, 28.48472 ], [ 114.15435, 28.507337 ], [ 114.138335, 28.533629 ], [ 114.08598, 28.558337 ], [ 114.132176, 28.607211 ], [ 114.122321, 28.623497 ], [ 114.157429, 28.761566 ], [ 114.137719, 28.779926 ], [ 114.153734, 28.829221 ], [ 114.124784, 28.843376 ], [ 114.076741, 28.834464 ], [ 114.056415, 28.872204 ], [ 114.060111, 28.902596 ], [ 114.028082, 28.891069 ], [ 114.005292, 28.917788 ], [ 114.008988, 28.955498 ], [ 113.973879, 28.937692 ], [ 113.955401, 28.978536 ], [ 113.961561, 28.999476 ], [ 113.94185, 29.047097 ], [ 113.952321, 29.092604 ], [ 113.98743, 29.126068 ], [ 114.034857, 29.152204 ], [ 114.063191, 29.204978 ], [ 114.169748, 29.216993 ], [ 114.252284, 29.23475 ], [ 114.259059, 29.343839 ], [ 114.307102, 29.365225 ], [ 114.341595, 29.327665 ], [ 114.376088, 29.322969 ], [ 114.440145, 29.341752 ], [ 114.466015, 29.324013 ], [ 114.519602, 29.325578 ], [ 114.589819, 29.352707 ], [ 114.621847, 29.379828 ], [ 114.67297, 29.395993 ], [ 114.740724, 29.386607 ], [ 114.759818, 29.363139 ], [ 114.784455, 29.386086 ], [ 114.812173, 29.383478 ], [ 114.866375, 29.404335 ], [ 114.895325, 29.397557 ], [ 114.931049, 29.422581 ], [ 114.947063, 29.465317 ], [ 114.935977, 29.486678 ], [ 114.90518, 29.473132 ], [ 114.918114, 29.454374 ], [ 114.888549, 29.436134 ], [ 114.860216, 29.476258 ], [ 114.900868, 29.505951 ], [ 114.940288, 29.493971 ], [ 114.966773, 29.522096 ], [ 114.947679, 29.542924 ], [ 115.00065, 29.572076 ], [ 115.033295, 29.546568 ], [ 115.087498, 29.560104 ], [ 115.086266, 29.525741 ], [ 115.154019, 29.510117 ], [ 115.157099, 29.584568 ], [ 115.120142, 29.597578 ], [ 115.143548, 29.645961 ], [ 115.117679, 29.655843 ], [ 115.113367, 29.684963 ], [ 115.176809, 29.654803 ], [ 115.250722, 29.660003 ], [ 115.28583, 29.618391 ], [ 115.304924, 29.637118 ], [ 115.355431, 29.649602 ], [ 115.412714, 29.688602 ], [ 115.470612, 29.739539 ], [ 115.479235, 29.811224 ], [ 115.51188, 29.840299 ], [ 115.611662, 29.841337 ], [ 115.667712, 29.850161 ], [ 115.706517, 29.837703 ], [ 115.762567, 29.793048 ], [ 115.837096, 29.748373 ], [ 115.909777, 29.723949 ], [ 115.965827, 29.724469 ], [ 116.049595, 29.761881 ], [ 116.087167, 29.795125 ], [ 116.13521, 29.819532 ], [ 116.172783, 29.828358 ], [ 116.227601, 29.816936 ], [ 116.250391, 29.785777 ], [ 116.280572, 29.788893 ], [ 116.342782, 29.835626 ], [ 116.467818, 29.896347 ], [ 116.525716, 29.897385 ], [ 116.552201, 29.909836 ], [ 116.585462, 30.045657 ], [ 116.620571, 30.073109 ], [ 116.666766, 30.076734 ], [ 116.720353, 30.053945 ], [ 116.747454, 30.057053 ], [ 116.783794, 30.030632 ], [ 116.802889, 29.99643 ], [ 116.830606, 30.004723 ], [ 116.83307, 29.95755 ], [ 116.868794, 29.980361 ], [ 116.900207, 29.949253 ], [ 116.882961, 29.893753 ], [ 116.780715, 29.792529 ], [ 116.762237, 29.802396 ], [ 116.673541, 29.709916 ], [ 116.653831, 29.694841 ], [ 116.680317, 29.681323 ], [ 116.651983, 29.637118 ], [ 116.716657, 29.590813 ], [ 116.721585, 29.564789 ], [ 116.760389, 29.599139 ], [ 116.780715, 29.569994 ], [ 116.849084, 29.57624 ], [ 116.873722, 29.609546 ], [ 116.939627, 29.648561 ], [ 116.974736, 29.657403 ], [ 116.996294, 29.683403 ], [ 117.041873, 29.680803 ], [ 117.112706, 29.711995 ], [ 117.108395, 29.75201 ], [ 117.136728, 29.775388 ], [ 117.123177, 29.798761 ], [ 117.073286, 29.831992 ], [ 117.127489, 29.86158 ], [ 117.129952, 29.89946 ], [ 117.171836, 29.920729 ], [ 117.2168, 29.926953 ], [ 117.246365, 29.915023 ], [ 117.261763, 29.880781 ], [ 117.25314, 29.834588 ], [ 117.29256, 29.822647 ], [ 117.338756, 29.848085 ], [ 117.359082, 29.812782 ], [ 117.382487, 29.840818 ], [ 117.415132, 29.85068 ], [ 117.408973, 29.802396 ], [ 117.455168, 29.749412 ], [ 117.453936, 29.688082 ], [ 117.490277, 29.660003 ], [ 117.530313, 29.654282 ], [ 117.523538, 29.630356 ], [ 117.543248, 29.588731 ], [ 117.608537, 29.591333 ], [ 117.647957, 29.614749 ], [ 117.678754, 29.595496 ], [ 117.690457, 29.555939 ], [ 117.729877, 29.550213 ], [ 117.795167, 29.570515 ], [ 117.872775, 29.54761 ], [ 117.933753, 29.549172 ], [ 118.00397, 29.578322 ], [ 118.042774, 29.566351 ], [ 118.050782, 29.542924 ], [ 118.095129, 29.534072 ], [ 118.143788, 29.489803 ], [ 118.127774, 29.47209 ], [ 118.136397, 29.418932 ], [ 118.193064, 29.395472 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"370000\", \"name\": \"山东省\", \"center\": [ 117.000923, 36.675807 ], \"centroid\": [ 118.187667, 36.376018 ], \"childrenNum\": 16, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 14, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 116.374195, 34.640011 ], [ 116.334159, 34.620806 ], [ 116.32492, 34.601104 ], [ 116.286116, 34.608986 ], [ 116.247927, 34.551829 ], [ 116.196804, 34.575977 ], [ 116.156768, 34.5538 ], [ 116.134594, 34.559715 ], [ 116.101334, 34.60603 ], [ 116.037276, 34.593222 ], [ 115.991081, 34.615389 ], [ 115.984305, 34.589281 ], [ 115.838328, 34.5676 ], [ 115.827241, 34.558236 ], [ 115.787821, 34.580905 ], [ 115.697278, 34.594207 ], [ 115.685575, 34.556265 ], [ 115.622749, 34.574499 ], [ 115.553148, 34.568586 ], [ 115.515575, 34.582383 ], [ 115.461373, 34.637057 ], [ 115.433655, 34.725149 ], [ 115.449054, 34.74433 ], [ 115.42688, 34.805285 ], [ 115.317243, 34.859321 ], [ 115.256265, 34.845079 ], [ 115.239019, 34.87798 ], [ 115.251953, 34.906451 ], [ 115.205142, 34.914303 ], [ 115.219309, 34.96042 ], [ 115.157099, 34.957968 ], [ 115.12815, 35.00455 ], [ 115.075179, 35.000628 ], [ 115.028983, 34.9717 ], [ 115.008041, 34.988372 ], [ 114.950759, 34.989843 ], [ 114.923658, 34.968757 ], [ 114.880542, 35.00357 ], [ 114.824492, 35.012393 ], [ 114.852209, 35.041797 ], [ 114.818948, 35.051596 ], [ 114.835578, 35.076578 ], [ 114.883006, 35.098615 ], [ 114.841738, 35.15099 ], [ 114.861448, 35.182301 ], [ 114.932281, 35.198441 ], [ 114.929201, 35.244886 ], [ 114.957534, 35.261014 ], [ 115.04315, 35.376744 ], [ 115.073947, 35.374304 ], [ 115.091809, 35.416259 ], [ 115.117679, 35.400163 ], [ 115.126302, 35.41821 ], [ 115.172497, 35.426501 ], [ 115.237171, 35.423087 ], [ 115.307388, 35.480126 ], [ 115.356047, 35.490359 ], [ 115.34496, 35.55368 ], [ 115.383148, 35.568772 ], [ 115.48601, 35.710306 ], [ 115.52851, 35.733628 ], [ 115.622749, 35.739457 ], [ 115.693582, 35.754028 ], [ 115.696046, 35.788989 ], [ 115.73485, 35.833154 ], [ 115.773654, 35.854014 ], [ 115.81677, 35.844312 ], [ 115.859886, 35.857894 ], [ 115.882675, 35.879718 ], [ 115.873436, 35.918985 ], [ 115.907929, 35.92674 ], [ 115.911624, 35.960171 ], [ 115.984921, 35.974218 ], [ 116.048979, 35.970343 ], [ 116.063145, 36.028927 ], [ 116.099486, 36.112129 ], [ 116.057602, 36.104877 ], [ 115.989849, 36.045381 ], [ 115.89869, 36.026507 ], [ 115.859886, 36.003756 ], [ 115.817386, 36.012954 ], [ 115.779813, 35.993588 ], [ 115.774886, 35.974702 ], [ 115.699125, 35.966468 ], [ 115.648618, 35.922863 ], [ 115.583945, 35.921893 ], [ 115.513112, 35.890385 ], [ 115.505104, 35.899112 ], [ 115.495249, 35.896203 ], [ 115.487858, 35.880688 ], [ 115.460141, 35.867594 ], [ 115.407786, 35.80889 ], [ 115.363438, 35.779765 ], [ 115.335105, 35.796756 ], [ 115.364054, 35.894264 ], [ 115.353583, 35.938854 ], [ 115.362822, 35.971796 ], [ 115.447822, 36.01247 ], [ 115.449054, 36.047317 ], [ 115.484163, 36.125666 ], [ 115.483547, 36.148865 ], [ 115.474923, 36.248352 ], [ 115.466916, 36.258969 ], [ 115.466916, 36.258969 ], [ 115.462605, 36.276339 ], [ 115.417025, 36.292742 ], [ 115.423185, 36.32216 ], [ 115.366518, 36.30914 ], [ 115.368982, 36.342409 ], [ 115.340033, 36.398307 ], [ 115.297533, 36.413239 ], [ 115.317243, 36.454166 ], [ 115.291374, 36.460423 ], [ 115.272895, 36.497476 ], [ 115.33141, 36.550378 ], [ 115.355431, 36.627262 ], [ 115.365902, 36.621979 ], [ 115.420105, 36.686795 ], [ 115.451518, 36.702151 ], [ 115.479851, 36.760187 ], [ 115.524815, 36.763543 ], [ 115.686807, 36.810034 ], [ 115.688654, 36.838777 ], [ 115.71206, 36.883308 ], [ 115.75764, 36.902453 ], [ 115.79706, 36.968945 ], [ 115.776734, 36.992848 ], [ 115.85619, 37.060694 ], [ 115.888219, 37.112254 ], [ 115.879596, 37.150901 ], [ 115.91224, 37.177132 ], [ 115.909777, 37.20669 ], [ 115.969523, 37.239572 ], [ 115.975682, 37.337179 ], [ 116.024341, 37.360015 ], [ 116.085935, 37.373809 ], [ 116.106261, 37.368577 ], [ 116.169087, 37.384271 ], [ 116.193109, 37.365723 ], [ 116.236224, 37.361442 ], [ 116.2855, 37.404241 ], [ 116.226369, 37.428007 ], [ 116.243, 37.447965 ], [ 116.224522, 37.479791 ], [ 116.240536, 37.489764 ], [ 116.240536, 37.489764 ], [ 116.27626, 37.466967 ], [ 116.290427, 37.484065 ], [ 116.278724, 37.524895 ], [ 116.295355, 37.554316 ], [ 116.336007, 37.581355 ], [ 116.36742, 37.566177 ], [ 116.379738, 37.522047 ], [ 116.38097, 37.522522 ], [ 116.379738, 37.522047 ], [ 116.38097, 37.522522 ], [ 116.433941, 37.473142 ], [ 116.448108, 37.503059 ], [ 116.4826, 37.521573 ], [ 116.575607, 37.610754 ], [ 116.604556, 37.624975 ], [ 116.66307, 37.686096 ], [ 116.679085, 37.728708 ], [ 116.724664, 37.744327 ], [ 116.753613, 37.77035 ], [ 116.753613, 37.793054 ], [ 116.804736, 37.848837 ], [ 116.837997, 37.835132 ], [ 116.919301, 37.846002 ], [ 117.027091, 37.832296 ], [ 117.074518, 37.848837 ], [ 117.150278, 37.839385 ], [ 117.185387, 37.849783 ], [ 117.271618, 37.839858 ], [ 117.320278, 37.861596 ], [ 117.400966, 37.844584 ], [ 117.438538, 37.854035 ], [ 117.481038, 37.914967 ], [ 117.513067, 37.94329 ], [ 117.524154, 37.989527 ], [ 117.557414, 38.046105 ], [ 117.557414, 38.046105 ], [ 117.586979, 38.071551 ], [ 117.704624, 38.076262 ], [ 117.746508, 38.12524 ], [ 117.771145, 38.134655 ], [ 117.766834, 38.158658 ], [ 117.789007, 38.180772 ], [ 117.808718, 38.22827 ], [ 117.848754, 38.255062 ], [ 117.895565, 38.301572 ], [ 117.896797, 38.279495 ], [ 118.018753, 38.202409 ], [ 118.045238, 38.214165 ], [ 118.112376, 38.210403 ], [ 118.177665, 38.186417 ], [ 118.217085, 38.146893 ], [ 118.331034, 38.12524 ], [ 118.404331, 38.121003 ], [ 118.431432, 38.106406 ], [ 118.44991, 38.124299 ], [ 118.504729, 38.11394 ], [ 118.534294, 38.063541 ], [ 118.552156, 38.05553 ], [ 118.597736, 38.079088 ], [ 118.607591, 38.129006 ], [ 118.626069, 38.138421 ], [ 118.703677, 38.151129 ], [ 118.811467, 38.157717 ], [ 118.908169, 38.139362 ], [ 118.974075, 38.094162 ], [ 119.001792, 37.99613 ], [ 119.110813, 37.921577 ], [ 119.12806, 37.847892 ], [ 119.16132, 37.81906 ], [ 119.212443, 37.838913 ], [ 119.24016, 37.878131 ], [ 119.291899, 37.869627 ], [ 119.309146, 37.805349 ], [ 119.280197, 37.692726 ], [ 119.262334, 37.660517 ], [ 119.236465, 37.651988 ], [ 119.153313, 37.655305 ], [ 119.023966, 37.642037 ], [ 118.988857, 37.620709 ], [ 118.939582, 37.527268 ], [ 118.942662, 37.497361 ], [ 119.001176, 37.31862 ], [ 119.03998, 37.30434 ], [ 119.054147, 37.254816 ], [ 119.084328, 37.239572 ], [ 119.091103, 37.257674 ], [ 119.12806, 37.254816 ], [ 119.136683, 37.230995 ], [ 119.204436, 37.280058 ], [ 119.190885, 37.25958 ], [ 119.2069, 37.223371 ], [ 119.298675, 37.197156 ], [ 119.301138, 37.139452 ], [ 119.327624, 37.115595 ], [ 119.361501, 37.125616 ], [ 119.428022, 37.125616 ], [ 119.489616, 37.134681 ], [ 119.576463, 37.127524 ], [ 119.678709, 37.158056 ], [ 119.698419, 37.127047 ], [ 119.744615, 37.135158 ], [ 119.83023, 37.225754 ], [ 119.865339, 37.233854 ], [ 119.89244, 37.263866 ], [ 119.883201, 37.311004 ], [ 119.837006, 37.346695 ], [ 119.843781, 37.376662 ], [ 119.926933, 37.386649 ], [ 119.949723, 37.419927 ], [ 120.010085, 37.442263 ], [ 120.064903, 37.448915 ], [ 120.086461, 37.465067 ], [ 120.144359, 37.481691 ], [ 120.222584, 37.532963 ], [ 120.246605, 37.556689 ], [ 120.208417, 37.588469 ], [ 120.215192, 37.621183 ], [ 120.272475, 37.636824 ], [ 120.269395, 37.658622 ], [ 120.22012, 37.671886 ], [ 120.227511, 37.693673 ], [ 120.367945, 37.697935 ], [ 120.454793, 37.757576 ], [ 120.517619, 37.750005 ], [ 120.590915, 37.7642 ], [ 120.634031, 37.796364 ], [ 120.656821, 37.793054 ], [ 120.733197, 37.833714 ], [ 120.839139, 37.82426 ], [ 120.845298, 37.826623 ], [ 120.874863, 37.833241 ], [ 120.940769, 37.819533 ], [ 120.943233, 37.785486 ], [ 120.994356, 37.759468 ], [ 121.037471, 37.718767 ], [ 121.136022, 37.723501 ], [ 121.160043, 37.698882 ], [ 121.142797, 37.661464 ], [ 121.161891, 37.646302 ], [ 121.148956, 37.626397 ], [ 121.17421, 37.597479 ], [ 121.217326, 37.582778 ], [ 121.304789, 37.582778 ], [ 121.358376, 37.597479 ], [ 121.349137, 37.635403 ], [ 121.391021, 37.625449 ], [ 121.435368, 37.592737 ], [ 121.395948, 37.589891 ], [ 121.400876, 37.557638 ], [ 121.460006, 37.522522 ], [ 121.477252, 37.475992 ], [ 121.571491, 37.441313 ], [ 121.575802, 37.460317 ], [ 121.635548, 37.494037 ], [ 121.66573, 37.473617 ], [ 121.772903, 37.466492 ], [ 121.923808, 37.473142 ], [ 121.997721, 37.494512 ], [ 122.017431, 37.531065 ], [ 122.075329, 37.540556 ], [ 122.08888, 37.554316 ], [ 122.150474, 37.557163 ], [ 122.163408, 37.519199 ], [ 122.131996, 37.49926 ], [ 122.166488, 37.438937 ], [ 122.194205, 37.456041 ], [ 122.25272, 37.467917 ], [ 122.287212, 37.445114 ], [ 122.281053, 37.430858 ], [ 122.337103, 37.414223 ], [ 122.41656, 37.414699 ], [ 122.487393, 37.43466 ], [ 122.4954, 37.413748 ], [ 122.553914, 37.407093 ], [ 122.641377, 37.428482 ], [ 122.67587, 37.413273 ], [ 122.701739, 37.418501 ], [ 122.714058, 37.392355 ], [ 122.6925, 37.373809 ], [ 122.650616, 37.388551 ], [ 122.607501, 37.364296 ], [ 122.611196, 37.339558 ], [ 122.573624, 37.296247 ], [ 122.567465, 37.25958 ], [ 122.592718, 37.261485 ], [ 122.624131, 37.190959 ], [ 122.573624, 37.176178 ], [ 122.581015, 37.147562 ], [ 122.533588, 37.153286 ], [ 122.484313, 37.128956 ], [ 122.478769, 37.058784 ], [ 122.467067, 37.037289 ], [ 122.494168, 37.033945 ], [ 122.575472, 37.054485 ], [ 122.583479, 37.037289 ], [ 122.544675, 37.004797 ], [ 122.55761, 36.968467 ], [ 122.532356, 36.901496 ], [ 122.48924, 36.886659 ], [ 122.483081, 36.913938 ], [ 122.434422, 36.914416 ], [ 122.457212, 36.868946 ], [ 122.383915, 36.865595 ], [ 122.378371, 36.844525 ], [ 122.344495, 36.828239 ], [ 122.280437, 36.835904 ], [ 122.275509, 36.83734 ], [ 122.220691, 36.848835 ], [ 122.174495, 36.842609 ], [ 122.188662, 36.866073 ], [ 122.175727, 36.894317 ], [ 122.119677, 36.891924 ], [ 122.141235, 36.938337 ], [ 122.124604, 36.944077 ], [ 122.115981, 36.94025 ], [ 122.093191, 36.913938 ], [ 122.051923, 36.904846 ], [ 122.042684, 36.871819 ], [ 122.008808, 36.96225 ], [ 121.965076, 36.938337 ], [ 121.927504, 36.932597 ], [ 121.767975, 36.874691 ], [ 121.762432, 36.84644 ], [ 121.726092, 36.826323 ], [ 121.6762, 36.819137 ], [ 121.631853, 36.80093 ], [ 121.651563, 36.723739 ], [ 121.556092, 36.764502 ], [ 121.575186, 36.740047 ], [ 121.532071, 36.73621 ], [ 121.485259, 36.786073 ], [ 121.548701, 36.807638 ], [ 121.565331, 36.830635 ], [ 121.506817, 36.803805 ], [ 121.496962, 36.795179 ], [ 121.454462, 36.752515 ], [ 121.3941, 36.738129 ], [ 121.400876, 36.701191 ], [ 121.35776, 36.713186 ], [ 121.31218, 36.702151 ], [ 121.29863, 36.702151 ], [ 121.251818, 36.671436 ], [ 121.161275, 36.651273 ], [ 121.078123, 36.607568 ], [ 121.028848, 36.572971 ], [ 120.955551, 36.575855 ], [ 120.926602, 36.611892 ], [ 120.882255, 36.627262 ], [ 120.847146, 36.618617 ], [ 120.884718, 36.601323 ], [ 120.909972, 36.568645 ], [ 120.962327, 36.562877 ], [ 120.983269, 36.546051 ], [ 120.95432, 36.507578 ], [ 120.965407, 36.466199 ], [ 120.938305, 36.447908 ], [ 120.90874, 36.450315 ], [ 120.919827, 36.419018 ], [ 120.871784, 36.36699 ], [ 120.848994, 36.403124 ], [ 120.858849, 36.424797 ], [ 120.828668, 36.46668 ], [ 120.759683, 36.46283 ], [ 120.694393, 36.390118 ], [ 120.744284, 36.327946 ], [ 120.66298, 36.331803 ], [ 120.653741, 36.282129 ], [ 120.686386, 36.279234 ], [ 120.696857, 36.15563 ], [ 120.712255, 36.126632 ], [ 120.672835, 36.130016 ], [ 120.64327, 36.114547 ], [ 120.615553, 36.120348 ], [ 120.593995, 36.100525 ], [ 120.546568, 36.107778 ], [ 120.546568, 36.091821 ], [ 120.468959, 36.087952 ], [ 120.429539, 36.056994 ], [ 120.370409, 36.053607 ], [ 120.289721, 36.059413 ], [ 120.35809, 36.174956 ], [ 120.362402, 36.196209 ], [ 120.319902, 36.232423 ], [ 120.297112, 36.225664 ], [ 120.310047, 36.185101 ], [ 120.263236, 36.182202 ], [ 120.260772, 36.198624 ], [ 120.224432, 36.19138 ], [ 120.22012, 36.209248 ], [ 120.181316, 36.203936 ], [ 120.140664, 36.173507 ], [ 120.142512, 36.143549 ], [ 120.108635, 36.127599 ], [ 120.116642, 36.102943 ], [ 120.152367, 36.095206 ], [ 120.181316, 36.066669 ], [ 120.239214, 36.062316 ], [ 120.234902, 36.030863 ], [ 120.198562, 35.995525 ], [ 120.257076, 36.025055 ], [ 120.249069, 35.992136 ], [ 120.285409, 36.01247 ], [ 120.289721, 36.017311 ], [ 120.316206, 36.002304 ], [ 120.30512, 35.971796 ], [ 120.265699, 35.966468 ], [ 120.209033, 35.917531 ], [ 120.202258, 35.89184 ], [ 120.169613, 35.888446 ], [ 120.207801, 35.947575 ], [ 120.152983, 35.907353 ], [ 120.125265, 35.906868 ], [ 120.112331, 35.885052 ], [ 120.064287, 35.873414 ], [ 120.032258, 35.812288 ], [ 120.049505, 35.786562 ], [ 120.01378, 35.714193 ], [ 119.958346, 35.760342 ], [ 119.926317, 35.759856 ], [ 119.920157, 35.739943 ], [ 119.950339, 35.729741 ], [ 119.91215, 35.660725 ], [ 119.925085, 35.637382 ], [ 119.868419, 35.60868 ], [ 119.83023, 35.620357 ], [ 119.824071, 35.646136 ], [ 119.792658, 35.615492 ], [ 119.800665, 35.581915 ], [ 119.752622, 35.588729 ], [ 119.75139, 35.617924 ], [ 119.718129, 35.615492 ], [ 119.662079, 35.589215 ], [ 119.663311, 35.562931 ], [ 119.618963, 35.459655 ], [ 119.579543, 35.406504 ], [ 119.590014, 35.37284 ], [ 119.543819, 35.347949 ], [ 119.538275, 35.296678 ], [ 119.493312, 35.318655 ], [ 119.450812, 35.285443 ], [ 119.411392, 35.231689 ], [ 119.397841, 35.137777 ], [ 119.428022, 35.121136 ], [ 119.373819, 35.078538 ], [ 119.354109, 35.080007 ], [ 119.306066, 35.076578 ], [ 119.286972, 35.115261 ], [ 119.250016, 35.124562 ], [ 119.217371, 35.106939 ], [ 119.137915, 35.096167 ], [ 119.114509, 35.055026 ], [ 119.027045, 35.055516 ], [ 118.942662, 35.040817 ], [ 118.928495, 35.051106 ], [ 118.86259, 35.025626 ], [ 118.860742, 34.944233 ], [ 118.805307, 34.87307 ], [ 118.80038, 34.843114 ], [ 118.772047, 34.794474 ], [ 118.739402, 34.792508 ], [ 118.719076, 34.745313 ], [ 118.764039, 34.740396 ], [ 118.783749, 34.723181 ], [ 118.739402, 34.693663 ], [ 118.690127, 34.678408 ], [ 118.664257, 34.693663 ], [ 118.607591, 34.694155 ], [ 118.601431, 34.714327 ], [ 118.545997, 34.705964 ], [ 118.460997, 34.656258 ], [ 118.473932, 34.623269 ], [ 118.439439, 34.626223 ], [ 118.424657, 34.595193 ], [ 118.439439, 34.507949 ], [ 118.416034, 34.473914 ], [ 118.404947, 34.427525 ], [ 118.379693, 34.415183 ], [ 118.290382, 34.424563 ], [ 118.277447, 34.404814 ], [ 118.220165, 34.405802 ], [ 118.217701, 34.379134 ], [ 118.179513, 34.379628 ], [ 118.177665, 34.45319 ], [ 118.132702, 34.483287 ], [ 118.16473, 34.50499 ], [ 118.185056, 34.543942 ], [ 118.079115, 34.569571 ], [ 118.114839, 34.614404 ], [ 118.084042, 34.655766 ], [ 118.053861, 34.650843 ], [ 117.951615, 34.678408 ], [ 117.909732, 34.670533 ], [ 117.902956, 34.644443 ], [ 117.793935, 34.651827 ], [ 117.791471, 34.583368 ], [ 117.801942, 34.518798 ], [ 117.684298, 34.547392 ], [ 117.659044, 34.501044 ], [ 117.609769, 34.490686 ], [ 117.592523, 34.462566 ], [ 117.53832, 34.467006 ], [ 117.465023, 34.484767 ], [ 117.402813, 34.550843 ], [ 117.402813, 34.569571 ], [ 117.362777, 34.589281 ], [ 117.325205, 34.573021 ], [ 117.325205, 34.573021 ], [ 117.32151, 34.566614 ], [ 117.32151, 34.566614 ], [ 117.311654, 34.561686 ], [ 117.311654, 34.561686 ], [ 117.267307, 34.528659 ], [ 117.27285, 34.499565 ], [ 117.252524, 34.48674 ], [ 117.248213, 34.451216 ], [ 117.166293, 34.434435 ], [ 117.139191, 34.526687 ], [ 117.15151, 34.559222 ], [ 117.104083, 34.648874 ], [ 117.073286, 34.639026 ], [ 117.061583, 34.675947 ], [ 117.070206, 34.713835 ], [ 117.022163, 34.759081 ], [ 116.969192, 34.771864 ], [ 116.95133, 34.81069 ], [ 116.979047, 34.815113 ], [ 116.966113, 34.844588 ], [ 116.929156, 34.843114 ], [ 116.922381, 34.894671 ], [ 116.858323, 34.928533 ], [ 116.821983, 34.929515 ], [ 116.809048, 34.968757 ], [ 116.781947, 34.961891 ], [ 116.781331, 34.916757 ], [ 116.677853, 34.939327 ], [ 116.622418, 34.939818 ], [ 116.613795, 34.922645 ], [ 116.557745, 34.908905 ], [ 116.445028, 34.895652 ], [ 116.408071, 34.850972 ], [ 116.403144, 34.756131 ], [ 116.369267, 34.749247 ], [ 116.363724, 34.715311 ], [ 116.392057, 34.710391 ], [ 116.374195, 34.640011 ] ] ], [ [ [ 120.729502, 37.947065 ], [ 120.76461, 37.923937 ], [ 120.76461, 37.895134 ], [ 120.721495, 37.917328 ], [ 120.729502, 37.947065 ] ] ], [ [ [ 120.692545, 37.983867 ], [ 120.724574, 37.987641 ], [ 120.732581, 37.961694 ], [ 120.692545, 37.983867 ] ] ], [ [ [ 120.990044, 36.413239 ], [ 120.950624, 36.414684 ], [ 120.978341, 36.428649 ], [ 120.990044, 36.413239 ] ] ], [ [ [ 120.750444, 38.150188 ], [ 120.742436, 38.199116 ], [ 120.7874, 38.158658 ], [ 120.750444, 38.150188 ] ] ], [ [ [ 120.918595, 38.345236 ], [ 120.895189, 38.36307 ], [ 120.914899, 38.373393 ], [ 120.918595, 38.345236 ] ] ], [ [ [ 120.159142, 35.765198 ], [ 120.172077, 35.785591 ], [ 120.193019, 35.756942 ], [ 120.169613, 35.740428 ], [ 120.159142, 35.765198 ] ] ], [ [ [ 120.62664, 37.94565 ], [ 120.602002, 37.978678 ], [ 120.631567, 37.981037 ], [ 120.62664, 37.94565 ] ] ], [ [ [ 120.802183, 38.284193 ], [ 120.816349, 38.318008 ], [ 120.848378, 38.305799 ], [ 120.802183, 38.284193 ] ] ], [ [ [ 121.489571, 37.577086 ], [ 121.488955, 37.578035 ], [ 121.489571, 37.578509 ], [ 121.489571, 37.577561 ], [ 121.489571, 37.577086 ] ] ], [ [ [ 121.485875, 37.578509 ], [ 121.487723, 37.578509 ], [ 121.487723, 37.578035 ], [ 121.485875, 37.578509 ] ] ], [ [ [ 121.487723, 37.578509 ], [ 121.488339, 37.578509 ], [ 121.488955, 37.578509 ], [ 121.488955, 37.578035 ], [ 121.487723, 37.577561 ], [ 121.487723, 37.578509 ] ] ], [ [ [ 115.495249, 35.896203 ], [ 115.505104, 35.899112 ], [ 115.513112, 35.890385 ], [ 115.487858, 35.880688 ], [ 115.495249, 35.896203 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"410000\", \"name\": \"河南省\", \"center\": [ 113.665412, 34.757975 ], \"centroid\": [ 113.619748, 33.902617 ], \"childrenNum\": 18, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 15, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 115.5088, 32.468761 ], [ 115.509416, 32.466741 ], [ 115.522967, 32.441997 ], [ 115.57101, 32.419266 ], [ 115.604271, 32.425833 ], [ 115.626445, 32.40512 ], [ 115.657857, 32.428864 ], [ 115.667712, 32.409667 ], [ 115.704669, 32.495013 ], [ 115.742241, 32.476335 ], [ 115.771806, 32.505108 ], [ 115.789052, 32.468761 ], [ 115.861117, 32.537403 ], [ 115.891298, 32.576243 ], [ 115.910393, 32.567165 ], [ 115.8759, 32.542448 ], [ 115.845719, 32.501575 ], [ 115.883291, 32.487946 ], [ 115.865429, 32.458662 ], [ 115.899306, 32.390971 ], [ 115.912856, 32.227596 ], [ 115.941805, 32.166318 ], [ 115.922095, 32.049725 ], [ 115.928871, 32.003046 ], [ 115.909161, 31.94314 ], [ 115.920248, 31.920285 ], [ 115.894994, 31.8649 ], [ 115.893762, 31.832365 ], [ 115.914704, 31.814567 ], [ 115.886371, 31.776418 ], [ 115.851878, 31.786593 ], [ 115.808147, 31.770313 ], [ 115.808147, 31.770313 ], [ 115.767495, 31.78761 ], [ 115.731154, 31.76726 ], [ 115.676336, 31.778453 ], [ 115.553764, 31.69549 ], [ 115.534054, 31.698545 ], [ 115.495249, 31.673083 ], [ 115.476771, 31.643028 ], [ 115.485394, 31.608885 ], [ 115.439815, 31.588496 ], [ 115.415793, 31.525771 ], [ 115.371446, 31.495668 ], [ 115.389924, 31.450241 ], [ 115.373909, 31.405813 ], [ 115.338801, 31.40428 ], [ 115.301229, 31.383846 ], [ 115.250722, 31.392021 ], [ 115.252569, 31.421646 ], [ 115.211301, 31.442072 ], [ 115.218077, 31.515057 ], [ 115.235939, 31.555354 ], [ 115.212533, 31.555354 ], [ 115.16449, 31.604808 ], [ 115.12507, 31.599201 ], [ 115.106592, 31.567592 ], [ 115.114599, 31.530362 ], [ 115.096121, 31.508425 ], [ 115.022824, 31.527811 ], [ 114.995107, 31.471171 ], [ 114.962462, 31.494648 ], [ 114.884238, 31.469129 ], [ 114.870071, 31.479337 ], [ 114.830035, 31.45892 ], [ 114.789383, 31.480358 ], [ 114.778912, 31.520669 ], [ 114.696376, 31.525771 ], [ 114.641558, 31.582378 ], [ 114.61692, 31.585437 ], [ 114.572572, 31.553824 ], [ 114.560869, 31.560963 ], [ 114.547935, 31.623665 ], [ 114.57134, 31.660858 ], [ 114.586123, 31.762172 ], [ 114.549783, 31.766751 ], [ 114.530688, 31.742834 ], [ 114.443841, 31.728074 ], [ 114.403189, 31.746906 ], [ 114.350218, 31.755557 ], [ 114.292936, 31.752503 ], [ 114.235654, 31.833382 ], [ 114.191922, 31.852192 ], [ 114.134024, 31.843042 ], [ 114.119241, 31.805922 ], [ 114.089676, 31.781506 ], [ 114.017611, 31.770822 ], [ 113.988662, 31.749959 ], [ 113.952321, 31.793714 ], [ 113.957865, 31.852701 ], [ 113.914749, 31.877098 ], [ 113.893807, 31.847109 ], [ 113.854387, 31.843042 ], [ 113.830981, 31.87913 ], [ 113.832213, 31.918761 ], [ 113.805728, 31.929428 ], [ 113.817431, 31.964467 ], [ 113.757685, 31.98985 ], [ 113.791561, 32.036028 ], [ 113.728735, 32.083197 ], [ 113.722576, 32.12426 ], [ 113.750293, 32.11615 ], [ 113.782322, 32.184553 ], [ 113.752757, 32.215951 ], [ 113.73859, 32.255942 ], [ 113.749061, 32.272642 ], [ 113.758301, 32.27669 ], [ 113.768156, 32.284279 ], [ 113.768772, 32.30148 ], [ 113.753989, 32.328286 ], [ 113.76754, 32.370249 ], [ 113.735511, 32.410677 ], [ 113.700402, 32.420782 ], [ 113.650511, 32.412698 ], [ 113.624642, 32.36115 ], [ 113.511925, 32.316654 ], [ 113.428773, 32.270618 ], [ 113.376418, 32.298445 ], [ 113.353628, 32.294904 ], [ 113.317904, 32.327275 ], [ 113.333918, 32.336377 ], [ 113.2366, 32.407141 ], [ 113.211962, 32.431895 ], [ 113.158992, 32.410677 ], [ 113.155912, 32.380863 ], [ 113.118956, 32.375809 ], [ 113.107869, 32.398551 ], [ 113.078919, 32.394508 ], [ 113.025949, 32.425328 ], [ 113.000695, 32.41674 ], [ 112.992072, 32.378336 ], [ 112.912, 32.390971 ], [ 112.888594, 32.37682 ], [ 112.860877, 32.396024 ], [ 112.776493, 32.358623 ], [ 112.735841, 32.356095 ], [ 112.716747, 32.357612 ], [ 112.645298, 32.368227 ], [ 112.612037, 32.386928 ], [ 112.589248, 32.381369 ], [ 112.545516, 32.404109 ], [ 112.530733, 32.37682 ], [ 112.477147, 32.380863 ], [ 112.448814, 32.34295 ], [ 112.390915, 32.37126 ], [ 112.360118, 32.3657 ], [ 112.328089, 32.321712 ], [ 112.206133, 32.392992 ], [ 112.172873, 32.385412 ], [ 112.150083, 32.411688 ], [ 112.155626, 32.377326 ], [ 112.081098, 32.425833 ], [ 112.063851, 32.474315 ], [ 112.014576, 32.450077 ], [ 111.975772, 32.471791 ], [ 111.948671, 32.51722 ], [ 111.890157, 32.503089 ], [ 111.858128, 32.528826 ], [ 111.808853, 32.536899 ], [ 111.713382, 32.606497 ], [ 111.646245, 32.605993 ], [ 111.640701, 32.634724 ], [ 111.577875, 32.593388 ], [ 111.530448, 32.628172 ], [ 111.513202, 32.674026 ], [ 111.458383, 32.726402 ], [ 111.475629, 32.760127 ], [ 111.41342, 32.757108 ], [ 111.380159, 32.829049 ], [ 111.293311, 32.859217 ], [ 111.276065, 32.903445 ], [ 111.255123, 32.883846 ], [ 111.242804, 32.930573 ], [ 111.273601, 32.971753 ], [ 111.258819, 33.006389 ], [ 111.221862, 33.042517 ], [ 111.152877, 33.039507 ], [ 111.192913, 33.071609 ], [ 111.179363, 33.115229 ], [ 111.146102, 33.12375 ], [ 111.12824, 33.15532 ], [ 111.08882, 33.181871 ], [ 111.045704, 33.169849 ], [ 111.046936, 33.202905 ], [ 110.984726, 33.255469 ], [ 111.025994, 33.330504 ], [ 111.025994, 33.375495 ], [ 110.996429, 33.435946 ], [ 111.02661, 33.467903 ], [ 111.02661, 33.478386 ], [ 111.002588, 33.535772 ], [ 111.00382, 33.578662 ], [ 110.966864, 33.609071 ], [ 110.878784, 33.634486 ], [ 110.823966, 33.685793 ], [ 110.831973, 33.713675 ], [ 110.81719, 33.751003 ], [ 110.782082, 33.796272 ], [ 110.74143, 33.798759 ], [ 110.712481, 33.833564 ], [ 110.66259, 33.85295 ], [ 110.612083, 33.852453 ], [ 110.587445, 33.887733 ], [ 110.628713, 33.910086 ], [ 110.627481, 33.925482 ], [ 110.665669, 33.937895 ], [ 110.671213, 33.966192 ], [ 110.620706, 34.035652 ], [ 110.587445, 34.023252 ], [ 110.591757, 34.101586 ], [ 110.61393, 34.113478 ], [ 110.642264, 34.161032 ], [ 110.621938, 34.177372 ], [ 110.55788, 34.193214 ], [ 110.55172, 34.213012 ], [ 110.507989, 34.217466 ], [ 110.43962, 34.243196 ], [ 110.428533, 34.288203 ], [ 110.451938, 34.292653 ], [ 110.503677, 34.33714 ], [ 110.473496, 34.393457 ], [ 110.403279, 34.433448 ], [ 110.403279, 34.433448 ], [ 110.360779, 34.516825 ], [ 110.372482, 34.544435 ], [ 110.404511, 34.557743 ], [ 110.366939, 34.566614 ], [ 110.379257, 34.600612 ], [ 110.424837, 34.588295 ], [ 110.488279, 34.610956 ], [ 110.533242, 34.583368 ], [ 110.610851, 34.607508 ], [ 110.710017, 34.605045 ], [ 110.749437, 34.65232 ], [ 110.780234, 34.648874 ], [ 110.812263, 34.624746 ], [ 110.870777, 34.636072 ], [ 110.89911, 34.661673 ], [ 110.929907, 34.731543 ], [ 110.976103, 34.706456 ], [ 111.035233, 34.740887 ], [ 111.118385, 34.756623 ], [ 111.148566, 34.807742 ], [ 111.232949, 34.789559 ], [ 111.255123, 34.819535 ], [ 111.29208, 34.806759 ], [ 111.345666, 34.831816 ], [ 111.389398, 34.815113 ], [ 111.439289, 34.838202 ], [ 111.502731, 34.829851 ], [ 111.543999, 34.853428 ], [ 111.570484, 34.843114 ], [ 111.592042, 34.881416 ], [ 111.617911, 34.894671 ], [ 111.646861, 34.938836 ], [ 111.681969, 34.9511 ], [ 111.664107, 34.984449 ], [ 111.739251, 35.00406 ], [ 111.807005, 35.032977 ], [ 111.810084, 35.062374 ], [ 111.933272, 35.083435 ], [ 111.97762, 35.067272 ], [ 112.018888, 35.068742 ], [ 112.039214, 35.045717 ], [ 112.062004, 35.056005 ], [ 112.05646, 35.098615 ], [ 112.066315, 35.153437 ], [ 112.03983, 35.194039 ], [ 112.078634, 35.219467 ], [ 112.058924, 35.280069 ], [ 112.094033, 35.279092 ], [ 112.21722, 35.253195 ], [ 112.242474, 35.234622 ], [ 112.304684, 35.251728 ], [ 112.288053, 35.219956 ], [ 112.36751, 35.219956 ], [ 112.390915, 35.239021 ], [ 112.513487, 35.218489 ], [ 112.637291, 35.225822 ], [ 112.628052, 35.263457 ], [ 112.720443, 35.206265 ], [ 112.772798, 35.207732 ], [ 112.822073, 35.258082 ], [ 112.884283, 35.243909 ], [ 112.934174, 35.262968 ], [ 112.936022, 35.284466 ], [ 112.992072, 35.29619 ], [ 112.985913, 35.33965 ], [ 112.996384, 35.362104 ], [ 113.067217, 35.353806 ], [ 113.126347, 35.332327 ], [ 113.149137, 35.350878 ], [ 113.165151, 35.412845 ], [ 113.188557, 35.412357 ], [ 113.189789, 35.44893 ], [ 113.243375, 35.449418 ], [ 113.304353, 35.426989 ], [ 113.31236, 35.481101 ], [ 113.348085, 35.468429 ], [ 113.391817, 35.506925 ], [ 113.439244, 35.507412 ], [ 113.49899, 35.532254 ], [ 113.513773, 35.57364 ], [ 113.55812, 35.621816 ], [ 113.547649, 35.656835 ], [ 113.578446, 35.633491 ], [ 113.625258, 35.632518 ], [ 113.622794, 35.674825 ], [ 113.592613, 35.691838 ], [ 113.587685, 35.736542 ], [ 113.604932, 35.797727 ], [ 113.582758, 35.818111 ], [ 113.660982, 35.837035 ], [ 113.637576, 35.870019 ], [ 113.654207, 35.931586 ], [ 113.648663, 35.994073 ], [ 113.678844, 35.985841 ], [ 113.694859, 36.026991 ], [ 113.660366, 36.034735 ], [ 113.68562, 36.056026 ], [ 113.671453, 36.115514 ], [ 113.655439, 36.125182 ], [ 113.712721, 36.129533 ], [ 113.705946, 36.148865 ], [ 113.651127, 36.174473 ], [ 113.697939, 36.181719 ], [ 113.681924, 36.216491 ], [ 113.716417, 36.262347 ], [ 113.712105, 36.303353 ], [ 113.736127, 36.324571 ], [ 113.731199, 36.363135 ], [ 113.755221, 36.366026 ], [ 113.813119, 36.332285 ], [ 113.856851, 36.329392 ], [ 113.84946, 36.347711 ], [ 113.882104, 36.353977 ], [ 113.911054, 36.314927 ], [ 113.962792, 36.353977 ], [ 113.981887, 36.31782 ], [ 114.002828, 36.334214 ], [ 114.056415, 36.329392 ], [ 114.04348, 36.303353 ], [ 114.080437, 36.269585 ], [ 114.129096, 36.280199 ], [ 114.175907, 36.264759 ], [ 114.170364, 36.245938 ], [ 114.170364, 36.245938 ], [ 114.203009, 36.245456 ], [ 114.2104, 36.272962 ], [ 114.241197, 36.251247 ], [ 114.257827, 36.263794 ], [ 114.299095, 36.245938 ], [ 114.345291, 36.255591 ], [ 114.356378, 36.230492 ], [ 114.408117, 36.224699 ], [ 114.417356, 36.205868 ], [ 114.466015, 36.197658 ], [ 114.480181, 36.177855 ], [ 114.533152, 36.171575 ], [ 114.586739, 36.141133 ], [ 114.588587, 36.118414 ], [ 114.640326, 36.137266 ], [ 114.720398, 36.140166 ], [ 114.734564, 36.15563 ], [ 114.771521, 36.124699 ], [ 114.857752, 36.127599 ], [ 114.858368, 36.144516 ], [ 114.912571, 36.140649 ], [ 114.926737, 36.089403 ], [ 114.914419, 36.052155 ], [ 114.998186, 36.069572 ], [ 115.04623, 36.112613 ], [ 115.048693, 36.161912 ], [ 115.06286, 36.178338 ], [ 115.104744, 36.172058 ], [ 115.12507, 36.209731 ], [ 115.1842, 36.193312 ], [ 115.201446, 36.210214 ], [ 115.201446, 36.210214 ], [ 115.202678, 36.209248 ], [ 115.202678, 36.209248 ], [ 115.202678, 36.208765 ], [ 115.202678, 36.208765 ], [ 115.242098, 36.19138 ], [ 115.279055, 36.13775 ], [ 115.30246, 36.127599 ], [ 115.312931, 36.088436 ], [ 115.365902, 36.099074 ], [ 115.376989, 36.128083 ], [ 115.450902, 36.152248 ], [ 115.465068, 36.170125 ], [ 115.483547, 36.148865 ], [ 115.484163, 36.125666 ], [ 115.449054, 36.047317 ], [ 115.447822, 36.01247 ], [ 115.362822, 35.971796 ], [ 115.353583, 35.938854 ], [ 115.364054, 35.894264 ], [ 115.335105, 35.796756 ], [ 115.363438, 35.779765 ], [ 115.407786, 35.80889 ], [ 115.460141, 35.867594 ], [ 115.487858, 35.880688 ], [ 115.513112, 35.890385 ], [ 115.583945, 35.921893 ], [ 115.648618, 35.922863 ], [ 115.699125, 35.966468 ], [ 115.774886, 35.974702 ], [ 115.779813, 35.993588 ], [ 115.817386, 36.012954 ], [ 115.859886, 36.003756 ], [ 115.89869, 36.026507 ], [ 115.989849, 36.045381 ], [ 116.057602, 36.104877 ], [ 116.099486, 36.112129 ], [ 116.063145, 36.028927 ], [ 116.048979, 35.970343 ], [ 115.984921, 35.974218 ], [ 115.911624, 35.960171 ], [ 115.907929, 35.92674 ], [ 115.873436, 35.918985 ], [ 115.882675, 35.879718 ], [ 115.859886, 35.857894 ], [ 115.81677, 35.844312 ], [ 115.773654, 35.854014 ], [ 115.73485, 35.833154 ], [ 115.696046, 35.788989 ], [ 115.693582, 35.754028 ], [ 115.622749, 35.739457 ], [ 115.52851, 35.733628 ], [ 115.48601, 35.710306 ], [ 115.383148, 35.568772 ], [ 115.34496, 35.55368 ], [ 115.356047, 35.490359 ], [ 115.307388, 35.480126 ], [ 115.237171, 35.423087 ], [ 115.172497, 35.426501 ], [ 115.126302, 35.41821 ], [ 115.117679, 35.400163 ], [ 115.091809, 35.416259 ], [ 115.073947, 35.374304 ], [ 115.04315, 35.376744 ], [ 114.957534, 35.261014 ], [ 114.929201, 35.244886 ], [ 114.932281, 35.198441 ], [ 114.861448, 35.182301 ], [ 114.841738, 35.15099 ], [ 114.883006, 35.098615 ], [ 114.835578, 35.076578 ], [ 114.818948, 35.051596 ], [ 114.852209, 35.041797 ], [ 114.824492, 35.012393 ], [ 114.880542, 35.00357 ], [ 114.923658, 34.968757 ], [ 114.950759, 34.989843 ], [ 115.008041, 34.988372 ], [ 115.028983, 34.9717 ], [ 115.075179, 35.000628 ], [ 115.12815, 35.00455 ], [ 115.157099, 34.957968 ], [ 115.219309, 34.96042 ], [ 115.205142, 34.914303 ], [ 115.251953, 34.906451 ], [ 115.239019, 34.87798 ], [ 115.256265, 34.845079 ], [ 115.317243, 34.859321 ], [ 115.42688, 34.805285 ], [ 115.449054, 34.74433 ], [ 115.433655, 34.725149 ], [ 115.461373, 34.637057 ], [ 115.515575, 34.582383 ], [ 115.553148, 34.568586 ], [ 115.622749, 34.574499 ], [ 115.685575, 34.556265 ], [ 115.697278, 34.594207 ], [ 115.787821, 34.580905 ], [ 115.827241, 34.558236 ], [ 115.838328, 34.5676 ], [ 115.984305, 34.589281 ], [ 115.991081, 34.615389 ], [ 116.037276, 34.593222 ], [ 116.101334, 34.60603 ], [ 116.134594, 34.559715 ], [ 116.156768, 34.5538 ], [ 116.196804, 34.575977 ], [ 116.191261, 34.535561 ], [ 116.204196, 34.508442 ], [ 116.178326, 34.496112 ], [ 116.162312, 34.459605 ], [ 116.178942, 34.430487 ], [ 116.215898, 34.403333 ], [ 116.213435, 34.382098 ], [ 116.255934, 34.376665 ], [ 116.301514, 34.342082 ], [ 116.363724, 34.316877 ], [ 116.372347, 34.26595 ], [ 116.409303, 34.273863 ], [ 116.409303, 34.273863 ], [ 116.456731, 34.268917 ], [ 116.516477, 34.296114 ], [ 116.562056, 34.285731 ], [ 116.582382, 34.266444 ], [ 116.545426, 34.241711 ], [ 116.542962, 34.203608 ], [ 116.565752, 34.16945 ], [ 116.536187, 34.151127 ], [ 116.52818, 34.122892 ], [ 116.576223, 34.068873 ], [ 116.576223, 34.068873 ], [ 116.599629, 34.014324 ], [ 116.599629, 34.014324 ], [ 116.641512, 33.978103 ], [ 116.64336, 33.896675 ], [ 116.631042, 33.887733 ], [ 116.566984, 33.9081 ], [ 116.558361, 33.881274 ], [ 116.486296, 33.869846 ], [ 116.437637, 33.846489 ], [ 116.437021, 33.801246 ], [ 116.408071, 33.805721 ], [ 116.393905, 33.782843 ], [ 116.316912, 33.771402 ], [ 116.263326, 33.730101 ], [ 116.2005, 33.72612 ], [ 116.155536, 33.709693 ], [ 116.132747, 33.751501 ], [ 116.100102, 33.782843 ], [ 116.074232, 33.781351 ], [ 116.055754, 33.804727 ], [ 116.05945, 33.860902 ], [ 115.982457, 33.917039 ], [ 116.00032, 33.965199 ], [ 115.95782, 34.007875 ], [ 115.904233, 34.009859 ], [ 115.876516, 34.028708 ], [ 115.877132, 34.002913 ], [ 115.852494, 34.003906 ], [ 115.846335, 34.028708 ], [ 115.809378, 34.062428 ], [ 115.736082, 34.076805 ], [ 115.705901, 34.059949 ], [ 115.658473, 34.061437 ], [ 115.642459, 34.03218 ], [ 115.60735, 34.030196 ], [ 115.579017, 33.974133 ], [ 115.577785, 33.950307 ], [ 115.547604, 33.874815 ], [ 115.631988, 33.869846 ], [ 115.614126, 33.775879 ], [ 115.576553, 33.787817 ], [ 115.563003, 33.772895 ], [ 115.601807, 33.718653 ], [ 115.601191, 33.658898 ], [ 115.639995, 33.585143 ], [ 115.564851, 33.576169 ], [ 115.561771, 33.563703 ], [ 115.463837, 33.567193 ], [ 115.422569, 33.557219 ], [ 115.394851, 33.506335 ], [ 115.366518, 33.5233 ], [ 115.345576, 33.502842 ], [ 115.345576, 33.449928 ], [ 115.316627, 33.44893 ], [ 115.328946, 33.403477 ], [ 115.313547, 33.376994 ], [ 115.341881, 33.370997 ], [ 115.365286, 33.336005 ], [ 115.361591, 33.298497 ], [ 115.335105, 33.297997 ], [ 115.340033, 33.260973 ], [ 115.300613, 33.204407 ], [ 115.303692, 33.149809 ], [ 115.289526, 33.131769 ], [ 115.245178, 33.135778 ], [ 115.194671, 33.120743 ], [ 115.168186, 33.088658 ], [ 115.041302, 33.086653 ], [ 114.990795, 33.102195 ], [ 114.966158, 33.147304 ], [ 114.932897, 33.153817 ], [ 114.902716, 33.129764 ], [ 114.897172, 33.086653 ], [ 114.913187, 33.083143 ], [ 114.925506, 33.016928 ], [ 114.891629, 33.020441 ], [ 114.883006, 32.990328 ], [ 114.916266, 32.971251 ], [ 114.943368, 32.935094 ], [ 115.009273, 32.940117 ], [ 115.035143, 32.932582 ], [ 115.029599, 32.906962 ], [ 115.139237, 32.897917 ], [ 115.155867, 32.864747 ], [ 115.197135, 32.856201 ], [ 115.189744, 32.812452 ], [ 115.211301, 32.785791 ], [ 115.189744, 32.770695 ], [ 115.179273, 32.726402 ], [ 115.182968, 32.666973 ], [ 115.20083, 32.591876 ], [ 115.24333, 32.593388 ], [ 115.267352, 32.578261 ], [ 115.30554, 32.583303 ], [ 115.304924, 32.553042 ], [ 115.411482, 32.575235 ], [ 115.409018, 32.549007 ], [ 115.497713, 32.492489 ], [ 115.5088, 32.468761 ] ] ], [ [ [ 113.768156, 32.284279 ], [ 113.758301, 32.27669 ], [ 113.749061, 32.272642 ], [ 113.768772, 32.30148 ], [ 113.768156, 32.284279 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"420000\", \"name\": \"湖北省\", \"center\": [ 114.298572, 30.584355 ], \"centroid\": [ 112.271286, 30.987521 ], \"childrenNum\": 17, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 16, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 111.045704, 33.169849 ], [ 111.08882, 33.181871 ], [ 111.12824, 33.15532 ], [ 111.146102, 33.12375 ], [ 111.179363, 33.115229 ], [ 111.192913, 33.071609 ], [ 111.152877, 33.039507 ], [ 111.221862, 33.042517 ], [ 111.258819, 33.006389 ], [ 111.273601, 32.971753 ], [ 111.242804, 32.930573 ], [ 111.255123, 32.883846 ], [ 111.276065, 32.903445 ], [ 111.293311, 32.859217 ], [ 111.380159, 32.829049 ], [ 111.41342, 32.757108 ], [ 111.475629, 32.760127 ], [ 111.458383, 32.726402 ], [ 111.513202, 32.674026 ], [ 111.530448, 32.628172 ], [ 111.577875, 32.593388 ], [ 111.640701, 32.634724 ], [ 111.646245, 32.605993 ], [ 111.713382, 32.606497 ], [ 111.808853, 32.536899 ], [ 111.858128, 32.528826 ], [ 111.890157, 32.503089 ], [ 111.948671, 32.51722 ], [ 111.975772, 32.471791 ], [ 112.014576, 32.450077 ], [ 112.063851, 32.474315 ], [ 112.081098, 32.425833 ], [ 112.155626, 32.377326 ], [ 112.150083, 32.411688 ], [ 112.172873, 32.385412 ], [ 112.206133, 32.392992 ], [ 112.328089, 32.321712 ], [ 112.360118, 32.3657 ], [ 112.390915, 32.37126 ], [ 112.448814, 32.34295 ], [ 112.477147, 32.380863 ], [ 112.530733, 32.37682 ], [ 112.545516, 32.404109 ], [ 112.589248, 32.381369 ], [ 112.612037, 32.386928 ], [ 112.645298, 32.368227 ], [ 112.716747, 32.357612 ], [ 112.724138, 32.358623 ], [ 112.733993, 32.356601 ], [ 112.735841, 32.356095 ], [ 112.776493, 32.358623 ], [ 112.860877, 32.396024 ], [ 112.888594, 32.37682 ], [ 112.912, 32.390971 ], [ 112.992072, 32.378336 ], [ 113.000695, 32.41674 ], [ 113.025949, 32.425328 ], [ 113.078919, 32.394508 ], [ 113.107869, 32.398551 ], [ 113.118956, 32.375809 ], [ 113.155912, 32.380863 ], [ 113.158992, 32.410677 ], [ 113.211962, 32.431895 ], [ 113.2366, 32.407141 ], [ 113.333918, 32.336377 ], [ 113.317904, 32.327275 ], [ 113.353628, 32.294904 ], [ 113.376418, 32.298445 ], [ 113.428773, 32.270618 ], [ 113.511925, 32.316654 ], [ 113.624642, 32.36115 ], [ 113.650511, 32.412698 ], [ 113.700402, 32.420782 ], [ 113.735511, 32.410677 ], [ 113.76754, 32.370249 ], [ 113.753989, 32.328286 ], [ 113.768772, 32.30148 ], [ 113.749061, 32.272642 ], [ 113.73859, 32.255942 ], [ 113.752757, 32.215951 ], [ 113.782322, 32.184553 ], [ 113.750293, 32.11615 ], [ 113.722576, 32.12426 ], [ 113.728735, 32.083197 ], [ 113.791561, 32.036028 ], [ 113.757685, 31.98985 ], [ 113.817431, 31.964467 ], [ 113.805728, 31.929428 ], [ 113.832213, 31.918761 ], [ 113.830981, 31.87913 ], [ 113.854387, 31.843042 ], [ 113.893807, 31.847109 ], [ 113.914749, 31.877098 ], [ 113.957865, 31.852701 ], [ 113.952321, 31.793714 ], [ 113.988662, 31.749959 ], [ 114.017611, 31.770822 ], [ 114.089676, 31.781506 ], [ 114.119241, 31.805922 ], [ 114.134024, 31.843042 ], [ 114.191922, 31.852192 ], [ 114.235654, 31.833382 ], [ 114.292936, 31.752503 ], [ 114.350218, 31.755557 ], [ 114.403189, 31.746906 ], [ 114.443841, 31.728074 ], [ 114.530688, 31.742834 ], [ 114.549783, 31.766751 ], [ 114.586123, 31.762172 ], [ 114.57134, 31.660858 ], [ 114.547935, 31.623665 ], [ 114.560869, 31.560963 ], [ 114.572572, 31.553824 ], [ 114.61692, 31.585437 ], [ 114.641558, 31.582378 ], [ 114.696376, 31.525771 ], [ 114.778912, 31.520669 ], [ 114.789383, 31.480358 ], [ 114.830035, 31.45892 ], [ 114.870071, 31.479337 ], [ 114.884238, 31.469129 ], [ 114.962462, 31.494648 ], [ 114.995107, 31.471171 ], [ 115.022824, 31.527811 ], [ 115.096121, 31.508425 ], [ 115.114599, 31.530362 ], [ 115.106592, 31.567592 ], [ 115.12507, 31.599201 ], [ 115.16449, 31.604808 ], [ 115.212533, 31.555354 ], [ 115.235939, 31.555354 ], [ 115.218077, 31.515057 ], [ 115.211301, 31.442072 ], [ 115.252569, 31.421646 ], [ 115.250722, 31.392021 ], [ 115.301229, 31.383846 ], [ 115.338801, 31.40428 ], [ 115.373909, 31.405813 ], [ 115.393004, 31.389977 ], [ 115.372062, 31.349098 ], [ 115.40717, 31.337854 ], [ 115.443511, 31.344498 ], [ 115.473076, 31.265242 ], [ 115.507568, 31.267799 ], [ 115.539597, 31.231985 ], [ 115.540213, 31.194621 ], [ 115.585793, 31.143926 ], [ 115.603655, 31.17363 ], [ 115.655394, 31.211002 ], [ 115.700973, 31.201276 ], [ 115.778582, 31.112164 ], [ 115.797676, 31.128047 ], [ 115.837712, 31.127022 ], [ 115.867277, 31.147512 ], [ 115.887603, 31.10909 ], [ 115.939958, 31.071678 ], [ 115.938726, 31.04707 ], [ 116.006479, 31.034764 ], [ 116.015102, 31.011685 ], [ 116.058834, 31.012711 ], [ 116.071769, 30.956787 ], [ 116.03974, 30.957813 ], [ 115.976298, 30.931636 ], [ 115.932566, 30.889532 ], [ 115.865429, 30.864364 ], [ 115.848799, 30.828397 ], [ 115.863581, 30.815549 ], [ 115.851262, 30.756938 ], [ 115.782893, 30.751795 ], [ 115.762567, 30.685426 ], [ 115.81369, 30.637035 ], [ 115.819234, 30.597893 ], [ 115.848799, 30.602014 ], [ 115.876516, 30.582438 ], [ 115.887603, 30.542758 ], [ 115.910393, 30.519046 ], [ 115.894994, 30.452517 ], [ 115.921479, 30.416397 ], [ 115.885139, 30.379747 ], [ 115.91532, 30.337919 ], [ 115.903001, 30.31364 ], [ 115.985537, 30.290905 ], [ 115.997856, 30.252657 ], [ 116.065609, 30.204569 ], [ 116.055754, 30.180774 ], [ 116.088399, 30.110391 ], [ 116.078544, 30.062233 ], [ 116.091479, 30.036331 ], [ 116.073616, 29.969993 ], [ 116.128435, 29.897904 ], [ 116.13521, 29.819532 ], [ 116.087167, 29.795125 ], [ 116.049595, 29.761881 ], [ 115.965827, 29.724469 ], [ 115.909777, 29.723949 ], [ 115.837096, 29.748373 ], [ 115.762567, 29.793048 ], [ 115.706517, 29.837703 ], [ 115.667712, 29.850161 ], [ 115.611662, 29.841337 ], [ 115.51188, 29.840299 ], [ 115.479235, 29.811224 ], [ 115.470612, 29.739539 ], [ 115.412714, 29.688602 ], [ 115.355431, 29.649602 ], [ 115.304924, 29.637118 ], [ 115.28583, 29.618391 ], [ 115.250722, 29.660003 ], [ 115.176809, 29.654803 ], [ 115.113367, 29.684963 ], [ 115.117679, 29.655843 ], [ 115.143548, 29.645961 ], [ 115.120142, 29.597578 ], [ 115.157099, 29.584568 ], [ 115.154019, 29.510117 ], [ 115.086266, 29.525741 ], [ 115.087498, 29.560104 ], [ 115.033295, 29.546568 ], [ 115.00065, 29.572076 ], [ 114.947679, 29.542924 ], [ 114.966773, 29.522096 ], [ 114.940288, 29.493971 ], [ 114.900868, 29.505951 ], [ 114.860216, 29.476258 ], [ 114.888549, 29.436134 ], [ 114.918114, 29.454374 ], [ 114.90518, 29.473132 ], [ 114.935977, 29.486678 ], [ 114.947063, 29.465317 ], [ 114.931049, 29.422581 ], [ 114.895325, 29.397557 ], [ 114.866375, 29.404335 ], [ 114.812173, 29.383478 ], [ 114.784455, 29.386086 ], [ 114.759818, 29.363139 ], [ 114.740724, 29.386607 ], [ 114.67297, 29.395993 ], [ 114.621847, 29.379828 ], [ 114.589819, 29.352707 ], [ 114.519602, 29.325578 ], [ 114.466015, 29.324013 ], [ 114.440145, 29.341752 ], [ 114.376088, 29.322969 ], [ 114.341595, 29.327665 ], [ 114.307102, 29.365225 ], [ 114.259059, 29.343839 ], [ 114.252284, 29.23475 ], [ 114.169748, 29.216993 ], [ 114.063191, 29.204978 ], [ 114.034857, 29.152204 ], [ 113.98743, 29.126068 ], [ 113.952321, 29.092604 ], [ 113.94185, 29.047097 ], [ 113.898119, 29.029307 ], [ 113.876561, 29.038202 ], [ 113.882104, 29.065407 ], [ 113.852539, 29.058606 ], [ 113.816199, 29.105154 ], [ 113.775547, 29.095219 ], [ 113.749677, 29.060699 ], [ 113.722576, 29.104631 ], [ 113.696091, 29.077437 ], [ 113.690547, 29.114566 ], [ 113.66283, 29.16945 ], [ 113.691779, 29.19662 ], [ 113.693011, 29.226394 ], [ 113.651743, 29.225872 ], [ 113.609859, 29.25146 ], [ 113.632033, 29.316186 ], [ 113.660982, 29.333405 ], [ 113.674533, 29.388172 ], [ 113.731199, 29.393907 ], [ 113.755221, 29.446557 ], [ 113.677613, 29.513763 ], [ 113.630801, 29.523137 ], [ 113.710257, 29.555419 ], [ 113.73859, 29.579363 ], [ 113.704098, 29.634518 ], [ 113.680692, 29.64336 ], [ 113.663446, 29.684443 ], [ 113.606164, 29.666764 ], [ 113.547033, 29.675603 ], [ 113.540258, 29.699519 ], [ 113.558736, 29.727067 ], [ 113.550729, 29.768115 ], [ 113.575367, 29.809147 ], [ 113.571671, 29.849123 ], [ 113.37765, 29.703158 ], [ 113.277252, 29.594976 ], [ 113.222433, 29.543965 ], [ 113.181781, 29.485636 ], [ 113.145441, 29.449163 ], [ 113.099861, 29.459585 ], [ 113.078304, 29.438218 ], [ 113.057362, 29.522616 ], [ 113.034572, 29.523658 ], [ 112.950188, 29.473132 ], [ 112.912, 29.606944 ], [ 112.915696, 29.620992 ], [ 113.005007, 29.693801 ], [ 113.025949, 29.772791 ], [ 112.974826, 29.732784 ], [ 112.944645, 29.682883 ], [ 112.926782, 29.692241 ], [ 112.923703, 29.766557 ], [ 112.929246, 29.77383 ], [ 112.902145, 29.79149 ], [ 112.894138, 29.783699 ], [ 112.861493, 29.78318 ], [ 112.79374, 29.735902 ], [ 112.788812, 29.681323 ], [ 112.733378, 29.645441 ], [ 112.714283, 29.648561 ], [ 112.693957, 29.601741 ], [ 112.650842, 29.592374 ], [ 112.640371, 29.607985 ], [ 112.572001, 29.624113 ], [ 112.54182, 29.60122 ], [ 112.499321, 29.629316 ], [ 112.439574, 29.633997 ], [ 112.424792, 29.598619 ], [ 112.368741, 29.541362 ], [ 112.333017, 29.545007 ], [ 112.291133, 29.517409 ], [ 112.281278, 29.536676 ], [ 112.303452, 29.585609 ], [ 112.233851, 29.61631 ], [ 112.244322, 29.659483 ], [ 112.202438, 29.633997 ], [ 112.178416, 29.656883 ], [ 112.111279, 29.659483 ], [ 112.089721, 29.685482 ], [ 112.065699, 29.681323 ], [ 112.07617, 29.743696 ], [ 112.008417, 29.778505 ], [ 111.95483, 29.796683 ], [ 111.965917, 29.832512 ], [ 111.925881, 29.836665 ], [ 111.899396, 29.855871 ], [ 111.899396, 29.855871 ], [ 111.861207, 29.856909 ], [ 111.8107, 29.901017 ], [ 111.75773, 29.92021 ], [ 111.723853, 29.909317 ], [ 111.723853, 29.909317 ], [ 111.705375, 29.890121 ], [ 111.669034, 29.888565 ], [ 111.669034, 29.888565 ], [ 111.553854, 29.894272 ], [ 111.527368, 29.925916 ], [ 111.475629, 29.918654 ], [ 111.436825, 29.930065 ], [ 111.394325, 29.912948 ], [ 111.382623, 29.95029 ], [ 111.342587, 29.944586 ], [ 111.3315, 29.970512 ], [ 111.266826, 30.01146 ], [ 111.242188, 30.040476 ], [ 111.031537, 30.048765 ], [ 110.929907, 30.063268 ], [ 110.924364, 30.111426 ], [ 110.851067, 30.126439 ], [ 110.746973, 30.112979 ], [ 110.756212, 30.054463 ], [ 110.712481, 30.033223 ], [ 110.650887, 30.07777 ], [ 110.600996, 30.054463 ], [ 110.531394, 30.061197 ], [ 110.497518, 30.055499 ], [ 110.491358, 30.019751 ], [ 110.557264, 29.988137 ], [ 110.517228, 29.961179 ], [ 110.49875, 29.91243 ], [ 110.538786, 29.895828 ], [ 110.549873, 29.848085 ], [ 110.60038, 29.839779 ], [ 110.642879, 29.775907 ], [ 110.562807, 29.712515 ], [ 110.507373, 29.692241 ], [ 110.467337, 29.713034 ], [ 110.447011, 29.664684 ], [ 110.372482, 29.633477 ], [ 110.339221, 29.668324 ], [ 110.302265, 29.661563 ], [ 110.289946, 29.6964 ], [ 110.219729, 29.746814 ], [ 110.160599, 29.753569 ], [ 110.113788, 29.789932 ], [ 110.02386, 29.769674 ], [ 109.941325, 29.774349 ], [ 109.908064, 29.763959 ], [ 109.869876, 29.774869 ], [ 109.779333, 29.757725 ], [ 109.755311, 29.733304 ], [ 109.760238, 29.689122 ], [ 109.714659, 29.673524 ], [ 109.701108, 29.636078 ], [ 109.717739, 29.615269 ], [ 109.664768, 29.599659 ], [ 109.651833, 29.625674 ], [ 109.578536, 29.629836 ], [ 109.558826, 29.606944 ], [ 109.516326, 29.626194 ], [ 109.488609, 29.553336 ], [ 109.467051, 29.560104 ], [ 109.458428, 29.513242 ], [ 109.433791, 29.530948 ], [ 109.436254, 29.488761 ], [ 109.415928, 29.497617 ], [ 109.418392, 29.453332 ], [ 109.368501, 29.413719 ], [ 109.391291, 29.372005 ], [ 109.343863, 29.369398 ], [ 109.352487, 29.284872 ], [ 109.312451, 29.25146 ], [ 109.257632, 29.222738 ], [ 109.275494, 29.202366 ], [ 109.261328, 29.161089 ], [ 109.274262, 29.121885 ], [ 109.232378, 29.119271 ], [ 109.215748, 29.145409 ], [ 109.162777, 29.180946 ], [ 109.139372, 29.168927 ], [ 109.110422, 29.21647 ], [ 109.141835, 29.270256 ], [ 109.106727, 29.288526 ], [ 109.11227, 29.361053 ], [ 109.060531, 29.403292 ], [ 109.034662, 29.360531 ], [ 108.999553, 29.36366 ], [ 108.983539, 29.332883 ], [ 108.919481, 29.3261 ], [ 108.934264, 29.399643 ], [ 108.927488, 29.435612 ], [ 108.884373, 29.440824 ], [ 108.866511, 29.470527 ], [ 108.888684, 29.502305 ], [ 108.878213, 29.539279 ], [ 108.913322, 29.574679 ], [ 108.901003, 29.604863 ], [ 108.870206, 29.596537 ], [ 108.888068, 29.628795 ], [ 108.844337, 29.658443 ], [ 108.781511, 29.635558 ], [ 108.797525, 29.660003 ], [ 108.786438, 29.691721 ], [ 108.752562, 29.649082 ], [ 108.690968, 29.689642 ], [ 108.676801, 29.749412 ], [ 108.680497, 29.800319 ], [ 108.658939, 29.854833 ], [ 108.601041, 29.863656 ], [ 108.556077, 29.818493 ], [ 108.52528, 29.770713 ], [ 108.548686, 29.749412 ], [ 108.504954, 29.728626 ], [ 108.504338, 29.707836 ], [ 108.460606, 29.741098 ], [ 108.437201, 29.741098 ], [ 108.442744, 29.778505 ], [ 108.422418, 29.772791 ], [ 108.424266, 29.815897 ], [ 108.371295, 29.841337 ], [ 108.433505, 29.880262 ], [ 108.467998, 29.864175 ], [ 108.516041, 29.885451 ], [ 108.517889, 29.9394 ], [ 108.536367, 29.983472 ], [ 108.532055, 30.051873 ], [ 108.513577, 30.057571 ], [ 108.546222, 30.104178 ], [ 108.56778, 30.157491 ], [ 108.551766, 30.1637 ], [ 108.581947, 30.255759 ], [ 108.54499, 30.269716 ], [ 108.524048, 30.309506 ], [ 108.501258, 30.314673 ], [ 108.460606, 30.35961 ], [ 108.431041, 30.354446 ], [ 108.402092, 30.376649 ], [ 108.430425, 30.416397 ], [ 108.411331, 30.438586 ], [ 108.42673, 30.492233 ], [ 108.472925, 30.487076 ], [ 108.512961, 30.501515 ], [ 108.556077, 30.487592 ], [ 108.56778, 30.468508 ], [ 108.6497, 30.53915 ], [ 108.642925, 30.578831 ], [ 108.688504, 30.58759 ], [ 108.698975, 30.54482 ], [ 108.743939, 30.494812 ], [ 108.789518, 30.513374 ], [ 108.808612, 30.491202 ], [ 108.838793, 30.503062 ], [ 108.893612, 30.565434 ], [ 108.971836, 30.627766 ], [ 109.006329, 30.626736 ], [ 109.042669, 30.655571 ], [ 109.071002, 30.640125 ], [ 109.111654, 30.646303 ], [ 109.106111, 30.61077 ], [ 109.09256, 30.578831 ], [ 109.103647, 30.565949 ], [ 109.143683, 30.521108 ], [ 109.191726, 30.545851 ], [ 109.191726, 30.545851 ], [ 109.245313, 30.580892 ], [ 109.299516, 30.630341 ], [ 109.314298, 30.599953 ], [ 109.36111, 30.551004 ], [ 109.337088, 30.521623 ], [ 109.35495, 30.487076 ], [ 109.418392, 30.559766 ], [ 109.435638, 30.595832 ], [ 109.535421, 30.664837 ], [ 109.543428, 30.63961 ], [ 109.574225, 30.646818 ], [ 109.590855, 30.69366 ], [ 109.625348, 30.702923 ], [ 109.661072, 30.738936 ], [ 109.656761, 30.760538 ], [ 109.701724, 30.783677 ], [ 109.780564, 30.848437 ], [ 109.828608, 30.864364 ], [ 109.894513, 30.899803 ], [ 109.943788, 30.878746 ], [ 110.008462, 30.883369 ], [ 110.019549, 30.829425 ], [ 110.048498, 30.800642 ], [ 110.082375, 30.799614 ], [ 110.151976, 30.911613 ], [ 110.153824, 30.953708 ], [ 110.172918, 30.978853 ], [ 110.140889, 30.987062 ], [ 110.140273, 31.030661 ], [ 110.120563, 31.0322 ], [ 110.119947, 31.088592 ], [ 110.147048, 31.116776 ], [ 110.180309, 31.121899 ], [ 110.200019, 31.158779 ], [ 110.180309, 31.179774 ], [ 110.155671, 31.279564 ], [ 110.161831, 31.314338 ], [ 110.118715, 31.409899 ], [ 110.054042, 31.410921 ], [ 110.036795, 31.436966 ], [ 109.98752, 31.474744 ], [ 109.94502, 31.47066 ], [ 109.969658, 31.508935 ], [ 109.894513, 31.519139 ], [ 109.837847, 31.555354 ], [ 109.727594, 31.548214 ], [ 109.745456, 31.598182 ], [ 109.76455, 31.602769 ], [ 109.737449, 31.628761 ], [ 109.731289, 31.700582 ], [ 109.683246, 31.719929 ], [ 109.622268, 31.711783 ], [ 109.585928, 31.726546 ], [ 109.592087, 31.789136 ], [ 109.633971, 31.804396 ], [ 109.633971, 31.824738 ], [ 109.60379, 31.885737 ], [ 109.584696, 31.900472 ], [ 109.62042, 31.928412 ], [ 109.631507, 31.962436 ], [ 109.590855, 32.012688 ], [ 109.590855, 32.047696 ], [ 109.621652, 32.106519 ], [ 109.58716, 32.161251 ], [ 109.604406, 32.199241 ], [ 109.592703, 32.219495 ], [ 109.550203, 32.225065 ], [ 109.528645, 32.270112 ], [ 109.495385, 32.300468 ], [ 109.513247, 32.342444 ], [ 109.502776, 32.38895 ], [ 109.529877, 32.405625 ], [ 109.526797, 32.43341 ], [ 109.575457, 32.506622 ], [ 109.637051, 32.540935 ], [ 109.619804, 32.56767 ], [ 109.631507, 32.599943 ], [ 109.726978, 32.608513 ], [ 109.746072, 32.594901 ], [ 109.816905, 32.577252 ], [ 109.910528, 32.592884 ], [ 109.97089, 32.577756 ], [ 110.017701, 32.546989 ], [ 110.084223, 32.580782 ], [ 110.090382, 32.617083 ], [ 110.124259, 32.616579 ], [ 110.153824, 32.593388 ], [ 110.206179, 32.633212 ], [ 110.156903, 32.683093 ], [ 110.159367, 32.767173 ], [ 110.127338, 32.77774 ], [ 110.142121, 32.802895 ], [ 110.105164, 32.832569 ], [ 110.051578, 32.851676 ], [ 109.988752, 32.886359 ], [ 109.927158, 32.887364 ], [ 109.907448, 32.903947 ], [ 109.856941, 32.910479 ], [ 109.847702, 32.893395 ], [ 109.789804, 32.882339 ], [ 109.76455, 32.909474 ], [ 109.785492, 32.987316 ], [ 109.794731, 33.067095 ], [ 109.704188, 33.101694 ], [ 109.688174, 33.116733 ], [ 109.576073, 33.110216 ], [ 109.522486, 33.138785 ], [ 109.468283, 33.140288 ], [ 109.438718, 33.152314 ], [ 109.498464, 33.207412 ], [ 109.514479, 33.237951 ], [ 109.60687, 33.235949 ], [ 109.619804, 33.275484 ], [ 109.649985, 33.251465 ], [ 109.693101, 33.254468 ], [ 109.732521, 33.231443 ], [ 109.813209, 33.236449 ], [ 109.852013, 33.247961 ], [ 109.916687, 33.229942 ], [ 109.973353, 33.203907 ], [ 109.999223, 33.212419 ], [ 110.031252, 33.191888 ], [ 110.164911, 33.209415 ], [ 110.218497, 33.163336 ], [ 110.285635, 33.171352 ], [ 110.33799, 33.160331 ], [ 110.372482, 33.186379 ], [ 110.398352, 33.176862 ], [ 110.398352, 33.176862 ], [ 110.471032, 33.171352 ], [ 110.54125, 33.255469 ], [ 110.57759, 33.250464 ], [ 110.59422, 33.168346 ], [ 110.623785, 33.143796 ], [ 110.650887, 33.157324 ], [ 110.702626, 33.097182 ], [ 110.753133, 33.15031 ], [ 110.824582, 33.158327 ], [ 110.828893, 33.201403 ], [ 110.865234, 33.213921 ], [ 110.9219, 33.203907 ], [ 110.960704, 33.253967 ], [ 110.984726, 33.255469 ], [ 111.046936, 33.202905 ], [ 111.035849, 33.187881 ], [ 111.034001, 33.177864 ], [ 111.045704, 33.169849 ] ] ], [ [ [ 109.106111, 30.570587 ], [ 109.09872, 30.579346 ], [ 109.101183, 30.579346 ], [ 109.106111, 30.570587 ] ] ], [ [ [ 111.046936, 33.202905 ], [ 111.045704, 33.169849 ], [ 111.034001, 33.177864 ], [ 111.035849, 33.187881 ], [ 111.046936, 33.202905 ] ] ], [ [ [ 112.716747, 32.357612 ], [ 112.735841, 32.356095 ], [ 112.733993, 32.356601 ], [ 112.724138, 32.358623 ], [ 112.716747, 32.357612 ] ] ], [ [ [ 112.902145, 29.79149 ], [ 112.929246, 29.77383 ], [ 112.923703, 29.766557 ], [ 112.894138, 29.783699 ], [ 112.902145, 29.79149 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"430000\", \"name\": \"湖南省\", \"center\": [ 112.982279, 28.19409 ], \"centroid\": [ 111.711649, 27.629221 ], \"childrenNum\": 14, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 17, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 109.48245, 26.029788 ], [ 109.452885, 26.055598 ], [ 109.449805, 26.101826 ], [ 109.502776, 26.096451 ], [ 109.513863, 26.128157 ], [ 109.47629, 26.148035 ], [ 109.439334, 26.238789 ], [ 109.467051, 26.313917 ], [ 109.442414, 26.289774 ], [ 109.369733, 26.277432 ], [ 109.351255, 26.264016 ], [ 109.325385, 26.29031 ], [ 109.285965, 26.295676 ], [ 109.271183, 26.327863 ], [ 109.29582, 26.350389 ], [ 109.319842, 26.418477 ], [ 109.38082, 26.454381 ], [ 109.362342, 26.472061 ], [ 109.385747, 26.493487 ], [ 109.381436, 26.518659 ], [ 109.407305, 26.533116 ], [ 109.390675, 26.598955 ], [ 109.35495, 26.658873 ], [ 109.334008, 26.646036 ], [ 109.306291, 26.661012 ], [ 109.283501, 26.698445 ], [ 109.35495, 26.693098 ], [ 109.407305, 26.719829 ], [ 109.447957, 26.759913 ], [ 109.486761, 26.759913 ], [ 109.52187, 26.749226 ], [ 109.528645, 26.743881 ], [ 109.568065, 26.726243 ], [ 109.597015, 26.756173 ], [ 109.554515, 26.73533 ], [ 109.528645, 26.743881 ], [ 109.522486, 26.749226 ], [ 109.497232, 26.815474 ], [ 109.513247, 26.84004 ], [ 109.509551, 26.877947 ], [ 109.486761, 26.895562 ], [ 109.452885, 26.861932 ], [ 109.436254, 26.892359 ], [ 109.555131, 26.946788 ], [ 109.520022, 27.058764 ], [ 109.497848, 27.079548 ], [ 109.486761, 27.053968 ], [ 109.454733, 27.069423 ], [ 109.472595, 27.134951 ], [ 109.441182, 27.117907 ], [ 109.415312, 27.154123 ], [ 109.358646, 27.153058 ], [ 109.33524, 27.139212 ], [ 109.264407, 27.131755 ], [ 109.239154, 27.14933 ], [ 109.21698, 27.114711 ], [ 109.165857, 27.066758 ], [ 109.101183, 27.06889 ], [ 109.128901, 27.122701 ], [ 109.032814, 27.104056 ], [ 109.007561, 27.08008 ], [ 108.940423, 27.044907 ], [ 108.942887, 27.017186 ], [ 108.942887, 27.017186 ], [ 108.877597, 27.01612 ], [ 108.79075, 27.084343 ], [ 108.878829, 27.106187 ], [ 108.926873, 27.160512 ], [ 108.907778, 27.204699 ], [ 108.963213, 27.235565 ], [ 108.983539, 27.26802 ], [ 109.053756, 27.293551 ], [ 109.044517, 27.331304 ], [ 109.103647, 27.336621 ], [ 109.142451, 27.418461 ], [ 109.141835, 27.448207 ], [ 109.167089, 27.41793 ], [ 109.202197, 27.450331 ], [ 109.245313, 27.41793 ], [ 109.300132, 27.423774 ], [ 109.303211, 27.47582 ], [ 109.404841, 27.55066 ], [ 109.461508, 27.567637 ], [ 109.451037, 27.586204 ], [ 109.470131, 27.62863 ], [ 109.45658, 27.673689 ], [ 109.470747, 27.680049 ], [ 109.414081, 27.725087 ], [ 109.366653, 27.721909 ], [ 109.37774, 27.736741 ], [ 109.332777, 27.782815 ], [ 109.346943, 27.838396 ], [ 109.32169, 27.868027 ], [ 109.30198, 27.956343 ], [ 109.319842, 27.988585 ], [ 109.362342, 28.007608 ], [ 109.378972, 28.034551 ], [ 109.335856, 28.063073 ], [ 109.298284, 28.036136 ], [ 109.314298, 28.103729 ], [ 109.33832, 28.141731 ], [ 109.340168, 28.19027 ], [ 109.367885, 28.254602 ], [ 109.388211, 28.268307 ], [ 109.33524, 28.293605 ], [ 109.317994, 28.277795 ], [ 109.275494, 28.313101 ], [ 109.268719, 28.33786 ], [ 109.289045, 28.373673 ], [ 109.264407, 28.392628 ], [ 109.260712, 28.46473 ], [ 109.274262, 28.494714 ], [ 109.273646, 28.53836 ], [ 109.319842, 28.579886 ], [ 109.306907, 28.62087 ], [ 109.252089, 28.606685 ], [ 109.235458, 28.61982 ], [ 109.201581, 28.597753 ], [ 109.192958, 28.636104 ], [ 109.271183, 28.671816 ], [ 109.252704, 28.691767 ], [ 109.294588, 28.722211 ], [ 109.2989, 28.7474 ], [ 109.241002, 28.776779 ], [ 109.246545, 28.80143 ], [ 109.235458, 28.882161 ], [ 109.261328, 28.952356 ], [ 109.292741, 28.987436 ], [ 109.294588, 29.015177 ], [ 109.319842, 29.042388 ], [ 109.312451, 29.066453 ], [ 109.240386, 29.086328 ], [ 109.232378, 29.119271 ], [ 109.274262, 29.121885 ], [ 109.261328, 29.161089 ], [ 109.275494, 29.202366 ], [ 109.257632, 29.222738 ], [ 109.312451, 29.25146 ], [ 109.352487, 29.284872 ], [ 109.343863, 29.369398 ], [ 109.391291, 29.372005 ], [ 109.368501, 29.413719 ], [ 109.418392, 29.453332 ], [ 109.415928, 29.497617 ], [ 109.436254, 29.488761 ], [ 109.433791, 29.530948 ], [ 109.458428, 29.513242 ], [ 109.467051, 29.560104 ], [ 109.488609, 29.553336 ], [ 109.516326, 29.626194 ], [ 109.558826, 29.606944 ], [ 109.578536, 29.629836 ], [ 109.651833, 29.625674 ], [ 109.664768, 29.599659 ], [ 109.717739, 29.615269 ], [ 109.701108, 29.636078 ], [ 109.714659, 29.673524 ], [ 109.760238, 29.689122 ], [ 109.755311, 29.733304 ], [ 109.779333, 29.757725 ], [ 109.869876, 29.774869 ], [ 109.908064, 29.763959 ], [ 109.941325, 29.774349 ], [ 110.02386, 29.769674 ], [ 110.113788, 29.789932 ], [ 110.160599, 29.753569 ], [ 110.219729, 29.746814 ], [ 110.289946, 29.6964 ], [ 110.302265, 29.661563 ], [ 110.339221, 29.668324 ], [ 110.372482, 29.633477 ], [ 110.447011, 29.664684 ], [ 110.467337, 29.713034 ], [ 110.507373, 29.692241 ], [ 110.562807, 29.712515 ], [ 110.642879, 29.775907 ], [ 110.60038, 29.839779 ], [ 110.549873, 29.848085 ], [ 110.538786, 29.895828 ], [ 110.49875, 29.91243 ], [ 110.517228, 29.961179 ], [ 110.557264, 29.988137 ], [ 110.491358, 30.019751 ], [ 110.497518, 30.055499 ], [ 110.531394, 30.061197 ], [ 110.600996, 30.054463 ], [ 110.650887, 30.07777 ], [ 110.712481, 30.033223 ], [ 110.756212, 30.054463 ], [ 110.746973, 30.112979 ], [ 110.851067, 30.126439 ], [ 110.924364, 30.111426 ], [ 110.929907, 30.063268 ], [ 111.031537, 30.048765 ], [ 111.242188, 30.040476 ], [ 111.266826, 30.01146 ], [ 111.3315, 29.970512 ], [ 111.342587, 29.944586 ], [ 111.382623, 29.95029 ], [ 111.394325, 29.912948 ], [ 111.436825, 29.930065 ], [ 111.475629, 29.918654 ], [ 111.527368, 29.925916 ], [ 111.553854, 29.894272 ], [ 111.669034, 29.888565 ], [ 111.669034, 29.888565 ], [ 111.705375, 29.890121 ], [ 111.723853, 29.909317 ], [ 111.723853, 29.909317 ], [ 111.75773, 29.92021 ], [ 111.8107, 29.901017 ], [ 111.861207, 29.856909 ], [ 111.899396, 29.855871 ], [ 111.899396, 29.855871 ], [ 111.925881, 29.836665 ], [ 111.965917, 29.832512 ], [ 111.95483, 29.796683 ], [ 112.008417, 29.778505 ], [ 112.07617, 29.743696 ], [ 112.065699, 29.681323 ], [ 112.089721, 29.685482 ], [ 112.111279, 29.659483 ], [ 112.178416, 29.656883 ], [ 112.202438, 29.633997 ], [ 112.244322, 29.659483 ], [ 112.233851, 29.61631 ], [ 112.303452, 29.585609 ], [ 112.281278, 29.536676 ], [ 112.291133, 29.517409 ], [ 112.333017, 29.545007 ], [ 112.368741, 29.541362 ], [ 112.424792, 29.598619 ], [ 112.439574, 29.633997 ], [ 112.499321, 29.629316 ], [ 112.54182, 29.60122 ], [ 112.572001, 29.624113 ], [ 112.640371, 29.607985 ], [ 112.650842, 29.592374 ], [ 112.693957, 29.601741 ], [ 112.714283, 29.648561 ], [ 112.733378, 29.645441 ], [ 112.788812, 29.681323 ], [ 112.79374, 29.735902 ], [ 112.861493, 29.78318 ], [ 112.894138, 29.783699 ], [ 112.923703, 29.766557 ], [ 112.926782, 29.692241 ], [ 112.944645, 29.682883 ], [ 112.974826, 29.732784 ], [ 113.025949, 29.772791 ], [ 113.005007, 29.693801 ], [ 112.915696, 29.620992 ], [ 112.912, 29.606944 ], [ 112.950188, 29.473132 ], [ 113.034572, 29.523658 ], [ 113.057362, 29.522616 ], [ 113.078304, 29.438218 ], [ 113.099861, 29.459585 ], [ 113.145441, 29.449163 ], [ 113.181781, 29.485636 ], [ 113.222433, 29.543965 ], [ 113.277252, 29.594976 ], [ 113.37765, 29.703158 ], [ 113.571671, 29.849123 ], [ 113.575367, 29.809147 ], [ 113.550729, 29.768115 ], [ 113.558736, 29.727067 ], [ 113.540258, 29.699519 ], [ 113.547033, 29.675603 ], [ 113.606164, 29.666764 ], [ 113.663446, 29.684443 ], [ 113.680692, 29.64336 ], [ 113.704098, 29.634518 ], [ 113.73859, 29.579363 ], [ 113.710257, 29.555419 ], [ 113.630801, 29.523137 ], [ 113.677613, 29.513763 ], [ 113.755221, 29.446557 ], [ 113.731199, 29.393907 ], [ 113.674533, 29.388172 ], [ 113.660982, 29.333405 ], [ 113.632033, 29.316186 ], [ 113.609859, 29.25146 ], [ 113.651743, 29.225872 ], [ 113.693011, 29.226394 ], [ 113.691779, 29.19662 ], [ 113.66283, 29.16945 ], [ 113.690547, 29.114566 ], [ 113.696091, 29.077437 ], [ 113.722576, 29.104631 ], [ 113.749677, 29.060699 ], [ 113.775547, 29.095219 ], [ 113.816199, 29.105154 ], [ 113.852539, 29.058606 ], [ 113.882104, 29.065407 ], [ 113.876561, 29.038202 ], [ 113.898119, 29.029307 ], [ 113.94185, 29.047097 ], [ 113.961561, 28.999476 ], [ 113.955401, 28.978536 ], [ 113.973879, 28.937692 ], [ 114.008988, 28.955498 ], [ 114.005292, 28.917788 ], [ 114.028082, 28.891069 ], [ 114.060111, 28.902596 ], [ 114.056415, 28.872204 ], [ 114.076741, 28.834464 ], [ 114.124784, 28.843376 ], [ 114.153734, 28.829221 ], [ 114.137719, 28.779926 ], [ 114.157429, 28.761566 ], [ 114.122321, 28.623497 ], [ 114.132176, 28.607211 ], [ 114.08598, 28.558337 ], [ 114.138335, 28.533629 ], [ 114.15435, 28.507337 ], [ 114.218407, 28.48472 ], [ 114.217175, 28.466308 ], [ 114.172212, 28.432632 ], [ 114.214712, 28.403157 ], [ 114.252284, 28.395787 ], [ 114.2529, 28.319423 ], [ 114.198081, 28.29097 ], [ 114.182067, 28.249858 ], [ 114.143879, 28.246694 ], [ 114.109386, 28.205038 ], [ 114.107538, 28.182885 ], [ 114.068734, 28.171806 ], [ 114.012068, 28.174972 ], [ 113.992357, 28.161255 ], [ 114.025002, 28.080499 ], [ 114.047176, 28.057263 ], [ 114.025618, 28.031382 ], [ 113.970184, 28.041418 ], [ 113.966488, 28.017646 ], [ 113.936307, 28.018703 ], [ 113.914133, 27.991227 ], [ 113.864242, 28.004966 ], [ 113.845148, 27.971672 ], [ 113.822974, 27.982243 ], [ 113.752141, 27.93361 ], [ 113.72812, 27.874904 ], [ 113.756453, 27.860091 ], [ 113.763228, 27.799228 ], [ 113.69917, 27.740979 ], [ 113.696707, 27.71979 ], [ 113.652359, 27.663619 ], [ 113.607395, 27.625449 ], [ 113.608627, 27.585143 ], [ 113.579062, 27.545354 ], [ 113.583374, 27.524657 ], [ 113.627105, 27.49971 ], [ 113.591381, 27.467855 ], [ 113.59754, 27.428554 ], [ 113.632033, 27.40518 ], [ 113.605548, 27.38924 ], [ 113.616635, 27.345658 ], [ 113.657902, 27.347253 ], [ 113.699786, 27.331836 ], [ 113.72812, 27.350442 ], [ 113.872865, 27.384988 ], [ 113.872865, 27.346721 ], [ 113.854387, 27.30525 ], [ 113.872865, 27.289828 ], [ 113.846996, 27.222262 ], [ 113.779242, 27.137081 ], [ 113.771851, 27.096598 ], [ 113.803264, 27.099261 ], [ 113.824206, 27.036378 ], [ 113.86301, 27.018252 ], [ 113.892575, 26.964925 ], [ 113.927068, 26.948922 ], [ 113.890112, 26.895562 ], [ 113.877177, 26.859262 ], [ 113.835909, 26.806394 ], [ 113.853771, 26.769532 ], [ 113.860546, 26.664221 ], [ 113.912901, 26.613938 ], [ 113.996669, 26.615543 ], [ 114.019459, 26.587182 ], [ 114.10877, 26.56952 ], [ 114.07243, 26.480096 ], [ 114.110002, 26.482775 ], [ 114.090292, 26.455988 ], [ 114.085364, 26.406149 ], [ 114.062575, 26.406149 ], [ 114.030546, 26.376664 ], [ 114.047792, 26.337518 ], [ 114.021307, 26.288701 ], [ 114.029314, 26.266163 ], [ 113.978807, 26.237716 ], [ 113.972647, 26.20604 ], [ 113.949242, 26.192616 ], [ 113.962792, 26.150722 ], [ 114.013299, 26.184023 ], [ 114.088444, 26.168448 ], [ 114.102611, 26.187783 ], [ 114.181451, 26.214631 ], [ 114.216559, 26.203355 ], [ 114.237501, 26.152333 ], [ 114.188842, 26.121172 ], [ 114.10569, 26.097526 ], [ 114.121089, 26.085702 ], [ 114.087828, 26.06635 ], [ 114.044096, 26.076564 ], [ 114.008372, 26.015806 ], [ 114.028082, 25.98138 ], [ 114.028082, 25.893119 ], [ 113.971416, 25.836036 ], [ 113.961561, 25.77731 ], [ 113.920293, 25.741197 ], [ 113.913517, 25.701299 ], [ 113.957249, 25.611749 ], [ 113.983118, 25.599336 ], [ 113.986198, 25.529153 ], [ 113.962792, 25.528072 ], [ 113.94493, 25.441635 ], [ 113.887032, 25.436772 ], [ 113.877177, 25.380552 ], [ 113.839605, 25.363248 ], [ 113.814967, 25.328634 ], [ 113.76446, 25.333502 ], [ 113.753373, 25.362707 ], [ 113.686852, 25.351891 ], [ 113.680076, 25.334584 ], [ 113.611707, 25.327552 ], [ 113.584606, 25.306453 ], [ 113.579062, 25.34432 ], [ 113.535946, 25.368656 ], [ 113.479896, 25.375145 ], [ 113.449715, 25.359463 ], [ 113.407215, 25.401637 ], [ 113.373338, 25.402719 ], [ 113.341926, 25.448661 ], [ 113.314208, 25.442716 ], [ 113.311129, 25.490264 ], [ 113.248919, 25.514031 ], [ 113.226129, 25.50971 ], [ 113.176854, 25.471355 ], [ 113.11834, 25.44704 ], [ 113.130658, 25.427043 ], [ 113.096782, 25.412449 ], [ 113.078304, 25.382174 ], [ 113.013014, 25.352432 ], [ 112.969898, 25.350269 ], [ 112.93479, 25.325929 ], [ 112.924319, 25.296714 ], [ 112.891058, 25.339993 ], [ 112.854718, 25.337829 ], [ 112.867036, 25.249632 ], [ 112.897833, 25.238264 ], [ 112.958195, 25.254503 ], [ 112.992688, 25.247467 ], [ 113.034572, 25.198199 ], [ 112.97421, 25.168412 ], [ 112.96805, 25.141869 ], [ 113.018557, 25.083344 ], [ 112.979137, 25.03401 ], [ 113.009934, 24.977604 ], [ 113.011782, 24.946136 ], [ 112.984681, 24.921172 ], [ 112.904609, 24.921715 ], [ 112.873812, 24.896747 ], [ 112.780805, 24.896747 ], [ 112.778341, 24.947764 ], [ 112.743233, 24.959701 ], [ 112.742001, 24.99876 ], [ 112.714899, 25.025876 ], [ 112.712436, 25.083344 ], [ 112.660081, 25.132658 ], [ 112.628052, 25.140785 ], [ 112.562762, 25.124531 ], [ 112.458053, 25.152162 ], [ 112.44327, 25.185744 ], [ 112.414937, 25.14241 ], [ 112.365046, 25.191701 ], [ 112.315771, 25.175453 ], [ 112.302836, 25.157037 ], [ 112.256025, 25.159204 ], [ 112.246785, 25.185202 ], [ 112.19751, 25.187368 ], [ 112.174105, 25.128866 ], [ 112.177184, 25.106649 ], [ 112.151931, 25.055698 ], [ 112.155626, 25.026419 ], [ 112.12175, 24.989538 ], [ 112.119902, 24.963499 ], [ 112.175337, 24.927685 ], [ 112.167329, 24.859828 ], [ 112.149467, 24.837019 ], [ 112.124214, 24.841364 ], [ 112.03367, 24.771286 ], [ 112.024431, 24.740308 ], [ 111.951135, 24.769655 ], [ 111.929577, 24.75607 ], [ 111.875374, 24.756613 ], [ 111.868599, 24.771829 ], [ 111.814396, 24.770199 ], [ 111.783599, 24.785957 ], [ 111.708455, 24.788673 ], [ 111.666571, 24.760961 ], [ 111.637621, 24.715303 ], [ 111.641933, 24.684856 ], [ 111.588962, 24.690837 ], [ 111.570484, 24.64461 ], [ 111.526752, 24.637538 ], [ 111.499035, 24.667997 ], [ 111.451608, 24.665822 ], [ 111.431282, 24.687574 ], [ 111.461463, 24.728894 ], [ 111.479325, 24.797366 ], [ 111.449144, 24.857113 ], [ 111.447296, 24.892947 ], [ 111.470086, 24.92877 ], [ 111.434977, 24.951562 ], [ 111.43313, 24.979774 ], [ 111.460231, 24.992793 ], [ 111.467622, 25.02208 ], [ 111.416499, 25.047566 ], [ 111.435593, 25.093642 ], [ 111.375231, 25.128324 ], [ 111.36784, 25.108817 ], [ 111.321645, 25.105023 ], [ 111.274833, 25.151078 ], [ 111.221862, 25.106649 ], [ 111.200921, 25.074672 ], [ 111.139943, 25.042144 ], [ 111.101754, 25.035095 ], [ 111.100522, 24.945593 ], [ 111.009363, 24.921172 ], [ 110.968711, 24.975434 ], [ 110.951465, 25.04377 ], [ 110.98411, 25.101772 ], [ 110.998892, 25.161371 ], [ 111.112841, 25.21715 ], [ 111.103602, 25.285351 ], [ 111.138711, 25.303748 ], [ 111.184906, 25.367034 ], [ 111.210776, 25.363248 ], [ 111.257587, 25.395691 ], [ 111.26313, 25.42326 ], [ 111.300087, 25.44812 ], [ 111.32842, 25.521592 ], [ 111.324724, 25.564249 ], [ 111.343202, 25.602574 ], [ 111.309942, 25.645203 ], [ 111.30871, 25.720171 ], [ 111.399869, 25.744431 ], [ 111.442369, 25.77192 ], [ 111.43313, 25.84627 ], [ 111.4861, 25.859196 ], [ 111.460231, 25.885042 ], [ 111.383239, 25.881812 ], [ 111.376463, 25.906039 ], [ 111.346282, 25.906577 ], [ 111.297007, 25.874274 ], [ 111.29208, 25.854349 ], [ 111.251428, 25.864581 ], [ 111.230486, 25.916267 ], [ 111.189834, 25.953402 ], [ 111.235413, 26.048071 ], [ 111.267442, 26.058824 ], [ 111.244652, 26.078177 ], [ 111.26621, 26.095914 ], [ 111.258203, 26.151796 ], [ 111.274833, 26.183486 ], [ 111.271754, 26.217316 ], [ 111.293311, 26.222148 ], [ 111.277913, 26.272066 ], [ 111.228022, 26.261333 ], [ 111.204616, 26.276359 ], [ 111.208928, 26.30426 ], [ 111.090667, 26.308016 ], [ 111.008132, 26.336982 ], [ 111.008747, 26.35897 ], [ 110.974255, 26.385778 ], [ 110.94469, 26.373447 ], [ 110.944074, 26.326791 ], [ 110.926212, 26.320354 ], [ 110.939762, 26.286554 ], [ 110.836284, 26.255966 ], [ 110.759292, 26.248451 ], [ 110.73835, 26.271529 ], [ 110.742046, 26.313917 ], [ 110.711249, 26.29192 ], [ 110.673676, 26.317135 ], [ 110.643495, 26.308552 ], [ 110.612083, 26.333764 ], [ 110.584365, 26.296749 ], [ 110.552952, 26.283335 ], [ 110.546793, 26.233421 ], [ 110.495054, 26.166299 ], [ 110.477808, 26.179727 ], [ 110.437772, 26.153945 ], [ 110.373098, 26.088927 ], [ 110.325671, 25.975462 ], [ 110.257301, 25.961473 ], [ 110.24991, 26.010965 ], [ 110.181541, 26.060437 ], [ 110.168606, 26.028713 ], [ 110.100853, 26.020108 ], [ 110.065128, 26.050221 ], [ 110.100853, 26.132455 ], [ 110.099005, 26.168985 ], [ 110.03002, 26.166299 ], [ 109.970274, 26.195301 ], [ 109.904368, 26.135679 ], [ 109.898825, 26.095377 ], [ 109.864332, 26.027637 ], [ 109.814441, 26.041081 ], [ 109.782412, 25.996981 ], [ 109.806434, 25.973848 ], [ 109.826144, 25.911422 ], [ 109.811361, 25.877504 ], [ 109.779333, 25.866196 ], [ 109.768246, 25.890427 ], [ 109.685094, 25.880197 ], [ 109.67955, 25.921649 ], [ 109.693717, 25.959321 ], [ 109.710963, 25.954478 ], [ 109.730057, 25.989988 ], [ 109.649369, 26.016882 ], [ 109.635203, 26.047533 ], [ 109.588391, 26.019571 ], [ 109.560058, 26.021184 ], [ 109.513247, 25.998056 ], [ 109.48245, 26.029788 ] ] ], [ [ [ 109.528645, 26.743881 ], [ 109.52187, 26.749226 ], [ 109.522486, 26.749226 ], [ 109.528645, 26.743881 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"440000\", \"name\": \"广东省\", \"center\": [ 113.280637, 23.125178 ], \"centroid\": [ 113.429915, 23.334652 ], \"childrenNum\": 21, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 18, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 109.785492, 21.45673 ], [ 109.788572, 21.490702 ], [ 109.754695, 21.556396 ], [ 109.742992, 21.616497 ], [ 109.778101, 21.670455 ], [ 109.786108, 21.637638 ], [ 109.839695, 21.636525 ], [ 109.888354, 21.652101 ], [ 109.888354, 21.652101 ], [ 109.916071, 21.668787 ], [ 109.940093, 21.769419 ], [ 109.94502, 21.84443 ], [ 109.999839, 21.881643 ], [ 110.050962, 21.857205 ], [ 110.101469, 21.86998 ], [ 110.12857, 21.902744 ], [ 110.196323, 21.899968 ], [ 110.212338, 21.886085 ], [ 110.212338, 21.886085 ], [ 110.224041, 21.882198 ], [ 110.224041, 21.882198 ], [ 110.283787, 21.892194 ], [ 110.290562, 21.917736 ], [ 110.337374, 21.887751 ], [ 110.391576, 21.89386 ], [ 110.378642, 21.939942 ], [ 110.378642, 21.939942 ], [ 110.374946, 21.967695 ], [ 110.374946, 21.967695 ], [ 110.352772, 21.97602 ], [ 110.359547, 22.015973 ], [ 110.35154, 22.097508 ], [ 110.364475, 22.125785 ], [ 110.326287, 22.152393 ], [ 110.34846, 22.195621 ], [ 110.378026, 22.164587 ], [ 110.414366, 22.208365 ], [ 110.456866, 22.189526 ], [ 110.505525, 22.14297 ], [ 110.55788, 22.196175 ], [ 110.602843, 22.18343 ], [ 110.598532, 22.162924 ], [ 110.629329, 22.149068 ], [ 110.678604, 22.172901 ], [ 110.646575, 22.220554 ], [ 110.687843, 22.249914 ], [ 110.725415, 22.29588 ], [ 110.759292, 22.274837 ], [ 110.787009, 22.28259 ], [ 110.749437, 22.329653 ], [ 110.74143, 22.361757 ], [ 110.711249, 22.369506 ], [ 110.712481, 22.440879 ], [ 110.688459, 22.477935 ], [ 110.74143, 22.464109 ], [ 110.740198, 22.498947 ], [ 110.762988, 22.518298 ], [ 110.749437, 22.556991 ], [ 110.778386, 22.585174 ], [ 110.812263, 22.576333 ], [ 110.897878, 22.591805 ], [ 110.896031, 22.613352 ], [ 110.950233, 22.61059 ], [ 110.958856, 22.636553 ], [ 110.997045, 22.631582 ], [ 111.055559, 22.648705 ], [ 111.089435, 22.695643 ], [ 111.058023, 22.729871 ], [ 111.118385, 22.744773 ], [ 111.185522, 22.735942 ], [ 111.218167, 22.748085 ], [ 111.358601, 22.889301 ], [ 111.374615, 22.938361 ], [ 111.362913, 22.967568 ], [ 111.403565, 22.99126 ], [ 111.389398, 23.005583 ], [ 111.433746, 23.036428 ], [ 111.43313, 23.073322 ], [ 111.402333, 23.066165 ], [ 111.377695, 23.082132 ], [ 111.365992, 23.14488 ], [ 111.38447, 23.16744 ], [ 111.388782, 23.210349 ], [ 111.36476, 23.240047 ], [ 111.353058, 23.284582 ], [ 111.376463, 23.30437 ], [ 111.363528, 23.340641 ], [ 111.389398, 23.375804 ], [ 111.383239, 23.399423 ], [ 111.399869, 23.469159 ], [ 111.428818, 23.466414 ], [ 111.479941, 23.532822 ], [ 111.487332, 23.626615 ], [ 111.555702, 23.64087 ], [ 111.615448, 23.639225 ], [ 111.614832, 23.65896 ], [ 111.666571, 23.718696 ], [ 111.621607, 23.725819 ], [ 111.627766, 23.78881 ], [ 111.654868, 23.833159 ], [ 111.683201, 23.822758 ], [ 111.683201, 23.822758 ], [ 111.722621, 23.823305 ], [ 111.8107, 23.80688 ], [ 111.824867, 23.832612 ], [ 111.812548, 23.887343 ], [ 111.845809, 23.904305 ], [ 111.854432, 23.947521 ], [ 111.911714, 23.943693 ], [ 111.940664, 23.987989 ], [ 111.92157, 24.012045 ], [ 111.878454, 24.109862 ], [ 111.886461, 24.163929 ], [ 111.871062, 24.176487 ], [ 111.877222, 24.227252 ], [ 111.912946, 24.221795 ], [ 111.958526, 24.263813 ], [ 111.986243, 24.25672 ], [ 111.990555, 24.279634 ], [ 112.026279, 24.294908 ], [ 112.05954, 24.339628 ], [ 112.057692, 24.387057 ], [ 112.025047, 24.438828 ], [ 111.985011, 24.467701 ], [ 112.009649, 24.503103 ], [ 112.007185, 24.534684 ], [ 111.972077, 24.578775 ], [ 111.936968, 24.595645 ], [ 111.927729, 24.629378 ], [ 111.953598, 24.64733 ], [ 111.939432, 24.686487 ], [ 111.961606, 24.721283 ], [ 112.024431, 24.740308 ], [ 112.03367, 24.771286 ], [ 112.124214, 24.841364 ], [ 112.149467, 24.837019 ], [ 112.167329, 24.859828 ], [ 112.175337, 24.927685 ], [ 112.119902, 24.963499 ], [ 112.12175, 24.989538 ], [ 112.155626, 25.026419 ], [ 112.151931, 25.055698 ], [ 112.177184, 25.106649 ], [ 112.174105, 25.128866 ], [ 112.19751, 25.187368 ], [ 112.246785, 25.185202 ], [ 112.256025, 25.159204 ], [ 112.302836, 25.157037 ], [ 112.315771, 25.175453 ], [ 112.365046, 25.191701 ], [ 112.414937, 25.14241 ], [ 112.44327, 25.185744 ], [ 112.458053, 25.152162 ], [ 112.562762, 25.124531 ], [ 112.628052, 25.140785 ], [ 112.660081, 25.132658 ], [ 112.712436, 25.083344 ], [ 112.714899, 25.025876 ], [ 112.742001, 24.99876 ], [ 112.743233, 24.959701 ], [ 112.778341, 24.947764 ], [ 112.780805, 24.896747 ], [ 112.873812, 24.896747 ], [ 112.904609, 24.921715 ], [ 112.984681, 24.921172 ], [ 113.011782, 24.946136 ], [ 113.009934, 24.977604 ], [ 112.979137, 25.03401 ], [ 113.018557, 25.083344 ], [ 112.96805, 25.141869 ], [ 112.97421, 25.168412 ], [ 113.034572, 25.198199 ], [ 112.992688, 25.247467 ], [ 112.958195, 25.254503 ], [ 112.897833, 25.238264 ], [ 112.867036, 25.249632 ], [ 112.854718, 25.337829 ], [ 112.891058, 25.339993 ], [ 112.924319, 25.296714 ], [ 112.93479, 25.325929 ], [ 112.969898, 25.350269 ], [ 113.013014, 25.352432 ], [ 113.078304, 25.382174 ], [ 113.096782, 25.412449 ], [ 113.130658, 25.427043 ], [ 113.11834, 25.44704 ], [ 113.176854, 25.471355 ], [ 113.226129, 25.50971 ], [ 113.248919, 25.514031 ], [ 113.311129, 25.490264 ], [ 113.314208, 25.442716 ], [ 113.341926, 25.448661 ], [ 113.373338, 25.402719 ], [ 113.407215, 25.401637 ], [ 113.449715, 25.359463 ], [ 113.479896, 25.375145 ], [ 113.535946, 25.368656 ], [ 113.579062, 25.34432 ], [ 113.584606, 25.306453 ], [ 113.611707, 25.327552 ], [ 113.680076, 25.334584 ], [ 113.686852, 25.351891 ], [ 113.753373, 25.362707 ], [ 113.76446, 25.333502 ], [ 113.814967, 25.328634 ], [ 113.839605, 25.363248 ], [ 113.877177, 25.380552 ], [ 113.887032, 25.436772 ], [ 113.94493, 25.441635 ], [ 114.003444, 25.442716 ], [ 113.983118, 25.415152 ], [ 114.050256, 25.36433 ], [ 114.029314, 25.328093 ], [ 114.017611, 25.273987 ], [ 114.039785, 25.250714 ], [ 114.055799, 25.277775 ], [ 114.083517, 25.275611 ], [ 114.115545, 25.302125 ], [ 114.190074, 25.316733 ], [ 114.204857, 25.29942 ], [ 114.260291, 25.291845 ], [ 114.2954, 25.299961 ], [ 114.31511, 25.33837 ], [ 114.382863, 25.317274 ], [ 114.43029, 25.343779 ], [ 114.438914, 25.376226 ], [ 114.477718, 25.37136 ], [ 114.541159, 25.416773 ], [ 114.599674, 25.385959 ], [ 114.63663, 25.324306 ], [ 114.714238, 25.315651 ], [ 114.743188, 25.274528 ], [ 114.73518, 25.225813 ], [ 114.693912, 25.213902 ], [ 114.685905, 25.173287 ], [ 114.73518, 25.155954 ], [ 114.735796, 25.121822 ], [ 114.664963, 25.10123 ], [ 114.640326, 25.074129 ], [ 114.604601, 25.083886 ], [ 114.561485, 25.077382 ], [ 114.532536, 25.022623 ], [ 114.506051, 24.999844 ], [ 114.45616, 24.99659 ], [ 114.454928, 24.977062 ], [ 114.395798, 24.951019 ], [ 114.403189, 24.877746 ], [ 114.378551, 24.861457 ], [ 114.342211, 24.807145 ], [ 114.336052, 24.749004 ], [ 114.281849, 24.724001 ], [ 114.27261, 24.700624 ], [ 114.169132, 24.689749 ], [ 114.19069, 24.656576 ], [ 114.258443, 24.641346 ], [ 114.289856, 24.619042 ], [ 114.300943, 24.578775 ], [ 114.363769, 24.582584 ], [ 114.391486, 24.563535 ], [ 114.403189, 24.497657 ], [ 114.429058, 24.48622 ], [ 114.534384, 24.559181 ], [ 114.589819, 24.537406 ], [ 114.627391, 24.576598 ], [ 114.664963, 24.583673 ], [ 114.704999, 24.525973 ], [ 114.73826, 24.565168 ], [ 114.729637, 24.608704 ], [ 114.781376, 24.613057 ], [ 114.827571, 24.588026 ], [ 114.846665, 24.602719 ], [ 114.868839, 24.562446 ], [ 114.893477, 24.582584 ], [ 114.909491, 24.661471 ], [ 114.940288, 24.650049 ], [ 115.00373, 24.679418 ], [ 115.024672, 24.669085 ], [ 115.057317, 24.703343 ], [ 115.083802, 24.699537 ], [ 115.104744, 24.667997 ], [ 115.1842, 24.711498 ], [ 115.258729, 24.728894 ], [ 115.269816, 24.749548 ], [ 115.306772, 24.758787 ], [ 115.358511, 24.735416 ], [ 115.372678, 24.774546 ], [ 115.412714, 24.79302 ], [ 115.476771, 24.762591 ], [ 115.522967, 24.702799 ], [ 115.555611, 24.683768 ], [ 115.569778, 24.622306 ], [ 115.605503, 24.62557 ], [ 115.671408, 24.604895 ], [ 115.68927, 24.545027 ], [ 115.752712, 24.546116 ], [ 115.785357, 24.567345 ], [ 115.843871, 24.562446 ], [ 115.840791, 24.584217 ], [ 115.797676, 24.628834 ], [ 115.780429, 24.663103 ], [ 115.801371, 24.705517 ], [ 115.769342, 24.708236 ], [ 115.756408, 24.749004 ], [ 115.776734, 24.774546 ], [ 115.764415, 24.791933 ], [ 115.790284, 24.856027 ], [ 115.807531, 24.862543 ], [ 115.824161, 24.909232 ], [ 115.863581, 24.891318 ], [ 115.861733, 24.863629 ], [ 115.907313, 24.879917 ], [ 115.885139, 24.898918 ], [ 115.89253, 24.936911 ], [ 115.907929, 24.923343 ], [ 115.985537, 24.899461 ], [ 116.015102, 24.905975 ], [ 116.068073, 24.850053 ], [ 116.153073, 24.846795 ], [ 116.191877, 24.877203 ], [ 116.221442, 24.829959 ], [ 116.251007, 24.82507 ], [ 116.244232, 24.793563 ], [ 116.297202, 24.801712 ], [ 116.345862, 24.828872 ], [ 116.363724, 24.87123 ], [ 116.395137, 24.877746 ], [ 116.417927, 24.840821 ], [ 116.381586, 24.82507 ], [ 116.375427, 24.803885 ], [ 116.419158, 24.767482 ], [ 116.416079, 24.744113 ], [ 116.44626, 24.714216 ], [ 116.485064, 24.720196 ], [ 116.517709, 24.652225 ], [ 116.506622, 24.621218 ], [ 116.530027, 24.604895 ], [ 116.570679, 24.621762 ], [ 116.600861, 24.654401 ], [ 116.623034, 24.64189 ], [ 116.667382, 24.658752 ], [ 116.777635, 24.679418 ], [ 116.815207, 24.654944 ], [ 116.761005, 24.583128 ], [ 116.759157, 24.545572 ], [ 116.796729, 24.502014 ], [ 116.83307, 24.496568 ], [ 116.860787, 24.460075 ], [ 116.839229, 24.442097 ], [ 116.903903, 24.369614 ], [ 116.895895, 24.350533 ], [ 116.919301, 24.321087 ], [ 116.914374, 24.287817 ], [ 116.938395, 24.28127 ], [ 116.933468, 24.220157 ], [ 116.956257, 24.216883 ], [ 116.998757, 24.179217 ], [ 116.9347, 24.126794 ], [ 116.930388, 24.064514 ], [ 116.953178, 24.008218 ], [ 116.981511, 23.999471 ], [ 116.976583, 23.931659 ], [ 116.955642, 23.922359 ], [ 116.981511, 23.855602 ], [ 117.012308, 23.855054 ], [ 117.019083, 23.801952 ], [ 117.048032, 23.758687 ], [ 117.055424, 23.694038 ], [ 117.123793, 23.647448 ], [ 117.147199, 23.654027 ], [ 117.192778, 23.629356 ], [ 117.192778, 23.5619 ], [ 117.085605, 23.536663 ], [ 117.044953, 23.539955 ], [ 117.01046, 23.502641 ], [ 116.963649, 23.507031 ], [ 116.92854, 23.530079 ], [ 116.888504, 23.501543 ], [ 116.895895, 23.476295 ], [ 116.874953, 23.447748 ], [ 116.874338, 23.447199 ], [ 116.871258, 23.416449 ], [ 116.871874, 23.4159 ], [ 116.782563, 23.313714 ], [ 116.798577, 23.244996 ], [ 116.821367, 23.240597 ], [ 116.806584, 23.200998 ], [ 116.74499, 23.215299 ], [ 116.701259, 23.198248 ], [ 116.665534, 23.158086 ], [ 116.566368, 23.134424 ], [ 116.550969, 23.109656 ], [ 116.566368, 23.088738 ], [ 116.557129, 23.056253 ], [ 116.576839, 23.014397 ], [ 116.542346, 22.995667 ], [ 116.50539, 22.930645 ], [ 116.449955, 22.936707 ], [ 116.382818, 22.91907 ], [ 116.317528, 22.95269 ], [ 116.226985, 22.91466 ], [ 116.191261, 22.874965 ], [ 116.104413, 22.816505 ], [ 116.05637, 22.844635 ], [ 115.99724, 22.826985 ], [ 115.965211, 22.800506 ], [ 115.931334, 22.802713 ], [ 115.883291, 22.78561 ], [ 115.829089, 22.734838 ], [ 115.796444, 22.739254 ], [ 115.788437, 22.809885 ], [ 115.760103, 22.834707 ], [ 115.696046, 22.84298 ], [ 115.654162, 22.865591 ], [ 115.583945, 22.82864 ], [ 115.570394, 22.786713 ], [ 115.541445, 22.755259 ], [ 115.609198, 22.753052 ], [ 115.565467, 22.684048 ], [ 115.575322, 22.650914 ], [ 115.471844, 22.697852 ], [ 115.430576, 22.684048 ], [ 115.381301, 22.684048 ], [ 115.349272, 22.712206 ], [ 115.338185, 22.776781 ], [ 115.319091, 22.783402 ], [ 115.230396, 22.776781 ], [ 115.236555, 22.82533 ], [ 115.190359, 22.818711 ], [ 115.190975, 22.77347 ], [ 115.154635, 22.80161 ], [ 115.061628, 22.783402 ], [ 115.053621, 22.747533 ], [ 115.02344, 22.726007 ], [ 115.039454, 22.713862 ], [ 114.945216, 22.645391 ], [ 114.927969, 22.621639 ], [ 114.922426, 22.549253 ], [ 114.88547, 22.538751 ], [ 114.866375, 22.591805 ], [ 114.746267, 22.581859 ], [ 114.743803, 22.632687 ], [ 114.728405, 22.651466 ], [ 114.73518, 22.724351 ], [ 114.749963, 22.764089 ], [ 114.709927, 22.787817 ], [ 114.689601, 22.7674 ], [ 114.601521, 22.730975 ], [ 114.591666, 22.690122 ], [ 114.567029, 22.685705 ], [ 114.51529, 22.655332 ], [ 114.579964, 22.661407 ], [ 114.603369, 22.638763 ], [ 114.559022, 22.583517 ], [ 114.568261, 22.560859 ], [ 114.614456, 22.545384 ], [ 114.628623, 22.513875 ], [ 114.611377, 22.481806 ], [ 114.549167, 22.465769 ], [ 114.506667, 22.438667 ], [ 114.476486, 22.459132 ], [ 114.472174, 22.522168 ], [ 114.427211, 22.589042 ], [ 114.381631, 22.60175 ], [ 114.321885, 22.587385 ], [ 114.294784, 22.563623 ], [ 114.232574, 22.539857 ], [ 114.222719, 22.553122 ], [ 114.166052, 22.559201 ], [ 114.156813, 22.543726 ], [ 114.095219, 22.534329 ], [ 114.082285, 22.512216 ], [ 114.031778, 22.503923 ], [ 113.976343, 22.510558 ], [ 113.954785, 22.491206 ], [ 113.952937, 22.486783 ], [ 113.893807, 22.442539 ], [ 113.869786, 22.459685 ], [ 113.856851, 22.539857 ], [ 113.803264, 22.593463 ], [ 113.773083, 22.643182 ], [ 113.751525, 22.715518 ], [ 113.733663, 22.736494 ], [ 113.678228, 22.726007 ], [ 113.717033, 22.645391 ], [ 113.740438, 22.534329 ], [ 113.691779, 22.514981 ], [ 113.668373, 22.4807 ], [ 113.631417, 22.475723 ], [ 113.573519, 22.41156 ], [ 113.608627, 22.408793 ], [ 113.624642, 22.443092 ], [ 113.66591, 22.438667 ], [ 113.669605, 22.416539 ], [ 113.627721, 22.349027 ], [ 113.604932, 22.339617 ], [ 113.617866, 22.315259 ], [ 113.595693, 22.304186 ], [ 113.594461, 22.228864 ], [ 113.558736, 22.212244 ], [ 113.53841, 22.209473 ], [ 113.534715, 22.174009 ], [ 113.554425, 22.142416 ], [ 113.554425, 22.107489 ], [ 113.567359, 22.075327 ], [ 113.527939, 22.073663 ], [ 113.45957, 22.043711 ], [ 113.442324, 22.009315 ], [ 113.330223, 21.96159 ], [ 113.319752, 21.909407 ], [ 113.266781, 21.871646 ], [ 113.235368, 21.887751 ], [ 113.1516, 21.979905 ], [ 113.142977, 22.012089 ], [ 113.091854, 22.065344 ], [ 113.086927, 22.12634 ], [ 113.045659, 22.088636 ], [ 113.032108, 22.04593 ], [ 113.053666, 22.012089 ], [ 113.047507, 21.956595 ], [ 112.989608, 21.869424 ], [ 112.929862, 21.838875 ], [ 112.893522, 21.84443 ], [ 112.841167, 21.920512 ], [ 112.792508, 21.921067 ], [ 112.68595, 21.810541 ], [ 112.647146, 21.758302 ], [ 112.535661, 21.753856 ], [ 112.497473, 21.785535 ], [ 112.445734, 21.803317 ], [ 112.427256, 21.789981 ], [ 112.415553, 21.734956 ], [ 112.353343, 21.707157 ], [ 112.238778, 21.702153 ], [ 112.236315, 21.727173 ], [ 112.196894, 21.736624 ], [ 112.192583, 21.789425 ], [ 112.136532, 21.793871 ], [ 112.036134, 21.761637 ], [ 111.956062, 21.710494 ], [ 111.954214, 21.667674 ], [ 111.997946, 21.657107 ], [ 112.026895, 21.633744 ], [ 111.972692, 21.603144 ], [ 111.941896, 21.607039 ], [ 111.887693, 21.578659 ], [ 111.810084, 21.555283 ], [ 111.832258, 21.578659 ], [ 111.794686, 21.61149 ], [ 111.736788, 21.609821 ], [ 111.693672, 21.590345 ], [ 111.677658, 21.529677 ], [ 111.650556, 21.512418 ], [ 111.609904, 21.530234 ], [ 111.560629, 21.50518 ], [ 111.521825, 21.517429 ], [ 111.494724, 21.501282 ], [ 111.444217, 21.514088 ], [ 111.382623, 21.495714 ], [ 111.353058, 21.464528 ], [ 111.28592, 21.41885 ], [ 111.258819, 21.412165 ], [ 111.253275, 21.452831 ], [ 111.276065, 21.443362 ], [ 111.28284, 21.485691 ], [ 111.171355, 21.458401 ], [ 111.103602, 21.455616 ], [ 111.034617, 21.438906 ], [ 110.929291, 21.375945 ], [ 110.888639, 21.367585 ], [ 110.796248, 21.37483 ], [ 110.768531, 21.364799 ], [ 110.713097, 21.3124 ], [ 110.65951, 21.239902 ], [ 110.626249, 21.215915 ], [ 110.534474, 21.204198 ], [ 110.501213, 21.217588 ], [ 110.451322, 21.186343 ], [ 110.422373, 21.190807 ], [ 110.39096, 21.124949 ], [ 110.296722, 21.093684 ], [ 110.24991, 21.045098 ], [ 110.241903, 21.016051 ], [ 110.208642, 21.050684 ], [ 110.204947, 21.003202 ], [ 110.180925, 20.98197 ], [ 110.184005, 20.891979 ], [ 110.209874, 20.860106 ], [ 110.269004, 20.839972 ], [ 110.327519, 20.847802 ], [ 110.393424, 20.816479 ], [ 110.407591, 20.731987 ], [ 110.392192, 20.682724 ], [ 110.411286, 20.670966 ], [ 110.466105, 20.680485 ], [ 110.487047, 20.640167 ], [ 110.499982, 20.572386 ], [ 110.550489, 20.47262 ], [ 110.54125, 20.42047 ], [ 110.491358, 20.373912 ], [ 110.452554, 20.311064 ], [ 110.425453, 20.291419 ], [ 110.384185, 20.293103 ], [ 110.349076, 20.258859 ], [ 110.296722, 20.249314 ], [ 110.220345, 20.25156 ], [ 110.168606, 20.219553 ], [ 110.118099, 20.219553 ], [ 110.082375, 20.258859 ], [ 109.993679, 20.254368 ], [ 109.929006, 20.211691 ], [ 109.909296, 20.236961 ], [ 109.916071, 20.316677 ], [ 109.861252, 20.376717 ], [ 109.864948, 20.40196 ], [ 109.895745, 20.42776 ], [ 109.888354, 20.475423 ], [ 109.839695, 20.489439 ], [ 109.811977, 20.541566 ], [ 109.813825, 20.574627 ], [ 109.793499, 20.615522 ], [ 109.74484, 20.621124 ], [ 109.730057, 20.719673 ], [ 109.711579, 20.774519 ], [ 109.664768, 20.862343 ], [ 109.655529, 20.929435 ], [ 109.674007, 21.067997 ], [ 109.674623, 21.136671 ], [ 109.763934, 21.226514 ], [ 109.757775, 21.346963 ], [ 109.770709, 21.359783 ], [ 109.868644, 21.365913 ], [ 109.904368, 21.429992 ], [ 109.894513, 21.442248 ], [ 109.819369, 21.445033 ], [ 109.785492, 21.45673 ] ] ], [ [ [ 117.145351, 23.455983 ], [ 117.142887, 23.400522 ], [ 117.124409, 23.389537 ], [ 117.081909, 23.409309 ], [ 117.050496, 23.400522 ], [ 117.027091, 23.41535 ], [ 116.946402, 23.42194 ], [ 116.944555, 23.440061 ], [ 116.982743, 23.460924 ], [ 117.022779, 23.436767 ], [ 117.058503, 23.47355 ], [ 117.093612, 23.459277 ], [ 117.129336, 23.483431 ], [ 117.145351, 23.455983 ] ] ], [ [ [ 112.853486, 21.740515 ], [ 112.83316, 21.736624 ], [ 112.804826, 21.686583 ], [ 112.821457, 21.655994 ], [ 112.798667, 21.610933 ], [ 112.817145, 21.590345 ], [ 112.775261, 21.564189 ], [ 112.730914, 21.613715 ], [ 112.780189, 21.671568 ], [ 112.734609, 21.666562 ], [ 112.70566, 21.679354 ], [ 112.724138, 21.719945 ], [ 112.782653, 21.739959 ], [ 112.840551, 21.776644 ], [ 112.876275, 21.772753 ], [ 112.853486, 21.740515 ] ] ], [ [ [ 112.530733, 21.583667 ], [ 112.535045, 21.628737 ], [ 112.57077, 21.645982 ], [ 112.560299, 21.666562 ], [ 112.592327, 21.693256 ], [ 112.663776, 21.714386 ], [ 112.66624, 21.683803 ], [ 112.639139, 21.67268 ], [ 112.665624, 21.642644 ], [ 112.621277, 21.606482 ], [ 112.571385, 21.619835 ], [ 112.563378, 21.591458 ], [ 112.530733, 21.583667 ] ] ], [ [ [ 114.231342, 22.016528 ], [ 114.239965, 22.03539 ], [ 114.302791, 22.050368 ], [ 114.311414, 22.041493 ], [ 114.231342, 22.016528 ] ] ], [ [ [ 112.435263, 21.663781 ], [ 112.458669, 21.68992 ], [ 112.456205, 21.648763 ], [ 112.435263, 21.663781 ] ] ], [ [ [ 110.435308, 21.182995 ], [ 110.445163, 21.184669 ], [ 110.499366, 21.213125 ], [ 110.525235, 21.190249 ], [ 110.589293, 21.194713 ], [ 110.632409, 21.210893 ], [ 110.582517, 21.094801 ], [ 110.544945, 21.083633 ], [ 110.508605, 21.140579 ], [ 110.434076, 21.168485 ], [ 110.435308, 21.182995 ] ] ], [ [ [ 110.517844, 21.079166 ], [ 110.560344, 21.061295 ], [ 110.539402, 20.987557 ], [ 110.535706, 20.922727 ], [ 110.511684, 20.916578 ], [ 110.47288, 20.983087 ], [ 110.407591, 20.990351 ], [ 110.347845, 20.984763 ], [ 110.309656, 20.963529 ], [ 110.201251, 20.938378 ], [ 110.211106, 20.986999 ], [ 110.27578, 21.033369 ], [ 110.305961, 21.0881 ], [ 110.352772, 21.079724 ], [ 110.398352, 21.096476 ], [ 110.459946, 21.062971 ], [ 110.517844, 21.079166 ] ] ], [ [ [ 113.765076, 21.962145 ], [ 113.74167, 21.991559 ], [ 113.774315, 21.998218 ], [ 113.765076, 21.962145 ] ] ], [ [ [ 113.723192, 21.922177 ], [ 113.71888, 21.951599 ], [ 113.742902, 21.950489 ], [ 113.723192, 21.922177 ] ] ], [ [ [ 113.142977, 21.831653 ], [ 113.136818, 21.868869 ], [ 113.167615, 21.876644 ], [ 113.203955, 21.861093 ], [ 113.162071, 21.853873 ], [ 113.142977, 21.831653 ] ] ], [ [ [ 113.819894, 22.396068 ], [ 113.786634, 22.413773 ], [ 113.813735, 22.419858 ], [ 113.819894, 22.396068 ] ] ], [ [ [ 114.190074, 21.986564 ], [ 114.180835, 22.00987 ], [ 114.229494, 21.995443 ], [ 114.190074, 21.986564 ] ] ], [ [ [ 114.153734, 21.97491 ], [ 114.124169, 21.985455 ], [ 114.171596, 22.000437 ], [ 114.153734, 21.97491 ] ] ], [ [ [ 116.769628, 20.771721 ], [ 116.820135, 20.780674 ], [ 116.88604, 20.775638 ], [ 116.925461, 20.726949 ], [ 116.934084, 20.676565 ], [ 116.905135, 20.619443 ], [ 116.862635, 20.588633 ], [ 116.796113, 20.582471 ], [ 116.749302, 20.600958 ], [ 116.849084, 20.628405 ], [ 116.889736, 20.683284 ], [ 116.87249, 20.738143 ], [ 116.761005, 20.750456 ], [ 116.769628, 20.771721 ] ] ], [ [ [ 113.025333, 21.847762 ], [ 113.007471, 21.869424 ], [ 113.045659, 21.882753 ], [ 113.025333, 21.847762 ] ] ], [ [ [ 110.405127, 20.678245 ], [ 110.414366, 20.710157 ], [ 110.437772, 20.677685 ], [ 110.405127, 20.678245 ] ] ], [ [ [ 110.644727, 20.935584 ], [ 110.646575, 20.917137 ], [ 110.611467, 20.860106 ], [ 110.562807, 20.861224 ], [ 110.548641, 20.908752 ], [ 110.584365, 20.948998 ], [ 110.644727, 20.935584 ] ] ], [ [ [ 110.556648, 20.32734 ], [ 110.586213, 20.381205 ], [ 110.593604, 20.360447 ], [ 110.556648, 20.32734 ] ] ], [ [ [ 115.943037, 21.097592 ], [ 115.965211, 21.123832 ], [ 116.024341, 21.12439 ], [ 116.044051, 21.110434 ], [ 116.067457, 21.04063 ], [ 116.040356, 21.02052 ], [ 115.989233, 21.035603 ], [ 115.953508, 21.064088 ], [ 115.943037, 21.097592 ] ] ], [ [ [ 115.926407, 20.981411 ], [ 115.954124, 20.99985 ], [ 116.000936, 20.948439 ], [ 115.999088, 20.922727 ], [ 115.970139, 20.919373 ], [ 115.939342, 20.945644 ], [ 115.926407, 20.981411 ] ] ], [ [ [ 115.834632, 22.722695 ], [ 115.835248, 22.722695 ], [ 115.834632, 22.722143 ], [ 115.834632, 22.722695 ] ] ], [ [ [ 115.834632, 22.723247 ], [ 115.835248, 22.722695 ], [ 115.834632, 22.722695 ], [ 115.834632, 22.723247 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"450000\", \"name\": \"广西壮族自治区\", \"center\": [ 108.320004, 22.82402 ], \"centroid\": [ 108.7944, 23.833381 ], \"childrenNum\": 14, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 19, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 112.024431, 24.740308 ], [ 111.961606, 24.721283 ], [ 111.939432, 24.686487 ], [ 111.953598, 24.64733 ], [ 111.927729, 24.629378 ], [ 111.936968, 24.595645 ], [ 111.972077, 24.578775 ], [ 112.007185, 24.534684 ], [ 112.009649, 24.503103 ], [ 111.985011, 24.467701 ], [ 112.025047, 24.438828 ], [ 112.057692, 24.387057 ], [ 112.05954, 24.339628 ], [ 112.026279, 24.294908 ], [ 111.990555, 24.279634 ], [ 111.986243, 24.25672 ], [ 111.958526, 24.263813 ], [ 111.912946, 24.221795 ], [ 111.877222, 24.227252 ], [ 111.871062, 24.176487 ], [ 111.886461, 24.163929 ], [ 111.878454, 24.109862 ], [ 111.92157, 24.012045 ], [ 111.940664, 23.987989 ], [ 111.911714, 23.943693 ], [ 111.854432, 23.947521 ], [ 111.845809, 23.904305 ], [ 111.812548, 23.887343 ], [ 111.824867, 23.832612 ], [ 111.8107, 23.80688 ], [ 111.722621, 23.823305 ], [ 111.683201, 23.822758 ], [ 111.683201, 23.822758 ], [ 111.654868, 23.833159 ], [ 111.627766, 23.78881 ], [ 111.621607, 23.725819 ], [ 111.666571, 23.718696 ], [ 111.614832, 23.65896 ], [ 111.615448, 23.639225 ], [ 111.555702, 23.64087 ], [ 111.487332, 23.626615 ], [ 111.479941, 23.532822 ], [ 111.428818, 23.466414 ], [ 111.399869, 23.469159 ], [ 111.383239, 23.399423 ], [ 111.389398, 23.375804 ], [ 111.363528, 23.340641 ], [ 111.376463, 23.30437 ], [ 111.353058, 23.284582 ], [ 111.36476, 23.240047 ], [ 111.388782, 23.210349 ], [ 111.38447, 23.16744 ], [ 111.365992, 23.14488 ], [ 111.377695, 23.082132 ], [ 111.402333, 23.066165 ], [ 111.43313, 23.073322 ], [ 111.433746, 23.036428 ], [ 111.389398, 23.005583 ], [ 111.403565, 22.99126 ], [ 111.362913, 22.967568 ], [ 111.374615, 22.938361 ], [ 111.358601, 22.889301 ], [ 111.218167, 22.748085 ], [ 111.185522, 22.735942 ], [ 111.118385, 22.744773 ], [ 111.058023, 22.729871 ], [ 111.089435, 22.695643 ], [ 111.055559, 22.648705 ], [ 110.997045, 22.631582 ], [ 110.958856, 22.636553 ], [ 110.950233, 22.61059 ], [ 110.896031, 22.613352 ], [ 110.897878, 22.591805 ], [ 110.812263, 22.576333 ], [ 110.778386, 22.585174 ], [ 110.749437, 22.556991 ], [ 110.762988, 22.518298 ], [ 110.740198, 22.498947 ], [ 110.74143, 22.464109 ], [ 110.688459, 22.477935 ], [ 110.712481, 22.440879 ], [ 110.711249, 22.369506 ], [ 110.74143, 22.361757 ], [ 110.749437, 22.329653 ], [ 110.787009, 22.28259 ], [ 110.759292, 22.274837 ], [ 110.725415, 22.29588 ], [ 110.687843, 22.249914 ], [ 110.646575, 22.220554 ], [ 110.678604, 22.172901 ], [ 110.629329, 22.149068 ], [ 110.598532, 22.162924 ], [ 110.602843, 22.18343 ], [ 110.55788, 22.196175 ], [ 110.505525, 22.14297 ], [ 110.456866, 22.189526 ], [ 110.414366, 22.208365 ], [ 110.378026, 22.164587 ], [ 110.34846, 22.195621 ], [ 110.326287, 22.152393 ], [ 110.364475, 22.125785 ], [ 110.35154, 22.097508 ], [ 110.359547, 22.015973 ], [ 110.352772, 21.97602 ], [ 110.374946, 21.967695 ], [ 110.374946, 21.967695 ], [ 110.378642, 21.939942 ], [ 110.378642, 21.939942 ], [ 110.391576, 21.89386 ], [ 110.337374, 21.887751 ], [ 110.290562, 21.917736 ], [ 110.283787, 21.892194 ], [ 110.224041, 21.882198 ], [ 110.224041, 21.882198 ], [ 110.212338, 21.886085 ], [ 110.212338, 21.886085 ], [ 110.196323, 21.899968 ], [ 110.12857, 21.902744 ], [ 110.101469, 21.86998 ], [ 110.050962, 21.857205 ], [ 109.999839, 21.881643 ], [ 109.94502, 21.84443 ], [ 109.940093, 21.769419 ], [ 109.916071, 21.668787 ], [ 109.888354, 21.652101 ], [ 109.888354, 21.652101 ], [ 109.839695, 21.636525 ], [ 109.786108, 21.637638 ], [ 109.778101, 21.670455 ], [ 109.742992, 21.616497 ], [ 109.754695, 21.556396 ], [ 109.788572, 21.490702 ], [ 109.785492, 21.45673 ], [ 109.704188, 21.462857 ], [ 109.654913, 21.493487 ], [ 109.612413, 21.556953 ], [ 109.604406, 21.523553 ], [ 109.576689, 21.493487 ], [ 109.540964, 21.466199 ], [ 109.529877, 21.437234 ], [ 109.484914, 21.453388 ], [ 109.41716, 21.438906 ], [ 109.245929, 21.425536 ], [ 109.186183, 21.390991 ], [ 109.138756, 21.388762 ], [ 109.095024, 21.419407 ], [ 109.046365, 21.424421 ], [ 109.039589, 21.457844 ], [ 109.074698, 21.489589 ], [ 109.142451, 21.511861 ], [ 109.138756, 21.567528 ], [ 109.110422, 21.568085 ], [ 109.09872, 21.571424 ], [ 109.093792, 21.579215 ], [ 108.937959, 21.589789 ], [ 108.881293, 21.627068 ], [ 108.83325, 21.610933 ], [ 108.801837, 21.626512 ], [ 108.745786, 21.602587 ], [ 108.710062, 21.646538 ], [ 108.705134, 21.622061 ], [ 108.678033, 21.659331 ], [ 108.658939, 21.643757 ], [ 108.626294, 21.67991 ], [ 108.591802, 21.677129 ], [ 108.492635, 21.554727 ], [ 108.397781, 21.533017 ], [ 108.330027, 21.540254 ], [ 108.230245, 21.491259 ], [ 108.210535, 21.505737 ], [ 108.249955, 21.561406 ], [ 108.241332, 21.599805 ], [ 108.205608, 21.597579 ], [ 108.156332, 21.55083 ], [ 108.193905, 21.519656 ], [ 108.108289, 21.508521 ], [ 108.041768, 21.544151 ], [ 107.958, 21.534131 ], [ 107.929051, 21.585893 ], [ 107.893942, 21.596466 ], [ 107.892095, 21.622617 ], [ 107.863761, 21.650988 ], [ 107.837892, 21.640419 ], [ 107.807711, 21.655438 ], [ 107.712856, 21.616497 ], [ 107.603219, 21.597579 ], [ 107.584741, 21.614828 ], [ 107.547168, 21.58645 ], [ 107.486806, 21.59591 ], [ 107.500973, 21.613715 ], [ 107.477567, 21.659888 ], [ 107.431372, 21.642088 ], [ 107.388256, 21.594241 ], [ 107.363619, 21.602031 ], [ 107.356843, 21.667674 ], [ 107.310648, 21.733844 ], [ 107.271844, 21.727173 ], [ 107.242279, 21.703265 ], [ 107.199163, 21.718833 ], [ 107.194851, 21.736624 ], [ 107.148656, 21.758858 ], [ 107.093837, 21.803317 ], [ 107.018077, 21.81943 ], [ 107.018693, 21.859427 ], [ 107.058729, 21.887196 ], [ 107.05996, 21.914959 ], [ 106.999598, 21.947714 ], [ 106.974345, 21.923288 ], [ 106.935541, 21.933836 ], [ 106.926302, 21.967695 ], [ 106.859164, 21.986009 ], [ 106.802498, 21.98157 ], [ 106.790179, 22.004876 ], [ 106.73844, 22.008205 ], [ 106.698404, 21.959925 ], [ 106.683006, 21.999882 ], [ 106.706411, 22.021521 ], [ 106.71565, 22.089745 ], [ 106.691629, 22.13521 ], [ 106.706411, 22.160707 ], [ 106.673151, 22.182322 ], [ 106.7021, 22.207257 ], [ 106.688549, 22.260438 ], [ 106.670071, 22.283144 ], [ 106.663296, 22.33076 ], [ 106.562897, 22.345706 ], [ 106.588767, 22.374486 ], [ 106.560434, 22.455813 ], [ 106.588151, 22.472958 ], [ 106.585071, 22.517192 ], [ 106.61402, 22.602303 ], [ 106.652825, 22.57357 ], [ 106.711955, 22.575228 ], [ 106.756302, 22.68957 ], [ 106.780324, 22.708894 ], [ 106.768621, 22.739254 ], [ 106.820976, 22.768504 ], [ 106.838838, 22.803265 ], [ 106.813585, 22.817608 ], [ 106.808657, 22.817608 ], [ 106.804346, 22.816505 ], [ 106.801882, 22.815401 ], [ 106.776012, 22.813746 ], [ 106.709491, 22.866142 ], [ 106.716882, 22.881582 ], [ 106.674998, 22.891506 ], [ 106.657136, 22.863385 ], [ 106.631267, 22.88103 ], [ 106.606013, 22.925684 ], [ 106.562282, 22.923479 ], [ 106.525941, 22.946628 ], [ 106.504383, 22.91025 ], [ 106.41384, 22.877171 ], [ 106.37134, 22.878273 ], [ 106.366413, 22.857871 ], [ 106.286957, 22.867245 ], [ 106.258007, 22.889852 ], [ 106.270326, 22.907494 ], [ 106.206885, 22.978588 ], [ 106.153914, 22.988505 ], [ 106.106486, 22.980792 ], [ 106.08616, 22.996218 ], [ 106.019639, 22.990709 ], [ 105.994385, 22.93781 ], [ 105.959277, 22.948832 ], [ 105.893987, 22.936707 ], [ 105.879205, 22.916865 ], [ 105.839169, 22.987403 ], [ 105.805908, 22.994565 ], [ 105.780039, 23.022659 ], [ 105.74185, 23.030921 ], [ 105.724604, 23.06231 ], [ 105.648844, 23.078828 ], [ 105.625438, 23.064513 ], [ 105.574931, 23.066165 ], [ 105.558916, 23.177893 ], [ 105.542902, 23.184495 ], [ 105.526272, 23.234548 ], [ 105.560148, 23.257093 ], [ 105.593409, 23.312614 ], [ 105.649459, 23.346136 ], [ 105.699966, 23.327453 ], [ 105.694423, 23.363168 ], [ 105.637757, 23.404366 ], [ 105.699966, 23.40162 ], [ 105.758481, 23.459826 ], [ 105.805908, 23.467512 ], [ 105.815763, 23.507031 ], [ 105.852103, 23.526786 ], [ 105.89214, 23.52514 ], [ 105.913081, 23.499348 ], [ 105.935871, 23.508678 ], [ 105.986378, 23.489469 ], [ 105.999929, 23.447748 ], [ 106.039965, 23.484529 ], [ 106.071994, 23.495506 ], [ 106.08616, 23.524043 ], [ 106.141595, 23.569579 ], [ 106.120653, 23.605229 ], [ 106.149602, 23.665538 ], [ 106.157609, 23.724175 ], [ 106.136667, 23.795381 ], [ 106.192102, 23.824947 ], [ 106.173008, 23.861622 ], [ 106.192718, 23.879135 ], [ 106.157609, 23.891174 ], [ 106.128044, 23.956819 ], [ 106.091088, 23.998924 ], [ 106.096631, 24.018058 ], [ 106.053516, 24.051399 ], [ 106.04982, 24.089649 ], [ 106.011632, 24.099482 ], [ 105.998081, 24.120786 ], [ 105.963589, 24.110954 ], [ 105.919241, 24.122425 ], [ 105.901995, 24.099482 ], [ 105.908154, 24.069432 ], [ 105.89214, 24.040468 ], [ 105.859495, 24.056864 ], [ 105.841633, 24.03063 ], [ 105.796669, 24.023524 ], [ 105.802212, 24.051945 ], [ 105.765256, 24.073804 ], [ 105.739387, 24.059596 ], [ 105.704278, 24.0667 ], [ 105.649459, 24.032816 ], [ 105.628518, 24.126794 ], [ 105.594641, 24.137718 ], [ 105.533663, 24.130071 ], [ 105.493011, 24.016965 ], [ 105.406163, 24.043748 ], [ 105.395692, 24.065607 ], [ 105.334099, 24.094566 ], [ 105.320548, 24.116416 ], [ 105.273121, 24.092927 ], [ 105.292831, 24.074896 ], [ 105.260186, 24.061236 ], [ 105.20044, 24.105491 ], [ 105.182577, 24.167205 ], [ 105.229389, 24.165567 ], [ 105.24294, 24.208695 ], [ 105.215222, 24.214699 ], [ 105.164715, 24.288362 ], [ 105.196744, 24.326541 ], [ 105.188121, 24.347261 ], [ 105.138846, 24.376701 ], [ 105.111744, 24.37234 ], [ 105.106817, 24.414853 ], [ 105.042759, 24.442097 ], [ 104.979933, 24.412673 ], [ 104.930042, 24.411038 ], [ 104.914028, 24.426296 ], [ 104.83642, 24.446456 ], [ 104.784681, 24.443732 ], [ 104.765587, 24.45953 ], [ 104.74834, 24.435559 ], [ 104.715695, 24.441552 ], [ 104.703377, 24.419757 ], [ 104.721239, 24.340173 ], [ 104.70892, 24.321087 ], [ 104.641783, 24.367979 ], [ 104.610986, 24.377246 ], [ 104.63008, 24.397958 ], [ 104.616529, 24.421937 ], [ 104.575877, 24.424661 ], [ 104.550008, 24.518894 ], [ 104.520443, 24.535228 ], [ 104.489646, 24.653313 ], [ 104.529682, 24.731611 ], [ 104.595587, 24.709323 ], [ 104.628848, 24.660927 ], [ 104.703377, 24.645698 ], [ 104.729246, 24.617953 ], [ 104.771746, 24.659839 ], [ 104.841963, 24.676155 ], [ 104.865985, 24.730524 ], [ 104.899245, 24.752809 ], [ 105.03352, 24.787586 ], [ 105.026745, 24.815836 ], [ 105.039064, 24.872859 ], [ 105.077868, 24.918459 ], [ 105.082179, 24.915745 ], [ 105.096346, 24.928228 ], [ 105.09573, 24.92877 ], [ 105.131454, 24.959701 ], [ 105.157324, 24.958616 ], [ 105.178266, 24.985199 ], [ 105.212758, 24.995505 ], [ 105.251563, 24.967296 ], [ 105.267577, 24.929313 ], [ 105.334099, 24.9266 ], [ 105.365511, 24.943423 ], [ 105.428337, 24.930941 ], [ 105.457286, 24.87123 ], [ 105.493011, 24.833217 ], [ 105.497322, 24.809318 ], [ 105.573083, 24.797366 ], [ 105.607576, 24.803885 ], [ 105.617431, 24.78161 ], [ 105.70551, 24.768569 ], [ 105.767104, 24.719109 ], [ 105.827466, 24.702799 ], [ 105.863806, 24.729437 ], [ 105.942031, 24.725088 ], [ 105.961741, 24.677786 ], [ 106.024566, 24.633186 ], [ 106.047356, 24.684312 ], [ 106.113878, 24.714216 ], [ 106.150218, 24.762591 ], [ 106.173008, 24.760417 ], [ 106.206269, 24.851139 ], [ 106.197645, 24.885889 ], [ 106.145291, 24.954275 ], [ 106.191486, 24.95319 ], [ 106.215508, 24.981944 ], [ 106.253696, 24.971094 ], [ 106.304819, 24.973807 ], [ 106.332536, 24.988454 ], [ 106.442173, 25.019369 ], [ 106.450181, 25.033468 ], [ 106.519782, 25.054072 ], [ 106.551195, 25.082802 ], [ 106.590615, 25.08768 ], [ 106.63989, 25.132658 ], [ 106.644817, 25.164621 ], [ 106.691013, 25.179245 ], [ 106.732281, 25.162454 ], [ 106.764926, 25.183036 ], [ 106.787715, 25.17112 ], [ 106.853005, 25.186827 ], [ 106.888113, 25.181953 ], [ 106.904128, 25.231768 ], [ 106.933077, 25.250714 ], [ 106.975577, 25.232851 ], [ 107.013765, 25.275611 ], [ 107.012533, 25.352973 ], [ 106.987896, 25.358922 ], [ 106.963874, 25.437852 ], [ 106.996519, 25.442716 ], [ 107.015613, 25.495666 ], [ 107.066736, 25.50917 ], [ 107.064272, 25.559391 ], [ 107.185612, 25.578825 ], [ 107.205322, 25.607971 ], [ 107.228728, 25.604733 ], [ 107.232423, 25.556691 ], [ 107.263836, 25.543193 ], [ 107.336517, 25.461089 ], [ 107.308184, 25.432988 ], [ 107.318039, 25.401637 ], [ 107.358691, 25.393528 ], [ 107.375937, 25.411908 ], [ 107.420901, 25.392987 ], [ 107.409198, 25.347024 ], [ 107.432604, 25.289139 ], [ 107.481263, 25.299961 ], [ 107.489886, 25.276693 ], [ 107.472024, 25.213902 ], [ 107.512676, 25.209029 ], [ 107.576734, 25.256668 ], [ 107.599523, 25.250714 ], [ 107.632168, 25.310241 ], [ 107.659885, 25.316192 ], [ 107.661733, 25.258833 ], [ 107.696226, 25.219858 ], [ 107.700537, 25.194408 ], [ 107.741805, 25.24043 ], [ 107.762131, 25.229061 ], [ 107.760283, 25.188451 ], [ 107.789233, 25.15487 ], [ 107.762747, 25.125073 ], [ 107.839124, 25.115861 ], [ 107.872384, 25.141327 ], [ 107.928435, 25.155954 ], [ 108.001732, 25.196574 ], [ 108.080572, 25.193867 ], [ 108.115065, 25.210112 ], [ 108.143398, 25.269658 ], [ 108.152021, 25.324306 ], [ 108.142782, 25.390825 ], [ 108.193289, 25.405421 ], [ 108.162492, 25.444878 ], [ 108.192673, 25.458928 ], [ 108.251803, 25.430286 ], [ 108.241332, 25.46217 ], [ 108.280752, 25.48 ], [ 108.308469, 25.525912 ], [ 108.348506, 25.536173 ], [ 108.359592, 25.513491 ], [ 108.400244, 25.491344 ], [ 108.418723, 25.443257 ], [ 108.471693, 25.458928 ], [ 108.585642, 25.365952 ], [ 108.589338, 25.335125 ], [ 108.625062, 25.308076 ], [ 108.62999, 25.335666 ], [ 108.600425, 25.432448 ], [ 108.6072, 25.491885 ], [ 108.634917, 25.520512 ], [ 108.68912, 25.533473 ], [ 108.658323, 25.550212 ], [ 108.660787, 25.584763 ], [ 108.68604, 25.587462 ], [ 108.68912, 25.623081 ], [ 108.724844, 25.634952 ], [ 108.783975, 25.628477 ], [ 108.799989, 25.576666 ], [ 108.781511, 25.554531 ], [ 108.814772, 25.526992 ], [ 108.826474, 25.550212 ], [ 108.890532, 25.556151 ], [ 108.8893, 25.543193 ], [ 108.949046, 25.557231 ], [ 109.024807, 25.51241 ], [ 109.088249, 25.550752 ], [ 109.051908, 25.566949 ], [ 109.030966, 25.629556 ], [ 109.075314, 25.693749 ], [ 109.07901, 25.72071 ], [ 109.043285, 25.738502 ], [ 109.007561, 25.734728 ], [ 108.953974, 25.686738 ], [ 108.953974, 25.686738 ], [ 108.900387, 25.682423 ], [ 108.896076, 25.71424 ], [ 108.940423, 25.740119 ], [ 108.963829, 25.732572 ], [ 108.999553, 25.765453 ], [ 108.989698, 25.778926 ], [ 109.048213, 25.790781 ], [ 109.077778, 25.776771 ], [ 109.095024, 25.80533 ], [ 109.143683, 25.795092 ], [ 109.13198, 25.762758 ], [ 109.147995, 25.741736 ], [ 109.206509, 25.788087 ], [ 109.207125, 25.740119 ], [ 109.296436, 25.71424 ], [ 109.340168, 25.731493 ], [ 109.327849, 25.76168 ], [ 109.339552, 25.83442 ], [ 109.359262, 25.836036 ], [ 109.396834, 25.900117 ], [ 109.435022, 25.93349 ], [ 109.408537, 25.967392 ], [ 109.462124, 25.995367 ], [ 109.48245, 26.029788 ], [ 109.513247, 25.998056 ], [ 109.560058, 26.021184 ], [ 109.588391, 26.019571 ], [ 109.635203, 26.047533 ], [ 109.649369, 26.016882 ], [ 109.730057, 25.989988 ], [ 109.710963, 25.954478 ], [ 109.693717, 25.959321 ], [ 109.67955, 25.921649 ], [ 109.685094, 25.880197 ], [ 109.768246, 25.890427 ], [ 109.779333, 25.866196 ], [ 109.811361, 25.877504 ], [ 109.826144, 25.911422 ], [ 109.806434, 25.973848 ], [ 109.782412, 25.996981 ], [ 109.814441, 26.041081 ], [ 109.864332, 26.027637 ], [ 109.898825, 26.095377 ], [ 109.904368, 26.135679 ], [ 109.970274, 26.195301 ], [ 110.03002, 26.166299 ], [ 110.099005, 26.168985 ], [ 110.100853, 26.132455 ], [ 110.065128, 26.050221 ], [ 110.100853, 26.020108 ], [ 110.168606, 26.028713 ], [ 110.181541, 26.060437 ], [ 110.24991, 26.010965 ], [ 110.257301, 25.961473 ], [ 110.325671, 25.975462 ], [ 110.373098, 26.088927 ], [ 110.437772, 26.153945 ], [ 110.477808, 26.179727 ], [ 110.495054, 26.166299 ], [ 110.546793, 26.233421 ], [ 110.552952, 26.283335 ], [ 110.584365, 26.296749 ], [ 110.612083, 26.333764 ], [ 110.643495, 26.308552 ], [ 110.673676, 26.317135 ], [ 110.711249, 26.29192 ], [ 110.742046, 26.313917 ], [ 110.73835, 26.271529 ], [ 110.759292, 26.248451 ], [ 110.836284, 26.255966 ], [ 110.939762, 26.286554 ], [ 110.926212, 26.320354 ], [ 110.944074, 26.326791 ], [ 110.94469, 26.373447 ], [ 110.974255, 26.385778 ], [ 111.008747, 26.35897 ], [ 111.008132, 26.336982 ], [ 111.090667, 26.308016 ], [ 111.208928, 26.30426 ], [ 111.204616, 26.276359 ], [ 111.228022, 26.261333 ], [ 111.277913, 26.272066 ], [ 111.293311, 26.222148 ], [ 111.271754, 26.217316 ], [ 111.274833, 26.183486 ], [ 111.258203, 26.151796 ], [ 111.26621, 26.095914 ], [ 111.244652, 26.078177 ], [ 111.267442, 26.058824 ], [ 111.235413, 26.048071 ], [ 111.189834, 25.953402 ], [ 111.230486, 25.916267 ], [ 111.251428, 25.864581 ], [ 111.29208, 25.854349 ], [ 111.297007, 25.874274 ], [ 111.346282, 25.906577 ], [ 111.376463, 25.906039 ], [ 111.383239, 25.881812 ], [ 111.460231, 25.885042 ], [ 111.4861, 25.859196 ], [ 111.43313, 25.84627 ], [ 111.442369, 25.77192 ], [ 111.399869, 25.744431 ], [ 111.30871, 25.720171 ], [ 111.309942, 25.645203 ], [ 111.343202, 25.602574 ], [ 111.324724, 25.564249 ], [ 111.32842, 25.521592 ], [ 111.300087, 25.44812 ], [ 111.26313, 25.42326 ], [ 111.257587, 25.395691 ], [ 111.210776, 25.363248 ], [ 111.184906, 25.367034 ], [ 111.138711, 25.303748 ], [ 111.103602, 25.285351 ], [ 111.112841, 25.21715 ], [ 110.998892, 25.161371 ], [ 110.98411, 25.101772 ], [ 110.951465, 25.04377 ], [ 110.968711, 24.975434 ], [ 111.009363, 24.921172 ], [ 111.100522, 24.945593 ], [ 111.101754, 25.035095 ], [ 111.139943, 25.042144 ], [ 111.200921, 25.074672 ], [ 111.221862, 25.106649 ], [ 111.274833, 25.151078 ], [ 111.321645, 25.105023 ], [ 111.36784, 25.108817 ], [ 111.375231, 25.128324 ], [ 111.435593, 25.093642 ], [ 111.416499, 25.047566 ], [ 111.467622, 25.02208 ], [ 111.460231, 24.992793 ], [ 111.43313, 24.979774 ], [ 111.434977, 24.951562 ], [ 111.470086, 24.92877 ], [ 111.447296, 24.892947 ], [ 111.449144, 24.857113 ], [ 111.479325, 24.797366 ], [ 111.461463, 24.728894 ], [ 111.431282, 24.687574 ], [ 111.451608, 24.665822 ], [ 111.499035, 24.667997 ], [ 111.526752, 24.637538 ], [ 111.570484, 24.64461 ], [ 111.588962, 24.690837 ], [ 111.641933, 24.684856 ], [ 111.637621, 24.715303 ], [ 111.666571, 24.760961 ], [ 111.708455, 24.788673 ], [ 111.783599, 24.785957 ], [ 111.814396, 24.770199 ], [ 111.868599, 24.771829 ], [ 111.875374, 24.756613 ], [ 111.929577, 24.75607 ], [ 111.951135, 24.769655 ], [ 112.024431, 24.740308 ] ] ], [ [ [ 105.096346, 24.928228 ], [ 105.082179, 24.915745 ], [ 105.077868, 24.918459 ], [ 105.09573, 24.92877 ], [ 105.096346, 24.928228 ] ] ], [ [ [ 109.088249, 21.014934 ], [ 109.088865, 21.031134 ], [ 109.09256, 21.057386 ], [ 109.138756, 21.067439 ], [ 109.144299, 21.041189 ], [ 109.117814, 21.017727 ], [ 109.11227, 21.02499 ], [ 109.088249, 21.014934 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"460000\", \"name\": \"海南省\", \"center\": [ 110.33119, 20.031971 ], \"centroid\": [ 109.754859, 19.189767 ], \"childrenNum\": 19, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 20, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 110.106396, 20.026812 ], [ 110.144585, 20.074598 ], [ 110.243135, 20.077408 ], [ 110.28933, 20.056047 ], [ 110.318279, 20.108882 ], [ 110.387265, 20.113378 ], [ 110.495054, 20.077408 ], [ 110.526467, 20.07516 ], [ 110.562191, 20.110006 ], [ 110.655814, 20.134169 ], [ 110.687843, 20.163947 ], [ 110.717408, 20.148778 ], [ 110.744509, 20.074036 ], [ 110.778386, 20.068415 ], [ 110.808567, 20.035808 ], [ 110.871393, 20.01163 ], [ 110.940994, 20.028499 ], [ 110.966248, 20.018377 ], [ 111.013675, 19.850159 ], [ 111.043856, 19.763448 ], [ 111.071573, 19.628784 ], [ 111.061718, 19.612436 ], [ 111.008747, 19.60398 ], [ 110.920668, 19.552668 ], [ 110.888023, 19.518827 ], [ 110.844292, 19.449996 ], [ 110.787009, 19.399765 ], [ 110.729727, 19.378878 ], [ 110.706321, 19.320153 ], [ 110.676756, 19.286264 ], [ 110.619474, 19.152334 ], [ 110.585597, 18.88075 ], [ 110.590525, 18.838841 ], [ 110.578206, 18.784458 ], [ 110.499366, 18.751592 ], [ 110.499366, 18.651824 ], [ 110.367555, 18.631977 ], [ 110.329366, 18.642185 ], [ 110.246215, 18.609859 ], [ 110.214186, 18.578662 ], [ 110.116867, 18.506602 ], [ 110.090382, 18.399309 ], [ 110.070672, 18.376025 ], [ 110.022629, 18.360121 ], [ 109.919767, 18.375457 ], [ 109.785492, 18.339672 ], [ 109.749767, 18.193618 ], [ 109.726362, 18.177698 ], [ 109.661688, 18.175424 ], [ 109.584696, 18.143579 ], [ 109.527413, 18.169169 ], [ 109.467051, 18.173718 ], [ 109.441182, 18.199303 ], [ 109.355566, 18.215221 ], [ 109.287813, 18.264671 ], [ 109.17448, 18.260125 ], [ 109.138756, 18.268081 ], [ 109.108575, 18.323766 ], [ 109.006329, 18.323198 ], [ 108.944735, 18.314107 ], [ 108.905315, 18.389087 ], [ 108.881293, 18.416344 ], [ 108.776583, 18.441894 ], [ 108.68912, 18.447571 ], [ 108.644772, 18.486738 ], [ 108.641077, 18.565614 ], [ 108.663866, 18.67337 ], [ 108.65278, 18.740258 ], [ 108.593033, 18.809386 ], [ 108.595497, 18.872256 ], [ 108.637997, 18.924346 ], [ 108.630606, 19.003017 ], [ 108.598577, 19.055633 ], [ 108.591186, 19.141592 ], [ 108.609048, 19.276661 ], [ 108.644772, 19.349518 ], [ 108.694047, 19.387346 ], [ 108.765496, 19.400894 ], [ 108.806148, 19.450561 ], [ 108.855424, 19.469182 ], [ 108.92872, 19.524468 ], [ 108.993394, 19.587065 ], [ 109.048829, 19.619764 ], [ 109.093792, 19.68965 ], [ 109.147379, 19.704863 ], [ 109.169553, 19.736411 ], [ 109.159082, 19.79048 ], [ 109.231147, 19.863105 ], [ 109.255784, 19.867045 ], [ 109.25948, 19.898561 ], [ 109.300748, 19.917693 ], [ 109.349407, 19.898561 ], [ 109.411001, 19.895184 ], [ 109.498464, 19.873236 ], [ 109.526797, 19.943573 ], [ 109.585312, 19.98801 ], [ 109.657993, 20.01163 ], [ 109.712195, 20.017253 ], [ 109.76147, 19.981261 ], [ 109.814441, 19.993072 ], [ 109.855093, 19.984073 ], [ 109.898825, 19.994196 ], [ 109.965346, 19.993634 ], [ 109.997375, 19.980136 ], [ 110.042339, 19.991384 ], [ 110.106396, 20.026812 ] ] ], [ [ [ 112.203848648399557, 3.87222818584552 ], [ 112.219068, 3.908969 ], [ 112.260336, 3.917925 ], [ 112.292871092971765, 3.856691249764521 ], [ 112.239961526858096, 3.836535224578359 ], [ 112.203848648399557, 3.87222818584552 ] ] ], [ [ [ 113.266165, 8.125929 ], [ 113.293882, 8.176284 ], [ 113.353628, 8.237887 ], [ 113.354244, 8.304217 ], [ 113.386273, 8.289412 ], [ 113.386273, 8.238479 ], [ 113.349933, 8.172137 ], [ 113.288955, 8.119412 ], [ 113.343157, 8.193463 ], [ 113.311129, 8.177469 ], [ 113.266165, 8.125929 ] ] ], [ [ [ 111.463311, 17.077491 ], [ 111.452224, 17.092936 ], [ 111.542151, 17.11982 ], [ 111.559397, 17.087788 ], [ 111.4861, 17.058039 ], [ 111.536607, 17.104949 ], [ 111.463311, 17.077491 ] ] ], [ [ [ 111.99733, 3.848065 ], [ 112.007327402834477, 3.874747688993791 ], [ 112.033782185891312, 3.88524561877825 ], [ 112.057717465799882, 3.882306198438601 ], [ 112.073707, 3.865979 ], [ 112.064467, 3.830152 ], [ 112.040500860953372, 3.814279613435307 ], [ 112.015192, 3.823583 ], [ 111.99733, 3.848065 ] ] ], [ [ [ 117.69258625690604, 15.174719308985452 ], [ 117.715095, 15.222561 ], [ 117.72659954940768, 15.237286970500829 ], [ 117.748355, 15.230068 ], [ 117.782848, 15.187333 ], [ 117.839977191079839, 15.157922621330318 ], [ 117.845856031759141, 15.138186513335535 ], [ 117.841656859845358, 15.124749163211428 ], [ 117.832838598826413, 15.152043780651022 ], [ 117.777409529564466, 15.172619723028561 ], [ 117.74466, 15.217941 ], [ 117.720638, 15.195418 ], [ 117.72495, 15.131302 ], [ 117.827812, 15.111659 ], [ 117.826959758147112, 15.099974048920105 ], [ 117.726798, 15.105303 ], [ 117.70980286175255, 15.108372392747672 ], [ 117.69258625690604, 15.174719308985452 ] ] ], [ [ [ 112.241858, 3.942404 ], [ 112.243320864389119, 3.968809139862543 ], [ 112.254177, 3.97942 ], [ 112.270195564637334, 3.986445661900434 ], [ 112.290771507014881, 3.980566821221137 ], [ 112.292365, 3.946583 ], [ 112.265156558340792, 3.932696261404004 ], [ 112.241858, 3.942404 ] ] ], [ [ [ 111.734324, 16.19732 ], [ 111.790374, 16.220307 ], [ 111.789758, 16.250186 ], [ 111.716462, 16.249036 ], [ 111.782367, 16.273741 ], [ 111.813164, 16.261676 ], [ 111.81686, 16.224329 ], [ 111.779903, 16.19732 ], [ 111.734324, 16.19732 ] ] ], [ [ [ 113.896887, 7.607204 ], [ 113.921524, 7.639235 ], [ 114.029314, 7.670078 ], [ 114.095219, 7.721082 ], [ 114.211632, 7.786904 ], [ 114.268298, 7.870501 ], [ 114.414892, 7.952895 ], [ 114.47279, 7.968898 ], [ 114.511594, 7.966527 ], [ 114.540543, 7.945783 ], [ 114.555326, 7.891249 ], [ 114.540543, 7.862201 ], [ 114.464167, 7.814771 ], [ 114.419819, 7.765557 ], [ 114.407501, 7.683126 ], [ 114.368696, 7.638642 ], [ 114.289856, 7.617288 ], [ 114.157429, 7.561525 ], [ 114.058879, 7.537794 ], [ 113.98743, 7.536014 ], [ 113.919677, 7.566865 ], [ 113.896887, 7.607204 ] ] ], [ [ [ 111.649324, 16.255931 ], [ 111.681353, 16.262251 ], [ 111.598817, 16.198469 ], [ 111.606825, 16.177779 ], [ 111.690592, 16.211112 ], [ 111.611136, 16.156511 ], [ 111.56802, 16.162834 ], [ 111.577875, 16.208239 ], [ 111.649324, 16.255931 ] ] ], [ [ [ 113.976959, 8.872888 ], [ 113.989894, 8.878801 ], [ 114.041017, 8.843913 ], [ 114.060111, 8.816119 ], [ 114.035473, 8.783591 ], [ 114.013299, 8.836817 ], [ 113.976959, 8.872888 ] ] ], [ [ [ 113.956017, 8.840365 ], [ 113.977575, 8.841548 ], [ 114.012068, 8.798376 ], [ 113.975111, 8.793054 ], [ 113.956017, 8.840365 ] ] ], [ [ [ 112.216604, 8.866383 ], [ 112.180264, 8.862244 ], [ 112.206133, 8.88767 ], [ 112.216604, 8.866383 ] ] ], [ [ [ 111.739251, 16.452898 ], [ 111.765737, 16.495366 ], [ 111.759577, 16.545857 ], [ 111.786679, 16.520039 ], [ 111.766969, 16.470116 ], [ 111.739251, 16.452898 ] ] ], [ [ [ 111.97454, 16.323715 ], [ 112.002874, 16.350707 ], [ 112.047221, 16.360469 ], [ 112.074938, 16.349558 ], [ 112.07617, 16.323715 ], [ 112.002258, 16.306484 ], [ 111.97454, 16.323715 ] ] ], [ [ [ 113.792177, 7.373422 ], [ 113.829134, 7.383511 ], [ 113.828518, 7.362145 ], [ 113.792177, 7.373422 ] ] ], [ [ [ 114.194386, 8.764664 ], [ 114.222103, 8.784773 ], [ 114.248588, 8.724442 ], [ 114.201161, 8.727991 ], [ 114.194386, 8.764664 ] ] ], [ [ [ 112.232619, 16.996239 ], [ 112.266496, 16.993949 ], [ 112.292981, 16.96762 ], [ 112.222764, 16.960751 ], [ 112.207981, 16.987081 ], [ 112.232619, 16.996239 ] ] ], [ [ [ 114.617536, 9.965688 ], [ 114.685905, 9.979245 ], [ 114.672355, 9.927963 ], [ 114.642173, 9.917351 ], [ 114.617536, 9.965688 ] ] ], [ [ [ 115.837712, 9.709775 ], [ 115.870972, 9.778785 ], [ 115.901153, 9.795888 ], [ 115.925791, 9.781734 ], [ 115.901153, 9.67084 ], [ 115.867277, 9.650191 ], [ 115.861117, 9.694438 ], [ 115.837712, 9.709775 ] ] ], [ [ [ 114.689601, 10.345648 ], [ 114.717318, 10.380381 ], [ 114.747499, 10.37214 ], [ 114.725941, 10.319154 ], [ 114.702536, 10.312677 ], [ 114.689601, 10.345648 ] ] ], [ [ [ 113.769387, 7.636862 ], [ 113.831597, 7.644573 ], [ 113.814967, 7.603051 ], [ 113.773699, 7.601865 ], [ 113.769387, 7.636862 ] ] ], [ [ [ 109.463972, 7.344339 ], [ 109.536037, 7.448792 ], [ 109.653065, 7.559745 ], [ 109.72205, 7.575763 ], [ 109.816289, 7.572797 ], [ 109.904984, 7.55144 ], [ 109.948716, 7.522962 ], [ 109.938861, 7.504569 ], [ 109.791651, 7.524742 ], [ 109.709115, 7.511095 ], [ 109.654297, 7.479648 ], [ 109.571761, 7.373422 ], [ 109.513247, 7.320002 ], [ 109.463972, 7.315254 ], [ 109.463972, 7.344339 ] ] ], [ [ [ 116.273181, 8.879392 ], [ 116.305826, 8.917233 ], [ 116.332311, 8.901269 ], [ 116.294123, 8.858105 ], [ 116.273181, 8.879392 ] ] ], [ [ [ 112.476531, 16.001247 ], [ 112.448814, 16.005274 ], [ 112.462364, 16.043813 ], [ 112.588016, 16.070844 ], [ 112.612037, 16.039212 ], [ 112.570154, 16.011027 ], [ 112.476531, 16.001247 ] ] ], [ [ [ 112.537509, 8.846278 ], [ 112.598487, 8.859288 ], [ 112.639755, 8.818484 ], [ 112.57077, 8.815527 ], [ 112.537509, 8.846278 ] ] ], [ [ [ 114.469095, 10.836261 ], [ 114.55471, 10.900911 ], [ 114.587355, 10.909138 ], [ 114.593514, 10.856245 ], [ 114.565181, 10.836261 ], [ 114.513442, 10.848605 ], [ 114.475254, 10.814512 ], [ 114.469095, 10.836261 ] ] ], [ [ [ 112.409393, 16.294996 ], [ 112.509176, 16.317397 ], [ 112.536893, 16.312228 ], [ 112.531349, 16.285805 ], [ 112.475915, 16.288677 ], [ 112.411241, 16.2634 ], [ 112.383524, 16.265698 ], [ 112.409393, 16.294996 ] ] ], [ [ [ 112.349031, 16.912088 ], [ 112.30222, 16.963041 ], [ 112.334249, 16.962469 ], [ 112.360734, 16.925257 ], [ 112.349031, 16.912088 ] ] ], [ [ [ 111.500267, 16.45175 ], [ 111.538455, 16.461507 ], [ 111.545847, 16.43453 ], [ 111.49534, 16.4374 ], [ 111.500267, 16.45175 ] ] ], [ [ [ 115.500177, 9.897897 ], [ 115.518039, 9.933857 ], [ 115.581481, 9.917351 ], [ 115.585177, 9.896128 ], [ 115.54822, 9.869007 ], [ 115.500177, 9.897897 ] ] ], [ [ [ 116.48876, 10.395686 ], [ 116.526332, 10.426883 ], [ 116.542346, 10.41982 ], [ 116.514629, 10.34918 ], [ 116.637817, 10.365076 ], [ 116.644592, 10.335051 ], [ 116.566368, 10.304434 ], [ 116.511549, 10.297957 ], [ 116.467202, 10.309144 ], [ 116.461658, 10.34918 ], [ 116.48876, 10.395686 ] ] ], [ [ [ 114.669891, 8.210048 ], [ 114.726557, 8.21064 ], [ 114.74134, 8.189316 ], [ 114.691449, 8.18517 ], [ 114.669891, 8.210048 ] ] ], [ [ [ 114.507899, 8.120004 ], [ 114.595978, 8.15792 ], [ 114.624311, 8.149626 ], [ 114.595978, 8.120596 ], [ 114.530073, 8.103415 ], [ 114.507899, 8.120004 ] ] ], [ [ [ 115.16757, 8.386523 ], [ 115.202678, 8.395403 ], [ 115.299381, 8.370537 ], [ 115.315395, 8.356326 ], [ 115.285214, 8.314876 ], [ 115.235939, 8.321982 ], [ 115.18112, 8.345668 ], [ 115.16757, 8.386523 ] ] ], [ [ [ 113.895039, 8.00505 ], [ 113.940003, 8.018088 ], [ 113.969568, 7.974825 ], [ 113.9708, 7.944597 ], [ 113.904894, 7.963564 ], [ 113.895039, 8.00505 ] ] ], [ [ [ 115.436119, 9.393447 ], [ 115.456445, 9.417064 ], [ 115.469996, 9.3592 ], [ 115.450286, 9.345028 ], [ 115.436119, 9.393447 ] ] ], [ [ [ 113.638192, 8.976942 ], [ 113.644968, 8.989355 ], [ 113.719496, 9.020092 ], [ 113.730583, 9.004133 ], [ 113.654823, 8.962163 ], [ 113.638192, 8.976942 ] ] ], [ [ [ 116.457347, 9.174326 ], [ 116.500462, 9.164282 ], [ 116.477057, 9.137103 ], [ 116.457347, 9.174326 ] ] ], [ [ [ 114.910723, 10.863298 ], [ 114.934129, 10.902674 ], [ 114.959998, 10.902087 ], [ 114.931049, 10.841551 ], [ 114.910723, 10.863298 ] ] ], [ [ [ 113.939387, 8.875253 ], [ 113.916597, 8.837999 ], [ 113.893807, 8.862836 ], [ 113.912285, 8.888853 ], [ 113.939387, 8.875253 ] ] ], [ [ [ 114.696992, 11.004322 ], [ 114.710543, 11.039567 ], [ 114.766593, 11.110045 ], [ 114.799854, 11.10476 ], [ 114.793079, 11.07657 ], [ 114.710543, 11.001972 ], [ 114.696992, 11.004322 ] ] ], [ [ [ 111.572948, 16.470116 ], [ 111.592658, 16.490775 ], [ 111.614216, 16.44027 ], [ 111.578491, 16.447158 ], [ 111.572948, 16.470116 ] ] ], [ [ [ 114.62, 11.432264 ], [ 114.621232, 11.518479 ], [ 114.661884, 11.522584 ], [ 114.652644, 11.436957 ], [ 114.62, 11.432264 ] ] ], [ [ [ 109.936397, 7.848566 ], [ 109.953027, 7.888878 ], [ 110.0331, 7.944597 ], [ 110.078063, 7.949339 ], [ 110.082991, 7.896584 ], [ 110.050346, 7.846194 ], [ 109.988136, 7.8124 ], [ 109.936397, 7.823665 ], [ 109.936397, 7.848566 ] ] ], [ [ [ 116.727128, 11.501473 ], [ 116.738215, 11.514961 ], [ 116.772092, 11.445755 ], [ 116.765316, 11.430504 ], [ 116.727128, 11.501473 ] ] ], [ [ [ 111.761425, 16.061642 ], [ 111.829795, 16.070844 ], [ 111.828563, 16.049565 ], [ 111.791606, 16.028859 ], [ 111.761425, 16.061642 ] ] ], [ [ [ 113.845764, 10.018733 ], [ 113.856851, 10.12185 ], [ 113.872249, 10.123029 ], [ 113.865474, 10.00341 ], [ 113.845764, 10.018733 ] ] ], [ [ [ 111.690592, 16.587731 ], [ 111.717078, 16.59404 ], [ 111.724469, 16.560198 ], [ 111.690592, 16.587731 ] ] ], [ [ [ 112.507328, 16.466098 ], [ 112.499321, 16.493645 ], [ 112.575081, 16.537251 ], [ 112.586784, 16.525777 ], [ 112.507328, 16.466098 ] ] ], [ [ [ 114.791847, 8.160882 ], [ 114.818332, 8.141332 ], [ 114.812173, 8.110524 ], [ 114.777064, 8.114079 ], [ 114.791847, 8.160882 ] ] ], [ [ [ 116.557129, 9.745167 ], [ 116.593469, 9.723932 ], [ 116.566368, 9.718623 ], [ 116.557129, 9.745167 ] ] ], [ [ [ 116.832454, 10.476908 ], [ 116.868794, 10.495739 ], [ 116.855243, 10.468669 ], [ 116.832454, 10.476908 ] ] ], [ [ [ 114.703151, 16.170307 ], [ 114.704383, 16.199044 ], [ 114.802934, 16.215135 ], [ 114.816484, 16.198469 ], [ 114.703151, 16.170307 ] ] ], [ [ [ 115.28275, 10.191951 ], [ 115.28891, 10.211388 ], [ 115.333257, 10.200198 ], [ 115.288294, 10.172513 ], [ 115.28275, 10.191951 ] ] ], [ [ [ 115.97753, 9.321997 ], [ 115.999088, 9.293649 ], [ 115.976298, 9.268252 ], [ 115.943037, 9.269433 ], [ 115.926407, 9.311366 ], [ 115.97753, 9.321997 ] ] ], [ [ [ 113.660366, 9.231039 ], [ 113.697323, 9.225722 ], [ 113.676997, 9.202683 ], [ 113.660366, 9.231039 ] ] ], [ [ [ 114.665579, 7.590001 ], [ 114.703767, 7.614915 ], [ 114.72163, 7.59178 ], [ 114.671739, 7.563898 ], [ 114.665579, 7.590001 ] ] ], [ [ [ 117.770529, 10.773361 ], [ 117.775457, 10.809222 ], [ 117.801942, 10.839788 ], [ 117.831507, 10.838612 ], [ 117.835819, 10.803931 ], [ 117.798862, 10.753371 ], [ 117.770529, 10.773361 ] ] ], [ [ [ 114.242429, 10.242014 ], [ 114.265219, 10.275581 ], [ 114.312646, 10.300901 ], [ 114.326197, 10.284414 ], [ 114.263371, 10.239658 ], [ 114.242429, 10.242014 ] ] ], [ [ [ 114.688985, 11.469217 ], [ 114.720398, 11.49209 ], [ 114.737644, 11.463938 ], [ 114.722246, 11.429331 ], [ 114.688985, 11.469217 ] ] ], [ [ [ 116.638433, 10.503977 ], [ 116.699411, 10.517511 ], [ 116.70865, 10.492797 ], [ 116.653215, 10.491031 ], [ 116.638433, 10.503977 ] ] ], [ [ [ 110.459946, 8.116449 ], [ 110.461793, 8.128298 ], [ 110.568351, 8.17273 ], [ 110.599764, 8.156735 ], [ 110.554184, 8.093935 ], [ 110.471032, 8.072012 ], [ 110.459946, 8.116449 ] ] ], [ [ [ 111.463311, 8.52504 ], [ 111.509506, 8.550489 ], [ 111.497187, 8.523857 ], [ 111.463311, 8.52504 ] ] ], [ [ [ 114.493116, 10.717504 ], [ 114.539312, 10.793349 ], [ 114.562717, 10.778064 ], [ 114.513442, 10.722208 ], [ 114.493116, 10.717504 ] ] ], [ [ [ 113.221817, 8.073789 ], [ 113.269861, 8.120004 ], [ 113.283411, 8.111117 ], [ 113.235984, 8.068456 ], [ 113.221817, 8.073789 ] ] ], [ [ [ 115.258113, 8.509652 ], [ 115.296301, 8.510836 ], [ 115.271048, 8.477098 ], [ 115.258113, 8.509652 ] ] ], [ [ [ 111.539071, 7.54432 ], [ 111.566788, 7.606017 ], [ 111.612368, 7.592374 ], [ 111.583419, 7.543134 ], [ 111.542767, 7.524742 ], [ 111.539071, 7.54432 ] ] ], [ [ [ 117.258068, 10.320331 ], [ 117.274698, 10.358011 ], [ 117.299952, 10.343293 ], [ 117.299336, 10.313855 ], [ 117.258068, 10.320331 ] ] ], [ [ [ 114.074893, 10.929118 ], [ 114.096451, 10.947921 ], [ 114.110002, 10.918541 ], [ 114.064422, 10.904437 ], [ 114.074893, 10.929118 ] ] ], [ [ [ 114.212864, 16.040937 ], [ 114.268914, 16.059342 ], [ 114.306487, 16.057616 ], [ 114.31203, 16.034611 ], [ 114.212864, 16.040937 ] ] ], [ [ [ 110.609003, 8.010976 ], [ 110.622553, 8.041199 ], [ 110.641648, 8.031125 ], [ 110.642879, 7.989049 ], [ 110.609003, 8.010976 ] ] ], [ [ [ 115.509416, 8.490712 ], [ 115.514344, 8.519122 ], [ 115.558691, 8.523265 ], [ 115.569162, 8.49012 ], [ 115.55438, 8.461115 ], [ 115.521735, 8.460523 ], [ 115.509416, 8.490712 ] ] ], [ [ [ 111.657947, 8.672974 ], [ 111.697368, 8.67889 ], [ 111.717694, 8.6499 ], [ 111.665955, 8.622683 ], [ 111.657947, 8.672974 ] ] ], [ [ [ 110.460561, 7.799948 ], [ 110.485199, 7.827815 ], [ 110.511684, 7.805878 ], [ 110.487663, 7.783346 ], [ 110.460561, 7.799948 ] ] ], [ [ [ 112.345952, 8.926101 ], [ 112.384756, 8.946793 ], [ 112.392763, 8.919598 ], [ 112.345952, 8.926101 ] ] ], [ [ [ 116.469665, 9.810041 ], [ 116.490607, 9.821246 ], [ 116.50847, 9.79117 ], [ 116.47952, 9.785272 ], [ 116.469665, 9.810041 ] ] ], [ [ [ 111.925265, 8.070827 ], [ 111.95483, 8.106377 ], [ 112.013344, 8.093342 ], [ 112.018888, 8.065494 ], [ 111.994866, 8.047125 ], [ 111.949287, 8.05068 ], [ 111.925265, 8.070827 ] ] ], [ [ [ 114.457392, 15.599305 ], [ 114.491884, 15.59354 ], [ 114.466631, 15.576823 ], [ 114.457392, 15.599305 ] ] ], [ [ [ 114.985252, 11.078332 ], [ 115.021592, 11.085967 ], [ 115.013585, 11.063062 ], [ 114.985252, 11.078332 ] ] ], [ [ [ 114.10569, 16.004124 ], [ 114.132176, 16.007575 ], [ 114.110618, 15.978235 ], [ 114.10569, 16.004124 ] ] ], [ [ [ 116.045283, 10.095338 ], [ 116.070537, 10.12892 ], [ 116.09579, 10.09357 ], [ 116.067457, 10.065876 ], [ 116.045283, 10.095338 ] ] ], [ [ [ 117.266691, 10.69163 ], [ 117.293176, 10.735144 ], [ 117.369553, 10.7422 ], [ 117.418212, 10.702803 ], [ 117.404661, 10.671047 ], [ 117.348611, 10.672811 ], [ 117.266691, 10.69163 ] ] ], [ [ [ 114.854057, 7.244611 ], [ 114.869455, 7.198895 ], [ 114.819564, 7.192957 ], [ 114.854057, 7.244611 ] ] ], [ [ [ 112.823305, 8.910729 ], [ 112.873196, 8.908364 ], [ 112.859645, 8.889444 ], [ 112.823305, 8.910729 ] ] ], [ [ [ 111.670266, 7.651098 ], [ 111.691208, 7.711593 ], [ 111.726317, 7.729977 ], [ 111.749722, 7.703884 ], [ 111.707223, 7.648725 ], [ 111.670266, 7.651098 ] ] ], [ [ [ 112.207981, 8.835634 ], [ 112.241242, 8.852783 ], [ 112.235699, 8.827355 ], [ 112.207981, 8.835634 ] ] ], [ [ [ 112.527654, 5.79444 ], [ 112.562146, 5.820637 ], [ 112.562762, 5.75931 ], [ 112.531965, 5.766455 ], [ 112.527654, 5.79444 ] ] ], [ [ [ 114.599058, 8.846278 ], [ 114.61692, 8.881166 ], [ 114.665579, 8.900087 ], [ 114.68221, 8.881166 ], [ 114.645869, 8.844504 ], [ 114.599058, 8.846278 ] ] ], [ [ [ 114.868223, 7.983715 ], [ 114.883006, 8.011569 ], [ 114.914419, 8.00742 ], [ 114.907643, 7.951117 ], [ 114.868223, 7.983715 ] ] ], [ [ [ 112.945261, 8.410204 ], [ 112.949572, 8.432701 ], [ 112.985297, 8.429149 ], [ 112.945261, 8.410204 ] ] ], [ [ [ 113.600004, 6.961929 ], [ 113.62341, 6.942325 ], [ 113.580294, 6.920344 ], [ 113.600004, 6.961929 ] ] ], [ [ [ 117.347995, 10.090624 ], [ 117.373864, 10.106532 ], [ 117.385567, 10.063519 ], [ 117.354154, 10.06293 ], [ 117.347995, 10.090624 ] ] ], [ [ [ 112.993304, 19.472003 ], [ 112.980369, 19.496263 ], [ 112.993304, 19.52616 ], [ 113.029028, 19.52898 ], [ 113.048123, 19.506417 ], [ 113.038883, 19.480466 ], [ 112.993304, 19.472003 ] ] ], [ [ [ 114.448153, 16.034035 ], [ 114.465399, 16.067393 ], [ 114.521449, 16.056466 ], [ 114.485109, 16.034611 ], [ 114.448153, 16.034035 ] ] ], [ [ [ 113.832213, 19.158552 ], [ 113.799568, 19.19925 ], [ 113.80696, 19.222986 ], [ 113.875945, 19.237113 ], [ 113.920293, 19.223551 ], [ 113.914749, 19.172119 ], [ 113.874097, 19.151203 ], [ 113.832213, 19.158552 ] ] ], [ [ [ 112.650842, 5.106941 ], [ 112.678559, 5.121247 ], [ 112.719211, 5.075944 ], [ 112.682871, 5.048522 ], [ 112.655769, 5.055676 ], [ 112.650842, 5.106941 ] ] ], [ [ [ 111.638853, 7.907254 ], [ 111.651788, 7.932743 ], [ 111.713382, 7.927408 ], [ 111.712766, 7.887099 ], [ 111.665339, 7.887099 ], [ 111.638853, 7.907254 ] ] ], [ [ [ 112.244322, 8.874662 ], [ 112.288669, 8.885896 ], [ 112.281278, 8.855148 ], [ 112.244322, 8.874662 ] ] ], [ [ [ 112.89229, 7.844416 ], [ 112.93171, 7.867537 ], [ 112.929862, 7.827815 ], [ 112.89229, 7.844416 ] ] ], [ [ [ 112.583088, 5.56159 ], [ 112.616349, 5.568737 ], [ 112.642834, 5.489512 ], [ 112.614501, 5.465683 ], [ 112.606494, 5.51751 ], [ 112.583088, 5.56159 ] ] ], [ [ [ 116.695099, 16.345538 ], [ 116.717889, 16.373676 ], [ 116.747454, 16.360469 ], [ 116.738831, 16.303612 ], [ 116.708034, 16.299591 ], [ 116.695099, 16.345538 ] ] ], [ [ [ 112.523342, 5.656289 ], [ 112.528886, 5.687257 ], [ 112.56153, 5.677133 ], [ 112.565842, 5.63068 ], [ 112.5449, 5.616386 ], [ 112.523342, 5.656289 ] ] ], [ [ [ 112.907072, 4.993079 ], [ 112.910768, 5.038388 ], [ 112.952652, 5.047926 ], [ 112.943413, 4.991887 ], [ 112.907072, 4.993079 ] ] ], [ [ [ 115.361591, 13.948985 ], [ 115.377605, 13.968732 ], [ 115.423185, 13.977443 ], [ 115.438583, 13.943757 ], [ 115.397315, 13.92517 ], [ 115.361591, 13.948985 ] ] ], [ [ [ 113.860546, 15.477068 ], [ 113.890112, 15.490909 ], [ 113.893807, 15.463802 ], [ 113.860546, 15.477068 ] ] ], [ [ [ 113.596924, 10.240836 ], [ 113.638192, 10.243192 ], [ 113.617866, 10.22199 ], [ 113.596924, 10.240836 ] ] ], [ [ [ 112.557219, 5.109326 ], [ 112.601567, 5.120055 ], [ 112.610806, 5.091443 ], [ 112.568922, 5.071771 ], [ 112.557219, 5.109326 ] ] ], [ [ [ 112.350263, 5.621747 ], [ 112.385372, 5.643187 ], [ 112.385988, 5.615791 ], [ 112.350263, 5.621747 ] ] ], [ [ [ 112.226459, 16.759147 ], [ 112.211061, 16.795819 ], [ 112.262184, 16.778057 ], [ 112.254177, 16.751698 ], [ 112.226459, 16.759147 ] ] ], [ [ [ 112.233851, 15.69612 ], [ 112.20367, 15.71398 ], [ 112.240626, 15.741055 ], [ 112.25972, 15.734718 ], [ 112.233851, 15.69612 ] ] ], [ [ [ 112.612037, 5.367973 ], [ 112.62374, 5.401935 ], [ 112.690878, 5.406702 ], [ 112.685334, 5.371548 ], [ 112.640371, 5.347715 ], [ 112.612037, 5.367973 ] ] ], [ [ [ 112.472219, 5.73966 ], [ 112.498089, 5.775387 ], [ 112.496857, 5.736683 ], [ 112.472219, 5.73966 ] ] ], [ [ [ 113.217506, 6.306249 ], [ 113.243991, 6.325878 ], [ 113.230441, 6.285429 ], [ 113.217506, 6.306249 ] ] ], [ [ [ 116.152457, 9.579384 ], [ 116.187565, 9.595317 ], [ 116.189413, 9.565221 ], [ 116.152457, 9.579384 ] ] ], [ [ [ 114.948911, 7.508722 ], [ 115.013585, 7.525928 ], [ 115.012353, 7.484988 ], [ 114.960614, 7.484988 ], [ 114.948911, 7.508722 ] ] ], [ [ [ 111.553854, 7.807656 ], [ 111.603745, 7.861608 ], [ 111.619759, 7.840265 ], [ 111.585267, 7.771487 ], [ 111.553854, 7.807656 ] ] ], [ [ [ 113.938771, 15.8355 ], [ 113.9708, 15.83953 ], [ 113.973263, 15.805558 ], [ 113.938771, 15.8355 ] ] ], [ [ [ 114.926122, 16.036911 ], [ 114.910723, 16.001823 ], [ 114.895325, 16.036336 ], [ 114.926122, 16.036911 ] ] ], [ [ [ 116.749302, 9.056736 ], [ 116.740679, 9.028367 ], [ 116.70865, 9.024229 ], [ 116.699411, 9.049053 ], [ 116.749302, 9.056736 ] ] ], [ [ [ 112.64653, 16.385733 ], [ 112.660081, 16.426494 ], [ 112.681639, 16.400661 ], [ 112.64653, 16.385733 ] ] ], [ [ [ 111.203384, 19.92557 ], [ 111.204, 19.926132 ], [ 111.204, 19.92557 ], [ 111.203384, 19.925007 ], [ 111.203384, 19.92557 ] ] ], [ [ [ 115.758256, 10.461018 ], [ 115.801987, 10.463372 ], [ 115.776118, 10.434534 ], [ 115.758256, 10.461018 ] ] ], [ [ [ 112.671784, 16.331755 ], [ 112.677943, 16.35932 ], [ 112.701349, 16.331755 ], [ 112.671784, 16.331755 ] ] ], [ [ [ 115.782277, 10.541046 ], [ 115.805067, 10.524571 ], [ 115.795212, 10.499858 ], [ 115.782277, 10.541046 ] ] ], [ [ [ 112.512255, 9.544566 ], [ 112.567074, 9.554008 ], [ 112.568922, 9.516826 ], [ 112.50856, 9.525679 ], [ 112.512255, 9.544566 ] ] ], [ [ [ 117.21372, 10.735144 ], [ 117.206945, 10.707507 ], [ 117.187235, 10.741612 ], [ 117.21372, 10.735144 ] ] ], [ [ [ 114.610145, 15.649447 ], [ 114.610761, 15.615444 ], [ 114.581195, 15.625242 ], [ 114.610145, 15.649447 ] ] ], [ [ [ 117.299336, 11.077745 ], [ 117.304263, 11.027232 ], [ 117.284553, 11.02547 ], [ 117.264227, 11.063062 ], [ 117.299336, 11.077745 ] ] ], [ [ [ 117.691073, 11.048965 ], [ 117.690457, 11.016658 ], [ 117.655965, 11.024882 ], [ 117.653501, 11.046029 ], [ 117.691073, 11.048965 ] ] ], [ [ [ 114.166668, 9.38459 ], [ 114.194386, 9.391676 ], [ 114.195617, 9.350933 ], [ 114.175291, 9.342075 ], [ 114.166668, 9.38459 ] ] ], [ [ [ 114.714854, 9.736909 ], [ 114.704999, 9.700337 ], [ 114.680978, 9.707416 ], [ 114.693296, 9.741038 ], [ 114.714854, 9.736909 ] ] ], [ [ [ 112.554139, 5.97839 ], [ 112.575697, 5.971247 ], [ 112.553523, 5.942676 ], [ 112.554139, 5.97839 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"500000\", \"name\": \"重庆市\", \"center\": [ 106.504962, 29.533155 ], \"centroid\": [ 107.883899, 30.067297 ], \"childrenNum\": 38, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 21, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 106.37442, 28.525742 ], [ 106.33192, 28.55308 ], [ 106.346703, 28.583565 ], [ 106.304203, 28.64976 ], [ 106.305435, 28.704365 ], [ 106.27279, 28.741103 ], [ 106.267863, 28.779402 ], [ 106.245689, 28.817686 ], [ 106.264783, 28.845997 ], [ 106.206885, 28.904691 ], [ 106.173008, 28.920407 ], [ 106.14837, 28.901548 ], [ 106.101559, 28.898928 ], [ 106.070762, 28.919884 ], [ 106.049204, 28.906263 ], [ 106.040581, 28.955498 ], [ 106.001161, 28.973824 ], [ 105.969132, 28.965971 ], [ 105.910002, 28.920407 ], [ 105.852719, 28.927217 ], [ 105.830546, 28.944501 ], [ 105.797285, 28.936121 ], [ 105.801596, 28.958116 ], [ 105.762176, 28.9911 ], [ 105.766488, 29.013607 ], [ 105.74185, 29.039249 ], [ 105.757865, 29.069068 ], [ 105.728916, 29.1062 ], [ 105.752321, 29.129727 ], [ 105.728916, 29.134432 ], [ 105.703662, 29.176766 ], [ 105.712285, 29.219082 ], [ 105.695039, 29.287482 ], [ 105.647612, 29.253027 ], [ 105.631597, 29.280174 ], [ 105.557684, 29.278608 ], [ 105.521344, 29.264513 ], [ 105.513337, 29.283306 ], [ 105.459134, 29.288526 ], [ 105.465294, 29.322969 ], [ 105.42033, 29.31149 ], [ 105.418482, 29.352185 ], [ 105.441888, 29.400686 ], [ 105.426489, 29.419454 ], [ 105.372903, 29.421018 ], [ 105.387069, 29.455416 ], [ 105.387069, 29.455416 ], [ 105.334099, 29.441345 ], [ 105.337794, 29.459064 ], [ 105.305149, 29.53199 ], [ 105.296526, 29.571035 ], [ 105.332867, 29.592374 ], [ 105.347649, 29.621512 ], [ 105.38091, 29.628275 ], [ 105.419714, 29.688082 ], [ 105.476996, 29.674564 ], [ 105.481924, 29.718232 ], [ 105.529351, 29.707836 ], [ 105.574931, 29.744216 ], [ 105.582938, 29.819013 ], [ 105.610655, 29.837184 ], [ 105.707974, 29.840818 ], [ 105.738771, 29.891159 ], [ 105.717213, 29.893753 ], [ 105.70243, 29.924879 ], [ 105.730763, 29.95755 ], [ 105.723372, 29.975177 ], [ 105.753553, 30.018196 ], [ 105.719677, 30.042548 ], [ 105.687032, 30.038922 ], [ 105.676561, 30.06793 ], [ 105.638988, 30.076216 ], [ 105.642068, 30.101072 ], [ 105.582938, 30.12385 ], [ 105.582938, 30.127474 ], [ 105.580474, 30.129544 ], [ 105.574315, 30.130579 ], [ 105.596489, 30.159043 ], [ 105.536127, 30.152834 ], [ 105.550909, 30.179222 ], [ 105.56138, 30.183878 ], [ 105.642684, 30.186464 ], [ 105.662394, 30.210258 ], [ 105.619894, 30.234045 ], [ 105.624822, 30.275918 ], [ 105.670401, 30.254208 ], [ 105.720292, 30.252657 ], [ 105.720292, 30.252657 ], [ 105.714749, 30.322939 ], [ 105.754785, 30.342567 ], [ 105.760329, 30.384393 ], [ 105.792357, 30.427234 ], [ 105.825618, 30.436006 ], [ 105.84656, 30.410203 ], [ 105.900763, 30.405042 ], [ 105.943263, 30.372002 ], [ 106.031958, 30.373551 ], [ 106.07261, 30.333786 ], [ 106.132972, 30.30279 ], [ 106.132356, 30.323972 ], [ 106.168696, 30.303823 ], [ 106.180399, 30.233011 ], [ 106.232754, 30.185947 ], [ 106.260471, 30.19681 ], [ 106.264167, 30.20974 ], [ 106.296196, 30.205603 ], [ 106.306667, 30.238182 ], [ 106.334384, 30.225772 ], [ 106.349167, 30.24542 ], [ 106.401521, 30.242318 ], [ 106.428623, 30.254725 ], [ 106.43971, 30.308473 ], [ 106.49884, 30.295556 ], [ 106.545035, 30.296589 ], [ 106.560434, 30.31519 ], [ 106.611557, 30.292455 ], [ 106.642354, 30.246454 ], [ 106.612789, 30.235596 ], [ 106.612789, 30.235596 ], [ 106.612173, 30.235596 ], [ 106.612173, 30.235596 ], [ 106.611557, 30.235596 ], [ 106.612173, 30.235596 ], [ 106.611557, 30.235596 ], [ 106.631883, 30.186464 ], [ 106.677462, 30.156974 ], [ 106.672535, 30.122297 ], [ 106.700252, 30.111944 ], [ 106.699636, 30.074145 ], [ 106.724274, 30.058607 ], [ 106.732281, 30.027005 ], [ 106.785252, 30.01716 ], [ 106.825904, 30.03115 ], [ 106.825904, 30.03115 ], [ 106.83699, 30.049801 ], [ 106.862244, 30.033223 ], [ 106.913367, 30.025451 ], [ 106.94478, 30.037367 ], [ 106.976193, 30.083467 ], [ 106.981736, 30.08502 ], [ 107.02054, 30.036849 ], [ 107.053801, 30.043584 ], [ 107.054417, 30.040994 ], [ 107.055649, 30.040476 ], [ 107.058113, 30.043066 ], [ 107.084598, 30.063786 ], [ 107.080286, 30.094341 ], [ 107.103076, 30.090198 ], [ 107.221337, 30.213878 ], [ 107.257677, 30.267131 ], [ 107.288474, 30.337402 ], [ 107.338981, 30.386459 ], [ 107.368546, 30.468508 ], [ 107.408582, 30.521623 ], [ 107.443075, 30.53348 ], [ 107.427676, 30.547397 ], [ 107.485575, 30.598408 ], [ 107.516987, 30.644759 ], [ 107.477567, 30.664837 ], [ 107.458473, 30.704981 ], [ 107.424597, 30.74048 ], [ 107.454162, 30.771851 ], [ 107.454162, 30.771851 ], [ 107.498509, 30.809381 ], [ 107.483111, 30.838675 ], [ 107.515756, 30.854603 ], [ 107.57735, 30.847924 ], [ 107.645103, 30.821202 ], [ 107.693146, 30.875665 ], [ 107.739957, 30.884396 ], [ 107.760899, 30.862823 ], [ 107.763979, 30.817091 ], [ 107.788001, 30.81966 ], [ 107.851443, 30.792931 ], [ 107.956152, 30.882855 ], [ 107.994956, 30.908533 ], [ 107.948145, 30.918802 ], [ 107.942602, 30.989114 ], [ 107.983254, 30.983983 ], [ 108.00358, 31.025533 ], [ 108.060246, 31.052197 ], [ 108.026985, 31.061938 ], [ 108.009123, 31.109602 ], [ 108.025753, 31.116263 ], [ 108.089811, 31.204859 ], [ 108.07626, 31.231985 ], [ 108.031297, 31.217144 ], [ 108.038688, 31.252964 ], [ 108.095354, 31.268311 ], [ 108.185898, 31.336831 ], [ 108.153869, 31.371073 ], [ 108.216079, 31.41041 ], [ 108.224086, 31.464024 ], [ 108.193289, 31.467598 ], [ 108.191441, 31.492096 ], [ 108.233941, 31.506894 ], [ 108.254883, 31.49873 ], [ 108.344194, 31.512506 ], [ 108.34789, 31.545664 ], [ 108.386078, 31.544134 ], [ 108.390389, 31.591555 ], [ 108.442744, 31.633856 ], [ 108.468614, 31.636404 ], [ 108.519121, 31.665952 ], [ 108.546838, 31.665442 ], [ 108.514809, 31.693963 ], [ 108.50557, 31.734182 ], [ 108.535135, 31.757592 ], [ 108.462454, 31.780488 ], [ 108.455063, 31.814059 ], [ 108.429194, 31.809482 ], [ 108.391005, 31.829822 ], [ 108.386078, 31.854226 ], [ 108.343578, 31.860834 ], [ 108.259194, 31.967006 ], [ 108.307238, 31.997463 ], [ 108.351585, 31.971575 ], [ 108.370063, 31.988835 ], [ 108.329411, 32.020299 ], [ 108.362056, 32.035521 ], [ 108.344194, 32.067477 ], [ 108.372527, 32.077112 ], [ 108.42981, 32.061391 ], [ 108.452599, 32.090296 ], [ 108.399628, 32.147065 ], [ 108.379303, 32.153652 ], [ 108.379303, 32.153652 ], [ 108.379918, 32.154158 ], [ 108.379918, 32.154158 ], [ 108.370063, 32.172397 ], [ 108.399013, 32.194176 ], [ 108.480317, 32.182527 ], [ 108.509882, 32.201266 ], [ 108.543758, 32.177969 ], [ 108.585026, 32.17189 ], [ 108.676801, 32.10297 ], [ 108.734084, 32.106519 ], [ 108.75133, 32.076098 ], [ 108.78767, 32.04871 ], [ 108.837561, 32.039072 ], [ 108.902235, 31.984774 ], [ 108.986619, 31.980205 ], [ 109.085785, 31.929428 ], [ 109.123357, 31.892851 ], [ 109.191111, 31.85575 ], [ 109.195422, 31.817618 ], [ 109.27611, 31.79931 ], [ 109.279806, 31.776418 ], [ 109.253936, 31.759628 ], [ 109.282885, 31.743343 ], [ 109.281654, 31.716874 ], [ 109.381436, 31.705165 ], [ 109.446109, 31.722983 ], [ 109.502776, 31.716365 ], [ 109.549587, 31.73011 ], [ 109.585928, 31.726546 ], [ 109.622268, 31.711783 ], [ 109.683246, 31.719929 ], [ 109.731289, 31.700582 ], [ 109.737449, 31.628761 ], [ 109.76455, 31.602769 ], [ 109.745456, 31.598182 ], [ 109.727594, 31.548214 ], [ 109.837847, 31.555354 ], [ 109.894513, 31.519139 ], [ 109.969658, 31.508935 ], [ 109.94502, 31.47066 ], [ 109.98752, 31.474744 ], [ 110.036795, 31.436966 ], [ 110.054042, 31.410921 ], [ 110.118715, 31.409899 ], [ 110.161831, 31.314338 ], [ 110.155671, 31.279564 ], [ 110.180309, 31.179774 ], [ 110.200019, 31.158779 ], [ 110.180309, 31.121899 ], [ 110.147048, 31.116776 ], [ 110.119947, 31.088592 ], [ 110.120563, 31.0322 ], [ 110.140273, 31.030661 ], [ 110.140889, 30.987062 ], [ 110.172918, 30.978853 ], [ 110.153824, 30.953708 ], [ 110.151976, 30.911613 ], [ 110.082375, 30.799614 ], [ 110.048498, 30.800642 ], [ 110.019549, 30.829425 ], [ 110.008462, 30.883369 ], [ 109.943788, 30.878746 ], [ 109.894513, 30.899803 ], [ 109.828608, 30.864364 ], [ 109.780564, 30.848437 ], [ 109.701724, 30.783677 ], [ 109.656761, 30.760538 ], [ 109.661072, 30.738936 ], [ 109.625348, 30.702923 ], [ 109.590855, 30.69366 ], [ 109.574225, 30.646818 ], [ 109.543428, 30.63961 ], [ 109.535421, 30.664837 ], [ 109.435638, 30.595832 ], [ 109.418392, 30.559766 ], [ 109.35495, 30.487076 ], [ 109.337088, 30.521623 ], [ 109.36111, 30.551004 ], [ 109.314298, 30.599953 ], [ 109.299516, 30.630341 ], [ 109.245313, 30.580892 ], [ 109.191726, 30.545851 ], [ 109.191726, 30.545851 ], [ 109.143683, 30.521108 ], [ 109.103647, 30.565949 ], [ 109.106111, 30.570587 ], [ 109.101183, 30.579346 ], [ 109.102415, 30.580377 ], [ 109.105495, 30.585529 ], [ 109.106111, 30.61077 ], [ 109.111654, 30.646303 ], [ 109.071002, 30.640125 ], [ 109.042669, 30.655571 ], [ 109.006329, 30.626736 ], [ 108.971836, 30.627766 ], [ 108.893612, 30.565434 ], [ 108.838793, 30.503062 ], [ 108.808612, 30.491202 ], [ 108.789518, 30.513374 ], [ 108.743939, 30.494812 ], [ 108.698975, 30.54482 ], [ 108.688504, 30.58759 ], [ 108.642925, 30.578831 ], [ 108.6497, 30.53915 ], [ 108.56778, 30.468508 ], [ 108.556077, 30.487592 ], [ 108.512961, 30.501515 ], [ 108.472925, 30.487076 ], [ 108.42673, 30.492233 ], [ 108.411331, 30.438586 ], [ 108.430425, 30.416397 ], [ 108.402092, 30.376649 ], [ 108.431041, 30.354446 ], [ 108.460606, 30.35961 ], [ 108.501258, 30.314673 ], [ 108.524048, 30.309506 ], [ 108.54499, 30.269716 ], [ 108.581947, 30.255759 ], [ 108.551766, 30.1637 ], [ 108.56778, 30.157491 ], [ 108.546222, 30.104178 ], [ 108.513577, 30.057571 ], [ 108.532055, 30.051873 ], [ 108.536367, 29.983472 ], [ 108.517889, 29.9394 ], [ 108.516041, 29.885451 ], [ 108.467998, 29.864175 ], [ 108.433505, 29.880262 ], [ 108.371295, 29.841337 ], [ 108.424266, 29.815897 ], [ 108.422418, 29.772791 ], [ 108.442744, 29.778505 ], [ 108.437201, 29.741098 ], [ 108.460606, 29.741098 ], [ 108.504338, 29.707836 ], [ 108.504954, 29.728626 ], [ 108.548686, 29.749412 ], [ 108.52528, 29.770713 ], [ 108.556077, 29.818493 ], [ 108.601041, 29.863656 ], [ 108.658939, 29.854833 ], [ 108.680497, 29.800319 ], [ 108.676801, 29.749412 ], [ 108.690968, 29.689642 ], [ 108.752562, 29.649082 ], [ 108.786438, 29.691721 ], [ 108.797525, 29.660003 ], [ 108.781511, 29.635558 ], [ 108.844337, 29.658443 ], [ 108.888068, 29.628795 ], [ 108.870206, 29.596537 ], [ 108.901003, 29.604863 ], [ 108.913322, 29.574679 ], [ 108.878213, 29.539279 ], [ 108.888684, 29.502305 ], [ 108.866511, 29.470527 ], [ 108.884373, 29.440824 ], [ 108.927488, 29.435612 ], [ 108.934264, 29.399643 ], [ 108.919481, 29.3261 ], [ 108.983539, 29.332883 ], [ 108.999553, 29.36366 ], [ 109.034662, 29.360531 ], [ 109.060531, 29.403292 ], [ 109.11227, 29.361053 ], [ 109.106727, 29.288526 ], [ 109.141835, 29.270256 ], [ 109.110422, 29.21647 ], [ 109.139372, 29.168927 ], [ 109.162777, 29.180946 ], [ 109.215748, 29.145409 ], [ 109.232378, 29.119271 ], [ 109.240386, 29.086328 ], [ 109.312451, 29.066453 ], [ 109.319842, 29.042388 ], [ 109.294588, 29.015177 ], [ 109.292741, 28.987436 ], [ 109.261328, 28.952356 ], [ 109.235458, 28.882161 ], [ 109.246545, 28.80143 ], [ 109.241002, 28.776779 ], [ 109.2989, 28.7474 ], [ 109.294588, 28.722211 ], [ 109.252704, 28.691767 ], [ 109.271183, 28.671816 ], [ 109.192958, 28.636104 ], [ 109.201581, 28.597753 ], [ 109.235458, 28.61982 ], [ 109.252089, 28.606685 ], [ 109.306907, 28.62087 ], [ 109.319842, 28.579886 ], [ 109.273646, 28.53836 ], [ 109.274262, 28.494714 ], [ 109.23361, 28.474726 ], [ 109.191726, 28.471043 ], [ 109.153538, 28.417369 ], [ 109.152306, 28.349975 ], [ 109.117198, 28.277795 ], [ 109.081473, 28.247749 ], [ 109.101799, 28.202401 ], [ 109.086401, 28.184467 ], [ 109.026655, 28.220331 ], [ 109.005713, 28.162837 ], [ 108.929952, 28.19027 ], [ 108.923793, 28.217167 ], [ 108.89546, 28.219804 ], [ 108.855424, 28.199764 ], [ 108.821547, 28.245113 ], [ 108.772888, 28.212949 ], [ 108.738395, 28.228241 ], [ 108.726692, 28.282011 ], [ 108.761801, 28.304143 ], [ 108.783359, 28.380518 ], [ 108.759953, 28.389995 ], [ 108.780279, 28.42579 ], [ 108.746402, 28.45105 ], [ 108.709446, 28.501026 ], [ 108.700207, 28.48209 ], [ 108.657091, 28.47683 ], [ 108.640461, 28.456838 ], [ 108.688504, 28.422106 ], [ 108.697127, 28.401051 ], [ 108.656475, 28.359981 ], [ 108.667562, 28.334173 ], [ 108.611512, 28.324691 ], [ 108.580099, 28.343128 ], [ 108.576403, 28.38631 ], [ 108.609048, 28.407368 ], [ 108.609664, 28.43579 ], [ 108.586874, 28.463678 ], [ 108.573939, 28.531 ], [ 108.610896, 28.539412 ], [ 108.604736, 28.590922 ], [ 108.636149, 28.621396 ], [ 108.575787, 28.659738 ], [ 108.50249, 28.63768 ], [ 108.501258, 28.626649 ], [ 108.439049, 28.634003 ], [ 108.332491, 28.679166 ], [ 108.347274, 28.736381 ], [ 108.385462, 28.772058 ], [ 108.386078, 28.803003 ], [ 108.352817, 28.815589 ], [ 108.346658, 28.859625 ], [ 108.357745, 28.893165 ], [ 108.345426, 28.943453 ], [ 108.319556, 28.961258 ], [ 108.297999, 29.045527 ], [ 108.306622, 29.079006 ], [ 108.277673, 29.091558 ], [ 108.256115, 29.040295 ], [ 108.193289, 29.072207 ], [ 108.150173, 29.053375 ], [ 108.070717, 29.086328 ], [ 108.026369, 29.039772 ], [ 107.925971, 29.032446 ], [ 107.908725, 29.007327 ], [ 107.882855, 29.00628 ], [ 107.867457, 28.960211 ], [ 107.810175, 28.984295 ], [ 107.823725, 29.034016 ], [ 107.784921, 29.048143 ], [ 107.810791, 29.139137 ], [ 107.749197, 29.199754 ], [ 107.700537, 29.141228 ], [ 107.659885, 29.162656 ], [ 107.605683, 29.164747 ], [ 107.589052, 29.150113 ], [ 107.570574, 29.218037 ], [ 107.486806, 29.174153 ], [ 107.441227, 29.203934 ], [ 107.401807, 29.184603 ], [ 107.408582, 29.138091 ], [ 107.427676, 29.128682 ], [ 107.412278, 29.094696 ], [ 107.369778, 29.091558 ], [ 107.395647, 29.041341 ], [ 107.364235, 29.00942 ], [ 107.396879, 28.993718 ], [ 107.412894, 28.960211 ], [ 107.441227, 28.943977 ], [ 107.41351, 28.911502 ], [ 107.383945, 28.848618 ], [ 107.339597, 28.845997 ], [ 107.327894, 28.810869 ], [ 107.261373, 28.792514 ], [ 107.24659, 28.76209 ], [ 107.219489, 28.772582 ], [ 107.210866, 28.817686 ], [ 107.227496, 28.836037 ], [ 107.194851, 28.838134 ], [ 107.206554, 28.868535 ], [ 107.14188, 28.887925 ], [ 107.016229, 28.882685 ], [ 107.019308, 28.861722 ], [ 106.983584, 28.851239 ], [ 106.988512, 28.776254 ], [ 106.951555, 28.766812 ], [ 106.923222, 28.809821 ], [ 106.872099, 28.777304 ], [ 106.845614, 28.780975 ], [ 106.824056, 28.756319 ], [ 106.86594, 28.690192 ], [ 106.889345, 28.695966 ], [ 106.866556, 28.624548 ], [ 106.830831, 28.623497 ], [ 106.807425, 28.589346 ], [ 106.784636, 28.626649 ], [ 106.756918, 28.607211 ], [ 106.77786, 28.563068 ], [ 106.73844, 28.554657 ], [ 106.726121, 28.51838 ], [ 106.747063, 28.467361 ], [ 106.708259, 28.450524 ], [ 106.697788, 28.47683 ], [ 106.632499, 28.503655 ], [ 106.564745, 28.485247 ], [ 106.567825, 28.523638 ], [ 106.615252, 28.549401 ], [ 106.606629, 28.593024 ], [ 106.63681, 28.622972 ], [ 106.618332, 28.645033 ], [ 106.651593, 28.649235 ], [ 106.617716, 28.66709 ], [ 106.6171, 28.691242 ], [ 106.587535, 28.691767 ], [ 106.56105, 28.719062 ], [ 106.561666, 28.756319 ], [ 106.474202, 28.832891 ], [ 106.45326, 28.817162 ], [ 106.461883, 28.761041 ], [ 106.492064, 28.742153 ], [ 106.528405, 28.677591 ], [ 106.502535, 28.661313 ], [ 106.49268, 28.591448 ], [ 106.466811, 28.586193 ], [ 106.504999, 28.544669 ], [ 106.477282, 28.530474 ], [ 106.403369, 28.569901 ], [ 106.37442, 28.525742 ] ] ], [ [ [ 109.105495, 30.585529 ], [ 109.102415, 30.580377 ], [ 109.101183, 30.579346 ], [ 109.09872, 30.579346 ], [ 109.09256, 30.578831 ], [ 109.106111, 30.61077 ], [ 109.105495, 30.585529 ] ] ], [ [ [ 105.582938, 30.12385 ], [ 105.574315, 30.130579 ], [ 105.580474, 30.129544 ], [ 105.582938, 30.127474 ], [ 105.582938, 30.12385 ] ] ], [ [ [ 109.09872, 30.579346 ], [ 109.106111, 30.570587 ], [ 109.103647, 30.565949 ], [ 109.09256, 30.578831 ], [ 109.09872, 30.579346 ] ] ], [ [ [ 107.058113, 30.043066 ], [ 107.055649, 30.040476 ], [ 107.054417, 30.040994 ], [ 107.053801, 30.043584 ], [ 107.058113, 30.043066 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"510000\", \"name\": \"四川省\", \"center\": [ 104.065735, 30.659462 ], \"centroid\": [ 102.693453, 30.674545 ], \"childrenNum\": 21, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 22, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 101.167885, 27.198311 ], [ 101.167885, 27.198311 ], [ 101.119226, 27.208957 ], [ 101.071798, 27.194585 ], [ 101.042233, 27.22173 ], [ 101.026219, 27.270679 ], [ 101.021907, 27.332899 ], [ 100.95169, 27.426961 ], [ 100.936908, 27.469448 ], [ 100.901183, 27.453517 ], [ 100.91227, 27.521473 ], [ 100.854988, 27.623858 ], [ 100.827886, 27.615904 ], [ 100.848212, 27.672099 ], [ 100.782307, 27.691708 ], [ 100.775532, 27.743098 ], [ 100.757053, 27.770107 ], [ 100.707162, 27.800816 ], [ 100.719481, 27.858503 ], [ 100.681293, 27.923035 ], [ 100.634482, 27.915631 ], [ 100.609228, 27.859033 ], [ 100.54517, 27.809286 ], [ 100.511294, 27.827811 ], [ 100.504518, 27.852154 ], [ 100.442924, 27.86644 ], [ 100.412127, 27.816167 ], [ 100.350534, 27.755809 ], [ 100.327744, 27.72032 ], [ 100.311729, 27.724028 ], [ 100.304954, 27.788639 ], [ 100.28586, 27.80611 ], [ 100.30865, 27.830457 ], [ 100.30865, 27.861149 ], [ 100.210715, 27.87702 ], [ 100.170063, 27.907699 ], [ 100.196549, 27.936254 ], [ 100.120788, 28.018703 ], [ 100.088759, 28.029269 ], [ 100.05673, 28.097922 ], [ 100.021006, 28.147008 ], [ 100.033325, 28.184467 ], [ 100.062274, 28.193962 ], [ 100.091223, 28.181302 ], [ 100.102926, 28.201873 ], [ 100.153433, 28.208202 ], [ 100.188541, 28.252493 ], [ 100.147274, 28.288862 ], [ 100.176223, 28.325218 ], [ 100.136803, 28.349975 ], [ 100.057346, 28.368934 ], [ 100.073977, 28.426317 ], [ 99.990209, 28.47683 ], [ 99.985281, 28.529422 ], [ 99.91876, 28.599329 ], [ 99.875644, 28.611939 ], [ 99.873181, 28.631902 ], [ 99.834376, 28.628225 ], [ 99.834992, 28.660788 ], [ 99.79434, 28.699116 ], [ 99.755536, 28.701216 ], [ 99.722275, 28.757369 ], [ 99.717964, 28.846521 ], [ 99.676696, 28.810345 ], [ 99.625573, 28.81454 ], [ 99.609559, 28.784122 ], [ 99.614486, 28.740054 ], [ 99.553508, 28.710664 ], [ 99.53195, 28.677591 ], [ 99.540573, 28.623497 ], [ 99.504233, 28.619294 ], [ 99.466045, 28.579886 ], [ 99.463581, 28.549401 ], [ 99.403219, 28.546246 ], [ 99.396444, 28.491032 ], [ 99.426625, 28.454207 ], [ 99.404451, 28.44421 ], [ 99.437095, 28.398419 ], [ 99.392748, 28.318369 ], [ 99.412458, 28.295186 ], [ 99.374886, 28.18183 ], [ 99.306516, 28.227714 ], [ 99.28927, 28.286227 ], [ 99.237531, 28.317842 ], [ 99.229524, 28.350502 ], [ 99.200575, 28.365774 ], [ 99.16485, 28.425264 ], [ 99.187024, 28.44 ], [ 99.191952, 28.494714 ], [ 99.170394, 28.566221 ], [ 99.183944, 28.58882 ], [ 99.147604, 28.640831 ], [ 99.126662, 28.698066 ], [ 99.134053, 28.734806 ], [ 99.114343, 28.765763 ], [ 99.103872, 28.841803 ], [ 99.123582, 28.890021 ], [ 99.132206, 28.94869 ], [ 99.113727, 29.07273 ], [ 99.118039, 29.100971 ], [ 99.105104, 29.162656 ], [ 99.113727, 29.221171 ], [ 99.114343, 29.243628 ], [ 99.075539, 29.316186 ], [ 99.058909, 29.417368 ], [ 99.066916, 29.421018 ], [ 99.044742, 29.520013 ], [ 99.052133, 29.563748 ], [ 99.014561, 29.607464 ], [ 98.992387, 29.677163 ], [ 99.018873, 29.792009 ], [ 99.0238, 29.846009 ], [ 99.068148, 29.931621 ], [ 99.055213, 29.958587 ], [ 99.036735, 30.053945 ], [ 99.044742, 30.079842 ], [ 98.989308, 30.151799 ], [ 98.9813, 30.182843 ], [ 98.993003, 30.215429 ], [ 98.970829, 30.260928 ], [ 98.986844, 30.280569 ], [ 98.967134, 30.33482 ], [ 98.965286, 30.449937 ], [ 98.932025, 30.521623 ], [ 98.926482, 30.569556 ], [ 98.939417, 30.598923 ], [ 98.92217, 30.609225 ], [ 98.907388, 30.698292 ], [ 98.963438, 30.728134 ], [ 98.957895, 30.765166 ], [ 98.904924, 30.782649 ], [ 98.850105, 30.849465 ], [ 98.797135, 30.87926 ], [ 98.774345, 30.908019 ], [ 98.797135, 30.948575 ], [ 98.806374, 30.995783 ], [ 98.774961, 31.031174 ], [ 98.736772, 31.049121 ], [ 98.712135, 31.082954 ], [ 98.710287, 31.1178 ], [ 98.675179, 31.15417 ], [ 98.602498, 31.192062 ], [ 98.62344, 31.221238 ], [ 98.60373, 31.257568 ], [ 98.616048, 31.3036 ], [ 98.643766, 31.338876 ], [ 98.691809, 31.333253 ], [ 98.773113, 31.249382 ], [ 98.805758, 31.279052 ], [ 98.810685, 31.306668 ], [ 98.887062, 31.37465 ], [ 98.84333, 31.416028 ], [ 98.844562, 31.429817 ], [ 98.714599, 31.508935 ], [ 98.696736, 31.538523 ], [ 98.651157, 31.57881 ], [ 98.619128, 31.591555 ], [ 98.553839, 31.660349 ], [ 98.545831, 31.717383 ], [ 98.516882, 31.717383 ], [ 98.508875, 31.751995 ], [ 98.461448, 31.800327 ], [ 98.414636, 31.832365 ], [ 98.426339, 31.856767 ], [ 98.399238, 31.895899 ], [ 98.432498, 31.922825 ], [ 98.434962, 32.007613 ], [ 98.402933, 32.026896 ], [ 98.404781, 32.045159 ], [ 98.357354, 32.087253 ], [ 98.303151, 32.121726 ], [ 98.260035, 32.208862 ], [ 98.218768, 32.234683 ], [ 98.23047, 32.262521 ], [ 98.208913, 32.318171 ], [ 98.218768, 32.342444 ], [ 98.125145, 32.401077 ], [ 98.107283, 32.391476 ], [ 98.079565, 32.415224 ], [ 97.940363, 32.482393 ], [ 97.880001, 32.486431 ], [ 97.863986, 32.499051 ], [ 97.80732, 32.50006 ], [ 97.795617, 32.521257 ], [ 97.730944, 32.527312 ], [ 97.700763, 32.53488 ], [ 97.616995, 32.586329 ], [ 97.607756, 32.614059 ], [ 97.543698, 32.62162 ], [ 97.535075, 32.638252 ], [ 97.48272, 32.654377 ], [ 97.42359, 32.70475 ], [ 97.429133, 32.714318 ], [ 97.386018, 32.77925 ], [ 97.392793, 32.828546 ], [ 97.376163, 32.886359 ], [ 97.347829, 32.895907 ], [ 97.375547, 32.956689 ], [ 97.438372, 32.976271 ], [ 97.523988, 32.988822 ], [ 97.499966, 33.011408 ], [ 97.542466, 33.035995 ], [ 97.517213, 33.097683 ], [ 97.487032, 33.107209 ], [ 97.498119, 33.137783 ], [ 97.487648, 33.168346 ], [ 97.548626, 33.203907 ], [ 97.607756, 33.263976 ], [ 97.622538, 33.337005 ], [ 97.676125, 33.341004 ], [ 97.754349, 33.409972 ], [ 97.674893, 33.432949 ], [ 97.625618, 33.461412 ], [ 97.552321, 33.465906 ], [ 97.511669, 33.520805 ], [ 97.523372, 33.577166 ], [ 97.450075, 33.582152 ], [ 97.415583, 33.605582 ], [ 97.435293, 33.682307 ], [ 97.418046, 33.728608 ], [ 97.422974, 33.754984 ], [ 97.406344, 33.795278 ], [ 97.373083, 33.817655 ], [ 97.371851, 33.842015 ], [ 97.398336, 33.848477 ], [ 97.395257, 33.889224 ], [ 97.460546, 33.887236 ], [ 97.503662, 33.912073 ], [ 97.52214, 33.903133 ], [ 97.601596, 33.929951 ], [ 97.629314, 33.919523 ], [ 97.660111, 33.956264 ], [ 97.652719, 33.998448 ], [ 97.70261, 34.036644 ], [ 97.665654, 34.126855 ], [ 97.766668, 34.158555 ], [ 97.789458, 34.182818 ], [ 97.789458, 34.182818 ], [ 97.796849, 34.199154 ], [ 97.796849, 34.199154 ], [ 97.898479, 34.209548 ], [ 97.95453, 34.190739 ], [ 98.051848, 34.11546 ], [ 98.098043, 34.122892 ], [ 98.157174, 34.107532 ], [ 98.206449, 34.08424 ], [ 98.258188, 34.083249 ], [ 98.344419, 34.094648 ], [ 98.392462, 34.089196 ], [ 98.396774, 34.053008 ], [ 98.428187, 34.029204 ], [ 98.440506, 33.981577 ], [ 98.415252, 33.956761 ], [ 98.425723, 33.913066 ], [ 98.407245, 33.867362 ], [ 98.434962, 33.843009 ], [ 98.463295, 33.848477 ], [ 98.492861, 33.796272 ], [ 98.494092, 33.768915 ], [ 98.51873, 33.77389 ], [ 98.537824, 33.74752 ], [ 98.582788, 33.731595 ], [ 98.610505, 33.682805 ], [ 98.6567, 33.64744 ], [ 98.61728, 33.637476 ], [ 98.622824, 33.610067 ], [ 98.652389, 33.595114 ], [ 98.648077, 33.548741 ], [ 98.678258, 33.522801 ], [ 98.725686, 33.503341 ], [ 98.742316, 33.477887 ], [ 98.736157, 33.406975 ], [ 98.779888, 33.370497 ], [ 98.759562, 33.276985 ], [ 98.802062, 33.270481 ], [ 98.804526, 33.219428 ], [ 98.858728, 33.150811 ], [ 98.92217, 33.118738 ], [ 98.967134, 33.115229 ], [ 98.971445, 33.098185 ], [ 99.014561, 33.081137 ], [ 99.024416, 33.094675 ], [ 99.090322, 33.079131 ], [ 99.124814, 33.046028 ], [ 99.196263, 33.035493 ], [ 99.214741, 32.991332 ], [ 99.235067, 32.982296 ], [ 99.24677, 32.924043 ], [ 99.268944, 32.878318 ], [ 99.353944, 32.885354 ], [ 99.376118, 32.899927 ], [ 99.45311, 32.862233 ], [ 99.558436, 32.839106 ], [ 99.589233, 32.789312 ], [ 99.640355, 32.790822 ], [ 99.646515, 32.774721 ], [ 99.705029, 32.76516 ], [ 99.717964, 32.732443 ], [ 99.760464, 32.769689 ], [ 99.766623, 32.826032 ], [ 99.791877, 32.883344 ], [ 99.764159, 32.924545 ], [ 99.788181, 32.956689 ], [ 99.805427, 32.940619 ], [ 99.851007, 32.941623 ], [ 99.877492, 32.993339 ], [ 99.877492, 33.045527 ], [ 99.947709, 32.986814 ], [ 99.956332, 32.948152 ], [ 100.038252, 32.929066 ], [ 100.029629, 32.895907 ], [ 100.064738, 32.895907 ], [ 100.123252, 32.837095 ], [ 100.117093, 32.802392 ], [ 100.139266, 32.724388 ], [ 100.088143, 32.668988 ], [ 100.109701, 32.640268 ], [ 100.189773, 32.630692 ], [ 100.208252, 32.606497 ], [ 100.229809, 32.650346 ], [ 100.231041, 32.696189 ], [ 100.258759, 32.742511 ], [ 100.339447, 32.719353 ], [ 100.399193, 32.756101 ], [ 100.378251, 32.698707 ], [ 100.420135, 32.73194 ], [ 100.450932, 32.694678 ], [ 100.470026, 32.694678 ], [ 100.516837, 32.632204 ], [ 100.54517, 32.569687 ], [ 100.603069, 32.553547 ], [ 100.645568, 32.526303 ], [ 100.657887, 32.546484 ], [ 100.661583, 32.616075 ], [ 100.673286, 32.628172 ], [ 100.710242, 32.610026 ], [ 100.71209, 32.645307 ], [ 100.690532, 32.678056 ], [ 100.77122, 32.643795 ], [ 100.834046, 32.648835 ], [ 100.887633, 32.632708 ], [ 100.93198, 32.600447 ], [ 100.956618, 32.621116 ], [ 100.99727, 32.627668 ], [ 101.030531, 32.660424 ], [ 101.077342, 32.68259 ], [ 101.124769, 32.658408 ], [ 101.157414, 32.661431 ], [ 101.22332, 32.725898 ], [ 101.237486, 32.825026 ], [ 101.223935, 32.855698 ], [ 101.178356, 32.892892 ], [ 101.124153, 32.909976 ], [ 101.134624, 32.95217 ], [ 101.129081, 32.989324 ], [ 101.183899, 32.984304 ], [ 101.171581, 33.009902 ], [ 101.184515, 33.041514 ], [ 101.146327, 33.056563 ], [ 101.143863, 33.086151 ], [ 101.169733, 33.10019 ], [ 101.11553, 33.194893 ], [ 101.124769, 33.221431 ], [ 101.156798, 33.236449 ], [ 101.182668, 33.26948 ], [ 101.217776, 33.256469 ], [ 101.297232, 33.262475 ], [ 101.381616, 33.153316 ], [ 101.393935, 33.157826 ], [ 101.386543, 33.207412 ], [ 101.403174, 33.225436 ], [ 101.487557, 33.226938 ], [ 101.515275, 33.192889 ], [ 101.557775, 33.167344 ], [ 101.633535, 33.101193 ], [ 101.661252, 33.135778 ], [ 101.653861, 33.162835 ], [ 101.709912, 33.21292 ], [ 101.735781, 33.279987 ], [ 101.677883, 33.297497 ], [ 101.64955, 33.323004 ], [ 101.663716, 33.383991 ], [ 101.695745, 33.433948 ], [ 101.769042, 33.45592 ], [ 101.777665, 33.533776 ], [ 101.769042, 33.538765 ], [ 101.783208, 33.556721 ], [ 101.831252, 33.554726 ], [ 101.844186, 33.602591 ], [ 101.884222, 33.578163 ], [ 101.907012, 33.539264 ], [ 101.906396, 33.48188 ], [ 101.946432, 33.442937 ], [ 101.915635, 33.425957 ], [ 101.887302, 33.383991 ], [ 101.877447, 33.314502 ], [ 101.769658, 33.26898 ], [ 101.770274, 33.248962 ], [ 101.83002, 33.213921 ], [ 101.841723, 33.184876 ], [ 101.825708, 33.119239 ], [ 101.865744, 33.103198 ], [ 101.887302, 33.135778 ], [ 101.921795, 33.153817 ], [ 101.935345, 33.186879 ], [ 101.99386, 33.1999 ], [ 102.054838, 33.189884 ], [ 102.08933, 33.204908 ], [ 102.08933, 33.227439 ], [ 102.117047, 33.288492 ], [ 102.144765, 33.273983 ], [ 102.160163, 33.242956 ], [ 102.200815, 33.223434 ], [ 102.217446, 33.247961 ], [ 102.192192, 33.337005 ], [ 102.218062, 33.349503 ], [ 102.258098, 33.409472 ], [ 102.296286, 33.413969 ], [ 102.310452, 33.397982 ], [ 102.368967, 33.41247 ], [ 102.392988, 33.404477 ], [ 102.447807, 33.454922 ], [ 102.462589, 33.449429 ], [ 102.461358, 33.501345 ], [ 102.446575, 33.53228 ], [ 102.477988, 33.543254 ], [ 102.440416, 33.574673 ], [ 102.346793, 33.605582 ], [ 102.31538, 33.665374 ], [ 102.342481, 33.725622 ], [ 102.284583, 33.719151 ], [ 102.324619, 33.754486 ], [ 102.296286, 33.783838 ], [ 102.243315, 33.786823 ], [ 102.261177, 33.821136 ], [ 102.25317, 33.861399 ], [ 102.136142, 33.965199 ], [ 102.16817, 33.983066 ], [ 102.226069, 33.963214 ], [ 102.248858, 33.98654 ], [ 102.287047, 33.977607 ], [ 102.315996, 33.993983 ], [ 102.345561, 33.969666 ], [ 102.392372, 33.971651 ], [ 102.406539, 34.033172 ], [ 102.437336, 34.087214 ], [ 102.471213, 34.072839 ], [ 102.511865, 34.086222 ], [ 102.615958, 34.099604 ], [ 102.649219, 34.080275 ], [ 102.655994, 34.113478 ], [ 102.598712, 34.14766 ], [ 102.651067, 34.165983 ], [ 102.664002, 34.192719 ], [ 102.694799, 34.198659 ], [ 102.728675, 34.235774 ], [ 102.779798, 34.236764 ], [ 102.798276, 34.272874 ], [ 102.856791, 34.270895 ], [ 102.85987, 34.301058 ], [ 102.911609, 34.312923 ], [ 102.949181, 34.292159 ], [ 102.977515, 34.252595 ], [ 102.973203, 34.205588 ], [ 103.005848, 34.184798 ], [ 103.052043, 34.195194 ], [ 103.100087, 34.181828 ], [ 103.124108, 34.162022 ], [ 103.121644, 34.112487 ], [ 103.178927, 34.079779 ], [ 103.129652, 34.065899 ], [ 103.119797, 34.03466 ], [ 103.147514, 34.036644 ], [ 103.157369, 33.998944 ], [ 103.120413, 33.953286 ], [ 103.1315, 33.931937 ], [ 103.16476, 33.929454 ], [ 103.181391, 33.900649 ], [ 103.153673, 33.819147 ], [ 103.165376, 33.805721 ], [ 103.228202, 33.79478 ], [ 103.24976, 33.814175 ], [ 103.284868, 33.80224 ], [ 103.278709, 33.774387 ], [ 103.35447, 33.743539 ], [ 103.434542, 33.752993 ], [ 103.464723, 33.80224 ], [ 103.518309, 33.807213 ], [ 103.545411, 33.719649 ], [ 103.520157, 33.678323 ], [ 103.552186, 33.671351 ], [ 103.563889, 33.699735 ], [ 103.593454, 33.716164 ], [ 103.645809, 33.708697 ], [ 103.667983, 33.685793 ], [ 103.690772, 33.69376 ], [ 103.778236, 33.658898 ], [ 103.861388, 33.682307 ], [ 103.980264, 33.670852 ], [ 104.046169, 33.686291 ], [ 104.103452, 33.663381 ], [ 104.176749, 33.5996 ], [ 104.155191, 33.542755 ], [ 104.180444, 33.472895 ], [ 104.213089, 33.446932 ], [ 104.22048, 33.404477 ], [ 104.272219, 33.391486 ], [ 104.292545, 33.336505 ], [ 104.373849, 33.345004 ], [ 104.420045, 33.327004 ], [ 104.386168, 33.298497 ], [ 104.333813, 33.315502 ], [ 104.303632, 33.304499 ], [ 104.323958, 33.26898 ], [ 104.32827, 33.223934 ], [ 104.351059, 33.158828 ], [ 104.378161, 33.109214 ], [ 104.337509, 33.038002 ], [ 104.391711, 33.035493 ], [ 104.426204, 33.010906 ], [ 104.383704, 32.994343 ], [ 104.378161, 32.953174 ], [ 104.345516, 32.940117 ], [ 104.288234, 32.942628 ], [ 104.277147, 32.90244 ], [ 104.294393, 32.835586 ], [ 104.363994, 32.822511 ], [ 104.458849, 32.748551 ], [ 104.51182, 32.753585 ], [ 104.526602, 32.728416 ], [ 104.582653, 32.722374 ], [ 104.592508, 32.695685 ], [ 104.643015, 32.661935 ], [ 104.696601, 32.673522 ], [ 104.739717, 32.635228 ], [ 104.795768, 32.643292 ], [ 104.820405, 32.662943 ], [ 104.845659, 32.653873 ], [ 104.881999, 32.600951 ], [ 104.925115, 32.607505 ], [ 105.026745, 32.650346 ], [ 105.0791, 32.637244 ], [ 105.111128, 32.593893 ], [ 105.185041, 32.617587 ], [ 105.215222, 32.63674 ], [ 105.219534, 32.666469 ], [ 105.263265, 32.652362 ], [ 105.297758, 32.656897 ], [ 105.347033, 32.68259 ], [ 105.368591, 32.712807 ], [ 105.448663, 32.732946 ], [ 105.454207, 32.767173 ], [ 105.427721, 32.784281 ], [ 105.396308, 32.85067 ], [ 105.396308, 32.85067 ], [ 105.38091, 32.876307 ], [ 105.408011, 32.885857 ], [ 105.414171, 32.922034 ], [ 105.467757, 32.930071 ], [ 105.49917, 32.911986 ], [ 105.495475, 32.873292 ], [ 105.524424, 32.847654 ], [ 105.534279, 32.790822 ], [ 105.555221, 32.794343 ], [ 105.563844, 32.724891 ], [ 105.585402, 32.728919 ], [ 105.596489, 32.69921 ], [ 105.677793, 32.726402 ], [ 105.719061, 32.759624 ], [ 105.768952, 32.767676 ], [ 105.779423, 32.750061 ], [ 105.822538, 32.770192 ], [ 105.825002, 32.824523 ], [ 105.849024, 32.817985 ], [ 105.893371, 32.838603 ], [ 105.93156, 32.826032 ], [ 105.969132, 32.849162 ], [ 106.011632, 32.829552 ], [ 106.044277, 32.864747 ], [ 106.071378, 32.828546 ], [ 106.093552, 32.82402 ], [ 106.07261, 32.76365 ], [ 106.071378, 32.758114 ], [ 106.120037, 32.719856 ], [ 106.17424, 32.6977 ], [ 106.254928, 32.693671 ], [ 106.267863, 32.673522 ], [ 106.301123, 32.680071 ], [ 106.347935, 32.671003 ], [ 106.389203, 32.62666 ], [ 106.421231, 32.616579 ], [ 106.451412, 32.65992 ], [ 106.498224, 32.649338 ], [ 106.517934, 32.668485 ], [ 106.585687, 32.68813 ], [ 106.626955, 32.682086 ], [ 106.670071, 32.694678 ], [ 106.733513, 32.739491 ], [ 106.783404, 32.735967 ], [ 106.793259, 32.712807 ], [ 106.82344, 32.705254 ], [ 106.854853, 32.724388 ], [ 106.903512, 32.721367 ], [ 106.912751, 32.704247 ], [ 107.012533, 32.721367 ], [ 107.066736, 32.708779 ], [ 107.05996, 32.686115 ], [ 107.098765, 32.649338 ], [ 107.108004, 32.600951 ], [ 107.080286, 32.542448 ], [ 107.127098, 32.482393 ], [ 107.189924, 32.468256 ], [ 107.212097, 32.428864 ], [ 107.263836, 32.403099 ], [ 107.287858, 32.457147 ], [ 107.313727, 32.489965 ], [ 107.356843, 32.506622 ], [ 107.382097, 32.54043 ], [ 107.436299, 32.529835 ], [ 107.438763, 32.465732 ], [ 107.460937, 32.453612 ], [ 107.456625, 32.41775 ], [ 107.489886, 32.425328 ], [ 107.527458, 32.38238 ], [ 107.598291, 32.411688 ], [ 107.648183, 32.413709 ], [ 107.680827, 32.397035 ], [ 107.707929, 32.331826 ], [ 107.753508, 32.338399 ], [ 107.812022, 32.247844 ], [ 107.864377, 32.201266 ], [ 107.890247, 32.214432 ], [ 107.924739, 32.197215 ], [ 107.979558, 32.146051 ], [ 108.024521, 32.177462 ], [ 108.018362, 32.2119 ], [ 108.086731, 32.233165 ], [ 108.143398, 32.219495 ], [ 108.156948, 32.239239 ], [ 108.179738, 32.221521 ], [ 108.240716, 32.274666 ], [ 108.310933, 32.232152 ], [ 108.389773, 32.263533 ], [ 108.414411, 32.252399 ], [ 108.469846, 32.270618 ], [ 108.507418, 32.245819 ], [ 108.509882, 32.201266 ], [ 108.480317, 32.182527 ], [ 108.399013, 32.194176 ], [ 108.370063, 32.172397 ], [ 108.379918, 32.154158 ], [ 108.379918, 32.154158 ], [ 108.379303, 32.153652 ], [ 108.379303, 32.153652 ], [ 108.399628, 32.147065 ], [ 108.452599, 32.090296 ], [ 108.42981, 32.061391 ], [ 108.372527, 32.077112 ], [ 108.344194, 32.067477 ], [ 108.362056, 32.035521 ], [ 108.329411, 32.020299 ], [ 108.370063, 31.988835 ], [ 108.351585, 31.971575 ], [ 108.307238, 31.997463 ], [ 108.259194, 31.967006 ], [ 108.343578, 31.860834 ], [ 108.386078, 31.854226 ], [ 108.391005, 31.829822 ], [ 108.429194, 31.809482 ], [ 108.455063, 31.814059 ], [ 108.462454, 31.780488 ], [ 108.535135, 31.757592 ], [ 108.50557, 31.734182 ], [ 108.514809, 31.693963 ], [ 108.546838, 31.665442 ], [ 108.519121, 31.665952 ], [ 108.468614, 31.636404 ], [ 108.442744, 31.633856 ], [ 108.390389, 31.591555 ], [ 108.386078, 31.544134 ], [ 108.34789, 31.545664 ], [ 108.344194, 31.512506 ], [ 108.254883, 31.49873 ], [ 108.233941, 31.506894 ], [ 108.191441, 31.492096 ], [ 108.193289, 31.467598 ], [ 108.224086, 31.464024 ], [ 108.216079, 31.41041 ], [ 108.153869, 31.371073 ], [ 108.185898, 31.336831 ], [ 108.095354, 31.268311 ], [ 108.038688, 31.252964 ], [ 108.031297, 31.217144 ], [ 108.07626, 31.231985 ], [ 108.089811, 31.204859 ], [ 108.025753, 31.116263 ], [ 108.009123, 31.109602 ], [ 108.026985, 31.061938 ], [ 108.060246, 31.052197 ], [ 108.00358, 31.025533 ], [ 107.983254, 30.983983 ], [ 107.942602, 30.989114 ], [ 107.948145, 30.918802 ], [ 107.994956, 30.908533 ], [ 107.956152, 30.882855 ], [ 107.851443, 30.792931 ], [ 107.788001, 30.81966 ], [ 107.763979, 30.817091 ], [ 107.760899, 30.862823 ], [ 107.739957, 30.884396 ], [ 107.693146, 30.875665 ], [ 107.645103, 30.821202 ], [ 107.57735, 30.847924 ], [ 107.515756, 30.854603 ], [ 107.483111, 30.838675 ], [ 107.498509, 30.809381 ], [ 107.454162, 30.771851 ], [ 107.454162, 30.771851 ], [ 107.424597, 30.74048 ], [ 107.458473, 30.704981 ], [ 107.477567, 30.664837 ], [ 107.516987, 30.644759 ], [ 107.485575, 30.598408 ], [ 107.427676, 30.547397 ], [ 107.443075, 30.53348 ], [ 107.408582, 30.521623 ], [ 107.368546, 30.468508 ], [ 107.338981, 30.386459 ], [ 107.288474, 30.337402 ], [ 107.257677, 30.267131 ], [ 107.221337, 30.213878 ], [ 107.103076, 30.090198 ], [ 107.080286, 30.094341 ], [ 107.084598, 30.063786 ], [ 107.058113, 30.043066 ], [ 107.053801, 30.043584 ], [ 107.02054, 30.036849 ], [ 106.981736, 30.08502 ], [ 106.980504, 30.087609 ], [ 106.979888, 30.088127 ], [ 106.978656, 30.087609 ], [ 106.977425, 30.087609 ], [ 106.976809, 30.088127 ], [ 106.975577, 30.088127 ], [ 106.976193, 30.083467 ], [ 106.94478, 30.037367 ], [ 106.913367, 30.025451 ], [ 106.862244, 30.033223 ], [ 106.83699, 30.049801 ], [ 106.825904, 30.03115 ], [ 106.825904, 30.03115 ], [ 106.785252, 30.01716 ], [ 106.732281, 30.027005 ], [ 106.724274, 30.058607 ], [ 106.699636, 30.074145 ], [ 106.700252, 30.111944 ], [ 106.672535, 30.122297 ], [ 106.677462, 30.156974 ], [ 106.631883, 30.186464 ], [ 106.611557, 30.235596 ], [ 106.612173, 30.235596 ], [ 106.611557, 30.235596 ], [ 106.612173, 30.235596 ], [ 106.612173, 30.235596 ], [ 106.612789, 30.235596 ], [ 106.612789, 30.235596 ], [ 106.642354, 30.246454 ], [ 106.611557, 30.292455 ], [ 106.560434, 30.31519 ], [ 106.545035, 30.296589 ], [ 106.49884, 30.295556 ], [ 106.43971, 30.308473 ], [ 106.428623, 30.254725 ], [ 106.401521, 30.242318 ], [ 106.349167, 30.24542 ], [ 106.334384, 30.225772 ], [ 106.306667, 30.238182 ], [ 106.296196, 30.205603 ], [ 106.264167, 30.20974 ], [ 106.260471, 30.207672 ], [ 106.260471, 30.204051 ], [ 106.260471, 30.19681 ], [ 106.232754, 30.185947 ], [ 106.180399, 30.233011 ], [ 106.168696, 30.303823 ], [ 106.132356, 30.323972 ], [ 106.132972, 30.30279 ], [ 106.07261, 30.333786 ], [ 106.031958, 30.373551 ], [ 105.943263, 30.372002 ], [ 105.900763, 30.405042 ], [ 105.84656, 30.410203 ], [ 105.825618, 30.436006 ], [ 105.792357, 30.427234 ], [ 105.760329, 30.384393 ], [ 105.754785, 30.342567 ], [ 105.714749, 30.322939 ], [ 105.720292, 30.252657 ], [ 105.720292, 30.252657 ], [ 105.670401, 30.254208 ], [ 105.624822, 30.275918 ], [ 105.619894, 30.234045 ], [ 105.662394, 30.210258 ], [ 105.642684, 30.186464 ], [ 105.56138, 30.183878 ], [ 105.558916, 30.18543 ], [ 105.556453, 30.187499 ], [ 105.550909, 30.179222 ], [ 105.536127, 30.152834 ], [ 105.596489, 30.159043 ], [ 105.574315, 30.130579 ], [ 105.582938, 30.12385 ], [ 105.642068, 30.101072 ], [ 105.638988, 30.076216 ], [ 105.676561, 30.06793 ], [ 105.687032, 30.038922 ], [ 105.719677, 30.042548 ], [ 105.753553, 30.018196 ], [ 105.723372, 29.975177 ], [ 105.730763, 29.95755 ], [ 105.70243, 29.924879 ], [ 105.717213, 29.893753 ], [ 105.738771, 29.891159 ], [ 105.707974, 29.840818 ], [ 105.610655, 29.837184 ], [ 105.582938, 29.819013 ], [ 105.574931, 29.744216 ], [ 105.529351, 29.707836 ], [ 105.481924, 29.718232 ], [ 105.476996, 29.674564 ], [ 105.419714, 29.688082 ], [ 105.38091, 29.628275 ], [ 105.347649, 29.621512 ], [ 105.332867, 29.592374 ], [ 105.296526, 29.571035 ], [ 105.305149, 29.53199 ], [ 105.337794, 29.459064 ], [ 105.334099, 29.441345 ], [ 105.387069, 29.455416 ], [ 105.387069, 29.455416 ], [ 105.372903, 29.421018 ], [ 105.426489, 29.419454 ], [ 105.441888, 29.400686 ], [ 105.418482, 29.352185 ], [ 105.42033, 29.31149 ], [ 105.465294, 29.322969 ], [ 105.459134, 29.288526 ], [ 105.513337, 29.283306 ], [ 105.521344, 29.264513 ], [ 105.557684, 29.278608 ], [ 105.631597, 29.280174 ], [ 105.647612, 29.253027 ], [ 105.695039, 29.287482 ], [ 105.712285, 29.219082 ], [ 105.703662, 29.176766 ], [ 105.728916, 29.134432 ], [ 105.752321, 29.129727 ], [ 105.728916, 29.1062 ], [ 105.757865, 29.069068 ], [ 105.74185, 29.039249 ], [ 105.766488, 29.013607 ], [ 105.762176, 28.9911 ], [ 105.801596, 28.958116 ], [ 105.797285, 28.936121 ], [ 105.830546, 28.944501 ], [ 105.852719, 28.927217 ], [ 105.910002, 28.920407 ], [ 105.969132, 28.965971 ], [ 106.001161, 28.973824 ], [ 106.040581, 28.955498 ], [ 106.049204, 28.906263 ], [ 106.070762, 28.919884 ], [ 106.101559, 28.898928 ], [ 106.14837, 28.901548 ], [ 106.173008, 28.920407 ], [ 106.206885, 28.904691 ], [ 106.264783, 28.845997 ], [ 106.245689, 28.817686 ], [ 106.267863, 28.779402 ], [ 106.27279, 28.741103 ], [ 106.305435, 28.704365 ], [ 106.304203, 28.64976 ], [ 106.346703, 28.583565 ], [ 106.33192, 28.55308 ], [ 106.37442, 28.525742 ], [ 106.379348, 28.479986 ], [ 106.349167, 28.473674 ], [ 106.304819, 28.505233 ], [ 106.2925, 28.537309 ], [ 106.254928, 28.539412 ], [ 106.184711, 28.58882 ], [ 106.17116, 28.629275 ], [ 106.14837, 28.642932 ], [ 106.103407, 28.636104 ], [ 106.085544, 28.681792 ], [ 106.030726, 28.694917 ], [ 106.001161, 28.743727 ], [ 105.966668, 28.761041 ], [ 105.937719, 28.686517 ], [ 105.889676, 28.670765 ], [ 105.884748, 28.595126 ], [ 105.808372, 28.599855 ], [ 105.78435, 28.610889 ], [ 105.757249, 28.590397 ], [ 105.74493, 28.616668 ], [ 105.712901, 28.586718 ], [ 105.693191, 28.58882 ], [ 105.68272, 28.534154 ], [ 105.62359, 28.517854 ], [ 105.612503, 28.438947 ], [ 105.643916, 28.431053 ], [ 105.655003, 28.362615 ], [ 105.639604, 28.324164 ], [ 105.68888, 28.284119 ], [ 105.730147, 28.271997 ], [ 105.737539, 28.30309 ], [ 105.76464, 28.308359 ], [ 105.76464, 28.308359 ], [ 105.78743, 28.335753 ], [ 105.824386, 28.306251 ], [ 105.848408, 28.255656 ], [ 105.889676, 28.237732 ], [ 105.860727, 28.159672 ], [ 105.895219, 28.119565 ], [ 105.943878, 28.143314 ], [ 105.975907, 28.107952 ], [ 106.093552, 28.162837 ], [ 106.145291, 28.162837 ], [ 106.206885, 28.134343 ], [ 106.266631, 28.066769 ], [ 106.246305, 28.011835 ], [ 106.286341, 28.007079 ], [ 106.328225, 27.952643 ], [ 106.307899, 27.936782 ], [ 106.304819, 27.899237 ], [ 106.325145, 27.898708 ], [ 106.337464, 27.859033 ], [ 106.306667, 27.808756 ], [ 106.242609, 27.767459 ], [ 106.193334, 27.75422 ], [ 106.120653, 27.779638 ], [ 106.063987, 27.776991 ], [ 106.023335, 27.746805 ], [ 105.985146, 27.749983 ], [ 105.92848, 27.729855 ], [ 105.922937, 27.746805 ], [ 105.868118, 27.732504 ], [ 105.848408, 27.707074 ], [ 105.76772, 27.7182 ], [ 105.722756, 27.706015 ], [ 105.720292, 27.683759 ], [ 105.664242, 27.683759 ], [ 105.62359, 27.666269 ], [ 105.605112, 27.715552 ], [ 105.560148, 27.71979 ], [ 105.508409, 27.769048 ], [ 105.44004, 27.775402 ], [ 105.353809, 27.748924 ], [ 105.308229, 27.704955 ], [ 105.290367, 27.712373 ], [ 105.293447, 27.770637 ], [ 105.273736, 27.794992 ], [ 105.313157, 27.810874 ], [ 105.25957, 27.827811 ], [ 105.233084, 27.895534 ], [ 105.284823, 27.935725 ], [ 105.270657, 27.99704 ], [ 105.247867, 28.009193 ], [ 105.218302, 27.990698 ], [ 105.186273, 27.995454 ], [ 105.167795, 28.021345 ], [ 105.186889, 28.054623 ], [ 105.168411, 28.071522 ], [ 105.119752, 28.07205 ], [ 105.061853, 28.096866 ], [ 105.002107, 28.064129 ], [ 104.980549, 28.063073 ], [ 104.975006, 28.020816 ], [ 104.903557, 27.962158 ], [ 104.918339, 27.938897 ], [ 104.888158, 27.914574 ], [ 104.842579, 27.900294 ], [ 104.796999, 27.901352 ], [ 104.761891, 27.884426 ], [ 104.743413, 27.901881 ], [ 104.676275, 27.880723 ], [ 104.63316, 27.850567 ], [ 104.607906, 27.857974 ], [ 104.573413, 27.840512 ], [ 104.52537, 27.889187 ], [ 104.508124, 27.878078 ], [ 104.44961, 27.927794 ], [ 104.40095, 27.952114 ], [ 104.362762, 28.012891 ], [ 104.30856, 28.036136 ], [ 104.304248, 28.050926 ], [ 104.373233, 28.051454 ], [ 104.40095, 28.091586 ], [ 104.448994, 28.113758 ], [ 104.444682, 28.16231 ], [ 104.406494, 28.173389 ], [ 104.402182, 28.202928 ], [ 104.442834, 28.211366 ], [ 104.462544, 28.241422 ], [ 104.44961, 28.269889 ], [ 104.420045, 28.269889 ], [ 104.392943, 28.291497 ], [ 104.384936, 28.329959 ], [ 104.343052, 28.334173 ], [ 104.314103, 28.306778 ], [ 104.282074, 28.343128 ], [ 104.254357, 28.403683 ], [ 104.267908, 28.499448 ], [ 104.260516, 28.536257 ], [ 104.323342, 28.540989 ], [ 104.355987, 28.555183 ], [ 104.375697, 28.5946 ], [ 104.417581, 28.598279 ], [ 104.425588, 28.626649 ], [ 104.372617, 28.649235 ], [ 104.314719, 28.615617 ], [ 104.277147, 28.631902 ], [ 104.252509, 28.660788 ], [ 104.230951, 28.635579 ], [ 104.170589, 28.642932 ], [ 104.117618, 28.634003 ], [ 104.09606, 28.603533 ], [ 104.05972, 28.6277 ], [ 103.953779, 28.600906 ], [ 103.910047, 28.631377 ], [ 103.887873, 28.61982 ], [ 103.850917, 28.66709 ], [ 103.833054, 28.605109 ], [ 103.838598, 28.587244 ], [ 103.802873, 28.563068 ], [ 103.781931, 28.525216 ], [ 103.829975, 28.459995 ], [ 103.828743, 28.44 ], [ 103.860156, 28.383677 ], [ 103.85338, 28.356822 ], [ 103.877402, 28.316262 ], [ 103.828743, 28.285173 ], [ 103.770845, 28.233514 ], [ 103.740048, 28.23615 ], [ 103.701859, 28.198709 ], [ 103.692004, 28.232459 ], [ 103.643961, 28.260401 ], [ 103.573128, 28.230877 ], [ 103.533092, 28.168641 ], [ 103.470266, 28.122204 ], [ 103.430846, 28.044587 ], [ 103.459179, 28.021345 ], [ 103.486281, 28.033495 ], [ 103.515846, 27.965329 ], [ 103.55465, 27.978543 ], [ 103.502295, 27.910343 ], [ 103.509686, 27.843687 ], [ 103.487512, 27.794992 ], [ 103.461027, 27.779638 ], [ 103.393274, 27.709194 ], [ 103.369868, 27.708664 ], [ 103.349542, 27.678459 ], [ 103.29226, 27.632872 ], [ 103.2861, 27.561802 ], [ 103.232514, 27.56976 ], [ 103.19063, 27.523596 ], [ 103.144434, 27.450331 ], [ 103.141355, 27.420586 ], [ 103.080992, 27.396679 ], [ 103.055739, 27.40943 ], [ 102.989833, 27.367983 ], [ 102.941174, 27.405711 ], [ 102.899906, 27.317481 ], [ 102.883892, 27.299401 ], [ 102.883276, 27.258444 ], [ 102.904218, 27.227584 ], [ 102.913457, 27.133886 ], [ 102.870957, 27.026782 ], [ 102.894979, 27.001724 ], [ 102.896211, 26.91264 ], [ 102.949181, 26.843244 ], [ 102.966428, 26.837904 ], [ 102.991681, 26.775409 ], [ 102.983674, 26.76686 ], [ 103.008312, 26.710741 ], [ 103.005232, 26.679195 ], [ 103.026174, 26.664221 ], [ 103.035413, 26.556673 ], [ 103.052659, 26.555602 ], [ 103.052659, 26.514374 ], [ 103.030485, 26.485989 ], [ 102.989833, 26.482775 ], [ 102.988602, 26.413117 ], [ 102.998457, 26.371839 ], [ 102.975667, 26.340736 ], [ 102.893131, 26.338591 ], [ 102.878964, 26.364332 ], [ 102.833385, 26.306406 ], [ 102.785342, 26.298895 ], [ 102.739762, 26.268846 ], [ 102.709581, 26.210336 ], [ 102.659074, 26.221611 ], [ 102.60056, 26.250598 ], [ 102.638748, 26.307479 ], [ 102.629509, 26.336982 ], [ 102.570995, 26.362723 ], [ 102.542046, 26.338591 ], [ 102.440416, 26.300505 ], [ 102.392372, 26.296749 ], [ 102.349257, 26.244694 ], [ 102.245163, 26.212483 ], [ 102.242699, 26.190468 ], [ 102.174946, 26.146961 ], [ 102.152156, 26.10935 ], [ 102.107808, 26.068501 ], [ 102.080091, 26.065275 ], [ 102.020961, 26.096451 ], [ 101.954439, 26.084627 ], [ 101.929186, 26.105588 ], [ 101.899621, 26.099139 ], [ 101.857737, 26.049146 ], [ 101.835563, 26.04592 ], [ 101.839875, 26.082477 ], [ 101.796759, 26.114723 ], [ 101.807846, 26.156093 ], [ 101.773353, 26.168448 ], [ 101.737013, 26.219463 ], [ 101.690202, 26.241473 ], [ 101.630455, 26.224832 ], [ 101.586108, 26.279579 ], [ 101.597195, 26.303187 ], [ 101.64031, 26.318745 ], [ 101.660636, 26.346635 ], [ 101.635383, 26.357361 ], [ 101.637847, 26.388995 ], [ 101.565782, 26.454381 ], [ 101.530057, 26.467239 ], [ 101.506652, 26.499915 ], [ 101.458608, 26.49563 ], [ 101.422884, 26.53151 ], [ 101.395783, 26.591998 ], [ 101.402558, 26.604841 ], [ 101.461688, 26.606447 ], [ 101.461072, 26.640687 ], [ 101.481398, 26.673313 ], [ 101.453065, 26.692563 ], [ 101.513427, 26.768463 ], [ 101.466, 26.786629 ], [ 101.445674, 26.77434 ], [ 101.458608, 26.731054 ], [ 101.435819, 26.740675 ], [ 101.389623, 26.723036 ], [ 101.387159, 26.753501 ], [ 101.358826, 26.771669 ], [ 101.399478, 26.841642 ], [ 101.365602, 26.883819 ], [ 101.311399, 26.903034 ], [ 101.267667, 26.903034 ], [ 101.264587, 26.955323 ], [ 101.227015, 26.959057 ], [ 101.228863, 26.981992 ], [ 101.136472, 27.023584 ], [ 101.157414, 27.094999 ], [ 101.145095, 27.103523 ], [ 101.170349, 27.175421 ], [ 101.167885, 27.198311 ] ] ], [ [ [ 106.264167, 30.20974 ], [ 106.260471, 30.19681 ], [ 106.260471, 30.204051 ], [ 106.260471, 30.207672 ], [ 106.264167, 30.20974 ] ] ], [ [ [ 106.976809, 30.088127 ], [ 106.977425, 30.087609 ], [ 106.978656, 30.087609 ], [ 106.979888, 30.088127 ], [ 106.980504, 30.087609 ], [ 106.981736, 30.08502 ], [ 106.976193, 30.083467 ], [ 106.975577, 30.088127 ], [ 106.976809, 30.088127 ] ] ], [ [ [ 105.558916, 30.18543 ], [ 105.56138, 30.183878 ], [ 105.550909, 30.179222 ], [ 105.556453, 30.187499 ], [ 105.558916, 30.18543 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"520000\", \"name\": \"贵州省\", \"center\": [ 106.713478, 26.578343 ], \"centroid\": [ 106.880457, 26.826368 ], \"childrenNum\": 9, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 23, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 109.274262, 28.494714 ], [ 109.260712, 28.46473 ], [ 109.264407, 28.392628 ], [ 109.289045, 28.373673 ], [ 109.268719, 28.33786 ], [ 109.275494, 28.313101 ], [ 109.317994, 28.277795 ], [ 109.33524, 28.293605 ], [ 109.388211, 28.268307 ], [ 109.367885, 28.254602 ], [ 109.340168, 28.19027 ], [ 109.33832, 28.141731 ], [ 109.314298, 28.103729 ], [ 109.298284, 28.036136 ], [ 109.335856, 28.063073 ], [ 109.378972, 28.034551 ], [ 109.362342, 28.007608 ], [ 109.319842, 27.988585 ], [ 109.30198, 27.956343 ], [ 109.32169, 27.868027 ], [ 109.346943, 27.838396 ], [ 109.332777, 27.782815 ], [ 109.37774, 27.736741 ], [ 109.366653, 27.721909 ], [ 109.414081, 27.725087 ], [ 109.470747, 27.680049 ], [ 109.45658, 27.673689 ], [ 109.470131, 27.62863 ], [ 109.451037, 27.586204 ], [ 109.461508, 27.567637 ], [ 109.404841, 27.55066 ], [ 109.303211, 27.47582 ], [ 109.300132, 27.423774 ], [ 109.245313, 27.41793 ], [ 109.202197, 27.450331 ], [ 109.167089, 27.41793 ], [ 109.141835, 27.448207 ], [ 109.142451, 27.418461 ], [ 109.103647, 27.336621 ], [ 109.044517, 27.331304 ], [ 109.053756, 27.293551 ], [ 108.983539, 27.26802 ], [ 108.963213, 27.235565 ], [ 108.907778, 27.204699 ], [ 108.926873, 27.160512 ], [ 108.878829, 27.106187 ], [ 108.79075, 27.084343 ], [ 108.877597, 27.01612 ], [ 108.942887, 27.017186 ], [ 108.942887, 27.017186 ], [ 108.940423, 27.044907 ], [ 109.007561, 27.08008 ], [ 109.032814, 27.104056 ], [ 109.128901, 27.122701 ], [ 109.101183, 27.06889 ], [ 109.165857, 27.066758 ], [ 109.21698, 27.114711 ], [ 109.239154, 27.14933 ], [ 109.264407, 27.131755 ], [ 109.33524, 27.139212 ], [ 109.358646, 27.153058 ], [ 109.415312, 27.154123 ], [ 109.441182, 27.117907 ], [ 109.472595, 27.134951 ], [ 109.454733, 27.069423 ], [ 109.486761, 27.053968 ], [ 109.497848, 27.079548 ], [ 109.520022, 27.058764 ], [ 109.555131, 26.946788 ], [ 109.436254, 26.892359 ], [ 109.452885, 26.861932 ], [ 109.467051, 26.83203 ], [ 109.47629, 26.829894 ], [ 109.486761, 26.759913 ], [ 109.447957, 26.759913 ], [ 109.407305, 26.719829 ], [ 109.35495, 26.693098 ], [ 109.283501, 26.698445 ], [ 109.306291, 26.661012 ], [ 109.334008, 26.646036 ], [ 109.35495, 26.658873 ], [ 109.390675, 26.598955 ], [ 109.407305, 26.533116 ], [ 109.381436, 26.518659 ], [ 109.385747, 26.493487 ], [ 109.362342, 26.472061 ], [ 109.38082, 26.454381 ], [ 109.319842, 26.418477 ], [ 109.29582, 26.350389 ], [ 109.271183, 26.327863 ], [ 109.285965, 26.295676 ], [ 109.325385, 26.29031 ], [ 109.351255, 26.264016 ], [ 109.369733, 26.277432 ], [ 109.442414, 26.289774 ], [ 109.467051, 26.313917 ], [ 109.439334, 26.238789 ], [ 109.47629, 26.148035 ], [ 109.513863, 26.128157 ], [ 109.502776, 26.096451 ], [ 109.449805, 26.101826 ], [ 109.452885, 26.055598 ], [ 109.48245, 26.029788 ], [ 109.462124, 25.995367 ], [ 109.408537, 25.967392 ], [ 109.435022, 25.93349 ], [ 109.396834, 25.900117 ], [ 109.359262, 25.836036 ], [ 109.339552, 25.83442 ], [ 109.327849, 25.76168 ], [ 109.340168, 25.731493 ], [ 109.296436, 25.71424 ], [ 109.207125, 25.740119 ], [ 109.206509, 25.788087 ], [ 109.147995, 25.741736 ], [ 109.13198, 25.762758 ], [ 109.143683, 25.795092 ], [ 109.095024, 25.80533 ], [ 109.077778, 25.776771 ], [ 109.048213, 25.790781 ], [ 108.989698, 25.778926 ], [ 108.999553, 25.765453 ], [ 108.963829, 25.732572 ], [ 108.940423, 25.740119 ], [ 108.896076, 25.71424 ], [ 108.900387, 25.682423 ], [ 108.953974, 25.686738 ], [ 108.953974, 25.686738 ], [ 109.007561, 25.734728 ], [ 109.043285, 25.738502 ], [ 109.07901, 25.72071 ], [ 109.075314, 25.693749 ], [ 109.030966, 25.629556 ], [ 109.051908, 25.566949 ], [ 109.088249, 25.550752 ], [ 109.024807, 25.51241 ], [ 108.949046, 25.557231 ], [ 108.8893, 25.543193 ], [ 108.890532, 25.556151 ], [ 108.826474, 25.550212 ], [ 108.814772, 25.526992 ], [ 108.781511, 25.554531 ], [ 108.799989, 25.576666 ], [ 108.783975, 25.628477 ], [ 108.724844, 25.634952 ], [ 108.68912, 25.623081 ], [ 108.68604, 25.587462 ], [ 108.660787, 25.584763 ], [ 108.658323, 25.550212 ], [ 108.68912, 25.533473 ], [ 108.634917, 25.520512 ], [ 108.6072, 25.491885 ], [ 108.600425, 25.432448 ], [ 108.62999, 25.335666 ], [ 108.625062, 25.308076 ], [ 108.589338, 25.335125 ], [ 108.585642, 25.365952 ], [ 108.471693, 25.458928 ], [ 108.418723, 25.443257 ], [ 108.400244, 25.491344 ], [ 108.359592, 25.513491 ], [ 108.348506, 25.536173 ], [ 108.308469, 25.525912 ], [ 108.280752, 25.48 ], [ 108.241332, 25.46217 ], [ 108.251803, 25.430286 ], [ 108.192673, 25.458928 ], [ 108.162492, 25.444878 ], [ 108.193289, 25.405421 ], [ 108.142782, 25.390825 ], [ 108.152021, 25.324306 ], [ 108.143398, 25.269658 ], [ 108.115065, 25.210112 ], [ 108.080572, 25.193867 ], [ 108.001732, 25.196574 ], [ 107.928435, 25.155954 ], [ 107.872384, 25.141327 ], [ 107.839124, 25.115861 ], [ 107.762747, 25.125073 ], [ 107.789233, 25.15487 ], [ 107.760283, 25.188451 ], [ 107.762131, 25.229061 ], [ 107.741805, 25.24043 ], [ 107.700537, 25.194408 ], [ 107.696226, 25.219858 ], [ 107.661733, 25.258833 ], [ 107.659885, 25.316192 ], [ 107.632168, 25.310241 ], [ 107.599523, 25.250714 ], [ 107.576734, 25.256668 ], [ 107.512676, 25.209029 ], [ 107.472024, 25.213902 ], [ 107.489886, 25.276693 ], [ 107.481263, 25.299961 ], [ 107.432604, 25.289139 ], [ 107.409198, 25.347024 ], [ 107.420901, 25.392987 ], [ 107.375937, 25.411908 ], [ 107.358691, 25.393528 ], [ 107.318039, 25.401637 ], [ 107.308184, 25.432988 ], [ 107.336517, 25.461089 ], [ 107.263836, 25.543193 ], [ 107.232423, 25.556691 ], [ 107.228728, 25.604733 ], [ 107.205322, 25.607971 ], [ 107.185612, 25.578825 ], [ 107.064272, 25.559391 ], [ 107.066736, 25.50917 ], [ 107.015613, 25.495666 ], [ 106.996519, 25.442716 ], [ 106.963874, 25.437852 ], [ 106.987896, 25.358922 ], [ 107.012533, 25.352973 ], [ 107.013765, 25.275611 ], [ 106.975577, 25.232851 ], [ 106.933077, 25.250714 ], [ 106.904128, 25.231768 ], [ 106.888113, 25.181953 ], [ 106.853005, 25.186827 ], [ 106.787715, 25.17112 ], [ 106.764926, 25.183036 ], [ 106.732281, 25.162454 ], [ 106.691013, 25.179245 ], [ 106.644817, 25.164621 ], [ 106.63989, 25.132658 ], [ 106.590615, 25.08768 ], [ 106.551195, 25.082802 ], [ 106.519782, 25.054072 ], [ 106.450181, 25.033468 ], [ 106.442173, 25.019369 ], [ 106.332536, 24.988454 ], [ 106.304819, 24.973807 ], [ 106.253696, 24.971094 ], [ 106.215508, 24.981944 ], [ 106.191486, 24.95319 ], [ 106.145291, 24.954275 ], [ 106.197645, 24.885889 ], [ 106.206269, 24.851139 ], [ 106.173008, 24.760417 ], [ 106.150218, 24.762591 ], [ 106.113878, 24.714216 ], [ 106.047356, 24.684312 ], [ 106.024566, 24.633186 ], [ 105.961741, 24.677786 ], [ 105.942031, 24.725088 ], [ 105.863806, 24.729437 ], [ 105.827466, 24.702799 ], [ 105.767104, 24.719109 ], [ 105.70551, 24.768569 ], [ 105.617431, 24.78161 ], [ 105.607576, 24.803885 ], [ 105.573083, 24.797366 ], [ 105.497322, 24.809318 ], [ 105.493011, 24.833217 ], [ 105.457286, 24.87123 ], [ 105.428337, 24.930941 ], [ 105.365511, 24.943423 ], [ 105.334099, 24.9266 ], [ 105.267577, 24.929313 ], [ 105.251563, 24.967296 ], [ 105.212758, 24.995505 ], [ 105.178266, 24.985199 ], [ 105.157324, 24.958616 ], [ 105.131454, 24.959701 ], [ 105.09573, 24.92877 ], [ 105.077868, 24.918459 ], [ 105.039064, 24.872859 ], [ 105.026745, 24.815836 ], [ 105.03352, 24.787586 ], [ 104.899245, 24.752809 ], [ 104.865985, 24.730524 ], [ 104.841963, 24.676155 ], [ 104.771746, 24.659839 ], [ 104.729246, 24.617953 ], [ 104.703377, 24.645698 ], [ 104.628848, 24.660927 ], [ 104.595587, 24.709323 ], [ 104.529682, 24.731611 ], [ 104.542616, 24.75607 ], [ 104.539537, 24.813663 ], [ 104.586964, 24.872859 ], [ 104.635623, 24.903803 ], [ 104.663957, 24.964584 ], [ 104.713232, 24.996048 ], [ 104.684898, 25.054072 ], [ 104.619609, 25.060577 ], [ 104.685514, 25.078466 ], [ 104.695369, 25.122364 ], [ 104.732326, 25.167871 ], [ 104.724319, 25.195491 ], [ 104.753884, 25.214443 ], [ 104.801927, 25.163537 ], [ 104.822869, 25.170037 ], [ 104.806854, 25.224189 ], [ 104.826565, 25.235558 ], [ 104.816094, 25.262622 ], [ 104.736021, 25.268034 ], [ 104.689826, 25.296173 ], [ 104.639935, 25.295632 ], [ 104.646094, 25.356759 ], [ 104.615913, 25.364871 ], [ 104.566638, 25.402719 ], [ 104.543232, 25.400556 ], [ 104.556783, 25.524832 ], [ 104.524138, 25.526992 ], [ 104.483486, 25.494585 ], [ 104.44961, 25.495126 ], [ 104.434827, 25.472436 ], [ 104.418813, 25.499447 ], [ 104.436059, 25.520512 ], [ 104.428668, 25.576126 ], [ 104.389248, 25.595558 ], [ 104.332581, 25.598796 ], [ 104.310407, 25.647901 ], [ 104.328886, 25.760602 ], [ 104.370769, 25.730415 ], [ 104.397871, 25.76168 ], [ 104.42374, 25.841961 ], [ 104.441602, 25.868889 ], [ 104.414501, 25.909807 ], [ 104.438523, 25.92757 ], [ 104.470552, 26.009352 ], [ 104.460081, 26.085702 ], [ 104.499501, 26.070651 ], [ 104.52845, 26.114186 ], [ 104.518595, 26.165762 ], [ 104.548776, 26.226979 ], [ 104.542616, 26.253282 ], [ 104.592508, 26.317672 ], [ 104.659645, 26.335373 ], [ 104.684283, 26.3772 ], [ 104.664572, 26.397572 ], [ 104.665804, 26.434019 ], [ 104.631928, 26.451702 ], [ 104.638703, 26.477954 ], [ 104.598667, 26.520801 ], [ 104.57095, 26.524549 ], [ 104.579573, 26.568449 ], [ 104.556783, 26.590393 ], [ 104.488414, 26.579689 ], [ 104.459465, 26.602701 ], [ 104.468088, 26.644431 ], [ 104.424356, 26.709137 ], [ 104.398487, 26.686147 ], [ 104.353523, 26.620893 ], [ 104.313487, 26.612867 ], [ 104.274683, 26.633733 ], [ 104.268524, 26.617683 ], [ 104.222328, 26.620358 ], [ 104.160734, 26.646571 ], [ 104.121314, 26.638012 ], [ 104.068343, 26.573266 ], [ 104.067727, 26.51491 ], [ 104.008597, 26.511697 ], [ 103.953163, 26.521336 ], [ 103.865699, 26.512232 ], [ 103.819504, 26.529903 ], [ 103.815808, 26.55239 ], [ 103.763453, 26.585041 ], [ 103.748671, 26.623568 ], [ 103.759142, 26.689355 ], [ 103.773308, 26.716621 ], [ 103.725265, 26.742812 ], [ 103.705555, 26.794642 ], [ 103.722185, 26.851253 ], [ 103.779468, 26.87421 ], [ 103.763453, 26.905702 ], [ 103.775156, 26.951056 ], [ 103.753598, 26.963858 ], [ 103.73204, 27.018785 ], [ 103.704939, 27.049171 ], [ 103.675374, 27.051836 ], [ 103.623019, 27.007056 ], [ 103.623635, 27.035312 ], [ 103.601461, 27.061962 ], [ 103.614396, 27.079548 ], [ 103.659975, 27.065692 ], [ 103.652584, 27.092868 ], [ 103.620555, 27.096598 ], [ 103.63349, 27.12057 ], [ 103.696316, 27.126429 ], [ 103.748671, 27.210021 ], [ 103.801641, 27.250464 ], [ 103.80041, 27.26536 ], [ 103.865699, 27.28185 ], [ 103.874322, 27.331304 ], [ 103.903271, 27.347785 ], [ 103.905119, 27.38552 ], [ 103.932221, 27.443958 ], [ 103.956242, 27.425367 ], [ 104.015372, 27.429086 ], [ 104.01722, 27.383926 ], [ 104.084358, 27.330773 ], [ 104.113923, 27.338216 ], [ 104.173053, 27.263232 ], [ 104.210625, 27.297273 ], [ 104.248813, 27.291955 ], [ 104.247582, 27.336621 ], [ 104.295625, 27.37436 ], [ 104.30856, 27.407305 ], [ 104.363378, 27.467855 ], [ 104.467472, 27.414211 ], [ 104.497037, 27.414743 ], [ 104.539537, 27.327583 ], [ 104.570334, 27.331836 ], [ 104.611602, 27.306846 ], [ 104.7545, 27.345658 ], [ 104.77113, 27.317481 ], [ 104.824717, 27.3531 ], [ 104.856746, 27.332368 ], [ 104.851818, 27.299401 ], [ 104.871528, 27.290891 ], [ 104.913412, 27.327051 ], [ 105.01073, 27.379143 ], [ 105.068013, 27.418461 ], [ 105.120984, 27.418461 ], [ 105.184425, 27.392959 ], [ 105.182577, 27.367451 ], [ 105.233084, 27.436522 ], [ 105.234316, 27.489093 ], [ 105.260186, 27.514573 ], [ 105.232469, 27.546945 ], [ 105.25649, 27.582491 ], [ 105.304533, 27.611661 ], [ 105.29591, 27.631811 ], [ 105.308229, 27.704955 ], [ 105.353809, 27.748924 ], [ 105.44004, 27.775402 ], [ 105.508409, 27.769048 ], [ 105.560148, 27.71979 ], [ 105.605112, 27.715552 ], [ 105.62359, 27.666269 ], [ 105.664242, 27.683759 ], [ 105.720292, 27.683759 ], [ 105.722756, 27.706015 ], [ 105.76772, 27.7182 ], [ 105.848408, 27.707074 ], [ 105.868118, 27.732504 ], [ 105.922937, 27.746805 ], [ 105.92848, 27.729855 ], [ 105.985146, 27.749983 ], [ 106.023335, 27.746805 ], [ 106.063987, 27.776991 ], [ 106.120653, 27.779638 ], [ 106.193334, 27.75422 ], [ 106.242609, 27.767459 ], [ 106.306667, 27.808756 ], [ 106.337464, 27.859033 ], [ 106.325145, 27.898708 ], [ 106.304819, 27.899237 ], [ 106.307899, 27.936782 ], [ 106.328225, 27.952643 ], [ 106.286341, 28.007079 ], [ 106.246305, 28.011835 ], [ 106.266631, 28.066769 ], [ 106.206885, 28.134343 ], [ 106.145291, 28.162837 ], [ 106.093552, 28.162837 ], [ 105.975907, 28.107952 ], [ 105.943878, 28.143314 ], [ 105.895219, 28.119565 ], [ 105.860727, 28.159672 ], [ 105.889676, 28.237732 ], [ 105.848408, 28.255656 ], [ 105.824386, 28.306251 ], [ 105.78743, 28.335753 ], [ 105.76464, 28.308359 ], [ 105.76464, 28.308359 ], [ 105.737539, 28.30309 ], [ 105.730147, 28.271997 ], [ 105.68888, 28.284119 ], [ 105.639604, 28.324164 ], [ 105.655003, 28.362615 ], [ 105.643916, 28.431053 ], [ 105.612503, 28.438947 ], [ 105.62359, 28.517854 ], [ 105.68272, 28.534154 ], [ 105.693191, 28.58882 ], [ 105.712901, 28.586718 ], [ 105.74493, 28.616668 ], [ 105.757249, 28.590397 ], [ 105.78435, 28.610889 ], [ 105.808372, 28.599855 ], [ 105.884748, 28.595126 ], [ 105.889676, 28.670765 ], [ 105.937719, 28.686517 ], [ 105.966668, 28.761041 ], [ 106.001161, 28.743727 ], [ 106.030726, 28.694917 ], [ 106.085544, 28.681792 ], [ 106.103407, 28.636104 ], [ 106.14837, 28.642932 ], [ 106.17116, 28.629275 ], [ 106.184711, 28.58882 ], [ 106.254928, 28.539412 ], [ 106.2925, 28.537309 ], [ 106.304819, 28.505233 ], [ 106.349167, 28.473674 ], [ 106.379348, 28.479986 ], [ 106.37442, 28.525742 ], [ 106.403369, 28.569901 ], [ 106.477282, 28.530474 ], [ 106.504999, 28.544669 ], [ 106.466811, 28.586193 ], [ 106.49268, 28.591448 ], [ 106.502535, 28.661313 ], [ 106.528405, 28.677591 ], [ 106.492064, 28.742153 ], [ 106.461883, 28.761041 ], [ 106.45326, 28.817162 ], [ 106.474202, 28.832891 ], [ 106.561666, 28.756319 ], [ 106.56105, 28.719062 ], [ 106.587535, 28.691767 ], [ 106.6171, 28.691242 ], [ 106.617716, 28.66709 ], [ 106.651593, 28.649235 ], [ 106.618332, 28.645033 ], [ 106.63681, 28.622972 ], [ 106.606629, 28.593024 ], [ 106.615252, 28.549401 ], [ 106.567825, 28.523638 ], [ 106.564745, 28.485247 ], [ 106.632499, 28.503655 ], [ 106.697788, 28.47683 ], [ 106.708259, 28.450524 ], [ 106.747063, 28.467361 ], [ 106.726121, 28.51838 ], [ 106.73844, 28.554657 ], [ 106.77786, 28.563068 ], [ 106.756918, 28.607211 ], [ 106.784636, 28.626649 ], [ 106.807425, 28.589346 ], [ 106.830831, 28.623497 ], [ 106.866556, 28.624548 ], [ 106.889345, 28.695966 ], [ 106.86594, 28.690192 ], [ 106.824056, 28.756319 ], [ 106.845614, 28.780975 ], [ 106.872099, 28.777304 ], [ 106.923222, 28.809821 ], [ 106.951555, 28.766812 ], [ 106.988512, 28.776254 ], [ 106.983584, 28.851239 ], [ 107.019308, 28.861722 ], [ 107.016229, 28.882685 ], [ 107.14188, 28.887925 ], [ 107.206554, 28.868535 ], [ 107.194851, 28.838134 ], [ 107.227496, 28.836037 ], [ 107.210866, 28.817686 ], [ 107.219489, 28.772582 ], [ 107.24659, 28.76209 ], [ 107.261373, 28.792514 ], [ 107.327894, 28.810869 ], [ 107.339597, 28.845997 ], [ 107.383945, 28.848618 ], [ 107.41351, 28.911502 ], [ 107.441227, 28.943977 ], [ 107.412894, 28.960211 ], [ 107.396879, 28.993718 ], [ 107.364235, 29.00942 ], [ 107.395647, 29.041341 ], [ 107.369778, 29.091558 ], [ 107.412278, 29.094696 ], [ 107.427676, 29.128682 ], [ 107.408582, 29.138091 ], [ 107.401807, 29.184603 ], [ 107.441227, 29.203934 ], [ 107.486806, 29.174153 ], [ 107.570574, 29.218037 ], [ 107.589052, 29.150113 ], [ 107.605683, 29.164747 ], [ 107.659885, 29.162656 ], [ 107.700537, 29.141228 ], [ 107.749197, 29.199754 ], [ 107.810791, 29.139137 ], [ 107.784921, 29.048143 ], [ 107.823725, 29.034016 ], [ 107.810175, 28.984295 ], [ 107.867457, 28.960211 ], [ 107.882855, 29.00628 ], [ 107.908725, 29.007327 ], [ 107.925971, 29.032446 ], [ 108.026369, 29.039772 ], [ 108.070717, 29.086328 ], [ 108.150173, 29.053375 ], [ 108.193289, 29.072207 ], [ 108.256115, 29.040295 ], [ 108.277673, 29.091558 ], [ 108.306622, 29.079006 ], [ 108.297999, 29.045527 ], [ 108.319556, 28.961258 ], [ 108.345426, 28.943453 ], [ 108.357745, 28.893165 ], [ 108.346658, 28.859625 ], [ 108.352817, 28.815589 ], [ 108.386078, 28.803003 ], [ 108.385462, 28.772058 ], [ 108.347274, 28.736381 ], [ 108.332491, 28.679166 ], [ 108.439049, 28.634003 ], [ 108.501258, 28.626649 ], [ 108.50249, 28.63768 ], [ 108.575787, 28.659738 ], [ 108.636149, 28.621396 ], [ 108.604736, 28.590922 ], [ 108.610896, 28.539412 ], [ 108.573939, 28.531 ], [ 108.586874, 28.463678 ], [ 108.609664, 28.43579 ], [ 108.609048, 28.407368 ], [ 108.576403, 28.38631 ], [ 108.580099, 28.343128 ], [ 108.611512, 28.324691 ], [ 108.667562, 28.334173 ], [ 108.656475, 28.359981 ], [ 108.697127, 28.401051 ], [ 108.688504, 28.422106 ], [ 108.640461, 28.456838 ], [ 108.657091, 28.47683 ], [ 108.700207, 28.48209 ], [ 108.709446, 28.501026 ], [ 108.746402, 28.45105 ], [ 108.780279, 28.42579 ], [ 108.759953, 28.389995 ], [ 108.783359, 28.380518 ], [ 108.761801, 28.304143 ], [ 108.726692, 28.282011 ], [ 108.738395, 28.228241 ], [ 108.772888, 28.212949 ], [ 108.821547, 28.245113 ], [ 108.855424, 28.199764 ], [ 108.89546, 28.219804 ], [ 108.923793, 28.217167 ], [ 108.929952, 28.19027 ], [ 109.005713, 28.162837 ], [ 109.026655, 28.220331 ], [ 109.086401, 28.184467 ], [ 109.101799, 28.202401 ], [ 109.081473, 28.247749 ], [ 109.117198, 28.277795 ], [ 109.152306, 28.349975 ], [ 109.153538, 28.417369 ], [ 109.191726, 28.471043 ], [ 109.23361, 28.474726 ], [ 109.274262, 28.494714 ] ] ], [ [ [ 109.47629, 26.829894 ], [ 109.467051, 26.83203 ], [ 109.452885, 26.861932 ], [ 109.486761, 26.895562 ], [ 109.509551, 26.877947 ], [ 109.513247, 26.84004 ], [ 109.497232, 26.815474 ], [ 109.522486, 26.749226 ], [ 109.52187, 26.749226 ], [ 109.486761, 26.759913 ], [ 109.47629, 26.829894 ] ] ], [ [ [ 109.528645, 26.743881 ], [ 109.554515, 26.73533 ], [ 109.597015, 26.756173 ], [ 109.568065, 26.726243 ], [ 109.528645, 26.743881 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"530000\", \"name\": \"云南省\", \"center\": [ 102.712251, 25.040609 ], \"centroid\": [ 101.485106, 25.008644 ], \"childrenNum\": 16, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 24, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 105.308229, 27.704955 ], [ 105.29591, 27.631811 ], [ 105.304533, 27.611661 ], [ 105.25649, 27.582491 ], [ 105.232469, 27.546945 ], [ 105.260186, 27.514573 ], [ 105.234316, 27.489093 ], [ 105.233084, 27.436522 ], [ 105.182577, 27.367451 ], [ 105.184425, 27.392959 ], [ 105.120984, 27.418461 ], [ 105.068013, 27.418461 ], [ 105.01073, 27.379143 ], [ 104.913412, 27.327051 ], [ 104.871528, 27.290891 ], [ 104.851818, 27.299401 ], [ 104.856746, 27.332368 ], [ 104.824717, 27.3531 ], [ 104.77113, 27.317481 ], [ 104.7545, 27.345658 ], [ 104.611602, 27.306846 ], [ 104.570334, 27.331836 ], [ 104.539537, 27.327583 ], [ 104.497037, 27.414743 ], [ 104.467472, 27.414211 ], [ 104.363378, 27.467855 ], [ 104.30856, 27.407305 ], [ 104.295625, 27.37436 ], [ 104.247582, 27.336621 ], [ 104.248813, 27.291955 ], [ 104.210625, 27.297273 ], [ 104.173053, 27.263232 ], [ 104.113923, 27.338216 ], [ 104.084358, 27.330773 ], [ 104.01722, 27.383926 ], [ 104.015372, 27.429086 ], [ 103.956242, 27.425367 ], [ 103.932221, 27.443958 ], [ 103.905119, 27.38552 ], [ 103.903271, 27.347785 ], [ 103.874322, 27.331304 ], [ 103.865699, 27.28185 ], [ 103.80041, 27.26536 ], [ 103.801641, 27.250464 ], [ 103.748671, 27.210021 ], [ 103.696316, 27.126429 ], [ 103.63349, 27.12057 ], [ 103.620555, 27.096598 ], [ 103.652584, 27.092868 ], [ 103.659975, 27.065692 ], [ 103.614396, 27.079548 ], [ 103.601461, 27.061962 ], [ 103.623635, 27.035312 ], [ 103.623019, 27.007056 ], [ 103.675374, 27.051836 ], [ 103.704939, 27.049171 ], [ 103.73204, 27.018785 ], [ 103.753598, 26.963858 ], [ 103.775156, 26.951056 ], [ 103.763453, 26.905702 ], [ 103.779468, 26.87421 ], [ 103.722185, 26.851253 ], [ 103.705555, 26.794642 ], [ 103.725265, 26.742812 ], [ 103.773308, 26.716621 ], [ 103.759142, 26.689355 ], [ 103.748671, 26.623568 ], [ 103.763453, 26.585041 ], [ 103.815808, 26.55239 ], [ 103.819504, 26.529903 ], [ 103.865699, 26.512232 ], [ 103.953163, 26.521336 ], [ 104.008597, 26.511697 ], [ 104.067727, 26.51491 ], [ 104.068343, 26.573266 ], [ 104.121314, 26.638012 ], [ 104.160734, 26.646571 ], [ 104.222328, 26.620358 ], [ 104.268524, 26.617683 ], [ 104.274683, 26.633733 ], [ 104.313487, 26.612867 ], [ 104.353523, 26.620893 ], [ 104.398487, 26.686147 ], [ 104.424356, 26.709137 ], [ 104.468088, 26.644431 ], [ 104.459465, 26.602701 ], [ 104.488414, 26.579689 ], [ 104.556783, 26.590393 ], [ 104.579573, 26.568449 ], [ 104.57095, 26.524549 ], [ 104.598667, 26.520801 ], [ 104.638703, 26.477954 ], [ 104.631928, 26.451702 ], [ 104.665804, 26.434019 ], [ 104.664572, 26.397572 ], [ 104.684283, 26.3772 ], [ 104.659645, 26.335373 ], [ 104.592508, 26.317672 ], [ 104.542616, 26.253282 ], [ 104.548776, 26.226979 ], [ 104.518595, 26.165762 ], [ 104.52845, 26.114186 ], [ 104.499501, 26.070651 ], [ 104.460081, 26.085702 ], [ 104.470552, 26.009352 ], [ 104.438523, 25.92757 ], [ 104.414501, 25.909807 ], [ 104.441602, 25.868889 ], [ 104.42374, 25.841961 ], [ 104.397871, 25.76168 ], [ 104.370769, 25.730415 ], [ 104.328886, 25.760602 ], [ 104.310407, 25.647901 ], [ 104.332581, 25.598796 ], [ 104.389248, 25.595558 ], [ 104.428668, 25.576126 ], [ 104.436059, 25.520512 ], [ 104.418813, 25.499447 ], [ 104.434827, 25.472436 ], [ 104.44961, 25.495126 ], [ 104.483486, 25.494585 ], [ 104.524138, 25.526992 ], [ 104.556783, 25.524832 ], [ 104.543232, 25.400556 ], [ 104.566638, 25.402719 ], [ 104.615913, 25.364871 ], [ 104.646094, 25.356759 ], [ 104.639935, 25.295632 ], [ 104.689826, 25.296173 ], [ 104.736021, 25.268034 ], [ 104.816094, 25.262622 ], [ 104.826565, 25.235558 ], [ 104.806854, 25.224189 ], [ 104.822869, 25.170037 ], [ 104.801927, 25.163537 ], [ 104.753884, 25.214443 ], [ 104.724319, 25.195491 ], [ 104.732326, 25.167871 ], [ 104.695369, 25.122364 ], [ 104.685514, 25.078466 ], [ 104.619609, 25.060577 ], [ 104.684898, 25.054072 ], [ 104.713232, 24.996048 ], [ 104.663957, 24.964584 ], [ 104.635623, 24.903803 ], [ 104.586964, 24.872859 ], [ 104.539537, 24.813663 ], [ 104.542616, 24.75607 ], [ 104.529682, 24.731611 ], [ 104.489646, 24.653313 ], [ 104.520443, 24.535228 ], [ 104.550008, 24.518894 ], [ 104.575877, 24.424661 ], [ 104.616529, 24.421937 ], [ 104.63008, 24.397958 ], [ 104.610986, 24.377246 ], [ 104.641783, 24.367979 ], [ 104.70892, 24.321087 ], [ 104.721239, 24.340173 ], [ 104.703377, 24.419757 ], [ 104.715695, 24.441552 ], [ 104.74834, 24.435559 ], [ 104.765587, 24.45953 ], [ 104.784681, 24.443732 ], [ 104.83642, 24.446456 ], [ 104.914028, 24.426296 ], [ 104.930042, 24.411038 ], [ 104.979933, 24.412673 ], [ 105.042759, 24.442097 ], [ 105.106817, 24.414853 ], [ 105.111744, 24.37234 ], [ 105.138846, 24.376701 ], [ 105.188121, 24.347261 ], [ 105.196744, 24.326541 ], [ 105.164715, 24.288362 ], [ 105.215222, 24.214699 ], [ 105.24294, 24.208695 ], [ 105.229389, 24.165567 ], [ 105.182577, 24.167205 ], [ 105.20044, 24.105491 ], [ 105.260186, 24.061236 ], [ 105.292831, 24.074896 ], [ 105.273121, 24.092927 ], [ 105.320548, 24.116416 ], [ 105.334099, 24.094566 ], [ 105.395692, 24.065607 ], [ 105.406163, 24.043748 ], [ 105.493011, 24.016965 ], [ 105.533663, 24.130071 ], [ 105.594641, 24.137718 ], [ 105.628518, 24.126794 ], [ 105.649459, 24.032816 ], [ 105.704278, 24.0667 ], [ 105.739387, 24.059596 ], [ 105.765256, 24.073804 ], [ 105.802212, 24.051945 ], [ 105.796669, 24.023524 ], [ 105.841633, 24.03063 ], [ 105.859495, 24.056864 ], [ 105.89214, 24.040468 ], [ 105.908154, 24.069432 ], [ 105.901995, 24.099482 ], [ 105.919241, 24.122425 ], [ 105.963589, 24.110954 ], [ 105.998081, 24.120786 ], [ 106.011632, 24.099482 ], [ 106.04982, 24.089649 ], [ 106.053516, 24.051399 ], [ 106.096631, 24.018058 ], [ 106.091088, 23.998924 ], [ 106.128044, 23.956819 ], [ 106.157609, 23.891174 ], [ 106.192718, 23.879135 ], [ 106.173008, 23.861622 ], [ 106.192102, 23.824947 ], [ 106.136667, 23.795381 ], [ 106.157609, 23.724175 ], [ 106.149602, 23.665538 ], [ 106.120653, 23.605229 ], [ 106.141595, 23.569579 ], [ 106.08616, 23.524043 ], [ 106.071994, 23.495506 ], [ 106.039965, 23.484529 ], [ 105.999929, 23.447748 ], [ 105.986378, 23.489469 ], [ 105.935871, 23.508678 ], [ 105.913081, 23.499348 ], [ 105.89214, 23.52514 ], [ 105.852103, 23.526786 ], [ 105.815763, 23.507031 ], [ 105.805908, 23.467512 ], [ 105.758481, 23.459826 ], [ 105.699966, 23.40162 ], [ 105.637757, 23.404366 ], [ 105.694423, 23.363168 ], [ 105.699966, 23.327453 ], [ 105.649459, 23.346136 ], [ 105.593409, 23.312614 ], [ 105.560148, 23.257093 ], [ 105.526272, 23.234548 ], [ 105.542902, 23.184495 ], [ 105.50225, 23.202648 ], [ 105.445584, 23.292827 ], [ 105.416018, 23.283482 ], [ 105.372903, 23.317561 ], [ 105.353809, 23.362069 ], [ 105.325475, 23.390086 ], [ 105.260186, 23.31811 ], [ 105.238012, 23.26424 ], [ 105.181962, 23.279084 ], [ 105.122215, 23.247745 ], [ 105.093266, 23.260942 ], [ 104.958991, 23.188896 ], [ 104.949136, 23.152033 ], [ 104.912796, 23.175693 ], [ 104.882615, 23.163589 ], [ 104.874608, 23.123417 ], [ 104.804391, 23.110207 ], [ 104.821021, 23.032022 ], [ 104.860441, 22.970874 ], [ 104.846275, 22.926235 ], [ 104.772362, 22.893711 ], [ 104.760659, 22.862282 ], [ 104.732942, 22.852356 ], [ 104.737869, 22.825882 ], [ 104.674428, 22.817056 ], [ 104.596203, 22.846289 ], [ 104.527834, 22.814298 ], [ 104.498885, 22.774574 ], [ 104.422508, 22.734838 ], [ 104.375697, 22.690122 ], [ 104.323342, 22.728767 ], [ 104.272835, 22.73815 ], [ 104.256821, 22.77347 ], [ 104.274067, 22.828088 ], [ 104.261748, 22.841877 ], [ 104.224176, 22.826434 ], [ 104.117618, 22.808781 ], [ 104.089901, 22.768504 ], [ 104.045553, 22.728215 ], [ 104.04309, 22.67687 ], [ 104.022148, 22.593463 ], [ 104.009213, 22.575228 ], [ 104.009213, 22.517745 ], [ 103.964865, 22.502265 ], [ 103.894032, 22.564728 ], [ 103.875554, 22.565833 ], [ 103.863851, 22.584069 ], [ 103.825047, 22.615562 ], [ 103.766533, 22.688465 ], [ 103.669215, 22.766297 ], [ 103.642113, 22.794989 ], [ 103.567585, 22.701164 ], [ 103.580519, 22.66693 ], [ 103.529396, 22.59291 ], [ 103.50907, 22.601198 ], [ 103.457947, 22.658646 ], [ 103.436389, 22.6973 ], [ 103.441317, 22.753052 ], [ 103.375411, 22.794989 ], [ 103.323057, 22.807678 ], [ 103.321209, 22.777885 ], [ 103.288564, 22.732078 ], [ 103.283021, 22.678526 ], [ 103.220195, 22.643734 ], [ 103.195557, 22.648153 ], [ 103.161065, 22.590147 ], [ 103.183238, 22.558649 ], [ 103.119181, 22.518298 ], [ 103.085304, 22.509452 ], [ 103.071753, 22.445304 ], [ 103.030485, 22.441432 ], [ 102.986754, 22.477935 ], [ 102.930703, 22.482359 ], [ 102.892515, 22.533223 ], [ 102.880196, 22.586832 ], [ 102.82353, 22.623296 ], [ 102.80074, 22.620534 ], [ 102.688639, 22.70006 ], [ 102.657226, 22.687913 ], [ 102.607335, 22.730975 ], [ 102.569763, 22.701164 ], [ 102.551285, 22.743669 ], [ 102.498314, 22.777885 ], [ 102.45951, 22.762986 ], [ 102.43672, 22.699508 ], [ 102.384365, 22.679631 ], [ 102.404691, 22.629925 ], [ 102.356648, 22.563623 ], [ 102.322771, 22.554227 ], [ 102.25625, 22.457473 ], [ 102.270416, 22.419858 ], [ 102.179257, 22.430369 ], [ 102.145381, 22.397727 ], [ 102.131214, 22.430922 ], [ 102.046214, 22.458026 ], [ 101.978461, 22.427603 ], [ 101.907628, 22.437007 ], [ 101.901469, 22.384447 ], [ 101.862665, 22.389427 ], [ 101.823244, 22.42705 ], [ 101.824476, 22.45692 ], [ 101.774585, 22.506135 ], [ 101.715455, 22.477935 ], [ 101.672339, 22.47517 ], [ 101.648318, 22.400494 ], [ 101.671723, 22.372826 ], [ 101.625528, 22.28259 ], [ 101.56455, 22.269299 ], [ 101.547304, 22.238282 ], [ 101.596579, 22.161262 ], [ 101.602738, 22.131883 ], [ 101.573789, 22.115251 ], [ 101.626144, 22.005986 ], [ 101.606434, 21.967695 ], [ 101.666796, 21.934391 ], [ 101.701288, 21.938832 ], [ 101.700057, 21.897191 ], [ 101.735165, 21.875534 ], [ 101.740093, 21.845541 ], [ 101.771506, 21.833319 ], [ 101.747484, 21.729953 ], [ 101.76781, 21.716054 ], [ 101.780129, 21.640975 ], [ 101.807846, 21.644313 ], [ 101.828788, 21.617054 ], [ 101.804766, 21.577546 ], [ 101.754875, 21.58478 ], [ 101.755491, 21.538027 ], [ 101.772737, 21.512975 ], [ 101.741324, 21.482906 ], [ 101.749948, 21.409379 ], [ 101.730238, 21.336929 ], [ 101.745636, 21.297345 ], [ 101.791832, 21.285636 ], [ 101.833715, 21.252731 ], [ 101.834331, 21.204756 ], [ 101.794911, 21.208104 ], [ 101.76473, 21.147835 ], [ 101.703136, 21.14616 ], [ 101.672339, 21.194713 ], [ 101.605818, 21.172392 ], [ 101.588572, 21.191365 ], [ 101.601506, 21.233208 ], [ 101.532521, 21.252174 ], [ 101.439514, 21.227072 ], [ 101.387775, 21.225956 ], [ 101.290457, 21.17853 ], [ 101.222088, 21.234324 ], [ 101.246725, 21.275598 ], [ 101.244877, 21.302364 ], [ 101.183899, 21.334699 ], [ 101.142631, 21.409379 ], [ 101.194986, 21.424979 ], [ 101.193138, 21.473996 ], [ 101.225167, 21.499055 ], [ 101.210385, 21.509077 ], [ 101.209153, 21.55751 ], [ 101.146943, 21.560293 ], [ 101.169117, 21.590345 ], [ 101.153102, 21.669343 ], [ 101.116762, 21.691032 ], [ 101.111835, 21.746074 ], [ 101.123537, 21.771642 ], [ 101.089661, 21.773865 ], [ 101.015132, 21.707157 ], [ 100.940603, 21.697149 ], [ 100.870386, 21.67268 ], [ 100.847597, 21.634856 ], [ 100.804481, 21.609821 ], [ 100.789082, 21.570867 ], [ 100.753358, 21.555283 ], [ 100.730568, 21.518542 ], [ 100.691764, 21.510748 ], [ 100.579047, 21.451717 ], [ 100.526692, 21.471211 ], [ 100.48296, 21.458958 ], [ 100.437381, 21.533017 ], [ 100.350534, 21.52912 ], [ 100.298795, 21.477894 ], [ 100.235353, 21.466756 ], [ 100.206404, 21.509634 ], [ 100.180534, 21.514088 ], [ 100.168831, 21.482906 ], [ 100.131259, 21.504066 ], [ 100.123252, 21.565302 ], [ 100.107853, 21.585337 ], [ 100.169447, 21.663225 ], [ 100.131875, 21.699929 ], [ 100.094303, 21.702709 ], [ 100.049339, 21.669899 ], [ 99.991441, 21.703821 ], [ 99.944014, 21.821097 ], [ 99.960028, 21.907186 ], [ 99.982202, 21.919401 ], [ 100.000064, 21.973245 ], [ 99.965571, 22.014309 ], [ 99.972347, 22.053141 ], [ 99.871333, 22.067007 ], [ 99.870101, 22.029288 ], [ 99.762927, 22.068117 ], [ 99.696406, 22.067562 ], [ 99.648979, 22.100835 ], [ 99.581841, 22.103053 ], [ 99.578762, 22.098617 ], [ 99.562747, 22.113034 ], [ 99.516552, 22.099726 ], [ 99.486987, 22.128557 ], [ 99.400139, 22.100281 ], [ 99.35456, 22.095845 ], [ 99.294814, 22.109152 ], [ 99.219669, 22.110816 ], [ 99.156227, 22.159599 ], [ 99.188256, 22.162924 ], [ 99.175321, 22.185647 ], [ 99.207966, 22.232188 ], [ 99.235683, 22.250468 ], [ 99.233836, 22.296434 ], [ 99.278183, 22.34626 ], [ 99.251698, 22.393301 ], [ 99.297277, 22.41156 ], [ 99.382277, 22.493418 ], [ 99.359487, 22.535435 ], [ 99.385973, 22.57136 ], [ 99.339777, 22.708894 ], [ 99.31514, 22.737598 ], [ 99.326842, 22.751396 ], [ 99.385357, 22.761882 ], [ 99.401371, 22.826434 ], [ 99.462965, 22.844635 ], [ 99.43648, 22.913557 ], [ 99.446951, 22.934503 ], [ 99.531334, 22.897019 ], [ 99.563363, 22.925684 ], [ 99.533798, 22.961507 ], [ 99.517168, 23.006685 ], [ 99.528255, 23.065614 ], [ 99.477747, 23.083233 ], [ 99.440791, 23.079379 ], [ 99.380429, 23.099748 ], [ 99.3484, 23.12892 ], [ 99.281879, 23.101399 ], [ 99.255393, 23.077727 ], [ 99.187024, 23.100299 ], [ 99.106336, 23.086536 ], [ 99.048438, 23.11461 ], [ 99.057677, 23.164689 ], [ 99.002242, 23.160287 ], [ 98.906772, 23.185595 ], [ 98.889525, 23.209249 ], [ 98.928946, 23.26589 ], [ 98.936953, 23.309866 ], [ 98.906772, 23.331849 ], [ 98.872895, 23.329651 ], [ 98.920938, 23.360971 ], [ 98.912315, 23.426333 ], [ 98.874743, 23.483431 ], [ 98.826084, 23.470257 ], [ 98.80391, 23.540504 ], [ 98.844562, 23.578904 ], [ 98.882134, 23.595358 ], [ 98.882134, 23.620035 ], [ 98.847026, 23.632097 ], [ 98.835939, 23.683625 ], [ 98.811917, 23.703354 ], [ 98.824236, 23.727462 ], [ 98.784816, 23.781691 ], [ 98.696121, 23.784429 ], [ 98.669019, 23.800857 ], [ 98.701664, 23.834254 ], [ 98.68565, 23.90157 ], [ 98.701048, 23.946427 ], [ 98.673331, 23.960647 ], [ 98.701048, 23.981427 ], [ 98.727533, 23.970491 ], [ 98.773729, 24.022431 ], [ 98.807606, 24.025164 ], [ 98.895069, 24.098936 ], [ 98.876591, 24.15137 ], [ 98.841482, 24.126794 ], [ 98.818692, 24.133348 ], [ 98.71891, 24.127887 ], [ 98.681954, 24.100029 ], [ 98.646229, 24.106038 ], [ 98.593875, 24.08036 ], [ 98.547063, 24.128433 ], [ 98.487933, 24.123517 ], [ 98.48239, 24.122425 ], [ 98.37768, 24.114232 ], [ 98.343187, 24.098936 ], [ 98.219999, 24.113685 ], [ 98.19721, 24.09839 ], [ 98.132536, 24.09238 ], [ 98.125761, 24.092927 ], [ 98.123297, 24.092927 ], [ 98.096196, 24.08637 ], [ 98.091268, 24.085824 ], [ 97.995182, 24.04648 ], [ 97.984095, 24.031177 ], [ 97.902175, 24.014231 ], [ 97.896015, 23.974319 ], [ 97.863371, 23.978693 ], [ 97.8104, 23.943146 ], [ 97.795617, 23.951897 ], [ 97.763588, 23.907041 ], [ 97.72848, 23.895551 ], [ 97.718009, 23.867643 ], [ 97.684132, 23.876946 ], [ 97.647176, 23.840823 ], [ 97.640401, 23.866001 ], [ 97.633009, 23.879682 ], [ 97.5283, 23.926736 ], [ 97.529531, 23.943146 ], [ 97.572647, 23.983068 ], [ 97.628698, 24.004938 ], [ 97.637321, 24.04812 ], [ 97.730944, 24.113685 ], [ 97.753733, 24.168843 ], [ 97.72848, 24.183585 ], [ 97.729712, 24.227252 ], [ 97.767284, 24.258357 ], [ 97.721089, 24.295999 ], [ 97.665038, 24.296544 ], [ 97.662574, 24.339083 ], [ 97.716161, 24.358711 ], [ 97.679821, 24.401228 ], [ 97.669966, 24.452993 ], [ 97.588662, 24.435559 ], [ 97.530147, 24.443187 ], [ 97.554785, 24.490577 ], [ 97.570799, 24.602719 ], [ 97.569567, 24.708236 ], [ 97.547394, 24.739221 ], [ 97.569567, 24.765852 ], [ 97.652103, 24.790846 ], [ 97.680437, 24.827243 ], [ 97.765436, 24.823984 ], [ 97.797465, 24.845709 ], [ 97.785762, 24.876117 ], [ 97.729712, 24.908689 ], [ 97.716777, 24.978147 ], [ 97.727864, 25.042686 ], [ 97.719857, 25.080634 ], [ 97.743262, 25.078466 ], [ 97.796233, 25.155954 ], [ 97.839349, 25.27074 ], [ 97.875689, 25.25721 ], [ 97.904023, 25.216609 ], [ 97.940363, 25.214985 ], [ 98.0075, 25.279399 ], [ 98.006884, 25.298338 ], [ 98.06971, 25.311864 ], [ 98.099891, 25.354055 ], [ 98.101123, 25.388662 ], [ 98.137464, 25.381633 ], [ 98.15779, 25.457307 ], [ 98.131304, 25.51025 ], [ 98.163949, 25.524292 ], [ 98.189818, 25.569108 ], [ 98.170724, 25.620383 ], [ 98.247717, 25.607971 ], [ 98.314854, 25.543193 ], [ 98.326557, 25.566409 ], [ 98.402317, 25.593939 ], [ 98.409709, 25.664084 ], [ 98.457752, 25.682963 ], [ 98.461448, 25.735267 ], [ 98.476846, 25.77731 ], [ 98.529201, 25.840884 ], [ 98.553839, 25.845731 ], [ 98.640686, 25.798864 ], [ 98.677642, 25.816105 ], [ 98.705976, 25.855426 ], [ 98.686881, 25.925955 ], [ 98.637606, 25.971696 ], [ 98.614201, 25.968468 ], [ 98.602498, 26.054523 ], [ 98.575396, 26.118485 ], [ 98.632679, 26.145887 ], [ 98.656084, 26.139977 ], [ 98.661012, 26.087852 ], [ 98.720142, 26.127082 ], [ 98.712751, 26.156093 ], [ 98.735541, 26.185097 ], [ 98.713367, 26.231274 ], [ 98.672715, 26.239863 ], [ 98.681338, 26.308016 ], [ 98.733693, 26.350926 ], [ 98.750323, 26.424372 ], [ 98.741084, 26.432947 ], [ 98.757098, 26.491881 ], [ 98.753403, 26.559349 ], [ 98.773113, 26.578083 ], [ 98.781736, 26.620893 ], [ 98.762642, 26.660478 ], [ 98.770033, 26.690424 ], [ 98.746012, 26.696841 ], [ 98.762026, 26.798916 ], [ 98.730613, 26.851253 ], [ 98.757098, 26.877947 ], [ 98.732461, 27.002257 ], [ 98.762642, 27.018252 ], [ 98.765722, 27.05077 ], [ 98.712751, 27.075817 ], [ 98.713983, 27.139744 ], [ 98.696121, 27.211086 ], [ 98.723222, 27.221198 ], [ 98.717062, 27.271211 ], [ 98.734925, 27.287168 ], [ 98.741084, 27.330241 ], [ 98.706591, 27.362136 ], [ 98.702896, 27.412618 ], [ 98.686881, 27.425367 ], [ 98.704128, 27.463607 ], [ 98.685034, 27.484315 ], [ 98.706591, 27.553313 ], [ 98.662244, 27.586734 ], [ 98.650541, 27.567637 ], [ 98.583404, 27.571351 ], [ 98.587099, 27.587265 ], [ 98.554454, 27.646126 ], [ 98.53536, 27.620676 ], [ 98.474998, 27.634462 ], [ 98.444201, 27.665209 ], [ 98.430035, 27.653547 ], [ 98.429419, 27.549068 ], [ 98.388767, 27.515104 ], [ 98.337644, 27.508734 ], [ 98.317318, 27.51935 ], [ 98.310542, 27.583552 ], [ 98.283441, 27.654608 ], [ 98.234166, 27.690648 ], [ 98.215688, 27.810874 ], [ 98.169492, 27.851096 ], [ 98.205217, 27.889716 ], [ 98.187355, 27.939426 ], [ 98.143007, 27.948942 ], [ 98.133152, 27.990698 ], [ 98.160253, 28.101089 ], [ 98.139311, 28.142259 ], [ 98.17442, 28.163365 ], [ 98.169492, 28.206093 ], [ 98.21692, 28.212949 ], [ 98.266811, 28.242477 ], [ 98.231702, 28.314681 ], [ 98.207681, 28.330486 ], [ 98.208913, 28.358401 ], [ 98.301303, 28.384204 ], [ 98.317934, 28.324691 ], [ 98.353042, 28.293078 ], [ 98.37768, 28.246167 ], [ 98.370289, 28.18394 ], [ 98.389999, 28.16442 ], [ 98.389383, 28.114814 ], [ 98.428803, 28.104785 ], [ 98.464527, 28.151229 ], [ 98.494092, 28.141203 ], [ 98.559382, 28.182885 ], [ 98.625903, 28.165475 ], [ 98.649925, 28.200291 ], [ 98.712135, 28.229296 ], [ 98.710287, 28.288862 ], [ 98.746628, 28.321003 ], [ 98.740468, 28.348395 ], [ 98.693041, 28.43158 ], [ 98.673947, 28.478934 ], [ 98.625903, 28.489455 ], [ 98.619128, 28.50944 ], [ 98.637606, 28.552029 ], [ 98.594491, 28.667615 ], [ 98.666555, 28.712239 ], [ 98.683802, 28.740054 ], [ 98.652389, 28.817162 ], [ 98.668403, 28.843376 ], [ 98.643766, 28.895261 ], [ 98.6567, 28.910454 ], [ 98.624056, 28.95864 ], [ 98.655469, 28.976966 ], [ 98.70228, 28.9644 ], [ 98.757714, 29.004186 ], [ 98.786048, 28.998952 ], [ 98.821772, 28.920931 ], [ 98.827932, 28.821356 ], [ 98.852569, 28.798283 ], [ 98.912931, 28.800906 ], [ 98.922786, 28.823978 ], [ 98.972677, 28.832367 ], [ 98.973909, 28.864867 ], [ 98.917859, 28.886877 ], [ 98.925866, 28.978536 ], [ 99.013329, 29.036632 ], [ 98.991771, 29.105677 ], [ 98.967134, 29.128159 ], [ 98.960974, 29.165792 ], [ 98.9813, 29.204978 ], [ 99.024416, 29.188783 ], [ 99.037351, 29.20759 ], [ 99.113727, 29.221171 ], [ 99.105104, 29.162656 ], [ 99.118039, 29.100971 ], [ 99.113727, 29.07273 ], [ 99.132206, 28.94869 ], [ 99.123582, 28.890021 ], [ 99.103872, 28.841803 ], [ 99.114343, 28.765763 ], [ 99.134053, 28.734806 ], [ 99.126662, 28.698066 ], [ 99.147604, 28.640831 ], [ 99.183944, 28.58882 ], [ 99.170394, 28.566221 ], [ 99.191952, 28.494714 ], [ 99.187024, 28.44 ], [ 99.16485, 28.425264 ], [ 99.200575, 28.365774 ], [ 99.229524, 28.350502 ], [ 99.237531, 28.317842 ], [ 99.28927, 28.286227 ], [ 99.306516, 28.227714 ], [ 99.374886, 28.18183 ], [ 99.412458, 28.295186 ], [ 99.392748, 28.318369 ], [ 99.437095, 28.398419 ], [ 99.404451, 28.44421 ], [ 99.426625, 28.454207 ], [ 99.396444, 28.491032 ], [ 99.403219, 28.546246 ], [ 99.463581, 28.549401 ], [ 99.466045, 28.579886 ], [ 99.504233, 28.619294 ], [ 99.540573, 28.623497 ], [ 99.53195, 28.677591 ], [ 99.553508, 28.710664 ], [ 99.614486, 28.740054 ], [ 99.609559, 28.784122 ], [ 99.625573, 28.81454 ], [ 99.676696, 28.810345 ], [ 99.717964, 28.846521 ], [ 99.722275, 28.757369 ], [ 99.755536, 28.701216 ], [ 99.79434, 28.699116 ], [ 99.834992, 28.660788 ], [ 99.834376, 28.628225 ], [ 99.873181, 28.631902 ], [ 99.875644, 28.611939 ], [ 99.91876, 28.599329 ], [ 99.985281, 28.529422 ], [ 99.990209, 28.47683 ], [ 100.073977, 28.426317 ], [ 100.057346, 28.368934 ], [ 100.136803, 28.349975 ], [ 100.176223, 28.325218 ], [ 100.147274, 28.288862 ], [ 100.188541, 28.252493 ], [ 100.153433, 28.208202 ], [ 100.102926, 28.201873 ], [ 100.091223, 28.181302 ], [ 100.062274, 28.193962 ], [ 100.033325, 28.184467 ], [ 100.021006, 28.147008 ], [ 100.05673, 28.097922 ], [ 100.088759, 28.029269 ], [ 100.120788, 28.018703 ], [ 100.196549, 27.936254 ], [ 100.170063, 27.907699 ], [ 100.210715, 27.87702 ], [ 100.30865, 27.861149 ], [ 100.30865, 27.830457 ], [ 100.28586, 27.80611 ], [ 100.304954, 27.788639 ], [ 100.311729, 27.724028 ], [ 100.327744, 27.72032 ], [ 100.350534, 27.755809 ], [ 100.412127, 27.816167 ], [ 100.442924, 27.86644 ], [ 100.504518, 27.852154 ], [ 100.511294, 27.827811 ], [ 100.54517, 27.809286 ], [ 100.609228, 27.859033 ], [ 100.634482, 27.915631 ], [ 100.681293, 27.923035 ], [ 100.719481, 27.858503 ], [ 100.707162, 27.800816 ], [ 100.757053, 27.770107 ], [ 100.775532, 27.743098 ], [ 100.782307, 27.691708 ], [ 100.848212, 27.672099 ], [ 100.827886, 27.615904 ], [ 100.854988, 27.623858 ], [ 100.91227, 27.521473 ], [ 100.901183, 27.453517 ], [ 100.936908, 27.469448 ], [ 100.95169, 27.426961 ], [ 101.021907, 27.332899 ], [ 101.026219, 27.270679 ], [ 101.042233, 27.22173 ], [ 101.071798, 27.194585 ], [ 101.119226, 27.208957 ], [ 101.167885, 27.198311 ], [ 101.167885, 27.198311 ], [ 101.170349, 27.175421 ], [ 101.145095, 27.103523 ], [ 101.157414, 27.094999 ], [ 101.136472, 27.023584 ], [ 101.228863, 26.981992 ], [ 101.227015, 26.959057 ], [ 101.264587, 26.955323 ], [ 101.267667, 26.903034 ], [ 101.311399, 26.903034 ], [ 101.365602, 26.883819 ], [ 101.399478, 26.841642 ], [ 101.358826, 26.771669 ], [ 101.387159, 26.753501 ], [ 101.389623, 26.723036 ], [ 101.435819, 26.740675 ], [ 101.458608, 26.731054 ], [ 101.445674, 26.77434 ], [ 101.466, 26.786629 ], [ 101.513427, 26.768463 ], [ 101.453065, 26.692563 ], [ 101.481398, 26.673313 ], [ 101.461072, 26.640687 ], [ 101.461688, 26.606447 ], [ 101.402558, 26.604841 ], [ 101.395783, 26.591998 ], [ 101.422884, 26.53151 ], [ 101.458608, 26.49563 ], [ 101.506652, 26.499915 ], [ 101.530057, 26.467239 ], [ 101.565782, 26.454381 ], [ 101.637847, 26.388995 ], [ 101.635383, 26.357361 ], [ 101.660636, 26.346635 ], [ 101.64031, 26.318745 ], [ 101.597195, 26.303187 ], [ 101.586108, 26.279579 ], [ 101.630455, 26.224832 ], [ 101.690202, 26.241473 ], [ 101.737013, 26.219463 ], [ 101.773353, 26.168448 ], [ 101.807846, 26.156093 ], [ 101.796759, 26.114723 ], [ 101.839875, 26.082477 ], [ 101.835563, 26.04592 ], [ 101.857737, 26.049146 ], [ 101.899621, 26.099139 ], [ 101.929186, 26.105588 ], [ 101.954439, 26.084627 ], [ 102.020961, 26.096451 ], [ 102.080091, 26.065275 ], [ 102.107808, 26.068501 ], [ 102.152156, 26.10935 ], [ 102.174946, 26.146961 ], [ 102.242699, 26.190468 ], [ 102.245163, 26.212483 ], [ 102.349257, 26.244694 ], [ 102.392372, 26.296749 ], [ 102.440416, 26.300505 ], [ 102.542046, 26.338591 ], [ 102.570995, 26.362723 ], [ 102.629509, 26.336982 ], [ 102.638748, 26.307479 ], [ 102.60056, 26.250598 ], [ 102.659074, 26.221611 ], [ 102.709581, 26.210336 ], [ 102.739762, 26.268846 ], [ 102.785342, 26.298895 ], [ 102.833385, 26.306406 ], [ 102.878964, 26.364332 ], [ 102.893131, 26.338591 ], [ 102.975667, 26.340736 ], [ 102.998457, 26.371839 ], [ 102.988602, 26.413117 ], [ 102.989833, 26.482775 ], [ 103.030485, 26.485989 ], [ 103.052659, 26.514374 ], [ 103.052659, 26.555602 ], [ 103.035413, 26.556673 ], [ 103.026174, 26.664221 ], [ 103.005232, 26.679195 ], [ 103.008312, 26.710741 ], [ 102.983674, 26.76686 ], [ 102.991681, 26.775409 ], [ 102.966428, 26.837904 ], [ 102.949181, 26.843244 ], [ 102.896211, 26.91264 ], [ 102.894979, 27.001724 ], [ 102.870957, 27.026782 ], [ 102.913457, 27.133886 ], [ 102.904218, 27.227584 ], [ 102.883276, 27.258444 ], [ 102.883892, 27.299401 ], [ 102.899906, 27.317481 ], [ 102.941174, 27.405711 ], [ 102.989833, 27.367983 ], [ 103.055739, 27.40943 ], [ 103.080992, 27.396679 ], [ 103.141355, 27.420586 ], [ 103.144434, 27.450331 ], [ 103.19063, 27.523596 ], [ 103.232514, 27.56976 ], [ 103.2861, 27.561802 ], [ 103.29226, 27.632872 ], [ 103.349542, 27.678459 ], [ 103.369868, 27.708664 ], [ 103.393274, 27.709194 ], [ 103.461027, 27.779638 ], [ 103.487512, 27.794992 ], [ 103.509686, 27.843687 ], [ 103.502295, 27.910343 ], [ 103.55465, 27.978543 ], [ 103.515846, 27.965329 ], [ 103.486281, 28.033495 ], [ 103.459179, 28.021345 ], [ 103.430846, 28.044587 ], [ 103.470266, 28.122204 ], [ 103.533092, 28.168641 ], [ 103.573128, 28.230877 ], [ 103.643961, 28.260401 ], [ 103.692004, 28.232459 ], [ 103.701859, 28.198709 ], [ 103.740048, 28.23615 ], [ 103.770845, 28.233514 ], [ 103.828743, 28.285173 ], [ 103.877402, 28.316262 ], [ 103.85338, 28.356822 ], [ 103.860156, 28.383677 ], [ 103.828743, 28.44 ], [ 103.829975, 28.459995 ], [ 103.781931, 28.525216 ], [ 103.802873, 28.563068 ], [ 103.838598, 28.587244 ], [ 103.833054, 28.605109 ], [ 103.850917, 28.66709 ], [ 103.887873, 28.61982 ], [ 103.910047, 28.631377 ], [ 103.953779, 28.600906 ], [ 104.05972, 28.6277 ], [ 104.09606, 28.603533 ], [ 104.117618, 28.634003 ], [ 104.170589, 28.642932 ], [ 104.230951, 28.635579 ], [ 104.252509, 28.660788 ], [ 104.277147, 28.631902 ], [ 104.314719, 28.615617 ], [ 104.372617, 28.649235 ], [ 104.425588, 28.626649 ], [ 104.417581, 28.598279 ], [ 104.375697, 28.5946 ], [ 104.355987, 28.555183 ], [ 104.323342, 28.540989 ], [ 104.260516, 28.536257 ], [ 104.267908, 28.499448 ], [ 104.254357, 28.403683 ], [ 104.282074, 28.343128 ], [ 104.314103, 28.306778 ], [ 104.343052, 28.334173 ], [ 104.384936, 28.329959 ], [ 104.392943, 28.291497 ], [ 104.420045, 28.269889 ], [ 104.44961, 28.269889 ], [ 104.462544, 28.241422 ], [ 104.442834, 28.211366 ], [ 104.402182, 28.202928 ], [ 104.406494, 28.173389 ], [ 104.444682, 28.16231 ], [ 104.448994, 28.113758 ], [ 104.40095, 28.091586 ], [ 104.373233, 28.051454 ], [ 104.304248, 28.050926 ], [ 104.30856, 28.036136 ], [ 104.362762, 28.012891 ], [ 104.40095, 27.952114 ], [ 104.44961, 27.927794 ], [ 104.508124, 27.878078 ], [ 104.52537, 27.889187 ], [ 104.573413, 27.840512 ], [ 104.607906, 27.857974 ], [ 104.63316, 27.850567 ], [ 104.676275, 27.880723 ], [ 104.743413, 27.901881 ], [ 104.761891, 27.884426 ], [ 104.796999, 27.901352 ], [ 104.842579, 27.900294 ], [ 104.888158, 27.914574 ], [ 104.918339, 27.938897 ], [ 104.903557, 27.962158 ], [ 104.975006, 28.020816 ], [ 104.980549, 28.063073 ], [ 105.002107, 28.064129 ], [ 105.061853, 28.096866 ], [ 105.119752, 28.07205 ], [ 105.168411, 28.071522 ], [ 105.186889, 28.054623 ], [ 105.167795, 28.021345 ], [ 105.186273, 27.995454 ], [ 105.218302, 27.990698 ], [ 105.247867, 28.009193 ], [ 105.270657, 27.99704 ], [ 105.284823, 27.935725 ], [ 105.233084, 27.895534 ], [ 105.25957, 27.827811 ], [ 105.313157, 27.810874 ], [ 105.273736, 27.794992 ], [ 105.293447, 27.770637 ], [ 105.290367, 27.712373 ], [ 105.308229, 27.704955 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"540000\", \"name\": \"西藏自治区\", \"center\": [ 91.132212, 29.660361 ], \"centroid\": [ 88.388277, 31.56375 ], \"childrenNum\": 7, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 25, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 89.711414, 36.093272 ], [ 89.688624, 36.091337 ], [ 89.605472, 36.038123 ], [ 89.474893, 36.022151 ], [ 89.417611, 36.044897 ], [ 89.404676, 36.016827 ], [ 89.434857, 35.992136 ], [ 89.428082, 35.917531 ], [ 89.489676, 35.903475 ], [ 89.554965, 35.873414 ], [ 89.550654, 35.856924 ], [ 89.62395, 35.859349 ], [ 89.654747, 35.848193 ], [ 89.707718, 35.849163 ], [ 89.778551, 35.861775 ], [ 89.801957, 35.848193 ], [ 89.767464, 35.799183 ], [ 89.782863, 35.773453 ], [ 89.747138, 35.7516 ], [ 89.748986, 35.66267 ], [ 89.726196, 35.648082 ], [ 89.765616, 35.599922 ], [ 89.75145, 35.580942 ], [ 89.71203, 35.581915 ], [ 89.699711, 35.544916 ], [ 89.720037, 35.501566 ], [ 89.740979, 35.507412 ], [ 89.765, 35.482563 ], [ 89.739131, 35.468429 ], [ 89.685544, 35.416259 ], [ 89.658443, 35.425526 ], [ 89.619639, 35.412357 ], [ 89.58761, 35.383575 ], [ 89.497067, 35.361128 ], [ 89.516161, 35.330862 ], [ 89.494603, 35.298632 ], [ 89.531559, 35.276161 ], [ 89.48598, 35.256616 ], [ 89.450255, 35.223867 ], [ 89.46935, 35.214577 ], [ 89.519241, 35.133862 ], [ 89.579603, 35.118688 ], [ 89.593153, 35.104491 ], [ 89.59069, 35.057965 ], [ 89.560509, 34.938836 ], [ 89.578987, 34.895162 ], [ 89.670146, 34.887798 ], [ 89.707102, 34.919701 ], [ 89.747138, 34.903506 ], [ 89.78779, 34.921664 ], [ 89.821051, 34.902033 ], [ 89.814891, 34.86816 ], [ 89.838913, 34.865705 ], [ 89.867862, 34.81069 ], [ 89.825978, 34.796931 ], [ 89.799493, 34.743838 ], [ 89.732356, 34.732035 ], [ 89.72558, 34.660689 ], [ 89.74837, 34.641981 ], [ 89.798877, 34.628686 ], [ 89.777935, 34.574499 ], [ 89.814891, 34.548871 ], [ 89.823515, 34.455657 ], [ 89.819819, 34.420614 ], [ 89.799493, 34.39642 ], [ 89.820435, 34.369255 ], [ 89.858623, 34.359375 ], [ 89.86663, 34.324785 ], [ 89.825362, 34.293642 ], [ 89.838297, 34.263477 ], [ 89.816739, 34.16945 ], [ 89.789638, 34.150632 ], [ 89.760073, 34.152613 ], [ 89.756993, 34.124874 ], [ 89.71203, 34.131809 ], [ 89.655979, 34.097126 ], [ 89.656595, 34.057966 ], [ 89.635037, 34.049537 ], [ 89.684928, 33.990013 ], [ 89.688008, 33.959739 ], [ 89.718805, 33.946832 ], [ 89.73174, 33.921509 ], [ 89.795181, 33.865374 ], [ 89.837065, 33.868853 ], [ 89.899891, 33.80771 ], [ 89.942391, 33.801246 ], [ 89.902355, 33.758467 ], [ 89.907282, 33.741051 ], [ 89.983659, 33.725622 ], [ 89.981195, 33.70322 ], [ 90.008296, 33.687785 ], [ 89.984275, 33.612061 ], [ 90.01076, 33.553728 ], [ 90.083441, 33.525295 ], [ 90.088984, 33.478885 ], [ 90.107463, 33.460913 ], [ 90.22018, 33.437943 ], [ 90.246665, 33.423959 ], [ 90.332896, 33.310501 ], [ 90.363077, 33.279487 ], [ 90.405577, 33.260473 ], [ 90.490577, 33.264977 ], [ 90.562642, 33.229441 ], [ 90.627315, 33.180368 ], [ 90.704308, 33.135778 ], [ 90.740032, 33.142293 ], [ 90.803474, 33.114227 ], [ 90.88293, 33.120241 ], [ 90.902024, 33.083143 ], [ 90.927894, 33.120241 ], [ 91.001807, 33.11573 ], [ 91.037531, 33.098686 ], [ 91.072024, 33.113224 ], [ 91.147784, 33.07211 ], [ 91.161335, 33.108712 ], [ 91.18782, 33.106206 ], [ 91.226624, 33.141792 ], [ 91.261733, 33.141291 ], [ 91.311624, 33.108211 ], [ 91.370138, 33.100691 ], [ 91.436044, 33.066092 ], [ 91.49579, 33.109214 ], [ 91.535826, 33.10019 ], [ 91.55492, 33.060074 ], [ 91.583253, 33.0375 ], [ 91.664557, 33.012913 ], [ 91.685499, 32.989324 ], [ 91.752637, 32.969242 ], [ 91.799448, 32.942126 ], [ 91.839484, 32.948152 ], [ 91.857962, 32.90244 ], [ 91.896766, 32.907967 ], [ 91.955897, 32.8205 ], [ 92.018722, 32.829552 ], [ 92.038432, 32.860725 ], [ 92.101874, 32.860222 ], [ 92.145606, 32.885857 ], [ 92.205352, 32.866255 ], [ 92.227526, 32.821003 ], [ 92.193649, 32.801889 ], [ 92.211511, 32.788306 ], [ 92.198577, 32.754591 ], [ 92.255243, 32.720863 ], [ 92.310062, 32.751571 ], [ 92.343938, 32.738484 ], [ 92.355641, 32.764657 ], [ 92.411076, 32.748048 ], [ 92.459119, 32.76365 ], [ 92.484372, 32.745028 ], [ 92.56814, 32.73194 ], [ 92.574916, 32.741001 ], [ 92.634662, 32.720863 ], [ 92.667922, 32.73194 ], [ 92.686401, 32.76516 ], [ 92.756618, 32.743014 ], [ 92.789262, 32.719856 ], [ 92.822523, 32.729926 ], [ 92.866871, 32.698203 ], [ 92.933392, 32.719353 ], [ 92.964189, 32.714821 ], [ 93.00053, 32.741001 ], [ 93.019624, 32.737477 ], [ 93.023935, 32.703239 ], [ 93.069515, 32.626156 ], [ 93.087993, 32.63674 ], [ 93.159442, 32.644803 ], [ 93.176688, 32.6705 ], [ 93.210565, 32.655385 ], [ 93.239514, 32.662439 ], [ 93.260456, 32.62666 ], [ 93.300492, 32.619604 ], [ 93.308499, 32.580278 ], [ 93.33868, 32.5712 ], [ 93.385492, 32.525294 ], [ 93.411977, 32.558086 ], [ 93.4631, 32.556069 ], [ 93.476651, 32.504603 ], [ 93.501904, 32.503593 ], [ 93.516687, 32.47583 ], [ 93.618933, 32.522771 ], [ 93.651577, 32.571705 ], [ 93.721795, 32.578261 ], [ 93.75136, 32.56313 ], [ 93.820345, 32.549511 ], [ 93.851142, 32.50965 ], [ 93.861613, 32.466237 ], [ 93.90904, 32.463207 ], [ 93.960163, 32.484917 ], [ 93.978641, 32.459672 ], [ 94.03038, 32.448057 ], [ 94.049474, 32.469771 ], [ 94.091974, 32.463207 ], [ 94.137554, 32.433915 ], [ 94.176974, 32.454117 ], [ 94.196684, 32.51621 ], [ 94.250886, 32.51722 ], [ 94.292154, 32.502584 ], [ 94.294002, 32.519743 ], [ 94.350053, 32.533871 ], [ 94.371611, 32.524789 ], [ 94.395016, 32.594397 ], [ 94.435052, 32.562626 ], [ 94.463386, 32.572209 ], [ 94.459074, 32.599439 ], [ 94.522516, 32.595909 ], [ 94.591501, 32.640772 ], [ 94.614291, 32.673522 ], [ 94.638312, 32.645307 ], [ 94.737479, 32.587338 ], [ 94.762116, 32.526303 ], [ 94.78737, 32.522266 ], [ 94.80708, 32.486431 ], [ 94.852043, 32.463712 ], [ 94.889616, 32.472295 ], [ 94.912405, 32.41573 ], [ 94.944434, 32.404109 ], [ 94.988166, 32.422802 ], [ 95.057151, 32.395014 ], [ 95.075013, 32.376315 ], [ 95.075013, 32.376315 ], [ 95.081789, 32.384907 ], [ 95.153853, 32.386423 ], [ 95.218527, 32.397035 ], [ 95.228382, 32.363678 ], [ 95.261643, 32.348006 ], [ 95.193274, 32.332331 ], [ 95.096571, 32.322217 ], [ 95.079325, 32.279726 ], [ 95.10581, 32.258979 ], [ 95.20744, 32.297433 ], [ 95.214216, 32.321712 ], [ 95.241317, 32.3207 ], [ 95.239469, 32.287315 ], [ 95.270266, 32.194683 ], [ 95.270266, 32.194683 ], [ 95.31523, 32.148585 ], [ 95.366968, 32.151118 ], [ 95.367584, 32.178982 ], [ 95.406389, 32.182021 ], [ 95.440265, 32.157705 ], [ 95.454432, 32.061898 ], [ 95.421171, 32.033999 ], [ 95.454432, 32.007613 ], [ 95.395918, 32.001523 ], [ 95.360809, 31.95939 ], [ 95.3682, 31.92892 ], [ 95.408852, 31.918761 ], [ 95.406389, 31.896915 ], [ 95.456896, 31.801853 ], [ 95.480301, 31.795749 ], [ 95.511714, 31.750468 ], [ 95.546823, 31.73978 ], [ 95.580083, 31.76726 ], [ 95.634286, 31.782523 ], [ 95.779648, 31.748941 ], [ 95.823995, 31.68225 ], [ 95.853561, 31.714329 ], [ 95.846169, 31.736218 ], [ 95.89914, 31.81711 ], [ 95.983524, 31.816601 ], [ 95.989067, 31.78761 ], [ 96.064828, 31.720438 ], [ 96.135661, 31.70211 ], [ 96.148595, 31.686324 ], [ 96.156603, 31.602769 ], [ 96.207726, 31.598691 ], [ 96.221892, 31.647613 ], [ 96.245298, 31.657802 ], [ 96.252073, 31.697527 ], [ 96.222508, 31.733164 ], [ 96.231131, 31.749959 ], [ 96.178161, 31.775401 ], [ 96.183088, 31.835924 ], [ 96.202798, 31.841008 ], [ 96.214501, 31.876589 ], [ 96.188632, 31.904028 ], [ 96.220044, 31.905553 ], [ 96.253305, 31.929936 ], [ 96.288414, 31.919777 ], [ 96.389428, 31.919777 ], [ 96.407906, 31.845583 ], [ 96.435623, 31.796258 ], [ 96.468884, 31.769804 ], [ 96.519391, 31.74945 ], [ 96.56805, 31.711783 ], [ 96.615477, 31.737236 ], [ 96.661057, 31.705674 ], [ 96.691854, 31.722474 ], [ 96.722651, 31.686833 ], [ 96.778701, 31.675629 ], [ 96.790404, 31.698545 ], [ 96.840295, 31.720438 ], [ 96.799027, 31.792188 ], [ 96.765767, 31.819144 ], [ 96.760223, 31.860325 ], [ 96.794716, 31.869474 ], [ 96.81073, 31.894375 ], [ 96.776238, 31.935015 ], [ 96.753448, 31.944156 ], [ 96.742977, 32.001016 ], [ 96.722651, 32.013195 ], [ 96.824281, 32.007613 ], [ 96.868629, 31.964975 ], [ 96.863085, 31.996448 ], [ 96.894498, 32.013703 ], [ 96.941925, 31.986297 ], [ 96.965947, 32.008628 ], [ 96.935766, 32.048203 ], [ 97.006599, 32.067984 ], [ 97.028773, 32.04871 ], [ 97.127323, 32.044145 ], [ 97.169823, 32.032984 ], [ 97.188301, 32.055304 ], [ 97.214786, 32.042623 ], [ 97.233881, 32.063927 ], [ 97.201852, 32.090296 ], [ 97.219714, 32.109054 ], [ 97.258518, 32.072041 ], [ 97.308409, 32.076605 ], [ 97.293011, 32.096887 ], [ 97.313953, 32.130342 ], [ 97.271453, 32.139971 ], [ 97.264062, 32.182527 ], [ 97.299786, 32.294904 ], [ 97.32196, 32.303503 ], [ 97.371235, 32.273148 ], [ 97.415583, 32.296421 ], [ 97.424822, 32.322723 ], [ 97.387865, 32.427349 ], [ 97.341054, 32.440987 ], [ 97.388481, 32.501575 ], [ 97.334895, 32.514192 ], [ 97.332431, 32.542448 ], [ 97.3583, 32.563635 ], [ 97.374315, 32.546484 ], [ 97.411887, 32.575235 ], [ 97.448843, 32.586833 ], [ 97.463626, 32.55506 ], [ 97.50243, 32.530844 ], [ 97.540618, 32.536899 ], [ 97.670582, 32.51722 ], [ 97.684132, 32.530339 ], [ 97.730944, 32.527312 ], [ 97.795617, 32.521257 ], [ 97.80732, 32.50006 ], [ 97.863986, 32.499051 ], [ 97.880001, 32.486431 ], [ 97.940363, 32.482393 ], [ 98.079565, 32.415224 ], [ 98.107283, 32.391476 ], [ 98.125145, 32.401077 ], [ 98.218768, 32.342444 ], [ 98.208913, 32.318171 ], [ 98.23047, 32.262521 ], [ 98.218768, 32.234683 ], [ 98.260035, 32.208862 ], [ 98.303151, 32.121726 ], [ 98.357354, 32.087253 ], [ 98.404781, 32.045159 ], [ 98.402933, 32.026896 ], [ 98.434962, 32.007613 ], [ 98.432498, 31.922825 ], [ 98.399238, 31.895899 ], [ 98.426339, 31.856767 ], [ 98.414636, 31.832365 ], [ 98.461448, 31.800327 ], [ 98.508875, 31.751995 ], [ 98.516882, 31.717383 ], [ 98.545831, 31.717383 ], [ 98.553839, 31.660349 ], [ 98.619128, 31.591555 ], [ 98.651157, 31.57881 ], [ 98.696736, 31.538523 ], [ 98.714599, 31.508935 ], [ 98.844562, 31.429817 ], [ 98.84333, 31.416028 ], [ 98.887062, 31.37465 ], [ 98.810685, 31.306668 ], [ 98.805758, 31.279052 ], [ 98.773113, 31.249382 ], [ 98.691809, 31.333253 ], [ 98.643766, 31.338876 ], [ 98.616048, 31.3036 ], [ 98.60373, 31.257568 ], [ 98.62344, 31.221238 ], [ 98.602498, 31.192062 ], [ 98.675179, 31.15417 ], [ 98.710287, 31.1178 ], [ 98.712135, 31.082954 ], [ 98.736772, 31.049121 ], [ 98.774961, 31.031174 ], [ 98.806374, 30.995783 ], [ 98.797135, 30.948575 ], [ 98.774345, 30.908019 ], [ 98.797135, 30.87926 ], [ 98.850105, 30.849465 ], [ 98.904924, 30.782649 ], [ 98.957895, 30.765166 ], [ 98.963438, 30.728134 ], [ 98.907388, 30.698292 ], [ 98.92217, 30.609225 ], [ 98.939417, 30.598923 ], [ 98.926482, 30.569556 ], [ 98.932025, 30.521623 ], [ 98.965286, 30.449937 ], [ 98.967134, 30.33482 ], [ 98.986844, 30.280569 ], [ 98.970829, 30.260928 ], [ 98.993003, 30.215429 ], [ 98.9813, 30.182843 ], [ 98.989308, 30.151799 ], [ 99.044742, 30.079842 ], [ 99.036735, 30.053945 ], [ 99.055213, 29.958587 ], [ 99.068148, 29.931621 ], [ 99.0238, 29.846009 ], [ 99.018873, 29.792009 ], [ 98.992387, 29.677163 ], [ 99.014561, 29.607464 ], [ 99.052133, 29.563748 ], [ 99.044742, 29.520013 ], [ 99.066916, 29.421018 ], [ 99.058909, 29.417368 ], [ 99.075539, 29.316186 ], [ 99.114343, 29.243628 ], [ 99.113727, 29.221171 ], [ 99.037351, 29.20759 ], [ 99.024416, 29.188783 ], [ 98.9813, 29.204978 ], [ 98.960974, 29.165792 ], [ 98.967134, 29.128159 ], [ 98.991771, 29.105677 ], [ 99.013329, 29.036632 ], [ 98.925866, 28.978536 ], [ 98.917859, 28.886877 ], [ 98.973909, 28.864867 ], [ 98.972677, 28.832367 ], [ 98.922786, 28.823978 ], [ 98.912931, 28.800906 ], [ 98.852569, 28.798283 ], [ 98.827932, 28.821356 ], [ 98.821772, 28.920931 ], [ 98.786048, 28.998952 ], [ 98.757714, 29.004186 ], [ 98.70228, 28.9644 ], [ 98.655469, 28.976966 ], [ 98.624056, 28.95864 ], [ 98.6567, 28.910454 ], [ 98.643766, 28.895261 ], [ 98.668403, 28.843376 ], [ 98.652389, 28.817162 ], [ 98.683802, 28.740054 ], [ 98.666555, 28.712239 ], [ 98.594491, 28.667615 ], [ 98.637606, 28.552029 ], [ 98.619128, 28.50944 ], [ 98.625903, 28.489455 ], [ 98.673947, 28.478934 ], [ 98.693041, 28.43158 ], [ 98.740468, 28.348395 ], [ 98.746628, 28.321003 ], [ 98.710287, 28.288862 ], [ 98.712135, 28.229296 ], [ 98.649925, 28.200291 ], [ 98.625903, 28.165475 ], [ 98.559382, 28.182885 ], [ 98.494092, 28.141203 ], [ 98.464527, 28.151229 ], [ 98.428803, 28.104785 ], [ 98.389383, 28.114814 ], [ 98.389999, 28.16442 ], [ 98.370289, 28.18394 ], [ 98.37768, 28.246167 ], [ 98.353042, 28.293078 ], [ 98.317934, 28.324691 ], [ 98.301303, 28.384204 ], [ 98.208913, 28.358401 ], [ 98.207681, 28.330486 ], [ 98.231702, 28.314681 ], [ 98.266811, 28.242477 ], [ 98.21692, 28.212949 ], [ 98.169492, 28.206093 ], [ 98.17442, 28.163365 ], [ 98.139311, 28.142259 ], [ 98.097427, 28.166531 ], [ 98.090036, 28.195544 ], [ 98.056775, 28.202401 ], [ 98.03337, 28.187105 ], [ 98.008116, 28.214003 ], [ 98.020435, 28.253548 ], [ 97.907718, 28.363141 ], [ 97.871378, 28.361561 ], [ 97.842429, 28.326798 ], [ 97.801161, 28.326798 ], [ 97.769748, 28.3742 ], [ 97.738335, 28.396313 ], [ 97.737103, 28.465782 ], [ 97.68598, 28.519958 ], [ 97.634857, 28.532051 ], [ 97.60406, 28.515225 ], [ 97.569567, 28.541515 ], [ 97.521524, 28.495766 ], [ 97.507974, 28.46473 ], [ 97.521524, 28.444736 ], [ 97.499966, 28.428948 ], [ 97.485184, 28.38631 ], [ 97.488879, 28.347341 ], [ 97.518445, 28.327852 ], [ 97.469169, 28.30309 ], [ 97.461162, 28.26778 ], [ 97.422358, 28.297293 ], [ 97.402032, 28.279903 ], [ 97.398336, 28.238786 ], [ 97.349677, 28.235623 ], [ 97.362612, 28.199236 ], [ 97.352757, 28.149646 ], [ 97.326887, 28.132759 ], [ 97.340438, 28.104785 ], [ 97.305945, 28.071522 ], [ 97.320728, 28.054095 ], [ 97.375547, 28.062545 ], [ 97.378626, 28.031382 ], [ 97.413119, 28.01342 ], [ 97.379242, 27.970087 ], [ 97.372467, 27.907699 ], [ 97.386634, 27.882839 ], [ 97.324424, 27.880723 ], [ 97.303482, 27.913516 ], [ 97.253591, 27.891832 ], [ 97.167975, 27.811932 ], [ 97.103301, 27.780697 ], [ 97.097758, 27.740979 ], [ 97.062649, 27.742568 ], [ 97.049099, 27.81405 ], [ 97.008447, 27.807698 ], [ 96.972722, 27.861149 ], [ 96.908049, 27.884426 ], [ 96.849534, 27.874375 ], [ 96.810114, 27.890245 ], [ 96.784245, 27.931495 ], [ 96.711564, 27.9574 ], [ 96.690622, 27.948942 ], [ 96.635188, 27.994926 ], [ 96.623485, 28.024514 ], [ 96.538485, 28.075218 ], [ 96.499681, 28.067297 ], [ 96.46334, 28.143314 ], [ 96.426384, 28.161782 ], [ 96.395587, 28.143842 ], [ 96.398667, 28.118509 ], [ 96.367254, 28.118509 ], [ 96.298269, 28.140148 ], [ 96.275479, 28.228241 ], [ 96.194175, 28.212949 ], [ 96.098088, 28.212421 ], [ 96.074683, 28.193434 ], [ 95.989067, 28.198181 ], [ 95.936096, 28.240368 ], [ 95.907763, 28.241422 ], [ 95.899756, 28.278322 ], [ 95.874502, 28.29782 ], [ 95.832003, 28.295186 ], [ 95.787655, 28.270416 ], [ 95.740228, 28.275159 ], [ 95.674322, 28.254075 ], [ 95.528345, 28.182885 ], [ 95.437802, 28.161782 ], [ 95.39715, 28.142259 ], [ 95.371896, 28.110063 ], [ 95.352802, 28.04089 ], [ 95.32878, 28.017646 ], [ 95.28628, 27.939955 ], [ 95.067006, 27.840512 ], [ 95.015267, 27.82887 ], [ 94.947514, 27.792345 ], [ 94.88592, 27.743098 ], [ 94.836645, 27.728796 ], [ 94.78121, 27.699127 ], [ 94.722696, 27.683759 ], [ 94.660486, 27.650367 ], [ 94.524979, 27.596282 ], [ 94.478168, 27.602116 ], [ 94.443675, 27.585143 ], [ 94.399944, 27.589386 ], [ 94.353132, 27.578778 ], [ 94.277372, 27.58143 ], [ 94.220705, 27.536333 ], [ 94.147409, 27.458297 ], [ 94.056866, 27.375423 ], [ 93.970634, 27.30525 ], [ 93.849294, 27.168499 ], [ 93.841903, 27.045973 ], [ 93.817265, 27.025183 ], [ 93.747048, 27.015587 ], [ 93.625092, 26.955323 ], [ 93.56781, 26.938252 ], [ 93.232739, 26.906769 ], [ 93.111399, 26.880082 ], [ 93.050421, 26.883819 ], [ 92.909371, 26.914241 ], [ 92.802813, 26.895028 ], [ 92.682089, 26.947855 ], [ 92.64698, 26.952656 ], [ 92.549046, 26.941453 ], [ 92.496691, 26.921711 ], [ 92.404916, 26.9025 ], [ 92.28604, 26.892359 ], [ 92.197961, 26.86994 ], [ 92.109265, 26.854991 ], [ 92.124664, 26.960124 ], [ 92.076005, 27.041175 ], [ 92.043976, 27.052902 ], [ 92.02673, 27.108318 ], [ 92.032273, 27.167967 ], [ 92.061222, 27.190327 ], [ 92.071077, 27.237694 ], [ 92.091403, 27.264296 ], [ 92.125896, 27.273339 ], [ 92.064918, 27.391365 ], [ 92.021802, 27.444489 ], [ 92.010715, 27.474758 ], [ 91.946657, 27.464138 ], [ 91.839484, 27.489624 ], [ 91.753868, 27.462545 ], [ 91.71876, 27.467324 ], [ 91.663325, 27.507142 ], [ 91.626985, 27.509265 ], [ 91.585101, 27.540578 ], [ 91.564775, 27.58196 ], [ 91.582637, 27.598933 ], [ 91.562311, 27.627569 ], [ 91.570934, 27.650897 ], [ 91.622673, 27.692238 ], [ 91.642383, 27.7664 ], [ 91.610355, 27.819343 ], [ 91.544449, 27.820401 ], [ 91.561079, 27.855329 ], [ 91.618978, 27.856916 ], [ 91.611586, 27.891303 ], [ 91.552456, 27.90717 ], [ 91.486551, 27.937311 ], [ 91.490246, 27.971672 ], [ 91.464993, 28.002852 ], [ 91.309776, 28.057791 ], [ 91.251878, 27.970615 ], [ 91.216153, 27.989113 ], [ 91.162567, 27.968501 ], [ 91.147784, 27.927794 ], [ 91.155175, 27.894476 ], [ 91.113292, 27.846333 ], [ 91.025828, 27.857445 ], [ 90.96485, 27.900294 ], [ 90.976553, 27.935725 ], [ 90.96177, 27.9537 ], [ 90.896481, 27.946299 ], [ 90.853365, 27.969029 ], [ 90.806554, 28.015005 ], [ 90.802242, 28.040362 ], [ 90.741264, 28.053038 ], [ 90.701844, 28.076274 ], [ 90.591591, 28.021345 ], [ 90.569417, 28.044059 ], [ 90.513983, 28.062016 ], [ 90.47949, 28.044587 ], [ 90.43699, 28.063073 ], [ 90.384019, 28.06096 ], [ 90.367389, 28.088946 ], [ 90.297172, 28.153868 ], [ 90.231882, 28.144897 ], [ 90.189999, 28.161782 ], [ 90.166593, 28.187632 ], [ 90.124709, 28.190797 ], [ 90.103151, 28.141731 ], [ 90.07297, 28.155451 ], [ 90.03355, 28.136981 ], [ 90.017536, 28.162837 ], [ 89.976268, 28.189215 ], [ 89.901739, 28.18183 ], [ 89.869094, 28.221386 ], [ 89.789638, 28.240895 ], [ 89.779167, 28.197127 ], [ 89.720037, 28.170224 ], [ 89.605472, 28.161782 ], [ 89.541414, 28.088418 ], [ 89.511233, 28.086307 ], [ 89.461958, 28.03191 ], [ 89.44348, 27.968501 ], [ 89.375727, 27.875962 ], [ 89.295655, 27.84845 ], [ 89.238988, 27.796581 ], [ 89.184786, 27.673689 ], [ 89.131815, 27.633402 ], [ 89.128735, 27.611131 ], [ 89.163228, 27.574534 ], [ 89.109025, 27.537925 ], [ 89.095474, 27.471572 ], [ 89.132431, 27.441302 ], [ 89.182938, 27.373829 ], [ 89.152757, 27.319076 ], [ 89.077612, 27.287168 ], [ 89.067757, 27.240354 ], [ 88.984605, 27.208957 ], [ 88.942105, 27.261636 ], [ 88.911924, 27.272807 ], [ 88.920548, 27.325456 ], [ 88.901453, 27.327583 ], [ 88.867577, 27.3818 ], [ 88.838012, 27.37808 ], [ 88.809063, 27.405711 ], [ 88.783193, 27.467324 ], [ 88.797976, 27.521473 ], [ 88.770874, 27.563924 ], [ 88.813374, 27.606889 ], [ 88.816454, 27.641354 ], [ 88.852178, 27.671039 ], [ 88.850331, 27.710783 ], [ 88.870657, 27.743098 ], [ 88.863265, 27.811932 ], [ 88.888519, 27.846863 ], [ 88.864497, 27.921448 ], [ 88.846635, 27.921448 ], [ 88.842939, 28.006023 ], [ 88.812142, 28.018175 ], [ 88.764099, 28.068353 ], [ 88.67602, 28.068353 ], [ 88.645223, 28.111119 ], [ 88.620585, 28.091586 ], [ 88.565151, 28.083139 ], [ 88.554064, 28.027684 ], [ 88.498013, 28.04089 ], [ 88.469064, 28.009721 ], [ 88.43334, 28.002852 ], [ 88.401311, 27.976958 ], [ 88.357579, 27.986471 ], [ 88.254101, 27.939426 ], [ 88.242398, 27.967444 ], [ 88.203594, 27.943127 ], [ 88.156783, 27.957929 ], [ 88.120442, 27.915103 ], [ 88.137689, 27.878607 ], [ 88.111819, 27.864852 ], [ 88.090877, 27.885484 ], [ 88.037291, 27.901881 ], [ 87.982472, 27.884426 ], [ 87.930733, 27.909285 ], [ 87.826639, 27.927794 ], [ 87.782292, 27.890774 ], [ 87.77798, 27.860091 ], [ 87.727473, 27.802933 ], [ 87.668343, 27.809815 ], [ 87.670191, 27.832045 ], [ 87.598126, 27.814579 ], [ 87.58088, 27.859562 ], [ 87.45954, 27.820931 ], [ 87.418272, 27.825694 ], [ 87.421967, 27.856916 ], [ 87.364069, 27.824106 ], [ 87.317258, 27.826753 ], [ 87.280917, 27.845275 ], [ 87.249504, 27.839454 ], [ 87.227946, 27.812991 ], [ 87.173744, 27.818284 ], [ 87.118309, 27.840512 ], [ 87.080737, 27.910872 ], [ 87.035157, 27.946299 ], [ 86.935375, 27.955286 ], [ 86.926752, 27.985942 ], [ 86.885484, 27.995983 ], [ 86.864542, 28.022401 ], [ 86.827586, 28.012363 ], [ 86.756753, 28.032967 ], [ 86.768456, 28.06941 ], [ 86.74813, 28.089474 ], [ 86.700086, 28.101617 ], [ 86.662514, 28.092114 ], [ 86.647732, 28.06941 ], [ 86.611391, 28.069938 ], [ 86.60092, 28.097922 ], [ 86.568891, 28.103201 ], [ 86.55842, 28.047757 ], [ 86.537478, 28.044587 ], [ 86.513457, 27.996511 ], [ 86.514689, 27.954757 ], [ 86.475884, 27.944713 ], [ 86.450015, 27.908757 ], [ 86.414906, 27.904526 ], [ 86.393349, 27.926736 ], [ 86.308965, 27.950528 ], [ 86.27324, 27.976958 ], [ 86.231972, 27.974315 ], [ 86.206103, 28.084195 ], [ 86.223965, 28.092642 ], [ 86.19132, 28.167058 ], [ 86.140198, 28.114814 ], [ 86.128495, 28.086835 ], [ 86.086611, 28.090002 ], [ 86.082915, 28.018175 ], [ 86.125415, 27.923035 ], [ 86.053966, 27.900823 ], [ 86.002227, 27.90717 ], [ 85.949256, 27.937311 ], [ 85.980053, 27.984357 ], [ 85.901213, 28.053566 ], [ 85.898749, 28.101617 ], [ 85.871648, 28.124843 ], [ 85.854402, 28.172334 ], [ 85.791576, 28.195544 ], [ 85.753388, 28.227714 ], [ 85.720743, 28.372093 ], [ 85.682555, 28.375779 ], [ 85.650526, 28.283592 ], [ 85.601251, 28.254075 ], [ 85.602483, 28.295712 ], [ 85.520563, 28.326798 ], [ 85.458969, 28.332593 ], [ 85.415853, 28.321003 ], [ 85.379512, 28.274105 ], [ 85.349947, 28.298347 ], [ 85.272339, 28.282538 ], [ 85.209513, 28.338914 ], [ 85.179948, 28.324164 ], [ 85.113427, 28.344708 ], [ 85.129441, 28.377885 ], [ 85.108499, 28.461047 ], [ 85.160238, 28.49261 ], [ 85.189803, 28.544669 ], [ 85.18426, 28.587244 ], [ 85.195963, 28.624022 ], [ 85.155926, 28.643983 ], [ 85.126361, 28.676016 ], [ 85.05676, 28.674441 ], [ 84.995782, 28.611414 ], [ 84.981616, 28.586193 ], [ 84.896616, 28.587244 ], [ 84.857196, 28.567798 ], [ 84.773428, 28.610363 ], [ 84.698284, 28.633478 ], [ 84.699515, 28.671816 ], [ 84.669334, 28.680742 ], [ 84.650856, 28.714338 ], [ 84.620059, 28.732182 ], [ 84.557233, 28.74635 ], [ 84.483321, 28.735331 ], [ 84.445133, 28.764189 ], [ 84.434046, 28.823978 ], [ 84.404481, 28.828173 ], [ 84.408176, 28.85386 ], [ 84.340423, 28.866963 ], [ 84.330568, 28.859101 ], [ 84.268358, 28.895261 ], [ 84.234481, 28.889497 ], [ 84.228322, 28.949738 ], [ 84.248648, 29.030353 ], [ 84.224626, 29.049189 ], [ 84.194445, 29.045004 ], [ 84.192597, 29.084236 ], [ 84.20738, 29.118749 ], [ 84.176583, 29.133909 ], [ 84.17104, 29.19453 ], [ 84.197525, 29.210202 ], [ 84.203068, 29.239972 ], [ 84.130388, 29.239972 ], [ 84.116837, 29.286438 ], [ 84.052163, 29.296877 ], [ 84.002272, 29.291658 ], [ 83.986874, 29.325057 ], [ 83.949301, 29.312533 ], [ 83.911729, 29.323491 ], [ 83.851367, 29.294789 ], [ 83.82057, 29.294267 ], [ 83.800244, 29.249372 ], [ 83.727563, 29.244672 ], [ 83.667201, 29.200277 ], [ 83.656114, 29.16736 ], [ 83.596368, 29.174153 ], [ 83.57789, 29.203934 ], [ 83.548941, 29.201322 ], [ 83.492274, 29.280174 ], [ 83.463941, 29.285916 ], [ 83.450391, 29.332883 ], [ 83.423289, 29.361053 ], [ 83.415898, 29.420496 ], [ 83.383253, 29.42206 ], [ 83.325355, 29.502826 ], [ 83.27608, 29.505951 ], [ 83.266841, 29.571035 ], [ 83.217565, 29.60018 ], [ 83.164595, 29.595496 ], [ 83.159667, 29.61735 ], [ 83.12887, 29.623593 ], [ 83.088834, 29.604863 ], [ 83.011226, 29.667804 ], [ 82.966878, 29.658963 ], [ 82.9484, 29.704718 ], [ 82.885574, 29.689122 ], [ 82.830756, 29.687562 ], [ 82.816589, 29.717192 ], [ 82.774089, 29.726548 ], [ 82.757459, 29.761881 ], [ 82.691553, 29.766037 ], [ 82.737749, 29.80655 ], [ 82.703872, 29.847566 ], [ 82.6238, 29.834588 ], [ 82.64351, 29.868846 ], [ 82.609017, 29.886489 ], [ 82.560974, 29.955476 ], [ 82.498148, 29.947698 ], [ 82.474743, 29.973622 ], [ 82.431011, 29.989692 ], [ 82.412533, 30.011978 ], [ 82.368185, 30.014051 ], [ 82.333693, 30.045138 ], [ 82.311519, 30.035813 ], [ 82.246845, 30.071555 ], [ 82.17786, 30.06793 ], [ 82.183403, 30.12178 ], [ 82.207425, 30.143519 ], [ 82.188947, 30.18543 ], [ 82.142135, 30.200948 ], [ 82.114418, 30.226806 ], [ 82.11873, 30.279019 ], [ 82.132896, 30.30434 ], [ 82.104563, 30.346182 ], [ 82.060215, 30.332237 ], [ 82.022027, 30.339468 ], [ 81.99123, 30.322939 ], [ 81.954274, 30.355995 ], [ 81.939491, 30.344633 ], [ 81.872354, 30.373035 ], [ 81.759021, 30.385426 ], [ 81.723913, 30.407623 ], [ 81.63029, 30.446842 ], [ 81.613044, 30.412784 ], [ 81.566232, 30.428782 ], [ 81.555761, 30.369421 ], [ 81.494783, 30.381296 ], [ 81.454131, 30.412268 ], [ 81.418407, 30.420525 ], [ 81.406704, 30.40401 ], [ 81.432573, 30.379231 ], [ 81.406088, 30.369421 ], [ 81.399929, 30.319323 ], [ 81.427646, 30.305373 ], [ 81.406088, 30.291938 ], [ 81.419023, 30.270232 ], [ 81.397465, 30.240767 ], [ 81.393769, 30.199396 ], [ 81.335871, 30.149729 ], [ 81.269349, 30.153351 ], [ 81.293371, 30.094859 ], [ 81.2829, 30.061197 ], [ 81.247792, 30.032705 ], [ 81.256415, 30.011978 ], [ 81.225618, 30.005759 ], [ 81.131995, 30.016124 ], [ 81.09627, 30.052909 ], [ 81.110437, 30.085538 ], [ 81.085799, 30.100554 ], [ 81.082104, 30.151281 ], [ 81.038372, 30.205086 ], [ 81.034677, 30.246971 ], [ 80.996488, 30.267648 ], [ 80.933662, 30.266614 ], [ 80.910873, 30.30279 ], [ 80.81725, 30.321389 ], [ 80.719316, 30.414848 ], [ 80.692214, 30.416913 ], [ 80.633084, 30.458707 ], [ 80.585041, 30.463866 ], [ 80.549316, 30.448905 ], [ 80.504969, 30.483466 ], [ 80.446454, 30.495327 ], [ 80.43044, 30.515952 ], [ 80.357759, 30.520592 ], [ 80.322035, 30.564403 ], [ 80.261673, 30.566465 ], [ 80.214245, 30.586044 ], [ 80.143412, 30.55822 ], [ 80.04363, 30.603559 ], [ 80.014065, 30.661748 ], [ 79.970333, 30.685941 ], [ 79.955551, 30.738422 ], [ 79.961094, 30.771337 ], [ 79.900732, 30.7991 ], [ 79.913051, 30.833022 ], [ 79.890877, 30.855116 ], [ 79.835443, 30.851006 ], [ 79.75845, 30.936769 ], [ 79.729501, 30.941389 ], [ 79.668523, 30.980392 ], [ 79.660516, 30.956787 ], [ 79.59769, 30.925989 ], [ 79.550879, 30.957813 ], [ 79.505915, 31.027584 ], [ 79.427075, 31.018353 ], [ 79.424611, 31.061425 ], [ 79.404901, 31.071678 ], [ 79.35809, 31.031174 ], [ 79.316206, 31.01784 ], [ 79.33222, 30.969103 ], [ 79.227511, 30.949088 ], [ 79.205953, 31.0004 ], [ 79.181931, 31.015788 ], [ 79.096931, 30.992192 ], [ 79.059359, 31.028097 ], [ 79.010084, 31.043994 ], [ 78.97436, 31.115751 ], [ 78.997765, 31.158779 ], [ 78.930628, 31.220726 ], [ 78.923852, 31.246824 ], [ 78.884432, 31.277006 ], [ 78.865338, 31.312804 ], [ 78.859179, 31.289281 ], [ 78.795121, 31.301043 ], [ 78.755085, 31.355742 ], [ 78.760013, 31.392531 ], [ 78.792041, 31.435944 ], [ 78.755701, 31.478316 ], [ 78.729832, 31.478316 ], [ 78.740303, 31.532912 ], [ 78.779723, 31.545154 ], [ 78.833925, 31.584927 ], [ 78.845628, 31.609905 ], [ 78.806824, 31.64099 ], [ 78.798817, 31.675629 ], [ 78.763092, 31.668499 ], [ 78.706426, 31.778453 ], [ 78.654687, 31.819144 ], [ 78.665158, 31.851684 ], [ 78.739687, 31.885228 ], [ 78.768636, 31.92638 ], [ 78.762476, 31.947203 ], [ 78.705194, 31.988835 ], [ 78.60726, 32.023851 ], [ 78.609107, 32.052768 ], [ 78.527188, 32.11463 ], [ 78.509941, 32.147065 ], [ 78.469905, 32.127808 ], [ 78.429869, 32.194683 ], [ 78.430485, 32.212407 ], [ 78.475449, 32.236708 ], [ 78.508709, 32.297939 ], [ 78.480992, 32.329297 ], [ 78.483456, 32.357106 ], [ 78.458818, 32.379853 ], [ 78.472985, 32.435431 ], [ 78.426174, 32.502584 ], [ 78.395377, 32.530339 ], [ 78.424942, 32.565652 ], [ 78.500086, 32.580782 ], [ 78.518564, 32.605993 ], [ 78.577695, 32.615067 ], [ 78.588782, 32.637748 ], [ 78.628202, 32.630188 ], [ 78.675013, 32.658408 ], [ 78.6861, 32.680071 ], [ 78.741534, 32.703743 ], [ 78.74215, 32.654881 ], [ 78.781571, 32.608009 ], [ 78.760629, 32.563635 ], [ 78.782186, 32.480373 ], [ 78.81052, 32.436441 ], [ 78.87273, 32.40512 ], [ 78.904142, 32.374798 ], [ 78.970664, 32.331826 ], [ 79.005772, 32.375304 ], [ 79.067982, 32.380863 ], [ 79.103091, 32.369744 ], [ 79.124649, 32.416235 ], [ 79.135736, 32.472295 ], [ 79.180083, 32.492994 ], [ 79.190554, 32.511669 ], [ 79.252148, 32.516715 ], [ 79.272474, 32.561113 ], [ 79.308199, 32.596918 ], [ 79.299575, 32.637244 ], [ 79.27309, 32.678056 ], [ 79.301423, 32.728919 ], [ 79.275554, 32.778746 ], [ 79.225047, 32.784281 ], [ 79.237982, 32.846145 ], [ 79.227511, 32.89038 ], [ 79.255844, 32.942628 ], [ 79.204721, 32.964724 ], [ 79.162837, 33.01191 ], [ 79.139431, 33.117735 ], [ 79.162221, 33.165841 ], [ 79.152366, 33.184375 ], [ 79.10925, 33.200401 ], [ 79.072294, 33.22844 ], [ 79.083997, 33.245459 ], [ 79.041497, 33.268479 ], [ 79.022403, 33.323504 ], [ 78.9682, 33.334505 ], [ 78.949722, 33.376495 ], [ 78.896751, 33.41247 ], [ 78.84994, 33.419963 ], [ 78.816679, 33.480882 ], [ 78.74215, 33.55323 ], [ 78.755085, 33.623025 ], [ 78.713201, 33.623025 ], [ 78.684868, 33.654415 ], [ 78.692259, 33.676331 ], [ 78.779723, 33.73259 ], [ 78.758165, 33.790802 ], [ 78.766172, 33.823124 ], [ 78.756317, 33.8773 ], [ 78.762476, 33.90959 ], [ 78.734143, 33.918529 ], [ 78.744614, 33.980585 ], [ 78.736607, 33.999937 ], [ 78.656535, 34.030196 ], [ 78.661462, 34.086718 ], [ 78.737223, 34.089692 ], [ 78.801897, 34.137258 ], [ 78.828998, 34.125369 ], [ 78.878273, 34.163012 ], [ 78.910302, 34.143202 ], [ 78.9257, 34.155584 ], [ 78.941099, 34.212022 ], [ 78.958345, 34.230827 ], [ 78.981751, 34.31836 ], [ 79.019939, 34.313417 ], [ 79.039649, 34.33467 ], [ 79.048888, 34.348506 ], [ 79.0107, 34.399877 ], [ 79.039033, 34.421601 ], [ 79.072294, 34.412714 ], [ 79.161605, 34.441345 ], [ 79.179467, 34.422588 ], [ 79.241677, 34.415183 ], [ 79.274322, 34.435916 ], [ 79.326677, 34.44332 ], [ 79.363017, 34.428018 ], [ 79.435082, 34.447761 ], [ 79.504683, 34.45467 ], [ 79.545335, 34.476381 ], [ 79.58106, 34.456151 ], [ 79.675914, 34.451216 ], [ 79.699936, 34.477861 ], [ 79.735661, 34.471447 ], [ 79.801566, 34.478847 ], [ 79.861312, 34.528166 ], [ 79.84345, 34.55725 ], [ 79.88595, 34.642965 ], [ 79.866856, 34.671517 ], [ 79.906892, 34.683821 ], [ 79.898268, 34.732035 ], [ 79.947544, 34.821008 ], [ 79.926602, 34.849499 ], [ 79.961094, 34.862759 ], [ 79.996819, 34.856375 ], [ 80.003594, 34.895162 ], [ 80.034391, 34.902033 ], [ 80.041782, 34.943252 ], [ 80.02392, 34.971209 ], [ 80.04363, 35.022196 ], [ 80.031311, 35.034447 ], [ 80.078123, 35.076578 ], [ 80.118159, 35.066293 ], [ 80.23026, 35.147565 ], [ 80.223484, 35.177409 ], [ 80.257977, 35.203331 ], [ 80.362687, 35.20871 ], [ 80.267832, 35.295701 ], [ 80.286926, 35.35283 ], [ 80.321419, 35.38699 ], [ 80.375006, 35.387966 ], [ 80.432904, 35.449418 ], [ 80.444607, 35.417235 ], [ 80.514824, 35.391869 ], [ 80.532686, 35.404553 ], [ 80.56841, 35.391381 ], [ 80.599823, 35.409431 ], [ 80.65649, 35.393821 ], [ 80.690982, 35.364544 ], [ 80.689135, 35.339162 ], [ 80.759968, 35.334768 ], [ 80.844351, 35.345508 ], [ 80.894242, 35.324027 ], [ 80.924423, 35.330862 ], [ 80.963844, 35.310842 ], [ 81.026053, 35.31133 ], [ 81.002648, 35.334768 ], [ 81.030981, 35.337209 ], [ 81.031597, 35.380648 ], [ 81.054387, 35.402602 ], [ 81.09935, 35.40748 ], [ 81.103662, 35.386015 ], [ 81.142466, 35.365032 ], [ 81.191741, 35.36552 ], [ 81.219458, 35.319144 ], [ 81.26627, 35.322562 ], [ 81.285364, 35.345508 ], [ 81.314313, 35.337209 ], [ 81.363588, 35.354783 ], [ 81.385762, 35.335256 ], [ 81.441196, 35.333303 ], [ 81.447972, 35.318167 ], [ 81.504638, 35.279092 ], [ 81.513261, 35.23511 ], [ 81.68634, 35.235599 ], [ 81.736847, 35.26248 ], [ 81.804601, 35.270786 ], [ 81.853876, 35.25857 ], [ 81.927789, 35.271275 ], [ 81.955506, 35.307423 ], [ 81.99123, 35.30547 ], [ 82.030034, 35.321585 ], [ 82.05344, 35.35039 ], [ 82.029419, 35.426013 ], [ 82.034346, 35.451855 ], [ 82.071302, 35.450393 ], [ 82.086701, 35.467454 ], [ 82.164925, 35.495719 ], [ 82.189563, 35.513258 ], [ 82.234526, 35.520565 ], [ 82.263475, 35.547837 ], [ 82.2992, 35.544916 ], [ 82.328149, 35.559523 ], [ 82.350323, 35.611113 ], [ 82.336156, 35.651486 ], [ 82.392823, 35.656349 ], [ 82.424852, 35.712736 ], [ 82.468583, 35.717595 ], [ 82.501844, 35.701073 ], [ 82.546192, 35.708362 ], [ 82.628727, 35.692324 ], [ 82.652133, 35.67288 ], [ 82.731589, 35.637868 ], [ 82.780249, 35.666073 ], [ 82.795031, 35.688436 ], [ 82.873871, 35.688922 ], [ 82.894813, 35.673852 ], [ 82.967494, 35.667532 ], [ 82.956407, 35.636409 ], [ 82.981661, 35.599922 ], [ 82.971806, 35.548324 ], [ 82.998907, 35.484512 ], [ 83.067892, 35.46258 ], [ 83.088834, 35.425526 ], [ 83.127022, 35.398699 ], [ 83.178145, 35.38943 ], [ 83.251442, 35.417722 ], [ 83.280391, 35.401138 ], [ 83.333978, 35.397236 ], [ 83.405427, 35.380648 ], [ 83.449159, 35.382111 ], [ 83.502745, 35.360639 ], [ 83.540318, 35.364056 ], [ 83.54155, 35.341603 ], [ 83.599448, 35.351366 ], [ 83.622238, 35.335256 ], [ 83.677672, 35.361128 ], [ 83.785462, 35.36308 ], [ 83.79778, 35.354783 ], [ 83.885244, 35.367472 ], [ 83.906186, 35.40309 ], [ 84.005968, 35.422599 ], [ 84.077417, 35.400163 ], [ 84.095895, 35.362592 ], [ 84.140859, 35.379184 ], [ 84.160569, 35.359663 ], [ 84.200605, 35.381135 ], [ 84.274517, 35.404065 ], [ 84.333032, 35.413821 ], [ 84.424191, 35.466479 ], [ 84.45314, 35.473303 ], [ 84.475929, 35.516181 ], [ 84.448828, 35.550272 ], [ 84.513502, 35.564391 ], [ 84.570168, 35.588242 ], [ 84.628067, 35.595055 ], [ 84.704443, 35.616951 ], [ 84.729081, 35.613546 ], [ 84.798066, 35.647595 ], [ 84.920022, 35.696213 ], [ 84.973608, 35.709334 ], [ 84.99455, 35.737028 ], [ 85.053065, 35.752086 ], [ 85.146071, 35.742371 ], [ 85.271107, 35.788989 ], [ 85.341324, 35.753543 ], [ 85.373969, 35.700101 ], [ 85.518715, 35.680658 ], [ 85.566142, 35.6403 ], [ 85.612953, 35.651486 ], [ 85.65299, 35.731199 ], [ 85.691178, 35.751114 ], [ 85.811286, 35.778794 ], [ 85.835308, 35.771996 ], [ 85.903677, 35.78462 ], [ 85.949256, 35.778794 ], [ 86.035488, 35.846738 ], [ 86.05335, 35.842857 ], [ 86.090306, 35.876809 ], [ 86.093386, 35.906868 ], [ 86.129111, 35.941761 ], [ 86.150668, 36.00424 ], [ 86.173458, 36.008113 ], [ 86.199944, 36.047801 ], [ 86.182081, 36.064734 ], [ 86.187625, 36.130983 ], [ 86.248603, 36.141616 ], [ 86.2794, 36.170608 ], [ 86.35824, 36.168676 ], [ 86.392733, 36.206834 ], [ 86.454943, 36.221319 ], [ 86.515305, 36.205385 ], [ 86.531935, 36.227113 ], [ 86.599072, 36.222285 ], [ 86.69947, 36.24449 ], [ 86.746282, 36.291777 ], [ 86.836209, 36.291294 ], [ 86.86331, 36.299977 ], [ 86.887332, 36.262829 ], [ 86.931064, 36.265242 ], [ 86.943998, 36.284058 ], [ 86.996353, 36.308658 ], [ 87.051788, 36.2966 ], [ 87.08628, 36.310587 ], [ 87.149106, 36.297565 ], [ 87.161425, 36.325535 ], [ 87.193454, 36.349158 ], [ 87.292004, 36.358797 ], [ 87.348055, 36.393008 ], [ 87.363453, 36.420463 ], [ 87.386859, 36.412757 ], [ 87.426895, 36.42576 ], [ 87.460155, 36.409868 ], [ 87.470626, 36.354459 ], [ 87.570409, 36.342409 ], [ 87.6203, 36.360243 ], [ 87.731785, 36.384818 ], [ 87.767509, 36.3747 ], [ 87.826023, 36.391563 ], [ 87.838342, 36.383855 ], [ 87.919646, 36.39349 ], [ 87.95845, 36.408423 ], [ 87.983088, 36.437797 ], [ 88.006494, 36.430575 ], [ 88.092109, 36.43539 ], [ 88.134609, 36.427205 ], [ 88.182652, 36.452721 ], [ 88.222688, 36.447426 ], [ 88.241782, 36.468605 ], [ 88.282434, 36.470049 ], [ 88.366202, 36.458016 ], [ 88.356963, 36.477268 ], [ 88.41055, 36.473418 ], [ 88.470912, 36.48208 ], [ 88.498629, 36.446463 ], [ 88.573158, 36.461386 ], [ 88.618121, 36.428168 ], [ 88.623665, 36.389636 ], [ 88.690186, 36.367954 ], [ 88.766563, 36.292259 ], [ 88.783809, 36.291777 ], [ 88.802903, 36.33807 ], [ 88.838628, 36.353496 ], [ 88.870657, 36.348193 ], [ 88.926091, 36.36458 ], [ 88.964279, 36.318785 ], [ 89.013554, 36.315409 ], [ 89.054822, 36.291777 ], [ 89.10225, 36.281164 ], [ 89.126887, 36.254626 ], [ 89.198952, 36.260417 ], [ 89.232213, 36.295636 ], [ 89.292575, 36.231457 ], [ 89.335075, 36.23725 ], [ 89.375727, 36.228078 ], [ 89.490291, 36.151281 ], [ 89.594385, 36.126632 ], [ 89.614711, 36.109712 ], [ 89.711414, 36.093272 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"610000\", \"name\": \"陕西省\", \"center\": [ 108.948024, 34.263161 ], \"centroid\": [ 108.887304, 35.263625 ], \"childrenNum\": 10, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 26, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 110.398352, 33.176862 ], [ 110.398352, 33.176862 ], [ 110.372482, 33.186379 ], [ 110.33799, 33.160331 ], [ 110.285635, 33.171352 ], [ 110.218497, 33.163336 ], [ 110.164911, 33.209415 ], [ 110.031252, 33.191888 ], [ 109.999223, 33.212419 ], [ 109.973353, 33.203907 ], [ 109.916687, 33.229942 ], [ 109.852013, 33.247961 ], [ 109.813209, 33.236449 ], [ 109.732521, 33.231443 ], [ 109.693101, 33.254468 ], [ 109.649985, 33.251465 ], [ 109.619804, 33.275484 ], [ 109.60687, 33.235949 ], [ 109.514479, 33.237951 ], [ 109.498464, 33.207412 ], [ 109.438718, 33.152314 ], [ 109.468283, 33.140288 ], [ 109.522486, 33.138785 ], [ 109.576073, 33.110216 ], [ 109.688174, 33.116733 ], [ 109.704188, 33.101694 ], [ 109.794731, 33.067095 ], [ 109.785492, 32.987316 ], [ 109.76455, 32.909474 ], [ 109.789804, 32.882339 ], [ 109.847702, 32.893395 ], [ 109.856941, 32.910479 ], [ 109.907448, 32.903947 ], [ 109.927158, 32.887364 ], [ 109.988752, 32.886359 ], [ 110.051578, 32.851676 ], [ 110.105164, 32.832569 ], [ 110.142121, 32.802895 ], [ 110.127338, 32.77774 ], [ 110.159367, 32.767173 ], [ 110.156903, 32.683093 ], [ 110.206179, 32.633212 ], [ 110.153824, 32.593388 ], [ 110.124259, 32.616579 ], [ 110.090382, 32.617083 ], [ 110.084223, 32.580782 ], [ 110.017701, 32.546989 ], [ 109.97089, 32.577756 ], [ 109.910528, 32.592884 ], [ 109.816905, 32.577252 ], [ 109.746072, 32.594901 ], [ 109.726978, 32.608513 ], [ 109.631507, 32.599943 ], [ 109.619804, 32.56767 ], [ 109.637051, 32.540935 ], [ 109.575457, 32.506622 ], [ 109.526797, 32.43341 ], [ 109.529877, 32.405625 ], [ 109.502776, 32.38895 ], [ 109.513247, 32.342444 ], [ 109.495385, 32.300468 ], [ 109.528645, 32.270112 ], [ 109.550203, 32.225065 ], [ 109.592703, 32.219495 ], [ 109.604406, 32.199241 ], [ 109.58716, 32.161251 ], [ 109.621652, 32.106519 ], [ 109.590855, 32.047696 ], [ 109.590855, 32.012688 ], [ 109.631507, 31.962436 ], [ 109.62042, 31.928412 ], [ 109.584696, 31.900472 ], [ 109.60379, 31.885737 ], [ 109.633971, 31.824738 ], [ 109.633971, 31.804396 ], [ 109.592087, 31.789136 ], [ 109.585928, 31.726546 ], [ 109.549587, 31.73011 ], [ 109.502776, 31.716365 ], [ 109.446109, 31.722983 ], [ 109.381436, 31.705165 ], [ 109.281654, 31.716874 ], [ 109.282885, 31.743343 ], [ 109.253936, 31.759628 ], [ 109.279806, 31.776418 ], [ 109.27611, 31.79931 ], [ 109.195422, 31.817618 ], [ 109.191111, 31.85575 ], [ 109.123357, 31.892851 ], [ 109.085785, 31.929428 ], [ 108.986619, 31.980205 ], [ 108.902235, 31.984774 ], [ 108.837561, 32.039072 ], [ 108.78767, 32.04871 ], [ 108.75133, 32.076098 ], [ 108.734084, 32.106519 ], [ 108.676801, 32.10297 ], [ 108.585026, 32.17189 ], [ 108.543758, 32.177969 ], [ 108.509882, 32.201266 ], [ 108.507418, 32.245819 ], [ 108.469846, 32.270618 ], [ 108.414411, 32.252399 ], [ 108.389773, 32.263533 ], [ 108.310933, 32.232152 ], [ 108.240716, 32.274666 ], [ 108.179738, 32.221521 ], [ 108.156948, 32.239239 ], [ 108.143398, 32.219495 ], [ 108.086731, 32.233165 ], [ 108.018362, 32.2119 ], [ 108.024521, 32.177462 ], [ 107.979558, 32.146051 ], [ 107.924739, 32.197215 ], [ 107.890247, 32.214432 ], [ 107.864377, 32.201266 ], [ 107.812022, 32.247844 ], [ 107.753508, 32.338399 ], [ 107.707929, 32.331826 ], [ 107.680827, 32.397035 ], [ 107.648183, 32.413709 ], [ 107.598291, 32.411688 ], [ 107.527458, 32.38238 ], [ 107.489886, 32.425328 ], [ 107.456625, 32.41775 ], [ 107.460937, 32.453612 ], [ 107.438763, 32.465732 ], [ 107.436299, 32.529835 ], [ 107.382097, 32.54043 ], [ 107.356843, 32.506622 ], [ 107.313727, 32.489965 ], [ 107.287858, 32.457147 ], [ 107.263836, 32.403099 ], [ 107.212097, 32.428864 ], [ 107.189924, 32.468256 ], [ 107.127098, 32.482393 ], [ 107.080286, 32.542448 ], [ 107.108004, 32.600951 ], [ 107.098765, 32.649338 ], [ 107.05996, 32.686115 ], [ 107.066736, 32.708779 ], [ 107.012533, 32.721367 ], [ 106.912751, 32.704247 ], [ 106.903512, 32.721367 ], [ 106.854853, 32.724388 ], [ 106.82344, 32.705254 ], [ 106.793259, 32.712807 ], [ 106.783404, 32.735967 ], [ 106.733513, 32.739491 ], [ 106.670071, 32.694678 ], [ 106.626955, 32.682086 ], [ 106.585687, 32.68813 ], [ 106.517934, 32.668485 ], [ 106.498224, 32.649338 ], [ 106.451412, 32.65992 ], [ 106.421231, 32.616579 ], [ 106.389203, 32.62666 ], [ 106.347935, 32.671003 ], [ 106.301123, 32.680071 ], [ 106.267863, 32.673522 ], [ 106.254928, 32.693671 ], [ 106.17424, 32.6977 ], [ 106.120037, 32.719856 ], [ 106.071378, 32.758114 ], [ 106.076305, 32.759121 ], [ 106.076921, 32.76365 ], [ 106.07261, 32.76365 ], [ 106.093552, 32.82402 ], [ 106.071378, 32.828546 ], [ 106.044277, 32.864747 ], [ 106.011632, 32.829552 ], [ 105.969132, 32.849162 ], [ 105.93156, 32.826032 ], [ 105.893371, 32.838603 ], [ 105.849024, 32.817985 ], [ 105.825002, 32.824523 ], [ 105.822538, 32.770192 ], [ 105.779423, 32.750061 ], [ 105.768952, 32.767676 ], [ 105.719061, 32.759624 ], [ 105.677793, 32.726402 ], [ 105.596489, 32.69921 ], [ 105.585402, 32.728919 ], [ 105.563844, 32.724891 ], [ 105.555221, 32.794343 ], [ 105.534279, 32.790822 ], [ 105.524424, 32.847654 ], [ 105.495475, 32.873292 ], [ 105.49917, 32.911986 ], [ 105.528119, 32.919019 ], [ 105.565692, 32.906962 ], [ 105.590329, 32.87681 ], [ 105.638373, 32.879323 ], [ 105.656851, 32.895405 ], [ 105.735691, 32.905454 ], [ 105.82685, 32.950663 ], [ 105.861959, 32.939112 ], [ 105.917393, 32.993841 ], [ 105.926632, 33.042517 ], [ 105.914929, 33.066092 ], [ 105.934639, 33.112221 ], [ 105.923552, 33.147805 ], [ 105.897067, 33.146803 ], [ 105.93156, 33.178365 ], [ 105.968516, 33.154318 ], [ 105.965436, 33.204407 ], [ 105.917393, 33.237951 ], [ 105.862574, 33.234447 ], [ 105.799133, 33.258471 ], [ 105.791741, 33.278486 ], [ 105.752937, 33.291994 ], [ 105.755401, 33.329004 ], [ 105.709822, 33.382991 ], [ 105.827466, 33.379993 ], [ 105.837937, 33.410971 ], [ 105.831162, 33.451926 ], [ 105.842248, 33.489866 ], [ 105.871198, 33.511325 ], [ 105.902611, 33.556222 ], [ 105.940183, 33.570684 ], [ 105.971596, 33.613058 ], [ 106.047356, 33.610067 ], [ 106.086776, 33.617045 ], [ 106.117573, 33.602591 ], [ 106.108334, 33.569686 ], [ 106.187174, 33.546746 ], [ 106.237681, 33.564201 ], [ 106.303587, 33.604585 ], [ 106.35163, 33.587137 ], [ 106.384891, 33.612061 ], [ 106.447101, 33.613058 ], [ 106.456956, 33.532779 ], [ 106.540108, 33.512822 ], [ 106.58076, 33.576169 ], [ 106.575832, 33.631497 ], [ 106.534564, 33.695254 ], [ 106.482825, 33.707203 ], [ 106.488369, 33.757969 ], [ 106.461883, 33.789807 ], [ 106.491448, 33.834559 ], [ 106.475434, 33.875809 ], [ 106.428007, 33.866368 ], [ 106.41076, 33.909093 ], [ 106.474202, 33.970659 ], [ 106.471738, 34.024244 ], [ 106.505615, 34.056479 ], [ 106.501919, 34.105055 ], [ 106.560434, 34.109514 ], [ 106.585071, 34.149641 ], [ 106.55797, 34.229837 ], [ 106.5321, 34.254079 ], [ 106.496376, 34.238248 ], [ 106.526557, 34.292159 ], [ 106.577064, 34.280786 ], [ 106.589383, 34.253584 ], [ 106.63373, 34.260014 ], [ 106.652825, 34.24369 ], [ 106.68239, 34.256057 ], [ 106.705179, 34.299575 ], [ 106.691013, 34.337635 ], [ 106.717498, 34.369255 ], [ 106.638042, 34.391481 ], [ 106.610941, 34.454177 ], [ 106.558586, 34.48822 ], [ 106.513622, 34.498085 ], [ 106.514238, 34.511894 ], [ 106.455108, 34.531617 ], [ 106.334384, 34.517811 ], [ 106.341159, 34.568093 ], [ 106.314058, 34.578934 ], [ 106.419384, 34.643458 ], [ 106.471122, 34.634102 ], [ 106.442173, 34.675455 ], [ 106.456956, 34.703996 ], [ 106.487137, 34.715311 ], [ 106.505615, 34.746789 ], [ 106.539492, 34.745805 ], [ 106.575216, 34.769897 ], [ 106.550579, 34.82936 ], [ 106.556122, 34.861285 ], [ 106.527789, 34.876507 ], [ 106.493296, 34.941289 ], [ 106.484673, 34.983959 ], [ 106.494528, 35.006021 ], [ 106.494528, 35.006021 ], [ 106.52163, 35.027587 ], [ 106.541956, 35.083925 ], [ 106.577064, 35.089312 ], [ 106.615252, 35.071191 ], [ 106.706411, 35.081966 ], [ 106.710723, 35.100574 ], [ 106.838222, 35.080007 ], [ 106.901664, 35.094698 ], [ 106.950323, 35.066782 ], [ 106.990975, 35.068252 ], [ 107.012533, 35.029547 ], [ 107.08275, 35.024156 ], [ 107.089526, 34.976604 ], [ 107.119707, 34.950119 ], [ 107.162206, 34.944233 ], [ 107.189308, 34.893198 ], [ 107.252749, 34.880925 ], [ 107.286626, 34.931968 ], [ 107.350068, 34.93393 ], [ 107.369162, 34.917738 ], [ 107.400575, 34.932949 ], [ 107.455394, 34.916757 ], [ 107.523763, 34.909886 ], [ 107.564415, 34.968757 ], [ 107.619849, 34.964834 ], [ 107.638943, 34.935402 ], [ 107.675284, 34.9511 ], [ 107.741805, 34.953553 ], [ 107.842203, 34.979056 ], [ 107.863145, 34.999158 ], [ 107.846515, 35.024646 ], [ 107.814486, 35.024646 ], [ 107.773218, 35.060904 ], [ 107.773218, 35.060904 ], [ 107.769523, 35.064333 ], [ 107.769523, 35.064333 ], [ 107.727639, 35.120157 ], [ 107.715936, 35.168114 ], [ 107.686371, 35.218 ], [ 107.652494, 35.244886 ], [ 107.667277, 35.257104 ], [ 107.737494, 35.267366 ], [ 107.745501, 35.311819 ], [ 107.841587, 35.276649 ], [ 107.867457, 35.256127 ], [ 107.960464, 35.263457 ], [ 107.949993, 35.245375 ], [ 108.049159, 35.253683 ], [ 108.094739, 35.280069 ], [ 108.174811, 35.304981 ], [ 108.221622, 35.296678 ], [ 108.239484, 35.256127 ], [ 108.296767, 35.267855 ], [ 108.345426, 35.300586 ], [ 108.36144, 35.279581 ], [ 108.48894, 35.275184 ], [ 108.547454, 35.304981 ], [ 108.583178, 35.294724 ], [ 108.614591, 35.328909 ], [ 108.61028, 35.355271 ], [ 108.631222, 35.418698 ], [ 108.605968, 35.503028 ], [ 108.625678, 35.537124 ], [ 108.618287, 35.557088 ], [ 108.539447, 35.605761 ], [ 108.517889, 35.699615 ], [ 108.533903, 35.746257 ], [ 108.527744, 35.82442 ], [ 108.499411, 35.872444 ], [ 108.518505, 35.905414 ], [ 108.562852, 35.921409 ], [ 108.593649, 35.950967 ], [ 108.652164, 35.94806 ], [ 108.659555, 35.990683 ], [ 108.688504, 36.021183 ], [ 108.682345, 36.062316 ], [ 108.712526, 36.138716 ], [ 108.646004, 36.254143 ], [ 108.641693, 36.359279 ], [ 108.651548, 36.384818 ], [ 108.618903, 36.433946 ], [ 108.562852, 36.43876 ], [ 108.510498, 36.47438 ], [ 108.514809, 36.445501 ], [ 108.495099, 36.422389 ], [ 108.460606, 36.422871 ], [ 108.408252, 36.45946 ], [ 108.391621, 36.505654 ], [ 108.365136, 36.519603 ], [ 108.340498, 36.559032 ], [ 108.262274, 36.549417 ], [ 108.245644, 36.571048 ], [ 108.210535, 36.577296 ], [ 108.204992, 36.606607 ], [ 108.204992, 36.606607 ], [ 108.222854, 36.631105 ], [ 108.1976, 36.630144 ], [ 108.163724, 36.563839 ], [ 108.092891, 36.587388 ], [ 108.079956, 36.614294 ], [ 108.060862, 36.592194 ], [ 108.001732, 36.639269 ], [ 108.02329, 36.647912 ], [ 108.006659, 36.683435 ], [ 107.938906, 36.655594 ], [ 107.940754, 36.694953 ], [ 107.914268, 36.720861 ], [ 107.907493, 36.750118 ], [ 107.866841, 36.766899 ], [ 107.768291, 36.792783 ], [ 107.742421, 36.811951 ], [ 107.722095, 36.802367 ], [ 107.670356, 36.83303 ], [ 107.642023, 36.819137 ], [ 107.5909, 36.836382 ], [ 107.540393, 36.828718 ], [ 107.533618, 36.867031 ], [ 107.478183, 36.908196 ], [ 107.365466, 36.905324 ], [ 107.336517, 36.925899 ], [ 107.310032, 36.912502 ], [ 107.291554, 36.979463 ], [ 107.291554, 36.979463 ], [ 107.288474, 37.008143 ], [ 107.288474, 37.008143 ], [ 107.28601, 37.054963 ], [ 107.268764, 37.099367 ], [ 107.281083, 37.127047 ], [ 107.306952, 37.100799 ], [ 107.334669, 37.138975 ], [ 107.336517, 37.165687 ], [ 107.317423, 37.200017 ], [ 107.270612, 37.229089 ], [ 107.309416, 37.239095 ], [ 107.273075, 37.29101 ], [ 107.257677, 37.337179 ], [ 107.282931, 37.437036 ], [ 107.284162, 37.481691 ], [ 107.345756, 37.518725 ], [ 107.369162, 37.58752 ], [ 107.330358, 37.584201 ], [ 107.311264, 37.609806 ], [ 107.361155, 37.613125 ], [ 107.422133, 37.665254 ], [ 107.389488, 37.671413 ], [ 107.387024, 37.691305 ], [ 107.425828, 37.684201 ], [ 107.484959, 37.706458 ], [ 107.499125, 37.765619 ], [ 107.57119, 37.776499 ], [ 107.599523, 37.791162 ], [ 107.620465, 37.776026 ], [ 107.646335, 37.805349 ], [ 107.659269, 37.844112 ], [ 107.65003, 37.86443 ], [ 107.684523, 37.888522 ], [ 107.732566, 37.84931 ], [ 107.842819, 37.828987 ], [ 107.884703, 37.808186 ], [ 107.982022, 37.787378 ], [ 107.993109, 37.735335 ], [ 108.025753, 37.696041 ], [ 108.012819, 37.66857 ], [ 108.025137, 37.649619 ], [ 108.055318, 37.652462 ], [ 108.134159, 37.622131 ], [ 108.193905, 37.638246 ], [ 108.205608, 37.655779 ], [ 108.24626, 37.665728 ], [ 108.293071, 37.656726 ], [ 108.301078, 37.640616 ], [ 108.422418, 37.648672 ], [ 108.485244, 37.678044 ], [ 108.532671, 37.690832 ], [ 108.628142, 37.651988 ], [ 108.699591, 37.669518 ], [ 108.720533, 37.683728 ], [ 108.777815, 37.683728 ], [ 108.791982, 37.700303 ], [ 108.784591, 37.764673 ], [ 108.799989, 37.784068 ], [ 108.791982, 37.872934 ], [ 108.798141, 37.93385 ], [ 108.82709, 37.989056 ], [ 108.797525, 38.04799 ], [ 108.830786, 38.049875 ], [ 108.883141, 38.01405 ], [ 108.893612, 37.978207 ], [ 108.93488, 37.922521 ], [ 108.9743, 37.931962 ], [ 108.982923, 37.964053 ], [ 109.018648, 37.971602 ], [ 109.037742, 38.021593 ], [ 109.06977, 38.023008 ], [ 109.050676, 38.055059 ], [ 109.069155, 38.091336 ], [ 108.964445, 38.154894 ], [ 108.938575, 38.207582 ], [ 108.976148, 38.245192 ], [ 108.961981, 38.26493 ], [ 109.007561, 38.359316 ], [ 109.051292, 38.385122 ], [ 109.054372, 38.433892 ], [ 109.128901, 38.480288 ], [ 109.175712, 38.518694 ], [ 109.196654, 38.552867 ], [ 109.276726, 38.623035 ], [ 109.331545, 38.597783 ], [ 109.367269, 38.627711 ], [ 109.329081, 38.66043 ], [ 109.338936, 38.701542 ], [ 109.404226, 38.720689 ], [ 109.444262, 38.782763 ], [ 109.511399, 38.833595 ], [ 109.549587, 38.805618 ], [ 109.624116, 38.85457 ], [ 109.672159, 38.928167 ], [ 109.685094, 38.968195 ], [ 109.665384, 38.981687 ], [ 109.72513, 39.018429 ], [ 109.762086, 39.057476 ], [ 109.793499, 39.074204 ], [ 109.851397, 39.122971 ], [ 109.890818, 39.103932 ], [ 109.92223, 39.107183 ], [ 109.893897, 39.141075 ], [ 109.961035, 39.191651 ], [ 109.871723, 39.243581 ], [ 109.90252, 39.271848 ], [ 109.962267, 39.212056 ], [ 110.041107, 39.21623 ], [ 110.109476, 39.249606 ], [ 110.217881, 39.281113 ], [ 110.184005, 39.355192 ], [ 110.161831, 39.387115 ], [ 110.136577, 39.39174 ], [ 110.12549, 39.432891 ], [ 110.152592, 39.45415 ], [ 110.243751, 39.423645 ], [ 110.257917, 39.407001 ], [ 110.385417, 39.310291 ], [ 110.429764, 39.341308 ], [ 110.434692, 39.381101 ], [ 110.482735, 39.360745 ], [ 110.524003, 39.382952 ], [ 110.559728, 39.351027 ], [ 110.566503, 39.320014 ], [ 110.596684, 39.282966 ], [ 110.626249, 39.266751 ], [ 110.702626, 39.273701 ], [ 110.731575, 39.30705 ], [ 110.73835, 39.348713 ], [ 110.782698, 39.38804 ], [ 110.869545, 39.494341 ], [ 110.891103, 39.509118 ], [ 110.958856, 39.519275 ], [ 111.017371, 39.552045 ], [ 111.101138, 39.559428 ], [ 111.136863, 39.587106 ], [ 111.154725, 39.569116 ], [ 111.148566, 39.531277 ], [ 111.10545, 39.497573 ], [ 111.10545, 39.472631 ], [ 111.058639, 39.447681 ], [ 111.064182, 39.400989 ], [ 111.098059, 39.401914 ], [ 111.087588, 39.376013 ], [ 111.125776, 39.366297 ], [ 111.159037, 39.362596 ], [ 111.155341, 39.338531 ], [ 111.186138, 39.35149 ], [ 111.179363, 39.326959 ], [ 111.202152, 39.305197 ], [ 111.247732, 39.302419 ], [ 111.213239, 39.257021 ], [ 111.219399, 39.244044 ], [ 111.163348, 39.152678 ], [ 111.173819, 39.135041 ], [ 111.147334, 39.100681 ], [ 111.138095, 39.064447 ], [ 111.094363, 39.030053 ], [ 111.038313, 39.020289 ], [ 110.998276, 38.998433 ], [ 110.980414, 38.970056 ], [ 111.009979, 38.932823 ], [ 111.016755, 38.889981 ], [ 110.995813, 38.868084 ], [ 111.009363, 38.847579 ], [ 110.965016, 38.755699 ], [ 110.915125, 38.704345 ], [ 110.916357, 38.673981 ], [ 110.880632, 38.626776 ], [ 110.898494, 38.587024 ], [ 110.920052, 38.581878 ], [ 110.907733, 38.521035 ], [ 110.870777, 38.510265 ], [ 110.874473, 38.453579 ], [ 110.840596, 38.439986 ], [ 110.796864, 38.453579 ], [ 110.77777, 38.440924 ], [ 110.746973, 38.366355 ], [ 110.701394, 38.353215 ], [ 110.661358, 38.308617 ], [ 110.601612, 38.308147 ], [ 110.57759, 38.297345 ], [ 110.565887, 38.215105 ], [ 110.528315, 38.211814 ], [ 110.509221, 38.192061 ], [ 110.519692, 38.130889 ], [ 110.501829, 38.097929 ], [ 110.507989, 38.013107 ], [ 110.528315, 37.990471 ], [ 110.522771, 37.955088 ], [ 110.59422, 37.922049 ], [ 110.680452, 37.790216 ], [ 110.735886, 37.77035 ], [ 110.750669, 37.736281 ], [ 110.716792, 37.728708 ], [ 110.706321, 37.705511 ], [ 110.775306, 37.680886 ], [ 110.793169, 37.650567 ], [ 110.763604, 37.639668 ], [ 110.771611, 37.594634 ], [ 110.795017, 37.558586 ], [ 110.770995, 37.538184 ], [ 110.759292, 37.474567 ], [ 110.740198, 37.44939 ], [ 110.644111, 37.435135 ], [ 110.630561, 37.372858 ], [ 110.641648, 37.360015 ], [ 110.695234, 37.34955 ], [ 110.678604, 37.317668 ], [ 110.690307, 37.287201 ], [ 110.660126, 37.281011 ], [ 110.651503, 37.256722 ], [ 110.590525, 37.187145 ], [ 110.53509, 37.138021 ], [ 110.535706, 37.115118 ], [ 110.49567, 37.086956 ], [ 110.460561, 37.044932 ], [ 110.417446, 37.027257 ], [ 110.426685, 37.008621 ], [ 110.382953, 37.022001 ], [ 110.381721, 37.002408 ], [ 110.424221, 36.963685 ], [ 110.408823, 36.892403 ], [ 110.376178, 36.882351 ], [ 110.424221, 36.855539 ], [ 110.406975, 36.824886 ], [ 110.423605, 36.818179 ], [ 110.407591, 36.776007 ], [ 110.447011, 36.737649 ], [ 110.438388, 36.685835 ], [ 110.402663, 36.697352 ], [ 110.394656, 36.676716 ], [ 110.426685, 36.657514 ], [ 110.447627, 36.621018 ], [ 110.496902, 36.582102 ], [ 110.488895, 36.556628 ], [ 110.503677, 36.488335 ], [ 110.47288, 36.453203 ], [ 110.489511, 36.430094 ], [ 110.487047, 36.393972 ], [ 110.459946, 36.327946 ], [ 110.474112, 36.306729 ], [ 110.474112, 36.248352 ], [ 110.45625, 36.22663 ], [ 110.447011, 36.164328 ], [ 110.467953, 36.074893 ], [ 110.491974, 36.034735 ], [ 110.49259, 35.994073 ], [ 110.516612, 35.971796 ], [ 110.502445, 35.947575 ], [ 110.516612, 35.918501 ], [ 110.511684, 35.879718 ], [ 110.549257, 35.877778 ], [ 110.550489, 35.838005 ], [ 110.571431, 35.800639 ], [ 110.57759, 35.701559 ], [ 110.609619, 35.632031 ], [ 110.567735, 35.539559 ], [ 110.531394, 35.511309 ], [ 110.477808, 35.413821 ], [ 110.45009, 35.327933 ], [ 110.374946, 35.251728 ], [ 110.369402, 35.158329 ], [ 110.325671, 35.014844 ], [ 110.272084, 34.942761 ], [ 110.257301, 34.934912 ], [ 110.259149, 34.884853 ], [ 110.233896, 34.83722 ], [ 110.232664, 34.80332 ], [ 110.259149, 34.737937 ], [ 110.231432, 34.701044 ], [ 110.23636, 34.670533 ], [ 110.29549, 34.610956 ], [ 110.379257, 34.600612 ], [ 110.366939, 34.566614 ], [ 110.404511, 34.557743 ], [ 110.372482, 34.544435 ], [ 110.360779, 34.516825 ], [ 110.403279, 34.433448 ], [ 110.403279, 34.433448 ], [ 110.473496, 34.393457 ], [ 110.503677, 34.33714 ], [ 110.451938, 34.292653 ], [ 110.428533, 34.288203 ], [ 110.43962, 34.243196 ], [ 110.507989, 34.217466 ], [ 110.55172, 34.213012 ], [ 110.55788, 34.193214 ], [ 110.621938, 34.177372 ], [ 110.642264, 34.161032 ], [ 110.61393, 34.113478 ], [ 110.591757, 34.101586 ], [ 110.587445, 34.023252 ], [ 110.620706, 34.035652 ], [ 110.671213, 33.966192 ], [ 110.665669, 33.937895 ], [ 110.627481, 33.925482 ], [ 110.628713, 33.910086 ], [ 110.587445, 33.887733 ], [ 110.612083, 33.852453 ], [ 110.66259, 33.85295 ], [ 110.712481, 33.833564 ], [ 110.74143, 33.798759 ], [ 110.782082, 33.796272 ], [ 110.81719, 33.751003 ], [ 110.831973, 33.713675 ], [ 110.823966, 33.685793 ], [ 110.878784, 33.634486 ], [ 110.966864, 33.609071 ], [ 111.00382, 33.578662 ], [ 111.002588, 33.535772 ], [ 111.02661, 33.478386 ], [ 111.021682, 33.476389 ], [ 111.021066, 33.471397 ], [ 111.02661, 33.467903 ], [ 110.996429, 33.435946 ], [ 111.025994, 33.375495 ], [ 111.025994, 33.330504 ], [ 110.984726, 33.255469 ], [ 110.960704, 33.253967 ], [ 110.9219, 33.203907 ], [ 110.865234, 33.213921 ], [ 110.828893, 33.201403 ], [ 110.824582, 33.158327 ], [ 110.753133, 33.15031 ], [ 110.702626, 33.097182 ], [ 110.650887, 33.157324 ], [ 110.623785, 33.143796 ], [ 110.59422, 33.168346 ], [ 110.57759, 33.250464 ], [ 110.54125, 33.255469 ], [ 110.471032, 33.171352 ], [ 110.398352, 33.176862 ] ] ], [ [ [ 111.02661, 33.478386 ], [ 111.02661, 33.467903 ], [ 111.021066, 33.471397 ], [ 111.021682, 33.476389 ], [ 111.02661, 33.478386 ] ] ], [ [ [ 106.076921, 32.76365 ], [ 106.076305, 32.759121 ], [ 106.071378, 32.758114 ], [ 106.07261, 32.76365 ], [ 106.076921, 32.76365 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"620000\", \"name\": \"甘肃省\", \"center\": [ 103.823557, 36.058039 ], \"childrenNum\": 14, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 27, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 106.506231, 35.737514 ], [ 106.566593, 35.738971 ], [ 106.595542, 35.727312 ], [ 106.620796, 35.743829 ], [ 106.633115, 35.714679 ], [ 106.66268, 35.70739 ], [ 106.674998, 35.728284 ], [ 106.750759, 35.689408 ], [ 106.750759, 35.725369 ], [ 106.806193, 35.70982 ], [ 106.819128, 35.7448 ], [ 106.867171, 35.738485 ], [ 106.868403, 35.771996 ], [ 106.897353, 35.759856 ], [ 106.927534, 35.810346 ], [ 106.849925, 35.887476 ], [ 106.912751, 35.93207 ], [ 106.940468, 35.931101 ], [ 106.93862, 35.952905 ], [ 106.90228, 35.943699 ], [ 106.94786, 35.988262 ], [ 106.928149, 36.011502 ], [ 106.940468, 36.064734 ], [ 106.957715, 36.091337 ], [ 106.925686, 36.115997 ], [ 106.930613, 36.138716 ], [ 106.873947, 36.178338 ], [ 106.873947, 36.178338 ], [ 106.858548, 36.206834 ], [ 106.858548, 36.206834 ], [ 106.833295, 36.229044 ], [ 106.808657, 36.21118 ], [ 106.772933, 36.212628 ], [ 106.735976, 36.23725 ], [ 106.698404, 36.244008 ], [ 106.685469, 36.273445 ], [ 106.647897, 36.259451 ], [ 106.559202, 36.292259 ], [ 106.54134, 36.25366 ], [ 106.504383, 36.266207 ], [ 106.470507, 36.306246 ], [ 106.497608, 36.31348 ], [ 106.510543, 36.379037 ], [ 106.492064, 36.422389 ], [ 106.523477, 36.468605 ], [ 106.494528, 36.494589 ], [ 106.455724, 36.496995 ], [ 106.39721, 36.548455 ], [ 106.37134, 36.549417 ], [ 106.363949, 36.577296 ], [ 106.392282, 36.556628 ], [ 106.397826, 36.576816 ], [ 106.444637, 36.557109 ], [ 106.465579, 36.583063 ], [ 106.444637, 36.624861 ], [ 106.491448, 36.628703 ], [ 106.490833, 36.685835 ], [ 106.530869, 36.690154 ], [ 106.519782, 36.708868 ], [ 106.519782, 36.708868 ], [ 106.514238, 36.715584 ], [ 106.59431, 36.750118 ], [ 106.644817, 36.72278 ], [ 106.627571, 36.752995 ], [ 106.657752, 36.820575 ], [ 106.637426, 36.867031 ], [ 106.637426, 36.867031 ], [ 106.626955, 36.892403 ], [ 106.609709, 36.878521 ], [ 106.609709, 36.878521 ], [ 106.601702, 36.918244 ], [ 106.549347, 36.941685 ], [ 106.540108, 36.984244 ], [ 106.595542, 36.94025 ], [ 106.594926, 36.967988 ], [ 106.64297, 36.962729 ], [ 106.646665, 37.000496 ], [ 106.666991, 37.016745 ], [ 106.645433, 37.064992 ], [ 106.605397, 37.127524 ], [ 106.6171, 37.135158 ], [ 106.673151, 37.1113 ], [ 106.687933, 37.12991 ], [ 106.728585, 37.121321 ], [ 106.750143, 37.09889 ], [ 106.772933, 37.120367 ], [ 106.776012, 37.158056 ], [ 106.818512, 37.141838 ], [ 106.891193, 37.098413 ], [ 106.912135, 37.110345 ], [ 106.905976, 37.151378 ], [ 106.998367, 37.106527 ], [ 107.031011, 37.108436 ], [ 107.030395, 37.140883 ], [ 107.095685, 37.115595 ], [ 107.133873, 37.134681 ], [ 107.181916, 37.143269 ], [ 107.234887, 37.096503 ], [ 107.268764, 37.099367 ], [ 107.28601, 37.054963 ], [ 107.288474, 37.008143 ], [ 107.288474, 37.008143 ], [ 107.291554, 36.979463 ], [ 107.291554, 36.979463 ], [ 107.310032, 36.912502 ], [ 107.336517, 36.925899 ], [ 107.365466, 36.905324 ], [ 107.478183, 36.908196 ], [ 107.533618, 36.867031 ], [ 107.540393, 36.828718 ], [ 107.5909, 36.836382 ], [ 107.642023, 36.819137 ], [ 107.670356, 36.83303 ], [ 107.722095, 36.802367 ], [ 107.742421, 36.811951 ], [ 107.768291, 36.792783 ], [ 107.866841, 36.766899 ], [ 107.907493, 36.750118 ], [ 107.914268, 36.720861 ], [ 107.940754, 36.694953 ], [ 107.938906, 36.655594 ], [ 108.006659, 36.683435 ], [ 108.02329, 36.647912 ], [ 108.001732, 36.639269 ], [ 108.060862, 36.592194 ], [ 108.079956, 36.614294 ], [ 108.092891, 36.587388 ], [ 108.163724, 36.563839 ], [ 108.1976, 36.630144 ], [ 108.222854, 36.631105 ], [ 108.204992, 36.606607 ], [ 108.204992, 36.606607 ], [ 108.210535, 36.577296 ], [ 108.245644, 36.571048 ], [ 108.262274, 36.549417 ], [ 108.340498, 36.559032 ], [ 108.365136, 36.519603 ], [ 108.391621, 36.505654 ], [ 108.408252, 36.45946 ], [ 108.460606, 36.422871 ], [ 108.495099, 36.422389 ], [ 108.514809, 36.445501 ], [ 108.510498, 36.47438 ], [ 108.562852, 36.43876 ], [ 108.618903, 36.433946 ], [ 108.651548, 36.384818 ], [ 108.641693, 36.359279 ], [ 108.646004, 36.254143 ], [ 108.712526, 36.138716 ], [ 108.682345, 36.062316 ], [ 108.688504, 36.021183 ], [ 108.659555, 35.990683 ], [ 108.652164, 35.94806 ], [ 108.593649, 35.950967 ], [ 108.562852, 35.921409 ], [ 108.518505, 35.905414 ], [ 108.499411, 35.872444 ], [ 108.527744, 35.82442 ], [ 108.533903, 35.746257 ], [ 108.517889, 35.699615 ], [ 108.539447, 35.605761 ], [ 108.618287, 35.557088 ], [ 108.625678, 35.537124 ], [ 108.605968, 35.503028 ], [ 108.631222, 35.418698 ], [ 108.61028, 35.355271 ], [ 108.614591, 35.328909 ], [ 108.583178, 35.294724 ], [ 108.547454, 35.304981 ], [ 108.48894, 35.275184 ], [ 108.36144, 35.279581 ], [ 108.345426, 35.300586 ], [ 108.296767, 35.267855 ], [ 108.239484, 35.256127 ], [ 108.221622, 35.296678 ], [ 108.174811, 35.304981 ], [ 108.094739, 35.280069 ], [ 108.049159, 35.253683 ], [ 107.949993, 35.245375 ], [ 107.960464, 35.263457 ], [ 107.867457, 35.256127 ], [ 107.841587, 35.276649 ], [ 107.745501, 35.311819 ], [ 107.737494, 35.267366 ], [ 107.667277, 35.257104 ], [ 107.652494, 35.244886 ], [ 107.686371, 35.218 ], [ 107.715936, 35.168114 ], [ 107.727639, 35.120157 ], [ 107.769523, 35.064333 ], [ 107.769523, 35.064333 ], [ 107.773218, 35.060904 ], [ 107.773218, 35.060904 ], [ 107.814486, 35.024646 ], [ 107.846515, 35.024646 ], [ 107.863145, 34.999158 ], [ 107.842203, 34.979056 ], [ 107.741805, 34.953553 ], [ 107.675284, 34.9511 ], [ 107.638943, 34.935402 ], [ 107.619849, 34.964834 ], [ 107.564415, 34.968757 ], [ 107.523763, 34.909886 ], [ 107.455394, 34.916757 ], [ 107.400575, 34.932949 ], [ 107.369162, 34.917738 ], [ 107.350068, 34.93393 ], [ 107.286626, 34.931968 ], [ 107.252749, 34.880925 ], [ 107.189308, 34.893198 ], [ 107.162206, 34.944233 ], [ 107.119707, 34.950119 ], [ 107.089526, 34.976604 ], [ 107.08275, 35.024156 ], [ 107.012533, 35.029547 ], [ 106.990975, 35.068252 ], [ 106.950323, 35.066782 ], [ 106.901664, 35.094698 ], [ 106.838222, 35.080007 ], [ 106.710723, 35.100574 ], [ 106.706411, 35.081966 ], [ 106.615252, 35.071191 ], [ 106.577064, 35.089312 ], [ 106.541956, 35.083925 ], [ 106.52163, 35.027587 ], [ 106.494528, 35.006021 ], [ 106.494528, 35.006021 ], [ 106.484673, 34.983959 ], [ 106.493296, 34.941289 ], [ 106.527789, 34.876507 ], [ 106.556122, 34.861285 ], [ 106.550579, 34.82936 ], [ 106.575216, 34.769897 ], [ 106.539492, 34.745805 ], [ 106.505615, 34.746789 ], [ 106.487137, 34.715311 ], [ 106.456956, 34.703996 ], [ 106.442173, 34.675455 ], [ 106.471122, 34.634102 ], [ 106.419384, 34.643458 ], [ 106.314058, 34.578934 ], [ 106.341159, 34.568093 ], [ 106.334384, 34.517811 ], [ 106.455108, 34.531617 ], [ 106.514238, 34.511894 ], [ 106.513622, 34.498085 ], [ 106.558586, 34.48822 ], [ 106.610941, 34.454177 ], [ 106.638042, 34.391481 ], [ 106.717498, 34.369255 ], [ 106.691013, 34.337635 ], [ 106.705179, 34.299575 ], [ 106.68239, 34.256057 ], [ 106.652825, 34.24369 ], [ 106.63373, 34.260014 ], [ 106.589383, 34.253584 ], [ 106.577064, 34.280786 ], [ 106.526557, 34.292159 ], [ 106.496376, 34.238248 ], [ 106.5321, 34.254079 ], [ 106.55797, 34.229837 ], [ 106.585071, 34.149641 ], [ 106.560434, 34.109514 ], [ 106.501919, 34.105055 ], [ 106.505615, 34.056479 ], [ 106.471738, 34.024244 ], [ 106.474202, 33.970659 ], [ 106.41076, 33.909093 ], [ 106.428007, 33.866368 ], [ 106.475434, 33.875809 ], [ 106.491448, 33.834559 ], [ 106.461883, 33.789807 ], [ 106.488369, 33.757969 ], [ 106.482825, 33.707203 ], [ 106.534564, 33.695254 ], [ 106.575832, 33.631497 ], [ 106.58076, 33.576169 ], [ 106.540108, 33.512822 ], [ 106.456956, 33.532779 ], [ 106.447101, 33.613058 ], [ 106.384891, 33.612061 ], [ 106.35163, 33.587137 ], [ 106.303587, 33.604585 ], [ 106.237681, 33.564201 ], [ 106.187174, 33.546746 ], [ 106.108334, 33.569686 ], [ 106.117573, 33.602591 ], [ 106.086776, 33.617045 ], [ 106.047356, 33.610067 ], [ 105.971596, 33.613058 ], [ 105.940183, 33.570684 ], [ 105.902611, 33.556222 ], [ 105.871198, 33.511325 ], [ 105.842248, 33.489866 ], [ 105.831162, 33.451926 ], [ 105.837937, 33.410971 ], [ 105.827466, 33.379993 ], [ 105.709822, 33.382991 ], [ 105.755401, 33.329004 ], [ 105.752937, 33.291994 ], [ 105.791741, 33.278486 ], [ 105.799133, 33.258471 ], [ 105.862574, 33.234447 ], [ 105.917393, 33.237951 ], [ 105.965436, 33.204407 ], [ 105.968516, 33.154318 ], [ 105.93156, 33.178365 ], [ 105.897067, 33.146803 ], [ 105.923552, 33.147805 ], [ 105.934639, 33.112221 ], [ 105.914929, 33.066092 ], [ 105.926632, 33.042517 ], [ 105.917393, 32.993841 ], [ 105.861959, 32.939112 ], [ 105.82685, 32.950663 ], [ 105.735691, 32.905454 ], [ 105.656851, 32.895405 ], [ 105.638373, 32.879323 ], [ 105.590329, 32.87681 ], [ 105.565692, 32.906962 ], [ 105.528119, 32.919019 ], [ 105.49917, 32.911986 ], [ 105.467757, 32.930071 ], [ 105.414171, 32.922034 ], [ 105.408011, 32.885857 ], [ 105.38091, 32.876307 ], [ 105.396308, 32.85067 ], [ 105.396308, 32.85067 ], [ 105.427721, 32.784281 ], [ 105.454207, 32.767173 ], [ 105.448663, 32.732946 ], [ 105.368591, 32.712807 ], [ 105.347033, 32.68259 ], [ 105.297758, 32.656897 ], [ 105.263265, 32.652362 ], [ 105.219534, 32.666469 ], [ 105.215222, 32.63674 ], [ 105.185041, 32.617587 ], [ 105.111128, 32.593893 ], [ 105.0791, 32.637244 ], [ 105.026745, 32.650346 ], [ 104.925115, 32.607505 ], [ 104.881999, 32.600951 ], [ 104.845659, 32.653873 ], [ 104.820405, 32.662943 ], [ 104.795768, 32.643292 ], [ 104.739717, 32.635228 ], [ 104.696601, 32.673522 ], [ 104.643015, 32.661935 ], [ 104.592508, 32.695685 ], [ 104.582653, 32.722374 ], [ 104.526602, 32.728416 ], [ 104.51182, 32.753585 ], [ 104.458849, 32.748551 ], [ 104.363994, 32.822511 ], [ 104.294393, 32.835586 ], [ 104.277147, 32.90244 ], [ 104.288234, 32.942628 ], [ 104.345516, 32.940117 ], [ 104.378161, 32.953174 ], [ 104.383704, 32.994343 ], [ 104.426204, 33.010906 ], [ 104.391711, 33.035493 ], [ 104.337509, 33.038002 ], [ 104.378161, 33.109214 ], [ 104.351059, 33.158828 ], [ 104.32827, 33.223934 ], [ 104.323958, 33.26898 ], [ 104.303632, 33.304499 ], [ 104.333813, 33.315502 ], [ 104.386168, 33.298497 ], [ 104.420045, 33.327004 ], [ 104.373849, 33.345004 ], [ 104.292545, 33.336505 ], [ 104.272219, 33.391486 ], [ 104.22048, 33.404477 ], [ 104.213089, 33.446932 ], [ 104.180444, 33.472895 ], [ 104.155191, 33.542755 ], [ 104.176749, 33.5996 ], [ 104.103452, 33.663381 ], [ 104.046169, 33.686291 ], [ 103.980264, 33.670852 ], [ 103.861388, 33.682307 ], [ 103.778236, 33.658898 ], [ 103.690772, 33.69376 ], [ 103.667983, 33.685793 ], [ 103.645809, 33.708697 ], [ 103.593454, 33.716164 ], [ 103.563889, 33.699735 ], [ 103.552186, 33.671351 ], [ 103.520157, 33.678323 ], [ 103.545411, 33.719649 ], [ 103.518309, 33.807213 ], [ 103.464723, 33.80224 ], [ 103.434542, 33.752993 ], [ 103.35447, 33.743539 ], [ 103.278709, 33.774387 ], [ 103.284868, 33.80224 ], [ 103.24976, 33.814175 ], [ 103.228202, 33.79478 ], [ 103.165376, 33.805721 ], [ 103.153673, 33.819147 ], [ 103.181391, 33.900649 ], [ 103.16476, 33.929454 ], [ 103.1315, 33.931937 ], [ 103.120413, 33.953286 ], [ 103.157369, 33.998944 ], [ 103.147514, 34.036644 ], [ 103.119797, 34.03466 ], [ 103.129652, 34.065899 ], [ 103.178927, 34.079779 ], [ 103.121644, 34.112487 ], [ 103.124108, 34.162022 ], [ 103.100087, 34.181828 ], [ 103.052043, 34.195194 ], [ 103.005848, 34.184798 ], [ 102.973203, 34.205588 ], [ 102.977515, 34.252595 ], [ 102.949181, 34.292159 ], [ 102.911609, 34.312923 ], [ 102.85987, 34.301058 ], [ 102.856791, 34.270895 ], [ 102.798276, 34.272874 ], [ 102.779798, 34.236764 ], [ 102.728675, 34.235774 ], [ 102.694799, 34.198659 ], [ 102.664002, 34.192719 ], [ 102.651067, 34.165983 ], [ 102.598712, 34.14766 ], [ 102.655994, 34.113478 ], [ 102.649219, 34.080275 ], [ 102.615958, 34.099604 ], [ 102.511865, 34.086222 ], [ 102.471213, 34.072839 ], [ 102.437336, 34.087214 ], [ 102.406539, 34.033172 ], [ 102.392372, 33.971651 ], [ 102.345561, 33.969666 ], [ 102.315996, 33.993983 ], [ 102.287047, 33.977607 ], [ 102.248858, 33.98654 ], [ 102.226069, 33.963214 ], [ 102.16817, 33.983066 ], [ 102.136142, 33.965199 ], [ 102.25317, 33.861399 ], [ 102.261177, 33.821136 ], [ 102.243315, 33.786823 ], [ 102.296286, 33.783838 ], [ 102.324619, 33.754486 ], [ 102.284583, 33.719151 ], [ 102.342481, 33.725622 ], [ 102.31538, 33.665374 ], [ 102.346793, 33.605582 ], [ 102.440416, 33.574673 ], [ 102.477988, 33.543254 ], [ 102.446575, 33.53228 ], [ 102.461358, 33.501345 ], [ 102.462589, 33.449429 ], [ 102.447807, 33.454922 ], [ 102.392988, 33.404477 ], [ 102.368967, 33.41247 ], [ 102.310452, 33.397982 ], [ 102.296286, 33.413969 ], [ 102.258098, 33.409472 ], [ 102.218062, 33.349503 ], [ 102.192192, 33.337005 ], [ 102.217446, 33.247961 ], [ 102.200815, 33.223434 ], [ 102.160163, 33.242956 ], [ 102.144765, 33.273983 ], [ 102.117047, 33.288492 ], [ 102.08933, 33.227439 ], [ 102.08933, 33.204908 ], [ 102.054838, 33.189884 ], [ 101.99386, 33.1999 ], [ 101.935345, 33.186879 ], [ 101.921795, 33.153817 ], [ 101.887302, 33.135778 ], [ 101.865744, 33.103198 ], [ 101.825708, 33.119239 ], [ 101.841723, 33.184876 ], [ 101.83002, 33.213921 ], [ 101.770274, 33.248962 ], [ 101.769658, 33.26898 ], [ 101.877447, 33.314502 ], [ 101.887302, 33.383991 ], [ 101.915635, 33.425957 ], [ 101.946432, 33.442937 ], [ 101.906396, 33.48188 ], [ 101.907012, 33.539264 ], [ 101.884222, 33.578163 ], [ 101.844186, 33.602591 ], [ 101.831252, 33.554726 ], [ 101.783208, 33.556721 ], [ 101.769042, 33.538765 ], [ 101.748716, 33.505337 ], [ 101.718535, 33.494857 ], [ 101.622448, 33.502343 ], [ 101.611977, 33.565199 ], [ 101.616905, 33.598603 ], [ 101.585492, 33.645448 ], [ 101.58426, 33.674339 ], [ 101.501724, 33.702723 ], [ 101.428427, 33.680315 ], [ 101.424732, 33.655411 ], [ 101.385312, 33.644949 ], [ 101.302776, 33.657902 ], [ 101.23687, 33.685793 ], [ 101.217776, 33.669856 ], [ 101.166653, 33.659894 ], [ 101.177124, 33.685295 ], [ 101.162957, 33.719649 ], [ 101.186363, 33.741051 ], [ 101.190675, 33.791796 ], [ 101.153102, 33.823124 ], [ 101.153718, 33.8445 ], [ 101.054552, 33.863386 ], [ 101.023139, 33.896178 ], [ 100.994806, 33.891707 ], [ 100.965857, 33.946832 ], [ 100.927669, 33.975126 ], [ 100.93506, 33.990013 ], [ 100.880857, 34.036644 ], [ 100.870386, 34.083744 ], [ 100.848828, 34.089692 ], [ 100.806329, 34.155584 ], [ 100.764445, 34.178857 ], [ 100.809408, 34.247153 ], [ 100.798321, 34.260014 ], [ 100.821727, 34.317371 ], [ 100.868538, 34.332693 ], [ 100.895024, 34.375183 ], [ 100.951074, 34.38358 ], [ 100.986799, 34.374689 ], [ 101.054552, 34.322808 ], [ 101.098284, 34.329233 ], [ 101.178356, 34.320831 ], [ 101.193754, 34.336646 ], [ 101.235022, 34.325279 ], [ 101.228863, 34.298586 ], [ 101.268899, 34.278808 ], [ 101.325565, 34.268423 ], [ 101.327413, 34.24468 ], [ 101.369913, 34.248143 ], [ 101.417956, 34.227858 ], [ 101.482014, 34.218951 ], [ 101.492485, 34.195689 ], [ 101.53868, 34.212022 ], [ 101.6206, 34.178857 ], [ 101.674187, 34.110506 ], [ 101.703136, 34.119424 ], [ 101.718535, 34.083249 ], [ 101.736397, 34.080275 ], [ 101.764114, 34.122892 ], [ 101.788136, 34.131809 ], [ 101.836795, 34.124378 ], [ 101.851578, 34.153108 ], [ 101.874367, 34.130323 ], [ 101.897773, 34.133791 ], [ 101.955055, 34.109514 ], [ 101.965526, 34.167469 ], [ 102.003099, 34.162022 ], [ 102.030816, 34.190739 ], [ 102.01357, 34.218456 ], [ 102.062229, 34.227858 ], [ 102.067772, 34.293642 ], [ 102.149692, 34.271885 ], [ 102.186649, 34.352952 ], [ 102.237156, 34.34307 ], [ 102.237156, 34.34307 ], [ 102.259329, 34.355917 ], [ 102.205743, 34.407777 ], [ 102.169402, 34.457631 ], [ 102.155852, 34.507456 ], [ 102.139837, 34.50351 ], [ 102.093026, 34.536547 ], [ 102.001867, 34.538519 ], [ 101.97415, 34.548871 ], [ 101.956287, 34.582876 ], [ 101.934729, 34.58731 ], [ 101.919947, 34.621791 ], [ 101.917483, 34.705964 ], [ 101.923027, 34.835746 ], [ 101.916867, 34.873561 ], [ 101.985852, 34.90007 ], [ 102.068388, 34.887798 ], [ 102.048062, 34.910868 ], [ 102.094874, 34.986901 ], [ 102.133678, 35.014844 ], [ 102.157699, 35.010923 ], [ 102.176178, 35.032977 ], [ 102.211286, 35.034937 ], [ 102.218062, 35.057475 ], [ 102.252554, 35.048657 ], [ 102.29567, 35.071681 ], [ 102.310452, 35.128967 ], [ 102.346793, 35.164201 ], [ 102.404075, 35.179366 ], [ 102.365887, 35.235599 ], [ 102.370199, 35.263946 ], [ 102.3123, 35.282512 ], [ 102.280887, 35.303028 ], [ 102.311684, 35.31426 ], [ 102.317844, 35.343067 ], [ 102.287663, 35.36552 ], [ 102.293822, 35.424063 ], [ 102.314764, 35.434303 ], [ 102.408387, 35.409431 ], [ 102.447807, 35.437229 ], [ 102.437952, 35.455268 ], [ 102.49893, 35.545403 ], [ 102.503241, 35.585322 ], [ 102.531575, 35.580455 ], [ 102.570995, 35.548324 ], [ 102.695414, 35.528358 ], [ 102.743458, 35.494745 ], [ 102.782878, 35.527871 ], [ 102.729291, 35.523487 ], [ 102.746537, 35.545403 ], [ 102.808747, 35.560496 ], [ 102.763168, 35.612086 ], [ 102.7644, 35.653431 ], [ 102.744074, 35.657807 ], [ 102.707733, 35.70496 ], [ 102.686175, 35.771996 ], [ 102.715125, 35.815685 ], [ 102.739146, 35.821023 ], [ 102.787189, 35.862745 ], [ 102.81737, 35.850133 ], [ 102.914073, 35.845282 ], [ 102.94487, 35.829757 ], [ 102.954725, 35.858864 ], [ 102.942406, 35.92674 ], [ 102.971971, 35.995525 ], [ 102.951645, 36.021667 ], [ 102.968276, 36.044414 ], [ 102.932551, 36.048285 ], [ 102.882044, 36.082632 ], [ 102.941174, 36.104877 ], [ 102.948566, 36.150798 ], [ 102.965812, 36.151765 ], [ 102.986754, 36.193312 ], [ 103.048964, 36.199107 ], [ 103.066826, 36.216974 ], [ 103.021246, 36.232906 ], [ 103.024942, 36.256556 ], [ 102.922696, 36.298047 ], [ 102.896827, 36.331803 ], [ 102.845704, 36.331803 ], [ 102.836465, 36.344819 ], [ 102.838928, 36.345783 ], [ 102.831537, 36.365544 ], [ 102.829689, 36.365544 ], [ 102.771791, 36.47438 ], [ 102.793349, 36.497957 ], [ 102.753313, 36.525855 ], [ 102.734219, 36.562396 ], [ 102.761936, 36.568645 ], [ 102.714509, 36.599401 ], [ 102.724364, 36.613813 ], [ 102.684328, 36.619097 ], [ 102.630741, 36.650793 ], [ 102.601176, 36.710307 ], [ 102.612879, 36.738129 ], [ 102.639364, 36.732853 ], [ 102.692335, 36.775528 ], [ 102.720052, 36.767858 ], [ 102.639364, 36.852666 ], [ 102.587009, 36.869904 ], [ 102.56114, 36.91968 ], [ 102.526031, 36.928291 ], [ 102.499546, 36.954599 ], [ 102.450271, 36.968467 ], [ 102.506321, 37.019134 ], [ 102.488459, 37.078362 ], [ 102.583314, 37.104618 ], [ 102.642444, 37.099845 ], [ 102.599944, 37.174748 ], [ 102.578386, 37.17284 ], [ 102.533422, 37.217176 ], [ 102.490307, 37.223371 ], [ 102.457662, 37.248147 ], [ 102.45335, 37.271487 ], [ 102.419474, 37.294343 ], [ 102.428097, 37.308624 ], [ 102.368351, 37.327662 ], [ 102.29875, 37.370004 ], [ 102.299981, 37.391404 ], [ 102.19712, 37.420403 ], [ 102.176794, 37.458892 ], [ 102.125055, 37.48549 ], [ 102.103497, 37.482641 ], [ 102.131214, 37.54625 ], [ 102.102265, 37.582304 ], [ 102.035128, 37.627819 ], [ 102.048678, 37.651515 ], [ 102.036359, 37.685149 ], [ 101.998787, 37.724921 ], [ 101.946432, 37.728235 ], [ 101.873135, 37.686569 ], [ 101.854657, 37.664781 ], [ 101.815853, 37.654357 ], [ 101.791832, 37.696041 ], [ 101.659405, 37.733441 ], [ 101.670491, 37.754264 ], [ 101.598427, 37.827569 ], [ 101.551615, 37.835604 ], [ 101.459224, 37.86632 ], [ 101.382848, 37.822369 ], [ 101.362522, 37.791162 ], [ 101.276906, 37.83655 ], [ 101.202994, 37.84742 ], [ 101.159262, 37.86821 ], [ 101.152486, 37.891356 ], [ 101.114298, 37.92016 ], [ 101.103211, 37.946593 ], [ 101.077342, 37.941874 ], [ 100.964009, 38.011221 ], [ 100.91843, 37.999432 ], [ 100.895024, 38.013107 ], [ 100.888864, 38.056001 ], [ 100.922125, 38.084741 ], [ 100.91843, 38.129006 ], [ 100.93814, 38.16007 ], [ 100.913502, 38.17889 ], [ 100.860531, 38.148305 ], [ 100.825423, 38.158658 ], [ 100.752126, 38.238612 ], [ 100.71517, 38.253652 ], [ 100.619083, 38.26587 ], [ 100.595061, 38.242372 ], [ 100.545786, 38.247072 ], [ 100.516837, 38.272448 ], [ 100.474953, 38.288891 ], [ 100.459555, 38.2654 ], [ 100.432453, 38.275267 ], [ 100.424446, 38.307208 ], [ 100.396729, 38.293118 ], [ 100.318505, 38.329276 ], [ 100.331439, 38.337257 ], [ 100.301874, 38.388405 ], [ 100.259374, 38.366355 ], [ 100.24028, 38.441861 ], [ 100.163288, 38.461546 ], [ 100.113397, 38.497151 ], [ 100.086911, 38.492936 ], [ 100.064122, 38.518694 ], [ 100.025933, 38.507923 ], [ 100.001296, 38.467169 ], [ 100.022238, 38.432017 ], [ 100.093071, 38.407166 ], [ 100.136803, 38.33444 ], [ 100.163904, 38.328337 ], [ 100.159592, 38.291239 ], [ 100.182998, 38.222158 ], [ 100.126332, 38.231561 ], [ 100.117093, 38.253652 ], [ 100.071513, 38.284663 ], [ 100.049955, 38.283254 ], [ 100.001912, 38.315191 ], [ 99.960028, 38.320825 ], [ 99.826985, 38.370109 ], [ 99.758, 38.410449 ], [ 99.727203, 38.415607 ], [ 99.65945, 38.449361 ], [ 99.63974, 38.474666 ], [ 99.585537, 38.498556 ], [ 99.52887, 38.546314 ], [ 99.501769, 38.612281 ], [ 99.450646, 38.60433 ], [ 99.412458, 38.665571 ], [ 99.375502, 38.684727 ], [ 99.361951, 38.718354 ], [ 99.291118, 38.765966 ], [ 99.222133, 38.788827 ], [ 99.141445, 38.852706 ], [ 99.068764, 38.896968 ], [ 99.071843, 38.921184 ], [ 99.107568, 38.951907 ], [ 99.054597, 38.97657 ], [ 98.951735, 38.987735 ], [ 98.903076, 39.012384 ], [ 98.886446, 39.040744 ], [ 98.818076, 39.064911 ], [ 98.816845, 39.085818 ], [ 98.743548, 39.086747 ], [ 98.730613, 39.057011 ], [ 98.70536, 39.043533 ], [ 98.661628, 38.993782 ], [ 98.612353, 38.977035 ], [ 98.624056, 38.959353 ], [ 98.584635, 38.93003 ], [ 98.526737, 38.95563 ], [ 98.457752, 38.952838 ], [ 98.428187, 38.976104 ], [ 98.432498, 38.996107 ], [ 98.401086, 39.001688 ], [ 98.383839, 39.029588 ], [ 98.316702, 39.040744 ], [ 98.280977, 39.027263 ], [ 98.287753, 38.992386 ], [ 98.276666, 38.963541 ], [ 98.235398, 38.918855 ], [ 98.242173, 38.880664 ], [ 98.167645, 38.840121 ], [ 98.091884, 38.786495 ], [ 98.068478, 38.816344 ], [ 98.029058, 38.834061 ], [ 98.009348, 38.85923 ], [ 97.875689, 38.898365 ], [ 97.828878, 38.93003 ], [ 97.701379, 38.963076 ], [ 97.679205, 39.010524 ], [ 97.58127, 39.052364 ], [ 97.504894, 39.076527 ], [ 97.458698, 39.117863 ], [ 97.401416, 39.146645 ], [ 97.371235, 39.140611 ], [ 97.347213, 39.167528 ], [ 97.315185, 39.164744 ], [ 97.220946, 39.193042 ], [ 97.14149, 39.199999 ], [ 97.060186, 39.19768 ], [ 97.017686, 39.208347 ], [ 96.962251, 39.198144 ], [ 97.012142, 39.142004 ], [ 96.969643, 39.097895 ], [ 96.95794, 39.041674 ], [ 96.965331, 39.017034 ], [ 96.938846, 38.95563 ], [ 96.940693, 38.90768 ], [ 96.983809, 38.869016 ], [ 96.993664, 38.834993 ], [ 96.987505, 38.793025 ], [ 97.00044, 38.7613 ], [ 97.023229, 38.755699 ], [ 97.009063, 38.702477 ], [ 97.057722, 38.67258 ], [ 97.047251, 38.653888 ], [ 97.055874, 38.594508 ], [ 96.961019, 38.558015 ], [ 96.876636, 38.580475 ], [ 96.847071, 38.599186 ], [ 96.7941, 38.608072 ], [ 96.808882, 38.582346 ], [ 96.767614, 38.552399 ], [ 96.800259, 38.52759 ], [ 96.780549, 38.504177 ], [ 96.706637, 38.505582 ], [ 96.6666, 38.483567 ], [ 96.707868, 38.459203 ], [ 96.698013, 38.422172 ], [ 96.626564, 38.356031 ], [ 96.638883, 38.307208 ], [ 96.655514, 38.295936 ], [ 96.665369, 38.23015 ], [ 96.46334, 38.277616 ], [ 96.378341, 38.277146 ], [ 96.335841, 38.246132 ], [ 96.301964, 38.183124 ], [ 96.313051, 38.161952 ], [ 96.264392, 38.145952 ], [ 96.252689, 38.167599 ], [ 96.221892, 38.149246 ], [ 96.109175, 38.187358 ], [ 96.06606, 38.173245 ], [ 96.006929, 38.207582 ], [ 95.93856, 38.237202 ], [ 95.932401, 38.259291 ], [ 95.89606, 38.2903 ], [ 95.852945, 38.287481 ], [ 95.83693, 38.344298 ], [ 95.775952, 38.356031 ], [ 95.723597, 38.378554 ], [ 95.703887, 38.400131 ], [ 95.671858, 38.388405 ], [ 95.608417, 38.339134 ], [ 95.585011, 38.343359 ], [ 95.51849, 38.294997 ], [ 95.487693, 38.314721 ], [ 95.455664, 38.291709 ], [ 95.440881, 38.310965 ], [ 95.408236, 38.300163 ], [ 95.315846, 38.318947 ], [ 95.259179, 38.302981 ], [ 95.229614, 38.330685 ], [ 95.209904, 38.327868 ], [ 95.185266, 38.379492 ], [ 95.140919, 38.392158 ], [ 95.122441, 38.417014 ], [ 95.072549, 38.402476 ], [ 95.045448, 38.418889 ], [ 94.973999, 38.430142 ], [ 94.884072, 38.414669 ], [ 94.861282, 38.393565 ], [ 94.812623, 38.385591 ], [ 94.672805, 38.386998 ], [ 94.582878, 38.36917 ], [ 94.56132, 38.351807 ], [ 94.527443, 38.365416 ], [ 94.527443, 38.425922 ], [ 94.511429, 38.445142 ], [ 94.370379, 38.7627 ], [ 94.281067, 38.7599 ], [ 93.973098, 38.724891 ], [ 93.95154, 38.715086 ], [ 93.885018, 38.720689 ], [ 93.800019, 38.750566 ], [ 93.773533, 38.771099 ], [ 93.756287, 38.807484 ], [ 93.769838, 38.821007 ], [ 93.884403, 38.826136 ], [ 93.884403, 38.867618 ], [ 93.834511, 38.867618 ], [ 93.729186, 38.924443 ], [ 93.453245, 38.915596 ], [ 93.274007, 38.896036 ], [ 93.237666, 38.916062 ], [ 93.179152, 38.923977 ], [ 93.198246, 39.045857 ], [ 93.165601, 39.090928 ], [ 93.131725, 39.108112 ], [ 93.142196, 39.160567 ], [ 93.115094, 39.17959 ], [ 93.043029, 39.146645 ], [ 92.978356, 39.143396 ], [ 92.938936, 39.169848 ], [ 92.889045, 39.160103 ], [ 92.866871, 39.138754 ], [ 92.765857, 39.136898 ], [ 92.659299, 39.109969 ], [ 92.545966, 39.111362 ], [ 92.489916, 39.099753 ], [ 92.459119, 39.063982 ], [ 92.459119, 39.042604 ], [ 92.41046, 39.03842 ], [ 92.366728, 39.059335 ], [ 92.366112, 39.096037 ], [ 92.343938, 39.146181 ], [ 92.339011, 39.236628 ], [ 92.378431, 39.258411 ], [ 92.52564, 39.368611 ], [ 92.639589, 39.514196 ], [ 92.687632, 39.657174 ], [ 92.745531, 39.868331 ], [ 92.796654, 40.153897 ], [ 92.906907, 40.310609 ], [ 92.920458, 40.391792 ], [ 92.928465, 40.572504 ], [ 93.506216, 40.648376 ], [ 93.760599, 40.664721 ], [ 93.820961, 40.793519 ], [ 93.809874, 40.879548 ], [ 93.908424, 40.983539 ], [ 94.01067, 41.114875 ], [ 94.184365, 41.268444 ], [ 94.534219, 41.505966 ], [ 94.750413, 41.538227 ], [ 94.809543, 41.619256 ], [ 94.861898, 41.668451 ], [ 94.969072, 41.718948 ], [ 95.011572, 41.726541 ], [ 95.110738, 41.768513 ], [ 95.135991, 41.772976 ], [ 95.16494, 41.735474 ], [ 95.199433, 41.719395 ], [ 95.194505, 41.694821 ], [ 95.247476, 41.61344 ], [ 95.299831, 41.565994 ], [ 95.335556, 41.644305 ], [ 95.39407, 41.693481 ], [ 95.445193, 41.719841 ], [ 95.57146, 41.796181 ], [ 95.65646, 41.826067 ], [ 95.759322, 41.835878 ], [ 95.801206, 41.848361 ], [ 95.855408, 41.849699 ], [ 95.998306, 41.906289 ], [ 96.054973, 41.936124 ], [ 96.117183, 41.985966 ], [ 96.137509, 42.019765 ], [ 96.13874, 42.05399 ], [ 96.077147, 42.149457 ], [ 96.178161, 42.21775 ], [ 96.040806, 42.326688 ], [ 96.042038, 42.352787 ], [ 96.06606, 42.414674 ], [ 95.978596, 42.436762 ], [ 96.0174, 42.482239 ], [ 96.02356, 42.542675 ], [ 96.072219, 42.569566 ], [ 96.103632, 42.604375 ], [ 96.166458, 42.623314 ], [ 96.386348, 42.727592 ], [ 96.742361, 42.75704 ], [ 96.968411, 42.756161 ], [ 97.172903, 42.795257 ], [ 97.371235, 42.457076 ], [ 97.500582, 42.243894 ], [ 97.653335, 41.986856 ], [ 97.84674, 41.656379 ], [ 97.613915, 41.477276 ], [ 97.629314, 41.440498 ], [ 97.903407, 41.168057 ], [ 97.971776, 41.09774 ], [ 98.142391, 41.001607 ], [ 98.184891, 40.988056 ], [ 98.25018, 40.93925 ], [ 98.333332, 40.918903 ], [ 98.344419, 40.568413 ], [ 98.627751, 40.677884 ], [ 98.569853, 40.746836 ], [ 98.668403, 40.773128 ], [ 98.689345, 40.691952 ], [ 98.72199, 40.657911 ], [ 98.762642, 40.639748 ], [ 98.802678, 40.607043 ], [ 98.80699, 40.660181 ], [ 98.790975, 40.705564 ], [ 98.984996, 40.782644 ], [ 99.041662, 40.693767 ], [ 99.102025, 40.676522 ], [ 99.12543, 40.715091 ], [ 99.172858, 40.747289 ], [ 99.174705, 40.858278 ], [ 99.565827, 40.846961 ], [ 99.673, 40.93292 ], [ 99.985897, 40.909858 ], [ 100.057346, 40.908049 ], [ 100.107853, 40.875475 ], [ 100.224882, 40.727337 ], [ 100.237201, 40.716905 ], [ 100.242744, 40.618855 ], [ 100.169447, 40.541131 ], [ 100.169447, 40.277743 ], [ 100.007455, 40.20008 ], [ 99.955716, 40.150695 ], [ 99.927383, 40.063727 ], [ 99.841152, 40.013326 ], [ 99.751225, 40.006909 ], [ 99.714268, 39.972061 ], [ 99.533182, 39.891753 ], [ 99.491298, 39.884406 ], [ 99.459885, 39.898181 ], [ 99.440791, 39.885783 ], [ 99.469124, 39.875221 ], [ 99.672384, 39.888079 ], [ 99.822058, 39.860063 ], [ 99.904593, 39.785601 ], [ 99.958796, 39.769504 ], [ 100.040716, 39.757083 ], [ 100.128179, 39.702312 ], [ 100.250135, 39.685274 ], [ 100.314193, 39.606935 ], [ 100.301258, 39.572345 ], [ 100.326512, 39.509118 ], [ 100.44354, 39.485565 ], [ 100.500823, 39.481408 ], [ 100.498975, 39.400527 ], [ 100.606764, 39.387577 ], [ 100.707778, 39.404689 ], [ 100.842053, 39.405614 ], [ 100.842669, 39.199999 ], [ 100.864227, 39.106719 ], [ 100.829118, 39.075133 ], [ 100.835278, 39.025869 ], [ 100.875314, 39.002619 ], [ 100.901799, 39.030053 ], [ 100.961545, 39.005874 ], [ 100.969553, 38.946788 ], [ 101.117378, 38.975174 ], [ 101.228863, 39.020754 ], [ 101.198682, 38.943064 ], [ 101.237486, 38.907214 ], [ 101.24303, 38.860628 ], [ 101.33542, 38.847113 ], [ 101.34158, 38.822406 ], [ 101.307087, 38.80282 ], [ 101.331109, 38.777164 ], [ 101.412413, 38.764099 ], [ 101.562702, 38.713218 ], [ 101.601506, 38.65529 ], [ 101.672955, 38.6908 ], [ 101.777049, 38.66043 ], [ 101.873751, 38.733761 ], [ 101.941505, 38.808883 ], [ 102.075164, 38.891378 ], [ 102.045599, 38.904885 ], [ 101.955055, 38.985874 ], [ 101.926106, 39.000758 ], [ 101.833715, 39.08907 ], [ 101.902701, 39.111827 ], [ 102.012338, 39.127149 ], [ 102.050526, 39.141075 ], [ 102.276576, 39.188868 ], [ 102.3548, 39.231993 ], [ 102.45335, 39.255167 ], [ 102.579002, 39.183301 ], [ 102.616574, 39.171703 ], [ 102.883892, 39.120649 ], [ 103.007696, 39.099753 ], [ 103.133347, 39.192579 ], [ 103.188166, 39.215302 ], [ 103.259615, 39.263971 ], [ 103.344615, 39.331588 ], [ 103.428998, 39.353341 ], [ 103.595302, 39.386652 ], [ 103.728961, 39.430117 ], [ 103.85338, 39.461543 ], [ 103.955626, 39.456923 ], [ 104.089901, 39.419947 ], [ 104.073271, 39.351953 ], [ 104.047401, 39.297788 ], [ 104.171205, 39.160567 ], [ 104.207546, 39.083495 ], [ 104.190915, 39.042139 ], [ 104.196459, 38.9882 ], [ 104.173053, 38.94446 ], [ 104.044322, 38.895105 ], [ 104.011677, 38.85923 ], [ 103.85954, 38.64454 ], [ 103.416063, 38.404821 ], [ 103.465339, 38.353215 ], [ 103.507838, 38.280905 ], [ 103.53494, 38.156776 ], [ 103.368636, 38.08898 ], [ 103.362477, 38.037621 ], [ 103.40744, 37.860651 ], [ 103.627947, 37.797783 ], [ 103.683381, 37.777919 ], [ 103.841062, 37.64725 ], [ 103.874938, 37.604117 ], [ 103.935916, 37.572818 ], [ 104.089285, 37.465067 ], [ 104.183524, 37.406618 ], [ 104.237727, 37.411847 ], [ 104.287002, 37.428007 ], [ 104.298705, 37.414223 ], [ 104.365226, 37.418026 ], [ 104.437907, 37.445589 ], [ 104.448994, 37.42468 ], [ 104.499501, 37.421353 ], [ 104.521059, 37.43466 ], [ 104.679971, 37.408044 ], [ 104.662109, 37.367626 ], [ 104.713848, 37.329566 ], [ 104.673812, 37.317668 ], [ 104.651022, 37.290534 ], [ 104.624536, 37.298627 ], [ 104.600515, 37.242907 ], [ 104.638087, 37.201923 ], [ 104.717543, 37.208597 ], [ 104.776673, 37.246718 ], [ 104.85613, 37.211933 ], [ 104.864753, 37.17284 ], [ 104.888158, 37.15901 ], [ 104.914644, 37.097935 ], [ 104.954064, 37.077407 ], [ 104.95468, 37.040156 ], [ 105.004571, 37.035378 ], [ 105.03968, 37.007187 ], [ 105.05939, 37.022956 ], [ 105.128991, 36.996194 ], [ 105.165331, 36.99476 ], [ 105.185657, 36.942164 ], [ 105.178882, 36.892403 ], [ 105.244787, 36.894796 ], [ 105.279896, 36.86751 ], [ 105.303302, 36.820575 ], [ 105.334714, 36.80093 ], [ 105.340874, 36.764502 ], [ 105.319932, 36.742924 ], [ 105.275584, 36.752515 ], [ 105.272505, 36.739567 ], [ 105.218302, 36.730455 ], [ 105.201056, 36.700711 ], [ 105.225693, 36.664716 ], [ 105.22015, 36.631105 ], [ 105.261418, 36.602764 ], [ 105.2762, 36.563358 ], [ 105.252179, 36.553263 ], [ 105.281744, 36.522489 ], [ 105.322396, 36.535954 ], [ 105.362432, 36.496514 ], [ 105.363048, 36.443093 ], [ 105.398156, 36.430575 ], [ 105.401236, 36.369881 ], [ 105.425873, 36.330357 ], [ 105.455439, 36.321678 ], [ 105.476381, 36.293224 ], [ 105.45975, 36.268137 ], [ 105.460366, 36.223733 ], [ 105.478844, 36.213111 ], [ 105.515185, 36.147415 ], [ 105.491163, 36.101009 ], [ 105.430801, 36.10391 ], [ 105.406163, 36.074409 ], [ 105.343954, 36.033767 ], [ 105.324859, 35.941761 ], [ 105.350113, 35.875839 ], [ 105.39754, 35.857409 ], [ 105.371055, 35.844312 ], [ 105.38091, 35.792873 ], [ 105.408627, 35.822479 ], [ 105.428953, 35.819082 ], [ 105.432033, 35.787533 ], [ 105.457286, 35.771511 ], [ 105.481924, 35.727312 ], [ 105.595873, 35.715651 ], [ 105.667322, 35.749657 ], [ 105.70243, 35.733142 ], [ 105.759097, 35.724883 ], [ 105.740618, 35.698643 ], [ 105.723988, 35.725854 ], [ 105.690727, 35.698643 ], [ 105.722756, 35.673366 ], [ 105.713517, 35.650513 ], [ 105.759097, 35.634464 ], [ 105.762176, 35.602841 ], [ 105.800365, 35.564878 ], [ 105.816379, 35.575101 ], [ 105.847176, 35.490359 ], [ 105.868734, 35.540046 ], [ 105.900147, 35.54735 ], [ 106.017175, 35.519103 ], [ 106.023335, 35.49377 ], [ 106.047356, 35.498155 ], [ 106.048588, 35.488898 ], [ 105.897683, 35.451368 ], [ 105.894603, 35.413821 ], [ 106.002393, 35.438692 ], [ 106.034422, 35.469404 ], [ 106.054132, 35.45478 ], [ 106.071994, 35.463555 ], [ 106.06953, 35.458193 ], [ 106.071378, 35.449418 ], [ 106.073226, 35.447468 ], [ 106.067682, 35.436254 ], [ 106.073226, 35.420649 ], [ 106.083081, 35.421624 ], [ 106.113262, 35.361616 ], [ 106.129892, 35.393333 ], [ 106.173008, 35.437716 ], [ 106.196414, 35.409919 ], [ 106.237681, 35.409431 ], [ 106.241377, 35.358687 ], [ 106.319601, 35.265411 ], [ 106.363333, 35.238532 ], [ 106.368261, 35.273718 ], [ 106.415688, 35.276161 ], [ 106.472354, 35.310842 ], [ 106.501304, 35.364056 ], [ 106.503767, 35.415284 ], [ 106.483441, 35.450393 ], [ 106.490217, 35.480613 ], [ 106.465579, 35.481101 ], [ 106.440941, 35.52641 ], [ 106.460036, 35.578995 ], [ 106.47913, 35.575101 ], [ 106.460036, 35.643705 ], [ 106.434782, 35.688436 ], [ 106.49268, 35.732656 ], [ 106.498224, 35.732656 ], [ 106.504383, 35.736057 ], [ 106.506231, 35.737514 ] ] ], [ [ [ 106.047356, 35.498155 ], [ 106.078769, 35.509848 ], [ 106.071994, 35.463555 ], [ 106.054132, 35.45478 ], [ 106.048588, 35.488898 ], [ 106.047356, 35.498155 ] ] ], [ [ [ 102.831537, 36.365544 ], [ 102.838928, 36.345783 ], [ 102.836465, 36.344819 ], [ 102.829689, 36.365544 ], [ 102.831537, 36.365544 ] ] ], [ [ [ 106.073226, 35.447468 ], [ 106.083081, 35.421624 ], [ 106.073226, 35.420649 ], [ 106.067682, 35.436254 ], [ 106.073226, 35.447468 ] ] ], [ [ [ 106.504383, 35.736057 ], [ 106.498224, 35.732656 ], [ 106.49268, 35.732656 ], [ 106.506231, 35.737514 ], [ 106.504383, 35.736057 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"630000\", \"name\": \"青海省\", \"center\": [ 101.778916, 36.623178 ], \"centroid\": [ 96.043533, 35.726403 ], \"childrenNum\": 8, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 28, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 102.829689, 36.365544 ], [ 102.836465, 36.344819 ], [ 102.845704, 36.331803 ], [ 102.896827, 36.331803 ], [ 102.922696, 36.298047 ], [ 103.024942, 36.256556 ], [ 103.021246, 36.232906 ], [ 103.066826, 36.216974 ], [ 103.048964, 36.199107 ], [ 102.986754, 36.193312 ], [ 102.965812, 36.151765 ], [ 102.948566, 36.150798 ], [ 102.941174, 36.104877 ], [ 102.882044, 36.082632 ], [ 102.932551, 36.048285 ], [ 102.968276, 36.044414 ], [ 102.951645, 36.021667 ], [ 102.971971, 35.995525 ], [ 102.942406, 35.92674 ], [ 102.954725, 35.858864 ], [ 102.94487, 35.829757 ], [ 102.914073, 35.845282 ], [ 102.81737, 35.850133 ], [ 102.787189, 35.862745 ], [ 102.739146, 35.821023 ], [ 102.715125, 35.815685 ], [ 102.686175, 35.771996 ], [ 102.707733, 35.70496 ], [ 102.744074, 35.657807 ], [ 102.7644, 35.653431 ], [ 102.763168, 35.612086 ], [ 102.808747, 35.560496 ], [ 102.746537, 35.545403 ], [ 102.729291, 35.523487 ], [ 102.782878, 35.527871 ], [ 102.743458, 35.494745 ], [ 102.695414, 35.528358 ], [ 102.570995, 35.548324 ], [ 102.531575, 35.580455 ], [ 102.503241, 35.585322 ], [ 102.49893, 35.545403 ], [ 102.437952, 35.455268 ], [ 102.447807, 35.437229 ], [ 102.408387, 35.409431 ], [ 102.314764, 35.434303 ], [ 102.293822, 35.424063 ], [ 102.287663, 35.36552 ], [ 102.317844, 35.343067 ], [ 102.311684, 35.31426 ], [ 102.280887, 35.303028 ], [ 102.3123, 35.282512 ], [ 102.370199, 35.263946 ], [ 102.365887, 35.235599 ], [ 102.404075, 35.179366 ], [ 102.346793, 35.164201 ], [ 102.310452, 35.128967 ], [ 102.29567, 35.071681 ], [ 102.252554, 35.048657 ], [ 102.218062, 35.057475 ], [ 102.211286, 35.034937 ], [ 102.176178, 35.032977 ], [ 102.157699, 35.010923 ], [ 102.133678, 35.014844 ], [ 102.094874, 34.986901 ], [ 102.048062, 34.910868 ], [ 102.068388, 34.887798 ], [ 101.985852, 34.90007 ], [ 101.916867, 34.873561 ], [ 101.923027, 34.835746 ], [ 101.917483, 34.705964 ], [ 101.919947, 34.621791 ], [ 101.934729, 34.58731 ], [ 101.956287, 34.582876 ], [ 101.97415, 34.548871 ], [ 102.001867, 34.538519 ], [ 102.093026, 34.536547 ], [ 102.139837, 34.50351 ], [ 102.155852, 34.507456 ], [ 102.169402, 34.457631 ], [ 102.205743, 34.407777 ], [ 102.259329, 34.355917 ], [ 102.237156, 34.34307 ], [ 102.237156, 34.34307 ], [ 102.186649, 34.352952 ], [ 102.149692, 34.271885 ], [ 102.067772, 34.293642 ], [ 102.062229, 34.227858 ], [ 102.01357, 34.218456 ], [ 102.030816, 34.190739 ], [ 102.003099, 34.162022 ], [ 101.965526, 34.167469 ], [ 101.955055, 34.109514 ], [ 101.897773, 34.133791 ], [ 101.874367, 34.130323 ], [ 101.851578, 34.153108 ], [ 101.836795, 34.124378 ], [ 101.788136, 34.131809 ], [ 101.764114, 34.122892 ], [ 101.736397, 34.080275 ], [ 101.718535, 34.083249 ], [ 101.703136, 34.119424 ], [ 101.674187, 34.110506 ], [ 101.6206, 34.178857 ], [ 101.53868, 34.212022 ], [ 101.492485, 34.195689 ], [ 101.482014, 34.218951 ], [ 101.417956, 34.227858 ], [ 101.369913, 34.248143 ], [ 101.327413, 34.24468 ], [ 101.325565, 34.268423 ], [ 101.268899, 34.278808 ], [ 101.228863, 34.298586 ], [ 101.235022, 34.325279 ], [ 101.193754, 34.336646 ], [ 101.178356, 34.320831 ], [ 101.098284, 34.329233 ], [ 101.054552, 34.322808 ], [ 100.986799, 34.374689 ], [ 100.951074, 34.38358 ], [ 100.895024, 34.375183 ], [ 100.868538, 34.332693 ], [ 100.821727, 34.317371 ], [ 100.798321, 34.260014 ], [ 100.809408, 34.247153 ], [ 100.764445, 34.178857 ], [ 100.806329, 34.155584 ], [ 100.848828, 34.089692 ], [ 100.870386, 34.083744 ], [ 100.880857, 34.036644 ], [ 100.93506, 33.990013 ], [ 100.927669, 33.975126 ], [ 100.965857, 33.946832 ], [ 100.994806, 33.891707 ], [ 101.023139, 33.896178 ], [ 101.054552, 33.863386 ], [ 101.153718, 33.8445 ], [ 101.153102, 33.823124 ], [ 101.190675, 33.791796 ], [ 101.186363, 33.741051 ], [ 101.162957, 33.719649 ], [ 101.177124, 33.685295 ], [ 101.166653, 33.659894 ], [ 101.217776, 33.669856 ], [ 101.23687, 33.685793 ], [ 101.302776, 33.657902 ], [ 101.385312, 33.644949 ], [ 101.424732, 33.655411 ], [ 101.428427, 33.680315 ], [ 101.501724, 33.702723 ], [ 101.58426, 33.674339 ], [ 101.585492, 33.645448 ], [ 101.616905, 33.598603 ], [ 101.611977, 33.565199 ], [ 101.622448, 33.502343 ], [ 101.718535, 33.494857 ], [ 101.748716, 33.505337 ], [ 101.769042, 33.538765 ], [ 101.777665, 33.533776 ], [ 101.769042, 33.45592 ], [ 101.695745, 33.433948 ], [ 101.663716, 33.383991 ], [ 101.64955, 33.323004 ], [ 101.677883, 33.297497 ], [ 101.735781, 33.279987 ], [ 101.709912, 33.21292 ], [ 101.653861, 33.162835 ], [ 101.661252, 33.135778 ], [ 101.633535, 33.101193 ], [ 101.557775, 33.167344 ], [ 101.515275, 33.192889 ], [ 101.487557, 33.226938 ], [ 101.403174, 33.225436 ], [ 101.386543, 33.207412 ], [ 101.393935, 33.157826 ], [ 101.381616, 33.153316 ], [ 101.297232, 33.262475 ], [ 101.217776, 33.256469 ], [ 101.182668, 33.26948 ], [ 101.156798, 33.236449 ], [ 101.124769, 33.221431 ], [ 101.11553, 33.194893 ], [ 101.169733, 33.10019 ], [ 101.143863, 33.086151 ], [ 101.146327, 33.056563 ], [ 101.184515, 33.041514 ], [ 101.171581, 33.009902 ], [ 101.183899, 32.984304 ], [ 101.129081, 32.989324 ], [ 101.134624, 32.95217 ], [ 101.124153, 32.909976 ], [ 101.178356, 32.892892 ], [ 101.223935, 32.855698 ], [ 101.237486, 32.825026 ], [ 101.22332, 32.725898 ], [ 101.157414, 32.661431 ], [ 101.124769, 32.658408 ], [ 101.077342, 32.68259 ], [ 101.030531, 32.660424 ], [ 100.99727, 32.627668 ], [ 100.956618, 32.621116 ], [ 100.93198, 32.600447 ], [ 100.887633, 32.632708 ], [ 100.834046, 32.648835 ], [ 100.77122, 32.643795 ], [ 100.690532, 32.678056 ], [ 100.71209, 32.645307 ], [ 100.710242, 32.610026 ], [ 100.673286, 32.628172 ], [ 100.661583, 32.616075 ], [ 100.657887, 32.546484 ], [ 100.645568, 32.526303 ], [ 100.603069, 32.553547 ], [ 100.54517, 32.569687 ], [ 100.516837, 32.632204 ], [ 100.470026, 32.694678 ], [ 100.450932, 32.694678 ], [ 100.420135, 32.73194 ], [ 100.378251, 32.698707 ], [ 100.399193, 32.756101 ], [ 100.339447, 32.719353 ], [ 100.258759, 32.742511 ], [ 100.231041, 32.696189 ], [ 100.229809, 32.650346 ], [ 100.208252, 32.606497 ], [ 100.189773, 32.630692 ], [ 100.109701, 32.640268 ], [ 100.088143, 32.668988 ], [ 100.139266, 32.724388 ], [ 100.117093, 32.802392 ], [ 100.123252, 32.837095 ], [ 100.064738, 32.895907 ], [ 100.029629, 32.895907 ], [ 100.038252, 32.929066 ], [ 99.956332, 32.948152 ], [ 99.947709, 32.986814 ], [ 99.877492, 33.045527 ], [ 99.877492, 32.993339 ], [ 99.851007, 32.941623 ], [ 99.805427, 32.940619 ], [ 99.788181, 32.956689 ], [ 99.764159, 32.924545 ], [ 99.791877, 32.883344 ], [ 99.766623, 32.826032 ], [ 99.760464, 32.769689 ], [ 99.717964, 32.732443 ], [ 99.705029, 32.76516 ], [ 99.646515, 32.774721 ], [ 99.640355, 32.790822 ], [ 99.589233, 32.789312 ], [ 99.558436, 32.839106 ], [ 99.45311, 32.862233 ], [ 99.376118, 32.899927 ], [ 99.353944, 32.885354 ], [ 99.268944, 32.878318 ], [ 99.24677, 32.924043 ], [ 99.235067, 32.982296 ], [ 99.214741, 32.991332 ], [ 99.196263, 33.035493 ], [ 99.124814, 33.046028 ], [ 99.090322, 33.079131 ], [ 99.024416, 33.094675 ], [ 99.014561, 33.081137 ], [ 98.971445, 33.098185 ], [ 98.967134, 33.115229 ], [ 98.92217, 33.118738 ], [ 98.858728, 33.150811 ], [ 98.804526, 33.219428 ], [ 98.802062, 33.270481 ], [ 98.759562, 33.276985 ], [ 98.779888, 33.370497 ], [ 98.736157, 33.406975 ], [ 98.742316, 33.477887 ], [ 98.725686, 33.503341 ], [ 98.678258, 33.522801 ], [ 98.648077, 33.548741 ], [ 98.652389, 33.595114 ], [ 98.622824, 33.610067 ], [ 98.61728, 33.637476 ], [ 98.6567, 33.64744 ], [ 98.610505, 33.682805 ], [ 98.582788, 33.731595 ], [ 98.537824, 33.74752 ], [ 98.51873, 33.77389 ], [ 98.494092, 33.768915 ], [ 98.492861, 33.796272 ], [ 98.463295, 33.848477 ], [ 98.434962, 33.843009 ], [ 98.407245, 33.867362 ], [ 98.425723, 33.913066 ], [ 98.415252, 33.956761 ], [ 98.440506, 33.981577 ], [ 98.428187, 34.029204 ], [ 98.396774, 34.053008 ], [ 98.392462, 34.089196 ], [ 98.344419, 34.094648 ], [ 98.258188, 34.083249 ], [ 98.206449, 34.08424 ], [ 98.157174, 34.107532 ], [ 98.098043, 34.122892 ], [ 98.051848, 34.11546 ], [ 97.95453, 34.190739 ], [ 97.898479, 34.209548 ], [ 97.796849, 34.199154 ], [ 97.796849, 34.199154 ], [ 97.789458, 34.182818 ], [ 97.789458, 34.182818 ], [ 97.766668, 34.158555 ], [ 97.665654, 34.126855 ], [ 97.70261, 34.036644 ], [ 97.652719, 33.998448 ], [ 97.660111, 33.956264 ], [ 97.629314, 33.919523 ], [ 97.601596, 33.929951 ], [ 97.52214, 33.903133 ], [ 97.503662, 33.912073 ], [ 97.460546, 33.887236 ], [ 97.395257, 33.889224 ], [ 97.398336, 33.848477 ], [ 97.371851, 33.842015 ], [ 97.373083, 33.817655 ], [ 97.406344, 33.795278 ], [ 97.422974, 33.754984 ], [ 97.418046, 33.728608 ], [ 97.435293, 33.682307 ], [ 97.415583, 33.605582 ], [ 97.450075, 33.582152 ], [ 97.523372, 33.577166 ], [ 97.511669, 33.520805 ], [ 97.552321, 33.465906 ], [ 97.625618, 33.461412 ], [ 97.674893, 33.432949 ], [ 97.754349, 33.409972 ], [ 97.676125, 33.341004 ], [ 97.622538, 33.337005 ], [ 97.607756, 33.263976 ], [ 97.548626, 33.203907 ], [ 97.487648, 33.168346 ], [ 97.498119, 33.137783 ], [ 97.487032, 33.107209 ], [ 97.517213, 33.097683 ], [ 97.542466, 33.035995 ], [ 97.499966, 33.011408 ], [ 97.523988, 32.988822 ], [ 97.438372, 32.976271 ], [ 97.375547, 32.956689 ], [ 97.347829, 32.895907 ], [ 97.376163, 32.886359 ], [ 97.392793, 32.828546 ], [ 97.386018, 32.77925 ], [ 97.429133, 32.714318 ], [ 97.42359, 32.70475 ], [ 97.48272, 32.654377 ], [ 97.535075, 32.638252 ], [ 97.543698, 32.62162 ], [ 97.607756, 32.614059 ], [ 97.616995, 32.586329 ], [ 97.700763, 32.53488 ], [ 97.730944, 32.527312 ], [ 97.684132, 32.530339 ], [ 97.670582, 32.51722 ], [ 97.540618, 32.536899 ], [ 97.50243, 32.530844 ], [ 97.463626, 32.55506 ], [ 97.448843, 32.586833 ], [ 97.411887, 32.575235 ], [ 97.374315, 32.546484 ], [ 97.3583, 32.563635 ], [ 97.332431, 32.542448 ], [ 97.334895, 32.514192 ], [ 97.388481, 32.501575 ], [ 97.341054, 32.440987 ], [ 97.387865, 32.427349 ], [ 97.424822, 32.322723 ], [ 97.415583, 32.296421 ], [ 97.371235, 32.273148 ], [ 97.32196, 32.303503 ], [ 97.299786, 32.294904 ], [ 97.264062, 32.182527 ], [ 97.271453, 32.139971 ], [ 97.313953, 32.130342 ], [ 97.293011, 32.096887 ], [ 97.308409, 32.076605 ], [ 97.258518, 32.072041 ], [ 97.219714, 32.109054 ], [ 97.201852, 32.090296 ], [ 97.233881, 32.063927 ], [ 97.214786, 32.042623 ], [ 97.188301, 32.055304 ], [ 97.169823, 32.032984 ], [ 97.127323, 32.044145 ], [ 97.028773, 32.04871 ], [ 97.006599, 32.067984 ], [ 96.935766, 32.048203 ], [ 96.965947, 32.008628 ], [ 96.941925, 31.986297 ], [ 96.894498, 32.013703 ], [ 96.863085, 31.996448 ], [ 96.868629, 31.964975 ], [ 96.824281, 32.007613 ], [ 96.722651, 32.013195 ], [ 96.742977, 32.001016 ], [ 96.753448, 31.944156 ], [ 96.776238, 31.935015 ], [ 96.81073, 31.894375 ], [ 96.794716, 31.869474 ], [ 96.760223, 31.860325 ], [ 96.765767, 31.819144 ], [ 96.799027, 31.792188 ], [ 96.840295, 31.720438 ], [ 96.790404, 31.698545 ], [ 96.778701, 31.675629 ], [ 96.722651, 31.686833 ], [ 96.691854, 31.722474 ], [ 96.661057, 31.705674 ], [ 96.615477, 31.737236 ], [ 96.56805, 31.711783 ], [ 96.519391, 31.74945 ], [ 96.468884, 31.769804 ], [ 96.435623, 31.796258 ], [ 96.407906, 31.845583 ], [ 96.389428, 31.919777 ], [ 96.288414, 31.919777 ], [ 96.253305, 31.929936 ], [ 96.220044, 31.905553 ], [ 96.188632, 31.904028 ], [ 96.214501, 31.876589 ], [ 96.202798, 31.841008 ], [ 96.183088, 31.835924 ], [ 96.178161, 31.775401 ], [ 96.231131, 31.749959 ], [ 96.222508, 31.733164 ], [ 96.252073, 31.697527 ], [ 96.245298, 31.657802 ], [ 96.221892, 31.647613 ], [ 96.207726, 31.598691 ], [ 96.156603, 31.602769 ], [ 96.148595, 31.686324 ], [ 96.135661, 31.70211 ], [ 96.064828, 31.720438 ], [ 95.989067, 31.78761 ], [ 95.983524, 31.816601 ], [ 95.89914, 31.81711 ], [ 95.846169, 31.736218 ], [ 95.853561, 31.714329 ], [ 95.823995, 31.68225 ], [ 95.779648, 31.748941 ], [ 95.634286, 31.782523 ], [ 95.580083, 31.76726 ], [ 95.546823, 31.73978 ], [ 95.511714, 31.750468 ], [ 95.480301, 31.795749 ], [ 95.456896, 31.801853 ], [ 95.406389, 31.896915 ], [ 95.408852, 31.918761 ], [ 95.3682, 31.92892 ], [ 95.360809, 31.95939 ], [ 95.395918, 32.001523 ], [ 95.454432, 32.007613 ], [ 95.421171, 32.033999 ], [ 95.454432, 32.061898 ], [ 95.440265, 32.157705 ], [ 95.406389, 32.182021 ], [ 95.367584, 32.178982 ], [ 95.366968, 32.151118 ], [ 95.31523, 32.148585 ], [ 95.270266, 32.194683 ], [ 95.270266, 32.194683 ], [ 95.239469, 32.287315 ], [ 95.241317, 32.3207 ], [ 95.214216, 32.321712 ], [ 95.20744, 32.297433 ], [ 95.10581, 32.258979 ], [ 95.079325, 32.279726 ], [ 95.096571, 32.322217 ], [ 95.193274, 32.332331 ], [ 95.261643, 32.348006 ], [ 95.228382, 32.363678 ], [ 95.218527, 32.397035 ], [ 95.153853, 32.386423 ], [ 95.081789, 32.384907 ], [ 95.075013, 32.376315 ], [ 95.075013, 32.376315 ], [ 95.057151, 32.395014 ], [ 94.988166, 32.422802 ], [ 94.944434, 32.404109 ], [ 94.912405, 32.41573 ], [ 94.889616, 32.472295 ], [ 94.852043, 32.463712 ], [ 94.80708, 32.486431 ], [ 94.78737, 32.522266 ], [ 94.762116, 32.526303 ], [ 94.737479, 32.587338 ], [ 94.638312, 32.645307 ], [ 94.614291, 32.673522 ], [ 94.591501, 32.640772 ], [ 94.522516, 32.595909 ], [ 94.459074, 32.599439 ], [ 94.463386, 32.572209 ], [ 94.435052, 32.562626 ], [ 94.395016, 32.594397 ], [ 94.371611, 32.524789 ], [ 94.350053, 32.533871 ], [ 94.294002, 32.519743 ], [ 94.292154, 32.502584 ], [ 94.250886, 32.51722 ], [ 94.196684, 32.51621 ], [ 94.176974, 32.454117 ], [ 94.137554, 32.433915 ], [ 94.091974, 32.463207 ], [ 94.049474, 32.469771 ], [ 94.03038, 32.448057 ], [ 93.978641, 32.459672 ], [ 93.960163, 32.484917 ], [ 93.90904, 32.463207 ], [ 93.861613, 32.466237 ], [ 93.851142, 32.50965 ], [ 93.820345, 32.549511 ], [ 93.75136, 32.56313 ], [ 93.721795, 32.578261 ], [ 93.651577, 32.571705 ], [ 93.618933, 32.522771 ], [ 93.516687, 32.47583 ], [ 93.501904, 32.503593 ], [ 93.476651, 32.504603 ], [ 93.4631, 32.556069 ], [ 93.411977, 32.558086 ], [ 93.385492, 32.525294 ], [ 93.33868, 32.5712 ], [ 93.308499, 32.580278 ], [ 93.300492, 32.619604 ], [ 93.260456, 32.62666 ], [ 93.239514, 32.662439 ], [ 93.210565, 32.655385 ], [ 93.176688, 32.6705 ], [ 93.159442, 32.644803 ], [ 93.087993, 32.63674 ], [ 93.069515, 32.626156 ], [ 93.023935, 32.703239 ], [ 93.019624, 32.737477 ], [ 93.00053, 32.741001 ], [ 92.964189, 32.714821 ], [ 92.933392, 32.719353 ], [ 92.866871, 32.698203 ], [ 92.822523, 32.729926 ], [ 92.789262, 32.719856 ], [ 92.756618, 32.743014 ], [ 92.686401, 32.76516 ], [ 92.667922, 32.73194 ], [ 92.634662, 32.720863 ], [ 92.574916, 32.741001 ], [ 92.56814, 32.73194 ], [ 92.484372, 32.745028 ], [ 92.459119, 32.76365 ], [ 92.411076, 32.748048 ], [ 92.355641, 32.764657 ], [ 92.343938, 32.738484 ], [ 92.310062, 32.751571 ], [ 92.255243, 32.720863 ], [ 92.198577, 32.754591 ], [ 92.211511, 32.788306 ], [ 92.193649, 32.801889 ], [ 92.227526, 32.821003 ], [ 92.205352, 32.866255 ], [ 92.145606, 32.885857 ], [ 92.101874, 32.860222 ], [ 92.038432, 32.860725 ], [ 92.018722, 32.829552 ], [ 91.955897, 32.8205 ], [ 91.896766, 32.907967 ], [ 91.857962, 32.90244 ], [ 91.839484, 32.948152 ], [ 91.799448, 32.942126 ], [ 91.752637, 32.969242 ], [ 91.685499, 32.989324 ], [ 91.664557, 33.012913 ], [ 91.583253, 33.0375 ], [ 91.55492, 33.060074 ], [ 91.535826, 33.10019 ], [ 91.49579, 33.109214 ], [ 91.436044, 33.066092 ], [ 91.370138, 33.100691 ], [ 91.311624, 33.108211 ], [ 91.261733, 33.141291 ], [ 91.226624, 33.141792 ], [ 91.18782, 33.106206 ], [ 91.161335, 33.108712 ], [ 91.147784, 33.07211 ], [ 91.072024, 33.113224 ], [ 91.037531, 33.098686 ], [ 91.001807, 33.11573 ], [ 90.927894, 33.120241 ], [ 90.902024, 33.083143 ], [ 90.88293, 33.120241 ], [ 90.803474, 33.114227 ], [ 90.740032, 33.142293 ], [ 90.704308, 33.135778 ], [ 90.627315, 33.180368 ], [ 90.562642, 33.229441 ], [ 90.490577, 33.264977 ], [ 90.405577, 33.260473 ], [ 90.363077, 33.279487 ], [ 90.332896, 33.310501 ], [ 90.246665, 33.423959 ], [ 90.22018, 33.437943 ], [ 90.107463, 33.460913 ], [ 90.088984, 33.478885 ], [ 90.083441, 33.525295 ], [ 90.01076, 33.553728 ], [ 89.984275, 33.612061 ], [ 90.008296, 33.687785 ], [ 89.981195, 33.70322 ], [ 89.983659, 33.725622 ], [ 89.907282, 33.741051 ], [ 89.902355, 33.758467 ], [ 89.942391, 33.801246 ], [ 89.899891, 33.80771 ], [ 89.837065, 33.868853 ], [ 89.795181, 33.865374 ], [ 89.73174, 33.921509 ], [ 89.718805, 33.946832 ], [ 89.688008, 33.959739 ], [ 89.684928, 33.990013 ], [ 89.635037, 34.049537 ], [ 89.656595, 34.057966 ], [ 89.655979, 34.097126 ], [ 89.71203, 34.131809 ], [ 89.756993, 34.124874 ], [ 89.760073, 34.152613 ], [ 89.789638, 34.150632 ], [ 89.816739, 34.16945 ], [ 89.838297, 34.263477 ], [ 89.825362, 34.293642 ], [ 89.86663, 34.324785 ], [ 89.858623, 34.359375 ], [ 89.820435, 34.369255 ], [ 89.799493, 34.39642 ], [ 89.819819, 34.420614 ], [ 89.823515, 34.455657 ], [ 89.814891, 34.548871 ], [ 89.777935, 34.574499 ], [ 89.798877, 34.628686 ], [ 89.74837, 34.641981 ], [ 89.72558, 34.660689 ], [ 89.732356, 34.732035 ], [ 89.799493, 34.743838 ], [ 89.825978, 34.796931 ], [ 89.867862, 34.81069 ], [ 89.838913, 34.865705 ], [ 89.814891, 34.86816 ], [ 89.821051, 34.902033 ], [ 89.78779, 34.921664 ], [ 89.747138, 34.903506 ], [ 89.707102, 34.919701 ], [ 89.670146, 34.887798 ], [ 89.578987, 34.895162 ], [ 89.560509, 34.938836 ], [ 89.59069, 35.057965 ], [ 89.593153, 35.104491 ], [ 89.579603, 35.118688 ], [ 89.519241, 35.133862 ], [ 89.46935, 35.214577 ], [ 89.450255, 35.223867 ], [ 89.48598, 35.256616 ], [ 89.531559, 35.276161 ], [ 89.494603, 35.298632 ], [ 89.516161, 35.330862 ], [ 89.497067, 35.361128 ], [ 89.58761, 35.383575 ], [ 89.619639, 35.412357 ], [ 89.658443, 35.425526 ], [ 89.685544, 35.416259 ], [ 89.739131, 35.468429 ], [ 89.765, 35.482563 ], [ 89.740979, 35.507412 ], [ 89.720037, 35.501566 ], [ 89.699711, 35.544916 ], [ 89.71203, 35.581915 ], [ 89.75145, 35.580942 ], [ 89.765616, 35.599922 ], [ 89.726196, 35.648082 ], [ 89.748986, 35.66267 ], [ 89.747138, 35.7516 ], [ 89.782863, 35.773453 ], [ 89.767464, 35.799183 ], [ 89.801957, 35.848193 ], [ 89.778551, 35.861775 ], [ 89.707718, 35.849163 ], [ 89.654747, 35.848193 ], [ 89.62395, 35.859349 ], [ 89.550654, 35.856924 ], [ 89.554965, 35.873414 ], [ 89.489676, 35.903475 ], [ 89.428082, 35.917531 ], [ 89.434857, 35.992136 ], [ 89.404676, 36.016827 ], [ 89.417611, 36.044897 ], [ 89.474893, 36.022151 ], [ 89.605472, 36.038123 ], [ 89.688624, 36.091337 ], [ 89.711414, 36.093272 ], [ 89.766848, 36.073925 ], [ 89.819819, 36.080697 ], [ 89.914058, 36.079246 ], [ 89.941159, 36.067637 ], [ 89.944855, 36.140649 ], [ 89.997825, 36.168193 ], [ 90.019999, 36.213594 ], [ 90.028006, 36.258486 ], [ 90.003369, 36.278752 ], [ 90.043405, 36.276822 ], [ 90.058188, 36.255591 ], [ 90.145651, 36.239181 ], [ 90.130252, 36.2078 ], [ 90.198006, 36.187516 ], [ 90.23681, 36.160462 ], [ 90.325505, 36.159496 ], [ 90.424055, 36.133883 ], [ 90.478258, 36.13195 ], [ 90.534925, 36.147899 ], [ 90.613149, 36.126632 ], [ 90.659344, 36.13485 ], [ 90.776373, 36.086501 ], [ 90.815793, 36.035703 ], [ 90.850285, 36.016827 ], [ 90.922966, 36.028927 ], [ 90.979017, 36.106811 ], [ 91.081263, 36.088436 ], [ 91.124994, 36.115514 ], [ 91.09235, 36.163844 ], [ 91.096045, 36.219871 ], [ 91.051698, 36.238215 ], [ 91.07264, 36.299012 ], [ 91.026444, 36.323607 ], [ 91.051698, 36.433946 ], [ 91.028292, 36.443093 ], [ 91.039995, 36.474861 ], [ 91.035683, 36.529703 ], [ 91.011662, 36.539801 ], [ 90.905104, 36.560474 ], [ 90.831191, 36.55807 ], [ 90.810865, 36.585466 ], [ 90.741264, 36.585947 ], [ 90.72217, 36.620058 ], [ 90.730793, 36.655594 ], [ 90.706156, 36.658955 ], [ 90.720938, 36.708868 ], [ 90.754815, 36.721341 ], [ 90.727098, 36.755872 ], [ 90.732025, 36.825844 ], [ 90.758511, 36.825844 ], [ 90.853981, 36.915373 ], [ 90.924198, 36.921115 ], [ 90.983944, 36.913459 ], [ 91.036915, 36.929727 ], [ 91.051698, 36.96751 ], [ 91.126842, 36.978507 ], [ 91.133618, 37.007665 ], [ 91.181045, 37.025345 ], [ 91.216153, 37.010054 ], [ 91.303617, 37.012444 ], [ 91.291298, 37.042544 ], [ 91.303617, 37.083136 ], [ 91.286371, 37.105095 ], [ 91.280211, 37.163779 ], [ 91.1909, 37.205737 ], [ 91.194596, 37.273868 ], [ 91.134849, 37.324331 ], [ 91.136081, 37.355734 ], [ 91.113292, 37.387124 ], [ 91.099741, 37.447965 ], [ 91.073256, 37.475992 ], [ 91.019669, 37.493088 ], [ 90.958075, 37.477891 ], [ 90.911879, 37.519674 ], [ 90.865684, 37.53059 ], [ 90.882314, 37.575664 ], [ 90.854597, 37.604117 ], [ 90.820104, 37.613599 ], [ 90.777605, 37.648672 ], [ 90.643946, 37.696988 ], [ 90.586663, 37.703144 ], [ 90.579272, 37.720661 ], [ 90.519526, 37.730601 ], [ 90.516446, 38.207111 ], [ 90.531229, 38.319886 ], [ 90.401882, 38.311434 ], [ 90.361846, 38.300163 ], [ 90.352607, 38.233441 ], [ 90.280542, 38.238142 ], [ 90.137644, 38.340543 ], [ 90.179528, 38.396848 ], [ 90.129636, 38.400131 ], [ 90.111774, 38.418889 ], [ 90.111774, 38.477945 ], [ 90.130868, 38.494341 ], [ 90.248513, 38.491531 ], [ 90.315034, 38.501835 ], [ 90.353222, 38.482162 ], [ 90.427135, 38.493873 ], [ 90.465323, 38.521971 ], [ 90.463476, 38.556611 ], [ 90.525685, 38.561291 ], [ 90.560794, 38.593573 ], [ 90.608837, 38.594508 ], [ 90.606374, 38.610878 ], [ 90.645794, 38.635191 ], [ 90.619308, 38.664636 ], [ 90.65996, 38.674449 ], [ 90.724634, 38.658094 ], [ 90.899561, 38.679588 ], [ 90.970394, 38.697806 ], [ 90.992567, 38.695003 ], [ 91.188436, 38.73096 ], [ 91.242639, 38.752433 ], [ 91.298689, 38.746365 ], [ 91.446515, 38.813546 ], [ 91.501333, 38.815411 ], [ 91.681188, 38.852706 ], [ 91.694738, 38.86622 ], [ 91.806223, 38.872744 ], [ 91.87952, 38.884391 ], [ 91.880752, 38.899297 ], [ 91.966368, 38.930961 ], [ 92.10865, 38.963541 ], [ 92.173323, 38.960749 ], [ 92.197961, 38.983548 ], [ 92.263866, 39.002153 ], [ 92.380279, 38.999828 ], [ 92.416003, 39.010524 ], [ 92.41046, 39.03842 ], [ 92.459119, 39.042604 ], [ 92.459119, 39.063982 ], [ 92.489916, 39.099753 ], [ 92.545966, 39.111362 ], [ 92.659299, 39.109969 ], [ 92.765857, 39.136898 ], [ 92.866871, 39.138754 ], [ 92.889045, 39.160103 ], [ 92.938936, 39.169848 ], [ 92.978356, 39.143396 ], [ 93.043029, 39.146645 ], [ 93.115094, 39.17959 ], [ 93.142196, 39.160567 ], [ 93.131725, 39.108112 ], [ 93.165601, 39.090928 ], [ 93.198246, 39.045857 ], [ 93.179152, 38.923977 ], [ 93.237666, 38.916062 ], [ 93.274007, 38.896036 ], [ 93.453245, 38.915596 ], [ 93.729186, 38.924443 ], [ 93.834511, 38.867618 ], [ 93.884403, 38.867618 ], [ 93.884403, 38.826136 ], [ 93.769838, 38.821007 ], [ 93.756287, 38.807484 ], [ 93.773533, 38.771099 ], [ 93.800019, 38.750566 ], [ 93.885018, 38.720689 ], [ 93.95154, 38.715086 ], [ 93.973098, 38.724891 ], [ 94.281067, 38.7599 ], [ 94.370379, 38.7627 ], [ 94.511429, 38.445142 ], [ 94.527443, 38.425922 ], [ 94.527443, 38.365416 ], [ 94.56132, 38.351807 ], [ 94.582878, 38.36917 ], [ 94.672805, 38.386998 ], [ 94.812623, 38.385591 ], [ 94.861282, 38.393565 ], [ 94.884072, 38.414669 ], [ 94.973999, 38.430142 ], [ 95.045448, 38.418889 ], [ 95.072549, 38.402476 ], [ 95.122441, 38.417014 ], [ 95.140919, 38.392158 ], [ 95.185266, 38.379492 ], [ 95.209904, 38.327868 ], [ 95.229614, 38.330685 ], [ 95.259179, 38.302981 ], [ 95.315846, 38.318947 ], [ 95.408236, 38.300163 ], [ 95.440881, 38.310965 ], [ 95.455664, 38.291709 ], [ 95.487693, 38.314721 ], [ 95.51849, 38.294997 ], [ 95.585011, 38.343359 ], [ 95.608417, 38.339134 ], [ 95.671858, 38.388405 ], [ 95.703887, 38.400131 ], [ 95.723597, 38.378554 ], [ 95.775952, 38.356031 ], [ 95.83693, 38.344298 ], [ 95.852945, 38.287481 ], [ 95.89606, 38.2903 ], [ 95.932401, 38.259291 ], [ 95.93856, 38.237202 ], [ 96.006929, 38.207582 ], [ 96.06606, 38.173245 ], [ 96.109175, 38.187358 ], [ 96.221892, 38.149246 ], [ 96.252689, 38.167599 ], [ 96.264392, 38.145952 ], [ 96.313051, 38.161952 ], [ 96.301964, 38.183124 ], [ 96.335841, 38.246132 ], [ 96.378341, 38.277146 ], [ 96.46334, 38.277616 ], [ 96.665369, 38.23015 ], [ 96.655514, 38.295936 ], [ 96.638883, 38.307208 ], [ 96.626564, 38.356031 ], [ 96.698013, 38.422172 ], [ 96.707868, 38.459203 ], [ 96.6666, 38.483567 ], [ 96.706637, 38.505582 ], [ 96.780549, 38.504177 ], [ 96.800259, 38.52759 ], [ 96.767614, 38.552399 ], [ 96.808882, 38.582346 ], [ 96.7941, 38.608072 ], [ 96.847071, 38.599186 ], [ 96.876636, 38.580475 ], [ 96.961019, 38.558015 ], [ 97.055874, 38.594508 ], [ 97.047251, 38.653888 ], [ 97.057722, 38.67258 ], [ 97.009063, 38.702477 ], [ 97.023229, 38.755699 ], [ 97.00044, 38.7613 ], [ 96.987505, 38.793025 ], [ 96.993664, 38.834993 ], [ 96.983809, 38.869016 ], [ 96.940693, 38.90768 ], [ 96.938846, 38.95563 ], [ 96.965331, 39.017034 ], [ 96.95794, 39.041674 ], [ 96.969643, 39.097895 ], [ 97.012142, 39.142004 ], [ 96.962251, 39.198144 ], [ 97.017686, 39.208347 ], [ 97.060186, 39.19768 ], [ 97.14149, 39.199999 ], [ 97.220946, 39.193042 ], [ 97.315185, 39.164744 ], [ 97.347213, 39.167528 ], [ 97.371235, 39.140611 ], [ 97.401416, 39.146645 ], [ 97.458698, 39.117863 ], [ 97.504894, 39.076527 ], [ 97.58127, 39.052364 ], [ 97.679205, 39.010524 ], [ 97.701379, 38.963076 ], [ 97.828878, 38.93003 ], [ 97.875689, 38.898365 ], [ 98.009348, 38.85923 ], [ 98.029058, 38.834061 ], [ 98.068478, 38.816344 ], [ 98.091884, 38.786495 ], [ 98.167645, 38.840121 ], [ 98.242173, 38.880664 ], [ 98.235398, 38.918855 ], [ 98.276666, 38.963541 ], [ 98.287753, 38.992386 ], [ 98.280977, 39.027263 ], [ 98.316702, 39.040744 ], [ 98.383839, 39.029588 ], [ 98.401086, 39.001688 ], [ 98.432498, 38.996107 ], [ 98.428187, 38.976104 ], [ 98.457752, 38.952838 ], [ 98.526737, 38.95563 ], [ 98.584635, 38.93003 ], [ 98.624056, 38.959353 ], [ 98.612353, 38.977035 ], [ 98.661628, 38.993782 ], [ 98.70536, 39.043533 ], [ 98.730613, 39.057011 ], [ 98.743548, 39.086747 ], [ 98.816845, 39.085818 ], [ 98.818076, 39.064911 ], [ 98.886446, 39.040744 ], [ 98.903076, 39.012384 ], [ 98.951735, 38.987735 ], [ 99.054597, 38.97657 ], [ 99.107568, 38.951907 ], [ 99.071843, 38.921184 ], [ 99.068764, 38.896968 ], [ 99.141445, 38.852706 ], [ 99.222133, 38.788827 ], [ 99.291118, 38.765966 ], [ 99.361951, 38.718354 ], [ 99.375502, 38.684727 ], [ 99.412458, 38.665571 ], [ 99.450646, 38.60433 ], [ 99.501769, 38.612281 ], [ 99.52887, 38.546314 ], [ 99.585537, 38.498556 ], [ 99.63974, 38.474666 ], [ 99.65945, 38.449361 ], [ 99.727203, 38.415607 ], [ 99.758, 38.410449 ], [ 99.826985, 38.370109 ], [ 99.960028, 38.320825 ], [ 100.001912, 38.315191 ], [ 100.049955, 38.283254 ], [ 100.071513, 38.284663 ], [ 100.117093, 38.253652 ], [ 100.126332, 38.231561 ], [ 100.182998, 38.222158 ], [ 100.159592, 38.291239 ], [ 100.163904, 38.328337 ], [ 100.136803, 38.33444 ], [ 100.093071, 38.407166 ], [ 100.022238, 38.432017 ], [ 100.001296, 38.467169 ], [ 100.025933, 38.507923 ], [ 100.064122, 38.518694 ], [ 100.086911, 38.492936 ], [ 100.113397, 38.497151 ], [ 100.163288, 38.461546 ], [ 100.24028, 38.441861 ], [ 100.259374, 38.366355 ], [ 100.301874, 38.388405 ], [ 100.331439, 38.337257 ], [ 100.318505, 38.329276 ], [ 100.396729, 38.293118 ], [ 100.424446, 38.307208 ], [ 100.432453, 38.275267 ], [ 100.459555, 38.2654 ], [ 100.474953, 38.288891 ], [ 100.516837, 38.272448 ], [ 100.545786, 38.247072 ], [ 100.595061, 38.242372 ], [ 100.619083, 38.26587 ], [ 100.71517, 38.253652 ], [ 100.752126, 38.238612 ], [ 100.825423, 38.158658 ], [ 100.860531, 38.148305 ], [ 100.913502, 38.17889 ], [ 100.93814, 38.16007 ], [ 100.91843, 38.129006 ], [ 100.922125, 38.084741 ], [ 100.888864, 38.056001 ], [ 100.895024, 38.013107 ], [ 100.91843, 37.999432 ], [ 100.964009, 38.011221 ], [ 101.077342, 37.941874 ], [ 101.103211, 37.946593 ], [ 101.114298, 37.92016 ], [ 101.152486, 37.891356 ], [ 101.159262, 37.86821 ], [ 101.202994, 37.84742 ], [ 101.276906, 37.83655 ], [ 101.362522, 37.791162 ], [ 101.382848, 37.822369 ], [ 101.459224, 37.86632 ], [ 101.551615, 37.835604 ], [ 101.598427, 37.827569 ], [ 101.670491, 37.754264 ], [ 101.659405, 37.733441 ], [ 101.791832, 37.696041 ], [ 101.815853, 37.654357 ], [ 101.854657, 37.664781 ], [ 101.873135, 37.686569 ], [ 101.946432, 37.728235 ], [ 101.998787, 37.724921 ], [ 102.036359, 37.685149 ], [ 102.048678, 37.651515 ], [ 102.035128, 37.627819 ], [ 102.102265, 37.582304 ], [ 102.131214, 37.54625 ], [ 102.103497, 37.482641 ], [ 102.125055, 37.48549 ], [ 102.176794, 37.458892 ], [ 102.19712, 37.420403 ], [ 102.299981, 37.391404 ], [ 102.29875, 37.370004 ], [ 102.368351, 37.327662 ], [ 102.428097, 37.308624 ], [ 102.419474, 37.294343 ], [ 102.45335, 37.271487 ], [ 102.457662, 37.248147 ], [ 102.490307, 37.223371 ], [ 102.533422, 37.217176 ], [ 102.578386, 37.17284 ], [ 102.599944, 37.174748 ], [ 102.642444, 37.099845 ], [ 102.583314, 37.104618 ], [ 102.488459, 37.078362 ], [ 102.506321, 37.019134 ], [ 102.450271, 36.968467 ], [ 102.499546, 36.954599 ], [ 102.526031, 36.928291 ], [ 102.56114, 36.91968 ], [ 102.587009, 36.869904 ], [ 102.639364, 36.852666 ], [ 102.720052, 36.767858 ], [ 102.692335, 36.775528 ], [ 102.639364, 36.732853 ], [ 102.612879, 36.738129 ], [ 102.601176, 36.710307 ], [ 102.630741, 36.650793 ], [ 102.684328, 36.619097 ], [ 102.724364, 36.613813 ], [ 102.714509, 36.599401 ], [ 102.761936, 36.568645 ], [ 102.734219, 36.562396 ], [ 102.753313, 36.525855 ], [ 102.793349, 36.497957 ], [ 102.771791, 36.47438 ], [ 102.829689, 36.365544 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"640000\", \"name\": \"宁夏回族自治区\", \"center\": [ 106.278179, 38.46637 ], \"centroid\": [ 106.169867, 37.291331 ], \"childrenNum\": 5, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 29, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 107.268764, 37.099367 ], [ 107.234887, 37.096503 ], [ 107.181916, 37.143269 ], [ 107.133873, 37.134681 ], [ 107.095685, 37.115595 ], [ 107.030395, 37.140883 ], [ 107.031011, 37.108436 ], [ 106.998367, 37.106527 ], [ 106.905976, 37.151378 ], [ 106.912135, 37.110345 ], [ 106.891193, 37.098413 ], [ 106.818512, 37.141838 ], [ 106.776012, 37.158056 ], [ 106.772933, 37.120367 ], [ 106.750143, 37.09889 ], [ 106.728585, 37.121321 ], [ 106.687933, 37.12991 ], [ 106.673151, 37.1113 ], [ 106.6171, 37.135158 ], [ 106.605397, 37.127524 ], [ 106.645433, 37.064992 ], [ 106.666991, 37.016745 ], [ 106.646665, 37.000496 ], [ 106.64297, 36.962729 ], [ 106.594926, 36.967988 ], [ 106.595542, 36.94025 ], [ 106.540108, 36.984244 ], [ 106.549347, 36.941685 ], [ 106.601702, 36.918244 ], [ 106.609709, 36.878521 ], [ 106.609709, 36.878521 ], [ 106.626955, 36.892403 ], [ 106.637426, 36.867031 ], [ 106.637426, 36.867031 ], [ 106.657752, 36.820575 ], [ 106.627571, 36.752995 ], [ 106.644817, 36.72278 ], [ 106.59431, 36.750118 ], [ 106.514238, 36.715584 ], [ 106.519782, 36.708868 ], [ 106.519782, 36.708868 ], [ 106.530869, 36.690154 ], [ 106.490833, 36.685835 ], [ 106.491448, 36.628703 ], [ 106.444637, 36.624861 ], [ 106.465579, 36.583063 ], [ 106.444637, 36.557109 ], [ 106.397826, 36.576816 ], [ 106.392282, 36.556628 ], [ 106.363949, 36.577296 ], [ 106.37134, 36.549417 ], [ 106.39721, 36.548455 ], [ 106.455724, 36.496995 ], [ 106.494528, 36.494589 ], [ 106.523477, 36.468605 ], [ 106.492064, 36.422389 ], [ 106.510543, 36.379037 ], [ 106.497608, 36.31348 ], [ 106.470507, 36.306246 ], [ 106.504383, 36.266207 ], [ 106.54134, 36.25366 ], [ 106.559202, 36.292259 ], [ 106.647897, 36.259451 ], [ 106.685469, 36.273445 ], [ 106.698404, 36.244008 ], [ 106.735976, 36.23725 ], [ 106.772933, 36.212628 ], [ 106.808657, 36.21118 ], [ 106.833295, 36.229044 ], [ 106.858548, 36.206834 ], [ 106.858548, 36.206834 ], [ 106.873947, 36.178338 ], [ 106.873947, 36.178338 ], [ 106.930613, 36.138716 ], [ 106.925686, 36.115997 ], [ 106.957715, 36.091337 ], [ 106.940468, 36.064734 ], [ 106.928149, 36.011502 ], [ 106.94786, 35.988262 ], [ 106.90228, 35.943699 ], [ 106.93862, 35.952905 ], [ 106.940468, 35.931101 ], [ 106.912751, 35.93207 ], [ 106.849925, 35.887476 ], [ 106.927534, 35.810346 ], [ 106.897353, 35.759856 ], [ 106.868403, 35.771996 ], [ 106.867171, 35.738485 ], [ 106.819128, 35.7448 ], [ 106.806193, 35.70982 ], [ 106.750759, 35.725369 ], [ 106.750759, 35.689408 ], [ 106.674998, 35.728284 ], [ 106.66268, 35.70739 ], [ 106.633115, 35.714679 ], [ 106.620796, 35.743829 ], [ 106.595542, 35.727312 ], [ 106.566593, 35.738971 ], [ 106.506231, 35.737514 ], [ 106.49268, 35.732656 ], [ 106.434782, 35.688436 ], [ 106.460036, 35.643705 ], [ 106.47913, 35.575101 ], [ 106.460036, 35.578995 ], [ 106.440941, 35.52641 ], [ 106.465579, 35.481101 ], [ 106.490217, 35.480613 ], [ 106.483441, 35.450393 ], [ 106.503767, 35.415284 ], [ 106.501304, 35.364056 ], [ 106.472354, 35.310842 ], [ 106.415688, 35.276161 ], [ 106.368261, 35.273718 ], [ 106.363333, 35.238532 ], [ 106.319601, 35.265411 ], [ 106.241377, 35.358687 ], [ 106.237681, 35.409431 ], [ 106.196414, 35.409919 ], [ 106.173008, 35.437716 ], [ 106.129892, 35.393333 ], [ 106.113262, 35.361616 ], [ 106.083081, 35.421624 ], [ 106.073226, 35.447468 ], [ 106.071378, 35.449418 ], [ 106.073226, 35.450393 ], [ 106.073842, 35.45478 ], [ 106.06953, 35.458193 ], [ 106.071994, 35.463555 ], [ 106.078769, 35.509848 ], [ 106.047356, 35.498155 ], [ 106.023335, 35.49377 ], [ 106.017175, 35.519103 ], [ 105.900147, 35.54735 ], [ 105.868734, 35.540046 ], [ 105.847176, 35.490359 ], [ 105.816379, 35.575101 ], [ 105.800365, 35.564878 ], [ 105.762176, 35.602841 ], [ 105.759097, 35.634464 ], [ 105.713517, 35.650513 ], [ 105.722756, 35.673366 ], [ 105.690727, 35.698643 ], [ 105.723988, 35.725854 ], [ 105.740618, 35.698643 ], [ 105.759097, 35.724883 ], [ 105.70243, 35.733142 ], [ 105.667322, 35.749657 ], [ 105.595873, 35.715651 ], [ 105.481924, 35.727312 ], [ 105.457286, 35.771511 ], [ 105.432033, 35.787533 ], [ 105.428953, 35.819082 ], [ 105.408627, 35.822479 ], [ 105.38091, 35.792873 ], [ 105.371055, 35.844312 ], [ 105.39754, 35.857409 ], [ 105.350113, 35.875839 ], [ 105.324859, 35.941761 ], [ 105.343954, 36.033767 ], [ 105.406163, 36.074409 ], [ 105.430801, 36.10391 ], [ 105.491163, 36.101009 ], [ 105.515185, 36.147415 ], [ 105.478844, 36.213111 ], [ 105.460366, 36.223733 ], [ 105.45975, 36.268137 ], [ 105.476381, 36.293224 ], [ 105.455439, 36.321678 ], [ 105.425873, 36.330357 ], [ 105.401236, 36.369881 ], [ 105.398156, 36.430575 ], [ 105.363048, 36.443093 ], [ 105.362432, 36.496514 ], [ 105.322396, 36.535954 ], [ 105.281744, 36.522489 ], [ 105.252179, 36.553263 ], [ 105.2762, 36.563358 ], [ 105.261418, 36.602764 ], [ 105.22015, 36.631105 ], [ 105.225693, 36.664716 ], [ 105.201056, 36.700711 ], [ 105.218302, 36.730455 ], [ 105.272505, 36.739567 ], [ 105.275584, 36.752515 ], [ 105.319932, 36.742924 ], [ 105.340874, 36.764502 ], [ 105.334714, 36.80093 ], [ 105.303302, 36.820575 ], [ 105.279896, 36.86751 ], [ 105.244787, 36.894796 ], [ 105.178882, 36.892403 ], [ 105.185657, 36.942164 ], [ 105.165331, 36.99476 ], [ 105.128991, 36.996194 ], [ 105.05939, 37.022956 ], [ 105.03968, 37.007187 ], [ 105.004571, 37.035378 ], [ 104.95468, 37.040156 ], [ 104.954064, 37.077407 ], [ 104.914644, 37.097935 ], [ 104.888158, 37.15901 ], [ 104.864753, 37.17284 ], [ 104.85613, 37.211933 ], [ 104.776673, 37.246718 ], [ 104.717543, 37.208597 ], [ 104.638087, 37.201923 ], [ 104.600515, 37.242907 ], [ 104.624536, 37.298627 ], [ 104.651022, 37.290534 ], [ 104.673812, 37.317668 ], [ 104.713848, 37.329566 ], [ 104.662109, 37.367626 ], [ 104.679971, 37.408044 ], [ 104.521059, 37.43466 ], [ 104.499501, 37.421353 ], [ 104.448994, 37.42468 ], [ 104.437907, 37.445589 ], [ 104.365226, 37.418026 ], [ 104.298705, 37.414223 ], [ 104.287002, 37.428007 ], [ 104.322726, 37.44844 ], [ 104.407726, 37.464592 ], [ 104.419429, 37.511604 ], [ 104.433595, 37.515402 ], [ 104.623305, 37.522522 ], [ 104.805007, 37.539133 ], [ 104.866601, 37.566651 ], [ 105.027977, 37.580881 ], [ 105.111128, 37.633981 ], [ 105.187505, 37.657674 ], [ 105.221998, 37.677097 ], [ 105.315004, 37.702197 ], [ 105.4037, 37.710246 ], [ 105.467141, 37.695094 ], [ 105.598952, 37.699356 ], [ 105.616199, 37.722555 ], [ 105.622358, 37.777919 ], [ 105.677177, 37.771769 ], [ 105.760944, 37.799674 ], [ 105.80406, 37.862068 ], [ 105.799749, 37.939986 ], [ 105.840401, 38.004147 ], [ 105.780655, 38.084741 ], [ 105.76772, 38.121474 ], [ 105.775111, 38.186887 ], [ 105.802828, 38.220277 ], [ 105.842248, 38.240962 ], [ 105.86627, 38.296406 ], [ 105.821307, 38.366824 ], [ 105.835473, 38.387467 ], [ 105.827466, 38.432486 ], [ 105.850872, 38.443736 ], [ 105.836705, 38.476071 ], [ 105.863806, 38.53508 ], [ 105.856415, 38.569714 ], [ 105.874277, 38.593105 ], [ 105.852719, 38.641735 ], [ 105.894603, 38.696405 ], [ 105.88598, 38.716953 ], [ 105.908154, 38.737496 ], [ 105.909386, 38.791159 ], [ 105.992538, 38.857366 ], [ 105.97098, 38.909077 ], [ 106.021487, 38.953769 ], [ 106.060907, 38.96866 ], [ 106.087392, 39.006339 ], [ 106.078153, 39.026333 ], [ 106.096631, 39.084889 ], [ 106.145907, 39.153142 ], [ 106.170544, 39.163352 ], [ 106.192718, 39.142932 ], [ 106.251232, 39.131327 ], [ 106.285109, 39.146181 ], [ 106.29558, 39.167992 ], [ 106.280181, 39.262118 ], [ 106.402753, 39.291767 ], [ 106.511774, 39.272311 ], [ 106.525325, 39.308439 ], [ 106.556122, 39.322329 ], [ 106.602318, 39.37555 ], [ 106.643586, 39.357969 ], [ 106.683622, 39.357506 ], [ 106.751375, 39.381564 ], [ 106.781556, 39.371849 ], [ 106.806809, 39.318625 ], [ 106.806193, 39.277407 ], [ 106.790795, 39.241263 ], [ 106.795723, 39.214375 ], [ 106.825288, 39.19397 ], [ 106.859164, 39.107648 ], [ 106.878874, 39.091392 ], [ 106.933693, 39.076527 ], [ 106.96757, 39.054688 ], [ 106.971881, 39.026333 ], [ 106.954019, 38.941202 ], [ 106.837606, 38.847579 ], [ 106.756302, 38.748699 ], [ 106.709491, 38.718821 ], [ 106.66268, 38.601524 ], [ 106.647897, 38.470917 ], [ 106.599854, 38.389812 ], [ 106.482209, 38.319417 ], [ 106.555506, 38.263521 ], [ 106.627571, 38.232501 ], [ 106.654672, 38.22921 ], [ 106.737824, 38.197706 ], [ 106.779092, 38.171833 ], [ 106.858548, 38.156306 ], [ 106.942316, 38.132302 ], [ 107.010069, 38.120532 ], [ 107.051337, 38.122886 ], [ 107.071047, 38.138892 ], [ 107.119091, 38.134185 ], [ 107.138801, 38.161011 ], [ 107.19054, 38.153953 ], [ 107.240431, 38.111586 ], [ 107.33159, 38.086625 ], [ 107.3938, 38.014993 ], [ 107.440611, 37.995659 ], [ 107.411662, 37.948009 ], [ 107.448618, 37.933378 ], [ 107.49235, 37.944706 ], [ 107.560719, 37.893717 ], [ 107.65003, 37.86443 ], [ 107.659269, 37.844112 ], [ 107.646335, 37.805349 ], [ 107.620465, 37.776026 ], [ 107.599523, 37.791162 ], [ 107.57119, 37.776499 ], [ 107.499125, 37.765619 ], [ 107.484959, 37.706458 ], [ 107.425828, 37.684201 ], [ 107.387024, 37.691305 ], [ 107.389488, 37.671413 ], [ 107.422133, 37.665254 ], [ 107.361155, 37.613125 ], [ 107.311264, 37.609806 ], [ 107.330358, 37.584201 ], [ 107.369162, 37.58752 ], [ 107.345756, 37.518725 ], [ 107.284162, 37.481691 ], [ 107.282931, 37.437036 ], [ 107.257677, 37.337179 ], [ 107.273075, 37.29101 ], [ 107.309416, 37.239095 ], [ 107.270612, 37.229089 ], [ 107.317423, 37.200017 ], [ 107.336517, 37.165687 ], [ 107.334669, 37.138975 ], [ 107.306952, 37.100799 ], [ 107.281083, 37.127047 ], [ 107.268764, 37.099367 ] ] ], [ [ [ 106.048588, 35.488898 ], [ 106.054132, 35.45478 ], [ 106.034422, 35.469404 ], [ 106.002393, 35.438692 ], [ 105.894603, 35.413821 ], [ 105.897683, 35.451368 ], [ 106.048588, 35.488898 ] ] ], [ [ [ 106.073842, 35.45478 ], [ 106.073226, 35.450393 ], [ 106.071378, 35.449418 ], [ 106.06953, 35.458193 ], [ 106.073842, 35.45478 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"650000\", \"name\": \"新疆维吾尔自治区\", \"center\": [ 87.617733, 43.792818 ], \"centroid\": [ 85.294711, 41.371801 ], \"childrenNum\": 24, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 30, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 96.386348, 42.727592 ], [ 96.166458, 42.623314 ], [ 96.103632, 42.604375 ], [ 96.072219, 42.569566 ], [ 96.02356, 42.542675 ], [ 96.0174, 42.482239 ], [ 95.978596, 42.436762 ], [ 96.06606, 42.414674 ], [ 96.042038, 42.352787 ], [ 96.040806, 42.326688 ], [ 96.178161, 42.21775 ], [ 96.077147, 42.149457 ], [ 96.13874, 42.05399 ], [ 96.137509, 42.019765 ], [ 96.117183, 41.985966 ], [ 96.054973, 41.936124 ], [ 95.998306, 41.906289 ], [ 95.855408, 41.849699 ], [ 95.801206, 41.848361 ], [ 95.759322, 41.835878 ], [ 95.65646, 41.826067 ], [ 95.57146, 41.796181 ], [ 95.445193, 41.719841 ], [ 95.39407, 41.693481 ], [ 95.335556, 41.644305 ], [ 95.299831, 41.565994 ], [ 95.247476, 41.61344 ], [ 95.194505, 41.694821 ], [ 95.199433, 41.719395 ], [ 95.16494, 41.735474 ], [ 95.135991, 41.772976 ], [ 95.110738, 41.768513 ], [ 95.011572, 41.726541 ], [ 94.969072, 41.718948 ], [ 94.861898, 41.668451 ], [ 94.809543, 41.619256 ], [ 94.750413, 41.538227 ], [ 94.534219, 41.505966 ], [ 94.184365, 41.268444 ], [ 94.01067, 41.114875 ], [ 93.908424, 40.983539 ], [ 93.809874, 40.879548 ], [ 93.820961, 40.793519 ], [ 93.760599, 40.664721 ], [ 93.506216, 40.648376 ], [ 92.928465, 40.572504 ], [ 92.920458, 40.391792 ], [ 92.906907, 40.310609 ], [ 92.796654, 40.153897 ], [ 92.745531, 39.868331 ], [ 92.687632, 39.657174 ], [ 92.639589, 39.514196 ], [ 92.52564, 39.368611 ], [ 92.378431, 39.258411 ], [ 92.339011, 39.236628 ], [ 92.343938, 39.146181 ], [ 92.366112, 39.096037 ], [ 92.366728, 39.059335 ], [ 92.41046, 39.03842 ], [ 92.416003, 39.010524 ], [ 92.380279, 38.999828 ], [ 92.263866, 39.002153 ], [ 92.197961, 38.983548 ], [ 92.173323, 38.960749 ], [ 92.10865, 38.963541 ], [ 91.966368, 38.930961 ], [ 91.880752, 38.899297 ], [ 91.87952, 38.884391 ], [ 91.806223, 38.872744 ], [ 91.694738, 38.86622 ], [ 91.681188, 38.852706 ], [ 91.501333, 38.815411 ], [ 91.446515, 38.813546 ], [ 91.298689, 38.746365 ], [ 91.242639, 38.752433 ], [ 91.188436, 38.73096 ], [ 90.992567, 38.695003 ], [ 90.970394, 38.697806 ], [ 90.899561, 38.679588 ], [ 90.724634, 38.658094 ], [ 90.65996, 38.674449 ], [ 90.619308, 38.664636 ], [ 90.645794, 38.635191 ], [ 90.606374, 38.610878 ], [ 90.608837, 38.594508 ], [ 90.560794, 38.593573 ], [ 90.525685, 38.561291 ], [ 90.463476, 38.556611 ], [ 90.465323, 38.521971 ], [ 90.427135, 38.493873 ], [ 90.353222, 38.482162 ], [ 90.315034, 38.501835 ], [ 90.248513, 38.491531 ], [ 90.130868, 38.494341 ], [ 90.111774, 38.477945 ], [ 90.111774, 38.418889 ], [ 90.129636, 38.400131 ], [ 90.179528, 38.396848 ], [ 90.137644, 38.340543 ], [ 90.280542, 38.238142 ], [ 90.352607, 38.233441 ], [ 90.361846, 38.300163 ], [ 90.401882, 38.311434 ], [ 90.531229, 38.319886 ], [ 90.516446, 38.207111 ], [ 90.519526, 37.730601 ], [ 90.579272, 37.720661 ], [ 90.586663, 37.703144 ], [ 90.643946, 37.696988 ], [ 90.777605, 37.648672 ], [ 90.820104, 37.613599 ], [ 90.854597, 37.604117 ], [ 90.882314, 37.575664 ], [ 90.865684, 37.53059 ], [ 90.911879, 37.519674 ], [ 90.958075, 37.477891 ], [ 91.019669, 37.493088 ], [ 91.073256, 37.475992 ], [ 91.099741, 37.447965 ], [ 91.113292, 37.387124 ], [ 91.136081, 37.355734 ], [ 91.134849, 37.324331 ], [ 91.194596, 37.273868 ], [ 91.1909, 37.205737 ], [ 91.280211, 37.163779 ], [ 91.286371, 37.105095 ], [ 91.303617, 37.083136 ], [ 91.291298, 37.042544 ], [ 91.303617, 37.012444 ], [ 91.216153, 37.010054 ], [ 91.181045, 37.025345 ], [ 91.133618, 37.007665 ], [ 91.126842, 36.978507 ], [ 91.051698, 36.96751 ], [ 91.036915, 36.929727 ], [ 90.983944, 36.913459 ], [ 90.924198, 36.921115 ], [ 90.853981, 36.915373 ], [ 90.758511, 36.825844 ], [ 90.732025, 36.825844 ], [ 90.727098, 36.755872 ], [ 90.754815, 36.721341 ], [ 90.720938, 36.708868 ], [ 90.706156, 36.658955 ], [ 90.730793, 36.655594 ], [ 90.72217, 36.620058 ], [ 90.741264, 36.585947 ], [ 90.810865, 36.585466 ], [ 90.831191, 36.55807 ], [ 90.905104, 36.560474 ], [ 91.011662, 36.539801 ], [ 91.035683, 36.529703 ], [ 91.039995, 36.474861 ], [ 91.028292, 36.443093 ], [ 91.051698, 36.433946 ], [ 91.026444, 36.323607 ], [ 91.07264, 36.299012 ], [ 91.051698, 36.238215 ], [ 91.096045, 36.219871 ], [ 91.09235, 36.163844 ], [ 91.124994, 36.115514 ], [ 91.081263, 36.088436 ], [ 90.979017, 36.106811 ], [ 90.922966, 36.028927 ], [ 90.850285, 36.016827 ], [ 90.815793, 36.035703 ], [ 90.776373, 36.086501 ], [ 90.659344, 36.13485 ], [ 90.613149, 36.126632 ], [ 90.534925, 36.147899 ], [ 90.478258, 36.13195 ], [ 90.424055, 36.133883 ], [ 90.325505, 36.159496 ], [ 90.23681, 36.160462 ], [ 90.198006, 36.187516 ], [ 90.130252, 36.2078 ], [ 90.145651, 36.239181 ], [ 90.058188, 36.255591 ], [ 90.043405, 36.276822 ], [ 90.003369, 36.278752 ], [ 90.028006, 36.258486 ], [ 90.019999, 36.213594 ], [ 89.997825, 36.168193 ], [ 89.944855, 36.140649 ], [ 89.941159, 36.067637 ], [ 89.914058, 36.079246 ], [ 89.819819, 36.080697 ], [ 89.766848, 36.073925 ], [ 89.711414, 36.093272 ], [ 89.614711, 36.109712 ], [ 89.594385, 36.126632 ], [ 89.490291, 36.151281 ], [ 89.375727, 36.228078 ], [ 89.335075, 36.23725 ], [ 89.292575, 36.231457 ], [ 89.232213, 36.295636 ], [ 89.198952, 36.260417 ], [ 89.126887, 36.254626 ], [ 89.10225, 36.281164 ], [ 89.054822, 36.291777 ], [ 89.013554, 36.315409 ], [ 88.964279, 36.318785 ], [ 88.926091, 36.36458 ], [ 88.870657, 36.348193 ], [ 88.838628, 36.353496 ], [ 88.802903, 36.33807 ], [ 88.783809, 36.291777 ], [ 88.766563, 36.292259 ], [ 88.690186, 36.367954 ], [ 88.623665, 36.389636 ], [ 88.618121, 36.428168 ], [ 88.573158, 36.461386 ], [ 88.498629, 36.446463 ], [ 88.470912, 36.48208 ], [ 88.41055, 36.473418 ], [ 88.356963, 36.477268 ], [ 88.366202, 36.458016 ], [ 88.282434, 36.470049 ], [ 88.241782, 36.468605 ], [ 88.222688, 36.447426 ], [ 88.182652, 36.452721 ], [ 88.134609, 36.427205 ], [ 88.092109, 36.43539 ], [ 88.006494, 36.430575 ], [ 87.983088, 36.437797 ], [ 87.95845, 36.408423 ], [ 87.919646, 36.39349 ], [ 87.838342, 36.383855 ], [ 87.826023, 36.391563 ], [ 87.767509, 36.3747 ], [ 87.731785, 36.384818 ], [ 87.6203, 36.360243 ], [ 87.570409, 36.342409 ], [ 87.470626, 36.354459 ], [ 87.460155, 36.409868 ], [ 87.426895, 36.42576 ], [ 87.386859, 36.412757 ], [ 87.363453, 36.420463 ], [ 87.348055, 36.393008 ], [ 87.292004, 36.358797 ], [ 87.193454, 36.349158 ], [ 87.161425, 36.325535 ], [ 87.149106, 36.297565 ], [ 87.08628, 36.310587 ], [ 87.051788, 36.2966 ], [ 86.996353, 36.308658 ], [ 86.943998, 36.284058 ], [ 86.931064, 36.265242 ], [ 86.887332, 36.262829 ], [ 86.86331, 36.299977 ], [ 86.836209, 36.291294 ], [ 86.746282, 36.291777 ], [ 86.69947, 36.24449 ], [ 86.599072, 36.222285 ], [ 86.531935, 36.227113 ], [ 86.515305, 36.205385 ], [ 86.454943, 36.221319 ], [ 86.392733, 36.206834 ], [ 86.35824, 36.168676 ], [ 86.2794, 36.170608 ], [ 86.248603, 36.141616 ], [ 86.187625, 36.130983 ], [ 86.182081, 36.064734 ], [ 86.199944, 36.047801 ], [ 86.173458, 36.008113 ], [ 86.150668, 36.00424 ], [ 86.129111, 35.941761 ], [ 86.093386, 35.906868 ], [ 86.090306, 35.876809 ], [ 86.05335, 35.842857 ], [ 86.035488, 35.846738 ], [ 85.949256, 35.778794 ], [ 85.903677, 35.78462 ], [ 85.835308, 35.771996 ], [ 85.811286, 35.778794 ], [ 85.691178, 35.751114 ], [ 85.65299, 35.731199 ], [ 85.612953, 35.651486 ], [ 85.566142, 35.6403 ], [ 85.518715, 35.680658 ], [ 85.373969, 35.700101 ], [ 85.341324, 35.753543 ], [ 85.271107, 35.788989 ], [ 85.146071, 35.742371 ], [ 85.053065, 35.752086 ], [ 84.99455, 35.737028 ], [ 84.973608, 35.709334 ], [ 84.920022, 35.696213 ], [ 84.798066, 35.647595 ], [ 84.729081, 35.613546 ], [ 84.704443, 35.616951 ], [ 84.628067, 35.595055 ], [ 84.570168, 35.588242 ], [ 84.513502, 35.564391 ], [ 84.448828, 35.550272 ], [ 84.475929, 35.516181 ], [ 84.45314, 35.473303 ], [ 84.424191, 35.466479 ], [ 84.333032, 35.413821 ], [ 84.274517, 35.404065 ], [ 84.200605, 35.381135 ], [ 84.160569, 35.359663 ], [ 84.140859, 35.379184 ], [ 84.095895, 35.362592 ], [ 84.077417, 35.400163 ], [ 84.005968, 35.422599 ], [ 83.906186, 35.40309 ], [ 83.885244, 35.367472 ], [ 83.79778, 35.354783 ], [ 83.785462, 35.36308 ], [ 83.677672, 35.361128 ], [ 83.622238, 35.335256 ], [ 83.599448, 35.351366 ], [ 83.54155, 35.341603 ], [ 83.540318, 35.364056 ], [ 83.502745, 35.360639 ], [ 83.449159, 35.382111 ], [ 83.405427, 35.380648 ], [ 83.333978, 35.397236 ], [ 83.280391, 35.401138 ], [ 83.251442, 35.417722 ], [ 83.178145, 35.38943 ], [ 83.127022, 35.398699 ], [ 83.088834, 35.425526 ], [ 83.067892, 35.46258 ], [ 82.998907, 35.484512 ], [ 82.971806, 35.548324 ], [ 82.981661, 35.599922 ], [ 82.956407, 35.636409 ], [ 82.967494, 35.667532 ], [ 82.894813, 35.673852 ], [ 82.873871, 35.688922 ], [ 82.795031, 35.688436 ], [ 82.780249, 35.666073 ], [ 82.731589, 35.637868 ], [ 82.652133, 35.67288 ], [ 82.628727, 35.692324 ], [ 82.546192, 35.708362 ], [ 82.501844, 35.701073 ], [ 82.468583, 35.717595 ], [ 82.424852, 35.712736 ], [ 82.392823, 35.656349 ], [ 82.336156, 35.651486 ], [ 82.350323, 35.611113 ], [ 82.328149, 35.559523 ], [ 82.2992, 35.544916 ], [ 82.263475, 35.547837 ], [ 82.234526, 35.520565 ], [ 82.189563, 35.513258 ], [ 82.164925, 35.495719 ], [ 82.086701, 35.467454 ], [ 82.071302, 35.450393 ], [ 82.034346, 35.451855 ], [ 82.029419, 35.426013 ], [ 82.05344, 35.35039 ], [ 82.030034, 35.321585 ], [ 81.99123, 35.30547 ], [ 81.955506, 35.307423 ], [ 81.927789, 35.271275 ], [ 81.853876, 35.25857 ], [ 81.804601, 35.270786 ], [ 81.736847, 35.26248 ], [ 81.68634, 35.235599 ], [ 81.513261, 35.23511 ], [ 81.504638, 35.279092 ], [ 81.447972, 35.318167 ], [ 81.441196, 35.333303 ], [ 81.385762, 35.335256 ], [ 81.363588, 35.354783 ], [ 81.314313, 35.337209 ], [ 81.285364, 35.345508 ], [ 81.26627, 35.322562 ], [ 81.219458, 35.319144 ], [ 81.191741, 35.36552 ], [ 81.142466, 35.365032 ], [ 81.103662, 35.386015 ], [ 81.09935, 35.40748 ], [ 81.054387, 35.402602 ], [ 81.031597, 35.380648 ], [ 81.030981, 35.337209 ], [ 81.002648, 35.334768 ], [ 81.026053, 35.31133 ], [ 80.963844, 35.310842 ], [ 80.924423, 35.330862 ], [ 80.894242, 35.324027 ], [ 80.844351, 35.345508 ], [ 80.759968, 35.334768 ], [ 80.689135, 35.339162 ], [ 80.690982, 35.364544 ], [ 80.65649, 35.393821 ], [ 80.599823, 35.409431 ], [ 80.56841, 35.391381 ], [ 80.532686, 35.404553 ], [ 80.514824, 35.391869 ], [ 80.444607, 35.417235 ], [ 80.432904, 35.449418 ], [ 80.375006, 35.387966 ], [ 80.321419, 35.38699 ], [ 80.286926, 35.35283 ], [ 80.267832, 35.295701 ], [ 80.362687, 35.20871 ], [ 80.257977, 35.203331 ], [ 80.223484, 35.177409 ], [ 80.23026, 35.147565 ], [ 80.118159, 35.066293 ], [ 80.078123, 35.076578 ], [ 80.031311, 35.034447 ], [ 80.04363, 35.022196 ], [ 80.02392, 34.971209 ], [ 80.041782, 34.943252 ], [ 80.034391, 34.902033 ], [ 80.003594, 34.895162 ], [ 79.996819, 34.856375 ], [ 79.961094, 34.862759 ], [ 79.926602, 34.849499 ], [ 79.947544, 34.821008 ], [ 79.898268, 34.732035 ], [ 79.906892, 34.683821 ], [ 79.866856, 34.671517 ], [ 79.88595, 34.642965 ], [ 79.84345, 34.55725 ], [ 79.861312, 34.528166 ], [ 79.801566, 34.478847 ], [ 79.735661, 34.471447 ], [ 79.699936, 34.477861 ], [ 79.675914, 34.451216 ], [ 79.58106, 34.456151 ], [ 79.545335, 34.476381 ], [ 79.504683, 34.45467 ], [ 79.435082, 34.447761 ], [ 79.363017, 34.428018 ], [ 79.326677, 34.44332 ], [ 79.274322, 34.435916 ], [ 79.241677, 34.415183 ], [ 79.179467, 34.422588 ], [ 79.161605, 34.441345 ], [ 79.072294, 34.412714 ], [ 79.039033, 34.421601 ], [ 79.0107, 34.399877 ], [ 79.048888, 34.348506 ], [ 79.039649, 34.33467 ], [ 78.973128, 34.362833 ], [ 78.958961, 34.386049 ], [ 78.899831, 34.354929 ], [ 78.878273, 34.391481 ], [ 78.809288, 34.432955 ], [ 78.742766, 34.45467 ], [ 78.758781, 34.481807 ], [ 78.715049, 34.502031 ], [ 78.708274, 34.522249 ], [ 78.634977, 34.538026 ], [ 78.58139, 34.505483 ], [ 78.562912, 34.51288 ], [ 78.559832, 34.55725 ], [ 78.542586, 34.574499 ], [ 78.492695, 34.578441 ], [ 78.436029, 34.543942 ], [ 78.427405, 34.594207 ], [ 78.397224, 34.605538 ], [ 78.346101, 34.60406 ], [ 78.280812, 34.623269 ], [ 78.265413, 34.651335 ], [ 78.267261, 34.705472 ], [ 78.213059, 34.717771 ], [ 78.21429, 34.760556 ], [ 78.230921, 34.776288 ], [ 78.237696, 34.882398 ], [ 78.206283, 34.891726 ], [ 78.182262, 34.936874 ], [ 78.201972, 34.974642 ], [ 78.160704, 34.990823 ], [ 78.123131, 35.036897 ], [ 78.150849, 35.069721 ], [ 78.124979, 35.108407 ], [ 78.078784, 35.100084 ], [ 78.062769, 35.114772 ], [ 78.060306, 35.180344 ], [ 78.01719, 35.228267 ], [ 78.020885, 35.315237 ], [ 78.013494, 35.366008 ], [ 78.046755, 35.384063 ], [ 78.107117, 35.437229 ], [ 78.113892, 35.466967 ], [ 78.140378, 35.494745 ], [ 78.048603, 35.491334 ], [ 78.029509, 35.469404 ], [ 78.009799, 35.491821 ], [ 77.951284, 35.478664 ], [ 77.917408, 35.490847 ], [ 77.914944, 35.465017 ], [ 77.870596, 35.495232 ], [ 77.85643, 35.487436 ], [ 77.816394, 35.518616 ], [ 77.797299, 35.491334 ], [ 77.757879, 35.497181 ], [ 77.735706, 35.461605 ], [ 77.690742, 35.448443 ], [ 77.657481, 35.477689 ], [ 77.639619, 35.45478 ], [ 77.590344, 35.460143 ], [ 77.578025, 35.47574 ], [ 77.518895, 35.482075 ], [ 77.451758, 35.46063 ], [ 77.396939, 35.467942 ], [ 77.355055, 35.494257 ], [ 77.331649, 35.530793 ], [ 77.307628, 35.540533 ], [ 77.195527, 35.519103 ], [ 77.093281, 35.569746 ], [ 77.072339, 35.591162 ], [ 76.99781, 35.611113 ], [ 76.967013, 35.591649 ], [ 76.906651, 35.615005 ], [ 76.848753, 35.668018 ], [ 76.769297, 35.653917 ], [ 76.69292, 35.747714 ], [ 76.593754, 35.771996 ], [ 76.566037, 35.819082 ], [ 76.587595, 35.840431 ], [ 76.579587, 35.866625 ], [ 76.59745, 35.895718 ], [ 76.55803, 35.923347 ], [ 76.51553, 35.881173 ], [ 76.471798, 35.886021 ], [ 76.431762, 35.851589 ], [ 76.369552, 35.86323 ], [ 76.365857, 35.82442 ], [ 76.298719, 35.841401 ], [ 76.228502, 35.837035 ], [ 76.221727, 35.823449 ], [ 76.160133, 35.82442 ], [ 76.146582, 35.839946 ], [ 76.16506, 35.908807 ], [ 76.117017, 35.975186 ], [ 76.097307, 36.022635 ], [ 76.044336, 36.026991 ], [ 76.028322, 36.016827 ], [ 75.982742, 36.031347 ], [ 75.949482, 36.070056 ], [ 75.936547, 36.13485 ], [ 75.96796, 36.159013 ], [ 76.016619, 36.165294 ], [ 76.011691, 36.229044 ], [ 76.060967, 36.225182 ], [ 76.055423, 36.252695 ], [ 75.998757, 36.312034 ], [ 75.991365, 36.35205 ], [ 76.035097, 36.409386 ], [ 75.991981, 36.505654 ], [ 75.924228, 36.566242 ], [ 75.947018, 36.590752 ], [ 75.871257, 36.666636 ], [ 75.8072, 36.707908 ], [ 75.724048, 36.750597 ], [ 75.634121, 36.771693 ], [ 75.588541, 36.762584 ], [ 75.537418, 36.773131 ], [ 75.536802, 36.729975 ], [ 75.504773, 36.743404 ], [ 75.458578, 36.720861 ], [ 75.425933, 36.778883 ], [ 75.434556, 36.83303 ], [ 75.430245, 36.873255 ], [ 75.396368, 36.904367 ], [ 75.413614, 36.954599 ], [ 75.345861, 36.960816 ], [ 75.288579, 36.974682 ], [ 75.244847, 36.963207 ], [ 75.16847, 36.991892 ], [ 75.172166, 37.013877 ], [ 75.063145, 37.006231 ], [ 75.032348, 37.016745 ], [ 75.005862, 36.99476 ], [ 74.927638, 36.978029 ], [ 74.938725, 36.94312 ], [ 74.893762, 36.939772 ], [ 74.86974, 36.990458 ], [ 74.84387, 37.0134 ], [ 74.84695, 37.056873 ], [ 74.806914, 37.054485 ], [ 74.792747, 37.027257 ], [ 74.739161, 37.028212 ], [ 74.70898, 37.084569 ], [ 74.632603, 37.066425 ], [ 74.617205, 37.043499 ], [ 74.56793, 37.032512 ], [ 74.530357, 37.082182 ], [ 74.498944, 37.072155 ], [ 74.496481, 37.116072 ], [ 74.465068, 37.147085 ], [ 74.487858, 37.161871 ], [ 74.477387, 37.19954 ], [ 74.511263, 37.240048 ], [ 74.54514, 37.2491 ], [ 74.578401, 37.231472 ], [ 74.598727, 37.258151 ], [ 74.642458, 37.261485 ], [ 74.665864, 37.23576 ], [ 74.727458, 37.282916 ], [ 74.753943, 37.281011 ], [ 74.800139, 37.248147 ], [ 74.816153, 37.216699 ], [ 74.911008, 37.233378 ], [ 74.927022, 37.277678 ], [ 75.018181, 37.293867 ], [ 75.078543, 37.318144 ], [ 75.125971, 37.322427 ], [ 75.140137, 37.355258 ], [ 75.125971, 37.388075 ], [ 75.153072, 37.414223 ], [ 75.129666, 37.459367 ], [ 75.090862, 37.486915 ], [ 75.078543, 37.511129 ], [ 75.035428, 37.500685 ], [ 75.002167, 37.511604 ], [ 75.000935, 37.53059 ], [ 74.940573, 37.559061 ], [ 74.891914, 37.668097 ], [ 74.920863, 37.684675 ], [ 74.923327, 37.717347 ], [ 74.949196, 37.725395 ], [ 75.006478, 37.770823 ], [ 74.989848, 37.797783 ], [ 74.917167, 37.845057 ], [ 74.936877, 37.876241 ], [ 74.919015, 37.908357 ], [ 74.911008, 37.966884 ], [ 74.92579, 38.01735 ], [ 74.879595, 38.021122 ], [ 74.821697, 38.10311 ], [ 74.80445, 38.167128 ], [ 74.816769, 38.215576 ], [ 74.793363, 38.271039 ], [ 74.806914, 38.285602 ], [ 74.789668, 38.324581 ], [ 74.834015, 38.361193 ], [ 74.868508, 38.403883 ], [ 74.862965, 38.484035 ], [ 74.821697, 38.491062 ], [ 74.78474, 38.538357 ], [ 74.717603, 38.542102 ], [ 74.639995, 38.599653 ], [ 74.613509, 38.593105 ], [ 74.546988, 38.607604 ], [ 74.506336, 38.637528 ], [ 74.455829, 38.632853 ], [ 74.421952, 38.647812 ], [ 74.353583, 38.655757 ], [ 74.229779, 38.656224 ], [ 74.147859, 38.676785 ], [ 74.11275, 38.611345 ], [ 74.088113, 38.610878 ], [ 74.068403, 38.585621 ], [ 74.090577, 38.542102 ], [ 74.034526, 38.541634 ], [ 74.011736, 38.52478 ], [ 73.926121, 38.536016 ], [ 73.89902, 38.579071 ], [ 73.852208, 38.584217 ], [ 73.799237, 38.610878 ], [ 73.809092, 38.634256 ], [ 73.757353, 38.719755 ], [ 73.769056, 38.775765 ], [ 73.729636, 38.837324 ], [ 73.699455, 38.857832 ], [ 73.70931, 38.893241 ], [ 73.742571, 38.933754 ], [ 73.767824, 38.941202 ], [ 73.826339, 38.916993 ], [ 73.846665, 38.962145 ], [ 73.839889, 39.008199 ], [ 73.820179, 39.041674 ], [ 73.780143, 39.026798 ], [ 73.743187, 39.029588 ], [ 73.720397, 39.071881 ], [ 73.719781, 39.108112 ], [ 73.688368, 39.154999 ], [ 73.657571, 39.166136 ], [ 73.639709, 39.220402 ], [ 73.623079, 39.235237 ], [ 73.580579, 39.237555 ], [ 73.564564, 39.266288 ], [ 73.542391, 39.269531 ], [ 73.554709, 39.295935 ], [ 73.554094, 39.350102 ], [ 73.502355, 39.383877 ], [ 73.592898, 39.412087 ], [ 73.61076, 39.465702 ], [ 73.6471, 39.474479 ], [ 73.745651, 39.462005 ], [ 73.836194, 39.472169 ], [ 73.868223, 39.482794 ], [ 73.893476, 39.528046 ], [ 73.883621, 39.540969 ], [ 73.914418, 39.564041 ], [ 73.916266, 39.586644 ], [ 73.953838, 39.600018 ], [ 73.924273, 39.722108 ], [ 73.905795, 39.741899 ], [ 73.841737, 39.756163 ], [ 73.845433, 39.831115 ], [ 73.907027, 39.873843 ], [ 73.910722, 39.934443 ], [ 73.980324, 40.004617 ], [ 73.943367, 40.016076 ], [ 74.008041, 40.050901 ], [ 74.023439, 40.085251 ], [ 74.113366, 40.086624 ], [ 74.126301, 40.104479 ], [ 74.26304, 40.125074 ], [ 74.280902, 40.09807 ], [ 74.316626, 40.106767 ], [ 74.356662, 40.089371 ], [ 74.433039, 40.13148 ], [ 74.485394, 40.182251 ], [ 74.534669, 40.207851 ], [ 74.577169, 40.260391 ], [ 74.618437, 40.27957 ], [ 74.673255, 40.278656 ], [ 74.697893, 40.310153 ], [ 74.700357, 40.346195 ], [ 74.824776, 40.344371 ], [ 74.862965, 40.32658 ], [ 74.908544, 40.338897 ], [ 74.795211, 40.443278 ], [ 74.814921, 40.461039 ], [ 74.819233, 40.505647 ], [ 74.844486, 40.521117 ], [ 74.891914, 40.507467 ], [ 74.963363, 40.464681 ], [ 74.995392, 40.455119 ], [ 75.021877, 40.466958 ], [ 75.051442, 40.449654 ], [ 75.102565, 40.44009 ], [ 75.13521, 40.463315 ], [ 75.206659, 40.447833 ], [ 75.242383, 40.448743 ], [ 75.268869, 40.483802 ], [ 75.292274, 40.483802 ], [ 75.355716, 40.537947 ], [ 75.432093, 40.563412 ], [ 75.467817, 40.599773 ], [ 75.550353, 40.64883 ], [ 75.599628, 40.659727 ], [ 75.636584, 40.624306 ], [ 75.627345, 40.605226 ], [ 75.631041, 40.548862 ], [ 75.646439, 40.516567 ], [ 75.733287, 40.474242 ], [ 75.717272, 40.443278 ], [ 75.686475, 40.418223 ], [ 75.669845, 40.363982 ], [ 75.688323, 40.343915 ], [ 75.709265, 40.280939 ], [ 75.739446, 40.299199 ], [ 75.785642, 40.301025 ], [ 75.831221, 40.327492 ], [ 75.84046, 40.312434 ], [ 75.890351, 40.30924 ], [ 75.921764, 40.291439 ], [ 75.932235, 40.339353 ], [ 75.986438, 40.381763 ], [ 76.026474, 40.355317 ], [ 76.048648, 40.357141 ], [ 76.048648, 40.388601 ], [ 76.081293, 40.39635 ], [ 76.144118, 40.393615 ], [ 76.176147, 40.381307 ], [ 76.22419, 40.401819 ], [ 76.279625, 40.439179 ], [ 76.283321, 40.415034 ], [ 76.327668, 40.391336 ], [ 76.333212, 40.343459 ], [ 76.381871, 40.39088 ], [ 76.390494, 40.37766 ], [ 76.442233, 40.391336 ], [ 76.470566, 40.422779 ], [ 76.508754, 40.429613 ], [ 76.539551, 40.464226 ], [ 76.543247, 40.513837 ], [ 76.556798, 40.542495 ], [ 76.601145, 40.578868 ], [ 76.611, 40.601591 ], [ 76.657196, 40.620218 ], [ 76.654732, 40.652917 ], [ 76.676906, 40.696036 ], [ 76.646725, 40.73686 ], [ 76.646725, 40.759983 ], [ 76.693536, 40.779472 ], [ 76.731724, 40.818887 ], [ 76.741579, 40.912119 ], [ 76.761905, 40.954167 ], [ 76.817956, 40.975406 ], [ 76.85368, 40.97631 ], [ 76.885709, 41.027347 ], [ 76.940528, 41.028701 ], [ 77.002122, 41.073381 ], [ 77.023064, 41.059394 ], [ 77.091433, 41.062553 ], [ 77.108063, 41.038181 ], [ 77.169041, 41.009285 ], [ 77.236795, 41.027798 ], [ 77.296541, 41.004769 ], [ 77.363062, 41.04089 ], [ 77.415417, 41.038633 ], [ 77.473931, 41.022832 ], [ 77.476395, 40.999349 ], [ 77.540453, 41.006575 ], [ 77.591576, 40.992122 ], [ 77.597119, 41.005221 ], [ 77.654402, 41.016059 ], [ 77.684583, 41.00793 ], [ 77.737553, 41.032313 ], [ 77.780669, 41.022832 ], [ 77.796068, 41.049014 ], [ 77.829328, 41.059394 ], [ 77.807155, 41.091876 ], [ 77.814546, 41.13426 ], [ 77.836104, 41.153189 ], [ 77.905089, 41.185174 ], [ 77.972842, 41.173013 ], [ 78.094798, 41.224347 ], [ 78.129291, 41.228398 ], [ 78.136682, 41.279239 ], [ 78.165015, 41.340825 ], [ 78.149617, 41.368228 ], [ 78.163783, 41.383497 ], [ 78.235232, 41.399211 ], [ 78.324544, 41.384395 ], [ 78.338094, 41.397415 ], [ 78.385522, 41.394721 ], [ 78.391681, 41.408189 ], [ 78.454507, 41.412228 ], [ 78.527188, 41.440947 ], [ 78.580774, 41.481759 ], [ 78.650375, 41.467411 ], [ 78.675629, 41.50238 ], [ 78.707042, 41.522098 ], [ 78.696571, 41.54181 ], [ 78.739071, 41.555695 ], [ 78.825302, 41.560173 ], [ 78.86657, 41.593749 ], [ 78.891824, 41.597777 ], [ 78.957729, 41.65146 ], [ 78.99407, 41.664427 ], [ 79.021787, 41.657273 ], [ 79.043345, 41.681414 ], [ 79.10925, 41.697503 ], [ 79.138199, 41.722968 ], [ 79.21704, 41.725648 ], [ 79.271858, 41.767174 ], [ 79.276786, 41.78101 ], [ 79.326061, 41.809565 ], [ 79.356242, 41.795735 ], [ 79.415372, 41.836769 ], [ 79.457256, 41.847915 ], [ 79.500988, 41.835432 ], [ 79.550879, 41.834094 ], [ 79.616784, 41.856385 ], [ 79.640806, 41.884907 ], [ 79.724574, 41.896935 ], [ 79.776313, 41.89248 ], [ 79.822508, 41.963275 ], [ 79.854537, 41.984186 ], [ 79.852689, 42.015319 ], [ 79.923522, 42.042436 ], [ 80.089826, 42.047325 ], [ 80.14218, 42.03488 ], [ 80.193303, 42.081535 ], [ 80.16805, 42.096635 ], [ 80.139717, 42.151232 ], [ 80.163738, 42.152563 ], [ 80.168666, 42.200462 ], [ 80.233339, 42.210215 ], [ 80.28631, 42.233261 ], [ 80.29247, 42.259842 ], [ 80.272144, 42.281984 ], [ 80.283847, 42.320493 ], [ 80.229028, 42.358536 ], [ 80.239499, 42.389927 ], [ 80.206238, 42.431462 ], [ 80.225948, 42.485769 ], [ 80.265368, 42.502097 ], [ 80.221637, 42.533415 ], [ 80.180985, 42.590718 ], [ 80.163738, 42.629919 ], [ 80.179753, 42.670415 ], [ 80.228412, 42.692852 ], [ 80.225948, 42.713083 ], [ 80.259209, 42.790865 ], [ 80.262289, 42.828623 ], [ 80.280151, 42.838278 ], [ 80.338049, 42.831695 ], [ 80.407034, 42.834767 ], [ 80.450766, 42.861971 ], [ 80.503737, 42.882146 ], [ 80.602903, 42.894424 ], [ 80.5912, 42.923354 ], [ 80.487106, 42.948766 ], [ 80.397795, 42.996933 ], [ 80.378701, 43.031502 ], [ 80.416889, 43.05687 ], [ 80.482795, 43.06955 ], [ 80.556092, 43.104515 ], [ 80.593048, 43.133347 ], [ 80.650946, 43.147321 ], [ 80.706997, 43.143828 ], [ 80.73225, 43.131163 ], [ 80.752576, 43.148194 ], [ 80.79446, 43.137277 ], [ 80.804315, 43.178314 ], [ 80.789533, 43.201876 ], [ 80.788917, 43.242433 ], [ 80.769207, 43.265535 ], [ 80.777214, 43.308227 ], [ 80.69283, 43.32042 ], [ 80.686055, 43.333916 ], [ 80.735946, 43.389609 ], [ 80.746417, 43.439167 ], [ 80.761199, 43.446554 ], [ 80.75504, 43.494329 ], [ 80.522215, 43.816473 ], [ 80.511128, 43.906657 ], [ 80.475404, 43.938124 ], [ 80.485259, 43.95579 ], [ 80.457541, 43.981203 ], [ 80.458773, 44.047054 ], [ 80.449534, 44.078017 ], [ 80.3941, 44.127009 ], [ 80.407034, 44.149772 ], [ 80.400875, 44.198704 ], [ 80.413194, 44.264741 ], [ 80.399027, 44.30587 ], [ 80.383013, 44.401297 ], [ 80.350368, 44.484615 ], [ 80.411962, 44.605321 ], [ 80.400259, 44.628751 ], [ 80.313412, 44.704938 ], [ 80.238883, 44.7228 ], [ 80.200695, 44.756808 ], [ 80.178521, 44.796741 ], [ 80.18776, 44.825612 ], [ 80.169898, 44.84471 ], [ 80.115695, 44.815424 ], [ 80.087978, 44.817122 ], [ 79.999283, 44.793768 ], [ 79.991891, 44.830281 ], [ 79.953703, 44.849377 ], [ 79.969102, 44.877797 ], [ 79.887798, 44.90917 ], [ 79.944464, 44.937985 ], [ 79.951855, 44.957892 ], [ 79.98142, 44.964244 ], [ 80.056565, 45.011227 ], [ 80.060876, 45.026033 ], [ 80.111999, 45.052675 ], [ 80.136021, 45.041259 ], [ 80.144644, 45.059017 ], [ 80.195767, 45.030686 ], [ 80.24381, 45.031532 ], [ 80.291854, 45.06578 ], [ 80.328194, 45.070007 ], [ 80.358375, 45.040836 ], [ 80.404571, 45.049293 ], [ 80.443991, 45.077614 ], [ 80.445839, 45.097895 ], [ 80.493882, 45.127037 ], [ 80.519135, 45.108878 ], [ 80.599207, 45.105921 ], [ 80.686055, 45.129148 ], [ 80.731634, 45.156164 ], [ 80.816634, 45.152788 ], [ 80.862214, 45.127037 ], [ 80.897938, 45.127459 ], [ 80.93551, 45.160384 ], [ 80.966307, 45.168402 ], [ 81.024821, 45.162916 ], [ 81.080872, 45.182745 ], [ 81.111669, 45.218168 ], [ 81.170183, 45.211001 ], [ 81.175111, 45.227863 ], [ 81.236705, 45.247248 ], [ 81.284748, 45.23882 ], [ 81.327864, 45.260729 ], [ 81.382066, 45.257781 ], [ 81.398697, 45.275471 ], [ 81.437501, 45.28263 ], [ 81.462754, 45.264099 ], [ 81.52866, 45.285999 ], [ 81.536667, 45.304101 ], [ 81.575471, 45.30789 ], [ 81.582863, 45.336503 ], [ 81.645072, 45.359216 ], [ 81.677101, 45.35459 ], [ 81.78797, 45.3836 ], [ 81.832318, 45.319673 ], [ 81.879745, 45.284314 ], [ 81.921013, 45.233342 ], [ 81.993078, 45.237978 ], [ 82.052824, 45.255674 ], [ 82.09594, 45.249776 ], [ 82.091012, 45.222383 ], [ 82.109491, 45.211422 ], [ 82.206809, 45.236713 ], [ 82.294272, 45.247669 ], [ 82.344779, 45.219011 ], [ 82.487061, 45.181058 ], [ 82.562822, 45.204676 ], [ 82.58746, 45.224069 ], [ 82.60101, 45.346178 ], [ 82.546808, 45.426038 ], [ 82.448257, 45.461309 ], [ 82.281954, 45.53891 ], [ 82.266555, 45.620172 ], [ 82.288729, 45.655321 ], [ 82.289961, 45.71636 ], [ 82.340468, 45.772742 ], [ 82.349707, 45.822811 ], [ 82.336156, 45.882418 ], [ 82.342932, 45.935303 ], [ 82.401446, 45.972333 ], [ 82.461808, 45.97982 ], [ 82.518474, 46.153798 ], [ 82.609017, 46.294985 ], [ 82.726662, 46.494756 ], [ 82.774089, 46.600124 ], [ 82.788872, 46.677784 ], [ 82.829524, 46.772551 ], [ 82.878183, 46.797138 ], [ 82.876335, 46.823762 ], [ 82.923762, 46.932169 ], [ 82.937929, 47.014248 ], [ 82.993364, 47.065229 ], [ 83.031552, 47.168265 ], [ 83.02724, 47.21544 ], [ 83.108544, 47.221944 ], [ 83.15474, 47.236168 ], [ 83.17445, 47.218286 ], [ 83.207094, 47.213814 ], [ 83.221877, 47.186977 ], [ 83.257602, 47.173147 ], [ 83.306261, 47.179656 ], [ 83.324739, 47.167858 ], [ 83.370318, 47.178436 ], [ 83.418978, 47.119012 ], [ 83.463325, 47.132042 ], [ 83.53847, 47.083977 ], [ 83.566803, 47.080717 ], [ 83.576042, 47.059114 ], [ 83.700462, 47.032199 ], [ 83.69923, 47.015472 ], [ 83.766367, 47.026896 ], [ 83.88586, 46.982003 ], [ 83.932671, 46.970161 ], [ 83.951765, 46.98731 ], [ 84.002888, 46.990576 ], [ 84.038613, 46.973428 ], [ 84.086656, 46.965261 ], [ 84.150098, 46.977512 ], [ 84.195061, 47.003638 ], [ 84.2893, 46.994658 ], [ 84.336727, 47.00527 ], [ 84.37122, 46.993434 ], [ 84.425422, 47.008943 ], [ 84.506726, 46.97302 ], [ 84.563393, 46.991801 ], [ 84.668718, 46.995067 ], [ 84.699515, 47.008535 ], [ 84.748175, 47.009759 ], [ 84.781435, 46.979962 ], [ 84.849189, 46.957092 ], [ 84.867051, 46.927673 ], [ 84.934188, 46.863878 ], [ 84.95513, 46.861013 ], [ 84.979768, 46.883106 ], [ 84.987159, 46.918272 ], [ 85.082014, 46.939933 ], [ 85.102956, 46.968936 ], [ 85.175637, 46.997924 ], [ 85.213825, 47.041172 ], [ 85.276651, 47.068898 ], [ 85.325926, 47.044842 ], [ 85.355491, 47.054629 ], [ 85.441106, 47.063191 ], [ 85.545816, 47.057891 ], [ 85.547048, 47.096609 ], [ 85.582772, 47.142626 ], [ 85.641903, 47.18413 ], [ 85.682555, 47.222757 ], [ 85.682555, 47.249982 ], [ 85.701033, 47.28856 ], [ 85.675779, 47.321837 ], [ 85.701649, 47.384275 ], [ 85.685018, 47.428829 ], [ 85.614801, 47.498015 ], [ 85.617881, 47.550552 ], [ 85.547048, 48.008205 ], [ 85.531649, 48.046227 ], [ 85.551975, 48.081423 ], [ 85.55136, 48.127781 ], [ 85.576613, 48.15853 ], [ 85.587084, 48.191654 ], [ 85.622193, 48.202824 ], [ 85.633895, 48.232731 ], [ 85.678243, 48.266205 ], [ 85.695489, 48.302445 ], [ 85.695489, 48.335078 ], [ 85.758315, 48.403064 ], [ 85.791576, 48.418954 ], [ 85.916612, 48.438015 ], [ 86.053966, 48.441192 ], [ 86.225813, 48.432456 ], [ 86.270161, 48.452307 ], [ 86.305269, 48.491984 ], [ 86.38103, 48.49357 ], [ 86.416138, 48.481671 ], [ 86.579978, 48.538763 ], [ 86.594761, 48.576789 ], [ 86.635413, 48.612016 ], [ 86.640956, 48.629027 ], [ 86.693311, 48.64366 ], [ 86.70255, 48.666195 ], [ 86.771535, 48.717156 ], [ 86.780774, 48.731369 ], [ 86.754289, 48.78463 ], [ 86.770303, 48.810255 ], [ 86.818963, 48.831139 ], [ 86.821426, 48.850439 ], [ 86.782006, 48.887049 ], [ 86.757985, 48.894919 ], [ 86.730267, 48.959797 ], [ 86.732115, 48.994757 ], [ 86.772151, 49.02773 ], [ 86.836209, 49.051269 ], [ 86.84976, 49.066563 ], [ 86.854071, 49.109284 ], [ 86.887948, 49.132001 ], [ 86.953853, 49.131218 ], [ 87.000049, 49.142572 ], [ 87.088128, 49.133567 ], [ 87.112766, 49.15549 ], [ 87.211932, 49.140615 ], [ 87.239033, 49.114376 ], [ 87.304939, 49.112418 ], [ 87.388707, 49.097921 ], [ 87.43675, 49.075188 ], [ 87.511894, 49.10184 ], [ 87.49588, 49.132001 ], [ 87.517438, 49.145704 ], [ 87.563017, 49.142572 ], [ 87.602437, 49.152359 ], [ 87.67635, 49.15549 ], [ 87.700372, 49.175839 ], [ 87.762582, 49.172709 ], [ 87.793379, 49.18249 ], [ 87.821096, 49.173883 ], [ 87.82048, 49.148445 ], [ 87.845733, 49.146096 ], [ 87.867291, 49.108892 ], [ 87.844502, 49.090084 ], [ 87.858052, 49.07362 ], [ 87.835263, 49.054406 ], [ 87.883306, 49.023806 ], [ 87.883922, 48.993971 ], [ 87.911639, 48.979833 ], [ 87.871603, 48.963726 ], [ 87.87653, 48.949186 ], [ 87.814321, 48.945256 ], [ 87.793995, 48.927565 ], [ 87.760118, 48.925992 ], [ 87.742256, 48.881146 ], [ 87.78106, 48.872094 ], [ 87.792147, 48.849258 ], [ 87.829103, 48.825623 ], [ 87.803234, 48.824835 ], [ 87.826639, 48.800795 ], [ 87.872219, 48.799612 ], [ 87.93874, 48.757809 ], [ 87.96153, 48.773588 ], [ 88.029283, 48.750313 ], [ 88.064392, 48.712813 ], [ 88.090877, 48.71992 ], [ 88.089645, 48.69504 ], [ 88.02682, 48.65315 ], [ 88.010805, 48.618742 ], [ 87.96153, 48.599353 ], [ 87.973233, 48.575997 ], [ 88.041602, 48.548272 ], [ 88.10874, 48.545895 ], [ 88.130297, 48.521721 ], [ 88.151855, 48.526478 ], [ 88.196819, 48.493967 ], [ 88.229464, 48.498329 ], [ 88.318159, 48.478497 ], [ 88.363123, 48.460641 ], [ 88.360659, 48.433251 ], [ 88.438267, 48.393528 ], [ 88.462289, 48.392335 ], [ 88.503557, 48.412996 ], [ 88.523267, 48.403461 ], [ 88.535586, 48.368884 ], [ 88.573158, 48.369679 ], [ 88.573774, 48.351785 ], [ 88.605803, 48.337863 ], [ 88.575006, 48.277757 ], [ 88.594716, 48.259831 ], [ 88.601491, 48.221567 ], [ 88.638447, 48.183674 ], [ 88.668628, 48.171303 ], [ 88.700657, 48.180881 ], [ 88.721599, 48.160526 ], [ 88.79736, 48.133772 ], [ 88.824461, 48.107005 ], [ 88.939026, 48.115396 ], [ 88.953808, 48.090618 ], [ 89.027105, 48.051028 ], [ 89.044967, 48.009806 ], [ 89.078228, 47.98698 ], [ 89.156452, 47.996992 ], [ 89.231597, 47.98017 ], [ 89.282104, 47.994189 ], [ 89.308589, 48.021816 ], [ 89.359712, 48.026219 ], [ 89.38127, 48.046227 ], [ 89.498299, 48.02822 ], [ 89.569132, 48.037825 ], [ 89.599313, 48.015811 ], [ 89.595617, 47.973359 ], [ 89.645508, 47.947711 ], [ 89.651052, 47.913627 ], [ 89.735435, 47.89758 ], [ 89.761921, 47.835751 ], [ 89.86971, 47.834144 ], [ 89.957789, 47.842982 ], [ 89.960253, 47.885942 ], [ 90.040941, 47.874704 ], [ 90.066195, 47.883534 ], [ 90.086521, 47.86547 ], [ 90.070506, 47.820483 ], [ 90.07605, 47.777469 ], [ 90.13518, 47.723147 ], [ 90.180144, 47.72516 ], [ 90.216484, 47.70543 ], [ 90.331665, 47.681663 ], [ 90.384635, 47.644179 ], [ 90.346447, 47.637324 ], [ 90.376012, 47.603036 ], [ 90.398186, 47.547724 ], [ 90.468403, 47.497611 ], [ 90.474562, 47.462422 ], [ 90.459164, 47.43895 ], [ 90.468403, 47.404937 ], [ 90.507823, 47.400076 ], [ 90.526301, 47.379007 ], [ 90.488113, 47.317374 ], [ 90.521374, 47.2845 ], [ 90.56141, 47.206903 ], [ 90.579888, 47.198364 ], [ 90.653801, 47.111681 ], [ 90.691989, 47.080717 ], [ 90.767134, 46.992617 ], [ 90.830575, 46.995883 ], [ 90.901408, 46.960768 ], [ 90.92235, 46.938707 ], [ 90.929742, 46.893331 ], [ 90.958075, 46.879425 ], [ 90.942676, 46.82581 ], [ 90.992567, 46.790583 ], [ 90.992567, 46.769682 ], [ 91.019053, 46.766402 ], [ 91.054161, 46.717598 ], [ 91.036299, 46.670393 ], [ 91.017821, 46.58244 ], [ 91.068328, 46.579149 ], [ 91.079415, 46.558989 ], [ 91.060937, 46.516999 ], [ 91.038147, 46.500936 ], [ 91.025828, 46.444057 ], [ 90.996263, 46.419309 ], [ 90.983328, 46.374734 ], [ 90.900177, 46.31235 ], [ 90.955611, 46.233752 ], [ 90.94822, 46.219262 ], [ 90.98456, 46.160431 ], [ 91.021517, 46.121038 ], [ 91.014741, 46.06667 ], [ 91.028292, 46.023054 ], [ 90.890937, 45.921566 ], [ 90.799778, 45.834905 ], [ 90.714779, 45.728895 ], [ 90.676591, 45.582488 ], [ 90.671047, 45.487747 ], [ 90.723402, 45.464667 ], [ 90.772677, 45.432338 ], [ 90.773909, 45.405874 ], [ 90.813329, 45.32851 ], [ 90.804706, 45.29484 ], [ 90.831807, 45.300313 ], [ 90.877387, 45.280946 ], [ 90.897713, 45.249776 ], [ 90.866916, 45.209314 ], [ 90.881698, 45.192025 ], [ 90.96177, 45.201303 ], [ 91.007966, 45.218589 ], [ 91.050466, 45.208892 ], [ 91.129922, 45.21606 ], [ 91.17119, 45.199616 ], [ 91.195827, 45.159118 ], [ 91.230936, 45.153632 ], [ 91.242023, 45.13717 ], [ 91.33503, 45.129571 ], [ 91.37753, 45.11099 ], [ 91.429268, 45.156586 ], [ 91.448978, 45.156586 ], [ 91.500101, 45.103809 ], [ 91.561695, 45.075501 ], [ 91.694738, 45.065357 ], [ 91.803144, 45.082685 ], [ 91.885679, 45.078882 ], [ 92.056911, 45.086911 ], [ 92.100026, 45.081417 ], [ 92.240461, 45.015881 ], [ 92.315605, 45.028994 ], [ 92.348866, 45.014188 ], [ 92.414155, 45.018419 ], [ 92.501003, 45.001072 ], [ 92.547814, 45.018419 ], [ 92.683937, 45.02561 ], [ 92.779407, 45.050561 ], [ 92.847777, 45.038721 ], [ 92.884117, 45.046756 ], [ 92.922921, 45.03703 ], [ 92.932776, 45.017573 ], [ 93.002377, 45.009958 ], [ 93.062124, 45.018419 ], [ 93.100312, 45.007419 ], [ 93.174225, 45.015458 ], [ 93.252449, 44.991761 ], [ 93.314043, 44.980333 ], [ 93.314659, 44.995147 ], [ 93.376869, 44.985412 ], [ 93.434767, 44.955351 ], [ 93.509296, 44.968055 ], [ 93.613389, 44.926546 ], [ 93.716251, 44.894334 ], [ 93.723642, 44.865498 ], [ 94.066105, 44.732154 ], [ 94.152336, 44.684944 ], [ 94.215162, 44.667921 ], [ 94.227481, 44.645785 ], [ 94.279836, 44.603617 ], [ 94.329727, 44.582734 ], [ 94.359292, 44.515775 ], [ 94.390705, 44.521749 ], [ 94.470777, 44.509373 ], [ 94.557008, 44.462408 ], [ 94.606283, 44.448311 ], [ 94.673421, 44.397021 ], [ 94.722696, 44.34055 ], [ 94.768275, 44.34055 ], [ 94.826174, 44.320001 ], [ 94.945666, 44.292592 ], [ 94.998637, 44.253169 ], [ 95.1286, 44.269884 ], [ 95.238853, 44.277169 ], [ 95.41378, 44.298589 ], [ 95.43041, 44.281882 ], [ 95.4107, 44.245024 ], [ 95.376208, 44.227444 ], [ 95.355882, 44.166087 ], [ 95.35157, 44.090054 ], [ 95.326932, 44.028554 ], [ 95.377439, 44.025972 ], [ 95.426099, 44.009618 ], [ 95.527113, 44.007466 ], [ 95.623199, 43.855756 ], [ 95.645373, 43.787966 ], [ 95.705735, 43.67077 ], [ 95.735916, 43.597569 ], [ 95.857872, 43.417436 ], [ 95.880046, 43.28035 ], [ 95.921314, 43.229789 ], [ 96.363558, 42.900562 ], [ 96.386348, 42.727592 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"710000\", \"name\": \"台湾省\", \"center\": [ 121.509062, 25.044332 ], \"centroid\": [ 120.971485, 23.749452 ], \"childrenNum\": 0, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 31, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 120.443706, 22.441432 ], [ 120.297112, 22.531565 ], [ 120.274323, 22.560307 ], [ 120.20041, 22.721039 ], [ 120.149287, 22.896468 ], [ 120.133272, 23.000625 ], [ 120.029795, 23.048544 ], [ 120.018708, 23.073322 ], [ 120.081534, 23.291728 ], [ 120.108019, 23.341191 ], [ 120.12157, 23.504836 ], [ 120.095084, 23.58768 ], [ 120.102476, 23.701162 ], [ 120.175156, 23.807427 ], [ 120.245989, 23.840276 ], [ 120.278018, 23.92783 ], [ 120.316206, 23.984708 ], [ 120.391967, 24.118055 ], [ 120.451713, 24.182493 ], [ 120.470807, 24.242533 ], [ 120.520698, 24.311816 ], [ 120.546568, 24.370159 ], [ 120.589068, 24.43229 ], [ 120.642654, 24.490033 ], [ 120.68885, 24.600542 ], [ 120.762147, 24.658208 ], [ 120.82374, 24.688118 ], [ 120.89211, 24.767482 ], [ 120.914899, 24.864715 ], [ 120.961095, 24.940167 ], [ 121.009754, 24.993878 ], [ 121.024537, 25.040517 ], [ 121.102145, 25.075214 ], [ 121.132942, 25.078466 ], [ 121.209318, 25.12724 ], [ 121.319572, 25.140785 ], [ 121.371926, 25.159746 ], [ 121.413194, 25.238806 ], [ 121.444607, 25.27074 ], [ 121.53515, 25.307535 ], [ 121.585041, 25.309159 ], [ 121.62323, 25.29455 ], [ 121.655259, 25.242054 ], [ 121.700222, 25.226896 ], [ 121.707613, 25.191701 ], [ 121.745186, 25.161912 ], [ 121.782142, 25.160287 ], [ 121.841888, 25.135367 ], [ 121.917033, 25.138076 ], [ 121.947214, 25.031841 ], [ 121.98109, 25.030757 ], [ 122.012503, 25.001471 ], [ 121.933047, 24.938539 ], [ 121.844968, 24.836476 ], [ 121.841272, 24.734329 ], [ 121.86283, 24.671261 ], [ 121.892395, 24.617953 ], [ 121.88562, 24.529784 ], [ 121.867758, 24.47914 ], [ 121.82649, 24.423572 ], [ 121.809243, 24.339083 ], [ 121.689135, 24.174303 ], [ 121.678048, 24.133895 ], [ 121.643556, 24.097843 ], [ 121.63986, 24.064514 ], [ 121.65957, 24.007125 ], [ 121.621382, 23.920718 ], [ 121.587505, 23.760878 ], [ 121.522832, 23.538858 ], [ 121.5216, 23.483431 ], [ 121.497578, 23.419744 ], [ 121.479716, 23.322507 ], [ 121.440296, 23.271937 ], [ 121.415042, 23.196047 ], [ 121.430441, 23.137175 ], [ 121.409499, 23.1025 ], [ 121.370695, 23.084334 ], [ 121.35468, 23.00999 ], [ 121.324499, 22.945526 ], [ 121.276456, 22.877171 ], [ 121.237652, 22.836362 ], [ 121.21055, 22.770711 ], [ 121.170514, 22.723247 ], [ 121.078739, 22.669691 ], [ 121.03316, 22.650914 ], [ 121.014682, 22.584069 ], [ 120.981421, 22.528248 ], [ 120.914899, 22.302525 ], [ 120.903197, 22.12634 ], [ 120.912436, 22.086418 ], [ 120.907508, 22.033171 ], [ 120.86624, 21.984345 ], [ 120.873016, 21.897191 ], [ 120.854537, 21.883309 ], [ 120.781857, 21.923843 ], [ 120.743052, 21.915515 ], [ 120.701784, 21.927174 ], [ 120.667908, 21.983235 ], [ 120.651277, 22.033171 ], [ 120.661748, 22.067007 ], [ 120.659285, 22.154056 ], [ 120.640806, 22.241605 ], [ 120.569973, 22.361757 ], [ 120.517619, 22.408793 ], [ 120.443706, 22.441432 ] ] ], [ [ [ 124.541855565478286, 25.891845867343921 ], [ 124.530097884119826, 25.910742140955961 ], [ 124.518340202761223, 25.930898166142125 ], [ 124.541015731095655, 25.946015185031744 ], [ 124.566804, 25.941563 ], [ 124.584666, 25.908731 ], [ 124.568730265726629, 25.884707275090506 ], [ 124.541855565478286, 25.891845867343921 ] ] ], [ [ [ 123.445178, 25.726102 ], [ 123.438733103727387, 25.753273194189074 ], [ 123.468967141506624, 25.783087314776932 ], [ 123.513478363792743, 25.768810130270065 ], [ 123.510958860644465, 25.71464081258226 ], [ 123.468547224315259, 25.703722965606424 ], [ 123.445178, 25.726102 ] ] ], [ [ [ 119.646064, 23.550928 ], [ 119.609108, 23.503738 ], [ 119.578927, 23.502641 ], [ 119.562297, 23.530627 ], [ 119.566608, 23.584937 ], [ 119.601717, 23.575613 ], [ 119.61034, 23.604132 ], [ 119.678093, 23.600294 ], [ 119.691028, 23.547087 ], [ 119.646064, 23.550928 ] ] ], [ [ [ 123.652470954139019, 25.910742140955957 ], [ 123.675986316856211, 25.947274936605876 ], [ 123.705800437444026, 25.935517255247277 ], [ 123.71503861565435, 25.912421809721465 ], [ 123.696562259233758, 25.878828434411201 ], [ 123.66968755898553, 25.88680686104739 ], [ 123.652470954139019, 25.910742140955957 ] ] ], [ [ [ 119.506246, 23.625518 ], [ 119.52534, 23.62497 ], [ 119.519181, 23.559705 ], [ 119.47237, 23.556962 ], [ 119.506246, 23.577259 ], [ 119.506246, 23.625518 ] ] ], [ [ [ 119.497623, 23.38679 ], [ 119.516717, 23.349982 ], [ 119.495159, 23.349982 ], [ 119.497623, 23.38679 ] ] ], [ [ [ 119.557369, 23.666634 ], [ 119.586318, 23.675952 ], [ 119.615268, 23.661153 ], [ 119.608492, 23.620035 ], [ 119.557369, 23.666634 ] ] ], [ [ [ 122.066706, 25.6247 ], [ 122.092575, 25.639268 ], [ 122.087032, 25.61067 ], [ 122.066706, 25.6247 ] ] ], [ [ [ 121.468013, 22.67687 ], [ 121.514824, 22.676318 ], [ 121.513592, 22.631582 ], [ 121.474788, 22.643734 ], [ 121.468013, 22.67687 ] ] ], [ [ [ 121.510513, 22.086972 ], [ 121.575802, 22.0842 ], [ 121.575186, 22.037055 ], [ 121.604752, 22.022631 ], [ 121.594281, 21.995443 ], [ 121.533918, 22.022076 ], [ 121.507433, 22.048704 ], [ 121.510513, 22.086972 ] ] ], [ [ [ 122.097503, 25.499987 ], [ 122.122141, 25.495666 ], [ 122.110438, 25.465952 ], [ 122.097503, 25.499987 ] ] ], [ [ [ 119.421247, 23.216949 ], [ 119.453275, 23.216399 ], [ 119.436029, 23.186146 ], [ 119.421247, 23.216949 ] ] ], [ [ [ 120.355011, 22.327439 ], [ 120.383344, 22.355669 ], [ 120.395663, 22.342385 ], [ 120.355011, 22.327439 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"810000\", \"name\": \"香港特别行政区\", \"center\": [ 114.173355, 22.320048 ], \"centroid\": [ 114.134391, 22.37737 ], \"childrenNum\": 18, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 32, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 114.031778, 22.503923 ], [ 114.082285, 22.512216 ], [ 114.095219, 22.534329 ], [ 114.156813, 22.543726 ], [ 114.166052, 22.559201 ], [ 114.222719, 22.553122 ], [ 114.232574, 22.539857 ], [ 114.232574, 22.528801 ], [ 114.260291, 22.547595 ], [ 114.263371, 22.541515 ], [ 114.263987, 22.541515 ], [ 114.28924, 22.52272 ], [ 114.309566, 22.497288 ], [ 114.340979, 22.50337 ], [ 114.2529, 22.445304 ], [ 114.23319, 22.466875 ], [ 114.205473, 22.449729 ], [ 114.220255, 22.427603 ], [ 114.278769, 22.435901 ], [ 114.325581, 22.479041 ], [ 114.376088, 22.436454 ], [ 114.406269, 22.433688 ], [ 114.406269, 22.432582 ], [ 114.385327, 22.41156 ], [ 114.394566, 22.361757 ], [ 114.356994, 22.340171 ], [ 114.323733, 22.384447 ], [ 114.323733, 22.385001 ], [ 114.323117, 22.385554 ], [ 114.322501, 22.385554 ], [ 114.283081, 22.386661 ], [ 114.278153, 22.328546 ], [ 114.315726, 22.299756 ], [ 114.315726, 22.299203 ], [ 114.313262, 22.264315 ], [ 114.284929, 22.263761 ], [ 114.262139, 22.294773 ], [ 114.248588, 22.274837 ], [ 114.265835, 22.200608 ], [ 114.203009, 22.206703 ], [ 114.200545, 22.232188 ], [ 114.164821, 22.226648 ], [ 114.120473, 22.272068 ], [ 114.145726, 22.300864 ], [ 114.121089, 22.320795 ], [ 114.069966, 22.326885 ], [ 114.034857, 22.300864 ], [ 114.029314, 22.262653 ], [ 114.004676, 22.239389 ], [ 114.026234, 22.229418 ], [ 113.996669, 22.206149 ], [ 113.981271, 22.229972 ], [ 113.935691, 22.205041 ], [ 113.899351, 22.215568 ], [ 113.852539, 22.191188 ], [ 113.8433, 22.229418 ], [ 113.889496, 22.271514 ], [ 113.898119, 22.308615 ], [ 113.969568, 22.321349 ], [ 113.955401, 22.298649 ], [ 114.026234, 22.34792 ], [ 113.980039, 22.366185 ], [ 113.941235, 22.355116 ], [ 113.920293, 22.367845 ], [ 113.918445, 22.418199 ], [ 113.977575, 22.45692 ], [ 114.000981, 22.491206 ], [ 114.031778, 22.503923 ] ] ], [ [ [ 114.142647, 22.213906 ], [ 114.166668, 22.205041 ], [ 114.154965, 22.177888 ], [ 114.120473, 22.177888 ], [ 114.123553, 22.238836 ], [ 114.142647, 22.213906 ] ] ], [ [ [ 114.305871, 22.372273 ], [ 114.305255, 22.372826 ], [ 114.332972, 22.353455 ], [ 114.313878, 22.340724 ], [ 114.305871, 22.372273 ] ] ], [ [ [ 114.320037, 22.381127 ], [ 114.320037, 22.38168 ], [ 114.319421, 22.382234 ], [ 114.322501, 22.385554 ], [ 114.323117, 22.385554 ], [ 114.323733, 22.385001 ], [ 114.323733, 22.384447 ], [ 114.320037, 22.381127 ] ] ], [ [ [ 114.305871, 22.369506 ], [ 114.305255, 22.372826 ], [ 114.305871, 22.372273 ], [ 114.305871, 22.369506 ] ] ], [ [ [ 114.315726, 22.299203 ], [ 114.315726, 22.299756 ], [ 114.316342, 22.30031 ], [ 114.316958, 22.298649 ], [ 114.315726, 22.299203 ] ] ], [ [ [ 114.319421, 22.382234 ], [ 114.320037, 22.38168 ], [ 114.320037, 22.381127 ], [ 114.319421, 22.382234 ] ] ], [ [ [ 114.372392, 22.32301 ], [ 114.372392, 22.323564 ], [ 114.373008, 22.323564 ], [ 114.372392, 22.32301 ] ] ], [ [ [ 114.323733, 22.297541 ], [ 114.323733, 22.298095 ], [ 114.324349, 22.297541 ], [ 114.323733, 22.297541 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"820000\", \"name\": \"澳门特别行政区\", \"center\": [ 113.54909, 22.198951 ], \"centroid\": [ 113.566988, 22.159307 ], \"childrenNum\": 8, \"level\": \"province\", \"parent\": { \"adcode\": 100000 }, \"subFeatureIndex\": 33, \"acroutes\": [ 100000 ] }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 113.554425, 22.107489 ], [ 113.554425, 22.142416 ], [ 113.534715, 22.174009 ], [ 113.53841, 22.209473 ], [ 113.558736, 22.212244 ], [ 113.575983, 22.194513 ], [ 113.6037, 22.132438 ], [ 113.554425, 22.107489 ] ] ], [ [ [ 113.586453, 22.201162 ], [ 113.575983, 22.194513 ], [ 113.575983, 22.201162 ], [ 113.586453, 22.201162 ] ] ] ] } },\n{ \"type\": \"Feature\", \"properties\": { \"adcode\": \"100000\", \"name\": \"\", \"adchar\": \"JD\" }, \"geometry\": { \"type\": \"MultiPolygon\", \"coordinates\": [ [ [ [ 122.51865306, 23.46078502 ], [ 122.51742454, 23.45790762 ], [ 122.51536697, 23.45555069 ], [ 122.51268178, 23.45394494 ], [ 122.50963181, 23.45324755 ], [ 122.5065156, 23.45352678 ], [ 122.5036382, 23.45475531 ], [ 122.50128127, 23.45681287 ], [ 122.49967552, 23.45949807 ], [ 122.49897813, 23.46254804 ], [ 122.49925737, 23.46566424 ], [ 122.77921829, 24.57855302 ], [ 122.78044682, 24.58143041 ], [ 122.78250438, 24.58378734 ], [ 122.78518957, 24.5853931 ], [ 122.78823955, 24.58609049 ], [ 122.79135575, 24.58581125 ], [ 122.79423315, 24.58458272 ], [ 122.79659008, 24.58252516 ], [ 122.79819583, 24.57983997 ], [ 122.79889322, 24.57678999 ], [ 122.79861399, 24.57367379 ], [ 122.51865306, 23.46078502 ] ] ], [ [ [ 121.17202617, 20.8054593 ], [ 121.16966862, 20.80340244 ], [ 121.16679085, 20.80217478 ], [ 121.16367457, 20.80189649 ], [ 121.1606248, 20.8025948 ], [ 121.1579401, 20.80420136 ], [ 121.15588324, 20.80655891 ], [ 121.15465558, 20.80943668 ], [ 121.15437729, 20.81255297 ], [ 121.1550756, 20.81560273 ], [ 121.15668216, 20.81828744 ], [ 121.89404403, 21.70026162 ], [ 121.89640158, 21.70231847 ], [ 121.89927934, 21.70354613 ], [ 121.90239563, 21.70382443 ], [ 121.9054454, 21.70312611 ], [ 121.9081301, 21.70151955 ], [ 121.91018696, 21.699162 ], [ 121.91141462, 21.69628423 ], [ 121.91169291, 21.69316794 ], [ 121.9109946, 21.69011818 ], [ 121.90938804, 21.68743347 ], [ 121.17202617, 20.8054593 ] ] ], [ [ [ 119.47366172, 18.00707291 ], [ 119.47175735, 18.00459056 ], [ 119.46917909, 18.0028182 ], [ 119.46617933, 18.0019293 ], [ 119.4630517, 18.00201089 ], [ 119.46010237, 18.00305497 ], [ 119.45762002, 18.00495935 ], [ 119.45584765, 18.00753761 ], [ 119.45495876, 18.01053737 ], [ 119.45504035, 18.01366499 ], [ 119.45608443, 18.01661433 ], [ 120.00812005, 19.0335793 ], [ 120.01002443, 19.03606165 ], [ 120.01260269, 19.03783401 ], [ 120.01560245, 19.03872291 ], [ 120.01873007, 19.03864132 ], [ 120.02167941, 19.03759723 ], [ 120.02416175, 19.03569286 ], [ 120.02593412, 19.0331146 ], [ 120.02682302, 19.03011484 ], [ 120.02674143, 19.02698721 ], [ 120.02569734, 19.02403788 ], [ 119.47366172, 18.00707291 ] ] ], [ [ [ 119.0726757, 15.04098494 ], [ 119.0726746, 15.04083704 ], [ 119.07218171, 15.00751424 ], [ 119.07164663, 15.00443165 ], [ 119.07018516, 15.00166528 ], [ 119.06794036, 14.99948592 ], [ 119.06513198, 14.99810691 ], [ 119.06203491, 14.99766324 ], [ 119.05895232, 14.99819832 ], [ 119.05618595, 14.99965979 ], [ 119.05400659, 15.00190458 ], [ 119.05262758, 15.00471297 ], [ 119.0521839, 15.00781004 ], [ 119.0526757, 15.04105889 ], [ 119.0526757, 16.04388528 ], [ 119.05316513, 16.04697545 ], [ 119.05458553, 16.04976313 ], [ 119.05679784, 16.05197545 ], [ 119.05958553, 16.05339584 ], [ 119.0626757, 16.05388528 ], [ 119.06576587, 16.05339584 ], [ 119.06855355, 16.05197545 ], [ 119.07076587, 16.04976313 ], [ 119.07218626, 16.04697545 ], [ 119.0726757, 16.04388528 ], [ 119.0726757, 15.04098494 ] ] ], [ [ [ 118.68646749, 11.18959191 ], [ 118.85557939, 11.6136711 ], [ 118.9698053, 11.99151854 ], [ 118.97116801, 11.99433487 ], [ 118.97333431, 11.99659227 ], [ 118.97609216, 11.99806975 ], [ 118.9791716, 11.99862269 ], [ 118.98227119, 11.99819697 ], [ 118.98508753, 11.99683427 ], [ 118.98734492, 11.99466796 ], [ 118.9888224, 11.99191011 ], [ 118.98937534, 11.98883067 ], [ 118.98894963, 11.98573108 ], [ 118.87459939, 11.60747236 ], [ 118.87431591, 11.606662 ], [ 118.70476212, 11.18147468 ], [ 118.70409227, 11.18010771 ], [ 118.54242469, 10.9053354 ], [ 118.54043581, 10.90292022 ], [ 118.53779795, 10.90123786 ], [ 118.53476931, 10.90045298 ], [ 118.53164636, 10.90064241 ], [ 118.5287348, 10.90178762 ], [ 118.52631962, 10.9037765 ], [ 118.52463726, 10.90641436 ], [ 118.52385237, 10.909443 ], [ 118.52404181, 10.91256595 ], [ 118.52518702, 10.91547751 ], [ 118.68646749, 11.18959191 ] ] ], [ [ [ 115.54466883, 7.14672265 ], [ 115.54229721, 7.14468204 ], [ 115.53941108, 7.14347417 ], [ 115.53629295, 7.14321728 ], [ 115.53324806, 7.14393652 ], [ 115.53057445, 7.14556148 ], [ 115.52853383, 7.1479331 ], [ 115.52732596, 7.15081924 ], [ 115.52706908, 7.15393736 ], [ 115.52778832, 7.15698226 ], [ 115.52941328, 7.15965587 ], [ 116.23523025, 7.99221221 ], [ 116.23760187, 7.99425282 ], [ 116.240488, 7.99546069 ], [ 116.24360613, 7.99571758 ], [ 116.24665102, 7.99499834 ], [ 116.24932463, 7.99337338 ], [ 116.25136525, 7.99100176 ], [ 116.25257312, 7.98811563 ], [ 116.25283001, 7.9849975 ], [ 116.25211077, 7.98195261 ], [ 116.2504858, 7.979279 ], [ 115.54466883, 7.14672265 ] ] ], [ [ [ 112.30705249, 3.53487257 ], [ 112.51501594, 3.59753306 ], [ 112.84361424, 3.7506962 ], [ 112.84662187, 3.75155809 ], [ 112.84974864, 3.7514484 ], [ 112.85268847, 3.75037785 ], [ 112.8551536, 3.74845124 ], [ 112.85690272, 3.74585715 ], [ 112.85776462, 3.74284952 ], [ 112.85765492, 3.73972276 ], [ 112.85658437, 3.73678292 ], [ 112.85465776, 3.7343178 ], [ 112.85206367, 3.73256867 ], [ 112.52281386, 3.57910186 ], [ 112.52147408, 3.5785908 ], [ 112.31248917, 3.51562254 ], [ 112.31181658, 3.51544515 ], [ 111.79132585, 3.39736822 ], [ 111.78820398, 3.39716187 ], [ 111.78517113, 3.39793033 ], [ 111.78252419, 3.39959839 ], [ 111.78052226, 3.40200275 ], [ 111.77936129, 3.40490807 ], [ 111.77915495, 3.40802995 ], [ 111.77992341, 3.41106279 ], [ 111.78159146, 3.41370973 ], [ 111.78399583, 3.41571167 ], [ 111.78690114, 3.41687263 ], [ 112.30705249, 3.53487257 ] ] ], [ [ [ 108.26055972, 6.08912451 ], [ 108.26004031, 6.09098419 ], [ 108.23638164, 6.22427602 ], [ 108.23630689, 6.22476797 ], [ 108.19687578, 6.53630242 ], [ 108.19679674, 6.53760583 ], [ 108.1987683, 6.95072469 ], [ 108.19897125, 6.95268198 ], [ 108.22460147, 7.07791743 ], [ 108.22570055, 7.08084671 ], [ 108.22765103, 7.083293 ], [ 108.230262, 7.08501682 ], [ 108.23327786, 7.08584944 ], [ 108.23640341, 7.08570936 ], [ 108.2393327, 7.08461028 ], [ 108.24177899, 7.0826598 ], [ 108.24350281, 7.08004883 ], [ 108.24433543, 7.07703297 ], [ 108.24419535, 7.07390742 ], [ 108.21876335, 6.94964057 ], [ 108.21679964, 6.53816468 ], [ 108.25611734, 6.22752625 ], [ 108.279563, 6.09543449 ], [ 108.30878645, 6.01987736 ], [ 108.30944469, 6.0168187 ], [ 108.30912553, 6.01370633 ], [ 108.30786022, 6.01084492 ], [ 108.30577262, 6.00851455 ], [ 108.30306706, 6.00694335 ], [ 108.3000084, 6.00628511 ], [ 108.29689603, 6.00660426 ], [ 108.29403462, 6.00786957 ], [ 108.29170425, 6.00995718 ], [ 108.29013305, 6.01266273 ], [ 108.26055972, 6.08912451 ] ] ], [ [ [ 110.12822847, 11.36894451 ], [ 110.18898148, 11.48996382 ], [ 110.23982347, 11.61066468 ], [ 110.28485499, 11.78705054 ], [ 110.3083549, 11.94803461 ], [ 110.3142445, 12.14195265 ], [ 110.312278, 12.23998238 ], [ 110.31270536, 12.24308175 ], [ 110.31406956, 12.24589736 ], [ 110.31623706, 12.2481536 ], [ 110.3189957, 12.24962962 ], [ 110.32207543, 12.25018094 ], [ 110.32517479, 12.24975358 ], [ 110.3279904, 12.24838938 ], [ 110.33024665, 12.24622187 ], [ 110.33172267, 12.24346324 ], [ 110.33227398, 12.24038351 ], [ 110.33424553, 12.14210167 ], [ 110.33424294, 12.14159753 ], [ 110.32832827, 11.94685414 ], [ 110.32822801, 11.94571326 ], [ 110.30456934, 11.78364161 ], [ 110.30436343, 11.7826124 ], [ 110.25901765, 11.60499559 ], [ 110.25854422, 11.60358735 ], [ 110.20728377, 11.48189306 ], [ 110.20700505, 11.48128846 ], [ 110.14588682, 11.35954163 ], [ 110.14541497, 11.35870461 ], [ 110.07246741, 11.24270688 ], [ 110.07040803, 11.24035153 ], [ 110.0677216, 11.23874785 ], [ 110.06467109, 11.23805281 ], [ 110.0615551, 11.23833444 ], [ 110.05867865, 11.23956519 ], [ 110.05632331, 11.24162456 ], [ 110.05471962, 11.24431099 ], [ 110.05402458, 11.2473615 ], [ 110.05430621, 11.25047749 ], [ 110.05553696, 11.25335394 ], [ 110.12822847, 11.36894451 ] ] ], [ [ [ 109.82951587, 15.22896754 ], [ 109.77065019, 15.44468789 ], [ 109.67264555, 15.66561455 ], [ 109.57455994, 15.82609887 ], [ 109.51574449, 15.91095759 ], [ 109.29314007, 16.19491896 ], [ 109.29161878, 16.19765288 ], [ 109.29101677, 16.20072311 ], [ 109.29139298, 16.2038291 ], [ 109.29271057, 16.20666681 ], [ 109.29484059, 16.20895848 ], [ 109.29757451, 16.21047978 ], [ 109.30064474, 16.21108179 ], [ 109.30375073, 16.21070558 ], [ 109.30658844, 16.20938798 ], [ 109.30888011, 16.20725797 ], [ 109.53166592, 15.92306523 ], [ 109.53201478, 15.92259221 ], [ 109.59116145, 15.8372556 ], [ 109.59147511, 15.83677407 ], [ 109.6900529, 15.67548445 ], [ 109.69066131, 15.67432448 ], [ 109.7892391, 15.45210582 ], [ 109.78974541, 15.45068337 ], [ 109.84889209, 15.23393326 ], [ 109.84903675, 15.23333003 ], [ 109.8648092, 15.15722425 ], [ 109.86495704, 15.15409906 ], [ 109.86413191, 15.15108113 ], [ 109.86241457, 15.1484659 ], [ 109.85997314, 15.14650935 ], [ 109.85704658, 15.145403 ], [ 109.85392139, 15.14525516 ], [ 109.85090347, 15.14608029 ], [ 109.84828823, 15.14779763 ], [ 109.84633168, 15.15023907 ], [ 109.84522534, 15.15316562 ], [ 109.82951587, 15.22896754 ] ] ] ] } }\n]\n}\n', 'admin', '2021-06-30 10:15:13', NULL, NULL, '0', NULL); + +-- ---------------------------- +-- Table structure for jimu_report_share +-- ---------------------------- +DROP TABLE IF EXISTS `jimu_report_share`; +CREATE TABLE `jimu_report_share` ( + `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键', + `report_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '在线excel设计器id', + `preview_url` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '预览地址', + `preview_lock` varchar(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '密码锁', + `last_update_time` datetime NULL DEFAULT NULL COMMENT '最后更新时间', + `term_of_validity` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '有效期(0:永久有效,1:1天,2:7天)', + `status` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否过期(0未过期,1已过期)', + `preview_lock_status` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '密码锁状态', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '积木报表预览权限表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for rep_demo_dxtj +-- ---------------------------- +DROP TABLE IF EXISTS `rep_demo_dxtj`; +CREATE TABLE `rep_demo_dxtj` ( + `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '姓名', + `gtime` datetime NULL DEFAULT NULL COMMENT '雇佣日期', + `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '职务', + `jphone` varchar(125) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '家庭电话', + `birth` datetime NULL DEFAULT NULL COMMENT '出生日期', + `hukou` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '户口所在地', + `laddress` varchar(125) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '联系地址', + `jperson` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '紧急联系人', + `sex` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'xingbie', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of rep_demo_dxtj +-- ---------------------------- +INSERT INTO `rep_demo_dxtj` VALUES ('1338808084247613441', '张三', '2019-11-06 00:00:00', '1', '18034596970', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `rep_demo_dxtj` VALUES ('1338809169074982920', '张小哲', '2019-11-06 00:00:00', '2', '18034596971', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `rep_demo_dxtj` VALUES ('1338809448658898952', '闫妮', '2019-11-06 00:00:00', '2', '18034596972', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `rep_demo_dxtj` VALUES ('1338809620973490184', '陌生', '2019-11-06 00:00:00', '2', '18034596973', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `rep_demo_dxtj` VALUES ('1338809652606930952', '贺江', '2019-11-06 00:00:00', '2', '18034596974', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '2'); +INSERT INTO `rep_demo_dxtj` VALUES ('1338809685200867336', '村子明', '2019-11-06 00:00:00', '3', '18034596975', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '2'); +INSERT INTO `rep_demo_dxtj` VALUES ('1338809710203113481', '尚德', '2019-11-06 00:00:00', '4', '18034596977', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `rep_demo_dxtj` VALUES ('1338809749470187528', '郑恺', '2019-11-06 00:00:00', '4', '18034596978', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `rep_demo_dxtj` VALUES ('1338809774971555849', '未名园', '2019-11-06 00:00:00', '4', '18034596970', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `rep_demo_dxtj` VALUES ('1338809805199904777', '韩寒', '2019-11-06 00:00:00', '5', '18034596970', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `rep_demo_dxtj` VALUES ('1338809830017601544', '迪丽热拉', '2019-11-06 00:00:00', '6', '18034596970', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `rep_demo_dxtj` VALUES ('1338809864356368393', '张一山', '2019-11-06 00:00:00', '6', '18034596970', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `rep_demo_dxtj` VALUES ('1339160157602480137', '张三', '2019-11-06 00:00:00', '1', '18034596970', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `rep_demo_dxtj` VALUES ('1339160157602480146', '张大大', '2019-11-06 00:00:00', '2', '18034596971', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `rep_demo_dxtj` VALUES ('1339160157606674439', '郭美美', '2019-11-06 00:00:00', '2', '18034596972', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `rep_demo_dxtj` VALUES ('1339160157606674448', '莫愁', '2019-11-06 00:00:00', '2', '18034596973', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `rep_demo_dxtj` VALUES ('1339160157606674457', '鲁与', '2019-11-06 00:00:00', '2', '18034596974', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '2'); +INSERT INTO `rep_demo_dxtj` VALUES ('1339160157606674466', '高尚', '2019-11-06 00:00:00', '3', '18034596975', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '2'); +INSERT INTO `rep_demo_dxtj` VALUES ('1339160157606674475', '尚北京', '2019-11-06 00:00:00', '4', '18034596977', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `rep_demo_dxtj` VALUES ('1339160157606674484', '杨颖花', '2019-11-06 00:00:00', '4', '18034596978', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `rep_demo_dxtj` VALUES ('1339160157606674493', '李丽', '2019-11-06 00:00:00', '4', '18034596970', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `rep_demo_dxtj` VALUES ('1339160157606674502', '韩露露', '2019-11-06 00:00:00', '5', '18034596970', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `rep_demo_dxtj` VALUES ('1339160157606674511', '李凯泽', '2019-11-06 00:00:00', '6', '18034596970', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); +INSERT INTO `rep_demo_dxtj` VALUES ('1339160157606674520', '王明阳', '2019-11-06 00:00:00', '6', '18034596970', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1'); + +-- ---------------------------- +-- Table structure for rep_demo_employee +-- ---------------------------- +DROP TABLE IF EXISTS `rep_demo_employee`; +CREATE TABLE `rep_demo_employee` ( + `id` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键', + `num` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '编号', + `name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '姓名', + `sex` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '性别', + `birthday` datetime NULL DEFAULT NULL COMMENT '出生日期', + `nation` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '民族', + `political` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '政治面貌', + `native_place` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '籍贯', + `height` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '身高', + `weight` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '体重', + `health` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '健康状况', + `id_card` varchar(80) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '身份证号', + `education` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '学历', + `school` varchar(80) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '毕业学校', + `major` varchar(80) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '专业', + `address` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '联系地址', + `zip_code` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '邮编', + `email` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'Email', + `phone` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '手机号', + `foreign_language` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '外语语种', + `foreign_language_level` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '外语水平', + `computer_level` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '计算机水平', + `graduation_time` datetime NULL DEFAULT NULL COMMENT '毕业时间', + `arrival_time` datetime NULL DEFAULT NULL COMMENT '到职时间', + `positional_titles` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '职称', + `education_experience` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '教育经历', + `work_experience` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '工作经历', + `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + `del_flag` tinyint(1) NULL DEFAULT NULL COMMENT '删除标识0-正常,1-已删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of rep_demo_employee +-- ---------------------------- +INSERT INTO `rep_demo_employee` VALUES ('1', '001', '张三', '男', '2000-02-04 13:36:19', '汉族', '团员', '北京', '170', '65', '良好', '110101200002044853', '大专', '北京科技', '计算机', '北京朝阳区', '1001', 'zhang@163.com', '18011111111', '英语', '三级', '三级', '2019-02-04 13:41:17', '2020-02-04 13:41:31', '项目经理', '2018年9月—2019年7月:北京语言文化大学比较文学研究所攻读博士学位,获得比较文学博士学位', '2019年5月---至今 XX公司 网络系统工程师 \n2019年5月---至今 XX公司 网络系统工程师', NULL, '2020-02-04 15:18:03', NULL, NULL, NULL); +INSERT INTO `rep_demo_employee` VALUES ('2', '002', '王红', '女', '2000-02-04 13:36:19', '汉族', '团员', '北京', '170', '65', '良好', '110101200002044853', '大专', '北京科技', '计算机', '北京朝阳区', '1001', 'zhang@163.com', '18011111111', '英语', '三级', '三级', '2019-02-04 13:41:17', '2020-02-04 13:41:31', '项目经理', '2018年9月—2019年7月:北京语言文化大学比较文学研究所攻读博士学位,获得比较文学博士学位', '2019年5月---至今 XX公司 网络系统工程师 \n2019年5月---至今 XX公司 网络系统工程师', NULL, '2020-02-04 18:39:27', NULL, NULL, NULL); + +-- ---------------------------- +-- Table structure for rep_demo_gongsi +-- ---------------------------- +DROP TABLE IF EXISTS `rep_demo_gongsi`; +CREATE TABLE `rep_demo_gongsi` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `gname` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '货品名称', + `gdata` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '返利', + `tdata` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '备注', + `didian` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `zhaiyao` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `num` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of rep_demo_gongsi +-- ---------------------------- +INSERT INTO `rep_demo_gongsi` VALUES (1, '北京天山海世界', '2020-02-30 11:12:25', '2020-02-25', '天山大厦', '1', '2399845661'); +INSERT INTO `rep_demo_gongsi` VALUES (2, 'dd天山海世界', '2020-02-30 11:12:25', '2020-02-25', '天山大厦', '1', '2399845661'); + +-- ---------------------------- +-- Table structure for rep_demo_jianpiao +-- ---------------------------- +DROP TABLE IF EXISTS `rep_demo_jianpiao`; +CREATE TABLE `rep_demo_jianpiao` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `bnum` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `ftime` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `sfkong` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `kaishi` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `jieshu` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `hezairen` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `jpnum` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `shihelv` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `s_id` int(11) NOT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 87 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of rep_demo_jianpiao +-- ---------------------------- +INSERT INTO `rep_demo_jianpiao` VALUES (1, 'K7725', '21:13', '否', '秦皇岛', '邯郸', '300', '258', '86', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (2, 'k99', '16:55', '否', '包头', '广州', '800', '700', '88', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (3, 'G6737', '05:34', '否', '北京西', '邯郸东', '500', '256', '51', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (4, 'K7705', '07:03', '否', '北京', '邯郸', '400', '200', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (5, 'G437', '06:27', '否', '北京西', '兰州西', '800', '586', '73', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (6, 'G673', '06:32', '否', '北京西', '邯郸东', '300', '289', '87', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (7, 'G507', '06:43', '否', '北京西', '邯郸东', '300', '200', '67', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (8, 'G89', '06:53', '否', '北京西', '成都东', '800', '500', '62', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (9, 'K7712', '09:43', '否', '北京西', '西安北', '400', '200', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (10, 'G405', '10:05', '否', '北京西', '昆明南', '300', '200', '67', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (11, 'G6701', '10:38', '否', '北京西', '石家庄', '300', '200', '67', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (12, 'G487', '10:52', '否', '北京西', '南昌西', '800', '700', '88', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (13, 'G607', '11:14', '否', '北京西', '太原南', '400', '200', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (14, 'G667', '11:19', '否', '北京西', '西安北', '400', '200', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (15, 'Z49', '11:28', '否', '北京西', '成都', '400', '200', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (16, 'Z49', '11:28', '否', '北京西', '上海', '300', '200', '80', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (17, 'Z49', '11:56', '否', '北京西', '上海', '200', '180', '95', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (18, 'Z49', '11:36', '否', '北京南', '大晒', '200', '180', '96', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (19, 'Z123', '12:00', '否', '北京南', '重庆', '1000', '1000', '100', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (20, 'G78', '13:56', '否', '北京东', '厦门北', '800', '700', '90', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (21, 'G56', '18:36', '否', '上海西', '深圳', '800', '700', '90', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (22, 'H78', '12:00', '否', '上海', '北京西', '800', '700', '90', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (23, 'H78', '12:00', '否', '上海', '北京西', '800', '700', '90', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (24, 'H78', '12:00', '否', '上海', '北京西', '800', '700', '90', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (25, 'H78', '12:00', '否', '北京西', '南昌', '800', '700', '90', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (26, 'G70', '7:23', '是', '北京西', '厦门', '500', '450', '95', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (27, 'G14', '9:50', '是', '北京西', '上海', '800', '700', '95', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (28, 'G90', '8:30', '是', '北京南', '武昌', '1000', '1000', '100', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (29, 'G25', '7:56', '是', '厦门北', '福州', '500', '100', '20', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (30, 'G50', '14:23', '否', '北京西', '深圳', '500', '100', '20', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (31, 'G10', '13:00', '否', '北京西', '深圳', '500', '100', '20', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (32, 'G10', '13:00', '否', '北京西', '深圳', '500', '100', '20', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (33, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (34, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (35, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (36, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (37, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (38, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (39, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (40, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (41, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (42, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (43, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (44, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (45, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (46, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (47, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (48, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (49, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (50, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (51, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (52, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (53, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (54, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (55, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (56, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (57, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (58, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (59, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (60, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (61, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (62, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (63, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (64, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (65, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (66, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (67, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (68, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (69, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (70, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (71, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (72, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (73, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (74, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (75, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (76, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (77, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (78, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (79, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (80, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (81, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (82, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (83, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (84, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (85, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); +INSERT INTO `rep_demo_jianpiao` VALUES (86, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1); + +-- ---------------------------- +-- Table structure for tmp_report_data_1 +-- ---------------------------- +DROP TABLE IF EXISTS `tmp_report_data_1`; +CREATE TABLE `tmp_report_data_1` ( + `monty` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '月份', + `main_income` decimal(10, 2) NULL DEFAULT NULL, + `total` decimal(10, 2) NULL DEFAULT NULL, + `his_lowest` decimal(10, 2) NULL DEFAULT NULL, + `his_average` decimal(10, 2) NULL DEFAULT NULL, + `his_highest` decimal(10, 2) NULL DEFAULT NULL +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of tmp_report_data_1 +-- ---------------------------- +INSERT INTO `tmp_report_data_1` VALUES ('1月', 483834.66, 483834.66, 57569.77, 216797.62, 483834.66); +INSERT INTO `tmp_report_data_1` VALUES ('2月', 11666578.65, 12150413.31, 22140.00, 4985361.57, 11666578.65); +INSERT INTO `tmp_report_data_1` VALUES ('3月', 27080982.08, 39231395.39, 73106.29, 16192642.30, 27080982.08); +INSERT INTO `tmp_report_data_1` VALUES ('4月', 0.00, 39231395.39, 73106.29, 8513415.34, 17428381.40); +INSERT INTO `tmp_report_data_1` VALUES ('5月', 0.00, 39231395.39, NULL, NULL, NULL); +INSERT INTO `tmp_report_data_1` VALUES ('6月', 0.00, 39231395.39, NULL, NULL, NULL); +INSERT INTO `tmp_report_data_1` VALUES ('7月', 0.00, 39231395.39, NULL, NULL, NULL); +INSERT INTO `tmp_report_data_1` VALUES ('8月', 0.00, 39231395.39, NULL, NULL, NULL); +INSERT INTO `tmp_report_data_1` VALUES ('9月', 0.00, 39231395.39, NULL, NULL, NULL); +INSERT INTO `tmp_report_data_1` VALUES ('10月', 0.00, 39231395.39, NULL, NULL, NULL); +INSERT INTO `tmp_report_data_1` VALUES ('11月', 0.00, 39231395.39, NULL, NULL, NULL); +INSERT INTO `tmp_report_data_1` VALUES ('12月', 0.00, 39231395.39, NULL, NULL, NULL); + +-- ---------------------------- +-- Table structure for tmp_report_data_income +-- ---------------------------- +DROP TABLE IF EXISTS `tmp_report_data_income`; +CREATE TABLE `tmp_report_data_income` ( + `biz_income` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `bx_jj_yongjin` decimal(10, 2) NULL DEFAULT NULL, + `bx_zx_money` decimal(10, 2) NULL DEFAULT NULL, + `chengbao_gz_money` decimal(10, 2) NULL DEFAULT NULL, + `bx_gg_moeny` decimal(10, 2) NULL DEFAULT NULL, + `tb_zx_money` decimal(10, 2) NULL DEFAULT NULL, + `neikong_zx_money` decimal(10, 2) NULL DEFAULT NULL, + `total` decimal(10, 2) NULL DEFAULT NULL +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of tmp_report_data_income +-- ---------------------------- +INSERT INTO `tmp_report_data_income` VALUES ('中国石油全资(集团所属)', 37134.58, 1099273.32, 0.00, 0.00, 0.00, 226415.09, 38460270.57); +INSERT INTO `tmp_report_data_income` VALUES ('中国石油全资(股份所属)', 227595.77, 0.00, 0.00, 0.00, 0.00, 0.00, 227595.77); +INSERT INTO `tmp_report_data_income` VALUES ('中石油控股或有控股权', 310628.11, 369298.64, 0.00, 0.00, 0.00, 0.00, 679926.75); +INSERT INTO `tmp_report_data_income` VALUES ('中石油参股', 72062.45, 0.00, 0.00, 0.00, 0.00, 0.00, 72062.75); +INSERT INTO `tmp_report_data_income` VALUES ('非中石油', 1486526.90, 212070.72, 0.00, 0.00, 0.00, 226415.09, 1698597.62); + +-- ---------------------------- +-- 多租户字段 +-- ---------------------------- + +ALTER TABLE jimu_dict +ADD COLUMN tenant_id varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '多租户标识' AFTER type; +ALTER TABLE jimu_report +ADD COLUMN tenant_id varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '多租户标识' AFTER js_str; + + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/sql/mysql/optional/mall_trade_log.sql b/sql/mysql/optional/mall_trade_log.sql new file mode 100644 index 0000000..683c6a2 --- /dev/null +++ b/sql/mysql/optional/mall_trade_log.sql @@ -0,0 +1,3 @@ +ALTER TABLE `ruoyi-vue-pro`.`trade_after_sale_log` + ADD COLUMN `before_status` int NOT NULL COMMENT '售前状态' AFTER `id`, + ADD COLUMN `after_status` int NOT NULL COMMENT '售后状态' AFTER `before_status`; diff --git a/sql/mysql/pay_wallet.sql b/sql/mysql/pay_wallet.sql new file mode 100644 index 0000000..7d092ef --- /dev/null +++ b/sql/mysql/pay_wallet.sql @@ -0,0 +1,43 @@ +-- ---------------------------- +-- 会员钱包表 +-- ---------------------------- +DROP TABLE IF EXISTS `pay_wallet`; +CREATE TABLE `pay_wallet` +( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + `user_id` bigint NOT NULL COMMENT '用户编号', + `user_type` tinyint NOT NULL DEFAULT 0 COMMENT '用户类型', + `balance` int NOT NULL DEFAULT 0 COMMENT '余额,单位分', + `total_expense` int NOT NULL DEFAULT 0 COMMENT '累计支出,单位分', + `total_recharge` int NOT NULL DEFAULT 0 COMMENT '累计充值,单位分', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB COMMENT='会员钱包表'; + +-- ---------------------------- +-- 会员钱包流水表 +-- ---------------------------- +DROP TABLE IF EXISTS `pay_wallet_transaction`; +CREATE TABLE `pay_wallet_transaction` +( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + `wallet_id` bigint NOT NULL COMMENT '会员钱包 id', + `biz_type` tinyint NOT NULL COMMENT '关联类型', + `biz_id` varchar(64) NOT NULL COMMENT '关联业务编号', + `no` varchar(64) NOT NULL COMMENT '流水号', + `title` varchar(128) NOT NULL COMMENT '流水标题', + `price` int NOT NULL COMMENT '交易金额, 单位分', + `balance` int NOT NULL COMMENT '余额, 单位分', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB COMMENT='会员钱包流水表'; diff --git a/sql/mysql/ruoyi-vue-pro.sql b/sql/mysql/ruoyi-vue-pro.sql new file mode 100644 index 0000000..7c00501 --- /dev/null +++ b/sql/mysql/ruoyi-vue-pro.sql @@ -0,0 +1,3049 @@ +/* + Navicat Premium Data Transfer + + Source Server : 127.0.0.1 MySQL + Source Server Type : MySQL + Source Server Version : 80034 + Source Host : localhost:3306 + Source Schema : ruoyi-vue-pro + + Target Server Type : MySQL + Target Server Version : 80034 + File Encoding : 65001 + + Date: 03/09/2023 19:13:55 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for QRTZ_BLOB_TRIGGERS +-- ---------------------------- +DROP TABLE IF EXISTS `QRTZ_BLOB_TRIGGERS`; +CREATE TABLE `QRTZ_BLOB_TRIGGERS` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `BLOB_DATA` blob NULL, + PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, + INDEX `SCHED_NAME`(`SCHED_NAME` ASC, `TRIGGER_NAME` ASC, `TRIGGER_GROUP` ASC) USING BTREE, + CONSTRAINT `qrtz_blob_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `QRTZ_TRIGGERS` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; + +-- ---------------------------- +-- Records of QRTZ_BLOB_TRIGGERS +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for QRTZ_CALENDARS +-- ---------------------------- +DROP TABLE IF EXISTS `QRTZ_CALENDARS`; +CREATE TABLE `QRTZ_CALENDARS` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `CALENDAR_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `CALENDAR` blob NOT NULL, + PRIMARY KEY (`SCHED_NAME`, `CALENDAR_NAME`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; + +-- ---------------------------- +-- Records of QRTZ_CALENDARS +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for QRTZ_CRON_TRIGGERS +-- ---------------------------- +DROP TABLE IF EXISTS `QRTZ_CRON_TRIGGERS`; +CREATE TABLE `QRTZ_CRON_TRIGGERS` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `CRON_EXPRESSION` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `TIME_ZONE_ID` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, + PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, + CONSTRAINT `qrtz_cron_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `QRTZ_TRIGGERS` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; + +-- ---------------------------- +-- Records of QRTZ_CRON_TRIGGERS +-- ---------------------------- +BEGIN; +INSERT INTO `QRTZ_CRON_TRIGGERS` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`, `CRON_EXPRESSION`, `TIME_ZONE_ID`) VALUES ('schedulerName', 'payNotifyJob', 'DEFAULT', '* * * * * ?', 'Asia/Shanghai'); +INSERT INTO `QRTZ_CRON_TRIGGERS` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`, `CRON_EXPRESSION`, `TIME_ZONE_ID`) VALUES ('schedulerName', 'payOrderExpireJob', 'DEFAULT', '0 0/1 * * * ?', 'Asia/Shanghai'); +INSERT INTO `QRTZ_CRON_TRIGGERS` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`, `CRON_EXPRESSION`, `TIME_ZONE_ID`) VALUES ('schedulerName', 'payOrderSyncJob', 'DEFAULT', '0 0/1 * * * ?', 'Asia/Shanghai'); +INSERT INTO `QRTZ_CRON_TRIGGERS` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`, `CRON_EXPRESSION`, `TIME_ZONE_ID`) VALUES ('schedulerName', 'payRefundSyncJob', 'DEFAULT', '0 0/1 * * * ?', 'Asia/Shanghai'); +COMMIT; + +-- ---------------------------- +-- Table structure for QRTZ_FIRED_TRIGGERS +-- ---------------------------- +DROP TABLE IF EXISTS `QRTZ_FIRED_TRIGGERS`; +CREATE TABLE `QRTZ_FIRED_TRIGGERS` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `ENTRY_ID` varchar(95) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `INSTANCE_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `FIRED_TIME` bigint NOT NULL, + `SCHED_TIME` bigint NOT NULL, + `PRIORITY` int NOT NULL, + `STATE` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `JOB_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, + `JOB_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, + `IS_NONCONCURRENT` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, + `REQUESTS_RECOVERY` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, + PRIMARY KEY (`SCHED_NAME`, `ENTRY_ID`) USING BTREE, + INDEX `IDX_QRTZ_FT_TRIG_INST_NAME`(`SCHED_NAME` ASC, `INSTANCE_NAME` ASC) USING BTREE, + INDEX `IDX_QRTZ_FT_INST_JOB_REQ_RCVRY`(`SCHED_NAME` ASC, `INSTANCE_NAME` ASC, `REQUESTS_RECOVERY` ASC) USING BTREE, + INDEX `IDX_QRTZ_FT_J_G`(`SCHED_NAME` ASC, `JOB_NAME` ASC, `JOB_GROUP` ASC) USING BTREE, + INDEX `IDX_QRTZ_FT_JG`(`SCHED_NAME` ASC, `JOB_GROUP` ASC) USING BTREE, + INDEX `IDX_QRTZ_FT_T_G`(`SCHED_NAME` ASC, `TRIGGER_NAME` ASC, `TRIGGER_GROUP` ASC) USING BTREE, + INDEX `IDX_QRTZ_FT_TG`(`SCHED_NAME` ASC, `TRIGGER_GROUP` ASC) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; + +-- ---------------------------- +-- Records of QRTZ_FIRED_TRIGGERS +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for QRTZ_JOB_DETAILS +-- ---------------------------- +DROP TABLE IF EXISTS `QRTZ_JOB_DETAILS`; +CREATE TABLE `QRTZ_JOB_DETAILS` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `JOB_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `JOB_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `DESCRIPTION` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, + `JOB_CLASS_NAME` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `IS_DURABLE` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `IS_NONCONCURRENT` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `IS_UPDATE_DATA` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `REQUESTS_RECOVERY` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `JOB_DATA` blob NULL, + PRIMARY KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) USING BTREE, + INDEX `IDX_QRTZ_J_REQ_RECOVERY`(`SCHED_NAME` ASC, `REQUESTS_RECOVERY` ASC) USING BTREE, + INDEX `IDX_QRTZ_J_GRP`(`SCHED_NAME` ASC, `JOB_GROUP` ASC) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; + +-- ---------------------------- +-- Records of QRTZ_JOB_DETAILS +-- ---------------------------- +BEGIN; +INSERT INTO `QRTZ_JOB_DETAILS` (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`, `DESCRIPTION`, `JOB_CLASS_NAME`, `IS_DURABLE`, `IS_NONCONCURRENT`, `IS_UPDATE_DATA`, `REQUESTS_RECOVERY`, `JOB_DATA`) VALUES ('schedulerName', 'payNotifyJob', 'DEFAULT', NULL, 'com.win.framework.quartz.core.handler.JobHandlerInvoker', '0', '1', '1', '0', 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C770800000010000000027400064A4F425F49447372000E6A6176612E6C616E672E4C6F6E673B8BE490CC8F23DF0200014A000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B020000787000000000000000057400104A4F425F48414E444C45525F4E414D4574000C7061794E6F746966794A6F627800); +INSERT INTO `QRTZ_JOB_DETAILS` (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`, `DESCRIPTION`, `JOB_CLASS_NAME`, `IS_DURABLE`, `IS_NONCONCURRENT`, `IS_UPDATE_DATA`, `REQUESTS_RECOVERY`, `JOB_DATA`) VALUES ('schedulerName', 'payOrderExpireJob', 'DEFAULT', NULL, 'com.win.framework.quartz.core.handler.JobHandlerInvoker', '0', '1', '1', '0', 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C770800000010000000027400064A4F425F49447372000E6A6176612E6C616E672E4C6F6E673B8BE490CC8F23DF0200014A000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B020000787000000000000000127400104A4F425F48414E444C45525F4E414D457400117061794F726465724578706972654A6F627800); +INSERT INTO `QRTZ_JOB_DETAILS` (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`, `DESCRIPTION`, `JOB_CLASS_NAME`, `IS_DURABLE`, `IS_NONCONCURRENT`, `IS_UPDATE_DATA`, `REQUESTS_RECOVERY`, `JOB_DATA`) VALUES ('schedulerName', 'payOrderSyncJob', 'DEFAULT', NULL, 'com.win.framework.quartz.core.handler.JobHandlerInvoker', '0', '1', '1', '0', 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C770800000010000000027400064A4F425F49447372000E6A6176612E6C616E672E4C6F6E673B8BE490CC8F23DF0200014A000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B020000787000000000000000117400104A4F425F48414E444C45525F4E414D4574000F7061794F7264657253796E634A6F627800); +INSERT INTO `QRTZ_JOB_DETAILS` (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`, `DESCRIPTION`, `JOB_CLASS_NAME`, `IS_DURABLE`, `IS_NONCONCURRENT`, `IS_UPDATE_DATA`, `REQUESTS_RECOVERY`, `JOB_DATA`) VALUES ('schedulerName', 'payRefundSyncJob', 'DEFAULT', NULL, 'com.win.framework.quartz.core.handler.JobHandlerInvoker', '0', '1', '1', '0', 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C770800000010000000027400064A4F425F49447372000E6A6176612E6C616E672E4C6F6E673B8BE490CC8F23DF0200014A000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B020000787000000000000000137400104A4F425F48414E444C45525F4E414D45740010706179526566756E6453796E634A6F627800); +COMMIT; + +-- ---------------------------- +-- Table structure for QRTZ_LOCKS +-- ---------------------------- +DROP TABLE IF EXISTS `QRTZ_LOCKS`; +CREATE TABLE `QRTZ_LOCKS` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `LOCK_NAME` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + PRIMARY KEY (`SCHED_NAME`, `LOCK_NAME`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; + +-- ---------------------------- +-- Records of QRTZ_LOCKS +-- ---------------------------- +BEGIN; +INSERT INTO `QRTZ_LOCKS` (`SCHED_NAME`, `LOCK_NAME`) VALUES ('schedulerName', 'STATE_ACCESS'); +INSERT INTO `QRTZ_LOCKS` (`SCHED_NAME`, `LOCK_NAME`) VALUES ('schedulerName', 'TRIGGER_ACCESS'); +COMMIT; + +-- ---------------------------- +-- Table structure for QRTZ_PAUSED_TRIGGER_GRPS +-- ---------------------------- +DROP TABLE IF EXISTS `QRTZ_PAUSED_TRIGGER_GRPS`; +CREATE TABLE `QRTZ_PAUSED_TRIGGER_GRPS` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + PRIMARY KEY (`SCHED_NAME`, `TRIGGER_GROUP`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; + +-- ---------------------------- +-- Records of QRTZ_PAUSED_TRIGGER_GRPS +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for QRTZ_SCHEDULER_STATE +-- ---------------------------- +DROP TABLE IF EXISTS `QRTZ_SCHEDULER_STATE`; +CREATE TABLE `QRTZ_SCHEDULER_STATE` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `INSTANCE_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `LAST_CHECKIN_TIME` bigint NOT NULL, + `CHECKIN_INTERVAL` bigint NOT NULL, + PRIMARY KEY (`SCHED_NAME`, `INSTANCE_NAME`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; + +-- ---------------------------- +-- Records of QRTZ_SCHEDULER_STATE +-- ---------------------------- +BEGIN; +INSERT INTO `QRTZ_SCHEDULER_STATE` (`SCHED_NAME`, `INSTANCE_NAME`, `LAST_CHECKIN_TIME`, `CHECKIN_INTERVAL`) VALUES ('schedulerName', 'Yunai1690117495401', 1690119854263, 15000); +COMMIT; + +-- ---------------------------- +-- Table structure for QRTZ_SIMPLE_TRIGGERS +-- ---------------------------- +DROP TABLE IF EXISTS `QRTZ_SIMPLE_TRIGGERS`; +CREATE TABLE `QRTZ_SIMPLE_TRIGGERS` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `REPEAT_COUNT` bigint NOT NULL, + `REPEAT_INTERVAL` bigint NOT NULL, + `TIMES_TRIGGERED` bigint NOT NULL, + PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, + CONSTRAINT `qrtz_simple_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `QRTZ_TRIGGERS` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; + +-- ---------------------------- +-- Records of QRTZ_SIMPLE_TRIGGERS +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for QRTZ_SIMPROP_TRIGGERS +-- ---------------------------- +DROP TABLE IF EXISTS `QRTZ_SIMPROP_TRIGGERS`; +CREATE TABLE `QRTZ_SIMPROP_TRIGGERS` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `STR_PROP_1` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, + `STR_PROP_2` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, + `STR_PROP_3` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, + `INT_PROP_1` int NULL DEFAULT NULL, + `INT_PROP_2` int NULL DEFAULT NULL, + `LONG_PROP_1` bigint NULL DEFAULT NULL, + `LONG_PROP_2` bigint NULL DEFAULT NULL, + `DEC_PROP_1` decimal(13, 4) NULL DEFAULT NULL, + `DEC_PROP_2` decimal(13, 4) NULL DEFAULT NULL, + `BOOL_PROP_1` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, + `BOOL_PROP_2` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, + PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, + CONSTRAINT `qrtz_simprop_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `QRTZ_TRIGGERS` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; + +-- ---------------------------- +-- Records of QRTZ_SIMPROP_TRIGGERS +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for QRTZ_TRIGGERS +-- ---------------------------- +DROP TABLE IF EXISTS `QRTZ_TRIGGERS`; +CREATE TABLE `QRTZ_TRIGGERS` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `TRIGGER_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `TRIGGER_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `JOB_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `JOB_GROUP` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `DESCRIPTION` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, + `NEXT_FIRE_TIME` bigint NULL DEFAULT NULL, + `PREV_FIRE_TIME` bigint NULL DEFAULT NULL, + `PRIORITY` int NULL DEFAULT NULL, + `TRIGGER_STATE` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `TRIGGER_TYPE` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `START_TIME` bigint NOT NULL, + `END_TIME` bigint NULL DEFAULT NULL, + `CALENDAR_NAME` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, + `MISFIRE_INSTR` smallint NULL DEFAULT NULL, + `JOB_DATA` blob NULL, + PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, + INDEX `IDX_QRTZ_T_J`(`SCHED_NAME` ASC, `JOB_NAME` ASC, `JOB_GROUP` ASC) USING BTREE, + INDEX `IDX_QRTZ_T_JG`(`SCHED_NAME` ASC, `JOB_GROUP` ASC) USING BTREE, + INDEX `IDX_QRTZ_T_C`(`SCHED_NAME` ASC, `CALENDAR_NAME` ASC) USING BTREE, + INDEX `IDX_QRTZ_T_G`(`SCHED_NAME` ASC, `TRIGGER_GROUP` ASC) USING BTREE, + INDEX `IDX_QRTZ_T_STATE`(`SCHED_NAME` ASC, `TRIGGER_STATE` ASC) USING BTREE, + INDEX `IDX_QRTZ_T_N_STATE`(`SCHED_NAME` ASC, `TRIGGER_NAME` ASC, `TRIGGER_GROUP` ASC, `TRIGGER_STATE` ASC) USING BTREE, + INDEX `IDX_QRTZ_T_N_G_STATE`(`SCHED_NAME` ASC, `TRIGGER_GROUP` ASC, `TRIGGER_STATE` ASC) USING BTREE, + INDEX `IDX_QRTZ_T_NEXT_FIRE_TIME`(`SCHED_NAME` ASC, `NEXT_FIRE_TIME` ASC) USING BTREE, + INDEX `IDX_QRTZ_T_NFT_ST`(`SCHED_NAME` ASC, `TRIGGER_STATE` ASC, `NEXT_FIRE_TIME` ASC) USING BTREE, + INDEX `IDX_QRTZ_T_NFT_MISFIRE`(`SCHED_NAME` ASC, `MISFIRE_INSTR` ASC, `NEXT_FIRE_TIME` ASC) USING BTREE, + INDEX `IDX_QRTZ_T_NFT_ST_MISFIRE`(`SCHED_NAME` ASC, `MISFIRE_INSTR` ASC, `NEXT_FIRE_TIME` ASC, `TRIGGER_STATE` ASC) USING BTREE, + INDEX `IDX_QRTZ_T_NFT_ST_MISFIRE_GRP`(`SCHED_NAME` ASC, `MISFIRE_INSTR` ASC, `NEXT_FIRE_TIME` ASC, `TRIGGER_GROUP` ASC, `TRIGGER_STATE` ASC) USING BTREE, + CONSTRAINT `qrtz_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) REFERENCES `QRTZ_JOB_DETAILS` (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; + +-- ---------------------------- +-- Records of QRTZ_TRIGGERS +-- ---------------------------- +BEGIN; +INSERT INTO `QRTZ_TRIGGERS` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`, `JOB_NAME`, `JOB_GROUP`, `DESCRIPTION`, `NEXT_FIRE_TIME`, `PREV_FIRE_TIME`, `PRIORITY`, `TRIGGER_STATE`, `TRIGGER_TYPE`, `START_TIME`, `END_TIME`, `CALENDAR_NAME`, `MISFIRE_INSTR`, `JOB_DATA`) VALUES ('schedulerName', 'payNotifyJob', 'DEFAULT', 'payNotifyJob', 'DEFAULT', NULL, 1688907102000, 1688907101000, 5, 'PAUSED', 'CRON', 1635294882000, 0, NULL, 0, 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C770800000010000000037400114A4F425F48414E444C45525F504152414D707400124A4F425F52455452595F494E54455256414C737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B02000078700000000074000F4A4F425F52455452595F434F554E5471007E000B7800); +INSERT INTO `QRTZ_TRIGGERS` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`, `JOB_NAME`, `JOB_GROUP`, `DESCRIPTION`, `NEXT_FIRE_TIME`, `PREV_FIRE_TIME`, `PRIORITY`, `TRIGGER_STATE`, `TRIGGER_TYPE`, `START_TIME`, `END_TIME`, `CALENDAR_NAME`, `MISFIRE_INSTR`, `JOB_DATA`) VALUES ('schedulerName', 'payOrderExpireJob', 'DEFAULT', 'payOrderExpireJob', 'DEFAULT', NULL, 1690011600000, -1, 5, 'PAUSED', 'CRON', 1690011553000, 0, NULL, 0, 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C770800000010000000037400114A4F425F48414E444C45525F504152414D707400124A4F425F52455452595F494E54455256414C737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B02000078700000000074000F4A4F425F52455452595F434F554E5471007E000B7800); +INSERT INTO `QRTZ_TRIGGERS` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`, `JOB_NAME`, `JOB_GROUP`, `DESCRIPTION`, `NEXT_FIRE_TIME`, `PREV_FIRE_TIME`, `PRIORITY`, `TRIGGER_STATE`, `TRIGGER_TYPE`, `START_TIME`, `END_TIME`, `CALENDAR_NAME`, `MISFIRE_INSTR`, `JOB_DATA`) VALUES ('schedulerName', 'payOrderSyncJob', 'DEFAULT', 'payOrderSyncJob', 'DEFAULT', NULL, 1690011600000, 1690011540000, 5, 'PAUSED', 'CRON', 1690007785000, 0, NULL, 0, 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C770800000010000000037400114A4F425F48414E444C45525F504152414D707400124A4F425F52455452595F494E54455256414C737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B02000078700000000074000F4A4F425F52455452595F434F554E5471007E000B7800); +INSERT INTO `QRTZ_TRIGGERS` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`, `JOB_NAME`, `JOB_GROUP`, `DESCRIPTION`, `NEXT_FIRE_TIME`, `PREV_FIRE_TIME`, `PRIORITY`, `TRIGGER_STATE`, `TRIGGER_TYPE`, `START_TIME`, `END_TIME`, `CALENDAR_NAME`, `MISFIRE_INSTR`, `JOB_DATA`) VALUES ('schedulerName', 'payRefundSyncJob', 'DEFAULT', 'payRefundSyncJob', 'DEFAULT', NULL, 1690117560000, 1690117500000, 5, 'PAUSED', 'CRON', 1690117424000, 0, NULL, 0, 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C770800000010000000037400114A4F425F48414E444C45525F504152414D707400124A4F425F52455452595F494E54455256414C737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B02000078700000000074000F4A4F425F52455452595F434F554E5471007E000B7800); +COMMIT; + +-- ---------------------------- +-- Table structure for infra_api_access_log +-- ---------------------------- +DROP TABLE IF EXISTS `infra_api_access_log`; +CREATE TABLE `infra_api_access_log` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '日志主键', + `trace_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '链路追踪编号', + `user_id` bigint NOT NULL DEFAULT 0 COMMENT '用户编号', + `application_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '应用名', + `request_method` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '请求方法名', + `request_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '请求地址', + `request_params` varchar(8000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '请求参数', + `user_ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户 IP', + `user_agent` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '浏览器 UA', + `begin_time` datetime NOT NULL COMMENT '开始请求时间', + `end_time` datetime NOT NULL COMMENT '结束请求时间', + `duration` int NOT NULL COMMENT '执行时长', + `result_code` int NOT NULL DEFAULT 0 COMMENT '结果码', + `result_msg` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '结果提示', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 35832 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'API 访问日志表'; + +-- ---------------------------- +-- Records of infra_api_access_log +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for infra_api_error_log +-- ---------------------------- +DROP TABLE IF EXISTS `infra_api_error_log`; +CREATE TABLE `infra_api_error_log` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '编号', + `trace_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '链路追踪编号\n *\n * 一般来说,通过链路追踪编号,可以将访问日志,错误日志,链路追踪日志,logger 打印日志等,结合在一起,从而进行排错。', + `user_id` int NOT NULL DEFAULT 0 COMMENT '用户编号', + `application_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '应用名\n *\n * 目前读取 spring.application.name', + `request_method` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '请求方法名', + `request_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '请求地址', + `request_params` varchar(8000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '请求参数', + `user_ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户 IP', + `user_agent` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '浏览器 UA', + `exception_time` datetime NOT NULL COMMENT '异常发生时间', + `exception_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '异常名\n *\n * {@link Throwable#getClass()} 的类全名', + `exception_message` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '异常导致的消息\n *\n * {@link cn.iocoder.common.framework.util.ExceptionUtil#getMessage(Throwable)}', + `exception_root_cause_message` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '异常导致的根消息\n *\n * {@link cn.iocoder.common.framework.util.ExceptionUtil#getRootCauseMessage(Throwable)}', + `exception_stack_trace` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '异常的栈轨迹\n *\n * {@link cn.iocoder.common.framework.util.ExceptionUtil#getServiceException(Exception)}', + `exception_class_name` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '异常发生的类全名\n *\n * {@link StackTraceElement#getClassName()}', + `exception_file_name` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '异常发生的类文件\n *\n * {@link StackTraceElement#getFileName()}', + `exception_method_name` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '异常发生的方法名\n *\n * {@link StackTraceElement#getMethodName()}', + `exception_line_number` int NOT NULL COMMENT '异常发生的方法所在行\n *\n * {@link StackTraceElement#getLineNumber()}', + `process_status` tinyint NOT NULL COMMENT '处理状态', + `process_time` datetime NULL DEFAULT NULL COMMENT '处理时间', + `process_user_id` int NULL DEFAULT 0 COMMENT '处理用户编号', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1497 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '系统异常日志'; + +-- ---------------------------- +-- Records of infra_api_error_log +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for infra_codegen_column +-- ---------------------------- +DROP TABLE IF EXISTS `infra_codegen_column`; +CREATE TABLE `infra_codegen_column` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + `table_id` bigint NOT NULL COMMENT '表编号', + `column_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '字段名', + `data_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '字段类型', + `column_comment` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '字段描述', + `nullable` bit(1) NOT NULL COMMENT '是否允许为空', + `primary_key` bit(1) NOT NULL COMMENT '是否主键', + `auto_increment` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '是否自增', + `ordinal_position` int NOT NULL COMMENT '排序', + `java_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Java 属性类型', + `java_field` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Java 属性名', + `dict_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '字典类型', + `example` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '数据示例', + `create_operation` bit(1) NOT NULL COMMENT '是否为 Create 创建操作的字段', + `update_operation` bit(1) NOT NULL COMMENT '是否为 Update 更新操作的字段', + `list_operation` bit(1) NOT NULL COMMENT '是否为 List 查询操作的字段', + `list_operation_condition` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '=' COMMENT 'List 查询操作的条件类型', + `list_operation_result` bit(1) NOT NULL COMMENT '是否为 List 查询操作的返回字段', + `html_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '显示类型', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1756 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '代码生成表字段定义'; + +-- ---------------------------- +-- Records of infra_codegen_column +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for infra_codegen_table +-- ---------------------------- +DROP TABLE IF EXISTS `infra_codegen_table`; +CREATE TABLE `infra_codegen_table` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + `data_source_config_id` bigint NOT NULL COMMENT '数据源配置的编号', + `scene` tinyint NOT NULL DEFAULT 1 COMMENT '生成场景', + `table_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '表名称', + `table_comment` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '表描述', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '备注', + `module_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '模块名', + `business_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '业务名', + `class_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '类名称', + `class_comment` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '类描述', + `author` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '作者', + `template_type` tinyint NOT NULL DEFAULT 1 COMMENT '模板类型', + `front_type` tinyint NOT NULL COMMENT '前端类型', + `parent_menu_id` bigint NULL DEFAULT NULL COMMENT '父菜单编号', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 134 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '代码生成表定义'; + +-- ---------------------------- +-- Records of infra_codegen_table +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for infra_config +-- ---------------------------- +DROP TABLE IF EXISTS `infra_config`; +CREATE TABLE `infra_config` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '参数主键', + `category` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '参数分组', + `type` tinyint NOT NULL COMMENT '参数类型', + `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '参数名称', + `config_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '参数键名', + `value` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '参数键值', + `visible` bit(1) NOT NULL COMMENT '是否可见', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '备注', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 12 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '参数配置表'; + +-- ---------------------------- +-- Records of infra_config +-- ---------------------------- +BEGIN; +INSERT INTO `infra_config` (`id`, `category`, `type`, `name`, `config_key`, `value`, `visible`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2, 'biz', 1, '用户管理-账号初始密码', 'sys.user.init-password', '123456', b'0', '初始化密码 123456', 'admin', '2021-01-05 17:03:48', '1', '2022-03-20 02:25:51', b'0'); +INSERT INTO `infra_config` (`id`, `category`, `type`, `name`, `config_key`, `value`, `visible`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (7, 'url', 2, 'MySQL 监控的地址', 'url.druid', '', b'1', '', '1', '2023-04-07 13:41:16', '1', '2023-04-07 14:33:38', b'0'); +INSERT INTO `infra_config` (`id`, `category`, `type`, `name`, `config_key`, `value`, `visible`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (8, 'url', 2, 'SkyWalking 监控的地址', 'url.skywalking', '', b'1', '', '1', '2023-04-07 13:41:16', '1', '2023-04-07 14:57:03', b'0'); +INSERT INTO `infra_config` (`id`, `category`, `type`, `name`, `config_key`, `value`, `visible`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (9, 'url', 2, 'Spring Boot Admin 监控的地址', 'url.spring-boot-admin', '', b'1', '', '1', '2023-04-07 13:41:16', '1', '2023-04-07 14:52:07', b'0'); +INSERT INTO `infra_config` (`id`, `category`, `type`, `name`, `config_key`, `value`, `visible`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (10, 'url', 2, 'Swagger 接口文档的地址', 'url.swagger', '', b'1', '', '1', '2023-04-07 13:41:16', '1', '2023-04-07 14:59:00', b'0'); +INSERT INTO `infra_config` (`id`, `category`, `type`, `name`, `config_key`, `value`, `visible`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (11, 'ui', 2, '腾讯地图 key', 'tencent.lbs.key', 'TVDBZ-TDILD-4ON4B-PFDZA-RNLKH-VVF6E', b'1', '腾讯地图 key', '1', '2023-06-03 19:16:27', '1', '2023-06-03 19:16:27', b'0'); +COMMIT; + +-- ---------------------------- +-- Table structure for infra_data_source_config +-- ---------------------------- +DROP TABLE IF EXISTS `infra_data_source_config`; +CREATE TABLE `infra_data_source_config` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键编号', + `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '参数名称', + `url` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '数据源连接', + `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户名', + `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '密码', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 13 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '数据源配置表'; + +-- ---------------------------- +-- Records of infra_data_source_config +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for infra_file +-- ---------------------------- +DROP TABLE IF EXISTS `infra_file`; +CREATE TABLE `infra_file` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '文件编号', + `config_id` bigint NULL DEFAULT NULL COMMENT '配置编号', + `name` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '文件名', + `path` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '文件路径', + `url` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '文件 URL', + `type` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '文件类型', + `size` int NOT NULL COMMENT '文件大小', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1054 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '文件表'; + +-- ---------------------------- +-- Records of infra_file +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for infra_file_config +-- ---------------------------- +DROP TABLE IF EXISTS `infra_file_config`; +CREATE TABLE `infra_file_config` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + `name` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '配置名', + `storage` tinyint NOT NULL COMMENT '存储器', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '备注', + `master` bit(1) NOT NULL COMMENT '是否为主配置', + `config` varchar(4096) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '存储配置', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 18 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '文件配置表'; + +-- ---------------------------- +-- Records of infra_file_config +-- ---------------------------- +BEGIN; +INSERT INTO `infra_file_config` (`id`, `name`, `storage`, `remark`, `master`, `config`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (4, '数据库', 1, '我是数据库', b'1', '{\"@class\":\"com.win.framework.file.core.client.db.DBFileClientConfig\",\"domain\":\"http://127.0.0.1:48080\"}', '1', '2022-03-15 23:56:24', '1', '2023-04-08 09:44:47', b'0'); +INSERT INTO `infra_file_config` (`id`, `name`, `storage`, `remark`, `master`, `config`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (5, '本地磁盘', 10, '测试下本地存储', b'0', '{\"@class\":\"com.win.framework.file.core.client.local.LocalFileClientConfig\",\"basePath\":\"/Users/yunai/file_test\",\"domain\":\"http://127.0.0.1:48080\"}', '1', '2022-03-15 23:57:00', '1', '2023-04-08 09:44:47', b'0'); +INSERT INTO `infra_file_config` (`id`, `name`, `storage`, `remark`, `master`, `config`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (11, 'S3 - 七牛云', 20, NULL, b'0', '{\"@class\":\"com.win.framework.file.core.client.s3.S3FileClientConfig\",\"endpoint\":\"s3-cn-south-1.qiniucs.com\",\"domain\":\"http://test.win.iocoder.cn\",\"bucket\":\"ruoyi-vue-pro\",\"accessKey\":\"b7yvuhBSAGjmtPhMFcn9iMOxUOY_I06cA_p0ZUx8\",\"accessSecret\":\"kXM1l5ia1RvSX3QaOEcwI3RLz3Y2rmNszWonKZtP\"}', '1', '2022-03-19 18:00:03', '1', '2023-04-08 09:44:47', b'0'); +INSERT INTO `infra_file_config` (`id`, `name`, `storage`, `remark`, `master`, `config`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (15, 'S3 - 七牛云', 20, '', b'0', '{\"@class\":\"com.win.framework.file.core.client.s3.S3FileClientConfig\",\"endpoint\":\"s3-cn-south-1.qiniucs.com\",\"domain\":\"http://test.win.iocoder.cn\",\"bucket\":\"ruoyi-vue-pro\",\"accessKey\":\"b7yvuhBSAGjmtPhMFcn9iMOxUOY_I06cA_p0ZUx8\",\"accessSecret\":\"kXM1l5ia1RvSX3QaOEcwI3RLz3Y2rmNszWonKZtP\"}', '1', '2022-06-10 20:50:41', '1', '2023-04-08 09:44:47', b'0'); +INSERT INTO `infra_file_config` (`id`, `name`, `storage`, `remark`, `master`, `config`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (16, 'S3 - 七牛云', 20, '', b'0', '{\"@class\":\"com.win.framework.file.core.client.s3.S3FileClientConfig\",\"endpoint\":\"s3-cn-south-1.qiniucs.com\",\"domain\":\"http://test.win.iocoder.cn\",\"bucket\":\"ruoyi-vue-pro\",\"accessKey\":\"b7yvuhBSAGjmtPhMFcn9iMOxUOY_I06cA_p0ZUx8\",\"accessSecret\":\"kXM1l5ia1RvSX3QaOEcwI3RLz3Y2rmNszWonKZtP\"}', '1', '2022-06-11 20:32:08', '1', '2023-04-08 09:44:47', b'0'); +INSERT INTO `infra_file_config` (`id`, `name`, `storage`, `remark`, `master`, `config`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (17, 'S3 - 七牛云', 20, '', b'0', '{\"@class\":\"com.win.framework.file.core.client.s3.S3FileClientConfig\",\"endpoint\":\"s3-cn-south-1.qiniucs.com\",\"domain\":\"http://test.win.iocoder.cn\",\"bucket\":\"ruoyi-vue-pro\",\"accessKey\":\"b7yvuhBSAGjmtPhMFcn9iMOxUOY_I06cA_p0ZUx8\",\"accessSecret\":\"kXM1l5ia1RvSX3QaOEcwI3RLz3Y2rmNszWonKZtP\"}', '1', '2022-06-11 20:32:47', '1', '2023-04-08 09:44:47', b'0'); +COMMIT; + +-- ---------------------------- +-- Table structure for infra_file_content +-- ---------------------------- +DROP TABLE IF EXISTS `infra_file_content`; +CREATE TABLE `infra_file_content` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + `config_id` bigint NOT NULL COMMENT '配置编号', + `path` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '文件路径', + `content` mediumblob NOT NULL COMMENT '文件内容', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 145 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '文件表'; + +-- ---------------------------- +-- Records of infra_file_content +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for infra_job +-- ---------------------------- +DROP TABLE IF EXISTS `infra_job`; +CREATE TABLE `infra_job` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '任务编号', + `name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '任务名称', + `status` tinyint NOT NULL COMMENT '任务状态', + `handler_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '处理器的名字', + `handler_param` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '处理器的参数', + `cron_expression` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'CRON 表达式', + `retry_count` int NOT NULL DEFAULT 0 COMMENT '重试次数', + `retry_interval` int NOT NULL DEFAULT 0 COMMENT '重试间隔', + `monitor_timeout` int NOT NULL DEFAULT 0 COMMENT '监控超时时间', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 20 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '定时任务表'; + +-- ---------------------------- +-- Records of infra_job +-- ---------------------------- +BEGIN; +INSERT INTO `infra_job` (`id`, `name`, `status`, `handler_name`, `handler_param`, `cron_expression`, `retry_count`, `retry_interval`, `monitor_timeout`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (5, '支付通知 Job', 2, 'payNotifyJob', NULL, '* * * * * ?', 0, 0, 0, '1', '2021-10-27 08:34:42', '1', '2023-07-09 20:51:41', b'0'); +INSERT INTO `infra_job` (`id`, `name`, `status`, `handler_name`, `handler_param`, `cron_expression`, `retry_count`, `retry_interval`, `monitor_timeout`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (16, 'Job 示例', 1, 'demoJob', NULL, '* * * L * ?', 1, 1, 0, '1', '2022-09-24 22:31:41', '1', '2022-09-24 22:31:42', b'0'); +INSERT INTO `infra_job` (`id`, `name`, `status`, `handler_name`, `handler_param`, `cron_expression`, `retry_count`, `retry_interval`, `monitor_timeout`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (17, '支付订单同步 Job', 2, 'payOrderSyncJob', NULL, '0 0/1 * * * ?', 0, 0, 0, '1', '2023-07-22 14:36:26', '1', '2023-07-22 15:39:08', b'0'); +INSERT INTO `infra_job` (`id`, `name`, `status`, `handler_name`, `handler_param`, `cron_expression`, `retry_count`, `retry_interval`, `monitor_timeout`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (18, '支付订单过期 Job', 2, 'payOrderExpireJob', NULL, '0 0/1 * * * ?', 0, 0, 0, '1', '2023-07-22 15:36:23', '1', '2023-07-22 15:39:54', b'0'); +INSERT INTO `infra_job` (`id`, `name`, `status`, `handler_name`, `handler_param`, `cron_expression`, `retry_count`, `retry_interval`, `monitor_timeout`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (19, '退款订单的同步 Job', 2, 'payRefundSyncJob', NULL, '0 0/1 * * * ?', 0, 0, 0, '1', '2023-07-23 21:03:44', '1', '2023-07-23 21:09:00', b'0'); +COMMIT; + +-- ---------------------------- +-- Table structure for infra_job_log +-- ---------------------------- +DROP TABLE IF EXISTS `infra_job_log`; +CREATE TABLE `infra_job_log` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '日志编号', + `job_id` bigint NOT NULL COMMENT '任务编号', + `handler_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '处理器的名字', + `handler_param` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '处理器的参数', + `execute_index` tinyint NOT NULL DEFAULT 1 COMMENT '第几次执行', + `begin_time` datetime NOT NULL COMMENT '开始执行时间', + `end_time` datetime NULL DEFAULT NULL COMMENT '结束执行时间', + `duration` int NULL DEFAULT NULL COMMENT '执行时长', + `status` tinyint NOT NULL COMMENT '任务状态', + `result` varchar(4000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '结果数据', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 161 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '定时任务日志表'; + +-- ---------------------------- +-- Records of infra_job_log +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for infra_test_demo +-- ---------------------------- +DROP TABLE IF EXISTS `infra_test_demo`; +CREATE TABLE `infra_test_demo` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '名字', + `status` tinyint NOT NULL DEFAULT 0 COMMENT '状态', + `type` tinyint NOT NULL COMMENT '类型', + `category` tinyint NOT NULL COMMENT '分类', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '备注', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '字典类型表'; + +-- ---------------------------- +-- Records of infra_test_demo +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for system_dept +-- ---------------------------- +DROP TABLE IF EXISTS `system_dept`; +CREATE TABLE `system_dept` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '部门id', + `name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '部门名称', + `parent_id` bigint NOT NULL DEFAULT 0 COMMENT '父部门id', + `sort` int NOT NULL DEFAULT 0 COMMENT '显示顺序', + `leader_user_id` bigint NULL DEFAULT NULL COMMENT '负责人', + `phone` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '联系电话', + `email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '邮箱', + `status` tinyint NOT NULL COMMENT '部门状态(0正常 1停用)', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 112 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '部门表'; + +-- ---------------------------- +-- Records of system_dept +-- ---------------------------- +BEGIN; +INSERT INTO `system_dept` (`id`, `name`, `parent_id`, `sort`, `leader_user_id`, `phone`, `email`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (100, '闻荫源码', 0, 0, 1, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '1', '2022-06-19 00:29:10', b'0', 1); +INSERT INTO `system_dept` (`id`, `name`, `parent_id`, `sort`, `leader_user_id`, `phone`, `email`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (101, '深圳总公司', 100, 1, 104, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '1', '2022-05-16 20:25:23', b'0', 1); +INSERT INTO `system_dept` (`id`, `name`, `parent_id`, `sort`, `leader_user_id`, `phone`, `email`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (102, '长沙分公司', 100, 2, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-12-15 05:01:40', b'0', 1); +INSERT INTO `system_dept` (`id`, `name`, `parent_id`, `sort`, `leader_user_id`, `phone`, `email`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (103, '研发部门', 101, 1, 104, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '103', '2022-01-14 01:04:14', b'0', 1); +INSERT INTO `system_dept` (`id`, `name`, `parent_id`, `sort`, `leader_user_id`, `phone`, `email`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (104, '市场部门', 101, 2, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-12-15 05:01:38', b'0', 1); +INSERT INTO `system_dept` (`id`, `name`, `parent_id`, `sort`, `leader_user_id`, `phone`, `email`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (105, '测试部门', 101, 3, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '1', '2022-05-16 20:25:15', b'0', 1); +INSERT INTO `system_dept` (`id`, `name`, `parent_id`, `sort`, `leader_user_id`, `phone`, `email`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (106, '财务部门', 101, 4, 103, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '103', '2022-01-15 21:32:22', b'0', 1); +INSERT INTO `system_dept` (`id`, `name`, `parent_id`, `sort`, `leader_user_id`, `phone`, `email`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (107, '运维部门', 101, 5, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-12-15 05:01:33', b'0', 1); +INSERT INTO `system_dept` (`id`, `name`, `parent_id`, `sort`, `leader_user_id`, `phone`, `email`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (108, '市场部门', 102, 1, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '1', '2022-02-16 08:35:45', b'0', 1); +INSERT INTO `system_dept` (`id`, `name`, `parent_id`, `sort`, `leader_user_id`, `phone`, `email`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (109, '财务部门', 102, 2, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-12-15 05:01:29', b'0', 1); +INSERT INTO `system_dept` (`id`, `name`, `parent_id`, `sort`, `leader_user_id`, `phone`, `email`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (110, '新部门', 0, 1, NULL, NULL, NULL, 0, '110', '2022-02-23 20:46:30', '110', '2022-02-23 20:46:30', b'0', 121); +INSERT INTO `system_dept` (`id`, `name`, `parent_id`, `sort`, `leader_user_id`, `phone`, `email`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (111, '顶级部门', 0, 1, NULL, NULL, NULL, 0, '113', '2022-03-07 21:44:50', '113', '2022-03-07 21:44:50', b'0', 122); +COMMIT; + +-- ---------------------------- +-- Table structure for system_dict_data +-- ---------------------------- +DROP TABLE IF EXISTS `system_dict_data`; +CREATE TABLE `system_dict_data` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '字典编码', + `sort` int NOT NULL DEFAULT 0 COMMENT '字典排序', + `label` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '字典标签', + `value` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '字典键值', + `dict_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '字典类型', + `status` tinyint NOT NULL DEFAULT 0 COMMENT '状态(0正常 1停用)', + `color_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '颜色类型', + `css_class` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT 'css 样式', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '备注', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1359 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '字典数据表'; + +-- ---------------------------- +-- Records of system_dict_data +-- ---------------------------- +BEGIN; +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1, 1, '男', '1', 'system_user_sex', 0, 'default', 'A', '性别男', 'admin', '2021-01-05 17:03:48', '1', '2022-03-29 00:14:39', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2, 2, '女', '2', 'system_user_sex', 1, 'success', '', '性别女', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 01:30:51', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (8, 1, '正常', '1', 'infra_job_status', 0, 'success', '', '正常状态', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 19:33:38', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (9, 2, '暂停', '2', 'infra_job_status', 0, 'danger', '', '停用状态', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 19:33:45', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (12, 1, '系统内置', '1', 'infra_config_type', 0, 'danger', '', '参数类型 - 系统内置', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 19:06:02', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (13, 2, '自定义', '2', 'infra_config_type', 0, 'primary', '', '参数类型 - 自定义', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 19:06:07', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (14, 1, '通知', '1', 'system_notice_type', 0, 'success', '', '通知', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 13:05:57', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (15, 2, '公告', '2', 'system_notice_type', 0, 'info', '', '公告', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 13:06:01', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (16, 0, '其它', '0', 'system_operate_type', 0, 'default', '', '其它操作', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 09:32:46', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (17, 1, '查询', '1', 'system_operate_type', 0, 'info', '', '查询操作', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 09:33:16', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (18, 2, '新增', '2', 'system_operate_type', 0, 'primary', '', '新增操作', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 09:33:13', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (19, 3, '修改', '3', 'system_operate_type', 0, 'warning', '', '修改操作', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 09:33:22', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (20, 4, '删除', '4', 'system_operate_type', 0, 'danger', '', '删除操作', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 09:33:27', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (22, 5, '导出', '5', 'system_operate_type', 0, 'default', '', '导出操作', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 09:33:32', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (23, 6, '导入', '6', 'system_operate_type', 0, 'default', '', '导入操作', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 09:33:35', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (27, 1, '开启', '0', 'common_status', 0, 'primary', '', '开启状态', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 08:00:39', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (28, 2, '关闭', '1', 'common_status', 0, 'info', '', '关闭状态', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 08:00:44', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (29, 1, '目录', '1', 'system_menu_type', 0, '', '', '目录', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:43:45', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (30, 2, '菜单', '2', 'system_menu_type', 0, '', '', '菜单', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:43:41', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (31, 3, '按钮', '3', 'system_menu_type', 0, '', '', '按钮', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:43:39', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (32, 1, '内置', '1', 'system_role_type', 0, 'danger', '', '内置角色', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 13:02:08', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (33, 2, '自定义', '2', 'system_role_type', 0, 'primary', '', '自定义角色', 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 13:02:12', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (34, 1, '全部数据权限', '1', 'system_data_scope', 0, '', '', '全部数据权限', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:47:17', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (35, 2, '指定部门数据权限', '2', 'system_data_scope', 0, '', '', '指定部门数据权限', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:47:18', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (36, 3, '本部门数据权限', '3', 'system_data_scope', 0, '', '', '本部门数据权限', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:47:16', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (37, 4, '本部门及以下数据权限', '4', 'system_data_scope', 0, '', '', '本部门及以下数据权限', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:47:21', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (38, 5, '仅本人数据权限', '5', 'system_data_scope', 0, '', '', '仅本人数据权限', 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:47:23', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (39, 0, '成功', '0', 'system_login_result', 0, 'success', '', '登陆结果 - 成功', '', '2021-01-18 06:17:36', '1', '2022-02-16 13:23:49', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (40, 10, '账号或密码不正确', '10', 'system_login_result', 0, 'primary', '', '登陆结果 - 账号或密码不正确', '', '2021-01-18 06:17:54', '1', '2022-02-16 13:24:27', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (41, 20, '用户被禁用', '20', 'system_login_result', 0, 'warning', '', '登陆结果 - 用户被禁用', '', '2021-01-18 06:17:54', '1', '2022-02-16 13:23:57', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (42, 30, '验证码不存在', '30', 'system_login_result', 0, 'info', '', '登陆结果 - 验证码不存在', '', '2021-01-18 06:17:54', '1', '2022-02-16 13:24:07', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (43, 31, '验证码不正确', '31', 'system_login_result', 0, 'info', '', '登陆结果 - 验证码不正确', '', '2021-01-18 06:17:54', '1', '2022-02-16 13:24:11', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (44, 100, '未知异常', '100', 'system_login_result', 0, 'danger', '', '登陆结果 - 未知异常', '', '2021-01-18 06:17:54', '1', '2022-02-16 13:24:23', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (45, 1, '是', 'true', 'infra_boolean_string', 0, 'danger', '', 'Boolean 是否类型 - 是', '', '2021-01-19 03:20:55', '1', '2022-03-15 23:01:45', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (46, 1, '否', 'false', 'infra_boolean_string', 0, 'info', '', 'Boolean 是否类型 - 否', '', '2021-01-19 03:20:55', '1', '2022-03-15 23:09:45', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (50, 1, '单表(增删改查)', '1', 'infra_codegen_template_type', 0, '', '', NULL, '', '2021-02-05 07:09:06', '', '2022-03-10 16:33:15', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (51, 2, '树表(增删改查)', '2', 'infra_codegen_template_type', 0, '', '', NULL, '', '2021-02-05 07:14:46', '', '2022-03-10 16:33:19', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (53, 0, '初始化中', '0', 'infra_job_status', 0, 'primary', '', NULL, '', '2021-02-07 07:46:49', '1', '2022-02-16 19:33:29', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (57, 0, '运行中', '0', 'infra_job_log_status', 0, 'primary', '', 'RUNNING', '', '2021-02-08 10:04:24', '1', '2022-02-16 19:07:48', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (58, 1, '成功', '1', 'infra_job_log_status', 0, 'success', '', NULL, '', '2021-02-08 10:06:57', '1', '2022-02-16 19:07:52', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (59, 2, '失败', '2', 'infra_job_log_status', 0, 'warning', '', '失败', '', '2021-02-08 10:07:38', '1', '2022-02-16 19:07:56', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (62, 0, '未处理', '0', 'infra_api_error_log_process_status', 0, 'primary', '', NULL, '', '2021-02-26 07:07:19', '1', '2022-02-16 20:14:17', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (63, 1, '已处理', '1', 'infra_api_error_log_process_status', 0, 'success', '', NULL, '', '2021-02-26 07:07:26', '1', '2022-02-16 20:14:08', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (64, 2, '已忽略', '2', 'infra_api_error_log_process_status', 0, 'danger', '', NULL, '', '2021-02-26 07:07:34', '1', '2022-02-16 20:14:14', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (66, 2, '阿里云', 'ALIYUN', 'system_sms_channel_code', 0, 'primary', '', NULL, '1', '2021-04-05 01:05:26', '1', '2022-02-16 10:09:52', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (67, 1, '验证码', '1', 'system_sms_template_type', 0, 'warning', '', NULL, '1', '2021-04-05 21:50:57', '1', '2022-02-16 12:48:30', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (68, 2, '通知', '2', 'system_sms_template_type', 0, 'primary', '', NULL, '1', '2021-04-05 21:51:08', '1', '2022-02-16 12:48:27', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (69, 0, '营销', '3', 'system_sms_template_type', 0, 'danger', '', NULL, '1', '2021-04-05 21:51:15', '1', '2022-02-16 12:48:22', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (70, 0, '初始化', '0', 'system_sms_send_status', 0, 'primary', '', NULL, '1', '2021-04-11 20:18:33', '1', '2022-02-16 10:26:07', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (71, 1, '发送成功', '10', 'system_sms_send_status', 0, 'success', '', NULL, '1', '2021-04-11 20:18:43', '1', '2022-02-16 10:25:56', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (72, 2, '发送失败', '20', 'system_sms_send_status', 0, 'danger', '', NULL, '1', '2021-04-11 20:18:49', '1', '2022-02-16 10:26:03', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (73, 3, '不发送', '30', 'system_sms_send_status', 0, 'info', '', NULL, '1', '2021-04-11 20:19:44', '1', '2022-02-16 10:26:10', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (74, 0, '等待结果', '0', 'system_sms_receive_status', 0, 'primary', '', NULL, '1', '2021-04-11 20:27:43', '1', '2022-02-16 10:28:24', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (75, 1, '接收成功', '10', 'system_sms_receive_status', 0, 'success', '', NULL, '1', '2021-04-11 20:29:25', '1', '2022-02-16 10:28:28', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (76, 2, '接收失败', '20', 'system_sms_receive_status', 0, 'danger', '', NULL, '1', '2021-04-11 20:29:31', '1', '2022-02-16 10:28:32', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (77, 0, '调试(钉钉)', 'DEBUG_DING_TALK', 'system_sms_channel_code', 0, 'info', '', NULL, '1', '2021-04-13 00:20:37', '1', '2022-02-16 10:10:00', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (78, 1, '自动生成', '1', 'system_error_code_type', 0, 'warning', '', NULL, '1', '2021-04-21 00:06:48', '1', '2022-02-16 13:57:20', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (79, 2, '手动编辑', '2', 'system_error_code_type', 0, 'primary', '', NULL, '1', '2021-04-21 00:07:14', '1', '2022-02-16 13:57:24', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (80, 100, '账号登录', '100', 'system_login_type', 0, 'primary', '', '账号登录', '1', '2021-10-06 00:52:02', '1', '2022-02-16 13:11:34', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (81, 101, '社交登录', '101', 'system_login_type', 0, 'info', '', '社交登录', '1', '2021-10-06 00:52:17', '1', '2022-02-16 13:11:40', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (83, 200, '主动登出', '200', 'system_login_type', 0, 'primary', '', '主动登出', '1', '2021-10-06 00:52:58', '1', '2022-02-16 13:11:49', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (85, 202, '强制登出', '202', 'system_login_type', 0, 'danger', '', '强制退出', '1', '2021-10-06 00:53:41', '1', '2022-02-16 13:11:57', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (86, 0, '病假', '1', 'bpm_oa_leave_type', 0, 'primary', '', NULL, '1', '2021-09-21 22:35:28', '1', '2022-02-16 10:00:41', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (87, 1, '事假', '2', 'bpm_oa_leave_type', 0, 'info', '', NULL, '1', '2021-09-21 22:36:11', '1', '2022-02-16 10:00:49', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (88, 2, '婚假', '3', 'bpm_oa_leave_type', 0, 'warning', '', NULL, '1', '2021-09-21 22:36:38', '1', '2022-02-16 10:00:53', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (113, 1, '微信公众号支付', 'wx_pub', 'pay_channel_code', 0, 'success', '', '微信公众号支付', '1', '2021-12-03 10:40:24', '1', '2023-07-19 20:08:47', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (114, 2, '微信小程序支付', 'wx_lite', 'pay_channel_code', 0, 'success', '', '微信小程序支付', '1', '2021-12-03 10:41:06', '1', '2023-07-19 20:08:50', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (115, 3, '微信 App 支付', 'wx_app', 'pay_channel_code', 0, 'success', '', '微信 App 支付', '1', '2021-12-03 10:41:20', '1', '2023-07-19 20:08:56', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (116, 10, '支付宝 PC 网站支付', 'alipay_pc', 'pay_channel_code', 0, 'primary', '', '支付宝 PC 网站支付', '1', '2021-12-03 10:42:09', '1', '2023-07-19 20:09:12', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (117, 11, '支付宝 Wap 网站支付', 'alipay_wap', 'pay_channel_code', 0, 'primary', '', '支付宝 Wap 网站支付', '1', '2021-12-03 10:42:26', '1', '2023-07-19 20:09:16', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (118, 12, '支付宝 App 支付', 'alipay_app', 'pay_channel_code', 0, 'primary', '', '支付宝 App 支付', '1', '2021-12-03 10:42:55', '1', '2023-07-19 20:09:20', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (119, 14, '支付宝扫码支付', 'alipay_qr', 'pay_channel_code', 0, 'primary', '', '支付宝扫码支付', '1', '2021-12-03 10:43:10', '1', '2023-07-19 20:09:28', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (120, 10, '通知成功', '10', 'pay_notify_status', 0, 'success', '', '通知成功', '1', '2021-12-03 11:02:41', '1', '2023-07-19 10:08:19', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (121, 20, '通知失败', '20', 'pay_notify_status', 0, 'danger', '', '通知失败', '1', '2021-12-03 11:02:59', '1', '2023-07-19 10:08:21', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (122, 0, '等待通知', '0', 'pay_notify_status', 0, 'info', '', '未通知', '1', '2021-12-03 11:03:10', '1', '2023-07-19 10:08:24', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (123, 10, '支付成功', '10', 'pay_order_status', 0, 'success', '', '支付成功', '1', '2021-12-03 11:18:29', '1', '2023-07-19 18:04:28', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (124, 30, '支付关闭', '30', 'pay_order_status', 0, 'info', '', '支付关闭', '1', '2021-12-03 11:18:42', '1', '2023-07-19 18:05:07', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (125, 0, '等待支付', '0', 'pay_order_status', 0, 'info', '', '未支付', '1', '2021-12-03 11:18:18', '1', '2023-07-19 18:04:15', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1118, 0, '等待退款', '0', 'pay_refund_status', 0, 'info', '', '等待退款', '1', '2021-12-10 16:44:59', '1', '2023-07-19 10:14:39', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1119, 20, '退款失败', '20', 'pay_refund_status', 0, 'danger', '', '退款失败', '1', '2021-12-10 16:45:10', '1', '2023-07-19 10:15:10', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1124, 10, '退款成功', '10', 'pay_refund_status', 0, 'success', '', '退款成功', '1', '2021-12-10 16:46:26', '1', '2023-07-19 10:15:00', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1125, 0, '默认', '1', 'bpm_model_category', 0, 'primary', '', '流程分类 - 默认', '1', '2022-01-02 08:41:11', '1', '2022-02-16 20:01:42', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1126, 0, 'OA', '2', 'bpm_model_category', 0, 'success', '', '流程分类 - OA', '1', '2022-01-02 08:41:22', '1', '2022-02-16 20:01:50', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1127, 0, '进行中', '1', 'bpm_process_instance_status', 0, 'primary', '', '流程实例的状态 - 进行中', '1', '2022-01-07 23:47:22', '1', '2022-02-16 20:07:49', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1128, 2, '已完成', '2', 'bpm_process_instance_status', 0, 'success', '', '流程实例的状态 - 已完成', '1', '2022-01-07 23:47:49', '1', '2022-02-16 20:07:54', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1129, 1, '处理中', '1', 'bpm_process_instance_result', 0, 'primary', '', '流程实例的结果 - 处理中', '1', '2022-01-07 23:48:32', '1', '2022-02-16 09:53:26', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1130, 2, '通过', '2', 'bpm_process_instance_result', 0, 'success', '', '流程实例的结果 - 通过', '1', '2022-01-07 23:48:45', '1', '2022-02-16 09:53:31', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1131, 3, '不通过', '3', 'bpm_process_instance_result', 0, 'danger', '', '流程实例的结果 - 不通过', '1', '2022-01-07 23:48:55', '1', '2022-02-16 09:53:38', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1132, 4, '已取消', '4', 'bpm_process_instance_result', 0, 'info', '', '流程实例的结果 - 撤销', '1', '2022-01-07 23:49:06', '1', '2022-02-16 09:53:42', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1133, 10, '流程表单', '10', 'bpm_model_form_type', 0, '', '', '流程的表单类型 - 流程表单', '103', '2022-01-11 23:51:30', '103', '2022-01-11 23:51:30', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1134, 20, '业务表单', '20', 'bpm_model_form_type', 0, '', '', '流程的表单类型 - 业务表单', '103', '2022-01-11 23:51:47', '103', '2022-01-11 23:51:47', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1135, 10, '角色', '10', 'bpm_task_assign_rule_type', 0, 'info', '', '任务分配规则的类型 - 角色', '103', '2022-01-12 23:21:22', '1', '2022-02-16 20:06:14', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1136, 20, '部门的成员', '20', 'bpm_task_assign_rule_type', 0, 'primary', '', '任务分配规则的类型 - 部门的成员', '103', '2022-01-12 23:21:47', '1', '2022-02-16 20:05:28', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1137, 21, '部门的负责人', '21', 'bpm_task_assign_rule_type', 0, 'primary', '', '任务分配规则的类型 - 部门的负责人', '103', '2022-01-12 23:33:36', '1', '2022-02-16 20:05:31', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1138, 30, '用户', '30', 'bpm_task_assign_rule_type', 0, 'info', '', '任务分配规则的类型 - 用户', '103', '2022-01-12 23:34:02', '1', '2022-02-16 20:05:50', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1139, 40, '用户组', '40', 'bpm_task_assign_rule_type', 0, 'warning', '', '任务分配规则的类型 - 用户组', '103', '2022-01-12 23:34:21', '1', '2022-02-16 20:05:57', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1140, 50, '自定义脚本', '50', 'bpm_task_assign_rule_type', 0, 'danger', '', '任务分配规则的类型 - 自定义脚本', '103', '2022-01-12 23:34:43', '1', '2022-02-16 20:06:01', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1141, 22, '岗位', '22', 'bpm_task_assign_rule_type', 0, 'success', '', '任务分配规则的类型 - 岗位', '103', '2022-01-14 18:41:55', '1', '2022-02-16 20:05:39', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1142, 10, '流程发起人', '10', 'bpm_task_assign_script', 0, '', '', '任务分配自定义脚本 - 流程发起人', '103', '2022-01-15 00:10:57', '103', '2022-01-15 21:24:10', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1143, 20, '流程发起人的一级领导', '20', 'bpm_task_assign_script', 0, '', '', '任务分配自定义脚本 - 流程发起人的一级领导', '103', '2022-01-15 21:24:31', '103', '2022-01-15 21:24:31', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1144, 21, '流程发起人的二级领导', '21', 'bpm_task_assign_script', 0, '', '', '任务分配自定义脚本 - 流程发起人的二级领导', '103', '2022-01-15 21:24:46', '103', '2022-01-15 21:24:57', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1145, 1, '管理后台', '1', 'infra_codegen_scene', 0, '', '', '代码生成的场景枚举 - 管理后台', '1', '2022-02-02 13:15:06', '1', '2022-03-10 16:32:59', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1146, 2, '用户 APP', '2', 'infra_codegen_scene', 0, '', '', '代码生成的场景枚举 - 用户 APP', '1', '2022-02-02 13:15:19', '1', '2022-03-10 16:33:03', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1150, 1, '数据库', '1', 'infra_file_storage', 0, 'default', '', NULL, '1', '2022-03-15 00:25:28', '1', '2022-03-15 00:25:28', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1151, 10, '本地磁盘', '10', 'infra_file_storage', 0, 'default', '', NULL, '1', '2022-03-15 00:25:41', '1', '2022-03-15 00:25:56', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1152, 11, 'FTP 服务器', '11', 'infra_file_storage', 0, 'default', '', NULL, '1', '2022-03-15 00:26:06', '1', '2022-03-15 00:26:10', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1153, 12, 'SFTP 服务器', '12', 'infra_file_storage', 0, 'default', '', NULL, '1', '2022-03-15 00:26:22', '1', '2022-03-15 00:26:22', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1154, 20, 'S3 对象存储', '20', 'infra_file_storage', 0, 'default', '', NULL, '1', '2022-03-15 00:26:31', '1', '2022-03-15 00:26:45', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1155, 103, '短信登录', '103', 'system_login_type', 0, 'default', '', NULL, '1', '2022-05-09 23:57:58', '1', '2022-05-09 23:58:09', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1156, 1, 'password', 'password', 'system_oauth2_grant_type', 0, 'default', '', '密码模式', '1', '2022-05-12 00:22:05', '1', '2022-05-11 16:26:01', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1157, 2, 'authorization_code', 'authorization_code', 'system_oauth2_grant_type', 0, 'primary', '', '授权码模式', '1', '2022-05-12 00:22:59', '1', '2022-05-11 16:26:02', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1158, 3, 'implicit', 'implicit', 'system_oauth2_grant_type', 0, 'success', '', '简化模式', '1', '2022-05-12 00:23:40', '1', '2022-05-11 16:26:05', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1159, 4, 'client_credentials', 'client_credentials', 'system_oauth2_grant_type', 0, 'default', '', '客户端模式', '1', '2022-05-12 00:23:51', '1', '2022-05-11 16:26:08', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1160, 5, 'refresh_token', 'refresh_token', 'system_oauth2_grant_type', 0, 'info', '', '刷新模式', '1', '2022-05-12 00:24:02', '1', '2022-05-11 16:26:11', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1162, 1, '销售中', '1', 'product_spu_status', 0, 'success', '', '商品 SPU 状态 - 销售中', '1', '2022-10-24 21:19:47', '1', '2022-10-24 21:20:38', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1163, 0, '仓库中', '0', 'product_spu_status', 0, 'info', '', '商品 SPU 状态 - 仓库中', '1', '2022-10-24 21:20:54', '1', '2022-10-24 21:21:22', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1164, 0, '回收站', '-1', 'product_spu_status', 0, 'default', '', '商品 SPU 状态 - 回收站', '1', '2022-10-24 21:21:11', '1', '2022-10-24 21:21:11', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1165, 1, '满减', '1', 'promotion_discount_type', 0, 'success', '', '优惠类型 - 满减', '1', '2022-11-01 12:46:41', '1', '2022-11-01 12:50:11', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1166, 2, '折扣', '2', 'promotion_discount_type', 0, 'primary', '', '优惠类型 - 折扣', '1', '2022-11-01 12:46:51', '1', '2022-11-01 12:50:08', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1167, 1, '固定日期', '1', 'promotion_coupon_template_validity_type', 0, 'default', '', '优惠劵模板的有限期类型 - 固定日期', '1', '2022-11-02 00:07:34', '1', '2022-11-04 00:07:49', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1168, 2, '领取之后', '2', 'promotion_coupon_template_validity_type', 0, 'default', '', '优惠劵模板的有限期类型 - 领取之后', '1', '2022-11-02 00:07:54', '1', '2022-11-04 00:07:52', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1169, 1, '通用卷', '1', 'promotion_product_scope', 0, 'default', '', '营销的商品范围 - 全部商品参与', '1', '2022-11-02 00:28:22', '1', '2023-09-01 23:42:49', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1170, 2, '商品卷', '2', 'promotion_product_scope', 0, 'default', '', '营销的商品范围 - 指定商品参与', '1', '2022-11-02 00:28:34', '1', '2023-09-01 23:42:54', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1171, 1, '已领取', '1', 'promotion_coupon_status', 0, 'primary', '', '优惠劵的状态 - 已领取', '1', '2022-11-04 00:15:08', '1', '2022-11-04 19:16:04', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1172, 2, '已使用', '2', 'promotion_coupon_status', 0, 'success', '', '优惠劵的状态 - 已使用', '1', '2022-11-04 00:15:21', '1', '2022-11-04 19:16:08', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1173, 3, '已过期', '3', 'promotion_coupon_status', 0, 'info', '', '优惠劵的状态 - 已过期', '1', '2022-11-04 00:15:43', '1', '2022-11-04 19:16:12', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1174, 1, '直接领取', '1', 'promotion_coupon_take_type', 0, 'primary', '', '优惠劵的领取方式 - 直接领取', '1', '2022-11-04 19:13:00', '1', '2022-11-04 19:13:25', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1175, 2, '指定发放', '2', 'promotion_coupon_take_type', 0, 'success', '', '优惠劵的领取方式 - 指定发放', '1', '2022-11-04 19:13:13', '1', '2022-11-04 19:14:48', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1176, 10, '未开始', '10', 'promotion_activity_status', 0, 'primary', '', '促销活动的状态枚举 - 未开始', '1', '2022-11-04 22:54:49', '1', '2022-11-04 22:55:53', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1177, 20, '进行中', '20', 'promotion_activity_status', 0, 'success', '', '促销活动的状态枚举 - 进行中', '1', '2022-11-04 22:55:06', '1', '2022-11-04 22:55:20', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1178, 30, '已结束', '30', 'promotion_activity_status', 0, 'info', '', '促销活动的状态枚举 - 已结束', '1', '2022-11-04 22:55:41', '1', '2022-11-04 22:55:41', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1179, 40, '已关闭', '40', 'promotion_activity_status', 0, 'warning', '', '促销活动的状态枚举 - 已关闭', '1', '2022-11-04 22:56:10', '1', '2022-11-04 22:56:18', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1180, 10, '满 N 元', '10', 'promotion_condition_type', 0, 'primary', '', '营销的条件类型 - 满 N 元', '1', '2022-11-04 22:59:45', '1', '2022-11-04 22:59:45', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1181, 20, '满 N 件', '20', 'promotion_condition_type', 0, 'success', '', '营销的条件类型 - 满 N 件', '1', '2022-11-04 23:00:02', '1', '2022-11-04 23:00:02', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1182, 10, '申请售后', '10', 'trade_after_sale_status', 0, 'primary', '', '交易售后状态 - 申请售后', '1', '2022-11-19 20:53:33', '1', '2022-11-19 20:54:42', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1183, 20, '商品待退货', '20', 'trade_after_sale_status', 0, 'primary', '', '交易售后状态 - 商品待退货', '1', '2022-11-19 20:54:36', '1', '2022-11-19 20:58:58', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1184, 30, '商家待收货', '30', 'trade_after_sale_status', 0, 'primary', '', '交易售后状态 - 商家待收货', '1', '2022-11-19 20:56:56', '1', '2022-11-19 20:59:20', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1185, 40, '等待退款', '40', 'trade_after_sale_status', 0, 'primary', '', '交易售后状态 - 等待退款', '1', '2022-11-19 20:59:54', '1', '2022-11-19 21:00:01', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1186, 50, '退款成功', '50', 'trade_after_sale_status', 0, 'default', '', '交易售后状态 - 退款成功', '1', '2022-11-19 21:00:33', '1', '2022-11-19 21:00:33', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1187, 61, '买家取消', '61', 'trade_after_sale_status', 0, 'info', '', '交易售后状态 - 买家取消', '1', '2022-11-19 21:01:29', '1', '2022-11-19 21:01:29', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1188, 62, '商家拒绝', '62', 'trade_after_sale_status', 0, 'info', '', '交易售后状态 - 商家拒绝', '1', '2022-11-19 21:02:17', '1', '2022-11-19 21:02:17', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1189, 63, '商家拒收货', '63', 'trade_after_sale_status', 0, 'info', '', '交易售后状态 - 商家拒收货', '1', '2022-11-19 21:02:37', '1', '2022-11-19 21:03:07', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1190, 10, '售中退款', '10', 'trade_after_sale_type', 0, 'success', '', '交易售后的类型 - 售中退款', '1', '2022-11-19 21:05:05', '1', '2022-11-19 21:38:23', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1191, 20, '售后退款', '20', 'trade_after_sale_type', 0, 'primary', '', '交易售后的类型 - 售后退款', '1', '2022-11-19 21:05:32', '1', '2022-11-19 21:38:32', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1192, 10, '仅退款', '10', 'trade_after_sale_way', 0, 'primary', '', '交易售后的方式 - 仅退款', '1', '2022-11-19 21:39:19', '1', '2022-11-19 21:39:19', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1193, 20, '退货退款', '20', 'trade_after_sale_way', 0, 'success', '', '交易售后的方式 - 退货退款', '1', '2022-11-19 21:39:38', '1', '2022-11-19 21:39:49', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1194, 10, '微信小程序', '10', 'terminal', 0, 'default', '', '终端 - 微信小程序', '1', '2022-12-10 10:51:11', '1', '2022-12-10 10:51:57', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1195, 20, 'H5 网页', '20', 'terminal', 0, 'default', '', '终端 - H5 网页', '1', '2022-12-10 10:51:30', '1', '2022-12-10 10:51:59', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1196, 11, '微信公众号', '11', 'terminal', 0, 'default', '', '终端 - 微信公众号', '1', '2022-12-10 10:54:16', '1', '2022-12-10 10:52:01', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1197, 31, '苹果 App', '31', 'terminal', 0, 'default', '', '终端 - 苹果 App', '1', '2022-12-10 10:54:42', '1', '2022-12-10 10:52:18', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1198, 32, '安卓 App', '32', 'terminal', 0, 'default', '', '终端 - 安卓 App', '1', '2022-12-10 10:55:02', '1', '2022-12-10 10:59:17', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1199, 0, '普通订单', '0', 'trade_order_type', 0, 'default', '', '交易订单的类型 - 普通订单', '1', '2022-12-10 16:34:14', '1', '2022-12-10 16:34:14', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1200, 1, '秒杀订单', '1', 'trade_order_type', 0, 'default', '', '交易订单的类型 - 秒杀订单', '1', '2022-12-10 16:34:26', '1', '2022-12-10 16:34:26', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1201, 2, '拼团订单', '2', 'trade_order_type', 0, 'default', '', '交易订单的类型 - 拼团订单', '1', '2022-12-10 16:34:36', '1', '2022-12-10 16:34:36', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1202, 3, '砍价订单', '3', 'trade_order_type', 0, 'default', '', '交易订单的类型 - 砍价订单', '1', '2022-12-10 16:34:48', '1', '2022-12-10 16:34:48', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1203, 0, '待支付', '0', 'trade_order_status', 0, 'default', '', '交易订单状态 - 待支付', '1', '2022-12-10 16:49:29', '1', '2022-12-10 16:49:29', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1204, 10, '待发货', '10', 'trade_order_status', 0, 'primary', '', '交易订单状态 - 待发货', '1', '2022-12-10 16:49:53', '1', '2022-12-10 16:51:17', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1205, 20, '已发货', '20', 'trade_order_status', 0, 'primary', '', '交易订单状态 - 已发货', '1', '2022-12-10 16:50:13', '1', '2022-12-10 16:51:31', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1206, 30, '已完成', '30', 'trade_order_status', 0, 'success', '', '交易订单状态 - 已完成', '1', '2022-12-10 16:50:30', '1', '2022-12-10 16:51:06', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1207, 40, '已取消', '40', 'trade_order_status', 0, 'danger', '', '交易订单状态 - 已取消', '1', '2022-12-10 16:50:50', '1', '2022-12-10 16:51:00', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1208, 0, '未售后', '0', 'trade_order_item_after_sale_status', 0, 'info', '', '交易订单项的售后状态 - 未售后', '1', '2022-12-10 20:58:42', '1', '2022-12-10 20:59:29', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1209, 1, '售后中', '1', 'trade_order_item_after_sale_status', 0, 'primary', '', '交易订单项的售后状态 - 售后中', '1', '2022-12-10 20:59:21', '1', '2022-12-10 20:59:21', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1210, 2, '已退款', '2', 'trade_order_item_after_sale_status', 0, 'success', '', '交易订单项的售后状态 - 已退款', '1', '2022-12-10 20:59:46', '1', '2022-12-10 20:59:46', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1211, 1, '完全匹配', '1', 'mp_auto_reply_request_match', 0, 'primary', '', '公众号自动回复的请求关键字匹配模式 - 完全匹配', '1', '2023-01-16 23:30:39', '1', '2023-01-16 23:31:00', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1212, 2, '半匹配', '2', 'mp_auto_reply_request_match', 0, 'success', '', '公众号自动回复的请求关键字匹配模式 - 半匹配', '1', '2023-01-16 23:30:55', '1', '2023-01-16 23:31:10', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1213, 1, '文本', 'text', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 文本', '1', '2023-01-17 22:17:32', '1', '2023-01-17 22:17:39', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1214, 2, '图片', 'image', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 图片', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:19:47', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1215, 3, '语音', 'voice', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 语音', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:20:08', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1216, 4, '视频', 'video', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 视频', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:21:08', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1217, 5, '小视频', 'shortvideo', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 小视频', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:19:59', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1218, 6, '图文', 'news', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 图文', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:22:54', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1219, 7, '音乐', 'music', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 音乐', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:22:54', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1220, 8, '地理位置', 'location', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 地理位置', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:23:51', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1221, 9, '链接', 'link', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 链接', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:24:49', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1222, 10, '事件', 'event', 'mp_message_type', 0, 'default', '', '公众号的消息类型 - 事件', '1', '2023-01-17 22:17:32', '1', '2023-01-17 14:24:49', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1223, 0, '初始化', '0', 'system_mail_send_status', 0, 'primary', '', '邮件发送状态 - 初始化\n', '1', '2023-01-26 09:53:49', '1', '2023-01-26 16:36:14', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1224, 10, '发送成功', '10', 'system_mail_send_status', 0, 'success', '', '邮件发送状态 - 发送成功', '1', '2023-01-26 09:54:28', '1', '2023-01-26 16:36:22', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1225, 20, '发送失败', '20', 'system_mail_send_status', 0, 'danger', '', '邮件发送状态 - 发送失败', '1', '2023-01-26 09:54:50', '1', '2023-01-26 16:36:26', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1226, 30, '不发送', '30', 'system_mail_send_status', 0, 'info', '', '邮件发送状态 - 不发送', '1', '2023-01-26 09:55:06', '1', '2023-01-26 16:36:36', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1227, 1, '通知公告', '1', 'system_notify_template_type', 0, 'primary', '', '站内信模版的类型 - 通知公告', '1', '2023-01-28 10:35:59', '1', '2023-01-28 10:35:59', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1228, 2, '系统消息', '2', 'system_notify_template_type', 0, 'success', '', '站内信模版的类型 - 系统消息', '1', '2023-01-28 10:36:20', '1', '2023-01-28 10:36:25', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1230, 13, '支付宝条码支付', 'alipay_bar', 'pay_channel_code', 0, 'primary', '', '支付宝条码支付', '1', '2023-02-18 23:32:24', '1', '2023-07-19 20:09:23', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1231, 10, 'Vue2 Element UI 标准模版', '10', 'infra_codegen_front_type', 0, '', '', '', '1', '2023-04-13 00:03:55', '1', '2023-04-13 00:03:55', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1232, 20, 'Vue3 Element Plus 标准模版', '20', 'infra_codegen_front_type', 0, '', '', '', '1', '2023-04-13 00:04:08', '1', '2023-04-13 00:04:08', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1233, 21, 'Vue3 Element Plus Schema 模版', '21', 'infra_codegen_front_type', 0, '', '', '', '1', '2023-04-13 00:04:26', '1', '2023-04-13 00:04:26', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1234, 30, 'Vue3 vben 模版', '30', 'infra_codegen_front_type', 0, '', '', '', '1', '2023-04-13 00:04:26', '1', '2023-04-13 00:04:26', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1235, 1, '个', '1', 'product_unit', 0, '', '', '', '1', '2023-05-23 14:38:38', '1', '2023-05-23 14:38:38', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1236, 1, '件', '2', 'product_unit', 0, '', '', '', '1', '2023-05-23 14:38:38', '1', '2023-05-23 14:38:38', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1237, 1, '盒', '3', 'product_unit', 0, '', '', '', '1', '2023-05-23 14:38:38', '1', '2023-05-23 14:38:38', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1238, 1, '袋', '4', 'product_unit', 0, '', '', '', '1', '2023-05-23 14:38:38', '1', '2023-05-23 14:38:38', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1239, 1, '箱', '5', 'product_unit', 0, '', '', '', '1', '2023-05-23 14:38:38', '1', '2023-05-23 14:38:38', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1240, 1, '套', '6', 'product_unit', 0, '', '', '', '1', '2023-05-23 14:38:38', '1', '2023-05-23 14:38:38', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1241, 1, '包', '7', 'product_unit', 0, '', '', '', '1', '2023-05-23 14:38:38', '1', '2023-05-23 14:38:38', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1242, 1, '双', '8', 'product_unit', 0, '', '', '', '1', '2023-05-23 14:38:38', '1', '2023-05-23 14:38:38', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1243, 1, '卷', '9', 'product_unit', 0, '', '', '', '1', '2023-05-23 14:38:38', '1', '2023-05-23 14:38:38', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1244, 0, '按件', '1', 'trade_delivery_express_charge_mode', 0, '', '', '', '1', '2023-05-21 22:46:40', '1', '2023-05-21 22:46:40', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1245, 1, '按重量', '2', 'trade_delivery_express_charge_mode', 0, '', '', '', '1', '2023-05-21 22:46:58', '1', '2023-05-21 22:46:58', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1246, 2, '按体积', '3', 'trade_delivery_express_charge_mode', 0, '', '', '', '1', '2023-05-21 22:47:18', '1', '2023-05-21 22:47:18', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1335, 11, '订单消费', '11', 'member_point_biz_type', 0, '', '', '', '1', '2023-06-10 12:15:27', '1', '2023-08-20 11:59:47', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1336, 1, '签到', '1', 'member_point_biz_type', 0, '', '', '', '1', '2023-06-10 12:15:48', '1', '2023-08-20 11:59:53', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1341, 20, '已退款', '20', 'pay_order_status', 0, 'danger', '', '已退款', '1', '2023-07-19 18:05:37', '1', '2023-07-19 18:05:37', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1342, 21, '请求成功,但是结果失败', '21', 'pay_notify_status', 0, 'warning', '', '请求成功,但是结果失败', '1', '2023-07-19 18:10:47', '1', '2023-07-19 18:11:38', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1343, 22, '请求失败', '22', 'pay_notify_status', 0, 'warning', '', NULL, '1', '2023-07-19 18:11:05', '1', '2023-07-19 18:11:27', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1344, 4, '微信扫码支付', 'wx_native', 'pay_channel_code', 0, 'success', '', '微信扫码支付', '1', '2023-07-19 20:07:47', '1', '2023-07-19 20:09:03', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1345, 5, '微信条码支付', 'wx_bar', 'pay_channel_code', 0, 'success', '', '微信条码支付\n', '1', '2023-07-19 20:08:06', '1', '2023-07-19 20:09:08', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1346, 1, '支付单', '1', 'pay_notify_type', 0, 'primary', '', '支付单', '1', '2023-07-20 12:23:17', '1', '2023-07-20 12:23:17', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1347, 2, '退款单', '2', 'pay_notify_type', 0, 'danger', '', NULL, '1', '2023-07-20 12:23:26', '1', '2023-07-20 12:23:26', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1348, 20, '模拟支付', 'mock', 'pay_channel_code', 0, 'default', '', '模拟支付', '1', '2023-07-29 11:10:51', '1', '2023-07-29 03:14:10', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1349, 12, '订单取消', '12', 'member_point_biz_type', 0, '', '', '', '1', '2023-08-20 12:00:03', '1', '2023-08-20 12:00:03', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1350, 0, '管理员调整', '0', 'member_experience_biz_type', 0, '', '', NULL, '', '2023-08-22 12:41:01', '', '2023-08-22 12:41:01', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1351, 1, '邀新奖励', '1', 'member_experience_biz_type', 0, '', '', NULL, '', '2023-08-22 12:41:01', '', '2023-08-22 12:41:01', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1352, 2, '下单奖励', '2', 'member_experience_biz_type', 0, '', '', NULL, '', '2023-08-22 12:41:01', '', '2023-08-22 12:41:01', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1353, 3, '退单扣除', '3', 'member_experience_biz_type', 0, '', '', NULL, '', '2023-08-22 12:41:01', '', '2023-08-22 12:41:01', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1354, 4, '签到奖励', '4', 'member_experience_biz_type', 0, '', '', NULL, '', '2023-08-22 12:41:01', '', '2023-08-22 12:41:01', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1355, 5, '抽奖奖励', '5', 'member_experience_biz_type', 0, '', '', NULL, '', '2023-08-22 12:41:01', '', '2023-08-22 12:41:01', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1356, 1, '快递发货', '1', 'trade_delivery_type', 0, '', '', '', '1', '2023-08-23 00:04:55', '1', '2023-08-23 00:04:55', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1357, 2, '用户自提', '2', 'trade_delivery_type', 0, '', '', '', '1', '2023-08-23 00:05:05', '1', '2023-08-23 00:05:05', b'0'); +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1358, 3, '品类卷', '3', 'promotion_product_scope', 0, 'default', '', '', '1', '2023-09-01 23:43:07', '1', '2023-09-01 23:43:07', b'0'); +COMMIT; + +-- ---------------------------- +-- Table structure for system_dict_type +-- ---------------------------- +DROP TABLE IF EXISTS `system_dict_type`; +CREATE TABLE `system_dict_type` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '字典主键', + `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '字典名称', + `type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '字典类型', + `status` tinyint NOT NULL DEFAULT 0 COMMENT '状态(0正常 1停用)', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '备注', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `deleted_time` datetime NULL DEFAULT NULL COMMENT '删除时间', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `dict_type`(`type` ASC) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 176 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '字典类型表'; + +-- ---------------------------- +-- Records of system_dict_type +-- ---------------------------- +BEGIN; +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (1, '用户性别', 'system_user_sex', 0, NULL, 'admin', '2021-01-05 17:03:48', '1', '2022-05-16 20:29:32', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (6, '参数类型', 'infra_config_type', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:36:54', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (7, '通知类型', 'system_notice_type', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:35:26', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (9, '操作类型', 'system_operate_type', 0, NULL, 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 09:32:21', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (10, '系统状态', 'common_status', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:21:28', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (11, 'Boolean 是否类型', 'infra_boolean_string', 0, 'boolean 转是否', '', '2021-01-19 03:20:08', '', '2022-02-01 16:37:10', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (104, '登陆结果', 'system_login_result', 0, '登陆结果', '', '2021-01-18 06:17:11', '', '2022-02-01 16:36:00', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (106, '代码生成模板类型', 'infra_codegen_template_type', 0, NULL, '', '2021-02-05 07:08:06', '1', '2022-05-16 20:26:50', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (107, '定时任务状态', 'infra_job_status', 0, NULL, '', '2021-02-07 07:44:16', '', '2022-02-01 16:51:11', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (108, '定时任务日志状态', 'infra_job_log_status', 0, NULL, '', '2021-02-08 10:03:51', '', '2022-02-01 16:50:43', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (110, 'API 异常数据的处理状态', 'infra_api_error_log_process_status', 0, NULL, '', '2021-02-26 07:07:01', '', '2022-02-01 16:50:53', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (111, '短信渠道编码', 'system_sms_channel_code', 0, NULL, '1', '2021-04-05 01:04:50', '1', '2022-02-16 02:09:08', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (112, '短信模板的类型', 'system_sms_template_type', 0, NULL, '1', '2021-04-05 21:50:43', '1', '2022-02-01 16:35:06', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (113, '短信发送状态', 'system_sms_send_status', 0, NULL, '1', '2021-04-11 20:18:03', '1', '2022-02-01 16:35:09', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (114, '短信接收状态', 'system_sms_receive_status', 0, NULL, '1', '2021-04-11 20:27:14', '1', '2022-02-01 16:35:14', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (115, '错误码的类型', 'system_error_code_type', 0, NULL, '1', '2021-04-21 00:06:30', '1', '2022-02-01 16:36:49', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (116, '登陆日志的类型', 'system_login_type', 0, '登陆日志的类型', '1', '2021-10-06 00:50:46', '1', '2022-02-01 16:35:56', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (117, 'OA 请假类型', 'bpm_oa_leave_type', 0, NULL, '1', '2021-09-21 22:34:33', '1', '2022-01-22 10:41:37', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (130, '支付渠道编码类型', 'pay_channel_code', 0, '支付渠道的编码', '1', '2021-12-03 10:35:08', '1', '2023-07-10 10:11:39', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (131, '支付回调状态', 'pay_notify_status', 0, '支付回调状态(包括退款回调)', '1', '2021-12-03 10:53:29', '1', '2023-07-19 18:09:43', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (132, '支付订单状态', 'pay_order_status', 0, '支付订单状态', '1', '2021-12-03 11:17:50', '1', '2021-12-03 11:17:50', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (134, '退款订单状态', 'pay_refund_status', 0, '退款订单状态', '1', '2021-12-10 16:42:50', '1', '2023-07-19 10:13:17', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (138, '流程分类', 'bpm_model_category', 0, '流程分类', '1', '2022-01-02 08:40:45', '1', '2022-01-02 08:40:45', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (139, '流程实例的状态', 'bpm_process_instance_status', 0, '流程实例的状态', '1', '2022-01-07 23:46:42', '1', '2022-01-07 23:46:42', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (140, '流程实例的结果', 'bpm_process_instance_result', 0, '流程实例的结果', '1', '2022-01-07 23:48:10', '1', '2022-01-07 23:48:10', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (141, '流程的表单类型', 'bpm_model_form_type', 0, '流程的表单类型', '103', '2022-01-11 23:50:45', '103', '2022-01-11 23:50:45', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (142, '任务分配规则的类型', 'bpm_task_assign_rule_type', 0, '任务分配规则的类型', '103', '2022-01-12 23:21:04', '103', '2022-01-12 15:46:10', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (143, '任务分配自定义脚本', 'bpm_task_assign_script', 0, '任务分配自定义脚本', '103', '2022-01-15 00:10:35', '103', '2022-01-15 00:10:35', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (144, '代码生成的场景枚举', 'infra_codegen_scene', 0, '代码生成的场景枚举', '1', '2022-02-02 13:14:45', '1', '2022-03-10 16:33:46', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (145, '角色类型', 'system_role_type', 0, '角色类型', '1', '2022-02-16 13:01:46', '1', '2022-02-16 13:01:46', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (146, '文件存储器', 'infra_file_storage', 0, '文件存储器', '1', '2022-03-15 00:24:38', '1', '2022-03-15 00:24:38', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (147, 'OAuth 2.0 授权类型', 'system_oauth2_grant_type', 0, 'OAuth 2.0 授权类型(模式)', '1', '2022-05-12 00:20:52', '1', '2022-05-11 16:25:49', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (149, '商品 SPU 状态', 'product_spu_status', 0, '商品 SPU 状态', '1', '2022-10-24 21:19:04', '1', '2022-10-24 21:19:08', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (150, '优惠类型', 'promotion_discount_type', 0, '优惠类型', '1', '2022-11-01 12:46:06', '1', '2022-11-01 12:46:06', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (151, '优惠劵模板的有限期类型', 'promotion_coupon_template_validity_type', 0, '优惠劵模板的有限期类型', '1', '2022-11-02 00:06:20', '1', '2022-11-04 00:08:26', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (152, '营销的商品范围', 'promotion_product_scope', 0, '营销的商品范围', '1', '2022-11-02 00:28:01', '1', '2022-11-02 00:28:01', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (153, '优惠劵的状态', 'promotion_coupon_status', 0, '优惠劵的状态', '1', '2022-11-04 00:14:49', '1', '2022-11-04 00:14:49', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (154, '优惠劵的领取方式', 'promotion_coupon_take_type', 0, '优惠劵的领取方式', '1', '2022-11-04 19:12:27', '1', '2022-11-04 19:12:27', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (155, '促销活动的状态', 'promotion_activity_status', 0, '促销活动的状态', '1', '2022-11-04 22:54:23', '1', '2022-11-04 22:54:23', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (156, '营销的条件类型', 'promotion_condition_type', 0, '营销的条件类型', '1', '2022-11-04 22:59:23', '1', '2022-11-04 22:59:23', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (157, '交易售后状态', 'trade_after_sale_status', 0, '交易售后状态', '1', '2022-11-19 20:52:56', '1', '2022-11-19 20:52:56', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (158, '交易售后的类型', 'trade_after_sale_type', 0, '交易售后的类型', '1', '2022-11-19 21:04:09', '1', '2022-11-19 21:04:09', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (159, '交易售后的方式', 'trade_after_sale_way', 0, '交易售后的方式', '1', '2022-11-19 21:39:04', '1', '2022-11-19 21:39:04', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (160, '终端', 'terminal', 0, '终端', '1', '2022-12-10 10:50:50', '1', '2022-12-10 10:53:11', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (161, '交易订单的类型', 'trade_order_type', 0, '交易订单的类型', '1', '2022-12-10 16:33:54', '1', '2022-12-10 16:33:54', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (162, '交易订单的状态', 'trade_order_status', 0, '交易订单的状态', '1', '2022-12-10 16:48:44', '1', '2022-12-10 16:48:44', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (163, '交易订单项的售后状态', 'trade_order_item_after_sale_status', 0, '交易订单项的售后状态', '1', '2022-12-10 20:58:08', '1', '2022-12-10 20:58:08', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (164, '公众号自动回复的请求关键字匹配模式', 'mp_auto_reply_request_match', 0, '公众号自动回复的请求关键字匹配模式', '1', '2023-01-16 23:29:56', '1', '2023-01-16 23:29:56', b'0', '1970-01-01 00:00:00'); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (165, '公众号的消息类型', 'mp_message_type', 0, '公众号的消息类型', '1', '2023-01-17 22:17:09', '1', '2023-01-17 22:17:09', b'0', '1970-01-01 00:00:00'); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (166, '邮件发送状态', 'system_mail_send_status', 0, '邮件发送状态', '1', '2023-01-26 09:53:13', '1', '2023-01-26 09:53:13', b'0', '1970-01-01 00:00:00'); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (167, '站内信模版的类型', 'system_notify_template_type', 0, '站内信模版的类型', '1', '2023-01-28 10:35:10', '1', '2023-01-28 10:35:10', b'0', '1970-01-01 00:00:00'); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (168, '代码生成的前端类型', 'infra_codegen_front_type', 0, '', '1', '2023-04-12 23:57:52', '1', '2023-04-12 23:57:52', b'0', '1970-01-01 00:00:00'); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (169, '商品的单位', 'product_unit', 0, '商品的单位', '1', '2023-05-24 21:23:59', '1', '2023-05-24 21:23:59', b'0', '1970-01-01 00:00:00'); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (170, '快递计费方式', 'trade_delivery_express_charge_mode', 0, '用于商城交易模块配送管理', '1', '2023-05-21 22:45:03', '1', '2023-05-21 22:45:03', b'0', '1970-01-01 00:00:00'); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (171, '积分业务类型', 'member_point_biz_type', 0, '', '1', '2023-06-10 12:15:00', '1', '2023-06-28 13:48:20', b'0', '1970-01-01 00:00:00'); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (173, '支付通知类型', 'pay_notify_type', 0, NULL, '1', '2023-07-20 12:23:03', '1', '2023-07-20 12:23:03', b'0', '1970-01-01 00:00:00'); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (174, '会员经验业务类型', 'member_experience_biz_type', 0, NULL, '', '2023-08-22 12:41:01', '', '2023-08-22 12:41:01', b'0', NULL); +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (175, '交易配送类型', 'trade_delivery_type', 0, '', '1', '2023-08-23 00:03:14', '1', '2023-08-23 00:03:14', b'0', '1970-01-01 00:00:00'); +COMMIT; + +-- ---------------------------- +-- Table structure for system_error_code +-- ---------------------------- +DROP TABLE IF EXISTS `system_error_code`; +CREATE TABLE `system_error_code` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '错误码编号', + `type` tinyint NOT NULL DEFAULT 0 COMMENT '错误码类型', + `application_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '应用名', + `code` int NOT NULL DEFAULT 0 COMMENT '错误码编码', + `message` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '错误码错误提示', + `memo` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '备注', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 5933 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '错误码表'; + +-- ---------------------------- +-- Records of system_error_code +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for system_login_log +-- ---------------------------- +DROP TABLE IF EXISTS `system_login_log`; +CREATE TABLE `system_login_log` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '访问ID', + `log_type` bigint NOT NULL COMMENT '日志类型', + `trace_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '链路追踪编号', + `user_id` bigint NOT NULL DEFAULT 0 COMMENT '用户编号', + `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '用户账号', + `result` tinyint NOT NULL COMMENT '登陆结果', + `user_ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户 IP', + `user_agent` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '浏览器 UA', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 2375 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '系统访问记录'; + +-- ---------------------------- +-- Records of system_login_log +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for system_mail_account +-- ---------------------------- +DROP TABLE IF EXISTS `system_mail_account`; +CREATE TABLE `system_mail_account` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', + `mail` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '邮箱', + `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户名', + `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '密码', + `host` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'SMTP 服务器域名', + `port` int NOT NULL COMMENT 'SMTP 服务器端口', + `ssl_enable` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否开启 SSL', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '邮箱账号表'; + +-- ---------------------------- +-- Records of system_mail_account +-- ---------------------------- +BEGIN; +INSERT INTO `system_mail_account` (`id`, `mail`, `username`, `password`, `host`, `port`, `ssl_enable`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1, '7684413@qq.com', '7684413@qq.com', '123457', '127.0.0.1', 8080, b'0', '1', '2023-01-25 17:39:52', '1', '2023-04-12 23:04:49', b'0'); +INSERT INTO `system_mail_account` (`id`, `mail`, `username`, `password`, `host`, `port`, `ssl_enable`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2, 'ydym_test@163.com', 'ydym_test@163.com', 'WBZTEINMIFVRYSOE', 'smtp.163.com', 465, b'1', '1', '2023-01-26 01:26:03', '1', '2023-04-12 22:39:38', b'0'); +INSERT INTO `system_mail_account` (`id`, `mail`, `username`, `password`, `host`, `port`, `ssl_enable`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (3, '76854114@qq.com', '3335', '11234', 'yunai1.cn', 466, b'0', '1', '2023-01-27 15:06:38', '1', '2023-01-27 07:08:36', b'1'); +INSERT INTO `system_mail_account` (`id`, `mail`, `username`, `password`, `host`, `port`, `ssl_enable`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (4, '7685413x@qq.com', '2', '3', '4', 5, b'1', '1', '2023-04-12 23:05:06', '1', '2023-04-12 15:05:11', b'1'); +COMMIT; + +-- ---------------------------- +-- Table structure for system_mail_log +-- ---------------------------- +DROP TABLE IF EXISTS `system_mail_log`; +CREATE TABLE `system_mail_log` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + `user_id` bigint NULL DEFAULT NULL COMMENT '用户编号', + `to_mail` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '接收邮箱地址', + `account_id` bigint NOT NULL COMMENT '邮箱账号编号', + `from_mail` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '发送邮箱地址', + `template_id` bigint NOT NULL COMMENT '模板编号', + `template_code` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '模板编码', + `template_nickname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '模版发送人名称', + `template_title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '邮件标题', + `template_content` varchar(10240) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '邮件内容', + `template_params` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '邮件参数', + `send_status` tinyint NOT NULL DEFAULT 0 COMMENT '发送状态', + `send_time` datetime NULL DEFAULT NULL COMMENT '发送时间', + `send_message_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '发送返回的消息 ID', + `send_exception` varchar(4096) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '发送异常', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 354 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '邮件日志表'; + +-- ---------------------------- +-- Records of system_mail_log +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for system_mail_template +-- ---------------------------- +DROP TABLE IF EXISTS `system_mail_template`; +CREATE TABLE `system_mail_template` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + `name` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '模板名称', + `code` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '模板编码', + `account_id` bigint NOT NULL COMMENT '发送的邮箱账号编号', + `nickname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '发送人名称', + `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '模板标题', + `content` varchar(10240) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '模板内容', + `params` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '参数数组', + `status` tinyint NOT NULL COMMENT '开启状态', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '备注', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 16 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '邮件模版表'; + +-- ---------------------------- +-- Records of system_mail_template +-- ---------------------------- +BEGIN; +INSERT INTO `system_mail_template` (`id`, `name`, `code`, `account_id`, `nickname`, `title`, `content`, `params`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (13, '后台用户短信登录', 'admin-sms-login', 1, '奥特曼', '你猜我猜', '

您的验证码是{code},名字是{name}

', '[\"code\",\"name\"]', 0, '3', '1', '2021-10-11 08:10:00', '1', '2023-01-26 23:22:05', b'0'); +INSERT INTO `system_mail_template` (`id`, `name`, `code`, `account_id`, `nickname`, `title`, `content`, `params`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (14, '测试模版', 'test_01', 2, '芋艿', '一个标题', '

你是 {key01} 吗?


是的话,赶紧 {key02} 一下!

', '[\"key01\",\"key02\"]', 0, NULL, '1', '2023-01-26 01:27:40', '1', '2023-01-27 10:32:16', b'0'); +INSERT INTO `system_mail_template` (`id`, `name`, `code`, `account_id`, `nickname`, `title`, `content`, `params`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (15, '3', '2', 2, '7', '4', '

45

', '[]', 1, '80', '1', '2023-01-27 15:50:35', '1', '2023-01-27 16:34:49', b'0'); +COMMIT; + +-- ---------------------------- +-- Table structure for system_menu +-- ---------------------------- +DROP TABLE IF EXISTS `system_menu`; +CREATE TABLE `system_menu` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '菜单ID', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '菜单名称', + `permission` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '权限标识', + `type` tinyint NOT NULL COMMENT '菜单类型', + `sort` int NOT NULL DEFAULT 0 COMMENT '显示顺序', + `parent_id` bigint NOT NULL DEFAULT 0 COMMENT '父菜单ID', + `path` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '路由地址', + `icon` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '#' COMMENT '菜单图标', + `component` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '组件路径', + `component_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '组件名', + `status` tinyint NOT NULL DEFAULT 0 COMMENT '菜单状态', + `visible` bit(1) NOT NULL DEFAULT b'1' COMMENT '是否可见', + `keep_alive` bit(1) NOT NULL DEFAULT b'1' COMMENT '是否缓存', + `always_show` bit(1) NOT NULL DEFAULT b'1' COMMENT '是否总是显示', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 2342 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '菜单权限表'; + +-- ---------------------------- +-- Records of system_menu +-- ---------------------------- +BEGIN; +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1, '系统管理', '', 1, 10, 0, '/system', 'system', NULL, NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2, '基础设施', '', 1, 20, 0, '/infra', 'monitor', NULL, NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (100, '用户管理', 'system:user:list', 2, 1, 1, 'user', 'user', 'system/user/index', 'SystemUser', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2023-04-08 08:31:59', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (101, '角色管理', '', 2, 2, 1, 'role', 'peoples', 'system/role/index', 'SystemRole', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2023-04-08 08:33:59', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (102, '菜单管理', '', 2, 3, 1, 'menu', 'tree-table', 'system/menu/index', 'SystemMenu', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2023-04-08 08:34:32', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (103, '部门管理', '', 2, 4, 1, 'dept', 'tree', 'system/dept/index', 'SystemDept', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2023-04-08 08:35:32', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (104, '岗位管理', '', 2, 5, 1, 'post', 'post', 'system/post/index', 'SystemPost', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2023-04-08 08:36:21', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (105, '字典管理', '', 2, 6, 1, 'dict', 'dict', 'system/dict/index', 'SystemDictType', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2023-04-08 08:36:45', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (106, '配置管理', '', 2, 6, 2, 'config', 'edit', 'infra/config/index', 'InfraConfig', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2023-04-08 10:31:17', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (107, '通知公告', '', 2, 8, 1, 'notice', 'message', 'system/notice/index', 'SystemNotice', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2023-04-08 08:45:06', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (108, '审计日志', '', 1, 9, 1, 'log', 'log', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (109, '令牌管理', '', 2, 2, 1261, 'token', 'online', 'system/oauth2/token/index', 'SystemTokenClient', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2023-04-08 08:47:41', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (110, '定时任务', '', 2, 12, 2, 'job', 'job', 'infra/job/index', 'InfraJob', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2023-04-08 10:36:49', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (111, 'MySQL 监控', '', 2, 9, 2, 'druid', 'druid', 'infra/druid/index', 'InfraDruid', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2023-04-08 09:09:30', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (113, 'Redis 监控', '', 2, 10, 2, 'redis', 'redis', 'infra/redis/index', 'InfraRedis', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2023-04-08 10:33:30', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (114, '表单构建', 'infra:build:list', 2, 2, 2, 'build', 'build', 'infra/build/index', 'InfraBuild', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2023-04-08 09:06:12', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (115, '代码生成', 'infra:codegen:query', 2, 1, 2, 'codegen', 'code', 'infra/codegen/index', 'InfraCodegen', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2023-04-08 09:02:24', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (116, '系统接口', 'infra:swagger:list', 2, 3, 2, 'swagger', 'swagger', 'infra/swagger/index', 'InfraSwagger', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2023-04-08 09:11:28', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (500, '操作日志', '', 2, 1, 108, 'operate-log', 'form', 'system/operatelog/index', 'SystemOperateLog', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2023-04-08 08:47:00', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (501, '登录日志', '', 2, 2, 108, 'login-log', 'logininfor', 'system/loginlog/index', 'SystemLoginLog', 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2023-04-08 08:46:18', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1001, '用户查询', 'system:user:query', 3, 1, 100, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1002, '用户新增', 'system:user:create', 3, 2, 100, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1003, '用户修改', 'system:user:update', 3, 3, 100, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1004, '用户删除', 'system:user:delete', 3, 4, 100, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1005, '用户导出', 'system:user:export', 3, 5, 100, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1006, '用户导入', 'system:user:import', 3, 6, 100, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1007, '重置密码', 'system:user:update-password', 3, 7, 100, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1008, '角色查询', 'system:role:query', 3, 1, 101, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1009, '角色新增', 'system:role:create', 3, 2, 101, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1010, '角色修改', 'system:role:update', 3, 3, 101, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1011, '角色删除', 'system:role:delete', 3, 4, 101, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1012, '角色导出', 'system:role:export', 3, 5, 101, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1013, '菜单查询', 'system:menu:query', 3, 1, 102, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1014, '菜单新增', 'system:menu:create', 3, 2, 102, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1015, '菜单修改', 'system:menu:update', 3, 3, 102, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1016, '菜单删除', 'system:menu:delete', 3, 4, 102, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1017, '部门查询', 'system:dept:query', 3, 1, 103, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1018, '部门新增', 'system:dept:create', 3, 2, 103, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1019, '部门修改', 'system:dept:update', 3, 3, 103, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1020, '部门删除', 'system:dept:delete', 3, 4, 103, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1021, '岗位查询', 'system:post:query', 3, 1, 104, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1022, '岗位新增', 'system:post:create', 3, 2, 104, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1023, '岗位修改', 'system:post:update', 3, 3, 104, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1024, '岗位删除', 'system:post:delete', 3, 4, 104, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1025, '岗位导出', 'system:post:export', 3, 5, 104, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1026, '字典查询', 'system:dict:query', 3, 1, 105, '#', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1027, '字典新增', 'system:dict:create', 3, 2, 105, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1028, '字典修改', 'system:dict:update', 3, 3, 105, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1029, '字典删除', 'system:dict:delete', 3, 4, 105, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1030, '字典导出', 'system:dict:export', 3, 5, 105, '#', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1031, '配置查询', 'infra:config:query', 3, 1, 106, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1032, '配置新增', 'infra:config:create', 3, 2, 106, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1033, '配置修改', 'infra:config:update', 3, 3, 106, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1034, '配置删除', 'infra:config:delete', 3, 4, 106, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1035, '配置导出', 'infra:config:export', 3, 5, 106, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1036, '公告查询', 'system:notice:query', 3, 1, 107, '#', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1037, '公告新增', 'system:notice:create', 3, 2, 107, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1038, '公告修改', 'system:notice:update', 3, 3, 107, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1039, '公告删除', 'system:notice:delete', 3, 4, 107, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1040, '操作查询', 'system:operate-log:query', 3, 1, 500, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1042, '日志导出', 'system:operate-log:export', 3, 2, 500, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1043, '登录查询', 'system:login-log:query', 3, 1, 501, '#', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1045, '日志导出', 'system:login-log:export', 3, 3, 501, '#', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1046, '令牌列表', 'system:oauth2-token:page', 3, 1, 109, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-05-09 23:54:42', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1048, '令牌删除', 'system:oauth2-token:delete', 3, 2, 109, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-05-09 23:54:53', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1050, '任务新增', 'infra:job:create', 3, 2, 110, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1051, '任务修改', 'infra:job:update', 3, 3, 110, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1052, '任务删除', 'infra:job:delete', 3, 4, 110, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1053, '状态修改', 'infra:job:update', 3, 5, 110, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1054, '任务导出', 'infra:job:export', 3, 7, 110, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1056, '生成修改', 'infra:codegen:update', 3, 2, 115, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1057, '生成删除', 'infra:codegen:delete', 3, 3, 115, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1058, '导入代码', 'infra:codegen:create', 3, 2, 115, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1059, '预览代码', 'infra:codegen:preview', 3, 4, 115, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1060, '生成代码', 'infra:codegen:download', 3, 5, 115, '', '', '', NULL, 0, b'1', b'1', b'1', 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1063, '设置角色菜单权限', 'system:permission:assign-role-menu', 3, 6, 101, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-01-06 17:53:44', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1064, '设置角色数据权限', 'system:permission:assign-role-data-scope', 3, 7, 101, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-01-06 17:56:31', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1065, '设置用户角色', 'system:permission:assign-user-role', 3, 8, 101, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-01-07 10:23:28', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1066, '获得 Redis 监控信息', 'infra:redis:get-monitor-info', 3, 1, 113, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-01-26 01:02:31', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1067, '获得 Redis Key 列表', 'infra:redis:get-key-list', 3, 2, 113, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-01-26 01:02:52', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1070, '代码生成示例', 'infra:test-demo:query', 2, 1, 2, 'test-demo', 'validCode', 'infra/testDemo/index', NULL, 0, b'1', b'1', b'1', '', '2021-02-06 12:42:49', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1071, '测试示例表创建', 'infra:test-demo:create', 3, 1, 1070, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-02-06 12:42:49', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1072, '测试示例表更新', 'infra:test-demo:update', 3, 2, 1070, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-02-06 12:42:49', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1073, '测试示例表删除', 'infra:test-demo:delete', 3, 3, 1070, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-02-06 12:42:49', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1074, '测试示例表导出', 'infra:test-demo:export', 3, 4, 1070, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-02-06 12:42:49', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1075, '任务触发', 'infra:job:trigger', 3, 8, 110, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-02-07 13:03:10', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1076, '数据库文档', '', 2, 4, 2, 'db-doc', 'table', 'infra/dbDoc/index', 'InfraDBDoc', 0, b'1', b'1', b'1', '', '2021-02-08 01:41:47', '1', '2023-04-08 09:13:38', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1078, '访问日志', '', 2, 1, 1083, 'api-access-log', 'log', 'infra/apiAccessLog/index', 'InfraApiAccessLog', 0, b'1', b'1', b'1', '', '2021-02-26 01:32:59', '1', '2023-04-08 10:31:34', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1082, '日志导出', 'infra:api-access-log:export', 3, 2, 1078, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-02-26 01:32:59', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1083, 'API 日志', '', 2, 8, 2, 'log', 'log', NULL, NULL, 0, b'1', b'1', b'1', '', '2021-02-26 02:18:24', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1084, '错误日志', 'infra:api-error-log:query', 2, 2, 1083, 'api-error-log', 'log', 'infra/apiErrorLog/index', 'InfraApiErrorLog', 0, b'1', b'1', b'1', '', '2021-02-26 07:53:20', '1', '2023-04-08 10:32:25', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1085, '日志处理', 'infra:api-error-log:update-status', 3, 2, 1084, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-02-26 07:53:20', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1086, '日志导出', 'infra:api-error-log:export', 3, 3, 1084, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-02-26 07:53:20', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1087, '任务查询', 'infra:job:query', 3, 1, 110, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2021-03-10 01:26:19', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1088, '日志查询', 'infra:api-access-log:query', 3, 1, 1078, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2021-03-10 01:28:04', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1089, '日志查询', 'infra:api-error-log:query', 3, 1, 1084, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2021-03-10 01:29:09', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1090, '文件列表', '', 2, 5, 1243, 'file', 'upload', 'infra/file/index', 'InfraFile', 0, b'1', b'1', b'1', '', '2021-03-12 20:16:20', '1', '2023-04-08 09:21:31', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1091, '文件查询', 'infra:file:query', 3, 1, 1090, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-03-12 20:16:20', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1092, '文件删除', 'infra:file:delete', 3, 4, 1090, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-03-12 20:16:20', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1093, '短信管理', '', 1, 11, 1, 'sms', 'validCode', NULL, NULL, 0, b'1', b'1', b'1', '1', '2021-04-05 01:10:16', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1094, '短信渠道', '', 2, 0, 1093, 'sms-channel', 'phone', 'system/sms/channel/index', 'SystemSmsChannel', 0, b'1', b'1', b'1', '', '2021-04-01 11:07:15', '1', '2023-04-08 08:50:41', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1095, '短信渠道查询', 'system:sms-channel:query', 3, 1, 1094, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-04-01 11:07:15', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1096, '短信渠道创建', 'system:sms-channel:create', 3, 2, 1094, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-04-01 11:07:15', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1097, '短信渠道更新', 'system:sms-channel:update', 3, 3, 1094, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-04-01 11:07:15', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1098, '短信渠道删除', 'system:sms-channel:delete', 3, 4, 1094, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-04-01 11:07:15', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1100, '短信模板', '', 2, 1, 1093, 'sms-template', 'phone', 'system/sms/template/index', 'SystemSmsTemplate', 0, b'1', b'1', b'1', '', '2021-04-01 17:35:17', '1', '2023-04-08 08:50:50', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1101, '短信模板查询', 'system:sms-template:query', 3, 1, 1100, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-04-01 17:35:17', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1102, '短信模板创建', 'system:sms-template:create', 3, 2, 1100, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-04-01 17:35:17', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1103, '短信模板更新', 'system:sms-template:update', 3, 3, 1100, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-04-01 17:35:17', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1104, '短信模板删除', 'system:sms-template:delete', 3, 4, 1100, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-04-01 17:35:17', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1105, '短信模板导出', 'system:sms-template:export', 3, 5, 1100, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-04-01 17:35:17', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1106, '发送测试短信', 'system:sms-template:send-sms', 3, 6, 1100, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2021-04-11 00:26:40', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1107, '短信日志', '', 2, 2, 1093, 'sms-log', 'phone', 'system/sms/log/index', 'SystemSmsLog', 0, b'1', b'1', b'1', '', '2021-04-11 08:37:05', '1', '2023-04-08 08:50:58', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1108, '短信日志查询', 'system:sms-log:query', 3, 1, 1107, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-04-11 08:37:05', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1109, '短信日志导出', 'system:sms-log:export', 3, 5, 1107, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-04-11 08:37:05', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1110, '错误码管理', '', 2, 12, 1, 'error-code', 'code', 'system/errorCode/index', 'SystemErrorCode', 0, b'1', b'1', b'1', '', '2021-04-13 21:46:42', '1', '2023-04-08 09:01:15', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1111, '错误码查询', 'system:error-code:query', 3, 1, 1110, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-04-13 21:46:42', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1112, '错误码创建', 'system:error-code:create', 3, 2, 1110, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-04-13 21:46:42', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1113, '错误码更新', 'system:error-code:update', 3, 3, 1110, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-04-13 21:46:42', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1114, '错误码删除', 'system:error-code:delete', 3, 4, 1110, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-04-13 21:46:42', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1115, '错误码导出', 'system:error-code:export', 3, 5, 1110, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-04-13 21:46:42', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1118, '请假查询', '', 2, 0, 5, 'leave', 'user', 'bpm/oa/leave/index', 'BpmOALeave', 0, b'1', b'1', b'1', '', '2021-09-20 08:51:03', '1', '2023-04-08 11:30:40', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1119, '请假申请查询', 'bpm:oa-leave:query', 3, 1, 1118, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-09-20 08:51:03', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1120, '请假申请创建', 'bpm:oa-leave:create', 3, 2, 1118, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-09-20 08:51:03', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1138, '租户列表', '', 2, 0, 1224, 'list', 'peoples', 'system/tenant/index', 'SystemTenant', 0, b'1', b'1', b'1', '', '2021-12-14 12:31:43', '1', '2023-04-08 08:29:08', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1139, '租户查询', 'system:tenant:query', 3, 1, 1138, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-12-14 12:31:44', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1140, '租户创建', 'system:tenant:create', 3, 2, 1138, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-12-14 12:31:44', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1141, '租户更新', 'system:tenant:update', 3, 3, 1138, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-12-14 12:31:44', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1142, '租户删除', 'system:tenant:delete', 3, 4, 1138, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-12-14 12:31:44', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1143, '租户导出', 'system:tenant:export', 3, 5, 1138, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-12-14 12:31:44', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1185, '工作流程', '', 1, 50, 0, '/bpm', 'tool', NULL, NULL, 0, b'1', b'1', b'1', '1', '2021-12-30 20:26:36', '103', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1186, '流程管理', '', 1, 10, 1185, 'manager', 'nested', NULL, NULL, 0, b'1', b'1', b'1', '1', '2021-12-30 20:28:30', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1187, '流程表单', '', 2, 0, 1186, 'form', 'form', 'bpm/form/index', 'BpmForm', 0, b'1', b'1', b'1', '', '2021-12-30 12:38:22', '1', '2023-04-08 10:50:37', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1188, '表单查询', 'bpm:form:query', 3, 1, 1187, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-12-30 12:38:22', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1189, '表单创建', 'bpm:form:create', 3, 2, 1187, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-12-30 12:38:22', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1190, '表单更新', 'bpm:form:update', 3, 3, 1187, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-12-30 12:38:22', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1191, '表单删除', 'bpm:form:delete', 3, 4, 1187, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-12-30 12:38:22', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1192, '表单导出', 'bpm:form:export', 3, 5, 1187, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-12-30 12:38:22', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1193, '流程模型', '', 2, 5, 1186, 'model', 'guide', 'bpm/model/index', 'BpmModel', 0, b'1', b'1', b'1', '1', '2021-12-31 23:24:58', '1', '2023-04-08 10:53:38', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1194, '模型查询', 'bpm:model:query', 3, 1, 1193, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-03 19:01:10', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1195, '模型创建', 'bpm:model:create', 3, 2, 1193, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-03 19:01:24', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1196, '模型导入', 'bpm:model:import', 3, 3, 1193, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-03 19:01:35', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1197, '模型更新', 'bpm:model:update', 3, 4, 1193, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-03 19:02:28', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1198, '模型删除', 'bpm:model:delete', 3, 5, 1193, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-03 19:02:43', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1199, '模型发布', 'bpm:model:deploy', 3, 6, 1193, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-03 19:03:24', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1200, '任务管理', '', 1, 20, 1185, 'task', 'cascader', NULL, NULL, 0, b'1', b'1', b'1', '1', '2022-01-07 23:51:48', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1201, '我的流程', '', 2, 0, 1200, 'my', 'people', 'bpm/processInstance/index', 'BpmProcessInstance', 0, b'1', b'1', b'1', '', '2022-01-07 15:53:44', '1', '2023-04-08 11:16:55', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1202, '流程实例的查询', 'bpm:process-instance:query', 3, 1, 1201, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-01-07 15:53:44', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1207, '待办任务', '', 2, 10, 1200, 'todo', 'eye-open', 'bpm/task/todo/index', 'BpmTodoTask', 0, b'1', b'1', b'1', '1', '2022-01-08 10:33:37', '1', '2023-04-08 11:29:08', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1208, '已办任务', '', 2, 20, 1200, 'done', 'eye', 'bpm/task/done/index', 'BpmDoneTask', 0, b'1', b'1', b'1', '1', '2022-01-08 10:34:13', '1', '2023-04-08 11:29:00', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1209, '用户分组', '', 2, 2, 1186, 'user-group', 'people', 'bpm/group/index', 'BpmUserGroup', 0, b'1', b'1', b'1', '', '2022-01-14 02:14:20', '1', '2023-04-08 10:51:06', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1210, '用户组查询', 'bpm:user-group:query', 3, 1, 1209, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-01-14 02:14:20', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1211, '用户组创建', 'bpm:user-group:create', 3, 2, 1209, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-01-14 02:14:20', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1212, '用户组更新', 'bpm:user-group:update', 3, 3, 1209, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-01-14 02:14:20', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1213, '用户组删除', 'bpm:user-group:delete', 3, 4, 1209, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-01-14 02:14:20', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1215, '流程定义查询', 'bpm:process-definition:query', 3, 10, 1193, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-23 00:21:43', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1216, '流程任务分配规则查询', 'bpm:task-assign-rule:query', 3, 20, 1193, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-23 00:26:53', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1217, '流程任务分配规则创建', 'bpm:task-assign-rule:create', 3, 21, 1193, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-23 00:28:15', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1218, '流程任务分配规则更新', 'bpm:task-assign-rule:update', 3, 22, 1193, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-23 00:28:41', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1219, '流程实例的创建', 'bpm:process-instance:create', 3, 2, 1201, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-23 00:36:15', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1220, '流程实例的取消', 'bpm:process-instance:cancel', 3, 3, 1201, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-23 00:36:33', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1221, '流程任务的查询', 'bpm:task:query', 3, 1, 1207, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-23 00:38:52', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1222, '流程任务的更新', 'bpm:task:update', 3, 2, 1207, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-01-23 00:39:24', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1224, '租户管理', '', 2, 0, 1, 'tenant', 'peoples', NULL, NULL, 0, b'1', b'1', b'1', '1', '2022-02-20 01:41:13', '1', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1225, '租户套餐', '', 2, 0, 1224, 'package', 'eye', 'system/tenantPackage/index', 'SystemTenantPackage', 0, b'1', b'1', b'1', '', '2022-02-19 17:44:06', '1', '2023-04-08 08:17:08', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1226, '租户套餐查询', 'system:tenant-package:query', 3, 1, 1225, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-02-19 17:44:06', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1227, '租户套餐创建', 'system:tenant-package:create', 3, 2, 1225, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-02-19 17:44:06', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1228, '租户套餐更新', 'system:tenant-package:update', 3, 3, 1225, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-02-19 17:44:06', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1229, '租户套餐删除', 'system:tenant-package:delete', 3, 4, 1225, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-02-19 17:44:06', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1237, '文件配置', '', 2, 0, 1243, 'file-config', 'config', 'infra/fileConfig/index', 'InfraFileConfig', 0, b'1', b'1', b'1', '', '2022-03-15 14:35:28', '1', '2023-04-08 09:16:05', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1238, '文件配置查询', 'infra:file-config:query', 3, 1, 1237, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-03-15 14:35:28', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1239, '文件配置创建', 'infra:file-config:create', 3, 2, 1237, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-03-15 14:35:28', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1240, '文件配置更新', 'infra:file-config:update', 3, 3, 1237, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-03-15 14:35:28', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1241, '文件配置删除', 'infra:file-config:delete', 3, 4, 1237, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-03-15 14:35:28', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1242, '文件配置导出', 'infra:file-config:export', 3, 5, 1237, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-03-15 14:35:28', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1243, '文件管理', '', 2, 5, 2, 'file', 'download', NULL, '', 0, b'1', b'1', b'1', '1', '2022-03-16 23:47:40', '1', '2023-02-10 13:47:46', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1247, '敏感词管理', '', 2, 13, 1, 'sensitive-word', 'education', 'system/sensitiveWord/index', 'SystemSensitiveWord', 0, b'1', b'1', b'1', '', '2022-04-07 16:55:03', '1', '2023-04-08 09:00:40', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1248, '敏感词查询', 'system:sensitive-word:query', 3, 1, 1247, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-04-07 16:55:03', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1249, '敏感词创建', 'system:sensitive-word:create', 3, 2, 1247, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-04-07 16:55:03', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1250, '敏感词更新', 'system:sensitive-word:update', 3, 3, 1247, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-04-07 16:55:03', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1251, '敏感词删除', 'system:sensitive-word:delete', 3, 4, 1247, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-04-07 16:55:03', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1252, '敏感词导出', 'system:sensitive-word:export', 3, 5, 1247, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-04-07 16:55:03', '', '2022-04-20 17:03:10', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1255, '数据源配置', '', 2, 1, 2, 'data-source-config', 'rate', 'infra/dataSourceConfig/index', 'InfraDataSourceConfig', 0, b'1', b'1', b'1', '', '2022-04-27 14:37:32', '1', '2023-04-08 09:05:21', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1256, '数据源配置查询', 'infra:data-source-config:query', 3, 1, 1255, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-04-27 14:37:32', '', '2022-04-27 14:37:32', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1257, '数据源配置创建', 'infra:data-source-config:create', 3, 2, 1255, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-04-27 14:37:32', '', '2022-04-27 14:37:32', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1258, '数据源配置更新', 'infra:data-source-config:update', 3, 3, 1255, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-04-27 14:37:32', '', '2022-04-27 14:37:32', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1259, '数据源配置删除', 'infra:data-source-config:delete', 3, 4, 1255, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-04-27 14:37:32', '', '2022-04-27 14:37:32', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1260, '数据源配置导出', 'infra:data-source-config:export', 3, 5, 1255, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-04-27 14:37:32', '', '2022-04-27 14:37:32', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1261, 'OAuth 2.0', '', 1, 10, 1, 'oauth2', 'people', NULL, NULL, 0, b'1', b'1', b'1', '1', '2022-05-09 23:38:17', '1', '2022-05-11 23:51:46', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1263, '应用管理', '', 2, 0, 1261, 'oauth2/application', 'tool', 'system/oauth2/client/index', 'SystemOAuth2Client', 0, b'1', b'1', b'1', '', '2022-05-10 16:26:33', '1', '2023-04-08 08:47:31', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1264, '客户端查询', 'system:oauth2-client:query', 3, 1, 1263, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-05-10 16:26:33', '1', '2022-05-11 00:31:06', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1265, '客户端创建', 'system:oauth2-client:create', 3, 2, 1263, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-05-10 16:26:33', '1', '2022-05-11 00:31:23', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1266, '客户端更新', 'system:oauth2-client:update', 3, 3, 1263, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-05-10 16:26:33', '1', '2022-05-11 00:31:28', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1267, '客户端删除', 'system:oauth2-client:delete', 3, 4, 1263, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-05-10 16:26:33', '1', '2022-05-11 00:31:33', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1281, '报表管理', '', 1, 40, 0, '/report', 'chart', NULL, NULL, 0, b'1', b'1', b'1', '1', '2022-07-10 20:22:15', '1', '2023-02-07 17:16:40', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1282, '报表设计器', '', 2, 1, 1281, 'jimu-report', 'example', 'report/jmreport/index', 'GoView', 0, b'1', b'1', b'1', '1', '2022-07-10 20:26:36', '1', '2023-04-08 10:47:59', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2130, '邮箱管理', '', 2, 11, 1, 'mail', 'email', NULL, NULL, 0, b'1', b'1', b'1', '1', '2023-01-25 17:27:44', '1', '2023-01-25 17:27:44', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2131, '邮箱账号', '', 2, 0, 2130, 'mail-account', 'user', 'system/mail/account/index', 'SystemMailAccount', 0, b'1', b'1', b'1', '', '2023-01-25 09:33:48', '1', '2023-04-08 08:53:43', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2132, '账号查询', 'system:mail-account:query', 3, 1, 2131, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-01-25 09:33:48', '', '2023-01-25 09:33:48', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2133, '账号创建', 'system:mail-account:create', 3, 2, 2131, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-01-25 09:33:48', '', '2023-01-25 09:33:48', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2134, '账号更新', 'system:mail-account:update', 3, 3, 2131, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-01-25 09:33:48', '', '2023-01-25 09:33:48', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2135, '账号删除', 'system:mail-account:delete', 3, 4, 2131, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-01-25 09:33:48', '', '2023-01-25 09:33:48', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2136, '邮件模版', '', 2, 0, 2130, 'mail-template', 'education', 'system/mail/template/index', 'SystemMailTemplate', 0, b'1', b'1', b'1', '', '2023-01-25 12:05:31', '1', '2023-04-08 08:53:34', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2137, '模版查询', 'system:mail-template:query', 3, 1, 2136, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-01-25 12:05:31', '', '2023-01-25 12:05:31', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2138, '模版创建', 'system:mail-template:create', 3, 2, 2136, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-01-25 12:05:31', '', '2023-01-25 12:05:31', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2139, '模版更新', 'system:mail-template:update', 3, 3, 2136, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-01-25 12:05:31', '', '2023-01-25 12:05:31', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2140, '模版删除', 'system:mail-template:delete', 3, 4, 2136, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-01-25 12:05:31', '', '2023-01-25 12:05:31', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2141, '邮件记录', '', 2, 0, 2130, 'mail-log', 'log', 'system/mail/log/index', 'SystemMailLog', 0, b'1', b'1', b'1', '', '2023-01-26 02:16:50', '1', '2023-04-08 08:53:49', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2142, '日志查询', 'system:mail-log:query', 3, 1, 2141, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-01-26 02:16:50', '', '2023-01-26 02:16:50', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2143, '发送测试邮件', 'system:mail-template:send-mail', 3, 5, 2136, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-01-26 23:29:15', '1', '2023-01-26 23:29:15', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2144, '站内信管理', '', 1, 11, 1, 'notify', 'message', NULL, NULL, 0, b'1', b'1', b'1', '1', '2023-01-28 10:25:18', '1', '2023-01-28 10:25:46', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2145, '模板管理', '', 2, 0, 2144, 'notify-template', 'education', 'system/notify/template/index', 'SystemNotifyTemplate', 0, b'1', b'1', b'1', '', '2023-01-28 02:26:42', '1', '2023-04-08 08:54:39', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2146, '站内信模板查询', 'system:notify-template:query', 3, 1, 2145, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-01-28 02:26:42', '', '2023-01-28 02:26:42', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2147, '站内信模板创建', 'system:notify-template:create', 3, 2, 2145, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-01-28 02:26:42', '', '2023-01-28 02:26:42', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2148, '站内信模板更新', 'system:notify-template:update', 3, 3, 2145, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-01-28 02:26:42', '', '2023-01-28 02:26:42', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2149, '站内信模板删除', 'system:notify-template:delete', 3, 4, 2145, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-01-28 02:26:42', '', '2023-01-28 02:26:42', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2150, '发送测试站内信', 'system:notify-template:send-notify', 3, 5, 2145, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-01-28 10:54:43', '1', '2023-01-28 10:54:43', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2151, '消息记录', '', 2, 0, 2144, 'notify-message', 'edit', 'system/notify/message/index', 'SystemNotifyMessage', 0, b'1', b'1', b'1', '', '2023-01-28 04:28:22', '1', '2023-04-08 08:54:11', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2152, '站内信消息查询', 'system:notify-message:query', 3, 1, 2151, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-01-28 04:28:22', '', '2023-01-28 04:28:22', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2153, '大屏设计器', '', 2, 2, 1281, 'go-view', 'dashboard', 'report/goview/index', 'JimuReport', 0, b'1', b'1', b'1', '1', '2023-02-07 00:03:19', '1', '2023-04-08 10:48:15', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2154, '创建项目', 'report:go-view-project:create', 3, 1, 2153, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-02-07 19:25:14', '1', '2023-02-07 19:25:14', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2155, '更新项目', 'report:go-view-project:delete', 3, 2, 2153, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-02-07 19:25:34', '1', '2023-02-07 19:25:34', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2156, '查询项目', 'report:go-view-project:query', 3, 0, 2153, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2023-02-07 19:25:53', '1', '2023-02-07 19:25:53', b'0'); +COMMIT; + +-- ---------------------------- +-- Table structure for system_notice +-- ---------------------------- +DROP TABLE IF EXISTS `system_notice`; +CREATE TABLE `system_notice` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '公告ID', + `title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '公告标题', + `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '公告内容', + `type` tinyint NOT NULL COMMENT '公告类型(1通知 2公告)', + `status` tinyint NOT NULL DEFAULT 0 COMMENT '公告状态(0正常 1关闭)', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '通知公告表'; + +-- ---------------------------- +-- Records of system_notice +-- ---------------------------- +BEGIN; +INSERT INTO `system_notice` (`id`, `title`, `content`, `type`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1, '闻荫的公众', '

新版本内容133

', 1, 0, 'admin', '2021-01-05 17:03:48', '1', '2022-05-04 21:00:20', b'0', 1); +INSERT INTO `system_notice` (`id`, `title`, `content`, `type`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2, '维护通知:2018-07-01 若依系统凌晨维护', '

维护内容

', 2, 1, 'admin', '2021-01-05 17:03:48', '1', '2022-05-11 12:34:24', b'0', 1); +INSERT INTO `system_notice` (`id`, `title`, `content`, `type`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4, '我是测试标题', '

哈哈哈哈123

', 1, 0, '110', '2022-02-22 01:01:25', '110', '2022-02-22 01:01:46', b'0', 121); +COMMIT; + +-- ---------------------------- +-- Table structure for system_notify_message +-- ---------------------------- +DROP TABLE IF EXISTS `system_notify_message`; +CREATE TABLE `system_notify_message` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '用户ID', + `user_id` bigint NOT NULL COMMENT '用户id', + `template_id` bigint NOT NULL COMMENT '模版编号', + `template_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '模板编码', + `template_nickname` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '模版发送人名称', + `template_content` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '模版内容', + `template_type` int NOT NULL COMMENT '模版类型', + `template_params` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '模版参数', + `read_status` bit(1) NOT NULL COMMENT '是否已读', + `read_time` datetime NULL DEFAULT NULL COMMENT '阅读时间', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 9 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '站内信消息表'; + +-- ---------------------------- +-- Records of system_notify_message +-- ---------------------------- +BEGIN; +INSERT INTO `system_notify_message` (`id`, `user_id`, `template_id`, `template_code`, `template_nickname`, `template_content`, `template_type`, `template_params`, `read_status`, `read_time`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2, 1, 1, 'test', '123', '我是 1,我开始 2 了', 1, '{\"name\":\"1\",\"what\":\"2\"}', b'1', '2023-02-10 00:47:04', '1', '2023-01-28 11:44:08', '1', '2023-02-10 00:47:04', b'0', 1); +INSERT INTO `system_notify_message` (`id`, `user_id`, `template_id`, `template_code`, `template_nickname`, `template_content`, `template_type`, `template_params`, `read_status`, `read_time`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (3, 1, 1, 'test', '123', '我是 1,我开始 2 了', 1, '{\"name\":\"1\",\"what\":\"2\"}', b'1', '2023-02-10 00:47:04', '1', '2023-01-28 11:45:04', '1', '2023-02-10 00:47:04', b'0', 1); +INSERT INTO `system_notify_message` (`id`, `user_id`, `template_id`, `template_code`, `template_nickname`, `template_content`, `template_type`, `template_params`, `read_status`, `read_time`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4, 103, 2, 'register', '系统消息', '你好,欢迎 哈哈 加入大家庭!', 2, '{\"name\":\"哈哈\"}', b'0', NULL, '1', '2023-01-28 21:02:20', '1', '2023-01-28 21:02:20', b'0', 1); +INSERT INTO `system_notify_message` (`id`, `user_id`, `template_id`, `template_code`, `template_nickname`, `template_content`, `template_type`, `template_params`, `read_status`, `read_time`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (5, 1, 1, 'test', '123', '我是 芋艿,我开始 写代码 了', 1, '{\"name\":\"芋艿\",\"what\":\"写代码\"}', b'1', '2023-02-10 00:47:04', '1', '2023-01-28 22:21:42', '1', '2023-02-10 00:47:04', b'0', 1); +INSERT INTO `system_notify_message` (`id`, `user_id`, `template_id`, `template_code`, `template_nickname`, `template_content`, `template_type`, `template_params`, `read_status`, `read_time`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (6, 1, 1, 'test', '123', '我是 芋艿,我开始 写代码 了', 1, '{\"name\":\"芋艿\",\"what\":\"写代码\"}', b'1', '2023-01-29 10:52:06', '1', '2023-01-28 22:22:07', '1', '2023-01-29 10:52:06', b'0', 1); +INSERT INTO `system_notify_message` (`id`, `user_id`, `template_id`, `template_code`, `template_nickname`, `template_content`, `template_type`, `template_params`, `read_status`, `read_time`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (7, 1, 1, 'test', '123', '我是 2,我开始 3 了', 1, '{\"name\":\"2\",\"what\":\"3\"}', b'1', '2023-01-29 10:52:06', '1', '2023-01-28 23:45:21', '1', '2023-01-29 10:52:06', b'0', 1); +INSERT INTO `system_notify_message` (`id`, `user_id`, `template_id`, `template_code`, `template_nickname`, `template_content`, `template_type`, `template_params`, `read_status`, `read_time`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (8, 1, 2, 'register', '系统消息', '你好,欢迎 123 加入大家庭!', 2, '{\"name\":\"123\"}', b'1', '2023-01-29 10:52:06', '1', '2023-01-28 23:50:21', '1', '2023-01-29 10:52:06', b'0', 1); +COMMIT; + +-- ---------------------------- +-- Table structure for system_notify_template +-- ---------------------------- +DROP TABLE IF EXISTS `system_notify_template`; +CREATE TABLE `system_notify_template` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', + `name` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '模板名称', + `code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '模版编码', + `nickname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '发送人名称', + `content` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '模版内容', + `type` tinyint NOT NULL COMMENT '类型', + `params` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '参数数组', + `status` tinyint NOT NULL COMMENT '状态', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '备注', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '站内信模板表'; + +-- ---------------------------- +-- Records of system_notify_template +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for system_oauth2_access_token +-- ---------------------------- +DROP TABLE IF EXISTS `system_oauth2_access_token`; +CREATE TABLE `system_oauth2_access_token` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + `user_id` bigint NOT NULL COMMENT '用户编号', + `access_token` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '访问令牌', + `refresh_token` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '刷新令牌', + `client_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '客户端编号', + `scopes` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '授权范围', + `expires_time` datetime NOT NULL COMMENT '过期时间', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 2597 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'OAuth2 访问令牌'; + +-- ---------------------------- +-- Records of system_oauth2_access_token +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for system_oauth2_approve +-- ---------------------------- +DROP TABLE IF EXISTS `system_oauth2_approve`; +CREATE TABLE `system_oauth2_approve` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + `user_id` bigint NOT NULL COMMENT '用户编号', + `client_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '客户端编号', + `scope` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '授权范围', + `approved` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否接受', + `expires_time` datetime NOT NULL COMMENT '过期时间', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 82 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'OAuth2 批准表'; + +-- ---------------------------- +-- Records of system_oauth2_approve +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for system_oauth2_client +-- ---------------------------- +DROP TABLE IF EXISTS `system_oauth2_client`; +CREATE TABLE `system_oauth2_client` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + `client_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '客户端编号', + `secret` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '客户端密钥', + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '应用名', + `logo` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '应用图标', + `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '应用描述', + `status` tinyint NOT NULL COMMENT '状态', + `access_token_validity_seconds` int NOT NULL COMMENT '访问令牌的有效期', + `refresh_token_validity_seconds` int NOT NULL COMMENT '刷新令牌的有效期', + `redirect_uris` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '可重定向的 URI 地址', + `authorized_grant_types` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '授权类型', + `scopes` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '授权范围', + `auto_approve_scopes` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '自动通过的授权范围', + `authorities` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '权限', + `resource_ids` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '资源', + `additional_information` varchar(4096) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '附加信息', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 43 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'OAuth2 客户端表'; + +-- ---------------------------- +-- Records of system_oauth2_client +-- ---------------------------- +BEGIN; +INSERT INTO `system_oauth2_client` (`id`, `client_id`, `secret`, `name`, `logo`, `description`, `status`, `access_token_validity_seconds`, `refresh_token_validity_seconds`, `redirect_uris`, `authorized_grant_types`, `scopes`, `auto_approve_scopes`, `authorities`, `resource_ids`, `additional_information`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1, 'default', 'admin123', '闻荫源码', 'http://test.win.iocoder.cn/a5e2e244368878a366b516805a4aabf1.png', '我是描述', 0, 1800, 43200, '[\"https://www.iocoder.cn\",\"https://doc.iocoder.cn\"]', '[\"password\",\"authorization_code\",\"implicit\",\"refresh_token\"]', '[\"user.read\",\"user.write\"]', '[]', '[\"user.read\",\"user.write\"]', '[]', '{}', '1', '2022-05-11 21:47:12', '1', '2022-07-05 16:23:52', b'0'); +INSERT INTO `system_oauth2_client` (`id`, `client_id`, `secret`, `name`, `logo`, `description`, `status`, `access_token_validity_seconds`, `refresh_token_validity_seconds`, `redirect_uris`, `authorized_grant_types`, `scopes`, `auto_approve_scopes`, `authorities`, `resource_ids`, `additional_information`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (40, 'test', 'test2', 'biubiu', 'http://test.win.iocoder.cn/277a899d573723f1fcdfb57340f00379.png', NULL, 0, 1800, 43200, '[\"https://www.iocoder.cn\"]', '[\"password\",\"authorization_code\",\"implicit\"]', '[\"user_info\",\"projects\"]', '[\"user_info\"]', '[]', '[]', '{}', '1', '2022-05-12 00:28:20', '1', '2022-06-19 00:26:13', b'0'); +INSERT INTO `system_oauth2_client` (`id`, `client_id`, `secret`, `name`, `logo`, `description`, `status`, `access_token_validity_seconds`, `refresh_token_validity_seconds`, `redirect_uris`, `authorized_grant_types`, `scopes`, `auto_approve_scopes`, `authorities`, `resource_ids`, `additional_information`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (41, 'win-sso-demo-by-code', 'test', '基于授权码模式,如何实现 SSO 单点登录?', 'http://test.win.iocoder.cn/fe4ed36596adad5120036ef61a6d0153654544d44af8dd4ad3ffe8f759933d6f.png', NULL, 0, 1800, 43200, '[\"http://127.0.0.1:18080\"]', '[\"authorization_code\",\"refresh_token\"]', '[\"user.read\",\"user.write\"]', '[]', '[]', '[]', NULL, '1', '2022-09-29 13:28:31', '1', '2022-09-29 13:28:31', b'0'); +INSERT INTO `system_oauth2_client` (`id`, `client_id`, `secret`, `name`, `logo`, `description`, `status`, `access_token_validity_seconds`, `refresh_token_validity_seconds`, `redirect_uris`, `authorized_grant_types`, `scopes`, `auto_approve_scopes`, `authorities`, `resource_ids`, `additional_information`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (42, 'win-sso-demo-by-password', 'test', '基于密码模式,如何实现 SSO 单点登录?', 'http://test.win.iocoder.cn/604bdc695e13b3b22745be704d1f2aa8ee05c5f26f9fead6d1ca49005afbc857.jpeg', NULL, 0, 1800, 43200, '[\"http://127.0.0.1:18080\"]', '[\"password\",\"refresh_token\"]', '[\"user.read\",\"user.write\"]', '[]', '[]', '[]', NULL, '1', '2022-10-04 17:40:16', '1', '2022-10-04 20:31:21', b'0'); +COMMIT; + +-- ---------------------------- +-- Table structure for system_oauth2_code +-- ---------------------------- +DROP TABLE IF EXISTS `system_oauth2_code`; +CREATE TABLE `system_oauth2_code` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + `user_id` bigint NOT NULL COMMENT '用户编号', + `code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '授权码', + `client_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '客户端编号', + `scopes` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '授权范围', + `expires_time` datetime NOT NULL COMMENT '过期时间', + `redirect_uri` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '可重定向的 URI 地址', + `state` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '状态', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 147 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'OAuth2 授权码表'; + +-- ---------------------------- +-- Records of system_oauth2_code +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for system_oauth2_refresh_token +-- ---------------------------- +DROP TABLE IF EXISTS `system_oauth2_refresh_token`; +CREATE TABLE `system_oauth2_refresh_token` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + `user_id` bigint NOT NULL COMMENT '用户编号', + `refresh_token` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '刷新令牌', + `client_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '客户端编号', + `scopes` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '授权范围', + `expires_time` datetime NOT NULL COMMENT '过期时间', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 896 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'OAuth2 刷新令牌'; + +-- ---------------------------- +-- Records of system_oauth2_refresh_token +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for system_operate_log +-- ---------------------------- +DROP TABLE IF EXISTS `system_operate_log`; +CREATE TABLE `system_operate_log` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '日志主键', + `trace_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '链路追踪编号', + `user_id` bigint NOT NULL COMMENT '用户编号', + `module` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '模块标题', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '操作名', + `type` bigint NOT NULL DEFAULT 0 COMMENT '操作分类', + `content` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '操作内容', + `exts` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '拓展字段', + `request_method` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '请求方法名', + `request_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '请求地址', + `user_ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '用户 IP', + `user_agent` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '浏览器 UA', + `java_method` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT 'Java 方法名', + `java_method_args` varchar(8000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT 'Java 方法的参数', + `start_time` datetime NOT NULL COMMENT '操作时间', + `duration` int NOT NULL COMMENT '执行时长', + `result_code` int NOT NULL DEFAULT 0 COMMENT '结果码', + `result_msg` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '结果提示', + `result_data` varchar(4000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '结果数据', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 8321 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '操作日志记录'; + +-- ---------------------------- +-- Records of system_operate_log +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for system_post +-- ---------------------------- +DROP TABLE IF EXISTS `system_post`; +CREATE TABLE `system_post` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '岗位ID', + `code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '岗位编码', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '岗位名称', + `sort` int NOT NULL COMMENT '显示顺序', + `status` tinyint NOT NULL COMMENT '状态(0正常 1停用)', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '备注', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '岗位信息表'; + +-- ---------------------------- +-- Records of system_post +-- ---------------------------- +BEGIN; +INSERT INTO `system_post` (`id`, `code`, `name`, `sort`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1, 'ceo', '董事长', 1, 0, '', 'admin', '2021-01-06 17:03:48', '1', '2023-02-11 15:19:04', b'0', 1); +INSERT INTO `system_post` (`id`, `code`, `name`, `sort`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2, 'se', '项目经理', 2, 0, '', 'admin', '2021-01-05 17:03:48', '1', '2021-12-12 10:47:47', b'0', 1); +INSERT INTO `system_post` (`id`, `code`, `name`, `sort`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4, 'user', '普通员工', 4, 0, '111', 'admin', '2021-01-05 17:03:48', '1', '2023-02-11 15:19:00', b'0', 1); +COMMIT; + +-- ---------------------------- +-- Table structure for system_role +-- ---------------------------- +DROP TABLE IF EXISTS `system_role`; +CREATE TABLE `system_role` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '角色ID', + `name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '角色名称', + `code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '角色权限字符串', + `sort` int NOT NULL COMMENT '显示顺序', + `data_scope` tinyint NOT NULL DEFAULT 1 COMMENT '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)', + `data_scope_dept_ids` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '数据范围(指定部门数组)', + `status` tinyint NOT NULL COMMENT '角色状态(0正常 1停用)', + `type` tinyint NOT NULL COMMENT '角色类型', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '备注', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 140 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '角色信息表'; + +-- ---------------------------- +-- Records of system_role +-- ---------------------------- +BEGIN; +INSERT INTO `system_role` (`id`, `name`, `code`, `sort`, `data_scope`, `data_scope_dept_ids`, `status`, `type`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1, '超级管理员', 'super_admin', 1, 1, '', 0, 1, '超级管理员', 'admin', '2021-01-05 17:03:48', '', '2022-02-22 05:08:21', b'0', 1); +INSERT INTO `system_role` (`id`, `name`, `code`, `sort`, `data_scope`, `data_scope_dept_ids`, `status`, `type`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2, '普通角色', 'common', 2, 2, '', 0, 1, '普通角色', 'admin', '2021-01-05 17:03:48', '', '2022-02-22 05:08:20', b'0', 1); +INSERT INTO `system_role` (`id`, `name`, `code`, `sort`, `data_scope`, `data_scope_dept_ids`, `status`, `type`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (101, '测试账号', 'test', 0, 1, '[]', 0, 2, '132', '', '2021-01-06 13:49:35', '1', '2023-07-25 23:53:32', b'0', 1); +INSERT INTO `system_role` (`id`, `name`, `code`, `sort`, `data_scope`, `data_scope_dept_ids`, `status`, `type`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (109, '租户管理员', 'tenant_admin', 0, 1, '', 0, 1, '系统自动生成', '1', '2022-02-22 00:56:14', '1', '2022-02-22 00:56:14', b'0', 121); +INSERT INTO `system_role` (`id`, `name`, `code`, `sort`, `data_scope`, `data_scope_dept_ids`, `status`, `type`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (110, '测试角色', 'test', 0, 1, '[]', 0, 2, '嘿嘿', '110', '2022-02-23 00:14:34', '110', '2022-02-23 13:14:58', b'0', 121); +INSERT INTO `system_role` (`id`, `name`, `code`, `sort`, `data_scope`, `data_scope_dept_ids`, `status`, `type`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (111, '租户管理员', 'tenant_admin', 0, 1, '', 0, 1, '系统自动生成', '1', '2022-03-07 21:37:58', '1', '2022-03-07 21:37:58', b'0', 122); +INSERT INTO `system_role` (`id`, `name`, `code`, `sort`, `data_scope`, `data_scope_dept_ids`, `status`, `type`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (113, '租户管理员', 'tenant_admin', 0, 1, '', 0, 1, '系统自动生成', '1', '2022-05-17 10:07:10', '1', '2022-05-17 10:07:10', b'0', 124); +INSERT INTO `system_role` (`id`, `name`, `code`, `sort`, `data_scope`, `data_scope_dept_ids`, `status`, `type`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (114, '租户管理员', 'tenant_admin', 0, 1, '', 0, 1, '系统自动生成', '1', '2022-12-30 11:32:03', '1', '2022-12-30 11:32:03', b'0', 125); +INSERT INTO `system_role` (`id`, `name`, `code`, `sort`, `data_scope`, `data_scope_dept_ids`, `status`, `type`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (115, '租户管理员', 'tenant_admin', 0, 1, '', 0, 1, '系统自动生成', '1', '2022-12-30 11:33:42', '1', '2022-12-30 11:33:42', b'0', 126); +INSERT INTO `system_role` (`id`, `name`, `code`, `sort`, `data_scope`, `data_scope_dept_ids`, `status`, `type`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (116, '租户管理员', 'tenant_admin', 0, 1, '', 0, 1, '系统自动生成', '1', '2022-12-30 11:33:48', '1', '2022-12-30 11:33:48', b'0', 127); +INSERT INTO `system_role` (`id`, `name`, `code`, `sort`, `data_scope`, `data_scope_dept_ids`, `status`, `type`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (118, '租户管理员', 'tenant_admin', 0, 1, '', 0, 1, '系统自动生成', '1', '2022-12-30 11:47:52', '1', '2022-12-30 11:47:52', b'0', 129); +INSERT INTO `system_role` (`id`, `name`, `code`, `sort`, `data_scope`, `data_scope_dept_ids`, `status`, `type`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (136, '租户管理员', 'tenant_admin', 0, 1, '', 0, 1, '系统自动生成', '1', '2023-03-05 21:23:32', '1', '2023-03-05 21:23:32', b'0', 147); +INSERT INTO `system_role` (`id`, `name`, `code`, `sort`, `data_scope`, `data_scope_dept_ids`, `status`, `type`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (137, '租户管理员', 'tenant_admin', 0, 1, '', 0, 1, '系统自动生成', '1', '2023-03-05 21:42:27', '1', '2023-03-05 21:42:27', b'0', 148); +INSERT INTO `system_role` (`id`, `name`, `code`, `sort`, `data_scope`, `data_scope_dept_ids`, `status`, `type`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (138, '租户管理员', 'tenant_admin', 0, 1, '', 0, 1, '系统自动生成', '1', '2023-03-05 21:59:02', '1', '2023-03-05 21:59:02', b'0', 149); +INSERT INTO `system_role` (`id`, `name`, `code`, `sort`, `data_scope`, `data_scope_dept_ids`, `status`, `type`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (139, '租户管理员', 'tenant_admin', 0, 1, '', 0, 1, '系统自动生成', '1', '2023-07-25 23:06:04', '1', '2023-07-25 23:06:04', b'0', 150); +COMMIT; + +-- ---------------------------- +-- Table structure for system_role_menu +-- ---------------------------- +DROP TABLE IF EXISTS `system_role_menu`; +CREATE TABLE `system_role_menu` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增编号', + `role_id` bigint NOT NULL COMMENT '角色ID', + `menu_id` bigint NOT NULL COMMENT '菜单ID', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 2901 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '角色和菜单关联表'; + +-- ---------------------------- +-- Records of system_role_menu +-- ---------------------------- +BEGIN; +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (263, 109, 1, '1', '2022-02-22 00:56:14', '1', '2022-02-22 00:56:14', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (434, 2, 1, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (454, 2, 1093, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (455, 2, 1094, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (460, 2, 1100, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (467, 2, 1107, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (470, 2, 1110, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (476, 2, 1117, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (477, 2, 100, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (478, 2, 101, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (479, 2, 102, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (480, 2, 1126, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (481, 2, 103, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (483, 2, 104, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (485, 2, 105, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (488, 2, 107, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (490, 2, 108, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (492, 2, 109, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (498, 2, 1138, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (523, 2, 1224, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (524, 2, 1225, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (541, 2, 500, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (543, 2, 501, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (675, 2, 2, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (689, 2, 1077, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (690, 2, 1078, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (692, 2, 1083, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (693, 2, 1084, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (699, 2, 1090, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (703, 2, 106, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (704, 2, 110, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (705, 2, 111, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (706, 2, 112, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (707, 2, 113, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1296, 110, 1, '110', '2022-02-23 00:23:55', '110', '2022-02-23 00:23:55', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1489, 1, 1, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1490, 1, 2, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1494, 1, 1077, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1495, 1, 1078, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1496, 1, 1083, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1497, 1, 1084, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1498, 1, 1090, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1499, 1, 1093, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1500, 1, 1094, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1501, 1, 1100, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1502, 1, 1107, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1503, 1, 1110, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1505, 1, 1117, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1506, 1, 100, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1507, 1, 101, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1508, 1, 102, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1509, 1, 1126, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1510, 1, 103, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1511, 1, 104, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1512, 1, 105, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1513, 1, 106, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1514, 1, 107, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1515, 1, 108, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1516, 1, 109, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1517, 1, 110, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1518, 1, 111, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1519, 1, 112, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1520, 1, 113, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1522, 1, 1138, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1525, 1, 1224, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1526, 1, 1225, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1527, 1, 500, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1528, 1, 501, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1578, 111, 1, '1', '2022-03-07 21:37:58', '1', '2022-03-07 21:37:58', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1604, 101, 1216, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1605, 101, 1217, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1606, 101, 1218, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1607, 101, 1219, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1608, 101, 1220, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1609, 101, 1221, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1610, 101, 5, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1611, 101, 1222, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1612, 101, 1118, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1613, 101, 1119, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1614, 101, 1120, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1615, 101, 1185, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1616, 101, 1186, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1617, 101, 1187, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1618, 101, 1188, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1619, 101, 1189, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1620, 101, 1190, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1621, 101, 1191, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1622, 101, 1192, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1623, 101, 1193, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1624, 101, 1194, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1625, 101, 1195, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1626, 101, 1196, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1627, 101, 1197, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1628, 101, 1198, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1629, 101, 1199, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1630, 101, 1200, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1631, 101, 1201, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1632, 101, 1202, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1633, 101, 1207, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1634, 101, 1208, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1635, 101, 1209, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1636, 101, 1210, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1637, 101, 1211, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1638, 101, 1212, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1639, 101, 1213, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1640, 101, 1215, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1641, 101, 2, '1', '2022-04-01 22:21:24', '1', '2022-04-01 22:21:24', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1642, 101, 1031, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1643, 101, 1032, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1644, 101, 1033, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1645, 101, 1034, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1646, 101, 1035, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1647, 101, 1050, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1648, 101, 1051, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1649, 101, 1052, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1650, 101, 1053, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1651, 101, 1054, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1652, 101, 1056, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1653, 101, 1057, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1654, 101, 1058, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1655, 101, 1059, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1656, 101, 1060, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1657, 101, 1066, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1658, 101, 1067, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1659, 101, 1070, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1660, 101, 1071, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1661, 101, 1072, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1662, 101, 1073, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1663, 101, 1074, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1664, 101, 1075, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1665, 101, 1076, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1666, 101, 1077, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1667, 101, 1078, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1668, 101, 1082, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1669, 101, 1083, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1670, 101, 1084, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1671, 101, 1085, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1672, 101, 1086, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1673, 101, 1087, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1674, 101, 1088, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1675, 101, 1089, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1679, 101, 1237, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1680, 101, 1238, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1681, 101, 1239, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1682, 101, 1240, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1683, 101, 1241, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1684, 101, 1242, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1685, 101, 1243, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1687, 101, 106, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1688, 101, 110, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1689, 101, 111, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1690, 101, 112, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1691, 101, 113, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1692, 101, 114, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1693, 101, 115, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1694, 101, 116, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1712, 113, 1024, '1', '2022-05-17 10:07:10', '1', '2022-05-17 10:07:10', b'0', 124); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1713, 113, 1025, '1', '2022-05-17 10:07:10', '1', '2022-05-17 10:07:10', b'0', 124); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1714, 113, 1, '1', '2022-05-17 10:07:10', '1', '2022-05-17 10:07:10', b'0', 124); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1715, 113, 102, '1', '2022-05-17 10:07:10', '1', '2022-05-17 10:07:10', b'0', 124); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1716, 113, 103, '1', '2022-05-17 10:07:10', '1', '2022-05-17 10:07:10', b'0', 124); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1717, 113, 104, '1', '2022-05-17 10:07:10', '1', '2022-05-17 10:07:10', b'0', 124); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1718, 113, 1013, '1', '2022-05-17 10:07:10', '1', '2022-05-17 10:07:10', b'0', 124); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1719, 113, 1014, '1', '2022-05-17 10:07:10', '1', '2022-05-17 10:07:10', b'0', 124); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1720, 113, 1015, '1', '2022-05-17 10:07:10', '1', '2022-05-17 10:07:10', b'0', 124); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1721, 113, 1016, '1', '2022-05-17 10:07:10', '1', '2022-05-17 10:07:10', b'0', 124); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1722, 113, 1017, '1', '2022-05-17 10:07:10', '1', '2022-05-17 10:07:10', b'0', 124); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1723, 113, 1018, '1', '2022-05-17 10:07:10', '1', '2022-05-17 10:07:10', b'0', 124); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1724, 113, 1019, '1', '2022-05-17 10:07:10', '1', '2022-05-17 10:07:10', b'0', 124); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1725, 113, 1020, '1', '2022-05-17 10:07:10', '1', '2022-05-17 10:07:10', b'0', 124); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1726, 113, 1021, '1', '2022-05-17 10:07:10', '1', '2022-05-17 10:07:10', b'0', 124); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1727, 113, 1022, '1', '2022-05-17 10:07:10', '1', '2022-05-17 10:07:10', b'0', 124); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1728, 113, 1023, '1', '2022-05-17 10:07:10', '1', '2022-05-17 10:07:10', b'0', 124); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1729, 109, 100, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1730, 109, 101, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1731, 109, 1063, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1732, 109, 1064, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1733, 109, 1001, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1734, 109, 1065, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1735, 109, 1002, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1736, 109, 1003, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1737, 109, 1004, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1738, 109, 1005, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1739, 109, 1006, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1740, 109, 1007, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1741, 109, 1008, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1742, 109, 1009, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1743, 109, 1010, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1744, 109, 1011, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1745, 109, 1012, '1', '2022-09-21 22:08:51', '1', '2022-09-21 22:08:51', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1746, 111, 100, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1747, 111, 101, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1748, 111, 1063, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1749, 111, 1064, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1750, 111, 1001, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1751, 111, 1065, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1752, 111, 1002, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1753, 111, 1003, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1754, 111, 1004, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1755, 111, 1005, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1756, 111, 1006, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1757, 111, 1007, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1758, 111, 1008, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1759, 111, 1009, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1760, 111, 1010, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1761, 111, 1011, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1762, 111, 1012, '1', '2022-09-21 22:08:52', '1', '2022-09-21 22:08:52', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1763, 109, 100, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1764, 109, 101, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1765, 109, 1063, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1766, 109, 1064, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1767, 109, 1001, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1768, 109, 1065, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1769, 109, 1002, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1770, 109, 1003, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1771, 109, 1004, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1772, 109, 1005, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1773, 109, 1006, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1774, 109, 1007, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1775, 109, 1008, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1776, 109, 1009, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1777, 109, 1010, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1778, 109, 1011, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1779, 109, 1012, '1', '2022-09-21 22:08:53', '1', '2022-09-21 22:08:53', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1780, 111, 100, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1781, 111, 101, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1782, 111, 1063, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1783, 111, 1064, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1784, 111, 1001, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1785, 111, 1065, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1786, 111, 1002, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1787, 111, 1003, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1788, 111, 1004, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1789, 111, 1005, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1790, 111, 1006, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1791, 111, 1007, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1792, 111, 1008, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1793, 111, 1009, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1794, 111, 1010, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1795, 111, 1011, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1796, 111, 1012, '1', '2022-09-21 22:08:54', '1', '2022-09-21 22:08:54', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1797, 109, 100, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1798, 109, 101, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1799, 109, 1063, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1800, 109, 1064, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1801, 109, 1001, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1802, 109, 1065, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1803, 109, 1002, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1804, 109, 1003, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1805, 109, 1004, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1806, 109, 1005, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1807, 109, 1006, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1808, 109, 1007, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1809, 109, 1008, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1810, 109, 1009, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1811, 109, 1010, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1812, 109, 1011, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1813, 109, 1012, '1', '2022-09-21 22:08:55', '1', '2022-09-21 22:08:55', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1814, 111, 100, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1815, 111, 101, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1816, 111, 1063, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1817, 111, 1064, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1818, 111, 1001, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1819, 111, 1065, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1820, 111, 1002, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1821, 111, 1003, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1822, 111, 1004, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1823, 111, 1005, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1824, 111, 1006, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1825, 111, 1007, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1826, 111, 1008, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1827, 111, 1009, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1828, 111, 1010, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1829, 111, 1011, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1830, 111, 1012, '1', '2022-09-21 22:08:56', '1', '2022-09-21 22:08:56', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1831, 109, 103, '1', '2022-09-21 22:43:23', '1', '2022-09-21 22:43:23', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1832, 109, 1017, '1', '2022-09-21 22:43:23', '1', '2022-09-21 22:43:23', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1833, 109, 1018, '1', '2022-09-21 22:43:23', '1', '2022-09-21 22:43:23', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1834, 109, 1019, '1', '2022-09-21 22:43:23', '1', '2022-09-21 22:43:23', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1835, 109, 1020, '1', '2022-09-21 22:43:23', '1', '2022-09-21 22:43:23', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1836, 111, 103, '1', '2022-09-21 22:43:24', '1', '2022-09-21 22:43:24', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1837, 111, 1017, '1', '2022-09-21 22:43:24', '1', '2022-09-21 22:43:24', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1838, 111, 1018, '1', '2022-09-21 22:43:24', '1', '2022-09-21 22:43:24', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1839, 111, 1019, '1', '2022-09-21 22:43:24', '1', '2022-09-21 22:43:24', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1840, 111, 1020, '1', '2022-09-21 22:43:24', '1', '2022-09-21 22:43:24', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1841, 109, 1036, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1842, 109, 1037, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1843, 109, 1038, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1844, 109, 1039, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1845, 109, 107, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', b'0', 121); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1846, 111, 1036, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1847, 111, 1037, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1848, 111, 1038, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1849, 111, 1039, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1850, 111, 107, '1', '2022-09-21 22:48:13', '1', '2022-09-21 22:48:13', b'0', 122); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1851, 114, 1, '1', '2022-12-30 11:32:03', '1', '2022-12-30 11:32:03', b'0', 125); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1852, 114, 1036, '1', '2022-12-30 11:32:03', '1', '2022-12-30 11:32:03', b'0', 125); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1853, 114, 1037, '1', '2022-12-30 11:32:03', '1', '2022-12-30 11:32:03', b'0', 125); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1854, 114, 1038, '1', '2022-12-30 11:32:03', '1', '2022-12-30 11:32:03', b'0', 125); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1855, 114, 1039, '1', '2022-12-30 11:32:03', '1', '2022-12-30 11:32:03', b'0', 125); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1856, 114, 100, '1', '2022-12-30 11:32:03', '1', '2022-12-30 11:32:03', b'0', 125); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1857, 114, 101, '1', '2022-12-30 11:32:03', '1', '2022-12-30 11:32:03', b'0', 125); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1858, 114, 1063, '1', '2022-12-30 11:32:03', '1', '2022-12-30 11:32:03', b'0', 125); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1859, 114, 103, '1', '2022-12-30 11:32:03', '1', '2022-12-30 11:32:03', b'0', 125); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1860, 114, 1064, '1', '2022-12-30 11:32:03', '1', '2022-12-30 11:32:03', b'0', 125); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1861, 114, 1001, '1', '2022-12-30 11:32:03', '1', '2022-12-30 11:32:03', b'0', 125); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1862, 114, 1065, '1', '2022-12-30 11:32:03', '1', '2022-12-30 11:32:03', b'0', 125); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1863, 114, 1002, '1', '2022-12-30 11:32:03', '1', '2022-12-30 11:32:03', b'0', 125); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1864, 114, 1003, '1', '2022-12-30 11:32:03', '1', '2022-12-30 11:32:03', b'0', 125); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1865, 114, 107, '1', '2022-12-30 11:32:03', '1', '2022-12-30 11:32:03', b'0', 125); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1866, 114, 1004, '1', '2022-12-30 11:32:03', '1', '2022-12-30 11:32:03', b'0', 125); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1867, 114, 1005, '1', '2022-12-30 11:32:03', '1', '2022-12-30 11:32:03', b'0', 125); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1868, 114, 1006, '1', '2022-12-30 11:32:03', '1', '2022-12-30 11:32:03', b'0', 125); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1869, 114, 1007, '1', '2022-12-30 11:32:03', '1', '2022-12-30 11:32:03', b'0', 125); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1870, 114, 1008, '1', '2022-12-30 11:32:03', '1', '2022-12-30 11:32:03', b'0', 125); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1871, 114, 1009, '1', '2022-12-30 11:32:03', '1', '2022-12-30 11:32:03', b'0', 125); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1872, 114, 1010, '1', '2022-12-30 11:32:03', '1', '2022-12-30 11:32:03', b'0', 125); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1873, 114, 1011, '1', '2022-12-30 11:32:03', '1', '2022-12-30 11:32:03', b'0', 125); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1874, 114, 1012, '1', '2022-12-30 11:32:03', '1', '2022-12-30 11:32:03', b'0', 125); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1875, 114, 1017, '1', '2022-12-30 11:32:03', '1', '2022-12-30 11:32:03', b'0', 125); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1876, 114, 1018, '1', '2022-12-30 11:32:03', '1', '2022-12-30 11:32:03', b'0', 125); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1877, 114, 1019, '1', '2022-12-30 11:32:03', '1', '2022-12-30 11:32:03', b'0', 125); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1878, 114, 1020, '1', '2022-12-30 11:32:03', '1', '2022-12-30 11:32:03', b'0', 125); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1879, 115, 1, '1', '2022-12-30 11:33:42', '1', '2022-12-30 11:33:42', b'0', 126); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1880, 115, 1036, '1', '2022-12-30 11:33:42', '1', '2022-12-30 11:33:42', b'0', 126); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1881, 115, 1037, '1', '2022-12-30 11:33:42', '1', '2022-12-30 11:33:42', b'0', 126); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1882, 115, 1038, '1', '2022-12-30 11:33:42', '1', '2022-12-30 11:33:42', b'0', 126); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1883, 115, 1039, '1', '2022-12-30 11:33:42', '1', '2022-12-30 11:33:42', b'0', 126); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1884, 115, 100, '1', '2022-12-30 11:33:42', '1', '2022-12-30 11:33:42', b'0', 126); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1885, 115, 101, '1', '2022-12-30 11:33:42', '1', '2022-12-30 11:33:42', b'0', 126); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1886, 115, 1063, '1', '2022-12-30 11:33:42', '1', '2022-12-30 11:33:42', b'0', 126); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1887, 115, 103, '1', '2022-12-30 11:33:42', '1', '2022-12-30 11:33:42', b'0', 126); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1888, 115, 1064, '1', '2022-12-30 11:33:42', '1', '2022-12-30 11:33:42', b'0', 126); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1889, 115, 1001, '1', '2022-12-30 11:33:42', '1', '2022-12-30 11:33:42', b'0', 126); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1890, 115, 1065, '1', '2022-12-30 11:33:42', '1', '2022-12-30 11:33:42', b'0', 126); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1891, 115, 1002, '1', '2022-12-30 11:33:42', '1', '2022-12-30 11:33:42', b'0', 126); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1892, 115, 1003, '1', '2022-12-30 11:33:42', '1', '2022-12-30 11:33:42', b'0', 126); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1893, 115, 107, '1', '2022-12-30 11:33:42', '1', '2022-12-30 11:33:42', b'0', 126); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1894, 115, 1004, '1', '2022-12-30 11:33:42', '1', '2022-12-30 11:33:42', b'0', 126); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1895, 115, 1005, '1', '2022-12-30 11:33:42', '1', '2022-12-30 11:33:42', b'0', 126); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1896, 115, 1006, '1', '2022-12-30 11:33:42', '1', '2022-12-30 11:33:42', b'0', 126); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1897, 115, 1007, '1', '2022-12-30 11:33:42', '1', '2022-12-30 11:33:42', b'0', 126); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1898, 115, 1008, '1', '2022-12-30 11:33:42', '1', '2022-12-30 11:33:42', b'0', 126); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1899, 115, 1009, '1', '2022-12-30 11:33:42', '1', '2022-12-30 11:33:42', b'0', 126); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1900, 115, 1010, '1', '2022-12-30 11:33:42', '1', '2022-12-30 11:33:42', b'0', 126); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1901, 115, 1011, '1', '2022-12-30 11:33:42', '1', '2022-12-30 11:33:42', b'0', 126); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1902, 115, 1012, '1', '2022-12-30 11:33:42', '1', '2022-12-30 11:33:42', b'0', 126); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1903, 115, 1017, '1', '2022-12-30 11:33:42', '1', '2022-12-30 11:33:42', b'0', 126); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1904, 115, 1018, '1', '2022-12-30 11:33:42', '1', '2022-12-30 11:33:42', b'0', 126); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1905, 115, 1019, '1', '2022-12-30 11:33:42', '1', '2022-12-30 11:33:42', b'0', 126); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1906, 115, 1020, '1', '2022-12-30 11:33:42', '1', '2022-12-30 11:33:42', b'0', 126); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1907, 116, 1, '1', '2022-12-30 11:33:48', '1', '2022-12-30 11:33:48', b'0', 127); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1908, 116, 1036, '1', '2022-12-30 11:33:48', '1', '2022-12-30 11:33:48', b'0', 127); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1909, 116, 1037, '1', '2022-12-30 11:33:48', '1', '2022-12-30 11:33:48', b'0', 127); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1910, 116, 1038, '1', '2022-12-30 11:33:48', '1', '2022-12-30 11:33:48', b'0', 127); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1911, 116, 1039, '1', '2022-12-30 11:33:48', '1', '2022-12-30 11:33:48', b'0', 127); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1912, 116, 100, '1', '2022-12-30 11:33:48', '1', '2022-12-30 11:33:48', b'0', 127); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1913, 116, 101, '1', '2022-12-30 11:33:48', '1', '2022-12-30 11:33:48', b'0', 127); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1914, 116, 1063, '1', '2022-12-30 11:33:48', '1', '2022-12-30 11:33:48', b'0', 127); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1915, 116, 103, '1', '2022-12-30 11:33:48', '1', '2022-12-30 11:33:48', b'0', 127); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1916, 116, 1064, '1', '2022-12-30 11:33:48', '1', '2022-12-30 11:33:48', b'0', 127); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1917, 116, 1001, '1', '2022-12-30 11:33:48', '1', '2022-12-30 11:33:48', b'0', 127); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1918, 116, 1065, '1', '2022-12-30 11:33:48', '1', '2022-12-30 11:33:48', b'0', 127); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1919, 116, 1002, '1', '2022-12-30 11:33:48', '1', '2022-12-30 11:33:48', b'0', 127); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1920, 116, 1003, '1', '2022-12-30 11:33:48', '1', '2022-12-30 11:33:48', b'0', 127); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1921, 116, 107, '1', '2022-12-30 11:33:48', '1', '2022-12-30 11:33:48', b'0', 127); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1922, 116, 1004, '1', '2022-12-30 11:33:48', '1', '2022-12-30 11:33:48', b'0', 127); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1923, 116, 1005, '1', '2022-12-30 11:33:48', '1', '2022-12-30 11:33:48', b'0', 127); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1924, 116, 1006, '1', '2022-12-30 11:33:48', '1', '2022-12-30 11:33:48', b'0', 127); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1925, 116, 1007, '1', '2022-12-30 11:33:48', '1', '2022-12-30 11:33:48', b'0', 127); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1926, 116, 1008, '1', '2022-12-30 11:33:48', '1', '2022-12-30 11:33:48', b'0', 127); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1927, 116, 1009, '1', '2022-12-30 11:33:48', '1', '2022-12-30 11:33:48', b'0', 127); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1928, 116, 1010, '1', '2022-12-30 11:33:48', '1', '2022-12-30 11:33:48', b'0', 127); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1929, 116, 1011, '1', '2022-12-30 11:33:48', '1', '2022-12-30 11:33:48', b'0', 127); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1930, 116, 1012, '1', '2022-12-30 11:33:48', '1', '2022-12-30 11:33:48', b'0', 127); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1931, 116, 1017, '1', '2022-12-30 11:33:48', '1', '2022-12-30 11:33:48', b'0', 127); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1932, 116, 1018, '1', '2022-12-30 11:33:48', '1', '2022-12-30 11:33:48', b'0', 127); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1933, 116, 1019, '1', '2022-12-30 11:33:48', '1', '2022-12-30 11:33:48', b'0', 127); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1934, 116, 1020, '1', '2022-12-30 11:33:48', '1', '2022-12-30 11:33:48', b'0', 127); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1963, 118, 1, '1', '2022-12-30 11:47:52', '1', '2022-12-30 11:47:52', b'0', 129); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1964, 118, 1036, '1', '2022-12-30 11:47:52', '1', '2022-12-30 11:47:52', b'0', 129); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1965, 118, 1037, '1', '2022-12-30 11:47:52', '1', '2022-12-30 11:47:52', b'0', 129); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1966, 118, 1038, '1', '2022-12-30 11:47:52', '1', '2022-12-30 11:47:52', b'0', 129); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1967, 118, 1039, '1', '2022-12-30 11:47:52', '1', '2022-12-30 11:47:52', b'0', 129); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1968, 118, 100, '1', '2022-12-30 11:47:52', '1', '2022-12-30 11:47:52', b'0', 129); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1969, 118, 101, '1', '2022-12-30 11:47:52', '1', '2022-12-30 11:47:52', b'0', 129); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1970, 118, 1063, '1', '2022-12-30 11:47:52', '1', '2022-12-30 11:47:52', b'0', 129); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1971, 118, 103, '1', '2022-12-30 11:47:52', '1', '2022-12-30 11:47:52', b'0', 129); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1972, 118, 1064, '1', '2022-12-30 11:47:52', '1', '2022-12-30 11:47:52', b'0', 129); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1973, 118, 1001, '1', '2022-12-30 11:47:52', '1', '2022-12-30 11:47:52', b'0', 129); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1974, 118, 1065, '1', '2022-12-30 11:47:52', '1', '2022-12-30 11:47:52', b'0', 129); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1975, 118, 1002, '1', '2022-12-30 11:47:52', '1', '2022-12-30 11:47:52', b'0', 129); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1976, 118, 1003, '1', '2022-12-30 11:47:52', '1', '2022-12-30 11:47:52', b'0', 129); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1977, 118, 107, '1', '2022-12-30 11:47:52', '1', '2022-12-30 11:47:52', b'0', 129); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1978, 118, 1004, '1', '2022-12-30 11:47:52', '1', '2022-12-30 11:47:52', b'0', 129); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1979, 118, 1005, '1', '2022-12-30 11:47:52', '1', '2022-12-30 11:47:52', b'0', 129); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1980, 118, 1006, '1', '2022-12-30 11:47:52', '1', '2022-12-30 11:47:52', b'0', 129); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1981, 118, 1007, '1', '2022-12-30 11:47:52', '1', '2022-12-30 11:47:52', b'0', 129); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1982, 118, 1008, '1', '2022-12-30 11:47:52', '1', '2022-12-30 11:47:52', b'0', 129); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1983, 118, 1009, '1', '2022-12-30 11:47:52', '1', '2022-12-30 11:47:52', b'0', 129); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1984, 118, 1010, '1', '2022-12-30 11:47:52', '1', '2022-12-30 11:47:52', b'0', 129); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1985, 118, 1011, '1', '2022-12-30 11:47:52', '1', '2022-12-30 11:47:52', b'0', 129); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1986, 118, 1012, '1', '2022-12-30 11:47:52', '1', '2022-12-30 11:47:52', b'0', 129); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1987, 118, 1017, '1', '2022-12-30 11:47:52', '1', '2022-12-30 11:47:52', b'0', 129); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1988, 118, 1018, '1', '2022-12-30 11:47:52', '1', '2022-12-30 11:47:52', b'0', 129); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1989, 118, 1019, '1', '2022-12-30 11:47:52', '1', '2022-12-30 11:47:52', b'0', 129); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1990, 118, 1020, '1', '2022-12-30 11:47:52', '1', '2022-12-30 11:47:52', b'0', 129); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1991, 2, 1024, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1992, 2, 1025, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1993, 2, 1026, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1994, 2, 1027, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1995, 2, 1028, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1996, 2, 1029, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1997, 2, 1030, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1998, 2, 1031, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1999, 2, 1032, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2000, 2, 1033, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2001, 2, 1034, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2002, 2, 1035, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2003, 2, 1036, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2004, 2, 1037, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2005, 2, 1038, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2006, 2, 1039, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2007, 2, 1040, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2008, 2, 1042, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2009, 2, 1043, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2010, 2, 1045, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2011, 2, 1046, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2012, 2, 1048, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2013, 2, 1050, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2014, 2, 1051, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2015, 2, 1052, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2016, 2, 1053, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2017, 2, 1054, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2018, 2, 1056, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2019, 2, 1057, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2020, 2, 1058, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2021, 2, 2083, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2022, 2, 1059, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2023, 2, 1060, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2024, 2, 1063, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2025, 2, 1064, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2026, 2, 1065, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2027, 2, 1066, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2028, 2, 1067, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2029, 2, 1070, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2030, 2, 1071, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2031, 2, 1072, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2032, 2, 1073, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2033, 2, 1074, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2034, 2, 1075, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2035, 2, 1076, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2036, 2, 1082, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2037, 2, 1085, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2038, 2, 1086, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2039, 2, 1087, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2040, 2, 1088, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2041, 2, 1089, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2042, 2, 1091, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2043, 2, 1092, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2044, 2, 1095, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2045, 2, 1096, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2046, 2, 1097, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2047, 2, 1098, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2048, 2, 1101, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2049, 2, 1102, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2050, 2, 1103, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2051, 2, 1104, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2052, 2, 1105, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2053, 2, 1106, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2054, 2, 1108, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2055, 2, 1109, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2056, 2, 1111, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2057, 2, 1112, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2058, 2, 1113, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2059, 2, 1114, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2060, 2, 1115, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2061, 2, 1127, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2062, 2, 1128, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2063, 2, 1129, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2064, 2, 1130, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2066, 2, 1132, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2067, 2, 1133, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2068, 2, 1134, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2069, 2, 1135, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2070, 2, 1136, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2071, 2, 1137, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2072, 2, 114, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2073, 2, 1139, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2074, 2, 115, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2075, 2, 1140, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2076, 2, 116, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2077, 2, 1141, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2078, 2, 1142, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2079, 2, 1143, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2080, 2, 1150, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2081, 2, 1161, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2082, 2, 1162, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2083, 2, 1163, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2084, 2, 1164, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2085, 2, 1165, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2086, 2, 1166, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2087, 2, 1173, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2088, 2, 1174, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2089, 2, 1175, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2090, 2, 1176, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2091, 2, 1177, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2092, 2, 1178, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2099, 2, 1226, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2100, 2, 1227, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2101, 2, 1228, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2102, 2, 1229, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2103, 2, 1237, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2104, 2, 1238, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2105, 2, 1239, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2106, 2, 1240, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2107, 2, 1241, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2108, 2, 1242, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2109, 2, 1243, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2110, 2, 1247, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2111, 2, 1248, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2112, 2, 1249, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2113, 2, 1250, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2114, 2, 1251, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2115, 2, 1252, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2116, 2, 1254, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2117, 2, 1255, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2118, 2, 1256, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2119, 2, 1257, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2120, 2, 1258, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2121, 2, 1259, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2122, 2, 1260, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2123, 2, 1261, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2124, 2, 1263, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2125, 2, 1264, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2126, 2, 1265, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2127, 2, 1266, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2128, 2, 1267, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2129, 2, 1001, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2130, 2, 1002, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2131, 2, 1003, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2132, 2, 1004, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2133, 2, 1005, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2134, 2, 1006, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2135, 2, 1007, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2136, 2, 1008, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2137, 2, 1009, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2138, 2, 1010, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2139, 2, 1011, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2140, 2, 1012, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2141, 2, 1013, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2142, 2, 1014, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2143, 2, 1015, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2144, 2, 1016, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2145, 2, 1017, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2146, 2, 1018, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2147, 2, 1019, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2148, 2, 1020, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2149, 2, 1021, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2150, 2, 1022, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2151, 2, 1023, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2152, 2, 1281, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2153, 2, 1282, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2154, 2, 2000, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2155, 2, 2002, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2156, 2, 2003, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2157, 2, 2004, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2158, 2, 2005, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2159, 2, 2006, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2160, 2, 2008, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2161, 2, 2009, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2162, 2, 2010, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2163, 2, 2011, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2164, 2, 2012, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2170, 2, 2019, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2171, 2, 2020, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2172, 2, 2021, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2173, 2, 2022, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2174, 2, 2023, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2175, 2, 2025, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2177, 2, 2027, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2178, 2, 2028, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2179, 2, 2029, '1', '2023-01-25 08:42:58', '1', '2023-01-25 08:42:58', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2180, 2, 2014, '1', '2023-01-25 08:43:12', '1', '2023-01-25 08:43:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2181, 2, 2015, '1', '2023-01-25 08:43:12', '1', '2023-01-25 08:43:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2182, 2, 2016, '1', '2023-01-25 08:43:12', '1', '2023-01-25 08:43:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2183, 2, 2017, '1', '2023-01-25 08:43:12', '1', '2023-01-25 08:43:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2184, 2, 2018, '1', '2023-01-25 08:43:12', '1', '2023-01-25 08:43:12', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2188, 101, 1024, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2189, 101, 1, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2190, 101, 1025, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2191, 101, 1026, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2192, 101, 1027, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2193, 101, 1028, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2194, 101, 1029, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2195, 101, 1030, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2196, 101, 1036, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2197, 101, 1037, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2198, 101, 1038, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2199, 101, 1039, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2200, 101, 1040, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2201, 101, 1042, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2202, 101, 1043, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2203, 101, 1045, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2204, 101, 1046, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2205, 101, 1048, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2206, 101, 2083, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2207, 101, 1063, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2208, 101, 1064, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2209, 101, 1065, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2210, 101, 1093, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2211, 101, 1094, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2212, 101, 1095, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2213, 101, 1096, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2214, 101, 1097, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2215, 101, 1098, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2216, 101, 1100, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2217, 101, 1101, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2218, 101, 1102, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2219, 101, 1103, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2220, 101, 1104, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2221, 101, 1105, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2222, 101, 1106, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2223, 101, 2130, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2224, 101, 1107, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2225, 101, 2131, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2226, 101, 1108, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2227, 101, 2132, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2228, 101, 1109, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2229, 101, 2133, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2230, 101, 2134, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2231, 101, 1110, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2232, 101, 2135, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2233, 101, 1111, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2234, 101, 2136, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2235, 101, 1112, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2236, 101, 2137, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2237, 101, 1113, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2238, 101, 2138, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2239, 101, 1114, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2240, 101, 2139, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2241, 101, 1115, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2242, 101, 2140, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2243, 101, 2141, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2244, 101, 2142, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2245, 101, 2143, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2246, 101, 2144, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2247, 101, 2145, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2248, 101, 2146, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2249, 101, 2147, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2250, 101, 100, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2251, 101, 2148, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2252, 101, 101, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2253, 101, 2149, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2254, 101, 102, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2255, 101, 2150, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2256, 101, 103, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2257, 101, 2151, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2258, 101, 104, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2259, 101, 2152, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2260, 101, 105, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2261, 101, 107, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2262, 101, 108, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2263, 101, 109, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2264, 101, 1138, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2265, 101, 1139, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2266, 101, 1140, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2267, 101, 1141, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2268, 101, 1142, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2269, 101, 1143, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2270, 101, 1224, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2271, 101, 1225, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2272, 101, 1226, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2273, 101, 1227, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2274, 101, 1228, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2275, 101, 1229, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2276, 101, 1247, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2277, 101, 1248, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2278, 101, 1249, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2279, 101, 1250, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2280, 101, 1251, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2281, 101, 1252, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2282, 101, 1261, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2283, 101, 1263, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2284, 101, 1264, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2285, 101, 1265, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2286, 101, 1266, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2287, 101, 1267, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2288, 101, 1001, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2289, 101, 1002, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2290, 101, 1003, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2291, 101, 1004, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2292, 101, 1005, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2293, 101, 1006, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2294, 101, 1007, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2295, 101, 1008, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2296, 101, 1009, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2297, 101, 1010, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2298, 101, 1011, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2299, 101, 1012, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2300, 101, 500, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2301, 101, 1013, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2302, 101, 501, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2303, 101, 1014, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2304, 101, 1015, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2305, 101, 1016, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2306, 101, 1017, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2307, 101, 1018, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2308, 101, 1019, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2309, 101, 1020, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2310, 101, 1021, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2311, 101, 1022, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2312, 101, 1023, '1', '2023-02-09 23:49:46', '1', '2023-02-09 23:49:46', b'0', 1); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2789, 136, 1, '1', '2023-03-05 21:23:32', '1', '2023-03-05 21:23:32', b'0', 147); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2790, 136, 1036, '1', '2023-03-05 21:23:32', '1', '2023-03-05 21:23:32', b'0', 147); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2791, 136, 1037, '1', '2023-03-05 21:23:32', '1', '2023-03-05 21:23:32', b'0', 147); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2792, 136, 1038, '1', '2023-03-05 21:23:32', '1', '2023-03-05 21:23:32', b'0', 147); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2793, 136, 1039, '1', '2023-03-05 21:23:32', '1', '2023-03-05 21:23:32', b'0', 147); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2794, 136, 100, '1', '2023-03-05 21:23:32', '1', '2023-03-05 21:23:32', b'0', 147); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2795, 136, 101, '1', '2023-03-05 21:23:32', '1', '2023-03-05 21:23:32', b'0', 147); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2796, 136, 1063, '1', '2023-03-05 21:23:32', '1', '2023-03-05 21:23:32', b'0', 147); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2797, 136, 103, '1', '2023-03-05 21:23:32', '1', '2023-03-05 21:23:32', b'0', 147); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2798, 136, 1064, '1', '2023-03-05 21:23:32', '1', '2023-03-05 21:23:32', b'0', 147); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2799, 136, 1001, '1', '2023-03-05 21:23:32', '1', '2023-03-05 21:23:32', b'0', 147); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2800, 136, 1065, '1', '2023-03-05 21:23:32', '1', '2023-03-05 21:23:32', b'0', 147); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2801, 136, 1002, '1', '2023-03-05 21:23:32', '1', '2023-03-05 21:23:32', b'0', 147); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2802, 136, 1003, '1', '2023-03-05 21:23:32', '1', '2023-03-05 21:23:32', b'0', 147); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2803, 136, 107, '1', '2023-03-05 21:23:32', '1', '2023-03-05 21:23:32', b'0', 147); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2804, 136, 1004, '1', '2023-03-05 21:23:32', '1', '2023-03-05 21:23:32', b'0', 147); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2805, 136, 1005, '1', '2023-03-05 21:23:32', '1', '2023-03-05 21:23:32', b'0', 147); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2806, 136, 1006, '1', '2023-03-05 21:23:32', '1', '2023-03-05 21:23:32', b'0', 147); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2807, 136, 1007, '1', '2023-03-05 21:23:32', '1', '2023-03-05 21:23:32', b'0', 147); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2808, 136, 1008, '1', '2023-03-05 21:23:32', '1', '2023-03-05 21:23:32', b'0', 147); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2809, 136, 1009, '1', '2023-03-05 21:23:32', '1', '2023-03-05 21:23:32', b'0', 147); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2810, 136, 1010, '1', '2023-03-05 21:23:32', '1', '2023-03-05 21:23:32', b'0', 147); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2811, 136, 1011, '1', '2023-03-05 21:23:32', '1', '2023-03-05 21:23:32', b'0', 147); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2812, 136, 1012, '1', '2023-03-05 21:23:32', '1', '2023-03-05 21:23:32', b'0', 147); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2813, 136, 1017, '1', '2023-03-05 21:23:32', '1', '2023-03-05 21:23:32', b'0', 147); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2814, 136, 1018, '1', '2023-03-05 21:23:32', '1', '2023-03-05 21:23:32', b'0', 147); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2815, 136, 1019, '1', '2023-03-05 21:23:32', '1', '2023-03-05 21:23:32', b'0', 147); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2816, 136, 1020, '1', '2023-03-05 21:23:32', '1', '2023-03-05 21:23:32', b'0', 147); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2817, 137, 1, '1', '2023-03-05 21:42:27', '1', '2023-03-05 21:42:27', b'0', 148); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2818, 137, 1036, '1', '2023-03-05 21:42:27', '1', '2023-03-05 21:42:27', b'0', 148); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2819, 137, 1037, '1', '2023-03-05 21:42:27', '1', '2023-03-05 21:42:27', b'0', 148); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2820, 137, 1038, '1', '2023-03-05 21:42:27', '1', '2023-03-05 21:42:27', b'0', 148); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2821, 137, 1039, '1', '2023-03-05 21:42:27', '1', '2023-03-05 21:42:27', b'0', 148); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2822, 137, 100, '1', '2023-03-05 21:42:27', '1', '2023-03-05 21:42:27', b'0', 148); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2823, 137, 101, '1', '2023-03-05 21:42:27', '1', '2023-03-05 21:42:27', b'0', 148); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2824, 137, 1063, '1', '2023-03-05 21:42:27', '1', '2023-03-05 21:42:27', b'0', 148); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2825, 137, 103, '1', '2023-03-05 21:42:27', '1', '2023-03-05 21:42:27', b'0', 148); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2826, 137, 1064, '1', '2023-03-05 21:42:27', '1', '2023-03-05 21:42:27', b'0', 148); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2827, 137, 1001, '1', '2023-03-05 21:42:27', '1', '2023-03-05 21:42:27', b'0', 148); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2828, 137, 1065, '1', '2023-03-05 21:42:27', '1', '2023-03-05 21:42:27', b'0', 148); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2829, 137, 1002, '1', '2023-03-05 21:42:27', '1', '2023-03-05 21:42:27', b'0', 148); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2830, 137, 1003, '1', '2023-03-05 21:42:27', '1', '2023-03-05 21:42:27', b'0', 148); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2831, 137, 107, '1', '2023-03-05 21:42:27', '1', '2023-03-05 21:42:27', b'0', 148); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2832, 137, 1004, '1', '2023-03-05 21:42:27', '1', '2023-03-05 21:42:27', b'0', 148); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2833, 137, 1005, '1', '2023-03-05 21:42:27', '1', '2023-03-05 21:42:27', b'0', 148); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2834, 137, 1006, '1', '2023-03-05 21:42:27', '1', '2023-03-05 21:42:27', b'0', 148); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2835, 137, 1007, '1', '2023-03-05 21:42:27', '1', '2023-03-05 21:42:27', b'0', 148); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2836, 137, 1008, '1', '2023-03-05 21:42:27', '1', '2023-03-05 21:42:27', b'0', 148); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2837, 137, 1009, '1', '2023-03-05 21:42:27', '1', '2023-03-05 21:42:27', b'0', 148); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2838, 137, 1010, '1', '2023-03-05 21:42:27', '1', '2023-03-05 21:42:27', b'0', 148); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2839, 137, 1011, '1', '2023-03-05 21:42:27', '1', '2023-03-05 21:42:27', b'0', 148); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2840, 137, 1012, '1', '2023-03-05 21:42:27', '1', '2023-03-05 21:42:27', b'0', 148); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2841, 137, 1017, '1', '2023-03-05 21:42:27', '1', '2023-03-05 21:42:27', b'0', 148); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2842, 137, 1018, '1', '2023-03-05 21:42:27', '1', '2023-03-05 21:42:27', b'0', 148); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2843, 137, 1019, '1', '2023-03-05 21:42:27', '1', '2023-03-05 21:42:27', b'0', 148); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2844, 137, 1020, '1', '2023-03-05 21:42:27', '1', '2023-03-05 21:42:27', b'0', 148); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2845, 138, 1, '1', '2023-03-05 21:59:02', '1', '2023-03-05 21:59:02', b'0', 149); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2846, 138, 1036, '1', '2023-03-05 21:59:02', '1', '2023-03-05 21:59:02', b'0', 149); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2847, 138, 1037, '1', '2023-03-05 21:59:02', '1', '2023-03-05 21:59:02', b'0', 149); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2848, 138, 1038, '1', '2023-03-05 21:59:02', '1', '2023-03-05 21:59:02', b'0', 149); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2849, 138, 1039, '1', '2023-03-05 21:59:02', '1', '2023-03-05 21:59:02', b'0', 149); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2850, 138, 100, '1', '2023-03-05 21:59:02', '1', '2023-03-05 21:59:02', b'0', 149); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2851, 138, 101, '1', '2023-03-05 21:59:02', '1', '2023-03-05 21:59:02', b'0', 149); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2852, 138, 1063, '1', '2023-03-05 21:59:02', '1', '2023-03-05 21:59:02', b'0', 149); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2853, 138, 103, '1', '2023-03-05 21:59:02', '1', '2023-03-05 21:59:02', b'0', 149); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2854, 138, 1064, '1', '2023-03-05 21:59:02', '1', '2023-03-05 21:59:02', b'0', 149); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2855, 138, 1001, '1', '2023-03-05 21:59:02', '1', '2023-03-05 21:59:02', b'0', 149); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2856, 138, 1065, '1', '2023-03-05 21:59:02', '1', '2023-03-05 21:59:02', b'0', 149); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2857, 138, 1002, '1', '2023-03-05 21:59:02', '1', '2023-03-05 21:59:02', b'0', 149); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2858, 138, 1003, '1', '2023-03-05 21:59:02', '1', '2023-03-05 21:59:02', b'0', 149); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2859, 138, 107, '1', '2023-03-05 21:59:02', '1', '2023-03-05 21:59:02', b'0', 149); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2860, 138, 1004, '1', '2023-03-05 21:59:02', '1', '2023-03-05 21:59:02', b'0', 149); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2861, 138, 1005, '1', '2023-03-05 21:59:02', '1', '2023-03-05 21:59:02', b'0', 149); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2862, 138, 1006, '1', '2023-03-05 21:59:02', '1', '2023-03-05 21:59:02', b'0', 149); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2863, 138, 1007, '1', '2023-03-05 21:59:02', '1', '2023-03-05 21:59:02', b'0', 149); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2864, 138, 1008, '1', '2023-03-05 21:59:02', '1', '2023-03-05 21:59:02', b'0', 149); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2865, 138, 1009, '1', '2023-03-05 21:59:02', '1', '2023-03-05 21:59:02', b'0', 149); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2866, 138, 1010, '1', '2023-03-05 21:59:02', '1', '2023-03-05 21:59:02', b'0', 149); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2867, 138, 1011, '1', '2023-03-05 21:59:02', '1', '2023-03-05 21:59:02', b'0', 149); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2868, 138, 1012, '1', '2023-03-05 21:59:02', '1', '2023-03-05 21:59:02', b'0', 149); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2869, 138, 1017, '1', '2023-03-05 21:59:02', '1', '2023-03-05 21:59:02', b'0', 149); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2870, 138, 1018, '1', '2023-03-05 21:59:02', '1', '2023-03-05 21:59:02', b'0', 149); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2871, 138, 1019, '1', '2023-03-05 21:59:02', '1', '2023-03-05 21:59:02', b'0', 149); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2872, 138, 1020, '1', '2023-03-05 21:59:02', '1', '2023-03-05 21:59:02', b'0', 149); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2873, 139, 1, '1', '2023-07-25 23:06:04', '1', '2023-07-25 23:06:04', b'0', 150); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2874, 139, 1036, '1', '2023-07-25 23:06:04', '1', '2023-07-25 23:06:04', b'0', 150); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2875, 139, 1037, '1', '2023-07-25 23:06:04', '1', '2023-07-25 23:06:04', b'0', 150); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2876, 139, 1038, '1', '2023-07-25 23:06:04', '1', '2023-07-25 23:06:04', b'0', 150); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2877, 139, 1039, '1', '2023-07-25 23:06:04', '1', '2023-07-25 23:06:04', b'0', 150); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2878, 139, 100, '1', '2023-07-25 23:06:04', '1', '2023-07-25 23:06:04', b'0', 150); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2879, 139, 101, '1', '2023-07-25 23:06:04', '1', '2023-07-25 23:06:04', b'0', 150); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2880, 139, 1063, '1', '2023-07-25 23:06:04', '1', '2023-07-25 23:06:04', b'0', 150); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2881, 139, 103, '1', '2023-07-25 23:06:04', '1', '2023-07-25 23:06:04', b'0', 150); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2882, 139, 1064, '1', '2023-07-25 23:06:04', '1', '2023-07-25 23:06:04', b'0', 150); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2883, 139, 1001, '1', '2023-07-25 23:06:04', '1', '2023-07-25 23:06:04', b'0', 150); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2884, 139, 1065, '1', '2023-07-25 23:06:04', '1', '2023-07-25 23:06:04', b'0', 150); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2885, 139, 1002, '1', '2023-07-25 23:06:04', '1', '2023-07-25 23:06:04', b'0', 150); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2886, 139, 1003, '1', '2023-07-25 23:06:04', '1', '2023-07-25 23:06:04', b'0', 150); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2887, 139, 107, '1', '2023-07-25 23:06:04', '1', '2023-07-25 23:06:04', b'0', 150); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2888, 139, 1004, '1', '2023-07-25 23:06:04', '1', '2023-07-25 23:06:04', b'0', 150); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2889, 139, 1005, '1', '2023-07-25 23:06:04', '1', '2023-07-25 23:06:04', b'0', 150); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2890, 139, 1006, '1', '2023-07-25 23:06:04', '1', '2023-07-25 23:06:04', b'0', 150); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2891, 139, 1007, '1', '2023-07-25 23:06:04', '1', '2023-07-25 23:06:04', b'0', 150); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2892, 139, 1008, '1', '2023-07-25 23:06:04', '1', '2023-07-25 23:06:04', b'0', 150); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2893, 139, 1009, '1', '2023-07-25 23:06:04', '1', '2023-07-25 23:06:04', b'0', 150); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2894, 139, 1010, '1', '2023-07-25 23:06:04', '1', '2023-07-25 23:06:04', b'0', 150); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2895, 139, 1011, '1', '2023-07-25 23:06:04', '1', '2023-07-25 23:06:04', b'0', 150); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2896, 139, 1012, '1', '2023-07-25 23:06:04', '1', '2023-07-25 23:06:04', b'0', 150); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2897, 139, 1017, '1', '2023-07-25 23:06:04', '1', '2023-07-25 23:06:04', b'0', 150); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2898, 139, 1018, '1', '2023-07-25 23:06:04', '1', '2023-07-25 23:06:04', b'0', 150); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2899, 139, 1019, '1', '2023-07-25 23:06:04', '1', '2023-07-25 23:06:04', b'0', 150); +INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2900, 139, 1020, '1', '2023-07-25 23:06:04', '1', '2023-07-25 23:06:04', b'0', 150); +COMMIT; + +-- ---------------------------- +-- Table structure for system_sensitive_word +-- ---------------------------- +DROP TABLE IF EXISTS `system_sensitive_word`; +CREATE TABLE `system_sensitive_word` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '敏感词', + `description` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '描述', + `tags` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '标签数组', + `status` tinyint NOT NULL COMMENT '状态', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '敏感词'; + +-- ---------------------------- +-- Records of system_sensitive_word +-- ---------------------------- +BEGIN; +INSERT INTO `system_sensitive_word` (`id`, `name`, `description`, `tags`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (3, '土豆', '好呀', '蔬菜,短信', 0, '1', '2022-04-08 21:07:12', '1', '2022-04-09 10:28:14', b'0'); +INSERT INTO `system_sensitive_word` (`id`, `name`, `description`, `tags`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (4, 'XXX', NULL, '短信', 0, '1', '2022-04-08 21:27:49', '1', '2022-06-19 00:36:50', b'0'); +INSERT INTO `system_sensitive_word` (`id`, `name`, `description`, `tags`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (5, '白痴', NULL, '测试', 0, '1', '2022-12-31 19:08:25', '1', '2022-12-31 19:08:25', b'0'); +COMMIT; + +-- ---------------------------- +-- Table structure for system_sms_channel +-- ---------------------------- +DROP TABLE IF EXISTS `system_sms_channel`; +CREATE TABLE `system_sms_channel` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + `signature` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '短信签名', + `code` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '渠道编码', + `status` tinyint NOT NULL COMMENT '开启状态', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '备注', + `api_key` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '短信 API 的账号', + `api_secret` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '短信 API 的秘钥', + `callback_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '短信发送回调 URL', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '短信渠道'; + +-- ---------------------------- +-- Records of system_sms_channel +-- ---------------------------- +BEGIN; +INSERT INTO `system_sms_channel` (`id`, `signature`, `code`, `status`, `remark`, `api_key`, `api_secret`, `callback_url`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2, 'Ballcat', 'ALIYUN', 0, '啦啦啦', 'LTAI5tCnKso2uG3kJ5gRav88', 'fGJ5SNXL7P1NHNRmJ7DJaMJGPyE55C', NULL, '', '2021-03-31 11:53:10', '1', '2021-04-14 00:08:37', b'0'); +INSERT INTO `system_sms_channel` (`id`, `signature`, `code`, `status`, `remark`, `api_key`, `api_secret`, `callback_url`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (4, '测试渠道', 'DEBUG_DING_TALK', 0, '123', '696b5d8ead48071237e4aa5861ff08dbadb2b4ded1c688a7b7c9afc615579859', 'SEC5c4e5ff888bc8a9923ae47f59e7ccd30af1f14d93c55b4e2c9cb094e35aeed67', NULL, '1', '2021-04-13 00:23:14', '1', '2022-03-27 20:29:49', b'0'); +INSERT INTO `system_sms_channel` (`id`, `signature`, `code`, `status`, `remark`, `api_key`, `api_secret`, `callback_url`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (6, '测试演示', 'DEBUG_DING_TALK', 0, NULL, '696b5d8ead48071237e4aa5861ff08dbadb2b4ded1c688a7b7c9afc615579859', 'SEC5c4e5ff888bc8a9923ae47f59e7ccd30af1f14d93c55b4e2c9cb094e35aeed67', NULL, '1', '2022-04-10 23:07:59', '1', '2022-06-19 00:33:54', b'0'); +COMMIT; + +-- ---------------------------- +-- Table structure for system_sms_code +-- ---------------------------- +DROP TABLE IF EXISTS `system_sms_code`; +CREATE TABLE `system_sms_code` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + `mobile` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '手机号', + `code` varchar(6) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '验证码', + `create_ip` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '创建 IP', + `scene` tinyint NOT NULL COMMENT '发送场景', + `today_index` tinyint NOT NULL COMMENT '今日发送的第几条', + `used` tinyint NOT NULL COMMENT '是否使用', + `used_time` datetime NULL DEFAULT NULL COMMENT '使用时间', + `used_ip` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '使用 IP', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_mobile`(`mobile` ASC) USING BTREE COMMENT '手机号' +) ENGINE = InnoDB AUTO_INCREMENT = 501 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '手机验证码'; + +-- ---------------------------- +-- Records of system_sms_code +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for system_sms_log +-- ---------------------------- +DROP TABLE IF EXISTS `system_sms_log`; +CREATE TABLE `system_sms_log` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + `channel_id` bigint NOT NULL COMMENT '短信渠道编号', + `channel_code` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '短信渠道编码', + `template_id` bigint NOT NULL COMMENT '模板编号', + `template_code` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '模板编码', + `template_type` tinyint NOT NULL COMMENT '短信类型', + `template_content` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '短信内容', + `template_params` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '短信参数', + `api_template_id` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '短信 API 的模板编号', + `mobile` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '手机号', + `user_id` bigint NULL DEFAULT NULL COMMENT '用户编号', + `send_status` tinyint NOT NULL DEFAULT 0 COMMENT '发送状态', + `send_time` datetime NULL DEFAULT NULL COMMENT '发送时间', + `send_code` int NULL DEFAULT NULL COMMENT '发送结果的编码', + `send_msg` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '发送结果的提示', + `api_send_code` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '短信 API 发送结果的编码', + `api_send_msg` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '短信 API 发送失败的提示', + `api_request_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '短信 API 发送返回的唯一请求 ID', + `api_serial_no` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '短信 API 发送返回的序号', + `receive_status` tinyint NOT NULL DEFAULT 0 COMMENT '接收状态', + `receive_time` datetime NULL DEFAULT NULL COMMENT '接收时间', + `api_receive_code` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT 'API 接收结果的编码', + `api_receive_msg` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT 'API 接收结果的说明', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 365 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '短信日志'; + +-- ---------------------------- +-- Records of system_sms_log +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for system_sms_template +-- ---------------------------- +DROP TABLE IF EXISTS `system_sms_template`; +CREATE TABLE `system_sms_template` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + `type` tinyint NOT NULL COMMENT '短信签名', + `status` tinyint NOT NULL COMMENT '开启状态', + `code` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '模板编码', + `name` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '模板名称', + `content` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '模板内容', + `params` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '参数数组', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '备注', + `api_template_id` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '短信 API 的模板编号', + `channel_id` bigint NOT NULL COMMENT '短信渠道编号', + `channel_code` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '短信渠道编码', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 17 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '短信模板'; + +-- ---------------------------- +-- Records of system_sms_template +-- ---------------------------- +BEGIN; +INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2, 1, 0, 'test_01', '测试验证码短信', '正在进行登录操作{operation},您的验证码是{code}', '[\"operation\",\"code\"]', NULL, '4383920', 6, 'DEBUG_DING_TALK', '', '2021-03-31 10:49:38', '1', '2022-12-10 21:26:20', b'0'); +INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (3, 1, 0, 'test_02', '公告通知', '您的验证码{code},该验证码5分钟内有效,请勿泄漏于他人!', '[\"code\"]', NULL, 'SMS_207945135', 2, 'ALIYUN', '', '2021-03-31 11:56:30', '1', '2021-04-10 01:22:02', b'0'); +INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (6, 3, 0, 'test-01', '测试模板', '哈哈哈 {name}', '[\"name\"]', 'f哈哈哈', '4383920', 6, 'DEBUG_DING_TALK', '1', '2021-04-10 01:07:21', '1', '2022-12-10 21:26:09', b'0'); +INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (7, 3, 0, 'test-04', '测试下', '老鸡{name},牛逼{code}', '[\"name\",\"code\"]', NULL, 'suibian', 4, 'DEBUG_DING_TALK', '1', '2021-04-13 00:29:53', '1', '2021-04-14 00:30:38', b'0'); +INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (8, 1, 0, 'user-sms-login', '前台用户短信登录', '您的验证码是{code}', '[\"code\"]', NULL, '4372216', 6, 'DEBUG_DING_TALK', '1', '2021-10-11 08:10:00', '1', '2022-12-10 21:25:59', b'0'); +INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (9, 2, 0, 'bpm_task_assigned', '【工作流】任务被分配', '您收到了一条新的待办任务:{processInstanceName}-{taskName},申请人:{startUserNickname},处理链接:{detailUrl}', '[\"processInstanceName\",\"taskName\",\"startUserNickname\",\"detailUrl\"]', NULL, 'suibian', 4, 'DEBUG_DING_TALK', '1', '2022-01-21 22:31:19', '1', '2022-01-22 00:03:36', b'0'); +INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (10, 2, 0, 'bpm_process_instance_reject', '【工作流】流程被不通过', '您的流程被审批不通过:{processInstanceName},原因:{reason},查看链接:{detailUrl}', '[\"processInstanceName\",\"reason\",\"detailUrl\"]', NULL, 'suibian', 4, 'DEBUG_DING_TALK', '1', '2022-01-22 00:03:31', '1', '2022-05-01 12:33:14', b'0'); +INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (11, 2, 0, 'bpm_process_instance_approve', '【工作流】流程被通过', '您的流程被审批通过:{processInstanceName},查看链接:{detailUrl}', '[\"processInstanceName\",\"detailUrl\"]', NULL, 'suibian', 4, 'DEBUG_DING_TALK', '1', '2022-01-22 00:04:31', '1', '2022-03-27 20:32:21', b'0'); +INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (12, 2, 0, 'demo', '演示模板', '我就是测试一下下', '[]', NULL, 'biubiubiu', 6, 'DEBUG_DING_TALK', '1', '2022-04-10 23:22:49', '1', '2023-03-24 23:45:07', b'0'); +INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (14, 1, 0, 'user-update-mobile', '会员用户 - 修改手机', '您的验证码{code},该验证码 5 分钟内有效,请勿泄漏于他人!', '[\"code\"]', '', 'null', 4, 'DEBUG_DING_TALK', '1', '2023-08-19 18:58:01', '1', '2023-08-19 11:34:04', b'0'); +INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (15, 1, 0, 'user-update-password', '会员用户 - 修改密码', '您的验证码{code},该验证码 5 分钟内有效,请勿泄漏于他人!', '[\"code\"]', '', 'null', 4, 'DEBUG_DING_TALK', '1', '2023-08-19 18:58:01', '1', '2023-08-19 11:34:18', b'0'); +INSERT INTO `system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (16, 1, 0, 'user-reset-password', '会员用户 - 重置密码', '您的验证码{code},该验证码 5 分钟内有效,请勿泄漏于他人!', '[\"code\"]', '', 'null', 4, 'DEBUG_DING_TALK', '1', '2023-08-19 18:58:01', '1', '2023-08-19 11:34:18', b'0'); +COMMIT; + +-- ---------------------------- +-- Table structure for system_social_user +-- ---------------------------- +DROP TABLE IF EXISTS `system_social_user`; +CREATE TABLE `system_social_user` ( + `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键(自增策略)', + `type` tinyint NOT NULL COMMENT '社交平台的类型', + `openid` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '社交 openid', + `token` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '社交 token', + `raw_token_info` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '原始 Token 数据,一般是 JSON 格式', + `nickname` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户昵称', + `avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '用户头像', + `raw_user_info` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '原始用户数据,一般是 JSON 格式', + `code` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '最后一次的认证 code', + `state` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '最后一次的认证 state', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 20 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '社交用户表'; + +-- ---------------------------- +-- Records of system_social_user +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for system_social_user_bind +-- ---------------------------- +DROP TABLE IF EXISTS `system_social_user_bind`; +CREATE TABLE `system_social_user_bind` ( + `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键(自增策略)', + `user_id` bigint NOT NULL COMMENT '用户编号', + `social_type` tinyint NOT NULL COMMENT '社交平台的类型', + `social_user_id` bigint NOT NULL COMMENT '社交用户的编号', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 39 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '社交绑定表'; + +-- ---------------------------- +-- Records of system_social_user_bind +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for system_tenant +-- ---------------------------- +DROP TABLE IF EXISTS `system_tenant`; +CREATE TABLE `system_tenant` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '租户编号', + `name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '租户名', + `contact_user_id` bigint NULL DEFAULT NULL COMMENT '联系人的用户编号', + `contact_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '联系人', + `contact_mobile` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '联系手机', + `status` tinyint NOT NULL DEFAULT 0 COMMENT '租户状态(0正常 1停用)', + `domain` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '绑定域名', + `package_id` bigint NOT NULL COMMENT '租户套餐编号', + `expire_time` datetime NOT NULL COMMENT '过期时间', + `account_count` int NOT NULL COMMENT '账号数量', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 151 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '租户表'; + +-- ---------------------------- +-- Records of system_tenant +-- ---------------------------- +BEGIN; +INSERT INTO `system_tenant` (`id`, `name`, `contact_user_id`, `contact_name`, `contact_mobile`, `status`, `domain`, `package_id`, `expire_time`, `account_count`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1, '闻荫源码', NULL, '芋艿', '17321315478', 0, 'https://www.iocoder.cn', 0, '2099-02-19 17:14:16', 9999, '1', '2021-01-05 17:03:47', '1', '2022-02-23 12:15:11', b'0'); +INSERT INTO `system_tenant` (`id`, `name`, `contact_user_id`, `contact_name`, `contact_mobile`, `status`, `domain`, `package_id`, `expire_time`, `account_count`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (121, '小租户', 110, '小王2', '15601691300', 0, 'http://www.iocoder.cn', 111, '2024-03-11 00:00:00', 20, '1', '2022-02-22 00:56:14', '1', '2023-07-25 23:05:38', b'0'); +INSERT INTO `system_tenant` (`id`, `name`, `contact_user_id`, `contact_name`, `contact_mobile`, `status`, `domain`, `package_id`, `expire_time`, `account_count`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (122, '测试租户', 113, '闻荫', '15601691300', 0, 'https://www.iocoder.cn', 111, '2022-04-30 00:00:00', 50, '1', '2022-03-07 21:37:58', '1', '2023-07-25 23:53:16', b'0'); +COMMIT; + +-- ---------------------------- +-- Table structure for system_tenant_package +-- ---------------------------- +DROP TABLE IF EXISTS `system_tenant_package`; +CREATE TABLE `system_tenant_package` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '套餐编号', + `name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '套餐名', + `status` tinyint NOT NULL DEFAULT 0 COMMENT '租户状态(0正常 1停用)', + `remark` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '备注', + `menu_ids` varchar(2048) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '关联的菜单编号', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 112 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '租户套餐表'; + +-- ---------------------------- +-- Records of system_tenant_package +-- ---------------------------- +BEGIN; +INSERT INTO `system_tenant_package` (`id`, `name`, `status`, `remark`, `menu_ids`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (111, '普通套餐', 0, '小功能', '[1,1036,1037,1038,1039,100,101,1063,103,1064,1001,1065,1002,1003,107,1004,1005,1006,1007,1008,1009,1010,1011,1012,1017,1018,1019,1020]', '1', '2022-02-22 00:54:00', '1', '2022-09-21 22:48:12', b'0'); +COMMIT; + +-- ---------------------------- +-- Table structure for system_user_post +-- ---------------------------- +DROP TABLE IF EXISTS `system_user_post`; +CREATE TABLE `system_user_post` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id', + `user_id` bigint NOT NULL DEFAULT 0 COMMENT '用户ID', + `post_id` bigint NOT NULL DEFAULT 0 COMMENT '岗位ID', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 118 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '用户岗位表'; + +-- ---------------------------- +-- Records of system_user_post +-- ---------------------------- +BEGIN; +INSERT INTO `system_user_post` (`id`, `user_id`, `post_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (112, 1, 1, 'admin', '2022-05-02 07:25:24', 'admin', '2022-05-02 07:25:24', b'0', 1); +INSERT INTO `system_user_post` (`id`, `user_id`, `post_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (113, 100, 1, 'admin', '2022-05-02 07:25:24', 'admin', '2022-05-02 07:25:24', b'0', 1); +INSERT INTO `system_user_post` (`id`, `user_id`, `post_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (114, 114, 3, 'admin', '2022-05-02 07:25:24', 'admin', '2022-05-02 07:25:24', b'0', 1); +INSERT INTO `system_user_post` (`id`, `user_id`, `post_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (115, 104, 1, '1', '2022-05-16 19:36:28', '1', '2022-05-16 19:36:28', b'0', 1); +INSERT INTO `system_user_post` (`id`, `user_id`, `post_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (116, 117, 2, '1', '2022-07-09 17:40:26', '1', '2022-07-09 17:40:26', b'0', 1); +INSERT INTO `system_user_post` (`id`, `user_id`, `post_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (117, 118, 1, '1', '2022-07-09 17:44:44', '1', '2022-07-09 17:44:44', b'0', 1); +COMMIT; + +-- ---------------------------- +-- Table structure for system_user_role +-- ---------------------------- +DROP TABLE IF EXISTS `system_user_role`; +CREATE TABLE `system_user_role` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增编号', + `user_id` bigint NOT NULL COMMENT '用户ID', + `role_id` bigint NOT NULL COMMENT '角色ID', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 32 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '用户和角色关联表'; + +-- ---------------------------- +-- Records of system_user_role +-- ---------------------------- +BEGIN; +INSERT INTO `system_user_role` (`id`, `user_id`, `role_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1, 1, 1, '', '2022-01-11 13:19:45', '', '2022-05-12 12:35:17', b'0', 1); +INSERT INTO `system_user_role` (`id`, `user_id`, `role_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2, 2, 2, '', '2022-01-11 13:19:45', '', '2022-05-12 12:35:13', b'0', 1); +INSERT INTO `system_user_role` (`id`, `user_id`, `role_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (4, 100, 101, '', '2022-01-11 13:19:45', '', '2022-05-12 12:35:13', b'0', 1); +INSERT INTO `system_user_role` (`id`, `user_id`, `role_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (5, 100, 1, '', '2022-01-11 13:19:45', '', '2022-05-12 12:35:12', b'0', 1); +INSERT INTO `system_user_role` (`id`, `user_id`, `role_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (6, 100, 2, '', '2022-01-11 13:19:45', '', '2022-05-12 12:35:11', b'0', 1); +INSERT INTO `system_user_role` (`id`, `user_id`, `role_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (10, 103, 1, '1', '2022-01-11 13:19:45', '1', '2022-01-11 13:19:45', b'0', 1); +INSERT INTO `system_user_role` (`id`, `user_id`, `role_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (11, 107, 106, '1', '2022-02-20 22:59:33', '1', '2022-02-20 22:59:33', b'0', 118); +INSERT INTO `system_user_role` (`id`, `user_id`, `role_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (12, 108, 107, '1', '2022-02-20 23:00:50', '1', '2022-02-20 23:00:50', b'0', 119); +INSERT INTO `system_user_role` (`id`, `user_id`, `role_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (13, 109, 108, '1', '2022-02-20 23:11:50', '1', '2022-02-20 23:11:50', b'0', 120); +INSERT INTO `system_user_role` (`id`, `user_id`, `role_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (14, 110, 109, '1', '2022-02-22 00:56:14', '1', '2022-02-22 00:56:14', b'0', 121); +INSERT INTO `system_user_role` (`id`, `user_id`, `role_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (15, 111, 110, '110', '2022-02-23 13:14:38', '110', '2022-02-23 13:14:38', b'0', 121); +INSERT INTO `system_user_role` (`id`, `user_id`, `role_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (16, 113, 111, '1', '2022-03-07 21:37:58', '1', '2022-03-07 21:37:58', b'0', 122); +INSERT INTO `system_user_role` (`id`, `user_id`, `role_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (17, 114, 101, '1', '2022-03-19 21:51:13', '1', '2022-03-19 21:51:13', b'0', 1); +INSERT INTO `system_user_role` (`id`, `user_id`, `role_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (18, 1, 2, '1', '2022-05-12 20:39:29', '1', '2022-05-12 20:39:29', b'0', 1); +INSERT INTO `system_user_role` (`id`, `user_id`, `role_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (19, 116, 113, '1', '2022-05-17 10:07:10', '1', '2022-05-17 10:07:10', b'0', 124); +INSERT INTO `system_user_role` (`id`, `user_id`, `role_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (20, 104, 101, '1', '2022-05-28 15:43:57', '1', '2022-05-28 15:43:57', b'0', 1); +INSERT INTO `system_user_role` (`id`, `user_id`, `role_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (22, 115, 2, '1', '2022-07-21 22:08:30', '1', '2022-07-21 22:08:30', b'0', 1); +INSERT INTO `system_user_role` (`id`, `user_id`, `role_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (23, 119, 114, '1', '2022-12-30 11:32:04', '1', '2022-12-30 11:32:04', b'0', 125); +INSERT INTO `system_user_role` (`id`, `user_id`, `role_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (24, 120, 115, '1', '2022-12-30 11:33:42', '1', '2022-12-30 11:33:42', b'0', 126); +INSERT INTO `system_user_role` (`id`, `user_id`, `role_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (25, 121, 116, '1', '2022-12-30 11:33:49', '1', '2022-12-30 11:33:49', b'0', 127); +INSERT INTO `system_user_role` (`id`, `user_id`, `role_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (26, 122, 118, '1', '2022-12-30 11:47:53', '1', '2022-12-30 11:47:53', b'0', 129); +INSERT INTO `system_user_role` (`id`, `user_id`, `role_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (27, 112, 101, '1', '2023-02-09 23:18:51', '1', '2023-02-09 23:18:51', b'0', 1); +INSERT INTO `system_user_role` (`id`, `user_id`, `role_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (28, 123, 136, '1', '2023-03-05 21:23:35', '1', '2023-03-05 21:23:35', b'0', 147); +INSERT INTO `system_user_role` (`id`, `user_id`, `role_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (29, 124, 137, '1', '2023-03-05 21:42:27', '1', '2023-03-05 21:42:27', b'0', 148); +INSERT INTO `system_user_role` (`id`, `user_id`, `role_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (30, 125, 138, '1', '2023-03-05 21:59:03', '1', '2023-03-05 21:59:03', b'0', 149); +INSERT INTO `system_user_role` (`id`, `user_id`, `role_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (31, 126, 139, '1', '2023-07-25 23:06:04', '1', '2023-07-25 23:06:04', b'0', 150); +COMMIT; + +-- ---------------------------- +-- Table structure for system_users +-- ---------------------------- +DROP TABLE IF EXISTS `system_users`; +CREATE TABLE `system_users` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '用户ID', + `username` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户账号', + `password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '密码', + `nickname` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户昵称', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '备注', + `dept_id` bigint NULL DEFAULT NULL COMMENT '部门ID', + `post_ids` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '岗位编号数组', + `email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '用户邮箱', + `mobile` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '手机号码', + `sex` tinyint NULL DEFAULT 0 COMMENT '用户性别', + `avatar` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '头像地址', + `status` tinyint NOT NULL DEFAULT 0 COMMENT '帐号状态(0正常 1停用)', + `login_ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '最后登录IP', + `login_date` datetime NULL DEFAULT NULL COMMENT '最后登录时间', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `idx_username`(`username` ASC, `update_time` ASC, `tenant_id` ASC) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 127 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '用户信息表'; + +-- ---------------------------- +-- Records of system_users +-- ---------------------------- +BEGIN; +INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, `dept_id`, `post_ids`, `email`, `mobile`, `sex`, `avatar`, `status`, `login_ip`, `login_date`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1, 'admin', '$2a$10$mRMIYLDtRHlf6.9ipiqH1.Z.bh/R9dO9d5iHiGYPigi6r5KOoR2Wm', '闻荫源码', '管理员', 103, '[1]', 'aoteman@126.com', '15612345678', 1, 'http://test.win.iocoder.cn/e1fdd7271685ec143a0900681606406621717a666ad0b2798b096df41422b32f.png', 0, '0:0:0:0:0:0:0:1', '2023-09-02 00:03:37', 'admin', '2021-01-05 17:03:47', NULL, '2023-09-02 00:03:37', b'0', 1); +INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, `dept_id`, `post_ids`, `email`, `mobile`, `sex`, `avatar`, `status`, `login_ip`, `login_date`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (100, 'win', '$2a$10$11U48RhyJ5pSBYWSn12AD./ld671.ycSzJHbyrtpeoMeYiw31eo8a', '闻荫', '不要吓我', 104, '[1]', 'win@iocoder.cn', '15601691300', 1, '', 1, '127.0.0.1', '2022-07-09 23:03:33', '', '2021-01-07 09:07:17', NULL, '2022-07-09 23:03:33', b'0', 1); +INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, `dept_id`, `post_ids`, `email`, `mobile`, `sex`, `avatar`, `status`, `login_ip`, `login_date`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (103, 'yuanma', '$2a$10$YMpimV4T6BtDhIaA8jSW.u8UTGBeGhc/qwXP4oxoMr4mOw9.qttt6', '源码', NULL, 106, NULL, 'yuanma@iocoder.cn', '15601701300', 0, '', 0, '127.0.0.1', '2022-07-08 01:26:27', '', '2021-01-13 23:50:35', NULL, '2022-07-08 01:26:27', b'0', 1); +INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, `dept_id`, `post_ids`, `email`, `mobile`, `sex`, `avatar`, `status`, `login_ip`, `login_date`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (104, 'test', '$2a$10$GP8zvqHB//TekuzYZSBYAuBQJiNq1.fxQVDYJ.uBCOnWCtDVKE4H6', '测试号', NULL, 107, '[1,2]', '111@qq.com', '15601691200', 1, '', 0, '127.0.0.1', '2022-05-28 15:43:17', '', '2021-01-21 02:13:53', NULL, '2022-07-09 09:00:33', b'0', 1); +INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, `dept_id`, `post_ids`, `email`, `mobile`, `sex`, `avatar`, `status`, `login_ip`, `login_date`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (107, 'admin107', '$2a$10$dYOOBKMO93v/.ReCqzyFg.o67Tqk.bbc2bhrpyBGkIw9aypCtr2pm', '芋艿', NULL, NULL, NULL, '', '15601691300', 0, '', 0, '', NULL, '1', '2022-02-20 22:59:33', '1', '2022-02-27 08:26:51', b'0', 118); +INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, `dept_id`, `post_ids`, `email`, `mobile`, `sex`, `avatar`, `status`, `login_ip`, `login_date`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (108, 'admin108', '$2a$10$y6mfvKoNYL1GXWak8nYwVOH.kCWqjactkzdoIDgiKl93WN3Ejg.Lu', '芋艿', NULL, NULL, NULL, '', '15601691300', 0, '', 0, '', NULL, '1', '2022-02-20 23:00:50', '1', '2022-02-27 08:26:53', b'0', 119); +INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, `dept_id`, `post_ids`, `email`, `mobile`, `sex`, `avatar`, `status`, `login_ip`, `login_date`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (109, 'admin109', '$2a$10$JAqvH0tEc0I7dfDVBI7zyuB4E3j.uH6daIjV53.vUS6PknFkDJkuK', '芋艿', NULL, NULL, NULL, '', '15601691300', 0, '', 0, '', NULL, '1', '2022-02-20 23:11:50', '1', '2022-02-27 08:26:56', b'0', 120); +INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, `dept_id`, `post_ids`, `email`, `mobile`, `sex`, `avatar`, `status`, `login_ip`, `login_date`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (110, 'admin110', '$2a$10$mRMIYLDtRHlf6.9ipiqH1.Z.bh/R9dO9d5iHiGYPigi6r5KOoR2Wm', '小王', NULL, NULL, NULL, '', '15601691300', 0, '', 0, '127.0.0.1', '2022-09-25 22:47:33', '1', '2022-02-22 00:56:14', NULL, '2022-09-25 22:47:33', b'0', 121); +INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, `dept_id`, `post_ids`, `email`, `mobile`, `sex`, `avatar`, `status`, `login_ip`, `login_date`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (111, 'test', '$2a$10$mExveopHUx9Q4QiLtAzhDeH3n4/QlNLzEsM4AqgxKrU.ciUZDXZCy', '测试用户', NULL, NULL, '[]', '', '', 0, '', 0, '', NULL, '110', '2022-02-23 13:14:33', '110', '2022-02-23 13:14:33', b'0', 121); +INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, `dept_id`, `post_ids`, `email`, `mobile`, `sex`, `avatar`, `status`, `login_ip`, `login_date`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (112, 'newobject', '$2a$10$3alwklxqfq8/hKoW6oUV0OJp0IdQpBDauLy4633SpUjrRsStl6kMa', '新对象', NULL, 100, '[]', '', '', 1, '', 0, '0:0:0:0:0:0:0:1', '2023-02-10 13:48:13', '1', '2022-02-23 19:08:03', NULL, '2023-02-10 13:48:13', b'0', 1); +INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, `dept_id`, `post_ids`, `email`, `mobile`, `sex`, `avatar`, `status`, `login_ip`, `login_date`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (113, 'aoteman', '$2a$10$0acJOIk2D25/oC87nyclE..0lzeu9DtQ/n3geP4fkun/zIVRhHJIO', '闻荫', NULL, NULL, NULL, '', '15601691300', 0, '', 0, '127.0.0.1', '2022-03-19 18:38:51', '1', '2022-03-07 21:37:58', NULL, '2022-03-19 18:38:51', b'0', 122); +INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, `dept_id`, `post_ids`, `email`, `mobile`, `sex`, `avatar`, `status`, `login_ip`, `login_date`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (114, 'hrmgr', '$2a$10$TR4eybBioGRhBmDBWkqWLO6NIh3mzYa8KBKDDB5woiGYFVlRAi.fu', 'hr 小姐姐', NULL, NULL, '[3]', '', '', 0, '', 0, '127.0.0.1', '2022-03-19 22:15:43', '1', '2022-03-19 21:50:58', NULL, '2022-03-19 22:15:43', b'0', 1); +INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, `dept_id`, `post_ids`, `email`, `mobile`, `sex`, `avatar`, `status`, `login_ip`, `login_date`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (115, 'aotemane', '$2a$10$/WCwGHu1eq0wOVDd/u8HweJ0gJCHyLS6T7ndCqI8UXZAQom1etk2e', '1', '11', 101, '[]', '', '', 1, '', 0, '', NULL, '1', '2022-04-30 02:55:43', '1', '2022-06-22 13:34:58', b'0', 1); +INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, `dept_id`, `post_ids`, `email`, `mobile`, `sex`, `avatar`, `status`, `login_ip`, `login_date`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (116, '15601691302', '$2a$10$L5C4S0U6adBWMvFv1Wwl4.DI/NwYS3WIfLj5Q.Naqr5II8CmqsDZ6', '小豆', NULL, NULL, NULL, '', '', 0, '', 0, '', NULL, '1', '2022-05-17 10:07:10', '1', '2022-05-17 10:07:10', b'0', 124); +INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, `dept_id`, `post_ids`, `email`, `mobile`, `sex`, `avatar`, `status`, `login_ip`, `login_date`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (117, 'admin123', '$2a$10$WI8Gg/lpZQIrOEZMHqka7OdFaD4Nx.B/qY8ZGTTUKrOJwaHFqibaC', '测试号', '1111', 100, '[2]', '', '15601691234', 1, '', 0, '', NULL, '1', '2022-07-09 17:40:26', '1', '2022-07-09 17:40:26', b'0', 1); +INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, `dept_id`, `post_ids`, `email`, `mobile`, `sex`, `avatar`, `status`, `login_ip`, `login_date`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (118, 'goudan', '$2a$10$Lrb71muL.s5/AFjQ2IHkzOFlAFwUToH.zQL7bnghvTDt/QptjGgF6', '狗蛋', NULL, 103, '[1]', '', '', 2, '', 0, '', NULL, '1', '2022-07-09 17:44:43', '1', '2022-12-31 17:29:13', b'0', 1); +COMMIT; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/sql/oracle/ruoyi-vue-pro.sql b/sql/oracle/ruoyi-vue-pro.sql new file mode 100644 index 0000000..074e227 --- /dev/null +++ b/sql/oracle/ruoyi-vue-pro.sql @@ -0,0 +1,6231 @@ +/* + Navicat Premium Data Transfer + + Source Server : 127.0.0.1 Oracle + Source Server Type : Oracle + Source Server Version : 110200 + Source Host : 127.0.0.1:1521 + Source Schema : ROOT + + Target Server Type : Oracle + Target Server Version : 110200 + File Encoding : 65001 + + Date: 15/06/2022 08:20:08 +*/ + + +-- ---------------------------- +-- Table structure for BPM_FORM +-- ---------------------------- +DROP TABLE "BPM_FORM"; +CREATE TABLE "BPM_FORM" ( + "ID" NUMBER(20,0) NOT NULL, + "NAME" NVARCHAR2(64), + "STATUS" NUMBER(4,0) NOT NULL, + "CONF" NVARCHAR2(1000), + "FIELDS" NCLOB, + "REMARK" NVARCHAR2(255), + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "TENANT_ID" NUMBER(20,0) NOT NULL, + "DELETED" NUMBER(1,0) DEFAULT 0 NOT NULL +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "BPM_FORM"."ID" IS '编号'; +COMMENT ON COLUMN "BPM_FORM"."NAME" IS '表单名'; +COMMENT ON COLUMN "BPM_FORM"."STATUS" IS '开启状态'; +COMMENT ON COLUMN "BPM_FORM"."CONF" IS '表单的配置'; +COMMENT ON COLUMN "BPM_FORM"."FIELDS" IS '表单项的数组'; +COMMENT ON COLUMN "BPM_FORM"."REMARK" IS '备注'; +COMMENT ON COLUMN "BPM_FORM"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "BPM_FORM"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "BPM_FORM"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "BPM_FORM"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "BPM_FORM"."TENANT_ID" IS '租户编号'; +COMMENT ON COLUMN "BPM_FORM"."DELETED" IS '是否删除'; +COMMENT ON TABLE "BPM_FORM" IS '工作流的表单定义'; + +-- ---------------------------- +-- Records of BPM_FORM +-- ---------------------------- +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for BPM_OA_LEAVE +-- ---------------------------- +DROP TABLE "BPM_OA_LEAVE"; +CREATE TABLE "BPM_OA_LEAVE" ( + "ID" NUMBER(20,0) NOT NULL, + "USER_ID" NUMBER(20,0) NOT NULL, + "TYPE" NUMBER(4,0) NOT NULL, + "REASON" NVARCHAR2(200), + "START_TIME" DATE NOT NULL, + "END_TIME" DATE NOT NULL, + "DAY" NUMBER(4,0) NOT NULL, + "RESULT" NUMBER(4,0) NOT NULL, + "PROCESS_INSTANCE_ID" NVARCHAR2(64), + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "TENANT_ID" NUMBER(20,0) NOT NULL, + "DELETED" NUMBER(1,0) DEFAULT 0 NOT NULL +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "BPM_OA_LEAVE"."ID" IS '请假表单主键'; +COMMENT ON COLUMN "BPM_OA_LEAVE"."USER_ID" IS '申请人的用户编号'; +COMMENT ON COLUMN "BPM_OA_LEAVE"."TYPE" IS '请假类型'; +COMMENT ON COLUMN "BPM_OA_LEAVE"."REASON" IS '请假原因'; +COMMENT ON COLUMN "BPM_OA_LEAVE"."START_TIME" IS '开始时间'; +COMMENT ON COLUMN "BPM_OA_LEAVE"."END_TIME" IS '结束时间'; +COMMENT ON COLUMN "BPM_OA_LEAVE"."DAY" IS '请假天数'; +COMMENT ON COLUMN "BPM_OA_LEAVE"."RESULT" IS '请假结果'; +COMMENT ON COLUMN "BPM_OA_LEAVE"."PROCESS_INSTANCE_ID" IS '流程实例的编号'; +COMMENT ON COLUMN "BPM_OA_LEAVE"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "BPM_OA_LEAVE"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "BPM_OA_LEAVE"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "BPM_OA_LEAVE"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "BPM_OA_LEAVE"."TENANT_ID" IS '租户编号'; +COMMENT ON COLUMN "BPM_OA_LEAVE"."DELETED" IS '是否删除'; +COMMENT ON TABLE "BPM_OA_LEAVE" IS 'OA 请假申请表'; + +-- ---------------------------- +-- Records of BPM_OA_LEAVE +-- ---------------------------- +INSERT INTO "BPM_OA_LEAVE" ("ID", "USER_ID", "TYPE", "REASON", "START_TIME", "END_TIME", "DAY", "RESULT", "PROCESS_INSTANCE_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('0', '1', '2', '123', TO_DATE('2022-05-02 00:00:00', 'SYYYY-MM-DD HH24:MI:SS'), TO_DATE('2022-05-11 00:00:00', 'SYYYY-MM-DD HH24:MI:SS'), '9', '2', '64394b8d-c947-11ec-a43c-3e2374911326', '1', TO_DATE('2022-05-01 20:08:20', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-05-01 20:30:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for BPM_PROCESS_DEFINITION_EXT +-- ---------------------------- +DROP TABLE "BPM_PROCESS_DEFINITION_EXT"; +CREATE TABLE "BPM_PROCESS_DEFINITION_EXT" ( + "ID" NUMBER(20,0) NOT NULL, + "PROCESS_DEFINITION_ID" NVARCHAR2(64), + "MODEL_ID" NVARCHAR2(64), + "DESCRIPTION" NVARCHAR2(255), + "FORM_TYPE" NUMBER(4,0) NOT NULL, + "FORM_ID" NUMBER(20,0), + "FORM_CONF" NVARCHAR2(1000), + "FORM_FIELDS" NCLOB, + "FORM_CUSTOM_CREATE_PATH" NVARCHAR2(255), + "FORM_CUSTOM_VIEW_PATH" NVARCHAR2(255), + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "TENANT_ID" NUMBER(20,0) NOT NULL, + "DELETED" NUMBER(1,0) DEFAULT 0 NOT NULL +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "BPM_PROCESS_DEFINITION_EXT"."ID" IS '编号'; +COMMENT ON COLUMN "BPM_PROCESS_DEFINITION_EXT"."PROCESS_DEFINITION_ID" IS '流程定义的编号'; +COMMENT ON COLUMN "BPM_PROCESS_DEFINITION_EXT"."MODEL_ID" IS '流程模型的编号'; +COMMENT ON COLUMN "BPM_PROCESS_DEFINITION_EXT"."DESCRIPTION" IS '描述'; +COMMENT ON COLUMN "BPM_PROCESS_DEFINITION_EXT"."FORM_TYPE" IS '表单类型'; +COMMENT ON COLUMN "BPM_PROCESS_DEFINITION_EXT"."FORM_ID" IS '表单编号'; +COMMENT ON COLUMN "BPM_PROCESS_DEFINITION_EXT"."FORM_CONF" IS '表单的配置'; +COMMENT ON COLUMN "BPM_PROCESS_DEFINITION_EXT"."FORM_FIELDS" IS '表单项的数组'; +COMMENT ON COLUMN "BPM_PROCESS_DEFINITION_EXT"."FORM_CUSTOM_CREATE_PATH" IS '自定义表单的提交路径'; +COMMENT ON COLUMN "BPM_PROCESS_DEFINITION_EXT"."FORM_CUSTOM_VIEW_PATH" IS '自定义表单的查看路径'; +COMMENT ON COLUMN "BPM_PROCESS_DEFINITION_EXT"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "BPM_PROCESS_DEFINITION_EXT"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "BPM_PROCESS_DEFINITION_EXT"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "BPM_PROCESS_DEFINITION_EXT"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "BPM_PROCESS_DEFINITION_EXT"."TENANT_ID" IS '租户编号'; +COMMENT ON COLUMN "BPM_PROCESS_DEFINITION_EXT"."DELETED" IS '是否删除'; +COMMENT ON TABLE "BPM_PROCESS_DEFINITION_EXT" IS 'Bpm 流程定义的拓展表 +'; + +-- ---------------------------- +-- Records of BPM_PROCESS_DEFINITION_EXT +-- ---------------------------- +INSERT INTO "BPM_PROCESS_DEFINITION_EXT" ("ID", "PROCESS_DEFINITION_ID", "MODEL_ID", "DESCRIPTION", "FORM_TYPE", "FORM_ID", "FORM_CONF", "FORM_FIELDS", "FORM_CUSTOM_CREATE_PATH", "FORM_CUSTOM_VIEW_PATH", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('0', 'oa_leave:1:5b8f470c-c947-11ec-a43c-3e2374911326', 'd0d2e04c-c945-11ec-baf6-3e2374911326', NULL, '20', NULL, NULL, NULL, '/bpm/oa/leave/create', '/bpm/oa/leave/detail', '1', TO_DATE('2022-05-01 20:08:05', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-05-01 20:08:05', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for BPM_PROCESS_INSTANCE_EXT +-- ---------------------------- +DROP TABLE "BPM_PROCESS_INSTANCE_EXT"; +CREATE TABLE "BPM_PROCESS_INSTANCE_EXT" ( + "ID" NUMBER(20,0) NOT NULL, + "START_USER_ID" NUMBER(20,0) NOT NULL, + "NAME" NVARCHAR2(64), + "PROCESS_INSTANCE_ID" NVARCHAR2(64), + "PROCESS_DEFINITION_ID" NVARCHAR2(64), + "CATEGORY" NVARCHAR2(64), + "STATUS" NUMBER(4,0) NOT NULL, + "RESULT" NUMBER(4,0) NOT NULL, + "END_TIME" DATE, + "FORM_VARIABLES" NCLOB, + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "TENANT_ID" NUMBER(20,0) NOT NULL, + "DELETED" NUMBER(1,0) DEFAULT 0 NOT NULL +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "BPM_PROCESS_INSTANCE_EXT"."ID" IS '编号'; +COMMENT ON COLUMN "BPM_PROCESS_INSTANCE_EXT"."START_USER_ID" IS '发起流程的用户编号'; +COMMENT ON COLUMN "BPM_PROCESS_INSTANCE_EXT"."NAME" IS '流程实例的名字'; +COMMENT ON COLUMN "BPM_PROCESS_INSTANCE_EXT"."PROCESS_INSTANCE_ID" IS '流程实例的编号'; +COMMENT ON COLUMN "BPM_PROCESS_INSTANCE_EXT"."PROCESS_DEFINITION_ID" IS '流程定义的编号'; +COMMENT ON COLUMN "BPM_PROCESS_INSTANCE_EXT"."CATEGORY" IS '流程分类'; +COMMENT ON COLUMN "BPM_PROCESS_INSTANCE_EXT"."STATUS" IS '流程实例的状态'; +COMMENT ON COLUMN "BPM_PROCESS_INSTANCE_EXT"."RESULT" IS '流程实例的结果'; +COMMENT ON COLUMN "BPM_PROCESS_INSTANCE_EXT"."END_TIME" IS '结束时间'; +COMMENT ON COLUMN "BPM_PROCESS_INSTANCE_EXT"."FORM_VARIABLES" IS '表单值'; +COMMENT ON COLUMN "BPM_PROCESS_INSTANCE_EXT"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "BPM_PROCESS_INSTANCE_EXT"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "BPM_PROCESS_INSTANCE_EXT"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "BPM_PROCESS_INSTANCE_EXT"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "BPM_PROCESS_INSTANCE_EXT"."TENANT_ID" IS '租户编号'; +COMMENT ON COLUMN "BPM_PROCESS_INSTANCE_EXT"."DELETED" IS '是否删除'; +COMMENT ON TABLE "BPM_PROCESS_INSTANCE_EXT" IS '工作流的流程实例的拓展'; + +-- ---------------------------- +-- Records of BPM_PROCESS_INSTANCE_EXT +-- ---------------------------- +INSERT INTO "BPM_PROCESS_INSTANCE_EXT" ("ID", "START_USER_ID", "NAME", "PROCESS_INSTANCE_ID", "PROCESS_DEFINITION_ID", "CATEGORY", "STATUS", "RESULT", "END_TIME", "FORM_VARIABLES", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('0', '1', 'OA 请假', '64394b8d-c947-11ec-a43c-3e2374911326', 'oa_leave:1:5b8f470c-c947-11ec-a43c-3e2374911326', '2', '2', '2', TO_DATE('2022-05-01 20:30:02', 'SYYYY-MM-DD HH24:MI:SS'), '{"day":9}', '1', TO_DATE('2022-05-01 20:08:20', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-05-01 20:30:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for BPM_TASK_ASSIGN_RULE +-- ---------------------------- +DROP TABLE "BPM_TASK_ASSIGN_RULE"; +CREATE TABLE "BPM_TASK_ASSIGN_RULE" ( + "ID" NUMBER(20,0) NOT NULL, + "MODEL_ID" NVARCHAR2(64), + "PROCESS_DEFINITION_ID" NVARCHAR2(64) DEFAULT '', + "TASK_DEFINITION_KEY" NVARCHAR2(64) DEFAULT '', + "TYPE" NUMBER(4,0) NOT NULL, + "OPTIONS" NCLOB, + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "TENANT_ID" NUMBER(20,0) NOT NULL, + "DELETED" NUMBER DEFAULT 0 NOT NULL +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "BPM_TASK_ASSIGN_RULE"."ID" IS '编号'; +COMMENT ON COLUMN "BPM_TASK_ASSIGN_RULE"."MODEL_ID" IS '流程模型的编号'; +COMMENT ON COLUMN "BPM_TASK_ASSIGN_RULE"."PROCESS_DEFINITION_ID" IS '流程定义的编号'; +COMMENT ON COLUMN "BPM_TASK_ASSIGN_RULE"."TASK_DEFINITION_KEY" IS '流程任务定义的 key'; +COMMENT ON COLUMN "BPM_TASK_ASSIGN_RULE"."TYPE" IS '规则类型'; +COMMENT ON COLUMN "BPM_TASK_ASSIGN_RULE"."OPTIONS" IS '规则值,JSON 数组'; +COMMENT ON COLUMN "BPM_TASK_ASSIGN_RULE"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "BPM_TASK_ASSIGN_RULE"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "BPM_TASK_ASSIGN_RULE"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "BPM_TASK_ASSIGN_RULE"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "BPM_TASK_ASSIGN_RULE"."TENANT_ID" IS '租户编号'; +COMMENT ON COLUMN "BPM_TASK_ASSIGN_RULE"."DELETED" IS '是否删除'; +COMMENT ON TABLE "BPM_TASK_ASSIGN_RULE" IS 'Bpm 任务规则表'; + +-- ---------------------------- +-- Records of BPM_TASK_ASSIGN_RULE +-- ---------------------------- +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for BPM_TASK_EXT +-- ---------------------------- +DROP TABLE "BPM_TASK_EXT"; +CREATE TABLE "BPM_TASK_EXT" ( + "ID" NUMBER(20,0) NOT NULL, + "ASSIGNEE_USER_ID" NUMBER(20,0), + "NAME" NVARCHAR2(64), + "TASK_ID" NVARCHAR2(64), + "RESULT" NUMBER(4,0) NOT NULL, + "REASON" NVARCHAR2(255), + "END_TIME" DATE, + "PROCESS_INSTANCE_ID" NVARCHAR2(64), + "PROCESS_DEFINITION_ID" NVARCHAR2(64), + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "TENANT_ID" NUMBER(20,0) NOT NULL, + "DELETED" NUMBER(1,0) DEFAULT 0 NOT NULL +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "BPM_TASK_EXT"."ID" IS '编号'; +COMMENT ON COLUMN "BPM_TASK_EXT"."ASSIGNEE_USER_ID" IS '任务的审批人'; +COMMENT ON COLUMN "BPM_TASK_EXT"."NAME" IS '任务的名字'; +COMMENT ON COLUMN "BPM_TASK_EXT"."TASK_ID" IS '任务的编号'; +COMMENT ON COLUMN "BPM_TASK_EXT"."RESULT" IS '任务的结果'; +COMMENT ON COLUMN "BPM_TASK_EXT"."REASON" IS '审批建议'; +COMMENT ON COLUMN "BPM_TASK_EXT"."END_TIME" IS '任务的结束时间'; +COMMENT ON COLUMN "BPM_TASK_EXT"."PROCESS_INSTANCE_ID" IS '流程实例的编号'; +COMMENT ON COLUMN "BPM_TASK_EXT"."PROCESS_DEFINITION_ID" IS '流程定义的编号'; +COMMENT ON COLUMN "BPM_TASK_EXT"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "BPM_TASK_EXT"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "BPM_TASK_EXT"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "BPM_TASK_EXT"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "BPM_TASK_EXT"."TENANT_ID" IS '租户编号'; +COMMENT ON COLUMN "BPM_TASK_EXT"."DELETED" IS '是否删除'; +COMMENT ON TABLE "BPM_TASK_EXT" IS '工作流的流程任务的拓展表'; + +-- ---------------------------- +-- Records of BPM_TASK_EXT +-- ---------------------------- +INSERT INTO "BPM_TASK_EXT" ("ID", "ASSIGNEE_USER_ID", "NAME", "TASK_ID", "RESULT", "REASON", "END_TIME", "PROCESS_INSTANCE_ID", "PROCESS_DEFINITION_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('0', '1', 'task01', '6445a7a5-c947-11ec-a43c-3e2374911326', '2', '123', TO_DATE('2022-05-01 20:30:02', 'SYYYY-MM-DD HH24:MI:SS'), '64394b8d-c947-11ec-a43c-3e2374911326', 'oa_leave:1:5b8f470c-c947-11ec-a43c-3e2374911326', '1', TO_DATE('2022-05-01 20:08:20', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-05-01 20:30:03', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for BPM_USER_GROUP +-- ---------------------------- +DROP TABLE "BPM_USER_GROUP"; +CREATE TABLE "BPM_USER_GROUP" ( + "ID" NUMBER(20,0) NOT NULL, + "NAME" NVARCHAR2(30), + "DESCRIPTION" NVARCHAR2(255), + "MEMBER_USER_IDS" NCLOB NOT NULL, + "STATUS" NUMBER(4,0) NOT NULL, + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "TENANT_ID" NUMBER(20,0) NOT NULL, + "DELETED" NUMBER(1,0) DEFAULT 0 NOT NULL +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "BPM_USER_GROUP"."ID" IS '编号'; +COMMENT ON COLUMN "BPM_USER_GROUP"."NAME" IS '组名'; +COMMENT ON COLUMN "BPM_USER_GROUP"."DESCRIPTION" IS '描述'; +COMMENT ON COLUMN "BPM_USER_GROUP"."MEMBER_USER_IDS" IS '成员编号数组'; +COMMENT ON COLUMN "BPM_USER_GROUP"."STATUS" IS '状态(0正常 1停用)'; +COMMENT ON COLUMN "BPM_USER_GROUP"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "BPM_USER_GROUP"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "BPM_USER_GROUP"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "BPM_USER_GROUP"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "BPM_USER_GROUP"."TENANT_ID" IS '租户编号'; +COMMENT ON COLUMN "BPM_USER_GROUP"."DELETED" IS '是否删除'; +COMMENT ON TABLE "BPM_USER_GROUP" IS '用户组'; + +-- ---------------------------- +-- Records of BPM_USER_GROUP +-- ---------------------------- +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for INFRA_API_ACCESS_LOG +-- ---------------------------- +DROP TABLE "INFRA_API_ACCESS_LOG"; +CREATE TABLE "INFRA_API_ACCESS_LOG" ( + "ID" NUMBER(20,0) NOT NULL, + "TRACE_ID" NVARCHAR2(64), + "USER_ID" NUMBER(20,0) DEFAULT 0 NOT NULL, + "USER_TYPE" NUMBER(4,0) DEFAULT 0 NOT NULL, + "APPLICATION_NAME" NVARCHAR2(50), + "REQUEST_METHOD" NVARCHAR2(16), + "REQUEST_URL" NVARCHAR2(255), + "REQUEST_PARAMS" NCLOB, + "USER_IP" NVARCHAR2(50), + "USER_AGENT" NVARCHAR2(512), + "BEGIN_TIME" DATE NOT NULL, + "END_TIME" DATE NOT NULL, + "DURATION" NUMBER(11,0) NOT NULL, + "RESULT_CODE" NUMBER(11,0) NOT NULL, + "RESULT_MSG" NVARCHAR2(512), + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "TENANT_ID" NUMBER(20,0) NOT NULL, + "DELETED" NUMBER(1,0) DEFAULT 0 +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "INFRA_API_ACCESS_LOG"."ID" IS '日志主键'; +COMMENT ON COLUMN "INFRA_API_ACCESS_LOG"."TRACE_ID" IS '链路追踪编号'; +COMMENT ON COLUMN "INFRA_API_ACCESS_LOG"."USER_ID" IS '用户编号'; +COMMENT ON COLUMN "INFRA_API_ACCESS_LOG"."USER_TYPE" IS '用户类型'; +COMMENT ON COLUMN "INFRA_API_ACCESS_LOG"."APPLICATION_NAME" IS '应用名'; +COMMENT ON COLUMN "INFRA_API_ACCESS_LOG"."REQUEST_METHOD" IS '请求方法名'; +COMMENT ON COLUMN "INFRA_API_ACCESS_LOG"."REQUEST_URL" IS '请求地址'; +COMMENT ON COLUMN "INFRA_API_ACCESS_LOG"."REQUEST_PARAMS" IS '请求参数'; +COMMENT ON COLUMN "INFRA_API_ACCESS_LOG"."USER_IP" IS '用户 IP'; +COMMENT ON COLUMN "INFRA_API_ACCESS_LOG"."USER_AGENT" IS '浏览器 UA'; +COMMENT ON COLUMN "INFRA_API_ACCESS_LOG"."BEGIN_TIME" IS '开始请求时间'; +COMMENT ON COLUMN "INFRA_API_ACCESS_LOG"."END_TIME" IS '结束请求时间'; +COMMENT ON COLUMN "INFRA_API_ACCESS_LOG"."DURATION" IS '执行时长'; +COMMENT ON COLUMN "INFRA_API_ACCESS_LOG"."RESULT_CODE" IS '结果码'; +COMMENT ON COLUMN "INFRA_API_ACCESS_LOG"."RESULT_MSG" IS '结果提示'; +COMMENT ON COLUMN "INFRA_API_ACCESS_LOG"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "INFRA_API_ACCESS_LOG"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "INFRA_API_ACCESS_LOG"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "INFRA_API_ACCESS_LOG"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "INFRA_API_ACCESS_LOG"."TENANT_ID" IS '租户编号'; +COMMENT ON TABLE "INFRA_API_ACCESS_LOG" IS 'API 访问日志表'; + +-- ---------------------------- +-- Records of INFRA_API_ACCESS_LOG +-- ---------------------------- +INSERT INTO "INFRA_API_ACCESS_LOG" ("ID", "TRACE_ID", "USER_ID", "USER_TYPE", "APPLICATION_NAME", "REQUEST_METHOD", "REQUEST_URL", "REQUEST_PARAMS", "USER_IP", "USER_AGENT", "BEGIN_TIME", "END_TIME", "DURATION", "RESULT_CODE", "RESULT_MSG", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('0', NULL, '0', '2', 'win-server', 'GET', '/admin-api/system/dict-data/list-all-simple', '{"query":{},"body":null}', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36', TO_DATE('2022-05-13 01:26:54', 'SYYYY-MM-DD HH24:MI:SS'), TO_DATE('2022-05-13 01:26:54', 'SYYYY-MM-DD HH24:MI:SS'), '94', '0', NULL, NULL, TO_DATE('2022-05-13 01:26:54', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-05-13 01:26:54', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for INFRA_API_ERROR_LOG +-- ---------------------------- +DROP TABLE "INFRA_API_ERROR_LOG"; +CREATE TABLE "INFRA_API_ERROR_LOG" ( + "ID" NUMBER(11,0) NOT NULL, + "TRACE_ID" NVARCHAR2(64), + "USER_ID" NUMBER(11,0) NOT NULL, + "USER_TYPE" NUMBER(4,0) NOT NULL, + "APPLICATION_NAME" NVARCHAR2(50), + "REQUEST_METHOD" NVARCHAR2(16), + "REQUEST_URL" NVARCHAR2(255), + "REQUEST_PARAMS" NCLOB, + "USER_IP" NVARCHAR2(50), + "USER_AGENT" NVARCHAR2(512), + "EXCEPTION_TIME" DATE NOT NULL, + "EXCEPTION_NAME" NVARCHAR2(128), + "EXCEPTION_MESSAGE" NCLOB NOT NULL, + "EXCEPTION_ROOT_CAUSE_MESSAGE" NCLOB NOT NULL, + "EXCEPTION_STACK_TRACE" NCLOB NOT NULL, + "EXCEPTION_CLASS_NAME" NVARCHAR2(512), + "EXCEPTION_FILE_NAME" NVARCHAR2(512), + "EXCEPTION_METHOD_NAME" NVARCHAR2(512), + "EXCEPTION_LINE_NUMBER" NUMBER(11,0) NOT NULL, + "PROCESS_STATUS" NUMBER(4,0) NOT NULL, + "PROCESS_TIME" DATE, + "PROCESS_USER_ID" NUMBER(11,0), + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "TENANT_ID" NUMBER(20,0) NOT NULL, + "DELETED" NUMBER(1,0) DEFAULT 0 +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "INFRA_API_ERROR_LOG"."ID" IS '编号'; +COMMENT ON COLUMN "INFRA_API_ERROR_LOG"."TRACE_ID" IS '链路追踪编号 + * + * 一般来说,通过链路追踪编号,可以将访问日志,错误日志,链路追踪日志,logger 打印日志等,结合在一起,从而进行排错。'; +COMMENT ON COLUMN "INFRA_API_ERROR_LOG"."USER_ID" IS '用户编号'; +COMMENT ON COLUMN "INFRA_API_ERROR_LOG"."USER_TYPE" IS '用户类型'; +COMMENT ON COLUMN "INFRA_API_ERROR_LOG"."APPLICATION_NAME" IS '应用名 + * + * 目前读取 spring.application.name'; +COMMENT ON COLUMN "INFRA_API_ERROR_LOG"."REQUEST_METHOD" IS '请求方法名'; +COMMENT ON COLUMN "INFRA_API_ERROR_LOG"."REQUEST_URL" IS '请求地址'; +COMMENT ON COLUMN "INFRA_API_ERROR_LOG"."REQUEST_PARAMS" IS '请求参数'; +COMMENT ON COLUMN "INFRA_API_ERROR_LOG"."USER_IP" IS '用户 IP'; +COMMENT ON COLUMN "INFRA_API_ERROR_LOG"."USER_AGENT" IS '浏览器 UA'; +COMMENT ON COLUMN "INFRA_API_ERROR_LOG"."EXCEPTION_TIME" IS '异常发生时间'; +COMMENT ON COLUMN "INFRA_API_ERROR_LOG"."EXCEPTION_NAME" IS '异常名 + * + * {@link Throwable#getClass()} 的类全名'; +COMMENT ON COLUMN "INFRA_API_ERROR_LOG"."EXCEPTION_MESSAGE" IS '异常导致的消息 + * + * {@link cn.iocoder.common.framework.util.ExceptionUtil#getMessage(Throwable)}'; +COMMENT ON COLUMN "INFRA_API_ERROR_LOG"."EXCEPTION_ROOT_CAUSE_MESSAGE" IS '异常导致的根消息 + * + * {@link cn.iocoder.common.framework.util.ExceptionUtil#getRootCauseMessage(Throwable)}'; +COMMENT ON COLUMN "INFRA_API_ERROR_LOG"."EXCEPTION_STACK_TRACE" IS '异常的栈轨迹 + * + * {@link cn.iocoder.common.framework.util.ExceptionUtil#getServiceException(Exception)}'; +COMMENT ON COLUMN "INFRA_API_ERROR_LOG"."EXCEPTION_CLASS_NAME" IS '异常发生的类全名 + * + * {@link StackTraceElement#getClassName()}'; +COMMENT ON COLUMN "INFRA_API_ERROR_LOG"."EXCEPTION_FILE_NAME" IS '异常发生的类文件 + * + * {@link StackTraceElement#getFileName()}'; +COMMENT ON COLUMN "INFRA_API_ERROR_LOG"."EXCEPTION_METHOD_NAME" IS '异常发生的方法名 + * + * {@link StackTraceElement#getMethodName()}'; +COMMENT ON COLUMN "INFRA_API_ERROR_LOG"."EXCEPTION_LINE_NUMBER" IS '异常发生的方法所在行 + * + * {@link StackTraceElement#getLineNumber()}'; +COMMENT ON COLUMN "INFRA_API_ERROR_LOG"."PROCESS_STATUS" IS '处理状态'; +COMMENT ON COLUMN "INFRA_API_ERROR_LOG"."PROCESS_TIME" IS '处理时间'; +COMMENT ON COLUMN "INFRA_API_ERROR_LOG"."PROCESS_USER_ID" IS '处理用户编号'; +COMMENT ON COLUMN "INFRA_API_ERROR_LOG"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "INFRA_API_ERROR_LOG"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "INFRA_API_ERROR_LOG"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "INFRA_API_ERROR_LOG"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "INFRA_API_ERROR_LOG"."TENANT_ID" IS '租户编号'; +COMMENT ON TABLE "INFRA_API_ERROR_LOG" IS '系统异常日志'; + +-- ---------------------------- +-- Records of INFRA_API_ERROR_LOG +-- ---------------------------- +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for INFRA_CODEGEN_COLUMN +-- ---------------------------- +DROP TABLE "INFRA_CODEGEN_COLUMN"; +CREATE TABLE "INFRA_CODEGEN_COLUMN" ( + "ID" NUMBER(20,0) NOT NULL, + "TABLE_ID" NUMBER(20,0) NOT NULL, + "COLUMN_NAME" NVARCHAR2(200), + "DATA_TYPE" NVARCHAR2(100), + "COLUMN_COMMENT" NVARCHAR2(500), + "NULLABLE" NUMBER(4,0), + "PRIMARY_KEY" NUMBER(4,0), + "AUTO_INCREMENT" NUMBER(4,0), + "ORDINAL_POSITION" NUMBER(11,0) NOT NULL, + "JAVA_TYPE" NVARCHAR2(32), + "JAVA_FIELD" NVARCHAR2(64), + "DICT_TYPE" NVARCHAR2(200), + "EXAMPLE" NVARCHAR2(64), + "CREATE_OPERATION" NUMBER(4,0), + "UPDATE_OPERATION" NUMBER(4,0), + "LIST_OPERATION" NUMBER(4,0), + "LIST_OPERATION_CONDITION" NVARCHAR2(32) NOT NULL, + "LIST_OPERATION_RESULT" NUMBER(4,0), + "HTML_TYPE" NVARCHAR2(32), + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "DELETED" NUMBER(4,0) DEFAULT 0 +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "INFRA_CODEGEN_COLUMN"."ID" IS '编号'; +COMMENT ON COLUMN "INFRA_CODEGEN_COLUMN"."TABLE_ID" IS '表编号'; +COMMENT ON COLUMN "INFRA_CODEGEN_COLUMN"."COLUMN_NAME" IS '字段名'; +COMMENT ON COLUMN "INFRA_CODEGEN_COLUMN"."DATA_TYPE" IS '字段类型'; +COMMENT ON COLUMN "INFRA_CODEGEN_COLUMN"."COLUMN_COMMENT" IS '字段描述'; +COMMENT ON COLUMN "INFRA_CODEGEN_COLUMN"."NULLABLE" IS '是否允许为空'; +COMMENT ON COLUMN "INFRA_CODEGEN_COLUMN"."PRIMARY_KEY" IS '是否主键'; +COMMENT ON COLUMN "INFRA_CODEGEN_COLUMN"."AUTO_INCREMENT" IS '是否自增'; +COMMENT ON COLUMN "INFRA_CODEGEN_COLUMN"."ORDINAL_POSITION" IS '排序'; +COMMENT ON COLUMN "INFRA_CODEGEN_COLUMN"."JAVA_TYPE" IS 'Java 属性类型'; +COMMENT ON COLUMN "INFRA_CODEGEN_COLUMN"."JAVA_FIELD" IS 'Java 属性名'; +COMMENT ON COLUMN "INFRA_CODEGEN_COLUMN"."DICT_TYPE" IS '字典类型'; +COMMENT ON COLUMN "INFRA_CODEGEN_COLUMN"."EXAMPLE" IS '数据示例'; +COMMENT ON COLUMN "INFRA_CODEGEN_COLUMN"."CREATE_OPERATION" IS '是否为 Create 创建操作的字段'; +COMMENT ON COLUMN "INFRA_CODEGEN_COLUMN"."UPDATE_OPERATION" IS '是否为 Update 更新操作的字段'; +COMMENT ON COLUMN "INFRA_CODEGEN_COLUMN"."LIST_OPERATION" IS '是否为 List 查询操作的字段'; +COMMENT ON COLUMN "INFRA_CODEGEN_COLUMN"."LIST_OPERATION_CONDITION" IS 'List 查询操作的条件类型'; +COMMENT ON COLUMN "INFRA_CODEGEN_COLUMN"."LIST_OPERATION_RESULT" IS '是否为 List 查询操作的返回字段'; +COMMENT ON COLUMN "INFRA_CODEGEN_COLUMN"."HTML_TYPE" IS '显示类型'; +COMMENT ON COLUMN "INFRA_CODEGEN_COLUMN"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "INFRA_CODEGEN_COLUMN"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "INFRA_CODEGEN_COLUMN"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "INFRA_CODEGEN_COLUMN"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "INFRA_CODEGEN_COLUMN"."DELETED" IS '是否删除'; +COMMENT ON TABLE "INFRA_CODEGEN_COLUMN" IS '代码生成表字段定义'; + +-- ---------------------------- +-- Records of INFRA_CODEGEN_COLUMN +-- ---------------------------- +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for INFRA_CODEGEN_TABLE +-- ---------------------------- +DROP TABLE "INFRA_CODEGEN_TABLE"; +CREATE TABLE "INFRA_CODEGEN_TABLE" ( + "ID" NUMBER(20,0) NOT NULL, + "DATA_SOURCE_CONFIG_ID" NUMBER NOT NULL, + "SCENE" NUMBER(4,0) NOT NULL, + "TABLE_NAME" NVARCHAR2(200), + "TABLE_COMMENT" NVARCHAR2(500), + "REMARK" NVARCHAR2(500), + "MODULE_NAME" NVARCHAR2(30), + "BUSINESS_NAME" NVARCHAR2(30), + "CLASS_NAME" NVARCHAR2(100), + "CLASS_COMMENT" NVARCHAR2(50), + "AUTHOR" NVARCHAR2(50), + "TEMPLATE_TYPE" NUMBER(4,0) NOT NULL, + "PARENT_MENU_ID" NUMBER(20,0), + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "DELETED" NUMBER(4,0) DEFAULT 0 +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "INFRA_CODEGEN_TABLE"."ID" IS '编号'; +COMMENT ON COLUMN "INFRA_CODEGEN_TABLE"."DATA_SOURCE_CONFIG_ID" IS '数据源配置的编号'; +COMMENT ON COLUMN "INFRA_CODEGEN_TABLE"."SCENE" IS '生成场景'; +COMMENT ON COLUMN "INFRA_CODEGEN_TABLE"."TABLE_NAME" IS '表名称'; +COMMENT ON COLUMN "INFRA_CODEGEN_TABLE"."TABLE_COMMENT" IS '表描述'; +COMMENT ON COLUMN "INFRA_CODEGEN_TABLE"."REMARK" IS '备注'; +COMMENT ON COLUMN "INFRA_CODEGEN_TABLE"."MODULE_NAME" IS '模块名'; +COMMENT ON COLUMN "INFRA_CODEGEN_TABLE"."BUSINESS_NAME" IS '业务名'; +COMMENT ON COLUMN "INFRA_CODEGEN_TABLE"."CLASS_NAME" IS '类名称'; +COMMENT ON COLUMN "INFRA_CODEGEN_TABLE"."CLASS_COMMENT" IS '类描述'; +COMMENT ON COLUMN "INFRA_CODEGEN_TABLE"."AUTHOR" IS '作者'; +COMMENT ON COLUMN "INFRA_CODEGEN_TABLE"."TEMPLATE_TYPE" IS '模板类型'; +COMMENT ON COLUMN "INFRA_CODEGEN_TABLE"."PARENT_MENU_ID" IS '父菜单编号'; +COMMENT ON COLUMN "INFRA_CODEGEN_TABLE"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "INFRA_CODEGEN_TABLE"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "INFRA_CODEGEN_TABLE"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "INFRA_CODEGEN_TABLE"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "INFRA_CODEGEN_TABLE"."DELETED" IS '是否删除'; +COMMENT ON TABLE "INFRA_CODEGEN_TABLE" IS '代码生成表定义'; + +-- ---------------------------- +-- Records of INFRA_CODEGEN_TABLE +-- ---------------------------- +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for INFRA_CONFIG +-- ---------------------------- +DROP TABLE "INFRA_CONFIG"; +CREATE TABLE "INFRA_CONFIG" ( + "ID" NUMBER(11,0) NOT NULL, + "CATEGORY" NVARCHAR2(50), + "TYPE" NUMBER(4,0) NOT NULL, + "NAME" NVARCHAR2(100), + "CONFIG_KEY" NVARCHAR2(100), + "VALUE" NVARCHAR2(500), + "VISIBLE" NUMBER(4,0) NOT NULL, + "REMARK" NVARCHAR2(500), + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "DELETED" NUMBER(1,0) DEFAULT 0 +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "INFRA_CONFIG"."ID" IS '参数主键'; +COMMENT ON COLUMN "INFRA_CONFIG"."CATEGORY" IS '参数分组'; +COMMENT ON COLUMN "INFRA_CONFIG"."TYPE" IS '参数类型'; +COMMENT ON COLUMN "INFRA_CONFIG"."NAME" IS '参数名称'; +COMMENT ON COLUMN "INFRA_CONFIG"."CONFIG_KEY" IS '参数键名'; +COMMENT ON COLUMN "INFRA_CONFIG"."VALUE" IS '参数键值'; +COMMENT ON COLUMN "INFRA_CONFIG"."VISIBLE" IS '是否可见'; +COMMENT ON COLUMN "INFRA_CONFIG"."REMARK" IS '备注'; +COMMENT ON COLUMN "INFRA_CONFIG"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "INFRA_CONFIG"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "INFRA_CONFIG"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "INFRA_CONFIG"."UPDATE_TIME" IS '更新时间'; +COMMENT ON TABLE "INFRA_CONFIG" IS '参数配置表'; + +-- ---------------------------- +-- Records of INFRA_CONFIG +-- ---------------------------- +INSERT INTO "INFRA_CONFIG" ("ID", "CATEGORY", "TYPE", "NAME", "CONFIG_KEY", "VALUE", "VISIBLE", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1', 'ui', '1', '主框架页-默认皮肤样式名称', 'sys.index.skinName', 'skin-blue', '0', '蓝色 skin-blue、绿色 skin-green、紫色 skin-purple、红色 skin-red、黄色 skin-yellow', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-05-01 12:21:26', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "INFRA_CONFIG" ("ID", "CATEGORY", "TYPE", "NAME", "CONFIG_KEY", "VALUE", "VISIBLE", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('2', 'biz', '1', '用户管理-账号初始密码', 'sys.user.init-password', '123456', '0', '初始化密码 123456', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-20 02:25:51', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "INFRA_CONFIG" ("ID", "CATEGORY", "TYPE", "NAME", "CONFIG_KEY", "VALUE", "VISIBLE", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('3', 'ui', '1', '主框架页-侧边栏主题', 'sys.index.sideTheme', 'theme-dark', '0', '深色主题theme-dark,浅色主题theme-light', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2021-01-19 03:05:21', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "INFRA_CONFIG" ("ID", "CATEGORY", "TYPE", "NAME", "CONFIG_KEY", "VALUE", "VISIBLE", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('4', '1', '2', 'xxx', 'demo.test', '10', '0', '5', NULL, TO_DATE('2021-01-19 03:10:26', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2021-01-20 09:25:55', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "INFRA_CONFIG" ("ID", "CATEGORY", "TYPE", "NAME", "CONFIG_KEY", "VALUE", "VISIBLE", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('5', 'xxx', '2', 'xxx', 'xxx', 'xxx', '1', 'xxx', NULL, TO_DATE('2021-02-09 20:06:47', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2021-02-09 20:06:47', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "INFRA_CONFIG" ("ID", "CATEGORY", "TYPE", "NAME", "CONFIG_KEY", "VALUE", "VISIBLE", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('6', 'biz', '2', '登陆验证码的开关', 'win.captcha.enable', 'true', '1', NULL, '1', TO_DATE('2022-02-17 00:03:11', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-17 00:15:33', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for INFRA_DATA_SOURCE_CONFIG +-- ---------------------------- +DROP TABLE "INFRA_DATA_SOURCE_CONFIG"; +CREATE TABLE "INFRA_DATA_SOURCE_CONFIG" ( + "ID" NUMBER NOT NULL, + "NAME" NVARCHAR2(100) NOT NULL, + "URL" NCLOB NOT NULL, + "USERNAME" NVARCHAR2(255) NOT NULL, + "PASSWORD" NVARCHAR2(255) NOT NULL, + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "DELETED" NUMBER DEFAULT 0 NOT NULL +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "INFRA_DATA_SOURCE_CONFIG"."ID" IS '主键编号'; +COMMENT ON COLUMN "INFRA_DATA_SOURCE_CONFIG"."NAME" IS '参数名称'; +COMMENT ON COLUMN "INFRA_DATA_SOURCE_CONFIG"."URL" IS '数据源连接'; +COMMENT ON COLUMN "INFRA_DATA_SOURCE_CONFIG"."USERNAME" IS '用户名'; +COMMENT ON COLUMN "INFRA_DATA_SOURCE_CONFIG"."PASSWORD" IS '密码'; +COMMENT ON COLUMN "INFRA_DATA_SOURCE_CONFIG"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "INFRA_DATA_SOURCE_CONFIG"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "INFRA_DATA_SOURCE_CONFIG"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "INFRA_DATA_SOURCE_CONFIG"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "INFRA_DATA_SOURCE_CONFIG"."DELETED" IS '是否删除'; +COMMENT ON TABLE "INFRA_DATA_SOURCE_CONFIG" IS '数据源配置表'; + +-- ---------------------------- +-- Records of INFRA_DATA_SOURCE_CONFIG +-- ---------------------------- +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for INFRA_FILE +-- ---------------------------- +DROP TABLE "INFRA_FILE"; +CREATE TABLE "INFRA_FILE" ( + "ID" NUMBER(20,0) NOT NULL, + "CONFIG_ID" NUMBER(20,0), + "PATH" NVARCHAR2(512), + "URL" NCLOB, + "TYPE" NVARCHAR2(64), + "SIZE" NUMBER(11,0) NOT NULL, + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "DELETED" NUMBER(1,0) DEFAULT 0, + "NAME" NVARCHAR2(512) +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "INFRA_FILE"."ID" IS '文件编号'; +COMMENT ON COLUMN "INFRA_FILE"."CONFIG_ID" IS '配置编号'; +COMMENT ON COLUMN "INFRA_FILE"."PATH" IS '文件路径'; +COMMENT ON COLUMN "INFRA_FILE"."URL" IS '文件 URL'; +COMMENT ON COLUMN "INFRA_FILE"."TYPE" IS '文件MIME类型'; +COMMENT ON COLUMN "INFRA_FILE"."SIZE" IS '文件大小'; +COMMENT ON COLUMN "INFRA_FILE"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "INFRA_FILE"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "INFRA_FILE"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "INFRA_FILE"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "INFRA_FILE"."NAME" IS '文件名'; +COMMENT ON TABLE "INFRA_FILE" IS '文件表'; + +-- ---------------------------- +-- Records of INFRA_FILE +-- ---------------------------- +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for INFRA_FILE_CONFIG +-- ---------------------------- +DROP TABLE "INFRA_FILE_CONFIG"; +CREATE TABLE "INFRA_FILE_CONFIG" ( + "ID" NUMBER(20,0) NOT NULL, + "NAME" NVARCHAR2(63), + "STORAGE" NUMBER(4,0) NOT NULL, + "REMARK" NVARCHAR2(255), + "MASTER" NUMBER(4,0), + "CONFIG" NCLOB, + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "DELETED" NUMBER(4,0) DEFAULT 0 +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "INFRA_FILE_CONFIG"."ID" IS '编号'; +COMMENT ON COLUMN "INFRA_FILE_CONFIG"."NAME" IS '配置名'; +COMMENT ON COLUMN "INFRA_FILE_CONFIG"."STORAGE" IS '存储器'; +COMMENT ON COLUMN "INFRA_FILE_CONFIG"."REMARK" IS '备注'; +COMMENT ON COLUMN "INFRA_FILE_CONFIG"."MASTER" IS '是否为主配置'; +COMMENT ON COLUMN "INFRA_FILE_CONFIG"."CONFIG" IS '存储配置'; +COMMENT ON COLUMN "INFRA_FILE_CONFIG"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "INFRA_FILE_CONFIG"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "INFRA_FILE_CONFIG"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "INFRA_FILE_CONFIG"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "INFRA_FILE_CONFIG"."DELETED" IS '是否删除'; +COMMENT ON TABLE "INFRA_FILE_CONFIG" IS '文件配置表'; + +-- ---------------------------- +-- Records of INFRA_FILE_CONFIG +-- ---------------------------- +INSERT INTO "INFRA_FILE_CONFIG" ("ID", "NAME", "STORAGE", "REMARK", "MASTER", "CONFIG", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('4', '数据库', '1', '我是数据库', '0', '{"@class":"com.win.framework.file.core.client.db.DBFileClientConfig","domain":"http://127.0.0.1:48080"}', '1', TO_DATE('2022-03-15 23:56:24', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 19:10:11', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "INFRA_FILE_CONFIG" ("ID", "NAME", "STORAGE", "REMARK", "MASTER", "CONFIG", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('5', '本地磁盘', '10', '测试下本地存储', '0', '{"@class":"com.win.framework.file.core.client.local.LocalFileClientConfig","basePath":"/Users/yunai/file_test","domain":"http://127.0.0.1:48080"}', '1', TO_DATE('2022-03-15 23:57:00', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 19:10:11', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "INFRA_FILE_CONFIG" ("ID", "NAME", "STORAGE", "REMARK", "MASTER", "CONFIG", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('11', 'S3 - 七牛云', '20', NULL, '1', '{"@class":"com.win.framework.file.core.client.s3.S3FileClientConfig","endpoint":"s3-cn-south-1.qiniucs.com","domain":"http://test.win.iocoder.cn","bucket":"ruoyi-vue-pro","accessKey":"b7yvuhBSAGjmtPhMFcn9iMOxUOY_I06cA_p0ZUx8","accessSecret":"kXM1l5ia1RvSX3QaOEcwI3RLz3Y2rmNszWonKZtP"}', '1', TO_DATE('2022-03-19 18:00:03', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 19:10:11', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for INFRA_FILE_CONTENT +-- ---------------------------- +DROP TABLE "INFRA_FILE_CONTENT"; +CREATE TABLE "INFRA_FILE_CONTENT" ( + "ID" NUMBER(20,0) NOT NULL, + "CONFIG_ID" NUMBER(20,0) NOT NULL, + "PATH" NVARCHAR2(512), + "CONTENT" BLOB NOT NULL, + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "DELETED" NUMBER(4,0) DEFAULT 0 +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "INFRA_FILE_CONTENT"."ID" IS '编号'; +COMMENT ON COLUMN "INFRA_FILE_CONTENT"."CONFIG_ID" IS '配置编号'; +COMMENT ON COLUMN "INFRA_FILE_CONTENT"."PATH" IS '文件路径'; +COMMENT ON COLUMN "INFRA_FILE_CONTENT"."CONTENT" IS '文件内容'; +COMMENT ON COLUMN "INFRA_FILE_CONTENT"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "INFRA_FILE_CONTENT"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "INFRA_FILE_CONTENT"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "INFRA_FILE_CONTENT"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "INFRA_FILE_CONTENT"."DELETED" IS '是否删除'; +COMMENT ON TABLE "INFRA_FILE_CONTENT" IS '文件表'; + +-- ---------------------------- +-- Records of INFRA_FILE_CONTENT +-- ---------------------------- +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for INFRA_JOB +-- ---------------------------- +DROP TABLE "INFRA_JOB"; +CREATE TABLE "INFRA_JOB" ( + "ID" NUMBER(20,0) NOT NULL, + "NAME" NVARCHAR2(32), + "STATUS" NUMBER(4,0) NOT NULL, + "HANDLER_NAME" NVARCHAR2(64), + "HANDLER_PARAM" NVARCHAR2(255), + "CRON_EXPRESSION" NVARCHAR2(32), + "RETRY_COUNT" NUMBER(11,0) NOT NULL, + "RETRY_INTERVAL" NUMBER(11,0) NOT NULL, + "MONITOR_TIMEOUT" NUMBER(11,0) NOT NULL, + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "DELETED" NUMBER(1,0) DEFAULT 0 +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "INFRA_JOB"."ID" IS '任务编号'; +COMMENT ON COLUMN "INFRA_JOB"."NAME" IS '任务名称'; +COMMENT ON COLUMN "INFRA_JOB"."STATUS" IS '任务状态'; +COMMENT ON COLUMN "INFRA_JOB"."HANDLER_NAME" IS '处理器的名字'; +COMMENT ON COLUMN "INFRA_JOB"."HANDLER_PARAM" IS '处理器的参数'; +COMMENT ON COLUMN "INFRA_JOB"."CRON_EXPRESSION" IS 'CRON 表达式'; +COMMENT ON COLUMN "INFRA_JOB"."RETRY_COUNT" IS '重试次数'; +COMMENT ON COLUMN "INFRA_JOB"."RETRY_INTERVAL" IS '重试间隔'; +COMMENT ON COLUMN "INFRA_JOB"."MONITOR_TIMEOUT" IS '监控超时时间'; +COMMENT ON COLUMN "INFRA_JOB"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "INFRA_JOB"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "INFRA_JOB"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "INFRA_JOB"."UPDATE_TIME" IS '更新时间'; +COMMENT ON TABLE "INFRA_JOB" IS '定时任务表'; + +-- ---------------------------- +-- Records of INFRA_JOB +-- ---------------------------- +INSERT INTO "INFRA_JOB" ("ID", "NAME", "STATUS", "HANDLER_NAME", "HANDLER_PARAM", "CRON_EXPRESSION", "RETRY_COUNT", "RETRY_INTERVAL", "MONITOR_TIMEOUT", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('0', '用户 Session 超时 Job', '1', 'userSessionTimeoutJob', NULL, '0 * * * * ? *', '3', '2000', '0', '1', TO_DATE('2022-05-01 20:44:03', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-05-01 20:44:03', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for INFRA_JOB_LOG +-- ---------------------------- +DROP TABLE "INFRA_JOB_LOG"; +CREATE TABLE "INFRA_JOB_LOG" ( + "ID" NUMBER(20,0) NOT NULL, + "JOB_ID" NUMBER(20,0) NOT NULL, + "HANDLER_NAME" NVARCHAR2(64), + "HANDLER_PARAM" NVARCHAR2(255), + "EXECUTE_INDEX" NUMBER(4,0) NOT NULL, + "BEGIN_TIME" DATE NOT NULL, + "END_TIME" DATE, + "DURATION" NUMBER(11,0), + "STATUS" NUMBER(4,0) NOT NULL, + "RESULT" NCLOB, + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "DELETED" NUMBER(1,0) DEFAULT 0 +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "INFRA_JOB_LOG"."ID" IS '日志编号'; +COMMENT ON COLUMN "INFRA_JOB_LOG"."JOB_ID" IS '任务编号'; +COMMENT ON COLUMN "INFRA_JOB_LOG"."HANDLER_NAME" IS '处理器的名字'; +COMMENT ON COLUMN "INFRA_JOB_LOG"."HANDLER_PARAM" IS '处理器的参数'; +COMMENT ON COLUMN "INFRA_JOB_LOG"."EXECUTE_INDEX" IS '第几次执行'; +COMMENT ON COLUMN "INFRA_JOB_LOG"."BEGIN_TIME" IS '开始执行时间'; +COMMENT ON COLUMN "INFRA_JOB_LOG"."END_TIME" IS '结束执行时间'; +COMMENT ON COLUMN "INFRA_JOB_LOG"."DURATION" IS '执行时长'; +COMMENT ON COLUMN "INFRA_JOB_LOG"."STATUS" IS '任务状态'; +COMMENT ON COLUMN "INFRA_JOB_LOG"."RESULT" IS '结果数据'; +COMMENT ON COLUMN "INFRA_JOB_LOG"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "INFRA_JOB_LOG"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "INFRA_JOB_LOG"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "INFRA_JOB_LOG"."UPDATE_TIME" IS '更新时间'; +COMMENT ON TABLE "INFRA_JOB_LOG" IS '定时任务日志表'; + +-- ---------------------------- +-- Records of INFRA_JOB_LOG +-- ---------------------------- +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for INFRA_TEST_DEMO +-- ---------------------------- +DROP TABLE "INFRA_TEST_DEMO"; +CREATE TABLE "INFRA_TEST_DEMO" ( + "ID" NUMBER(20,0) NOT NULL, + "NAME" NVARCHAR2(100), + "STATUS" NUMBER(4,0) NOT NULL, + "TYPE" NUMBER(4,0) NOT NULL, + "CATEGORY" NUMBER(4,0) NOT NULL, + "REMARK" NVARCHAR2(500), + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "DELETED" NUMBER DEFAULT 0 +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "INFRA_TEST_DEMO"."ID" IS '编号'; +COMMENT ON COLUMN "INFRA_TEST_DEMO"."NAME" IS '名字'; +COMMENT ON COLUMN "INFRA_TEST_DEMO"."STATUS" IS '状态'; +COMMENT ON COLUMN "INFRA_TEST_DEMO"."TYPE" IS '类型'; +COMMENT ON COLUMN "INFRA_TEST_DEMO"."CATEGORY" IS '分类'; +COMMENT ON COLUMN "INFRA_TEST_DEMO"."REMARK" IS '备注'; +COMMENT ON COLUMN "INFRA_TEST_DEMO"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "INFRA_TEST_DEMO"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "INFRA_TEST_DEMO"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "INFRA_TEST_DEMO"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "INFRA_TEST_DEMO"."DELETED" IS '是否删除'; +COMMENT ON TABLE "INFRA_TEST_DEMO" IS '字典类型表'; + +-- ---------------------------- +-- Records of INFRA_TEST_DEMO +-- ---------------------------- +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for MEMBER_USER +-- ---------------------------- +DROP TABLE "MEMBER_USER"; +CREATE TABLE "MEMBER_USER" ( + "ID" NUMBER(20,0) NOT NULL, + "NICKNAME" NVARCHAR2(30), + "AVATAR" NVARCHAR2(255), + "STATUS" NUMBER(4,0) NOT NULL, + "MOBILE" NVARCHAR2(11), + "PASSWORD" NVARCHAR2(100), + "REGISTER_IP" NVARCHAR2(32), + "LOGIN_IP" NVARCHAR2(50), + "LOGIN_DATE" DATE, + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "TENANT_ID" NUMBER(20,0) NOT NULL, + "DELETED" NUMBER(1,0) DEFAULT 0 +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "MEMBER_USER"."ID" IS '编号'; +COMMENT ON COLUMN "MEMBER_USER"."NICKNAME" IS '用户昵称'; +COMMENT ON COLUMN "MEMBER_USER"."AVATAR" IS '头像'; +COMMENT ON COLUMN "MEMBER_USER"."STATUS" IS '状态'; +COMMENT ON COLUMN "MEMBER_USER"."MOBILE" IS '手机号'; +COMMENT ON COLUMN "MEMBER_USER"."PASSWORD" IS '密码'; +COMMENT ON COLUMN "MEMBER_USER"."REGISTER_IP" IS '注册 IP'; +COMMENT ON COLUMN "MEMBER_USER"."LOGIN_IP" IS '最后登录IP'; +COMMENT ON COLUMN "MEMBER_USER"."LOGIN_DATE" IS '最后登录时间'; +COMMENT ON COLUMN "MEMBER_USER"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "MEMBER_USER"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "MEMBER_USER"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "MEMBER_USER"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "MEMBER_USER"."TENANT_ID" IS '租户编号'; +COMMENT ON TABLE "MEMBER_USER" IS '用户'; + +-- ---------------------------- +-- Records of MEMBER_USER +-- ---------------------------- +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for PAY_APP +-- ---------------------------- +DROP TABLE "PAY_APP"; +CREATE TABLE "PAY_APP" ( + "ID" NUMBER(20,0) NOT NULL, + "NAME" NVARCHAR2(64), + "STATUS" NUMBER(4,0) NOT NULL, + "REMARK" NVARCHAR2(255), + "PAY_NOTIFY_URL" NCLOB, + "REFUND_NOTIFY_URL" NCLOB, + "MERCHANT_ID" NUMBER(20,0) NOT NULL, + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "TENANT_ID" NUMBER(20,0) NOT NULL, + "DELETED" NUMBER(1,0) DEFAULT 0 +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "PAY_APP"."ID" IS '应用编号'; +COMMENT ON COLUMN "PAY_APP"."NAME" IS '应用名'; +COMMENT ON COLUMN "PAY_APP"."STATUS" IS '开启状态'; +COMMENT ON COLUMN "PAY_APP"."REMARK" IS '备注'; +COMMENT ON COLUMN "PAY_APP"."PAY_NOTIFY_URL" IS '支付结果的回调地址'; +COMMENT ON COLUMN "PAY_APP"."REFUND_NOTIFY_URL" IS '退款结果的回调地址'; +COMMENT ON COLUMN "PAY_APP"."MERCHANT_ID" IS '商户编号'; +COMMENT ON COLUMN "PAY_APP"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "PAY_APP"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "PAY_APP"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "PAY_APP"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "PAY_APP"."TENANT_ID" IS '租户编号'; +COMMENT ON TABLE "PAY_APP" IS '支付应用信息'; + +-- ---------------------------- +-- Records of PAY_APP +-- ---------------------------- +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for PAY_CHANNEL +-- ---------------------------- +DROP TABLE "PAY_CHANNEL"; +CREATE TABLE "PAY_CHANNEL" ( + "ID" NUMBER(20,0) NOT NULL, + "CODE" NVARCHAR2(32), + "STATUS" NUMBER(4,0) NOT NULL, + "REMARK" NVARCHAR2(255), + "FEE_RATE" NUMBER NOT NULL, + "MERCHANT_ID" NUMBER(20,0) NOT NULL, + "APP_ID" NUMBER(20,0) NOT NULL, + "CONFIG" NCLOB, + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "TENANT_ID" NUMBER(20,0) NOT NULL, + "DELETED" NUMBER(1,0) DEFAULT 0 +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "PAY_CHANNEL"."ID" IS '商户编号'; +COMMENT ON COLUMN "PAY_CHANNEL"."CODE" IS '渠道编码'; +COMMENT ON COLUMN "PAY_CHANNEL"."STATUS" IS '开启状态'; +COMMENT ON COLUMN "PAY_CHANNEL"."REMARK" IS '备注'; +COMMENT ON COLUMN "PAY_CHANNEL"."FEE_RATE" IS '渠道费率,单位:百分比'; +COMMENT ON COLUMN "PAY_CHANNEL"."MERCHANT_ID" IS '商户编号'; +COMMENT ON COLUMN "PAY_CHANNEL"."APP_ID" IS '应用编号'; +COMMENT ON COLUMN "PAY_CHANNEL"."CONFIG" IS '支付渠道配置'; +COMMENT ON COLUMN "PAY_CHANNEL"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "PAY_CHANNEL"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "PAY_CHANNEL"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "PAY_CHANNEL"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "PAY_CHANNEL"."TENANT_ID" IS '租户编号'; +COMMENT ON TABLE "PAY_CHANNEL" IS '支付渠道 +'; + +-- ---------------------------- +-- Records of PAY_CHANNEL +-- ---------------------------- +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for PAY_MERCHANT +-- ---------------------------- +DROP TABLE "PAY_MERCHANT"; +CREATE TABLE "PAY_MERCHANT" ( + "ID" NUMBER(20,0) NOT NULL, + "NO" NVARCHAR2(32), + "NAME" NVARCHAR2(64), + "SHORT_NAME" NVARCHAR2(64), + "STATUS" NUMBER(4,0) NOT NULL, + "REMARK" NVARCHAR2(255), + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "TENANT_ID" NUMBER(20,0) NOT NULL, + "DELETED" NUMBER(1,0) DEFAULT 0 +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "PAY_MERCHANT"."ID" IS '商户编号'; +COMMENT ON COLUMN "PAY_MERCHANT"."NO" IS '商户号'; +COMMENT ON COLUMN "PAY_MERCHANT"."NAME" IS '商户全称'; +COMMENT ON COLUMN "PAY_MERCHANT"."SHORT_NAME" IS '商户简称'; +COMMENT ON COLUMN "PAY_MERCHANT"."STATUS" IS '开启状态'; +COMMENT ON COLUMN "PAY_MERCHANT"."REMARK" IS '备注'; +COMMENT ON COLUMN "PAY_MERCHANT"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "PAY_MERCHANT"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "PAY_MERCHANT"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "PAY_MERCHANT"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "PAY_MERCHANT"."TENANT_ID" IS '租户编号'; +COMMENT ON TABLE "PAY_MERCHANT" IS '支付商户信息'; + +-- ---------------------------- +-- Records of PAY_MERCHANT +-- ---------------------------- +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for PAY_NOTIFY_LOG +-- ---------------------------- +DROP TABLE "PAY_NOTIFY_LOG"; +CREATE TABLE "PAY_NOTIFY_LOG" ( + "ID" NUMBER(20,0) NOT NULL, + "TASK_ID" NUMBER(20,0) NOT NULL, + "NOTIFY_TIMES" NUMBER(4,0) NOT NULL, + "RESPONSE" NCLOB, + "STATUS" NUMBER(4,0) NOT NULL, + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "TENANT_ID" NUMBER(20,0) NOT NULL, + "DELETED" NUMBER(1,0) DEFAULT 0 +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "PAY_NOTIFY_LOG"."ID" IS '日志编号'; +COMMENT ON COLUMN "PAY_NOTIFY_LOG"."TASK_ID" IS '通知任务编号'; +COMMENT ON COLUMN "PAY_NOTIFY_LOG"."NOTIFY_TIMES" IS '第几次被通知'; +COMMENT ON COLUMN "PAY_NOTIFY_LOG"."RESPONSE" IS '请求参数'; +COMMENT ON COLUMN "PAY_NOTIFY_LOG"."STATUS" IS '通知状态'; +COMMENT ON COLUMN "PAY_NOTIFY_LOG"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "PAY_NOTIFY_LOG"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "PAY_NOTIFY_LOG"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "PAY_NOTIFY_LOG"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "PAY_NOTIFY_LOG"."TENANT_ID" IS '租户编号'; +COMMENT ON TABLE "PAY_NOTIFY_LOG" IS '支付通知 App 的日志'; + +-- ---------------------------- +-- Records of PAY_NOTIFY_LOG +-- ---------------------------- +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for PAY_NOTIFY_TASK +-- ---------------------------- +DROP TABLE "PAY_NOTIFY_TASK"; +CREATE TABLE "PAY_NOTIFY_TASK" ( + "ID" NUMBER(20,0) NOT NULL, + "MERCHANT_ID" NUMBER(20,0) NOT NULL, + "APP_ID" NUMBER(20,0) NOT NULL, + "TYPE" NUMBER(4,0) NOT NULL, + "DATA_ID" NUMBER(20,0) NOT NULL, + "STATUS" NUMBER(4,0) NOT NULL, + "MERCHANT_ORDER_ID" NVARCHAR2(64), + "NEXT_NOTIFY_TIME" DATE NOT NULL, + "LAST_EXECUTE_TIME" DATE NOT NULL, + "NOTIFY_TIMES" NUMBER(4,0) NOT NULL, + "MAX_NOTIFY_TIMES" NUMBER(4,0) NOT NULL, + "NOTIFY_URL" NCLOB, + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "TENANT_ID" NUMBER(20,0) NOT NULL, + "DELETED" NUMBER(1,0) DEFAULT 0 +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "PAY_NOTIFY_TASK"."ID" IS '任务编号'; +COMMENT ON COLUMN "PAY_NOTIFY_TASK"."MERCHANT_ID" IS '商户编号'; +COMMENT ON COLUMN "PAY_NOTIFY_TASK"."APP_ID" IS '应用编号'; +COMMENT ON COLUMN "PAY_NOTIFY_TASK"."TYPE" IS '通知类型'; +COMMENT ON COLUMN "PAY_NOTIFY_TASK"."DATA_ID" IS '数据编号'; +COMMENT ON COLUMN "PAY_NOTIFY_TASK"."STATUS" IS '通知状态'; +COMMENT ON COLUMN "PAY_NOTIFY_TASK"."MERCHANT_ORDER_ID" IS '商户订单编号'; +COMMENT ON COLUMN "PAY_NOTIFY_TASK"."NEXT_NOTIFY_TIME" IS '下一次通知时间'; +COMMENT ON COLUMN "PAY_NOTIFY_TASK"."LAST_EXECUTE_TIME" IS '最后一次执行时间'; +COMMENT ON COLUMN "PAY_NOTIFY_TASK"."NOTIFY_TIMES" IS '当前通知次数'; +COMMENT ON COLUMN "PAY_NOTIFY_TASK"."MAX_NOTIFY_TIMES" IS '最大可通知次数'; +COMMENT ON COLUMN "PAY_NOTIFY_TASK"."NOTIFY_URL" IS '异步通知地址'; +COMMENT ON COLUMN "PAY_NOTIFY_TASK"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "PAY_NOTIFY_TASK"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "PAY_NOTIFY_TASK"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "PAY_NOTIFY_TASK"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "PAY_NOTIFY_TASK"."TENANT_ID" IS '租户编号'; +COMMENT ON TABLE "PAY_NOTIFY_TASK" IS '商户支付、退款等的通知 +'; + +-- ---------------------------- +-- Records of PAY_NOTIFY_TASK +-- ---------------------------- +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for PAY_ORDER +-- ---------------------------- +DROP TABLE "PAY_ORDER"; +CREATE TABLE "PAY_ORDER" ( + "ID" NUMBER(20,0) NOT NULL, + "MERCHANT_ID" NUMBER(20,0) NOT NULL, + "APP_ID" NUMBER(20,0) NOT NULL, + "CHANNEL_ID" NUMBER(20,0), + "CHANNEL_CODE" NVARCHAR2(32), + "MERCHANT_ORDER_ID" NVARCHAR2(64), + "SUBJECT" NVARCHAR2(32), + "BODY" NVARCHAR2(128), + "NOTIFY_URL" NCLOB, + "NOTIFY_STATUS" NUMBER(4,0) NOT NULL, + "AMOUNT" NUMBER(20,0) NOT NULL, + "CHANNEL_FEE_RATE" NUMBER, + "CHANNEL_FEE_AMOUNT" NUMBER(20,0), + "STATUS" NUMBER(4,0) NOT NULL, + "USER_IP" NVARCHAR2(50), + "EXPIRE_TIME" DATE NOT NULL, + "SUCCESS_TIME" DATE, + "NOTIFY_TIME" DATE, + "SUCCESS_EXTENSION_ID" NUMBER(20,0), + "REFUND_STATUS" NUMBER(4,0) NOT NULL, + "REFUND_TIMES" NUMBER(4,0) NOT NULL, + "REFUND_AMOUNT" NUMBER(20,0) NOT NULL, + "CHANNEL_USER_ID" NVARCHAR2(255), + "CHANNEL_ORDER_NO" NVARCHAR2(64), + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "TENANT_ID" NUMBER(20,0) NOT NULL, + "DELETED" NUMBER(1,0) DEFAULT 0 +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "PAY_ORDER"."ID" IS '支付订单编号'; +COMMENT ON COLUMN "PAY_ORDER"."MERCHANT_ID" IS '商户编号'; +COMMENT ON COLUMN "PAY_ORDER"."APP_ID" IS '应用编号'; +COMMENT ON COLUMN "PAY_ORDER"."CHANNEL_ID" IS '渠道编号'; +COMMENT ON COLUMN "PAY_ORDER"."CHANNEL_CODE" IS '渠道编码'; +COMMENT ON COLUMN "PAY_ORDER"."MERCHANT_ORDER_ID" IS '商户订单编号'; +COMMENT ON COLUMN "PAY_ORDER"."SUBJECT" IS '商品标题'; +COMMENT ON COLUMN "PAY_ORDER"."BODY" IS '商品描述'; +COMMENT ON COLUMN "PAY_ORDER"."NOTIFY_URL" IS '异步通知地址'; +COMMENT ON COLUMN "PAY_ORDER"."NOTIFY_STATUS" IS '通知商户支付结果的回调状态'; +COMMENT ON COLUMN "PAY_ORDER"."AMOUNT" IS '支付金额,单位:分'; +COMMENT ON COLUMN "PAY_ORDER"."CHANNEL_FEE_RATE" IS '渠道手续费,单位:百分比'; +COMMENT ON COLUMN "PAY_ORDER"."CHANNEL_FEE_AMOUNT" IS '渠道手续金额,单位:分'; +COMMENT ON COLUMN "PAY_ORDER"."STATUS" IS '支付状态'; +COMMENT ON COLUMN "PAY_ORDER"."USER_IP" IS '用户 IP'; +COMMENT ON COLUMN "PAY_ORDER"."EXPIRE_TIME" IS '订单失效时间'; +COMMENT ON COLUMN "PAY_ORDER"."SUCCESS_TIME" IS '订单支付成功时间'; +COMMENT ON COLUMN "PAY_ORDER"."NOTIFY_TIME" IS '订单支付通知时间'; +COMMENT ON COLUMN "PAY_ORDER"."SUCCESS_EXTENSION_ID" IS '支付成功的订单拓展单编号'; +COMMENT ON COLUMN "PAY_ORDER"."REFUND_STATUS" IS '退款状态'; +COMMENT ON COLUMN "PAY_ORDER"."REFUND_TIMES" IS '退款次数'; +COMMENT ON COLUMN "PAY_ORDER"."REFUND_AMOUNT" IS '退款总金额,单位:分'; +COMMENT ON COLUMN "PAY_ORDER"."CHANNEL_USER_ID" IS '渠道用户编号'; +COMMENT ON COLUMN "PAY_ORDER"."CHANNEL_ORDER_NO" IS '渠道订单号'; +COMMENT ON COLUMN "PAY_ORDER"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "PAY_ORDER"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "PAY_ORDER"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "PAY_ORDER"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "PAY_ORDER"."TENANT_ID" IS '租户编号'; +COMMENT ON TABLE "PAY_ORDER" IS '支付订单 +'; + +-- ---------------------------- +-- Records of PAY_ORDER +-- ---------------------------- +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for PAY_ORDER_EXTENSION +-- ---------------------------- +DROP TABLE "PAY_ORDER_EXTENSION"; +CREATE TABLE "PAY_ORDER_EXTENSION" ( + "ID" NUMBER(20,0) NOT NULL, + "NO" NVARCHAR2(64), + "ORDER_ID" NUMBER(20,0) NOT NULL, + "CHANNEL_ID" NUMBER(20,0) NOT NULL, + "CHANNEL_CODE" NVARCHAR2(32), + "USER_IP" NVARCHAR2(50), + "STATUS" NUMBER(4,0) NOT NULL, + "CHANNEL_EXTRAS" NVARCHAR2(256), + "CHANNEL_NOTIFY_DATA" NCLOB, + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "TENANT_ID" NUMBER(20,0) NOT NULL, + "DELETED" NUMBER(1,0) DEFAULT 0 +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "PAY_ORDER_EXTENSION"."ID" IS '支付订单编号'; +COMMENT ON COLUMN "PAY_ORDER_EXTENSION"."NO" IS '支付订单号'; +COMMENT ON COLUMN "PAY_ORDER_EXTENSION"."ORDER_ID" IS '支付订单编号'; +COMMENT ON COLUMN "PAY_ORDER_EXTENSION"."CHANNEL_ID" IS '渠道编号'; +COMMENT ON COLUMN "PAY_ORDER_EXTENSION"."CHANNEL_CODE" IS '渠道编码'; +COMMENT ON COLUMN "PAY_ORDER_EXTENSION"."USER_IP" IS '用户 IP'; +COMMENT ON COLUMN "PAY_ORDER_EXTENSION"."STATUS" IS '支付状态'; +COMMENT ON COLUMN "PAY_ORDER_EXTENSION"."CHANNEL_EXTRAS" IS '支付渠道的额外参数'; +COMMENT ON COLUMN "PAY_ORDER_EXTENSION"."CHANNEL_NOTIFY_DATA" IS '支付渠道异步通知的内容'; +COMMENT ON COLUMN "PAY_ORDER_EXTENSION"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "PAY_ORDER_EXTENSION"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "PAY_ORDER_EXTENSION"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "PAY_ORDER_EXTENSION"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "PAY_ORDER_EXTENSION"."TENANT_ID" IS '租户编号'; +COMMENT ON TABLE "PAY_ORDER_EXTENSION" IS '支付订单 +'; + +-- ---------------------------- +-- Records of PAY_ORDER_EXTENSION +-- ---------------------------- +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for PAY_REFUND +-- ---------------------------- +DROP TABLE "PAY_REFUND"; +CREATE TABLE "PAY_REFUND" ( + "ID" NUMBER(20,0) NOT NULL, + "MERCHANT_ID" NUMBER(20,0) NOT NULL, + "APP_ID" NUMBER(20,0) NOT NULL, + "CHANNEL_ID" NUMBER(20,0) NOT NULL, + "CHANNEL_CODE" NVARCHAR2(32), + "ORDER_ID" NUMBER(20,0) NOT NULL, + "TRADE_NO" NVARCHAR2(64), + "MERCHANT_ORDER_ID" NVARCHAR2(64), + "MERCHANT_REFUND_NO" NVARCHAR2(64), + "NOTIFY_URL" NCLOB, + "NOTIFY_STATUS" NUMBER(4,0) NOT NULL, + "STATUS" NUMBER(4,0) NOT NULL, + "TYPE" NUMBER(4,0) NOT NULL, + "PAY_AMOUNT" NUMBER(20,0) NOT NULL, + "REFUND_AMOUNT" NUMBER(20,0) NOT NULL, + "REASON" NVARCHAR2(256), + "USER_IP" NVARCHAR2(50), + "CHANNEL_ORDER_NO" NVARCHAR2(64), + "CHANNEL_REFUND_NO" NVARCHAR2(64), + "CHANNEL_ERROR_CODE" NVARCHAR2(128), + "CHANNEL_ERROR_MSG" NVARCHAR2(256), + "CHANNEL_EXTRAS" NCLOB, + "EXPIRE_TIME" DATE, + "SUCCESS_TIME" DATE, + "NOTIFY_TIME" DATE, + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "TENANT_ID" NUMBER(20,0) NOT NULL, + "DELETED" NUMBER(1,0) DEFAULT 0 +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "PAY_REFUND"."ID" IS '支付退款编号'; +COMMENT ON COLUMN "PAY_REFUND"."MERCHANT_ID" IS '商户编号'; +COMMENT ON COLUMN "PAY_REFUND"."APP_ID" IS '应用编号'; +COMMENT ON COLUMN "PAY_REFUND"."CHANNEL_ID" IS '渠道编号'; +COMMENT ON COLUMN "PAY_REFUND"."CHANNEL_CODE" IS '渠道编码'; +COMMENT ON COLUMN "PAY_REFUND"."ORDER_ID" IS '支付订单编号 pay_order 表id'; +COMMENT ON COLUMN "PAY_REFUND"."TRADE_NO" IS '交易订单号 pay_extension 表no 字段'; +COMMENT ON COLUMN "PAY_REFUND"."MERCHANT_ORDER_ID" IS '商户订单编号(商户系统生成)'; +COMMENT ON COLUMN "PAY_REFUND"."MERCHANT_REFUND_NO" IS '商户退款订单号(商户系统生成)'; +COMMENT ON COLUMN "PAY_REFUND"."NOTIFY_URL" IS '异步通知商户地址'; +COMMENT ON COLUMN "PAY_REFUND"."NOTIFY_STATUS" IS '通知商户退款结果的回调状态'; +COMMENT ON COLUMN "PAY_REFUND"."STATUS" IS '退款状态'; +COMMENT ON COLUMN "PAY_REFUND"."TYPE" IS '退款类型(部分退款,全部退款)'; +COMMENT ON COLUMN "PAY_REFUND"."PAY_AMOUNT" IS '支付金额,单位分'; +COMMENT ON COLUMN "PAY_REFUND"."REFUND_AMOUNT" IS '退款金额,单位分'; +COMMENT ON COLUMN "PAY_REFUND"."REASON" IS '退款原因'; +COMMENT ON COLUMN "PAY_REFUND"."USER_IP" IS '用户 IP'; +COMMENT ON COLUMN "PAY_REFUND"."CHANNEL_ORDER_NO" IS '渠道订单号,pay_order 中的channel_order_no 对应'; +COMMENT ON COLUMN "PAY_REFUND"."CHANNEL_REFUND_NO" IS '渠道退款单号,渠道返回'; +COMMENT ON COLUMN "PAY_REFUND"."CHANNEL_ERROR_CODE" IS '渠道调用报错时,错误码'; +COMMENT ON COLUMN "PAY_REFUND"."CHANNEL_ERROR_MSG" IS '渠道调用报错时,错误信息'; +COMMENT ON COLUMN "PAY_REFUND"."CHANNEL_EXTRAS" IS '支付渠道的额外参数'; +COMMENT ON COLUMN "PAY_REFUND"."EXPIRE_TIME" IS '退款失效时间'; +COMMENT ON COLUMN "PAY_REFUND"."SUCCESS_TIME" IS '退款成功时间'; +COMMENT ON COLUMN "PAY_REFUND"."NOTIFY_TIME" IS '退款通知时间'; +COMMENT ON COLUMN "PAY_REFUND"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "PAY_REFUND"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "PAY_REFUND"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "PAY_REFUND"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "PAY_REFUND"."TENANT_ID" IS '租户编号'; +COMMENT ON TABLE "PAY_REFUND" IS '退款订单'; + +-- ---------------------------- +-- Records of PAY_REFUND +-- ---------------------------- +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for QRTZ_BLOB_TRIGGERS +-- ---------------------------- +DROP TABLE "QRTZ_BLOB_TRIGGERS"; +CREATE TABLE "QRTZ_BLOB_TRIGGERS" ( + "SCHED_NAME" VARCHAR2(120 BYTE) NOT NULL, + "TRIGGER_NAME" VARCHAR2(200 BYTE) NOT NULL, + "TRIGGER_GROUP" VARCHAR2(200 BYTE) NOT NULL, + "BLOB_DATA" BLOB +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; + +-- ---------------------------- +-- Records of QRTZ_BLOB_TRIGGERS +-- ---------------------------- +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for QRTZ_CALENDARS +-- ---------------------------- +DROP TABLE "QRTZ_CALENDARS"; +CREATE TABLE "QRTZ_CALENDARS" ( + "SCHED_NAME" VARCHAR2(120 BYTE) NOT NULL, + "CALENDAR_NAME" VARCHAR2(200 BYTE) NOT NULL, + "CALENDAR" BLOB NOT NULL +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; + +-- ---------------------------- +-- Records of QRTZ_CALENDARS +-- ---------------------------- +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for QRTZ_CRON_TRIGGERS +-- ---------------------------- +DROP TABLE "QRTZ_CRON_TRIGGERS"; +CREATE TABLE "QRTZ_CRON_TRIGGERS" ( + "SCHED_NAME" VARCHAR2(120 BYTE) NOT NULL, + "TRIGGER_NAME" VARCHAR2(200 BYTE) NOT NULL, + "TRIGGER_GROUP" VARCHAR2(200 BYTE) NOT NULL, + "CRON_EXPRESSION" VARCHAR2(120 BYTE) NOT NULL, + "TIME_ZONE_ID" VARCHAR2(80 BYTE) +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; + +-- ---------------------------- +-- Records of QRTZ_CRON_TRIGGERS +-- ---------------------------- +INSERT INTO "QRTZ_CRON_TRIGGERS" ("SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP", "CRON_EXPRESSION", "TIME_ZONE_ID") VALUES ('schedulerName', 'userSessionTimeoutJob', 'DEFAULT', '0 * * * * ? *', 'Asia/Shanghai'); +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for QRTZ_FIRED_TRIGGERS +-- ---------------------------- +DROP TABLE "QRTZ_FIRED_TRIGGERS"; +CREATE TABLE "QRTZ_FIRED_TRIGGERS" ( + "SCHED_NAME" VARCHAR2(120 BYTE) NOT NULL, + "ENTRY_ID" VARCHAR2(95 BYTE) NOT NULL, + "TRIGGER_NAME" VARCHAR2(200 BYTE) NOT NULL, + "TRIGGER_GROUP" VARCHAR2(200 BYTE) NOT NULL, + "INSTANCE_NAME" VARCHAR2(200 BYTE) NOT NULL, + "FIRED_TIME" NUMBER(13,0) NOT NULL, + "SCHED_TIME" NUMBER(13,0) NOT NULL, + "PRIORITY" NUMBER(13,0) NOT NULL, + "STATE" VARCHAR2(16 BYTE) NOT NULL, + "JOB_NAME" VARCHAR2(200 BYTE), + "JOB_GROUP" VARCHAR2(200 BYTE), + "IS_NONCONCURRENT" VARCHAR2(1 BYTE), + "REQUESTS_RECOVERY" VARCHAR2(1 BYTE) +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; + +-- ---------------------------- +-- Records of QRTZ_FIRED_TRIGGERS +-- ---------------------------- +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for QRTZ_JOB_DETAILS +-- ---------------------------- +DROP TABLE "QRTZ_JOB_DETAILS"; +CREATE TABLE "QRTZ_JOB_DETAILS" ( + "SCHED_NAME" VARCHAR2(120 BYTE) NOT NULL, + "JOB_NAME" VARCHAR2(200 BYTE) NOT NULL, + "JOB_GROUP" VARCHAR2(200 BYTE) NOT NULL, + "DESCRIPTION" VARCHAR2(250 BYTE), + "JOB_CLASS_NAME" VARCHAR2(250 BYTE) NOT NULL, + "IS_DURABLE" VARCHAR2(1 BYTE) NOT NULL, + "IS_NONCONCURRENT" VARCHAR2(1 BYTE) NOT NULL, + "IS_UPDATE_DATA" VARCHAR2(1 BYTE) NOT NULL, + "REQUESTS_RECOVERY" VARCHAR2(1 BYTE) NOT NULL, + "JOB_DATA" BLOB +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; + +-- ---------------------------- +-- Records of QRTZ_JOB_DETAILS +-- ---------------------------- +INSERT INTO "QRTZ_JOB_DETAILS" ("SCHED_NAME", "JOB_NAME", "JOB_GROUP", "DESCRIPTION", "JOB_CLASS_NAME", "IS_DURABLE", "IS_NONCONCURRENT", "IS_UPDATE_DATA", "REQUESTS_RECOVERY", "JOB_DATA") VALUES ('schedulerName', 'userSessionTimeoutJob', 'DEFAULT', NULL, 'com.win.framework.quartz.core.handler.JobHandlerInvoker', '0', '1', '1', '0', HEXTORAW('ACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C770800000010000000027400064A4F425F49447372000E6A6176612E6C616E672E4C6F6E673B8BE490CC8F23DF0200014A000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B020000787000000000000000007400104A4F425F48414E444C45525F4E414D457400157573657253657373696F6E54696D656F75744A6F627800')); +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for QRTZ_LOCKS +-- ---------------------------- +DROP TABLE "QRTZ_LOCKS"; +CREATE TABLE "QRTZ_LOCKS" ( + "SCHED_NAME" VARCHAR2(120 BYTE) NOT NULL, + "LOCK_NAME" VARCHAR2(40 BYTE) NOT NULL +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; + +-- ---------------------------- +-- Records of QRTZ_LOCKS +-- ---------------------------- +INSERT INTO "QRTZ_LOCKS" ("SCHED_NAME", "LOCK_NAME") VALUES ('schedulerName', 'STATE_ACCESS'); +INSERT INTO "QRTZ_LOCKS" ("SCHED_NAME", "LOCK_NAME") VALUES ('schedulerName', 'TRIGGER_ACCESS'); +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for QRTZ_PAUSED_TRIGGER_GRPS +-- ---------------------------- +DROP TABLE "QRTZ_PAUSED_TRIGGER_GRPS"; +CREATE TABLE "QRTZ_PAUSED_TRIGGER_GRPS" ( + "SCHED_NAME" VARCHAR2(120 BYTE) NOT NULL, + "TRIGGER_GROUP" VARCHAR2(200 BYTE) NOT NULL +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; + +-- ---------------------------- +-- Records of QRTZ_PAUSED_TRIGGER_GRPS +-- ---------------------------- +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for QRTZ_SCHEDULER_STATE +-- ---------------------------- +DROP TABLE "QRTZ_SCHEDULER_STATE"; +CREATE TABLE "QRTZ_SCHEDULER_STATE" ( + "SCHED_NAME" VARCHAR2(120 BYTE) NOT NULL, + "INSTANCE_NAME" VARCHAR2(200 BYTE) NOT NULL, + "LAST_CHECKIN_TIME" NUMBER(13,0) NOT NULL, + "CHECKIN_INTERVAL" NUMBER(13,0) NOT NULL +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; + +-- ---------------------------- +-- Records of QRTZ_SCHEDULER_STATE +-- ---------------------------- +INSERT INTO "QRTZ_SCHEDULER_STATE" ("SCHED_NAME", "INSTANCE_NAME", "LAST_CHECKIN_TIME", "CHECKIN_INTERVAL") VALUES ('schedulerName', 'Yunai.local1651409076356', '1651409097967', '15000'); +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for QRTZ_SIMPLE_TRIGGERS +-- ---------------------------- +DROP TABLE "QRTZ_SIMPLE_TRIGGERS"; +CREATE TABLE "QRTZ_SIMPLE_TRIGGERS" ( + "SCHED_NAME" VARCHAR2(120 BYTE) NOT NULL, + "TRIGGER_NAME" VARCHAR2(200 BYTE) NOT NULL, + "TRIGGER_GROUP" VARCHAR2(200 BYTE) NOT NULL, + "REPEAT_COUNT" NUMBER(7,0) NOT NULL, + "REPEAT_INTERVAL" NUMBER(12,0) NOT NULL, + "TIMES_TRIGGERED" NUMBER(10,0) NOT NULL +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; + +-- ---------------------------- +-- Records of QRTZ_SIMPLE_TRIGGERS +-- ---------------------------- +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for QRTZ_SIMPROP_TRIGGERS +-- ---------------------------- +DROP TABLE "QRTZ_SIMPROP_TRIGGERS"; +CREATE TABLE "QRTZ_SIMPROP_TRIGGERS" ( + "SCHED_NAME" VARCHAR2(120 BYTE) NOT NULL, + "TRIGGER_NAME" VARCHAR2(200 BYTE) NOT NULL, + "TRIGGER_GROUP" VARCHAR2(200 BYTE) NOT NULL, + "STR_PROP_1" VARCHAR2(512 BYTE), + "STR_PROP_2" VARCHAR2(512 BYTE), + "STR_PROP_3" VARCHAR2(512 BYTE), + "INT_PROP_1" NUMBER(10,0), + "INT_PROP_2" NUMBER(10,0), + "LONG_PROP_1" NUMBER(13,0), + "LONG_PROP_2" NUMBER(13,0), + "DEC_PROP_1" NUMBER(13,4), + "DEC_PROP_2" NUMBER(13,4), + "BOOL_PROP_1" VARCHAR2(1 BYTE), + "BOOL_PROP_2" VARCHAR2(1 BYTE) +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; + +-- ---------------------------- +-- Records of QRTZ_SIMPROP_TRIGGERS +-- ---------------------------- +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for QRTZ_TRIGGERS +-- ---------------------------- +DROP TABLE "QRTZ_TRIGGERS"; +CREATE TABLE "QRTZ_TRIGGERS" ( + "SCHED_NAME" VARCHAR2(120 BYTE) NOT NULL, + "TRIGGER_NAME" VARCHAR2(200 BYTE) NOT NULL, + "TRIGGER_GROUP" VARCHAR2(200 BYTE) NOT NULL, + "JOB_NAME" VARCHAR2(200 BYTE) NOT NULL, + "JOB_GROUP" VARCHAR2(200 BYTE) NOT NULL, + "DESCRIPTION" VARCHAR2(250 BYTE), + "NEXT_FIRE_TIME" NUMBER(13,0), + "PREV_FIRE_TIME" NUMBER(13,0), + "PRIORITY" NUMBER(13,0), + "TRIGGER_STATE" VARCHAR2(16 BYTE) NOT NULL, + "TRIGGER_TYPE" VARCHAR2(8 BYTE) NOT NULL, + "START_TIME" NUMBER(13,0) NOT NULL, + "END_TIME" NUMBER(13,0), + "CALENDAR_NAME" VARCHAR2(200 BYTE), + "MISFIRE_INSTR" NUMBER(2,0), + "JOB_DATA" BLOB +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; + +-- ---------------------------- +-- Records of QRTZ_TRIGGERS +-- ---------------------------- +INSERT INTO "QRTZ_TRIGGERS" ("SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP", "JOB_NAME", "JOB_GROUP", "DESCRIPTION", "NEXT_FIRE_TIME", "PREV_FIRE_TIME", "PRIORITY", "TRIGGER_STATE", "TRIGGER_TYPE", "START_TIME", "END_TIME", "CALENDAR_NAME", "MISFIRE_INSTR", "JOB_DATA") VALUES ('schedulerName', 'userSessionTimeoutJob', 'DEFAULT', 'userSessionTimeoutJob', 'DEFAULT', NULL, '1651409160000', '1651409100000', '5', 'WAITING', 'CRON', '1651409043000', '0', NULL, '0', HEXTORAW('ACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C770800000010000000037400114A4F425F48414E444C45525F504152414D707400124A4F425F52455452595F494E54455256414C737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000007D074000F4A4F425F52455452595F434F554E547371007E0009000000037800')); +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for SYSTEM_DEPT +-- ---------------------------- +DROP TABLE "SYSTEM_DEPT"; +CREATE TABLE "SYSTEM_DEPT" ( + "ID" NUMBER(20,0) NOT NULL, + "NAME" NVARCHAR2(30), + "PARENT_ID" NUMBER(20,0) NOT NULL, + "SORT" NUMBER(11,0) NOT NULL, + "LEADER_USER_ID" NUMBER(20,0), + "PHONE" NVARCHAR2(11), + "EMAIL" NVARCHAR2(50), + "STATUS" NUMBER(4,0) NOT NULL, + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "TENANT_ID" NUMBER(20,0) NOT NULL, + "DELETED" NUMBER(1,0) DEFAULT 0 NOT NULL +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "SYSTEM_DEPT"."ID" IS '部门id'; +COMMENT ON COLUMN "SYSTEM_DEPT"."NAME" IS '部门名称'; +COMMENT ON COLUMN "SYSTEM_DEPT"."PARENT_ID" IS '父部门id'; +COMMENT ON COLUMN "SYSTEM_DEPT"."SORT" IS '显示顺序'; +COMMENT ON COLUMN "SYSTEM_DEPT"."LEADER_USER_ID" IS '负责人'; +COMMENT ON COLUMN "SYSTEM_DEPT"."PHONE" IS '联系电话'; +COMMENT ON COLUMN "SYSTEM_DEPT"."EMAIL" IS '邮箱'; +COMMENT ON COLUMN "SYSTEM_DEPT"."STATUS" IS '部门状态(0正常 1停用)'; +COMMENT ON COLUMN "SYSTEM_DEPT"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "SYSTEM_DEPT"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SYSTEM_DEPT"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "SYSTEM_DEPT"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "SYSTEM_DEPT"."TENANT_ID" IS '租户编号'; +COMMENT ON COLUMN "SYSTEM_DEPT"."DELETED" IS '是否删除'; +COMMENT ON TABLE "SYSTEM_DEPT" IS '部门表'; + +-- ---------------------------- +-- Records of SYSTEM_DEPT +-- ---------------------------- +INSERT INTO "SYSTEM_DEPT" ("ID", "NAME", "PARENT_ID", "SORT", "LEADER_USER_ID", "PHONE", "EMAIL", "STATUS", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('100', '闻荫源码', '0', '0', '1', '15888888888', 'ry@qq.com', '0', 'admin', TO_DATE('2021-01-05 17:03:47', 'SYYYY-MM-DD HH24:MI:SS'), '103', TO_DATE('2022-01-14 01:04:05', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_DEPT" ("ID", "NAME", "PARENT_ID", "SORT", "LEADER_USER_ID", "PHONE", "EMAIL", "STATUS", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('101', '深圳总公司', '100', '1', '104', '15888888888', 'ry@qq.com', '0', 'admin', TO_DATE('2021-01-05 17:03:47', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-22 19:47:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_DEPT" ("ID", "NAME", "PARENT_ID", "SORT", "LEADER_USER_ID", "PHONE", "EMAIL", "STATUS", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('102', '长沙分公司', '100', '2', NULL, '15888888888', 'ry@qq.com', '0', 'admin', TO_DATE('2021-01-05 17:03:47', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2021-12-15 05:01:40', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_DEPT" ("ID", "NAME", "PARENT_ID", "SORT", "LEADER_USER_ID", "PHONE", "EMAIL", "STATUS", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('103', '研发部门', '101', '1', '104', '15888888888', 'ry@qq.com', '0', 'admin', TO_DATE('2021-01-05 17:03:47', 'SYYYY-MM-DD HH24:MI:SS'), '103', TO_DATE('2022-01-14 01:04:14', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_DEPT" ("ID", "NAME", "PARENT_ID", "SORT", "LEADER_USER_ID", "PHONE", "EMAIL", "STATUS", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('104', '市场部门', '101', '2', NULL, '15888888888', 'ry@qq.com', '0', 'admin', TO_DATE('2021-01-05 17:03:47', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2021-12-15 05:01:38', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_DEPT" ("ID", "NAME", "PARENT_ID", "SORT", "LEADER_USER_ID", "PHONE", "EMAIL", "STATUS", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('105', '测试部门', '101', '3', NULL, '15888888888', 'ry@qq.com', '0', 'admin', TO_DATE('2021-01-05 17:03:47', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2021-12-15 05:01:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_DEPT" ("ID", "NAME", "PARENT_ID", "SORT", "LEADER_USER_ID", "PHONE", "EMAIL", "STATUS", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('106', '财务部门', '101', '4', '103', '15888888888', 'ry@qq.com', '0', 'admin', TO_DATE('2021-01-05 17:03:47', 'SYYYY-MM-DD HH24:MI:SS'), '103', TO_DATE('2022-01-15 21:32:22', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_DEPT" ("ID", "NAME", "PARENT_ID", "SORT", "LEADER_USER_ID", "PHONE", "EMAIL", "STATUS", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('107', '运维部门', '101', '5', NULL, '15888888888', 'ry@qq.com', '0', 'admin', TO_DATE('2021-01-05 17:03:47', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2021-12-15 05:01:33', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_DEPT" ("ID", "NAME", "PARENT_ID", "SORT", "LEADER_USER_ID", "PHONE", "EMAIL", "STATUS", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('108', '市场部门', '102', '1', NULL, '15888888888', 'ry@qq.com', '0', 'admin', TO_DATE('2021-01-05 17:03:47', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 08:35:45', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_DEPT" ("ID", "NAME", "PARENT_ID", "SORT", "LEADER_USER_ID", "PHONE", "EMAIL", "STATUS", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('109', '财务部门', '102', '2', NULL, '15888888888', 'ry@qq.com', '0', 'admin', TO_DATE('2021-01-05 17:03:47', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2021-12-15 05:01:29', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_DEPT" ("ID", "NAME", "PARENT_ID", "SORT", "LEADER_USER_ID", "PHONE", "EMAIL", "STATUS", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('110', '新部门', '0', '1', NULL, NULL, NULL, '0', '110', TO_DATE('2022-02-23 20:46:30', 'SYYYY-MM-DD HH24:MI:SS'), '110', TO_DATE('2022-02-23 20:46:30', 'SYYYY-MM-DD HH24:MI:SS'), '121', '0'); +INSERT INTO "SYSTEM_DEPT" ("ID", "NAME", "PARENT_ID", "SORT", "LEADER_USER_ID", "PHONE", "EMAIL", "STATUS", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('111', '顶级部门', '0', '1', NULL, NULL, NULL, '0', '113', TO_DATE('2022-03-07 21:44:50', 'SYYYY-MM-DD HH24:MI:SS'), '113', TO_DATE('2022-03-07 21:44:50', 'SYYYY-MM-DD HH24:MI:SS'), '122', '0'); +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for SYSTEM_DICT_DATA +-- ---------------------------- +DROP TABLE "SYSTEM_DICT_DATA"; +CREATE TABLE "SYSTEM_DICT_DATA" ( + "ID" NUMBER(20,0) NOT NULL, + "SORT" NUMBER(11,0) NOT NULL, + "LABEL" NVARCHAR2(100), + "VALUE" NVARCHAR2(100), + "DICT_TYPE" NVARCHAR2(100), + "STATUS" NUMBER(4,0) NOT NULL, + "COLOR_TYPE" NVARCHAR2(100), + "CSS_CLASS" NVARCHAR2(100), + "REMARK" NVARCHAR2(500), + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "DELETED" NUMBER(1,0) DEFAULT 0 NOT NULL +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "SYSTEM_DICT_DATA"."ID" IS '字典编码'; +COMMENT ON COLUMN "SYSTEM_DICT_DATA"."SORT" IS '字典排序'; +COMMENT ON COLUMN "SYSTEM_DICT_DATA"."LABEL" IS '字典标签'; +COMMENT ON COLUMN "SYSTEM_DICT_DATA"."VALUE" IS '字典键值'; +COMMENT ON COLUMN "SYSTEM_DICT_DATA"."DICT_TYPE" IS '字典类型'; +COMMENT ON COLUMN "SYSTEM_DICT_DATA"."STATUS" IS '状态(0正常 1停用)'; +COMMENT ON COLUMN "SYSTEM_DICT_DATA"."COLOR_TYPE" IS '颜色类型'; +COMMENT ON COLUMN "SYSTEM_DICT_DATA"."CSS_CLASS" IS 'css 样式'; +COMMENT ON COLUMN "SYSTEM_DICT_DATA"."REMARK" IS '备注'; +COMMENT ON COLUMN "SYSTEM_DICT_DATA"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "SYSTEM_DICT_DATA"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SYSTEM_DICT_DATA"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "SYSTEM_DICT_DATA"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "SYSTEM_DICT_DATA"."DELETED" IS '是否删除'; +COMMENT ON TABLE "SYSTEM_DICT_DATA" IS '字典数据表'; + +-- ---------------------------- +-- Records of SYSTEM_DICT_DATA +-- ---------------------------- +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1143', '20', '流程发起人的一级领导', '20', 'bpm_task_assign_script', '0', NULL, NULL, '任务分配自定义脚本 - 流程发起人的一级领导', '103', TO_DATE('2022-01-15 21:24:31', 'SYYYY-MM-DD HH24:MI:SS'), '103', TO_DATE('2022-01-15 21:24:31', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1144', '21', '流程发起人的二级领导', '21', 'bpm_task_assign_script', '0', NULL, NULL, '任务分配自定义脚本 - 流程发起人的二级领导', '103', TO_DATE('2022-01-15 21:24:46', 'SYYYY-MM-DD HH24:MI:SS'), '103', TO_DATE('2022-01-15 21:24:57', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1145', '1', '管理后台', '1', 'infra_codegen_scene', '0', NULL, NULL, '代码生成的场景枚举 - 管理后台', '1', TO_DATE('2022-02-02 13:15:06', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-10 16:32:59', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1146', '2', '用户 APP', '2', 'infra_codegen_scene', '0', NULL, NULL, '代码生成的场景枚举 - 用户 APP', '1', TO_DATE('2022-02-02 13:15:19', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-10 16:33:03', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1147', '0', '未退款', '0', 'pay_refund_order_type', '0', 'info', NULL, '退款类型 - 未退款', '1', TO_DATE('2022-02-16 14:09:01', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 14:09:01', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1148', '10', '部分退款', '10', 'pay_refund_order_type', '0', 'success', NULL, '退款类型 - 部分退款', '1', TO_DATE('2022-02-16 14:09:25', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 14:11:38', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1149', '20', '全部退款', '20', 'pay_refund_order_type', '0', 'warning', NULL, '退款类型 - 全部退款', '1', TO_DATE('2022-02-16 14:11:33', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 14:11:33', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1150', '1', '数据库', '1', 'infra_file_storage', '0', 'default', NULL, NULL, '1', TO_DATE('2022-03-15 00:25:28', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-15 00:25:28', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1151', '10', '本地磁盘', '10', 'infra_file_storage', '0', 'default', NULL, NULL, '1', TO_DATE('2022-03-15 00:25:41', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-15 00:25:56', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1152', '11', 'FTP 服务器', '11', 'infra_file_storage', '0', 'default', NULL, NULL, '1', TO_DATE('2022-03-15 00:26:06', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-15 00:26:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1153', '12', 'SFTP 服务器', '12', 'infra_file_storage', '0', 'default', NULL, NULL, '1', TO_DATE('2022-03-15 00:26:22', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-15 00:26:22', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1154', '20', 'S3 对象存储', '20', 'infra_file_storage', '0', 'default', NULL, NULL, '1', TO_DATE('2022-03-15 00:26:31', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-15 00:26:45', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1155', '103', '短信登录', '103', 'system_login_type', '0', 'default', NULL, NULL, '1', TO_DATE('2022-05-09 23:57:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-05-09 23:58:09', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1156', '1', 'password', 'password', 'system_oauth2_grant_type', '0', 'default', NULL, '密码模式', '1', TO_DATE('2022-05-12 00:22:05', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-05-11 16:26:01', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1157', '2', 'authorization_code', 'authorization_code', 'system_oauth2_grant_type', '0', 'primary', NULL, '授权码模式', '1', TO_DATE('2022-05-12 00:22:59', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-05-11 16:26:02', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1158', '3', 'implicit', 'implicit', 'system_oauth2_grant_type', '0', 'success', NULL, '简化模式', '1', TO_DATE('2022-05-12 00:23:40', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-05-11 16:26:05', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1159', '4', 'client_credentials', 'client_credentials', 'system_oauth2_grant_type', '0', 'default', NULL, '客户端模式', '1', TO_DATE('2022-05-12 00:23:51', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-05-11 16:26:08', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1160', '5', 'refresh_token', 'refresh_token', 'system_oauth2_grant_type', '0', 'info', NULL, '刷新模式', '1', TO_DATE('2022-05-12 00:24:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-05-11 16:26:11', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('79', '2', '手动编辑', '2', 'system_error_code_type', '0', 'primary', NULL, NULL, '1', TO_DATE('2021-04-21 00:07:14', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 13:57:24', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('80', '100', '账号登录', '100', 'system_login_type', '0', 'primary', NULL, '账号登录', '1', TO_DATE('2021-10-06 00:52:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 13:11:34', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('81', '101', '社交登录', '101', 'system_login_type', '0', 'info', NULL, '社交登录', '1', TO_DATE('2021-10-06 00:52:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 13:11:40', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('83', '200', '主动登出', '200', 'system_login_type', '0', 'primary', NULL, '主动登出', '1', TO_DATE('2021-10-06 00:52:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 13:11:49', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('85', '202', '强制登出', '202', 'system_login_type', '0', 'danger', NULL, '强制退出', '1', TO_DATE('2021-10-06 00:53:41', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 13:11:57', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('86', '0', '病假', '1', 'bpm_oa_leave_type', '0', 'primary', NULL, NULL, '1', TO_DATE('2021-09-21 22:35:28', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 10:00:41', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('87', '1', '事假', '2', 'bpm_oa_leave_type', '0', 'info', NULL, NULL, '1', TO_DATE('2021-09-21 22:36:11', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 10:00:49', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('88', '2', '婚假', '3', 'bpm_oa_leave_type', '0', 'warning', NULL, NULL, '1', TO_DATE('2021-09-21 22:36:38', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 10:00:53', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('98', '1', 'v2', 'v2', 'pay_channel_wechat_version', '0', NULL, NULL, 'v2版本', '1', TO_DATE('2021-11-08 17:00:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2021-11-08 17:00:58', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('99', '2', 'v3', 'v3', 'pay_channel_wechat_version', '0', NULL, NULL, 'v3版本', '1', TO_DATE('2021-11-08 17:01:07', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2021-11-08 17:01:07', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('108', '1', 'RSA2', 'RSA2', 'pay_channel_alipay_sign_type', '0', NULL, NULL, 'RSA2', '1', TO_DATE('2021-11-18 15:39:29', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2021-11-18 15:39:29', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('109', '1', '公钥模式', '1', 'pay_channel_alipay_mode', '0', NULL, NULL, '公钥模式:privateKey + alipayPublicKey', '1', TO_DATE('2021-11-18 15:45:23', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2021-11-18 15:45:23', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('110', '2', '证书模式', '2', 'pay_channel_alipay_mode', '0', NULL, NULL, '证书模式:appCertContent + alipayPublicCertContent + rootCertContent', '1', TO_DATE('2021-11-18 15:45:40', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2021-11-18 15:45:40', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('111', '1', '线上', 'https://openapi.alipay.com/gateway.do', 'pay_channel_alipay_server_type', '0', NULL, NULL, '网关地址 - 线上', '1', TO_DATE('2021-11-18 16:59:32', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2021-11-21 17:37:29', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('112', '2', '沙箱', 'https://openapi.alipaydev.com/gateway.do', 'pay_channel_alipay_server_type', '0', NULL, NULL, '网关地址 - 沙箱', '1', TO_DATE('2021-11-18 16:59:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2021-11-21 17:37:39', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('113', '1', '微信 JSAPI 支付', 'wx_pub', 'pay_channel_code_type', '0', NULL, NULL, '微信 JSAPI(公众号) 支付', '1', TO_DATE('2021-12-03 10:40:24', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2021-12-04 16:41:00', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('114', '2', '微信小程序支付', 'wx_lite', 'pay_channel_code_type', '0', NULL, NULL, '微信小程序支付', '1', TO_DATE('2021-12-03 10:41:06', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2021-12-03 10:41:06', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('115', '3', '微信 App 支付', 'wx_app', 'pay_channel_code_type', '0', NULL, NULL, '微信 App 支付', '1', TO_DATE('2021-12-03 10:41:20', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2021-12-03 10:41:20', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('116', '4', '支付宝 PC 网站支付', 'alipay_pc', 'pay_channel_code_type', '0', NULL, NULL, '支付宝 PC 网站支付', '1', TO_DATE('2021-12-03 10:42:09', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2021-12-03 10:42:09', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('117', '5', '支付宝 Wap 网站支付', 'alipay_wap', 'pay_channel_code_type', '0', NULL, NULL, '支付宝 Wap 网站支付', '1', TO_DATE('2021-12-03 10:42:26', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2021-12-03 10:42:26', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('118', '6', '支付宝App 支付', 'alipay_app', 'pay_channel_code_type', '0', NULL, NULL, '支付宝App 支付', '1', TO_DATE('2021-12-03 10:42:55', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2021-12-03 10:42:55', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('119', '7', '支付宝扫码支付', 'alipay_qr', 'pay_channel_code_type', '0', NULL, NULL, '支付宝扫码支付', '1', TO_DATE('2021-12-03 10:43:10', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2021-12-03 10:43:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('120', '1', '通知成功', '10', 'pay_order_notify_status', '0', 'success', NULL, '通知成功', '1', TO_DATE('2021-12-03 11:02:41', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 13:59:13', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('121', '2', '通知失败', '20', 'pay_order_notify_status', '0', 'danger', NULL, '通知失败', '1', TO_DATE('2021-12-03 11:02:59', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 13:59:17', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('122', '3', '未通知', '0', 'pay_order_notify_status', '0', 'info', NULL, '未通知', '1', TO_DATE('2021-12-03 11:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 13:59:23', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('123', '1', '支付成功', '10', 'pay_order_status', '0', 'success', NULL, '支付成功', '1', TO_DATE('2021-12-03 11:18:29', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 15:24:25', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('124', '2', '支付关闭', '20', 'pay_order_status', '0', 'danger', NULL, '支付关闭', '1', TO_DATE('2021-12-03 11:18:42', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 15:24:31', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('125', '3', '未支付', '0', 'pay_order_status', '0', 'info', NULL, '未支付', '1', TO_DATE('2021-12-03 11:18:18', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 15:24:35', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('126', '1', '未退款', '0', 'pay_order_refund_status', '0', NULL, NULL, '未退款', '1', TO_DATE('2021-12-03 11:30:35', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2021-12-03 11:34:05', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('127', '2', '部分退款', '10', 'pay_order_refund_status', '0', NULL, NULL, '部分退款', '1', TO_DATE('2021-12-03 11:30:44', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2021-12-03 11:34:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('128', '3', '全部退款', '20', 'pay_order_refund_status', '0', NULL, NULL, '全部退款', '1', TO_DATE('2021-12-03 11:30:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2021-12-03 11:34:14', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1117', '1', '退款订单生成', '0', 'pay_refund_order_status', '0', 'primary', NULL, '退款订单生成', '1', TO_DATE('2021-12-10 16:44:44', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 14:05:24', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1118', '2', '退款成功', '1', 'pay_refund_order_status', '0', 'success', NULL, '退款成功', '1', TO_DATE('2021-12-10 16:44:59', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 14:05:28', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1119', '3', '退款失败', '2', 'pay_refund_order_status', '0', 'danger', NULL, '退款失败', '1', TO_DATE('2021-12-10 16:45:10', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 14:05:34', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1124', '8', '退款关闭', '99', 'pay_refund_order_status', '0', 'info', NULL, '退款关闭', '1', TO_DATE('2021-12-10 16:46:26', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 14:05:40', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1125', '0', '默认', '1', 'bpm_model_category', '0', 'primary', NULL, '流程分类 - 默认', '1', TO_DATE('2022-01-02 08:41:11', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 20:01:42', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1126', '0', 'OA', '2', 'bpm_model_category', '0', 'success', NULL, '流程分类 - OA', '1', TO_DATE('2022-01-02 08:41:22', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 20:01:50', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1127', '0', '进行中', '1', 'bpm_process_instance_status', '0', 'primary', NULL, '流程实例的状态 - 进行中', '1', TO_DATE('2022-01-07 23:47:22', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 20:07:49', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1128', '2', '已完成', '2', 'bpm_process_instance_status', '0', 'success', NULL, '流程实例的状态 - 已完成', '1', TO_DATE('2022-01-07 23:47:49', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 20:07:54', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1129', '1', '处理中', '1', 'bpm_process_instance_result', '0', 'primary', NULL, '流程实例的结果 - 处理中', '1', TO_DATE('2022-01-07 23:48:32', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 09:53:26', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1130', '2', '通过', '2', 'bpm_process_instance_result', '0', 'success', NULL, '流程实例的结果 - 通过', '1', TO_DATE('2022-01-07 23:48:45', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 09:53:31', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1131', '3', '不通过', '3', 'bpm_process_instance_result', '0', 'danger', NULL, '流程实例的结果 - 不通过', '1', TO_DATE('2022-01-07 23:48:55', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 09:53:38', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1132', '4', '已取消', '4', 'bpm_process_instance_result', '0', 'info', NULL, '流程实例的结果 - 撤销', '1', TO_DATE('2022-01-07 23:49:06', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 09:53:42', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1133', '10', '流程表单', '10', 'bpm_model_form_type', '0', NULL, NULL, '流程的表单类型 - 流程表单', '103', TO_DATE('2022-01-11 23:51:30', 'SYYYY-MM-DD HH24:MI:SS'), '103', TO_DATE('2022-01-11 23:51:30', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1134', '20', '业务表单', '20', 'bpm_model_form_type', '0', NULL, NULL, '流程的表单类型 - 业务表单', '103', TO_DATE('2022-01-11 23:51:47', 'SYYYY-MM-DD HH24:MI:SS'), '103', TO_DATE('2022-01-11 23:51:47', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1135', '10', '角色', '10', 'bpm_task_assign_rule_type', '0', 'info', NULL, '任务分配规则的类型 - 角色', '103', TO_DATE('2022-01-12 23:21:22', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 20:06:14', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1136', '20', '部门的成员', '20', 'bpm_task_assign_rule_type', '0', 'primary', NULL, '任务分配规则的类型 - 部门的成员', '103', TO_DATE('2022-01-12 23:21:47', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 20:05:28', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1137', '21', '部门的负责人', '21', 'bpm_task_assign_rule_type', '0', 'primary', NULL, '任务分配规则的类型 - 部门的负责人', '103', TO_DATE('2022-01-12 23:33:36', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 20:05:31', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1138', '30', '用户', '30', 'bpm_task_assign_rule_type', '0', 'info', NULL, '任务分配规则的类型 - 用户', '103', TO_DATE('2022-01-12 23:34:02', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 20:05:50', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1139', '40', '用户组', '40', 'bpm_task_assign_rule_type', '0', 'warning', NULL, '任务分配规则的类型 - 用户组', '103', TO_DATE('2022-01-12 23:34:21', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 20:05:57', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1140', '50', '自定义脚本', '50', 'bpm_task_assign_rule_type', '0', 'danger', NULL, '任务分配规则的类型 - 自定义脚本', '103', TO_DATE('2022-01-12 23:34:43', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 20:06:01', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1141', '22', '岗位', '22', 'bpm_task_assign_rule_type', '0', 'success', NULL, '任务分配规则的类型 - 岗位', '103', TO_DATE('2022-01-14 18:41:55', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 20:05:39', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1142', '10', '流程发起人', '10', 'bpm_task_assign_script', '0', NULL, NULL, '任务分配自定义脚本 - 流程发起人', '103', TO_DATE('2022-01-15 00:10:57', 'SYYYY-MM-DD HH24:MI:SS'), '103', TO_DATE('2022-01-15 21:24:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1', '1', '男', '1', 'system_user_sex', '0', 'default', 'A', '性别男', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-29 00:14:39', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('2', '2', '女', '2', 'system_user_sex', '1', 'success', NULL, '性别女', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 01:30:51', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('8', '1', '正常', '1', 'infra_job_status', '0', 'success', NULL, '正常状态', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 19:33:38', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('9', '2', '暂停', '2', 'infra_job_status', '0', 'danger', NULL, '停用状态', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 19:33:45', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('12', '1', '系统内置', '1', 'infra_config_type', '0', 'danger', NULL, '参数类型 - 系统内置', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 19:06:02', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('13', '2', '自定义', '2', 'infra_config_type', '0', 'primary', NULL, '参数类型 - 自定义', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 19:06:07', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('14', '1', '通知', '1', 'system_notice_type', '0', 'success', NULL, '通知', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 13:05:57', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('15', '2', '公告', '2', 'system_notice_type', '0', 'info', NULL, '公告', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 13:06:01', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('16', '0', '其它', '0', 'system_operate_type', '0', 'default', NULL, '其它操作', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 09:32:46', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('17', '1', '查询', '1', 'system_operate_type', '0', 'info', NULL, '查询操作', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 09:33:16', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('18', '2', '新增', '2', 'system_operate_type', '0', 'primary', NULL, '新增操作', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 09:33:13', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('19', '3', '修改', '3', 'system_operate_type', '0', 'warning', NULL, '修改操作', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 09:33:22', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('20', '4', '删除', '4', 'system_operate_type', '0', 'danger', NULL, '删除操作', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 09:33:27', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('22', '5', '导出', '5', 'system_operate_type', '0', 'default', NULL, '导出操作', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 09:33:32', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('23', '6', '导入', '6', 'system_operate_type', '0', 'default', NULL, '导入操作', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 09:33:35', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('27', '1', '开启', '0', 'common_status', '0', 'primary', NULL, '开启状态', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 08:00:39', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('28', '2', '关闭', '1', 'common_status', '0', 'info', NULL, '关闭状态', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 08:00:44', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('29', '1', '目录', '1', 'system_menu_type', '0', NULL, NULL, '目录', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-02-01 16:43:45', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('30', '2', '菜单', '2', 'system_menu_type', '0', NULL, NULL, '菜单', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-02-01 16:43:41', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('31', '3', '按钮', '3', 'system_menu_type', '0', NULL, NULL, '按钮', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-02-01 16:43:39', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('32', '1', '内置', '1', 'system_role_type', '0', 'danger', NULL, '内置角色', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 13:02:08', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('33', '2', '自定义', '2', 'system_role_type', '0', 'primary', NULL, '自定义角色', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 13:02:12', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('34', '1', '全部数据权限', '1', 'system_data_scope', '0', NULL, NULL, '全部数据权限', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-02-01 16:47:17', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('35', '2', '指定部门数据权限', '2', 'system_data_scope', '0', NULL, NULL, '指定部门数据权限', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-02-01 16:47:18', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('36', '3', '本部门数据权限', '3', 'system_data_scope', '0', NULL, NULL, '本部门数据权限', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-02-01 16:47:16', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('37', '4', '本部门及以下数据权限', '4', 'system_data_scope', '0', NULL, NULL, '本部门及以下数据权限', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-02-01 16:47:21', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('38', '5', '仅本人数据权限', '5', 'system_data_scope', '0', NULL, NULL, '仅本人数据权限', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-02-01 16:47:23', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('39', '0', '成功', '0', 'system_login_result', '0', 'success', NULL, '登陆结果 - 成功', NULL, TO_DATE('2021-01-18 06:17:36', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 13:23:49', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('40', '10', '账号或密码不正确', '10', 'system_login_result', '0', 'primary', NULL, '登陆结果 - 账号或密码不正确', NULL, TO_DATE('2021-01-18 06:17:54', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 13:24:27', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('41', '20', '用户被禁用', '20', 'system_login_result', '0', 'warning', NULL, '登陆结果 - 用户被禁用', NULL, TO_DATE('2021-01-18 06:17:54', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 13:23:57', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('42', '30', '验证码不存在', '30', 'system_login_result', '0', 'info', NULL, '登陆结果 - 验证码不存在', NULL, TO_DATE('2021-01-18 06:17:54', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 13:24:07', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('43', '31', '验证码不正确', '31', 'system_login_result', '0', 'info', NULL, '登陆结果 - 验证码不正确', NULL, TO_DATE('2021-01-18 06:17:54', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 13:24:11', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('44', '100', '未知异常', '100', 'system_login_result', '0', 'danger', NULL, '登陆结果 - 未知异常', NULL, TO_DATE('2021-01-18 06:17:54', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 13:24:23', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('45', '1', '是', 'true', 'infra_boolean_string', '0', 'danger', NULL, 'Boolean 是否类型 - 是', NULL, TO_DATE('2021-01-19 03:20:55', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-15 23:01:45', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('46', '1', '否', 'false', 'infra_boolean_string', '0', 'info', NULL, 'Boolean 是否类型 - 否', NULL, TO_DATE('2021-01-19 03:20:55', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-15 23:09:45', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('47', '1', '永不超时', '1', 'infra_redis_timeout_type', '0', 'primary', NULL, 'Redis 未设置超时的情况', NULL, TO_DATE('2021-01-26 00:53:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 19:03:35', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('48', '1', '动态超时', '2', 'infra_redis_timeout_type', '0', 'info', NULL, '程序里动态传入超时时间,无法固定', NULL, TO_DATE('2021-01-26 00:55:00', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 19:03:41', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('49', '3', '固定超时', '3', 'infra_redis_timeout_type', '0', 'success', NULL, 'Redis 设置了过期时间', NULL, TO_DATE('2021-01-26 00:55:26', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 19:03:45', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('50', '1', '单表(增删改查)', '1', 'infra_codegen_template_type', '0', NULL, NULL, NULL, NULL, TO_DATE('2021-02-05 07:09:06', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-03-10 16:33:15', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('51', '2', '树表(增删改查)', '2', 'infra_codegen_template_type', '0', NULL, NULL, NULL, NULL, TO_DATE('2021-02-05 07:14:46', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-03-10 16:33:19', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('53', '0', '初始化中', '0', 'infra_job_status', '0', 'primary', NULL, NULL, NULL, TO_DATE('2021-02-07 07:46:49', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 19:33:29', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('57', '0', '运行中', '0', 'infra_job_log_status', '0', 'primary', NULL, 'RUNNING', NULL, TO_DATE('2021-02-08 10:04:24', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 19:07:48', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('58', '1', '成功', '1', 'infra_job_log_status', '0', 'success', NULL, NULL, NULL, TO_DATE('2021-02-08 10:06:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 19:07:52', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('59', '2', '失败', '2', 'infra_job_log_status', '0', 'warning', NULL, '失败', NULL, TO_DATE('2021-02-08 10:07:38', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 19:07:56', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('60', '1', '会员', '1', 'user_type', '0', 'primary', NULL, NULL, NULL, TO_DATE('2021-02-26 00:16:27', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 10:22:19', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('61', '2', '管理员', '2', 'user_type', '0', 'success', NULL, NULL, NULL, TO_DATE('2021-02-26 00:16:34', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 10:22:22', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('62', '0', '未处理', '0', 'infra_api_error_log_process_status', '0', 'primary', NULL, NULL, NULL, TO_DATE('2021-02-26 07:07:19', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 20:14:17', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('63', '1', '已处理', '1', 'infra_api_error_log_process_status', '0', 'success', NULL, NULL, NULL, TO_DATE('2021-02-26 07:07:26', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 20:14:08', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('64', '2', '已忽略', '2', 'infra_api_error_log_process_status', '0', 'danger', NULL, NULL, NULL, TO_DATE('2021-02-26 07:07:34', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 20:14:14', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('66', '2', '阿里云', 'ALIYUN', 'system_sms_channel_code', '0', 'primary', NULL, NULL, '1', TO_DATE('2021-04-05 01:05:26', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 10:09:52', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('67', '1', '验证码', '1', 'system_sms_template_type', '0', 'warning', NULL, NULL, '1', TO_DATE('2021-04-05 21:50:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 12:48:30', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('68', '2', '通知', '2', 'system_sms_template_type', '0', 'primary', NULL, NULL, '1', TO_DATE('2021-04-05 21:51:08', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 12:48:27', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('69', '0', '营销', '3', 'system_sms_template_type', '0', 'danger', NULL, NULL, '1', TO_DATE('2021-04-05 21:51:15', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 12:48:22', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('70', '0', '初始化', '0', 'system_sms_send_status', '0', 'primary', NULL, NULL, '1', TO_DATE('2021-04-11 20:18:33', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 10:26:07', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('71', '1', '发送成功', '10', 'system_sms_send_status', '0', 'success', NULL, NULL, '1', TO_DATE('2021-04-11 20:18:43', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 10:25:56', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('72', '2', '发送失败', '20', 'system_sms_send_status', '0', 'danger', NULL, NULL, '1', TO_DATE('2021-04-11 20:18:49', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 10:26:03', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('73', '3', '不发送', '30', 'system_sms_send_status', '0', 'info', NULL, NULL, '1', TO_DATE('2021-04-11 20:19:44', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 10:26:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('74', '0', '等待结果', '0', 'system_sms_receive_status', '0', 'primary', NULL, NULL, '1', TO_DATE('2021-04-11 20:27:43', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 10:28:24', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('75', '1', '接收成功', '10', 'system_sms_receive_status', '0', 'success', NULL, NULL, '1', TO_DATE('2021-04-11 20:29:25', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 10:28:28', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('76', '2', '接收失败', '20', 'system_sms_receive_status', '0', 'danger', NULL, NULL, '1', TO_DATE('2021-04-11 20:29:31', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 10:28:32', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('77', '0', '调试(钉钉)', 'DEBUG_DING_TALK', 'system_sms_channel_code', '0', 'info', NULL, NULL, '1', TO_DATE('2021-04-13 00:20:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 10:10:00', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_DATA" ("ID", "SORT", "LABEL", "VALUE", "DICT_TYPE", "STATUS", "COLOR_TYPE", "CSS_CLASS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('78', '1', '自动生成', '1', 'system_error_code_type', '0', 'warning', NULL, NULL, '1', TO_DATE('2021-04-21 00:06:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 13:57:20', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for SYSTEM_DICT_TYPE +-- ---------------------------- +DROP TABLE "SYSTEM_DICT_TYPE"; +CREATE TABLE "SYSTEM_DICT_TYPE"( + "ID" NUMBER(20,0) NOT NULL, + "NAME" NVARCHAR2(100), + "TYPE" NVARCHAR2(100), + "STATUS" NUMBER(4,0) NOT NULL, + "REMARK" NVARCHAR2(500), + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "DELETED_TIME" DATE, + "DELETED" NUMBER(1,0) DEFAULT 0 NOT NULL +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT +ON COLUMN "SYSTEM_DICT_TYPE"."ID" IS '字典主键'; +COMMENT +ON COLUMN "SYSTEM_DICT_TYPE"."NAME" IS '字典名称'; +COMMENT +ON COLUMN "SYSTEM_DICT_TYPE"."TYPE" IS '字典类型'; +COMMENT +ON COLUMN "SYSTEM_DICT_TYPE"."STATUS" IS '状态(0正常 1停用)'; +COMMENT +ON COLUMN "SYSTEM_DICT_TYPE"."REMARK" IS '备注'; +COMMENT +ON COLUMN "SYSTEM_DICT_TYPE"."CREATOR" IS '创建者'; +COMMENT +ON COLUMN "SYSTEM_DICT_TYPE"."CREATE_TIME" IS '创建时间'; +COMMENT +ON COLUMN "SYSTEM_DICT_TYPE"."UPDATER" IS '更新者'; +COMMENT +ON COLUMN "SYSTEM_DICT_TYPE"."UPDATE_TIME" IS '更新时间'; +COMMENT +ON COLUMN "SYSTEM_DICT_TYPE"."DELETED_TIME" IS '删除时间'; +COMMENT +ON COLUMN "SYSTEM_DICT_TYPE"."DELETED" IS '是否删除'; +COMMENT +ON TABLE "SYSTEM_DICT_TYPE" IS '字典类型表'; + +-- ---------------------------- +-- Records of SYSTEM_DICT_TYPE +-- ---------------------------- +INSERT INTO "SYSTEM_DICT_TYPE" ("ID", "NAME", "TYPE", "STATUS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", + "UPDATE_TIME", "DELETED") +VALUES ('1', '用户性别', 'system_user_sex', '0', NULL, 'admin', + TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', + TO_DATE('2022-05-01 12:55:56', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_TYPE" ("ID", "NAME", "TYPE", "STATUS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", + "UPDATE_TIME", "DELETED") +VALUES ('6', '参数类型', 'infra_config_type', '0', NULL, 'admin', + TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), NULL, + TO_DATE('2022-02-01 16:36:54', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_TYPE" ("ID", "NAME", "TYPE", "STATUS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", + "UPDATE_TIME", "DELETED") +VALUES ('7', '通知类型', 'system_notice_type', '0', NULL, 'admin', + TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), NULL, + TO_DATE('2022-02-01 16:35:26', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_TYPE" ("ID", "NAME", "TYPE", "STATUS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", + "UPDATE_TIME", "DELETED") +VALUES ('9', '操作类型', 'system_operate_type', '0', NULL, 'admin', + TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', + TO_DATE('2022-02-16 09:32:21', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_TYPE" ("ID", "NAME", "TYPE", "STATUS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('10', '系统状态', 'common_status', '0', NULL, 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-02-01 16:21:28', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_TYPE" ("ID", "NAME", "TYPE", "STATUS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('11', 'Boolean 是否类型', 'infra_boolean_string', '0', 'boolean 转是否', NULL, TO_DATE('2021-01-19 03:20:08', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-02-01 16:37:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_TYPE" ("ID", "NAME", "TYPE", "STATUS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('104', '登陆结果', 'system_login_result', '0', '登陆结果', NULL, TO_DATE('2021-01-18 06:17:11', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-02-01 16:36:00', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_TYPE" ("ID", "NAME", "TYPE", "STATUS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('105', 'Redis 超时类型', 'infra_redis_timeout_type', '0', 'RedisKeyDefine.TimeoutTypeEnum', NULL, TO_DATE('2021-01-26 00:52:50', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-02-01 16:50:29', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_TYPE" ("ID", "NAME", "TYPE", "STATUS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('106', '代码生成模板类型', 'infra_codegen_template_type', '0', NULL, NULL, TO_DATE('2021-02-05 07:08:06', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-03-10 16:33:42', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_TYPE" ("ID", "NAME", "TYPE", "STATUS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('107', '定时任务状态', 'infra_job_status', '0', NULL, NULL, TO_DATE('2021-02-07 07:44:16', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-02-01 16:51:11', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_TYPE" ("ID", "NAME", "TYPE", "STATUS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('108', '定时任务日志状态', 'infra_job_log_status', '0', NULL, NULL, TO_DATE('2021-02-08 10:03:51', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-02-01 16:50:43', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_TYPE" ("ID", "NAME", "TYPE", "STATUS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('109', '用户类型', 'user_type', '0', NULL, NULL, TO_DATE('2021-02-26 00:15:51', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2021-02-26 00:15:51', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_TYPE" ("ID", "NAME", "TYPE", "STATUS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('110', 'API 异常数据的处理状态', 'infra_api_error_log_process_status', '0', NULL, NULL, TO_DATE('2021-02-26 07:07:01', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-02-01 16:50:53', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_TYPE" ("ID", "NAME", "TYPE", "STATUS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('111', '短信渠道编码', 'system_sms_channel_code', '0', NULL, '1', TO_DATE('2021-04-05 01:04:50', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 02:09:08', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_TYPE" ("ID", "NAME", "TYPE", "STATUS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('112', '短信模板的类型', 'system_sms_template_type', '0', NULL, '1', TO_DATE('2021-04-05 21:50:43', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-01 16:35:06', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_TYPE" ("ID", "NAME", "TYPE", "STATUS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('113', '短信发送状态', 'system_sms_send_status', '0', NULL, '1', TO_DATE('2021-04-11 20:18:03', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-01 16:35:09', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_TYPE" ("ID", "NAME", "TYPE", "STATUS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('114', '短信接收状态', 'system_sms_receive_status', '0', NULL, '1', TO_DATE('2021-04-11 20:27:14', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-01 16:35:14', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_TYPE" ("ID", "NAME", "TYPE", "STATUS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('115', '错误码的类型', 'system_error_code_type', '0', NULL, '1', TO_DATE('2021-04-21 00:06:30', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-01 16:36:49', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_TYPE" ("ID", "NAME", "TYPE", "STATUS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('116', '登陆日志的类型', 'system_login_type', '0', '登陆日志的类型', '1', TO_DATE('2021-10-06 00:50:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-01 16:35:56', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_TYPE" ("ID", "NAME", "TYPE", "STATUS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('117', 'OA 请假类型', 'bpm_oa_leave_type', '0', NULL, '1', TO_DATE('2021-09-21 22:34:33', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-01-22 10:41:37', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_TYPE" ("ID", "NAME", "TYPE", "STATUS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('122', '支付渠道微信版本', 'pay_channel_wechat_version', '0', '支付渠道微信版本', '1', TO_DATE('2021-11-08 17:00:26', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2021-11-08 17:00:26', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_TYPE" ("ID", "NAME", "TYPE", "STATUS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('127', '支付渠道支付宝算法类型', 'pay_channel_alipay_sign_type', '0', '支付渠道支付宝算法类型', '1', TO_DATE('2021-11-18 15:39:09', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2021-11-18 15:39:09', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_TYPE" ("ID", "NAME", "TYPE", "STATUS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('128', '支付渠道支付宝公钥类型', 'pay_channel_alipay_mode', '0', '支付渠道支付宝公钥类型', '1', TO_DATE('2021-11-18 15:44:28', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2021-11-18 15:44:28', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_TYPE" ("ID", "NAME", "TYPE", "STATUS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('129', '支付宝网关地址', 'pay_channel_alipay_server_type', '0', '支付宝网关地址', '1', TO_DATE('2021-11-18 16:58:55', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2021-11-18 17:01:34', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_TYPE" ("ID", "NAME", "TYPE", "STATUS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('130', '支付渠道编码类型', 'pay_channel_code_type', '0', '支付渠道的编码', '1', TO_DATE('2021-12-03 10:35:08', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2021-12-03 10:35:08', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_TYPE" ("ID", "NAME", "TYPE", "STATUS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('131', '支付订单回调状态', 'pay_order_notify_status', '0', '支付订单回调状态', '1', TO_DATE('2021-12-03 10:53:29', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2021-12-03 10:53:29', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_TYPE" ("ID", "NAME", "TYPE", "STATUS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('132', '支付订单状态', 'pay_order_status', '0', '支付订单状态', '1', TO_DATE('2021-12-03 11:17:50', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2021-12-03 11:17:50', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_TYPE" ("ID", "NAME", "TYPE", "STATUS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('133', '支付订单退款状态', 'pay_order_refund_status', '0', '支付订单退款状态', '1', TO_DATE('2021-12-03 11:27:31', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2021-12-03 11:27:31', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_TYPE" ("ID", "NAME", "TYPE", "STATUS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('134', '退款订单状态', 'pay_refund_order_status', '0', '退款订单状态', '1', TO_DATE('2021-12-10 16:42:50', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2021-12-10 16:42:50', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_TYPE" ("ID", "NAME", "TYPE", "STATUS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('135', '退款订单类别', 'pay_refund_order_type', '0', '退款订单类别', '1', TO_DATE('2021-12-10 17:14:53', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2021-12-10 17:14:53', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_TYPE" ("ID", "NAME", "TYPE", "STATUS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('138', '流程分类', 'bpm_model_category', '0', '流程分类', '1', TO_DATE('2022-01-02 08:40:45', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-01-02 08:40:45', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_TYPE" ("ID", "NAME", "TYPE", "STATUS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('139', '流程实例的状态', 'bpm_process_instance_status', '0', '流程实例的状态', '1', TO_DATE('2022-01-07 23:46:42', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-01-07 23:46:42', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_TYPE" ("ID", "NAME", "TYPE", "STATUS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('140', '流程实例的结果', 'bpm_process_instance_result', '0', '流程实例的结果', '1', TO_DATE('2022-01-07 23:48:10', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-01-07 23:48:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_TYPE" ("ID", "NAME", "TYPE", "STATUS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('141', '流程的表单类型', 'bpm_model_form_type', '0', '流程的表单类型', '103', TO_DATE('2022-01-11 23:50:45', 'SYYYY-MM-DD HH24:MI:SS'), '103', TO_DATE('2022-01-11 23:50:45', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_TYPE" ("ID", "NAME", "TYPE", "STATUS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('142', '任务分配规则的类型', 'bpm_task_assign_rule_type', '0', '任务分配规则的类型', '103', TO_DATE('2022-01-12 23:21:04', 'SYYYY-MM-DD HH24:MI:SS'), '103', TO_DATE('2022-01-12 15:46:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_TYPE" ("ID", "NAME", "TYPE", "STATUS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('143', '任务分配自定义脚本', 'bpm_task_assign_script', '0', '任务分配自定义脚本', '103', TO_DATE('2022-01-15 00:10:35', 'SYYYY-MM-DD HH24:MI:SS'), '103', TO_DATE('2022-01-15 00:10:35', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_TYPE" ("ID", "NAME", "TYPE", "STATUS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('144', '代码生成的场景枚举', 'infra_codegen_scene', '0', '代码生成的场景枚举', '1', TO_DATE('2022-02-02 13:14:45', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-10 16:33:46', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_TYPE" ("ID", "NAME", "TYPE", "STATUS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('145', '角色类型', 'system_role_type', '0', '角色类型', '1', TO_DATE('2022-02-16 13:01:46', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-16 13:01:46', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_DICT_TYPE" ("ID", "NAME", "TYPE", "STATUS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('146', '文件存储器', 'infra_file_storage', '0', '文件存储器', '1', TO_DATE('2022-03-15 00:24:38', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-15 00:24:38', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for SYSTEM_ERROR_CODE +-- ---------------------------- +DROP TABLE "SYSTEM_ERROR_CODE"; +CREATE TABLE "SYSTEM_ERROR_CODE" ( + "ID" NUMBER(20,0) NOT NULL, + "TYPE" NUMBER(4,0) NOT NULL, + "APPLICATION_NAME" NVARCHAR2(50), + "CODE" NUMBER(11,0) NOT NULL, + "MESSAGE" NVARCHAR2(512), + "MEMO" NVARCHAR2(512), + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "DELETED" NUMBER(1,0) DEFAULT 0 NOT NULL +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "SYSTEM_ERROR_CODE"."ID" IS '错误码编号'; +COMMENT ON COLUMN "SYSTEM_ERROR_CODE"."TYPE" IS '错误码类型'; +COMMENT ON COLUMN "SYSTEM_ERROR_CODE"."APPLICATION_NAME" IS '应用名'; +COMMENT ON COLUMN "SYSTEM_ERROR_CODE"."CODE" IS '错误码编码'; +COMMENT ON COLUMN "SYSTEM_ERROR_CODE"."MESSAGE" IS '错误码错误提示'; +COMMENT ON COLUMN "SYSTEM_ERROR_CODE"."MEMO" IS '备注'; +COMMENT ON COLUMN "SYSTEM_ERROR_CODE"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "SYSTEM_ERROR_CODE"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SYSTEM_ERROR_CODE"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "SYSTEM_ERROR_CODE"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "SYSTEM_ERROR_CODE"."DELETED" IS '是否删除'; +COMMENT ON TABLE "SYSTEM_ERROR_CODE" IS '错误码表'; + +-- ---------------------------- +-- Records of SYSTEM_ERROR_CODE +-- ---------------------------- +INSERT INTO "SYSTEM_ERROR_CODE" ("ID", "TYPE", "APPLICATION_NAME", "CODE", "MESSAGE", "MEMO", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('0', '1', 'win-server', '1001007000', '数据源配置不存在', NULL, NULL, TO_DATE('2022-05-01 01:08:31', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-05-01 01:08:31', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_ERROR_CODE" ("ID", "TYPE", "APPLICATION_NAME", "CODE", "MESSAGE", "MEMO", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('0', '1', 'win-server', '1009000002', '获取高亮流程图异常', NULL, NULL, TO_DATE('2022-05-13 01:26:47', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-05-13 01:26:47', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for SYSTEM_LOGIN_LOG +-- ---------------------------- +DROP TABLE "SYSTEM_LOGIN_LOG"; +CREATE TABLE "SYSTEM_LOGIN_LOG" ( + "ID" NUMBER(20,0) NOT NULL, + "LOG_TYPE" NUMBER(20,0) NOT NULL, + "TRACE_ID" NVARCHAR2(64), + "USER_ID" NUMBER(20,0) NOT NULL, + "USER_TYPE" NUMBER(4,0) NOT NULL, + "USERNAME" NVARCHAR2(50), + "RESULT" NUMBER(4,0) NOT NULL, + "USER_IP" NVARCHAR2(50), + "USER_AGENT" NVARCHAR2(512), + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "TENANT_ID" NUMBER(20,0) NOT NULL, + "DELETED" NUMBER(1,0) DEFAULT 0 NOT NULL +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "SYSTEM_LOGIN_LOG"."ID" IS '访问ID'; +COMMENT ON COLUMN "SYSTEM_LOGIN_LOG"."LOG_TYPE" IS '日志类型'; +COMMENT ON COLUMN "SYSTEM_LOGIN_LOG"."TRACE_ID" IS '链路追踪编号'; +COMMENT ON COLUMN "SYSTEM_LOGIN_LOG"."USER_ID" IS '用户编号'; +COMMENT ON COLUMN "SYSTEM_LOGIN_LOG"."USER_TYPE" IS '用户类型'; +COMMENT ON COLUMN "SYSTEM_LOGIN_LOG"."USERNAME" IS '用户账号'; +COMMENT ON COLUMN "SYSTEM_LOGIN_LOG"."RESULT" IS '登陆结果'; +COMMENT ON COLUMN "SYSTEM_LOGIN_LOG"."USER_IP" IS '用户 IP'; +COMMENT ON COLUMN "SYSTEM_LOGIN_LOG"."USER_AGENT" IS '浏览器 UA'; +COMMENT ON COLUMN "SYSTEM_LOGIN_LOG"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "SYSTEM_LOGIN_LOG"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SYSTEM_LOGIN_LOG"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "SYSTEM_LOGIN_LOG"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "SYSTEM_LOGIN_LOG"."TENANT_ID" IS '租户编号'; +COMMENT ON COLUMN "SYSTEM_LOGIN_LOG"."DELETED" IS '是否删除'; +COMMENT ON TABLE "SYSTEM_LOGIN_LOG" IS '系统访问记录'; + +-- ---------------------------- +-- Records of SYSTEM_LOGIN_LOG +-- ---------------------------- +INSERT INTO "SYSTEM_LOGIN_LOG" ("ID", "LOG_TYPE", "TRACE_ID", "USER_ID", "USER_TYPE", "USERNAME", "RESULT", "USER_IP", "USER_AGENT", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('0', '100', NULL, '1', '2', 'admin', '0', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36', NULL, TO_DATE('2022-05-13 01:27:36', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-05-13 01:27:36', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for SYSTEM_MENU +-- ---------------------------- +DROP TABLE "SYSTEM_MENU"; +CREATE TABLE "SYSTEM_MENU" ( + "ID" NUMBER(20,0) NOT NULL, + "NAME" NVARCHAR2(50) NOT NULL, + "PERMISSION" NVARCHAR2(100), + "TYPE" NUMBER(6,0) NOT NULL, + "SORT" NUMBER(11,0) NOT NULL, + "PARENT_ID" NUMBER(20,0) NOT NULL, + "PATH" NVARCHAR2(200), + "ICON" NVARCHAR2(100), + "COMPONENT" NVARCHAR2(255), + "STATUS" NUMBER(6,0) NOT NULL, + "VISIBLE" NVARCHAR2(4) NOT NULL, + "KEEP_ALIVE" NVARCHAR2(4) NOT NULL, + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "DELETED" NUMBER(6,0) NOT NULL +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "SYSTEM_MENU"."ID" IS '菜单ID'; +COMMENT ON COLUMN "SYSTEM_MENU"."NAME" IS '菜单名称'; +COMMENT ON COLUMN "SYSTEM_MENU"."PERMISSION" IS '权限标识'; +COMMENT ON COLUMN "SYSTEM_MENU"."TYPE" IS '菜单类型'; +COMMENT ON COLUMN "SYSTEM_MENU"."SORT" IS '显示顺序'; +COMMENT ON COLUMN "SYSTEM_MENU"."PARENT_ID" IS '父菜单ID'; +COMMENT ON COLUMN "SYSTEM_MENU"."PATH" IS '路由地址'; +COMMENT ON COLUMN "SYSTEM_MENU"."ICON" IS '菜单图标'; +COMMENT ON COLUMN "SYSTEM_MENU"."COMPONENT" IS '组件路径'; +COMMENT ON COLUMN "SYSTEM_MENU"."STATUS" IS '菜单状态'; +COMMENT ON COLUMN "SYSTEM_MENU"."VISIBLE" IS '是否可见'; +COMMENT ON COLUMN "SYSTEM_MENU"."KEEP_ALIVE" IS '是否缓存'; +COMMENT ON COLUMN "SYSTEM_MENU"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "SYSTEM_MENU"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SYSTEM_MENU"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "SYSTEM_MENU"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "SYSTEM_MENU"."DELETED" IS '是否删除'; +COMMENT ON TABLE "SYSTEM_MENU" IS '菜单权限表'; + +-- ---------------------------- +-- Records of SYSTEM_MENU +-- ---------------------------- +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1', '系统管理', NULL, '1', '10', '0', '/system', 'system', NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-05-12 18:11:34', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('2', '基础设施', NULL, '1', '20', '0', '/infra', 'monitor', NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-05-12 18:11:34', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('5', 'OA 示例', NULL, '1', '40', '1185', 'oa', 'people', NULL, '0', '1', '1', 'admin', TO_DATE('2021-09-20 16:26:19', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-05-12 18:11:34', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('100', '用户管理', 'system:user:list', '2', '1', '1', 'user', 'user', 'system/user/index', '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('101', '角色管理', NULL, '2', '2', '1', 'role', 'peoples', 'system/role/index', '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('102', '菜单管理', NULL, '2', '3', '1', 'menu', 'tree-table', 'system/menu/index', '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('103', '部门管理', NULL, '2', '4', '1', 'dept', 'tree', 'system/dept/index', '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('104', '岗位管理', NULL, '2', '5', '1', 'post', 'post', 'system/post/index', '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('105', '字典管理', NULL, '2', '6', '1', 'dict', 'dict', 'system/dict/index', '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('106', '配置管理', NULL, '2', '6', '2', 'config', 'edit', 'infra/config/index', '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('107', '通知公告', NULL, '2', '8', '1', 'notice', 'message', 'system/notice/index', '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('108', '审计日志', NULL, '1', '9', '1', 'log', 'log', NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('109', '令牌管理', NULL, '2', '2', '1261', 'token', 'online', 'system/oauth2/token/index', '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-05-11 23:31:42', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('110', '定时任务', NULL, '2', '12', '2', 'job', 'job', 'infra/job/index', '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('111', 'MySQL 监控', NULL, '2', '9', '2', 'druid', 'druid', 'infra/druid/index', '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('112', 'Java 监控', NULL, '2', '11', '2', 'admin-server', 'server', 'infra/server/index', '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('113', 'Redis 监控', NULL, '2', '10', '2', 'redis', 'redis', 'infra/redis/index', '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('114', '表单构建', 'infra:build:list', '2', '2', '2', 'build', 'build', 'infra/build/index', '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('115', '代码生成', 'infra:codegen:query', '2', '1', '2', 'codegen', 'code', 'infra/codegen/index', '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('116', '系统接口', 'infra:swagger:list', '2', '3', '2', 'swagger', 'swagger', 'infra/swagger/index', '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('500', '操作日志', NULL, '2', '1', '108', 'operate-log', 'form', 'system/operatelog/index', '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('501', '登录日志', NULL, '2', '2', '108', 'login-log', 'logininfor', 'system/loginlog/index', '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1001', '用户查询', 'system:user:query', '3', '1', '100', NULL, '#', NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1002', '用户新增', 'system:user:create', '3', '2', '100', NULL, NULL, NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1003', '用户修改', 'system:user:update', '3', '3', '100', NULL, NULL, NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1004', '用户删除', 'system:user:delete', '3', '4', '100', NULL, NULL, NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1005', '用户导出', 'system:user:export', '3', '5', '100', NULL, '#', NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1006', '用户导入', 'system:user:import', '3', '6', '100', NULL, '#', NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1007', '重置密码', 'system:user:update-password', '3', '7', '100', NULL, NULL, NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1008', '角色查询', 'system:role:query', '3', '1', '101', NULL, '#', NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1009', '角色新增', 'system:role:create', '3', '2', '101', NULL, NULL, NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1010', '角色修改', 'system:role:update', '3', '3', '101', NULL, NULL, NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1011', '角色删除', 'system:role:delete', '3', '4', '101', NULL, NULL, NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1012', '角色导出', 'system:role:export', '3', '5', '101', NULL, '#', NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1013', '菜单查询', 'system:menu:query', '3', '1', '102', NULL, '#', NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1014', '菜单新增', 'system:menu:create', '3', '2', '102', NULL, '#', NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1015', '菜单修改', 'system:menu:update', '3', '3', '102', NULL, '#', NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1016', '菜单删除', 'system:menu:delete', '3', '4', '102', NULL, '#', NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1017', '部门查询', 'system:dept:query', '3', '1', '103', NULL, '#', NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1018', '部门新增', 'system:dept:create', '3', '2', '103', NULL, NULL, NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1019', '部门修改', 'system:dept:update', '3', '3', '103', NULL, NULL, NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1020', '部门删除', 'system:dept:delete', '3', '4', '103', NULL, NULL, NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1021', '岗位查询', 'system:post:query', '3', '1', '104', NULL, '#', NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1022', '岗位新增', 'system:post:create', '3', '2', '104', NULL, NULL, NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1023', '岗位修改', 'system:post:update', '3', '3', '104', NULL, NULL, NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1024', '岗位删除', 'system:post:delete', '3', '4', '104', NULL, NULL, NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1025', '岗位导出', 'system:post:export', '3', '5', '104', NULL, '#', NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1026', '字典查询', 'system:dict:query', '3', '1', '105', '#', '#', NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1027', '字典新增', 'system:dict:create', '3', '2', '105', NULL, NULL, NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1028', '字典修改', 'system:dict:update', '3', '3', '105', NULL, NULL, NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1029', '字典删除', 'system:dict:delete', '3', '4', '105', NULL, NULL, NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1030', '字典导出', 'system:dict:export', '3', '5', '105', '#', '#', NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1031', '配置查询', 'infra:config:query', '3', '1', '106', NULL, NULL, NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1032', '配置新增', 'infra:config:create', '3', '2', '106', NULL, NULL, NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1033', '配置修改', 'infra:config:update', '3', '3', '106', NULL, NULL, NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1034', '配置删除', 'infra:config:delete', '3', '4', '106', NULL, NULL, NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1035', '配置导出', 'infra:config:export', '3', '5', '106', NULL, NULL, NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1036', '公告查询', 'system:notice:query', '3', '1', '107', '#', '#', NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1037', '公告新增', 'system:notice:create', '3', '2', '107', NULL, NULL, NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1038', '公告修改', 'system:notice:update', '3', '3', '107', NULL, NULL, NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1039', '公告删除', 'system:notice:delete', '3', '4', '107', NULL, NULL, NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1040', '操作查询', 'system:operate-log:query', '3', '1', '500', NULL, NULL, NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1042', '日志导出', 'system:operate-log:export', '3', '2', '500', NULL, NULL, NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1043', '登录查询', 'system:login-log:query', '3', '1', '501', '#', '#', NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1045', '日志导出', 'system:login-log:export', '3', '3', '501', '#', '#', NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1046', '令牌列表', 'system:oauth2-token:page', '3', '1', '109', NULL, NULL, NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-05-09 23:54:42', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1048', '令牌删除', 'system:oauth2-token:delete', '3', '2', '109', NULL, NULL, NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-05-09 23:54:53', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1050', '任务新增', 'infra:job:create', '3', '2', '110', NULL, NULL, NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1051', '任务修改', 'infra:job:update', '3', '3', '110', NULL, NULL, NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1052', '任务删除', 'infra:job:delete', '3', '4', '110', NULL, NULL, NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1053', '状态修改', 'infra:job:update', '3', '5', '110', NULL, NULL, NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1054', '任务导出', 'infra:job:export', '3', '7', '110', NULL, NULL, NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1056', '生成修改', 'infra:codegen:update', '3', '2', '115', NULL, NULL, NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1057', '生成删除', 'infra:codegen:delete', '3', '3', '115', NULL, NULL, NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1058', '导入代码', 'infra:codegen:create', '3', '2', '115', NULL, NULL, NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1059', '预览代码', 'infra:codegen:preview', '3', '4', '115', NULL, NULL, NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1060', '生成代码', 'infra:codegen:download', '3', '5', '115', NULL, NULL, NULL, '0', '1', '1', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1063', '设置角色菜单权限', 'system:permission:assign-role-menu', '3', '6', '101', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-01-06 17:53:44', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1064', '设置角色数据权限', 'system:permission:assign-role-data-scope', '3', '7', '101', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-01-06 17:56:31', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1065', '设置用户角色', 'system:permission:assign-user-role', '3', '8', '101', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-01-07 10:23:28', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1066', '获得 Redis 监控信息', 'infra:redis:get-monitor-info', '3', '1', '113', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-01-26 01:02:31', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1067', '获得 Redis Key 列表', 'infra:redis:get-key-list', '3', '2', '113', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-01-26 01:02:52', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1070', '代码生成示例', 'infra:test-demo:query', '2', '1', '2', 'test-demo', 'validCode', 'infra/testDemo/index', '0', '1', '1', NULL, TO_DATE('2021-02-06 12:42:49', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1071', '测试示例表创建', 'infra:test-demo:create', '3', '1', '1070', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-02-06 12:42:49', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1072', '测试示例表更新', 'infra:test-demo:update', '3', '2', '1070', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-02-06 12:42:49', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1073', '测试示例表删除', 'infra:test-demo:delete', '3', '3', '1070', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-02-06 12:42:49', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1074', '测试示例表导出', 'infra:test-demo:export', '3', '4', '1070', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-02-06 12:42:49', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1075', '任务触发', 'infra:job:trigger', '3', '8', '110', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-02-07 13:03:10', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1076', '数据库文档', NULL, '2', '4', '2', 'db-doc', 'table', 'infra/dbDoc/index', '0', '1', '1', NULL, TO_DATE('2021-02-08 01:41:47', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1077', '监控平台', NULL, '2', '13', '2', 'skywalking', 'eye-open', 'infra/skywalking/index', '0', '1', '1', NULL, TO_DATE('2021-02-08 20:41:31', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1078', '访问日志', NULL, '2', '1', '1083', 'api-access-log', 'log', 'infra/apiAccessLog/index', '0', '1', '1', NULL, TO_DATE('2021-02-26 01:32:59', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1082', '日志导出', 'infra:api-access-log:export', '3', '2', '1078', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-02-26 01:32:59', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1083', 'API 日志', NULL, '2', '8', '2', 'log', 'log', NULL, '0', '1', '1', NULL, TO_DATE('2021-02-26 02:18:24', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-05-12 18:11:34', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1084', '错误日志', 'infra:api-error-log:query', '2', '2', '1083', 'api-error-log', 'log', 'infra/apiErrorLog/index', '0', '1', '1', NULL, TO_DATE('2021-02-26 07:53:20', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1085', '日志处理', 'infra:api-error-log:update-status', '3', '2', '1084', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-02-26 07:53:20', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1086', '日志导出', 'infra:api-error-log:export', '3', '3', '1084', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-02-26 07:53:20', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1087', '任务查询', 'infra:job:query', '3', '1', '110', NULL, NULL, NULL, '0', '1', '1', '1', TO_DATE('2021-03-10 01:26:19', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1088', '日志查询', 'infra:api-access-log:query', '3', '1', '1078', NULL, NULL, NULL, '0', '1', '1', '1', TO_DATE('2021-03-10 01:28:04', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1089', '日志查询', 'infra:api-error-log:query', '3', '1', '1084', NULL, NULL, NULL, '0', '1', '1', '1', TO_DATE('2021-03-10 01:29:09', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1090', '文件列表', NULL, '2', '5', '1243', 'file', 'upload', 'infra/file/index', '0', '1', '1', NULL, TO_DATE('2021-03-12 20:16:20', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1091', '文件查询', 'infra:file:query', '3', '1', '1090', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-03-12 20:16:20', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1092', '文件删除', 'infra:file:delete', '3', '4', '1090', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-03-12 20:16:20', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1093', '短信管理', NULL, '1', '11', '1', 'sms', 'validCode', NULL, '0', '1', '1', '1', TO_DATE('2021-04-05 01:10:16', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-05-12 18:11:34', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1094', '短信渠道', NULL, '2', '0', '1093', 'sms-channel', 'phone', 'system/sms/smsChannel', '0', '1', '1', NULL, TO_DATE('2021-04-01 11:07:15', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1095', '短信渠道查询', 'system:sms-channel:query', '3', '1', '1094', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-04-01 11:07:15', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1096', '短信渠道创建', 'system:sms-channel:create', '3', '2', '1094', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-04-01 11:07:15', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1097', '短信渠道更新', 'system:sms-channel:update', '3', '3', '1094', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-04-01 11:07:15', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1098', '短信渠道删除', 'system:sms-channel:delete', '3', '4', '1094', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-04-01 11:07:15', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1100', '短信模板', NULL, '2', '1', '1093', 'sms-template', 'phone', 'system/sms/smsTemplate', '0', '1', '1', NULL, TO_DATE('2021-04-01 17:35:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1101', '短信模板查询', 'system:sms-template:query', '3', '1', '1100', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-04-01 17:35:17', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1102', '短信模板创建', 'system:sms-template:create', '3', '2', '1100', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-04-01 17:35:17', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1103', '短信模板更新', 'system:sms-template:update', '3', '3', '1100', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-04-01 17:35:17', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1104', '短信模板删除', 'system:sms-template:delete', '3', '4', '1100', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-04-01 17:35:17', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1105', '短信模板导出', 'system:sms-template:export', '3', '5', '1100', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-04-01 17:35:17', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1106', '发送测试短信', 'system:sms-template:send-sms', '3', '6', '1100', NULL, NULL, NULL, '0', '1', '1', '1', TO_DATE('2021-04-11 00:26:40', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1107', '短信日志', NULL, '2', '2', '1093', 'sms-log', 'phone', 'system/sms/smsLog', '0', '1', '1', NULL, TO_DATE('2021-04-11 08:37:05', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1108', '短信日志查询', 'system:sms-log:query', '3', '1', '1107', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-04-11 08:37:05', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1109', '短信日志导出', 'system:sms-log:export', '3', '5', '1107', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-04-11 08:37:05', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1110', '错误码管理', NULL, '2', '12', '1', 'error-code', 'code', 'system/errorCode/index', '0', '1', '1', NULL, TO_DATE('2021-04-13 21:46:42', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1111', '错误码查询', 'system:error-code:query', '3', '1', '1110', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-04-13 21:46:42', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1112', '错误码创建', 'system:error-code:create', '3', '2', '1110', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-04-13 21:46:42', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1113', '错误码更新', 'system:error-code:update', '3', '3', '1110', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-04-13 21:46:42', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1114', '错误码删除', 'system:error-code:delete', '3', '4', '1110', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-04-13 21:46:42', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1115', '错误码导出', 'system:error-code:export', '3', '5', '1110', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-04-13 21:46:42', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1117', '支付管理', NULL, '1', '11', '0', '/pay', 'money', NULL, '0', '1', '1', '1', TO_DATE('2021-12-25 16:43:41', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-05-12 18:11:34', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1118', '请假查询', NULL, '2', '0', '5', 'leave', 'user', 'bpm/oa/leave/index', '0', '1', '1', NULL, TO_DATE('2021-09-20 08:51:03', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1119', '请假申请查询', 'bpm:oa-leave:query', '3', '1', '1118', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-09-20 08:51:03', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1120', '请假申请创建', 'bpm:oa-leave:create', '3', '2', '1118', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-09-20 08:51:03', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1126', '应用信息', NULL, '2', '1', '1117', 'app', 'table', 'pay/app/index', '0', '1', '1', NULL, TO_DATE('2021-11-10 01:13:30', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1127', '支付应用信息查询', 'pay:app:query', '3', '1', '1126', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-11-10 01:13:31', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1128', '支付应用信息创建', 'pay:app:create', '3', '2', '1126', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-11-10 01:13:31', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1129', '支付应用信息更新', 'pay:app:update', '3', '3', '1126', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-11-10 01:13:31', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1130', '支付应用信息删除', 'pay:app:delete', '3', '4', '1126', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-11-10 01:13:31', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1131', '支付应用信息导出', 'pay:app:export', '3', '5', '1126', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-11-10 01:13:31', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1132', '秘钥解析', 'pay:channel:parsing', '3', '6', '1129', NULL, NULL, NULL, '0', '1', '1', '1', TO_DATE('2021-11-08 15:15:47', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1133', '支付商户信息查询', 'pay:merchant:query', '3', '1', '1132', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-11-10 01:13:41', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1134', '支付商户信息创建', 'pay:merchant:create', '3', '2', '1132', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-11-10 01:13:41', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1135', '支付商户信息更新', 'pay:merchant:update', '3', '3', '1132', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-11-10 01:13:41', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1136', '支付商户信息删除', 'pay:merchant:delete', '3', '4', '1132', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-11-10 01:13:41', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1137', '支付商户信息导出', 'pay:merchant:export', '3', '5', '1132', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-11-10 01:13:41', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1138', '租户列表', NULL, '2', '0', '1224', 'list', 'peoples', 'system/tenant/index', '0', '1', '1', NULL, TO_DATE('2021-12-14 12:31:43', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1139', '租户查询', 'system:tenant:query', '3', '1', '1138', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-12-14 12:31:44', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1140', '租户创建', 'system:tenant:create', '3', '2', '1138', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-12-14 12:31:44', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1141', '租户更新', 'system:tenant:update', '3', '3', '1138', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-12-14 12:31:44', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1142', '租户删除', 'system:tenant:delete', '3', '4', '1138', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-12-14 12:31:44', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1143', '租户导出', 'system:tenant:export', '3', '5', '1138', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-12-14 12:31:44', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1150', '秘钥解析', NULL, '3', '6', '1129', NULL, NULL, NULL, '0', '1', '1', '1', TO_DATE('2021-11-08 15:15:47', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1161', '退款订单', NULL, '2', '3', '1117', 'refund', 'order', 'pay/refund/index', '0', '1', '1', NULL, TO_DATE('2021-12-25 08:29:07', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1162', '退款订单查询', 'pay:refund:query', '3', '1', '1161', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-12-25 08:29:07', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1163', '退款订单创建', 'pay:refund:create', '3', '2', '1161', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-12-25 08:29:07', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1164', '退款订单更新', 'pay:refund:update', '3', '3', '1161', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-12-25 08:29:07', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1165', '退款订单删除', 'pay:refund:delete', '3', '4', '1161', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-12-25 08:29:07', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1166', '退款订单导出', 'pay:refund:export', '3', '5', '1161', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-12-25 08:29:07', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1173', '支付订单', NULL, '2', '2', '1117', 'order', 'pay', 'pay/order/index', '0', '1', '1', NULL, TO_DATE('2021-12-25 08:49:43', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1174', '支付订单查询', 'pay:order:query', '3', '1', '1173', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-12-25 08:49:43', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1175', '支付订单创建', 'pay:order:create', '3', '2', '1173', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-12-25 08:49:43', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1176', '支付订单更新', 'pay:order:update', '3', '3', '1173', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-12-25 08:49:43', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1177', '支付订单删除', 'pay:order:delete', '3', '4', '1173', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-12-25 08:49:43', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1178', '支付订单导出', 'pay:order:export', '3', '5', '1173', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-12-25 08:49:43', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1179', '商户信息', NULL, '2', '0', '1117', 'merchant', 'merchant', 'pay/merchant/index', '0', '1', '1', NULL, TO_DATE('2021-12-25 09:01:44', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1180', '支付商户信息查询', 'pay:merchant:query', '3', '1', '1179', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-12-25 09:01:44', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1181', '支付商户信息创建', 'pay:merchant:create', '3', '2', '1179', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-12-25 09:01:44', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1182', '支付商户信息更新', 'pay:merchant:update', '3', '3', '1179', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-12-25 09:01:44', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1183', '支付商户信息删除', NULL, '3', '4', '1179', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-12-25 09:01:44', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1184', '支付商户信息导出', 'pay:merchant:export', '3', '5', '1179', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-12-25 09:01:44', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1185', '工作流程', NULL, '1', '50', '0', '/bpm', 'tool', NULL, '0', '1', '1', '1', TO_DATE('2021-12-30 20:26:36', 'SYYYY-MM-DD HH24:MI:SS'), '103', TO_DATE('2022-05-12 18:11:34', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1186', '流程管理', NULL, '1', '10', '1185', 'manager', 'nested', NULL, '0', '1', '1', '1', TO_DATE('2021-12-30 20:28:30', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-05-12 18:11:34', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1187', '流程表单', NULL, '2', '0', '1186', 'form', 'form', 'bpm/form/index', '0', '1', '1', NULL, TO_DATE('2021-12-30 12:38:22', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1188', '表单查询', 'bpm:form:query', '3', '1', '1187', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-12-30 12:38:22', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1189', '表单创建', 'bpm:form:create', '3', '2', '1187', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-12-30 12:38:22', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1190', '表单更新', 'bpm:form:update', '3', '3', '1187', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-12-30 12:38:22', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1191', '表单删除', 'bpm:form:delete', '3', '4', '1187', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-12-30 12:38:22', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1192', '表单导出', 'bpm:form:export', '3', '5', '1187', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2021-12-30 12:38:22', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1193', '流程模型', NULL, '2', '5', '1186', 'model', 'guide', 'bpm/model/index', '0', '1', '1', '1', TO_DATE('2021-12-31 23:24:58', 'SYYYY-MM-DD HH24:MI:SS'), '103', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1194', '模型查询', 'bpm:model:query', '3', '1', '1193', NULL, NULL, NULL, '0', '1', '1', '1', TO_DATE('2022-01-03 19:01:10', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1195', '模型创建', 'bpm:model:create', '3', '2', '1193', NULL, NULL, NULL, '0', '1', '1', '1', TO_DATE('2022-01-03 19:01:24', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1196', '模型导入', 'bpm:model:import', '3', '3', '1193', NULL, NULL, NULL, '0', '1', '1', '1', TO_DATE('2022-01-03 19:01:35', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1197', '模型更新', 'bpm:model:update', '3', '4', '1193', NULL, NULL, NULL, '0', '1', '1', '1', TO_DATE('2022-01-03 19:02:28', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1198', '模型删除', 'bpm:model:delete', '3', '5', '1193', NULL, NULL, NULL, '0', '1', '1', '1', TO_DATE('2022-01-03 19:02:43', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1199', '模型发布', 'bpm:model:deploy', '3', '6', '1193', NULL, NULL, NULL, '0', '1', '1', '1', TO_DATE('2022-01-03 19:03:24', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1200', '任务管理', NULL, '1', '20', '1185', 'task', 'cascader', NULL, '0', '1', '1', '1', TO_DATE('2022-01-07 23:51:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-05-12 18:11:34', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1201', '我的流程', NULL, '2', '0', '1200', 'my', 'people', 'bpm/processInstance/index', '0', '1', '1', NULL, TO_DATE('2022-01-07 15:53:44', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1202', '流程实例的查询', 'bpm:process-instance:query', '3', '1', '1201', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2022-01-07 15:53:44', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1207', '待办任务', NULL, '2', '10', '1200', 'todo', 'eye-open', 'bpm/task/todo', '0', '1', '1', '1', TO_DATE('2022-01-08 10:33:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1208', '已办任务', NULL, '2', '20', '1200', 'done', 'eye', 'bpm/task/done', '0', '1', '1', '1', TO_DATE('2022-01-08 10:34:13', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1209', '用户分组', NULL, '2', '2', '1186', 'user-group', 'people', 'bpm/group/index', '0', '1', '1', NULL, TO_DATE('2022-01-14 02:14:20', 'SYYYY-MM-DD HH24:MI:SS'), '103', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1210', '用户组查询', 'bpm:user-group:query', '3', '1', '1209', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2022-01-14 02:14:20', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1211', '用户组创建', 'bpm:user-group:create', '3', '2', '1209', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2022-01-14 02:14:20', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1212', '用户组更新', 'bpm:user-group:update', '3', '3', '1209', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2022-01-14 02:14:20', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1213', '用户组删除', 'bpm:user-group:delete', '3', '4', '1209', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2022-01-14 02:14:20', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1215', '流程定义查询', 'bpm:process-definition:query', '3', '10', '1193', NULL, NULL, NULL, '0', '1', '1', '1', TO_DATE('2022-01-23 00:21:43', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1216', '流程任务分配规则查询', 'bpm:task-assign-rule:query', '3', '20', '1193', NULL, NULL, NULL, '0', '1', '1', '1', TO_DATE('2022-01-23 00:26:53', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1217', '流程任务分配规则创建', 'bpm:task-assign-rule:create', '3', '21', '1193', NULL, NULL, NULL, '0', '1', '1', '1', TO_DATE('2022-01-23 00:28:15', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1218', '流程任务分配规则更新', 'bpm:task-assign-rule:update', '3', '22', '1193', NULL, NULL, NULL, '0', '1', '1', '1', TO_DATE('2022-01-23 00:28:41', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1219', '流程实例的创建', 'bpm:process-instance:create', '3', '2', '1201', NULL, NULL, NULL, '0', '1', '1', '1', TO_DATE('2022-01-23 00:36:15', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1220', '流程实例的取消', 'bpm:process-instance:cancel', '3', '3', '1201', NULL, NULL, NULL, '0', '1', '1', '1', TO_DATE('2022-01-23 00:36:33', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1221', '流程任务的查询', 'bpm:task:query', '3', '1', '1207', NULL, NULL, NULL, '0', '1', '1', '1', TO_DATE('2022-01-23 00:38:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1222', '流程任务的更新', 'bpm:task:update', '3', '2', '1207', NULL, NULL, NULL, '0', '1', '1', '1', TO_DATE('2022-01-23 00:39:24', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1224', '租户管理', NULL, '2', '0', '1', 'tenant', 'peoples', NULL, '0', '1', '1', '1', TO_DATE('2022-02-20 01:41:13', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-05-12 18:11:34', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1225', '租户套餐', NULL, '2', '0', '1224', 'package', 'eye', 'system/tenantPackage/index', '0', '1', '1', NULL, TO_DATE('2022-02-19 17:44:06', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-21 01:21:25', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1226', '租户套餐查询', 'system:tenant-package:query', '3', '1', '1225', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2022-02-19 17:44:06', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1227', '租户套餐创建', 'system:tenant-package:create', '3', '2', '1225', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2022-02-19 17:44:06', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1228', '租户套餐更新', 'system:tenant-package:update', '3', '3', '1225', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2022-02-19 17:44:06', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1229', '租户套餐删除', 'system:tenant-package:delete', '3', '4', '1225', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2022-02-19 17:44:06', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1237', '文件配置', NULL, '2', '0', '1243', 'file-config', 'config', 'infra/fileConfig/index', '0', '1', '1', NULL, TO_DATE('2022-03-15 14:35:28', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1238', '文件配置查询', 'infra:file-config:query', '3', '1', '1237', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2022-03-15 14:35:28', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1239', '文件配置创建', 'infra:file-config:create', '3', '2', '1237', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2022-03-15 14:35:28', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1240', '文件配置更新', 'infra:file-config:update', '3', '3', '1237', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2022-03-15 14:35:28', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1241', '文件配置删除', 'infra:file-config:delete', '3', '4', '1237', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2022-03-15 14:35:28', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1242', '文件配置导出', 'infra:file-config:export', '3', '5', '1237', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2022-03-15 14:35:28', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1243', '文件管理', NULL, '2', '5', '2', 'file', 'download', NULL, '0', '1', '1', '1', TO_DATE('2022-03-16 23:47:40', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-05-12 18:11:34', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1247', '敏感词管理', NULL, '2', '13', '1', 'sensitive-word', 'education', 'system/sensitiveWord/index', '0', '1', '1', NULL, TO_DATE('2022-04-07 16:55:03', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1248', '敏感词查询', 'system:sensitive-word:query', '3', '1', '1247', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2022-04-07 16:55:03', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1249', '敏感词创建', 'system:sensitive-word:create', '3', '2', '1247', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2022-04-07 16:55:03', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1250', '敏感词更新', 'system:sensitive-word:update', '3', '3', '1247', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2022-04-07 16:55:03', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1251', '敏感词删除', 'system:sensitive-word:delete', '3', '4', '1247', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2022-04-07 16:55:03', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1252', '敏感词导出', 'system:sensitive-word:export', '3', '5', '1247', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2022-04-07 16:55:03', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-20 17:03:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1254', '作者动态', NULL, '1', '0', '0', 'https://www.iocoder.cn', 'people', NULL, '0', '1', '1', '1', TO_DATE('2022-04-23 01:03:15', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-05-12 18:11:34', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1255', '数据源配置', NULL, '2', '1', '2', 'data-source-config', 'rate', 'infra/dataSourceConfig/index', '0', '1', '1', NULL, TO_DATE('2022-04-27 14:37:32', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-27 22:42:06', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1256', '数据源配置查询', 'infra:data-source-config:query', '3', '1', '1255', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2022-04-27 14:37:32', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-27 14:37:32', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1257', '数据源配置创建', 'infra:data-source-config:create', '3', '2', '1255', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2022-04-27 14:37:32', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-27 14:37:32', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1258', '数据源配置更新', 'infra:data-source-config:update', '3', '3', '1255', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2022-04-27 14:37:32', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-27 14:37:32', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1259', '数据源配置删除', 'infra:data-source-config:delete', '3', '4', '1255', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2022-04-27 14:37:32', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-27 14:37:32', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1260', '数据源配置导出', 'infra:data-source-config:export', '3', '5', '1255', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2022-04-27 14:37:32', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-04-27 14:37:32', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1261', 'OAuth 2.0', NULL, '1', '10', '1', 'oauth2', 'people', NULL, '0', '1', '1', '1', TO_DATE('2022-05-09 23:38:17', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-05-12 18:11:34', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1263', '应用管理', NULL, '2', '0', '1261', 'oauth2/application', 'tool', 'system/oauth2/client/index', '0', '1', '1', NULL, TO_DATE('2022-05-10 16:26:33', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-05-11 23:31:36', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1264', '客户端查询', 'system:oauth2-client:query', '3', '1', '1263', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2022-05-10 16:26:33', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-05-11 00:31:06', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1265', '客户端创建', 'system:oauth2-client:create', '3', '2', '1263', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2022-05-10 16:26:33', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-05-11 00:31:23', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1266', '客户端更新', 'system:oauth2-client:update', '3', '3', '1263', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2022-05-10 16:26:33', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-05-11 00:31:28', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_MENU" ("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON", "COMPONENT", "STATUS", "VISIBLE", "KEEP_ALIVE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1267', '客户端删除', 'system:oauth2-client:delete', '3', '4', '1263', NULL, NULL, NULL, '0', '1', '1', NULL, TO_DATE('2022-05-10 16:26:33', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-05-11 00:31:33', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for SYSTEM_NOTICE +-- ---------------------------- +DROP TABLE "SYSTEM_NOTICE"; +CREATE TABLE "SYSTEM_NOTICE" ( + "ID" NUMBER(20,0) NOT NULL, + "TITLE" NVARCHAR2(50), + "CONTENT" NCLOB NOT NULL, + "NOTICE_TYPE" NUMBER(4,0) NOT NULL, + "STATUS" NUMBER(4,0) NOT NULL, + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "TENANT_ID" NUMBER(20,0) NOT NULL, + "DELETED" NUMBER(1,0) DEFAULT 0 NOT NULL +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "SYSTEM_NOTICE"."ID" IS '公告ID'; +COMMENT ON COLUMN "SYSTEM_NOTICE"."TITLE" IS '公告标题'; +COMMENT ON COLUMN "SYSTEM_NOTICE"."CONTENT" IS '公告内容'; +COMMENT ON COLUMN "SYSTEM_NOTICE"."NOTICE_TYPE" IS '公告类型(1通知 2公告)'; +COMMENT ON COLUMN "SYSTEM_NOTICE"."STATUS" IS '公告状态(0正常 1关闭)'; +COMMENT ON COLUMN "SYSTEM_NOTICE"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "SYSTEM_NOTICE"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SYSTEM_NOTICE"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "SYSTEM_NOTICE"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "SYSTEM_NOTICE"."TENANT_ID" IS '租户编号'; +COMMENT ON COLUMN "SYSTEM_NOTICE"."DELETED" IS '是否删除'; +COMMENT ON TABLE "SYSTEM_NOTICE" IS '通知公告表'; + +-- ---------------------------- +-- Records of SYSTEM_NOTICE +-- ---------------------------- +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for SYSTEM_OAUTH2_ACCESS_TOKEN +-- ---------------------------- +DROP TABLE "SYSTEM_OAUTH2_ACCESS_TOKEN"; +CREATE TABLE "SYSTEM_OAUTH2_ACCESS_TOKEN" ( + "ID" NUMBER(20,0) NOT NULL, + "USER_ID" NUMBER(20,0) NOT NULL, + "ACCESS_TOKEN" NVARCHAR2(255) NOT NULL, + "REFRESH_TOKEN" NVARCHAR2(32) NOT NULL, + "USER_TYPE" NUMBER(4,0) NOT NULL, + "CLIENT_ID" NVARCHAR2(255) NOT NULL, + "EXPIRES_TIME" DATE NOT NULL, + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "DELETED" NUMBER(4,0) DEFAULT 0 NOT NULL, + "TENANT_ID" NUMBER(20,0) NOT NULL, + "SCOPES" NVARCHAR2(255) DEFAULT '' +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "SYSTEM_OAUTH2_ACCESS_TOKEN"."ID" IS '编号'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_ACCESS_TOKEN"."USER_ID" IS '用户编号'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_ACCESS_TOKEN"."ACCESS_TOKEN" IS '访问令牌'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_ACCESS_TOKEN"."REFRESH_TOKEN" IS '刷新令牌'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_ACCESS_TOKEN"."USER_TYPE" IS '用户类型'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_ACCESS_TOKEN"."CLIENT_ID" IS '客户端编号'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_ACCESS_TOKEN"."EXPIRES_TIME" IS '过期时间'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_ACCESS_TOKEN"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_ACCESS_TOKEN"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_ACCESS_TOKEN"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_ACCESS_TOKEN"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_ACCESS_TOKEN"."DELETED" IS '是否删除'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_ACCESS_TOKEN"."TENANT_ID" IS '租户编号'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_ACCESS_TOKEN"."SCOPES" IS '授权范围'; +COMMENT ON TABLE "SYSTEM_OAUTH2_ACCESS_TOKEN" IS '刷新令牌'; + +-- ---------------------------- +-- Records of SYSTEM_OAUTH2_ACCESS_TOKEN +-- ---------------------------- +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for SYSTEM_OAUTH2_APPROVE +-- ---------------------------- +DROP TABLE "SYSTEM_OAUTH2_APPROVE"; +CREATE TABLE "SYSTEM_OAUTH2_APPROVE" ( + "ID" NUMBER(20,0) NOT NULL, + "USER_ID" NUMBER(20,0) NOT NULL, + "USER_TYPE" NUMBER(4,0) NOT NULL, + "CLIENT_ID" NVARCHAR2(255) NOT NULL, + "SCOPE" NVARCHAR2(255) NOT NULL, + "APPROVED" VARCHAR2(1 BYTE) NOT NULL, + "EXPIRES_TIME" DATE NOT NULL, + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "DELETED" NUMBER(4,0) DEFAULT 0 NOT NULL, + "TENANT_ID" NUMBER(20,0) NOT NULL +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "SYSTEM_OAUTH2_APPROVE"."ID" IS '编号'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_APPROVE"."USER_ID" IS '用户编号'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_APPROVE"."USER_TYPE" IS '用户类型'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_APPROVE"."CLIENT_ID" IS '客户端编号'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_APPROVE"."SCOPE" IS '授权范围'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_APPROVE"."APPROVED" IS '是否接受'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_APPROVE"."EXPIRES_TIME" IS '过期时间'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_APPROVE"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_APPROVE"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_APPROVE"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_APPROVE"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_APPROVE"."DELETED" IS '是否删除'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_APPROVE"."TENANT_ID" IS '租户编号'; +COMMENT ON TABLE "SYSTEM_OAUTH2_APPROVE" IS 'OAuth2 批准表'; + +-- ---------------------------- +-- Records of SYSTEM_OAUTH2_APPROVE +-- ---------------------------- +INSERT INTO "SYSTEM_OAUTH2_APPROVE" ("ID", "USER_ID", "USER_TYPE", "CLIENT_ID", "SCOPE", "APPROVED", "EXPIRES_TIME", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED", "TENANT_ID") VALUES ('42', '1', '2', 'default', 'user.write', '1', TO_DATE('2022-06-25 00:36:50', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-05-26 00:35:06', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-05-26 00:36:50', 'SYYYY-MM-DD HH24:MI:SS'), '0', '1'); +INSERT INTO "SYSTEM_OAUTH2_APPROVE" ("ID", "USER_ID", "USER_TYPE", "CLIENT_ID", "SCOPE", "APPROVED", "EXPIRES_TIME", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED", "TENANT_ID") VALUES ('43', '1', '2', 'default', 'user.read', '1', TO_DATE('2022-06-25 00:36:50', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-05-26 00:35:06', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-05-26 00:36:50', 'SYYYY-MM-DD HH24:MI:SS'), '0', '1'); +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for SYSTEM_OAUTH2_CLIENT +-- ---------------------------- +DROP TABLE "SYSTEM_OAUTH2_CLIENT"; +CREATE TABLE "SYSTEM_OAUTH2_CLIENT" ( + "ID" NUMBER(20,0) NOT NULL, + "CLIENT_ID" NVARCHAR2(255) NOT NULL, + "SECRET" NVARCHAR2(255) NOT NULL, + "NAME" NVARCHAR2(255) NOT NULL, + "LOGO" NVARCHAR2(255) NOT NULL, + "DESCRIPTION" NVARCHAR2(255), + "STATUS" NUMBER(4,0) NOT NULL, + "ACCESS_TOKEN_VALIDITY_SECONDS" NUMBER(11,0) NOT NULL, + "REFRESH_TOKEN_VALIDITY_SECONDS" NUMBER(11,0) NOT NULL, + "REDIRECT_URIS" NVARCHAR2(255) NOT NULL, + "AUTO_APPROVE_SCOPES" VARCHAR2(255 BYTE) DEFAULT '', + "AUTHORIZED_GRANT_TYPES" NVARCHAR2(255) NOT NULL, + "SCOPES" NVARCHAR2(255) DEFAULT '', + "AUTHORITIES" NVARCHAR2(255), + "RESOURCE_IDS" NVARCHAR2(255), + "ADDITIONAL_INFORMATION" NCLOB, + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "DELETED" NUMBER(4,0) DEFAULT 0 NOT NULL +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "SYSTEM_OAUTH2_CLIENT"."ID" IS '编号'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_CLIENT"."CLIENT_ID" IS '客户端编号'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_CLIENT"."SECRET" IS '客户端密钥'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_CLIENT"."NAME" IS '应用名'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_CLIENT"."LOGO" IS '应用图标'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_CLIENT"."DESCRIPTION" IS '应用描述'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_CLIENT"."STATUS" IS '状态'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_CLIENT"."ACCESS_TOKEN_VALIDITY_SECONDS" IS '访问令牌的有效期'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_CLIENT"."REFRESH_TOKEN_VALIDITY_SECONDS" IS '刷新令牌的有效期'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_CLIENT"."REDIRECT_URIS" IS '可重定向的 URI 地址'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_CLIENT"."AUTO_APPROVE_SCOPES" IS '自动通过的授权范围'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_CLIENT"."AUTHORIZED_GRANT_TYPES" IS '授权类型'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_CLIENT"."SCOPES" IS '授权范围'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_CLIENT"."AUTHORITIES" IS '权限'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_CLIENT"."RESOURCE_IDS" IS '资源'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_CLIENT"."ADDITIONAL_INFORMATION" IS '附加信息'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_CLIENT"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_CLIENT"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_CLIENT"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_CLIENT"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_CLIENT"."DELETED" IS '是否删除'; +COMMENT ON TABLE "SYSTEM_OAUTH2_CLIENT" IS 'OAuth2 客户端表'; + +-- ---------------------------- +-- Records of SYSTEM_OAUTH2_CLIENT +-- ---------------------------- +INSERT INTO "SYSTEM_OAUTH2_CLIENT" ("ID", "CLIENT_ID", "SECRET", "NAME", "LOGO", "DESCRIPTION", "STATUS", "ACCESS_TOKEN_VALIDITY_SECONDS", "REFRESH_TOKEN_VALIDITY_SECONDS", "REDIRECT_URIS", "AUTO_APPROVE_SCOPES", "AUTHORIZED_GRANT_TYPES", "SCOPES", "AUTHORITIES", "RESOURCE_IDS", "ADDITIONAL_INFORMATION", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1', 'default', 'admin123', '闻荫源码', 'http://test.win.iocoder.cn/a5e2e244368878a366b516805a4aabf1.png', '我是描述', '0', '180', '8640', '["https://www.iocoder.cn","https://doc.iocoder.cn"]', NULL, '["password","authorization_code","implicit","refresh_token"]', '["user.read","user.write"]', '["system:user:query"]', '[]', '{}', '1', TO_DATE('2022-05-11 21:47:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-05-12 01:00:20', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_OAUTH2_CLIENT" ("ID", "CLIENT_ID", "SECRET", "NAME", "LOGO", "DESCRIPTION", "STATUS", "ACCESS_TOKEN_VALIDITY_SECONDS", "REFRESH_TOKEN_VALIDITY_SECONDS", "REDIRECT_URIS", "AUTO_APPROVE_SCOPES", "AUTHORIZED_GRANT_TYPES", "SCOPES", "AUTHORITIES", "RESOURCE_IDS", "ADDITIONAL_INFORMATION", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('40', 'test', 'test2', 'biubiu', 'http://test.win.iocoder.cn/277a899d573723f1fcdfb57340f00379.png', NULL, '0', '1800', '43200', '["https://www.iocoder.cn"]', '[]', '["password","authorization_code","implicit"]', '[]', '[]', '[]', '{}', '1', TO_DATE('2022-05-12 00:28:20', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-05-26 00:30:33', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for SYSTEM_OAUTH2_CODE +-- ---------------------------- +DROP TABLE "SYSTEM_OAUTH2_CODE"; +CREATE TABLE "SYSTEM_OAUTH2_CODE" ( + "ID" NUMBER(20,0) NOT NULL, + "USER_ID" NUMBER(20,0) NOT NULL, + "USER_TYPE" NUMBER(4,0) NOT NULL, + "CODE" NVARCHAR2(32) NOT NULL, + "CLIENT_ID" NVARCHAR2(255) NOT NULL, + "SCOPES" NVARCHAR2(255), + "EXPIRES_TIME" DATE NOT NULL, + "REDIRECT_URI" NVARCHAR2(255), + "STATE" NVARCHAR2(255) DEFAULT '', + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "DELETED" NUMBER(4,0) DEFAULT 0 NOT NULL, + "TENANT_ID" NUMBER(20,0) NOT NULL +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "SYSTEM_OAUTH2_CODE"."ID" IS '编号'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_CODE"."USER_ID" IS '用户编号'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_CODE"."USER_TYPE" IS '用户类型'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_CODE"."CODE" IS '授权码'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_CODE"."CLIENT_ID" IS '客户端编号'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_CODE"."SCOPES" IS '授权范围'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_CODE"."EXPIRES_TIME" IS '过期时间'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_CODE"."REDIRECT_URI" IS '可重定向的 URI 地址'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_CODE"."STATE" IS '状态'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_CODE"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_CODE"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_CODE"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_CODE"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_CODE"."DELETED" IS '是否删除'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_CODE"."TENANT_ID" IS '租户编号'; +COMMENT ON TABLE "SYSTEM_OAUTH2_CODE" IS 'OAuth2 授权码表'; + +-- ---------------------------- +-- Records of SYSTEM_OAUTH2_CODE +-- ---------------------------- +INSERT INTO "SYSTEM_OAUTH2_CODE" ("ID", "USER_ID", "USER_TYPE", "CODE", "CLIENT_ID", "SCOPES", "EXPIRES_TIME", "REDIRECT_URI", "STATE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED", "TENANT_ID") VALUES ('3', '1', '2', 'b882271c7082496e889e8e1a798f1ca2', 'default', '["user.write"]', TO_DATE('2022-05-26 00:41:41', 'SYYYY-MM-DD HH24:MI:SS'), 'https://www.iocoder.cn', NULL, '1', TO_DATE('2022-05-26 00:36:41', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-05-26 00:36:41', 'SYYYY-MM-DD HH24:MI:SS'), '0', '1'); +INSERT INTO "SYSTEM_OAUTH2_CODE" ("ID", "USER_ID", "USER_TYPE", "CODE", "CLIENT_ID", "SCOPES", "EXPIRES_TIME", "REDIRECT_URI", "STATE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED", "TENANT_ID") VALUES ('4', '1', '2', '69f7969f221c41e8a5a7887daad9d14e', 'default', '["user.write","user.read"]', TO_DATE('2022-05-26 00:41:50', 'SYYYY-MM-DD HH24:MI:SS'), 'https://www.iocoder.cn', NULL, '1', TO_DATE('2022-05-26 00:36:50', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-05-26 00:36:50', 'SYYYY-MM-DD HH24:MI:SS'), '0', '1'); +INSERT INTO "SYSTEM_OAUTH2_CODE" ("ID", "USER_ID", "USER_TYPE", "CODE", "CLIENT_ID", "SCOPES", "EXPIRES_TIME", "REDIRECT_URI", "STATE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED", "TENANT_ID") VALUES ('5', '1', '2', 'b624454a2fd1447f95849629cf3079a1', 'default', '["user.read","user.write"]', TO_DATE('2022-05-26 00:41:52', 'SYYYY-MM-DD HH24:MI:SS'), 'https://www.iocoder.cn', NULL, '1', TO_DATE('2022-05-26 00:36:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-05-26 00:36:52', 'SYYYY-MM-DD HH24:MI:SS'), '0', '1'); +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for SYSTEM_OAUTH2_REFRESH_TOKEN +-- ---------------------------- +DROP TABLE "SYSTEM_OAUTH2_REFRESH_TOKEN"; +CREATE TABLE "SYSTEM_OAUTH2_REFRESH_TOKEN" ( + "ID" NUMBER(20,0) NOT NULL, + "USER_ID" NUMBER(20,0) NOT NULL, + "REFRESH_TOKEN" NVARCHAR2(32) NOT NULL, + "USER_TYPE" NUMBER(4,0) NOT NULL, + "CLIENT_ID" NVARCHAR2(255) NOT NULL, + "EXPIRES_TIME" DATE NOT NULL, + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "DELETED" NUMBER DEFAULT 0 NOT NULL, + "TENANT_ID" NUMBER(20,0) NOT NULL, + "SCOPES" NVARCHAR2(255) DEFAULT '' +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "SYSTEM_OAUTH2_REFRESH_TOKEN"."ID" IS '编号'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_REFRESH_TOKEN"."USER_ID" IS '用户编号'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_REFRESH_TOKEN"."REFRESH_TOKEN" IS '刷新令牌'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_REFRESH_TOKEN"."USER_TYPE" IS '用户类型'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_REFRESH_TOKEN"."CLIENT_ID" IS '客户端编号'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_REFRESH_TOKEN"."EXPIRES_TIME" IS '过期时间'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_REFRESH_TOKEN"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_REFRESH_TOKEN"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_REFRESH_TOKEN"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_REFRESH_TOKEN"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_REFRESH_TOKEN"."DELETED" IS '是否删除'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_REFRESH_TOKEN"."TENANT_ID" IS '租户编号'; +COMMENT ON COLUMN "SYSTEM_OAUTH2_REFRESH_TOKEN"."SCOPES" IS '授权范围'; +COMMENT ON TABLE "SYSTEM_OAUTH2_REFRESH_TOKEN" IS '刷新令牌'; + +-- ---------------------------- +-- Records of SYSTEM_OAUTH2_REFRESH_TOKEN +-- ---------------------------- +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for SYSTEM_OPERATE_LOG +-- ---------------------------- +DROP TABLE "SYSTEM_OPERATE_LOG"; +CREATE TABLE "SYSTEM_OPERATE_LOG" ( + "ID" NUMBER(20,0) NOT NULL, + "TRACE_ID" NVARCHAR2(64), + "USER_ID" NUMBER(20,0) NOT NULL, + "USER_TYPE" NUMBER(4,0) NOT NULL, + "MODULE" NVARCHAR2(50), + "NAME" NVARCHAR2(50), + "TYPE" NUMBER(20,0) NOT NULL, + "CONTENT" NCLOB, + "EXTS" NVARCHAR2(512), + "REQUEST_METHOD" NVARCHAR2(16), + "REQUEST_URL" NVARCHAR2(255), + "USER_IP" NVARCHAR2(50), + "USER_AGENT" NVARCHAR2(200), + "JAVA_METHOD" NVARCHAR2(512), + "JAVA_METHOD_ARGS" NCLOB, + "START_TIME" DATE NOT NULL, + "DURATION" NUMBER(11,0) NOT NULL, + "RESULT_CODE" NUMBER(11,0) NOT NULL, + "RESULT_MSG" NVARCHAR2(512), + "RESULT_DATA" NCLOB, + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "TENANT_ID" NUMBER(20,0) NOT NULL, + "DELETED" NUMBER(1,0) DEFAULT 0 NOT NULL +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "SYSTEM_OPERATE_LOG"."ID" IS '日志主键'; +COMMENT ON COLUMN "SYSTEM_OPERATE_LOG"."TRACE_ID" IS '链路追踪编号'; +COMMENT ON COLUMN "SYSTEM_OPERATE_LOG"."USER_ID" IS '用户编号'; +COMMENT ON COLUMN "SYSTEM_OPERATE_LOG"."USER_TYPE" IS '用户类型'; +COMMENT ON COLUMN "SYSTEM_OPERATE_LOG"."MODULE" IS '模块标题'; +COMMENT ON COLUMN "SYSTEM_OPERATE_LOG"."NAME" IS '操作名'; +COMMENT ON COLUMN "SYSTEM_OPERATE_LOG"."TYPE" IS '操作分类'; +COMMENT ON COLUMN "SYSTEM_OPERATE_LOG"."CONTENT" IS '操作内容'; +COMMENT ON COLUMN "SYSTEM_OPERATE_LOG"."EXTS" IS '拓展字段'; +COMMENT ON COLUMN "SYSTEM_OPERATE_LOG"."REQUEST_METHOD" IS '请求方法名'; +COMMENT ON COLUMN "SYSTEM_OPERATE_LOG"."REQUEST_URL" IS '请求地址'; +COMMENT ON COLUMN "SYSTEM_OPERATE_LOG"."USER_IP" IS '用户 IP'; +COMMENT ON COLUMN "SYSTEM_OPERATE_LOG"."USER_AGENT" IS '浏览器 UA'; +COMMENT ON COLUMN "SYSTEM_OPERATE_LOG"."JAVA_METHOD" IS 'Java 方法名'; +COMMENT ON COLUMN "SYSTEM_OPERATE_LOG"."JAVA_METHOD_ARGS" IS 'Java 方法的参数'; +COMMENT ON COLUMN "SYSTEM_OPERATE_LOG"."START_TIME" IS '操作时间'; +COMMENT ON COLUMN "SYSTEM_OPERATE_LOG"."DURATION" IS '执行时长'; +COMMENT ON COLUMN "SYSTEM_OPERATE_LOG"."RESULT_CODE" IS '结果码'; +COMMENT ON COLUMN "SYSTEM_OPERATE_LOG"."RESULT_MSG" IS '结果提示'; +COMMENT ON COLUMN "SYSTEM_OPERATE_LOG"."RESULT_DATA" IS '结果数据'; +COMMENT ON COLUMN "SYSTEM_OPERATE_LOG"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "SYSTEM_OPERATE_LOG"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SYSTEM_OPERATE_LOG"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "SYSTEM_OPERATE_LOG"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "SYSTEM_OPERATE_LOG"."TENANT_ID" IS '租户编号'; +COMMENT ON COLUMN "SYSTEM_OPERATE_LOG"."DELETED" IS '是否删除'; +COMMENT ON TABLE "SYSTEM_OPERATE_LOG" IS '操作日志记录'; + +-- ---------------------------- +-- Records of SYSTEM_OPERATE_LOG +-- ---------------------------- +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for SYSTEM_POST +-- ---------------------------- +DROP TABLE "SYSTEM_POST"; +CREATE TABLE "SYSTEM_POST" ( + "ID" NUMBER(20,0) NOT NULL, + "CODE" NVARCHAR2(64), + "NAME" NVARCHAR2(50), + "SORT" NUMBER(11,0) NOT NULL, + "STATUS" NUMBER(4,0) NOT NULL, + "REMARK" NVARCHAR2(500), + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "TENANT_ID" NUMBER(20,0) NOT NULL, + "DELETED" NUMBER(1,0) DEFAULT 0 NOT NULL +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "SYSTEM_POST"."ID" IS '岗位ID'; +COMMENT ON COLUMN "SYSTEM_POST"."CODE" IS '岗位编码'; +COMMENT ON COLUMN "SYSTEM_POST"."NAME" IS '岗位名称'; +COMMENT ON COLUMN "SYSTEM_POST"."SORT" IS '显示顺序'; +COMMENT ON COLUMN "SYSTEM_POST"."STATUS" IS '状态(0正常 1停用)'; +COMMENT ON COLUMN "SYSTEM_POST"."REMARK" IS '备注'; +COMMENT ON COLUMN "SYSTEM_POST"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "SYSTEM_POST"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SYSTEM_POST"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "SYSTEM_POST"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "SYSTEM_POST"."TENANT_ID" IS '租户编号'; +COMMENT ON COLUMN "SYSTEM_POST"."DELETED" IS '是否删除'; +COMMENT ON TABLE "SYSTEM_POST" IS '岗位信息表'; + +-- ---------------------------- +-- Records of SYSTEM_POST +-- ---------------------------- +INSERT INTO "SYSTEM_POST" ("ID", "CODE", "NAME", "SORT", "STATUS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1', 'ceo', '董事长', '1', '0', NULL, 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-04 17:50:40', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_POST" ("ID", "CODE", "NAME", "SORT", "STATUS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('2', 'se', '项目经理', '2', '0', NULL, 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2021-12-12 10:47:47', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_POST" ("ID", "CODE", "NAME", "SORT", "STATUS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('3', 'hr', '人力资源', '3', '0', NULL, 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2021-12-12 10:47:50', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_POST" ("ID", "CODE", "NAME", "SORT", "STATUS", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('4', 'user', '普通员工', '4', '0', NULL, 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2021-12-12 10:47:51', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for SYSTEM_ROLE +-- ---------------------------- +DROP TABLE "SYSTEM_ROLE"; +CREATE TABLE "SYSTEM_ROLE" ( + "ID" NUMBER(20,0) NOT NULL, + "NAME" NVARCHAR2(30), + "CODE" NVARCHAR2(100), + "SORT" NUMBER(11,0) NOT NULL, + "DATA_SCOPE" NUMBER(4,0) NOT NULL, + "DATA_SCOPE_DEPT_IDS" NVARCHAR2(500), + "STATUS" NUMBER(4,0) NOT NULL, + "TYPE" NUMBER(4,0) NOT NULL, + "REMARK" NVARCHAR2(500), + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "TENANT_ID" NUMBER(20,0) NOT NULL, + "DELETED" NUMBER(1,0) DEFAULT 0 NOT NULL +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "SYSTEM_ROLE"."ID" IS '角色ID'; +COMMENT ON COLUMN "SYSTEM_ROLE"."NAME" IS '角色名称'; +COMMENT ON COLUMN "SYSTEM_ROLE"."CODE" IS '角色权限字符串'; +COMMENT ON COLUMN "SYSTEM_ROLE"."SORT" IS '显示顺序'; +COMMENT ON COLUMN "SYSTEM_ROLE"."DATA_SCOPE" IS '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)'; +COMMENT ON COLUMN "SYSTEM_ROLE"."DATA_SCOPE_DEPT_IDS" IS '数据范围(指定部门数组)'; +COMMENT ON COLUMN "SYSTEM_ROLE"."STATUS" IS '角色状态(0正常 1停用)'; +COMMENT ON COLUMN "SYSTEM_ROLE"."TYPE" IS '角色类型'; +COMMENT ON COLUMN "SYSTEM_ROLE"."REMARK" IS '备注'; +COMMENT ON COLUMN "SYSTEM_ROLE"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "SYSTEM_ROLE"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SYSTEM_ROLE"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "SYSTEM_ROLE"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "SYSTEM_ROLE"."TENANT_ID" IS '租户编号'; +COMMENT ON COLUMN "SYSTEM_ROLE"."DELETED" IS '是否删除'; +COMMENT ON TABLE "SYSTEM_ROLE" IS '角色信息表'; + +-- ---------------------------- +-- Records of SYSTEM_ROLE +-- ---------------------------- +INSERT INTO "SYSTEM_ROLE" ("ID", "NAME", "CODE", "SORT", "DATA_SCOPE", "DATA_SCOPE_DEPT_IDS", "STATUS", "TYPE", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1', '超级管理员', 'super_admin', '1', '1', NULL, '0', '1', '超级管理员', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-02-22 05:08:21', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE" ("ID", "NAME", "CODE", "SORT", "DATA_SCOPE", "DATA_SCOPE_DEPT_IDS", "STATUS", "TYPE", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('2', '普通角色', 'common', '2', '2', NULL, '0', '1', '普通角色', 'admin', TO_DATE('2021-01-05 17:03:48', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-02-22 05:08:20', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE" ("ID", "NAME", "CODE", "SORT", "DATA_SCOPE", "DATA_SCOPE_DEPT_IDS", "STATUS", "TYPE", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('101', '测试账号', 'test', '0', '1', '[]', '0', '2', '132', NULL, TO_DATE('2021-01-06 13:49:35', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 22:00:41', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE" ("ID", "NAME", "CODE", "SORT", "DATA_SCOPE", "DATA_SCOPE_DEPT_IDS", "STATUS", "TYPE", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('109', '租户管理员', 'tenant_admin', '0', '1', NULL, '0', '1', '系统自动生成', '1', TO_DATE('2022-02-22 00:56:14', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-22 00:56:14', 'SYYYY-MM-DD HH24:MI:SS'), '121', '0'); +INSERT INTO "SYSTEM_ROLE" ("ID", "NAME", "CODE", "SORT", "DATA_SCOPE", "DATA_SCOPE_DEPT_IDS", "STATUS", "TYPE", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('110', '测试角色', 'test', '0', '1', '[]', '0', '2', '嘿嘿', '110', TO_DATE('2022-02-23 00:14:34', 'SYYYY-MM-DD HH24:MI:SS'), '110', TO_DATE('2022-02-23 13:14:58', 'SYYYY-MM-DD HH24:MI:SS'), '121', '0'); +INSERT INTO "SYSTEM_ROLE" ("ID", "NAME", "CODE", "SORT", "DATA_SCOPE", "DATA_SCOPE_DEPT_IDS", "STATUS", "TYPE", "REMARK", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('111', '租户管理员', 'tenant_admin', '0', '1', NULL, '0', '1', '系统自动生成', '1', TO_DATE('2022-03-07 21:37:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-07 21:37:58', 'SYYYY-MM-DD HH24:MI:SS'), '122', '0'); +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for SYSTEM_ROLE_MENU +-- ---------------------------- +DROP TABLE "SYSTEM_ROLE_MENU"; +CREATE TABLE "SYSTEM_ROLE_MENU" ( + "ID" NUMBER(20,0) NOT NULL, + "ROLE_ID" NUMBER(20,0) NOT NULL, + "MENU_ID" NUMBER(20,0) NOT NULL, + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "TENANT_ID" NUMBER(20,0) NOT NULL, + "DELETED" NUMBER(1,0) DEFAULT 0 NOT NULL +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "SYSTEM_ROLE_MENU"."ID" IS '自增编号'; +COMMENT ON COLUMN "SYSTEM_ROLE_MENU"."ROLE_ID" IS '角色ID'; +COMMENT ON COLUMN "SYSTEM_ROLE_MENU"."MENU_ID" IS '菜单ID'; +COMMENT ON COLUMN "SYSTEM_ROLE_MENU"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "SYSTEM_ROLE_MENU"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SYSTEM_ROLE_MENU"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "SYSTEM_ROLE_MENU"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "SYSTEM_ROLE_MENU"."TENANT_ID" IS '租户编号'; +COMMENT ON COLUMN "SYSTEM_ROLE_MENU"."DELETED" IS '是否删除'; +COMMENT ON TABLE "SYSTEM_ROLE_MENU" IS '角色和菜单关联表'; + +-- ---------------------------- +-- Records of SYSTEM_ROLE_MENU +-- ---------------------------- +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('434', '2', '1', '1', TO_DATE('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('454', '2', '1093', '1', TO_DATE('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('455', '2', '1094', '1', TO_DATE('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('460', '2', '1100', '1', TO_DATE('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('467', '2', '1107', '1', TO_DATE('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('470', '2', '1110', '1', TO_DATE('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('476', '2', '1117', '1', TO_DATE('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('477', '2', '100', '1', TO_DATE('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('478', '2', '101', '1', TO_DATE('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('479', '2', '102', '1', TO_DATE('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('480', '2', '1126', '1', TO_DATE('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('481', '2', '103', '1', TO_DATE('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('483', '2', '104', '1', TO_DATE('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('485', '2', '105', '1', TO_DATE('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('488', '2', '107', '1', TO_DATE('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('490', '2', '108', '1', TO_DATE('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('492', '2', '109', '1', TO_DATE('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('498', '2', '1138', '1', TO_DATE('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('523', '2', '1224', '1', TO_DATE('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('524', '2', '1225', '1', TO_DATE('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('541', '2', '500', '1', TO_DATE('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('543', '2', '501', '1', TO_DATE('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-22 13:09:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('675', '2', '2', '1', TO_DATE('2022-02-22 13:16:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-22 13:16:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('689', '2', '1077', '1', TO_DATE('2022-02-22 13:16:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-22 13:16:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('690', '2', '1078', '1', TO_DATE('2022-02-22 13:16:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-22 13:16:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('692', '2', '1083', '1', TO_DATE('2022-02-22 13:16:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-22 13:16:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('693', '2', '1084', '1', TO_DATE('2022-02-22 13:16:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-22 13:16:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('699', '2', '1090', '1', TO_DATE('2022-02-22 13:16:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-22 13:16:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('702', '2', '1116', '1', TO_DATE('2022-02-22 13:16:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-22 13:16:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('703', '2', '106', '1', TO_DATE('2022-02-22 13:16:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-22 13:16:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('704', '2', '110', '1', TO_DATE('2022-02-22 13:16:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-22 13:16:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('705', '2', '111', '1', TO_DATE('2022-02-22 13:16:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-22 13:16:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('706', '2', '112', '1', TO_DATE('2022-02-22 13:16:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-22 13:16:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('707', '2', '113', '1', TO_DATE('2022-02-22 13:16:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-22 13:16:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('263', '109', '1', '1', TO_DATE('2022-02-22 00:56:14', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-22 00:56:14', 'SYYYY-MM-DD HH24:MI:SS'), '121', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1486', '109', '103', '1', TO_DATE('2022-02-23 19:32:14', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-23 19:32:14', 'SYYYY-MM-DD HH24:MI:SS'), '121', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1487', '109', '104', '1', TO_DATE('2022-02-23 19:32:14', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-23 19:32:14', 'SYYYY-MM-DD HH24:MI:SS'), '121', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1489', '1', '1', '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1490', '1', '2', '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1494', '1', '1077', '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1495', '1', '1078', '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1496', '1', '1083', '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1497', '1', '1084', '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1498', '1', '1090', '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1499', '1', '1093', '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1500', '1', '1094', '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1501', '1', '1100', '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1502', '1', '1107', '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1503', '1', '1110', '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1504', '1', '1116', '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1505', '1', '1117', '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1506', '1', '100', '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1507', '1', '101', '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1508', '1', '102', '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1509', '1', '1126', '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1510', '1', '103', '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1511', '1', '104', '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1512', '1', '105', '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1513', '1', '106', '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1514', '1', '107', '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1515', '1', '108', '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1516', '1', '109', '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1517', '1', '110', '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1518', '1', '111', '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1519', '1', '112', '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1520', '1', '113', '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1522', '1', '1138', '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1525', '1', '1224', '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1526', '1', '1225', '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1527', '1', '500', '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1528', '1', '501', '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-23 20:03:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1529', '109', '1024', '1', TO_DATE('2022-02-23 20:30:14', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-23 20:30:14', 'SYYYY-MM-DD HH24:MI:SS'), '121', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1530', '109', '1025', '1', TO_DATE('2022-02-23 20:30:14', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-23 20:30:14', 'SYYYY-MM-DD HH24:MI:SS'), '121', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1536', '109', '1017', '1', TO_DATE('2022-02-23 20:30:14', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-23 20:30:14', 'SYYYY-MM-DD HH24:MI:SS'), '121', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1537', '109', '1018', '1', TO_DATE('2022-02-23 20:30:14', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-23 20:30:14', 'SYYYY-MM-DD HH24:MI:SS'), '121', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1538', '109', '1019', '1', TO_DATE('2022-02-23 20:30:14', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-23 20:30:14', 'SYYYY-MM-DD HH24:MI:SS'), '121', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1539', '109', '1020', '1', TO_DATE('2022-02-23 20:30:14', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-23 20:30:14', 'SYYYY-MM-DD HH24:MI:SS'), '121', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1540', '109', '1021', '1', TO_DATE('2022-02-23 20:30:14', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-23 20:30:14', 'SYYYY-MM-DD HH24:MI:SS'), '121', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1541', '109', '1022', '1', TO_DATE('2022-02-23 20:30:14', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-23 20:30:14', 'SYYYY-MM-DD HH24:MI:SS'), '121', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1542', '109', '1023', '1', TO_DATE('2022-02-23 20:30:14', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-23 20:30:14', 'SYYYY-MM-DD HH24:MI:SS'), '121', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1576', '111', '1024', '1', TO_DATE('2022-03-07 21:37:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-07 21:37:58', 'SYYYY-MM-DD HH24:MI:SS'), '122', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1577', '111', '1025', '1', TO_DATE('2022-03-07 21:37:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-07 21:37:58', 'SYYYY-MM-DD HH24:MI:SS'), '122', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1578', '111', '1', '1', TO_DATE('2022-03-07 21:37:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-07 21:37:58', 'SYYYY-MM-DD HH24:MI:SS'), '122', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1584', '111', '103', '1', TO_DATE('2022-03-07 21:37:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-07 21:37:58', 'SYYYY-MM-DD HH24:MI:SS'), '122', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1585', '111', '104', '1', TO_DATE('2022-03-07 21:37:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-07 21:37:58', 'SYYYY-MM-DD HH24:MI:SS'), '122', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1587', '111', '1017', '1', TO_DATE('2022-03-07 21:37:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-07 21:37:58', 'SYYYY-MM-DD HH24:MI:SS'), '122', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1588', '111', '1018', '1', TO_DATE('2022-03-07 21:37:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-07 21:37:58', 'SYYYY-MM-DD HH24:MI:SS'), '122', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1589', '111', '1019', '1', TO_DATE('2022-03-07 21:37:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-07 21:37:58', 'SYYYY-MM-DD HH24:MI:SS'), '122', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1590', '111', '1020', '1', TO_DATE('2022-03-07 21:37:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-07 21:37:58', 'SYYYY-MM-DD HH24:MI:SS'), '122', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1591', '111', '1021', '1', TO_DATE('2022-03-07 21:37:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-07 21:37:58', 'SYYYY-MM-DD HH24:MI:SS'), '122', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1592', '111', '1022', '1', TO_DATE('2022-03-07 21:37:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-07 21:37:58', 'SYYYY-MM-DD HH24:MI:SS'), '122', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1593', '111', '1023', '1', TO_DATE('2022-03-07 21:37:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-07 21:37:58', 'SYYYY-MM-DD HH24:MI:SS'), '122', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1594', '109', '102', '1', TO_DATE('2022-03-19 18:39:13', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 18:39:13', 'SYYYY-MM-DD HH24:MI:SS'), '121', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1595', '109', '1013', '1', TO_DATE('2022-03-19 18:39:13', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 18:39:13', 'SYYYY-MM-DD HH24:MI:SS'), '121', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1596', '109', '1014', '1', TO_DATE('2022-03-19 18:39:13', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 18:39:13', 'SYYYY-MM-DD HH24:MI:SS'), '121', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1597', '109', '1015', '1', TO_DATE('2022-03-19 18:39:13', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 18:39:13', 'SYYYY-MM-DD HH24:MI:SS'), '121', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1598', '109', '1016', '1', TO_DATE('2022-03-19 18:39:13', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 18:39:13', 'SYYYY-MM-DD HH24:MI:SS'), '121', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1599', '111', '102', '1', TO_DATE('2022-03-19 18:39:13', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 18:39:13', 'SYYYY-MM-DD HH24:MI:SS'), '122', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1600', '111', '1013', '1', TO_DATE('2022-03-19 18:39:13', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 18:39:13', 'SYYYY-MM-DD HH24:MI:SS'), '122', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1601', '111', '1014', '1', TO_DATE('2022-03-19 18:39:13', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 18:39:13', 'SYYYY-MM-DD HH24:MI:SS'), '122', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1602', '111', '1015', '1', TO_DATE('2022-03-19 18:39:13', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 18:39:13', 'SYYYY-MM-DD HH24:MI:SS'), '122', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1603', '111', '1016', '1', TO_DATE('2022-03-19 18:39:13', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 18:39:13', 'SYYYY-MM-DD HH24:MI:SS'), '122', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1604', '101', '1216', '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1605', '101', '1217', '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1606', '101', '1218', '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1607', '101', '1219', '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1608', '101', '1220', '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1609', '101', '1221', '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1610', '101', '5', '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1611', '101', '1222', '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1612', '101', '1118', '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1613', '101', '1119', '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1614', '101', '1120', '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1615', '101', '1185', '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1616', '101', '1186', '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1617', '101', '1187', '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1618', '101', '1188', '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1619', '101', '1189', '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1620', '101', '1190', '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1621', '101', '1191', '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1622', '101', '1192', '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1623', '101', '1193', '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1624', '101', '1194', '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1625', '101', '1195', '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1626', '101', '1196', '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1627', '101', '1197', '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1628', '101', '1198', '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1629', '101', '1199', '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1630', '101', '1200', '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1631', '101', '1201', '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1632', '101', '1202', '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1633', '101', '1207', '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1634', '101', '1208', '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1635', '101', '1209', '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1636', '101', '1210', '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1637', '101', '1211', '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1638', '101', '1212', '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1639', '101', '1213', '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1640', '101', '1215', '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 21:45:52', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_ROLE_MENU" ("ID", "ROLE_ID", "MENU_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1296', '110', '1', '110', TO_DATE('2022-02-23 00:23:55', 'SYYYY-MM-DD HH24:MI:SS'), '110', TO_DATE('2022-02-23 00:23:55', 'SYYYY-MM-DD HH24:MI:SS'), '121', '0'); +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for SYSTEM_SENSITIVE_WORD +-- ---------------------------- +DROP TABLE "SYSTEM_SENSITIVE_WORD"; +CREATE TABLE "SYSTEM_SENSITIVE_WORD" ( + "ID" NUMBER(20,0) NOT NULL, + "NAME" NVARCHAR2(255) NOT NULL, + "DESCRIPTION" NVARCHAR2(512), + "TAGS" NVARCHAR2(255), + "STATUS" NUMBER(4,0) NOT NULL, + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "DELETED" NUMBER(1,0) DEFAULT 0 NOT NULL +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "SYSTEM_SENSITIVE_WORD"."ID" IS '编号'; +COMMENT ON COLUMN "SYSTEM_SENSITIVE_WORD"."NAME" IS '敏感词'; +COMMENT ON COLUMN "SYSTEM_SENSITIVE_WORD"."DESCRIPTION" IS '描述'; +COMMENT ON COLUMN "SYSTEM_SENSITIVE_WORD"."TAGS" IS '标签数组'; +COMMENT ON COLUMN "SYSTEM_SENSITIVE_WORD"."STATUS" IS '状态'; +COMMENT ON COLUMN "SYSTEM_SENSITIVE_WORD"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "SYSTEM_SENSITIVE_WORD"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SYSTEM_SENSITIVE_WORD"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "SYSTEM_SENSITIVE_WORD"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "SYSTEM_SENSITIVE_WORD"."DELETED" IS '是否删除'; +COMMENT ON TABLE "SYSTEM_SENSITIVE_WORD" IS '敏感词'; + +-- ---------------------------- +-- Records of SYSTEM_SENSITIVE_WORD +-- ---------------------------- +INSERT INTO "SYSTEM_SENSITIVE_WORD" ("ID", "NAME", "DESCRIPTION", "TAGS", "STATUS", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1', '测试', '啊哈哈', '论坛,吃瓜', '0', '1', TO_DATE('2022-04-08 19:51:45', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-08 12:10:45', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_SENSITIVE_WORD" ("ID", "NAME", "DESCRIPTION", "TAGS", "STATUS", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('2', '测试', '哈哈', '论坛,吃瓜,蔬菜', '0', '1', TO_DATE('2022-04-08 20:10:27', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-04-08 13:13:52', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for SYSTEM_SMS_CHANNEL +-- ---------------------------- +DROP TABLE "SYSTEM_SMS_CHANNEL"; +CREATE TABLE "SYSTEM_SMS_CHANNEL" ( + "ID" NUMBER(20,0) NOT NULL, + "SIGNATURE" NVARCHAR2(12), + "CODE" NVARCHAR2(63), + "STATUS" NUMBER(4,0) NOT NULL, + "REMARK" NVARCHAR2(255), + "API_KEY" NVARCHAR2(128), + "API_SECRET" NVARCHAR2(128), + "CALLBACK_URL" NVARCHAR2(255), + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "DELETED" NUMBER(1,0) DEFAULT 0 NOT NULL +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "SYSTEM_SMS_CHANNEL"."ID" IS '编号'; +COMMENT ON COLUMN "SYSTEM_SMS_CHANNEL"."SIGNATURE" IS '短信签名'; +COMMENT ON COLUMN "SYSTEM_SMS_CHANNEL"."CODE" IS '渠道编码'; +COMMENT ON COLUMN "SYSTEM_SMS_CHANNEL"."STATUS" IS '开启状态'; +COMMENT ON COLUMN "SYSTEM_SMS_CHANNEL"."REMARK" IS '备注'; +COMMENT ON COLUMN "SYSTEM_SMS_CHANNEL"."API_KEY" IS '短信 API 的账号'; +COMMENT ON COLUMN "SYSTEM_SMS_CHANNEL"."API_SECRET" IS '短信 API 的秘钥'; +COMMENT ON COLUMN "SYSTEM_SMS_CHANNEL"."CALLBACK_URL" IS '短信发送回调 URL'; +COMMENT ON COLUMN "SYSTEM_SMS_CHANNEL"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "SYSTEM_SMS_CHANNEL"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SYSTEM_SMS_CHANNEL"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "SYSTEM_SMS_CHANNEL"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "SYSTEM_SMS_CHANNEL"."DELETED" IS '是否删除'; +COMMENT ON TABLE "SYSTEM_SMS_CHANNEL" IS '短信渠道'; + +-- ---------------------------- +-- Records of SYSTEM_SMS_CHANNEL +-- ---------------------------- +INSERT INTO "SYSTEM_SMS_CHANNEL" ("ID", "SIGNATURE", "CODE", "STATUS", "REMARK", "API_KEY", "API_SECRET", "CALLBACK_URL", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('2', 'Ballcat', 'ALIYUN', '0', '啦啦啦', 'LTAI5tCnKso2uG3kJ5gRav88', 'fGJ5SNXL7P1NHNRmJ7DJaMJGPyE55C', NULL, NULL, TO_DATE('2021-03-31 11:53:10', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2021-04-14 00:08:37', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_SMS_CHANNEL" ("ID", "SIGNATURE", "CODE", "STATUS", "REMARK", "API_KEY", "API_SECRET", "CALLBACK_URL", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('4', '测试渠道', 'DEBUG_DING_TALK', '0', '123', '696b5d8ead48071237e4aa5861ff08dbadb2b4ded1c688a7b7c9afc615579859', 'SEC5c4e5ff888bc8a9923ae47f59e7ccd30af1f14d93c55b4e2c9cb094e35aeed67', NULL, '1', TO_DATE('2021-04-13 00:23:14', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2021-04-14 00:07:10', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for SYSTEM_SMS_CODE +-- ---------------------------- +DROP TABLE "SYSTEM_SMS_CODE"; +CREATE TABLE "SYSTEM_SMS_CODE" ( + "ID" NUMBER(20,0) NOT NULL, + "MOBILE" NVARCHAR2(11), + "CODE" NVARCHAR2(6), + "CREATE_IP" NVARCHAR2(15), + "SCENE" NUMBER(4,0) NOT NULL, + "TODAY_INDEX" NUMBER(4,0) NOT NULL, + "USED" NUMBER(4,0) NOT NULL, + "USED_TIME" DATE, + "USED_IP" NVARCHAR2(255), + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "TENANT_ID" NUMBER(20,0) NOT NULL, + "DELETED" NUMBER(1,0) DEFAULT 0 NOT NULL +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "SYSTEM_SMS_CODE"."ID" IS '编号'; +COMMENT ON COLUMN "SYSTEM_SMS_CODE"."MOBILE" IS '手机号'; +COMMENT ON COLUMN "SYSTEM_SMS_CODE"."CODE" IS '验证码'; +COMMENT ON COLUMN "SYSTEM_SMS_CODE"."CREATE_IP" IS '创建 IP'; +COMMENT ON COLUMN "SYSTEM_SMS_CODE"."SCENE" IS '发送场景'; +COMMENT ON COLUMN "SYSTEM_SMS_CODE"."TODAY_INDEX" IS '今日发送的第几条'; +COMMENT ON COLUMN "SYSTEM_SMS_CODE"."USED" IS '是否使用'; +COMMENT ON COLUMN "SYSTEM_SMS_CODE"."USED_TIME" IS '使用时间'; +COMMENT ON COLUMN "SYSTEM_SMS_CODE"."USED_IP" IS '使用 IP'; +COMMENT ON COLUMN "SYSTEM_SMS_CODE"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "SYSTEM_SMS_CODE"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SYSTEM_SMS_CODE"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "SYSTEM_SMS_CODE"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "SYSTEM_SMS_CODE"."TENANT_ID" IS '租户编号'; +COMMENT ON COLUMN "SYSTEM_SMS_CODE"."DELETED" IS '是否删除'; +COMMENT ON TABLE "SYSTEM_SMS_CODE" IS '手机验证码'; + +-- ---------------------------- +-- Records of SYSTEM_SMS_CODE +-- ---------------------------- +INSERT INTO "SYSTEM_SMS_CODE" ("ID", "MOBILE", "CODE", "CREATE_IP", "SCENE", "TODAY_INDEX", "USED", "USED_TIME", "USED_IP", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('0', '15601691399', '9999', '127.0.0.1', '1', '1', '0', NULL, NULL, NULL, TO_DATE('2022-05-01 17:52:58', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-05-01 17:52:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for SYSTEM_SMS_LOG +-- ---------------------------- +DROP TABLE "SYSTEM_SMS_LOG"; +CREATE TABLE "SYSTEM_SMS_LOG" ( + "ID" NUMBER(20,0) NOT NULL, + "CHANNEL_ID" NUMBER(20,0) NOT NULL, + "CHANNEL_CODE" NVARCHAR2(63), + "TEMPLATE_ID" NUMBER(20,0) NOT NULL, + "TEMPLATE_CODE" NVARCHAR2(63), + "TEMPLATE_TYPE" NUMBER(4,0) NOT NULL, + "TEMPLATE_CONTENT" NVARCHAR2(255), + "TEMPLATE_PARAMS" NVARCHAR2(255), + "API_TEMPLATE_ID" NVARCHAR2(63), + "MOBILE" NVARCHAR2(11), + "USER_ID" NUMBER(20,0), + "USER_TYPE" NUMBER(4,0), + "SEND_STATUS" NUMBER(4,0) NOT NULL, + "SEND_TIME" DATE, + "SEND_CODE" NUMBER(11,0), + "SEND_MSG" NVARCHAR2(255), + "API_SEND_CODE" NVARCHAR2(63), + "API_SEND_MSG" NVARCHAR2(255), + "API_REQUEST_ID" NVARCHAR2(255), + "API_SERIAL_NO" NVARCHAR2(255), + "RECEIVE_STATUS" NUMBER(4,0) NOT NULL, + "RECEIVE_TIME" DATE, + "API_RECEIVE_CODE" NVARCHAR2(63), + "API_RECEIVE_MSG" NVARCHAR2(255), + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "DELETED" NUMBER(1,0) DEFAULT 0 NOT NULL +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "SYSTEM_SMS_LOG"."ID" IS '编号'; +COMMENT ON COLUMN "SYSTEM_SMS_LOG"."CHANNEL_ID" IS '短信渠道编号'; +COMMENT ON COLUMN "SYSTEM_SMS_LOG"."CHANNEL_CODE" IS '短信渠道编码'; +COMMENT ON COLUMN "SYSTEM_SMS_LOG"."TEMPLATE_ID" IS '模板编号'; +COMMENT ON COLUMN "SYSTEM_SMS_LOG"."TEMPLATE_CODE" IS '模板编码'; +COMMENT ON COLUMN "SYSTEM_SMS_LOG"."TEMPLATE_TYPE" IS '短信类型'; +COMMENT ON COLUMN "SYSTEM_SMS_LOG"."TEMPLATE_CONTENT" IS '短信内容'; +COMMENT ON COLUMN "SYSTEM_SMS_LOG"."TEMPLATE_PARAMS" IS '短信参数'; +COMMENT ON COLUMN "SYSTEM_SMS_LOG"."API_TEMPLATE_ID" IS '短信 API 的模板编号'; +COMMENT ON COLUMN "SYSTEM_SMS_LOG"."MOBILE" IS '手机号'; +COMMENT ON COLUMN "SYSTEM_SMS_LOG"."USER_ID" IS '用户编号'; +COMMENT ON COLUMN "SYSTEM_SMS_LOG"."USER_TYPE" IS '用户类型'; +COMMENT ON COLUMN "SYSTEM_SMS_LOG"."SEND_STATUS" IS '发送状态'; +COMMENT ON COLUMN "SYSTEM_SMS_LOG"."SEND_TIME" IS '发送时间'; +COMMENT ON COLUMN "SYSTEM_SMS_LOG"."SEND_CODE" IS '发送结果的编码'; +COMMENT ON COLUMN "SYSTEM_SMS_LOG"."SEND_MSG" IS '发送结果的提示'; +COMMENT ON COLUMN "SYSTEM_SMS_LOG"."API_SEND_CODE" IS '短信 API 发送结果的编码'; +COMMENT ON COLUMN "SYSTEM_SMS_LOG"."API_SEND_MSG" IS '短信 API 发送失败的提示'; +COMMENT ON COLUMN "SYSTEM_SMS_LOG"."API_REQUEST_ID" IS '短信 API 发送返回的唯一请求 ID'; +COMMENT ON COLUMN "SYSTEM_SMS_LOG"."API_SERIAL_NO" IS '短信 API 发送返回的序号'; +COMMENT ON COLUMN "SYSTEM_SMS_LOG"."RECEIVE_STATUS" IS '接收状态'; +COMMENT ON COLUMN "SYSTEM_SMS_LOG"."RECEIVE_TIME" IS '接收时间'; +COMMENT ON COLUMN "SYSTEM_SMS_LOG"."API_RECEIVE_CODE" IS 'API 接收结果的编码'; +COMMENT ON COLUMN "SYSTEM_SMS_LOG"."API_RECEIVE_MSG" IS 'API 接收结果的说明'; +COMMENT ON COLUMN "SYSTEM_SMS_LOG"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "SYSTEM_SMS_LOG"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SYSTEM_SMS_LOG"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "SYSTEM_SMS_LOG"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "SYSTEM_SMS_LOG"."DELETED" IS '是否删除'; +COMMENT ON TABLE "SYSTEM_SMS_LOG" IS '短信日志'; + +-- ---------------------------- +-- Records of SYSTEM_SMS_LOG +-- ---------------------------- +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for SYSTEM_SMS_TEMPLATE +-- ---------------------------- +DROP TABLE "SYSTEM_SMS_TEMPLATE"; +CREATE TABLE "SYSTEM_SMS_TEMPLATE" ( + "ID" NUMBER(20,0) NOT NULL, + "TYPE" NUMBER(4,0) NOT NULL, + "STATUS" NUMBER(4,0) NOT NULL, + "CODE" NVARCHAR2(63), + "NAME" NVARCHAR2(63), + "CONTENT" NVARCHAR2(255), + "PARAMS" NVARCHAR2(255), + "REMARK" NVARCHAR2(255), + "API_TEMPLATE_ID" NVARCHAR2(63), + "CHANNEL_ID" NUMBER(20,0) NOT NULL, + "CHANNEL_CODE" NVARCHAR2(63), + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "DELETED" NUMBER(1,0) DEFAULT 0 NOT NULL +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "SYSTEM_SMS_TEMPLATE"."ID" IS '编号'; +COMMENT ON COLUMN "SYSTEM_SMS_TEMPLATE"."TYPE" IS '短信签名'; +COMMENT ON COLUMN "SYSTEM_SMS_TEMPLATE"."STATUS" IS '开启状态'; +COMMENT ON COLUMN "SYSTEM_SMS_TEMPLATE"."CODE" IS '模板编码'; +COMMENT ON COLUMN "SYSTEM_SMS_TEMPLATE"."NAME" IS '模板名称'; +COMMENT ON COLUMN "SYSTEM_SMS_TEMPLATE"."CONTENT" IS '模板内容'; +COMMENT ON COLUMN "SYSTEM_SMS_TEMPLATE"."PARAMS" IS '参数数组'; +COMMENT ON COLUMN "SYSTEM_SMS_TEMPLATE"."REMARK" IS '备注'; +COMMENT ON COLUMN "SYSTEM_SMS_TEMPLATE"."API_TEMPLATE_ID" IS '短信 API 的模板编号'; +COMMENT ON COLUMN "SYSTEM_SMS_TEMPLATE"."CHANNEL_ID" IS '短信渠道编号'; +COMMENT ON COLUMN "SYSTEM_SMS_TEMPLATE"."CHANNEL_CODE" IS '短信渠道编码'; +COMMENT ON COLUMN "SYSTEM_SMS_TEMPLATE"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "SYSTEM_SMS_TEMPLATE"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SYSTEM_SMS_TEMPLATE"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "SYSTEM_SMS_TEMPLATE"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "SYSTEM_SMS_TEMPLATE"."DELETED" IS '是否删除'; +COMMENT ON TABLE "SYSTEM_SMS_TEMPLATE" IS '短信模板'; + +-- ---------------------------- +-- Records of SYSTEM_SMS_TEMPLATE +-- ---------------------------- +INSERT INTO "SYSTEM_SMS_TEMPLATE" ("ID", "TYPE", "STATUS", "CODE", "NAME", "CONTENT", "PARAMS", "REMARK", "API_TEMPLATE_ID", "CHANNEL_ID", "CHANNEL_CODE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('2', '1', '0', 'test_01', '测试验证码短信', '正在进行登录操作{operation},您的验证码是{code}', '["operation","code"]', NULL, '4383920', '1', 'YUN_PIAN', NULL, TO_DATE('2021-03-31 10:49:38', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2021-04-10 01:22:00', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_SMS_TEMPLATE" ("ID", "TYPE", "STATUS", "CODE", "NAME", "CONTENT", "PARAMS", "REMARK", "API_TEMPLATE_ID", "CHANNEL_ID", "CHANNEL_CODE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('3', '1', '0', 'test_02', '公告通知', '您的验证码{code},该验证码5分钟内有效,请勿泄漏于他人!', '["code"]', NULL, 'SMS_207945135', '2', 'ALIYUN', NULL, TO_DATE('2021-03-31 11:56:30', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2021-04-10 01:22:02', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_SMS_TEMPLATE" ("ID", "TYPE", "STATUS", "CODE", "NAME", "CONTENT", "PARAMS", "REMARK", "API_TEMPLATE_ID", "CHANNEL_ID", "CHANNEL_CODE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('6', '3', '0', 'test-01', '测试模板', '哈哈哈 {name}', '["name"]', 'f哈哈哈', '4383920', '1', 'YUN_PIAN', '1', TO_DATE('2021-04-10 01:07:21', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2021-04-10 01:22:05', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_SMS_TEMPLATE" ("ID", "TYPE", "STATUS", "CODE", "NAME", "CONTENT", "PARAMS", "REMARK", "API_TEMPLATE_ID", "CHANNEL_ID", "CHANNEL_CODE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('7', '3', '0', 'test-04', '测试下', '老鸡{name},牛逼{code}', '["name","code"]', NULL, 'suibian', '4', 'DEBUG_DING_TALK', '1', TO_DATE('2021-04-13 00:29:53', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2021-04-14 00:30:38', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_SMS_TEMPLATE" ("ID", "TYPE", "STATUS", "CODE", "NAME", "CONTENT", "PARAMS", "REMARK", "API_TEMPLATE_ID", "CHANNEL_ID", "CHANNEL_CODE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('8', '1', '0', 'user-sms-login', '前台用户短信登录', '您的验证码是{code}', '["code"]', NULL, '4372216', '1', 'YUN_PIAN', '1', TO_DATE('2021-10-11 08:10:00', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2021-10-11 08:10:00', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_SMS_TEMPLATE" ("ID", "TYPE", "STATUS", "CODE", "NAME", "CONTENT", "PARAMS", "REMARK", "API_TEMPLATE_ID", "CHANNEL_ID", "CHANNEL_CODE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('9', '2', '0', 'bpm_task_assigned', '【工作流】任务被分配', '您收到了一条新的待办任务:{processInstanceName}-{taskName},申请人:{startUserNickname},处理链接:{detailUrl}', '["processInstanceName","taskName","startUserNickname","detailUrl"]', NULL, 'suibian', '4', 'DEBUG_DING_TALK', '1', TO_DATE('2022-01-21 22:31:19', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-01-22 00:03:36', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_SMS_TEMPLATE" ("ID", "TYPE", "STATUS", "CODE", "NAME", "CONTENT", "PARAMS", "REMARK", "API_TEMPLATE_ID", "CHANNEL_ID", "CHANNEL_CODE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('10', '2', '0', 'bpm_process_instance_reject', '【工作流】流程被不通过', '您的流程被审批不通过:{processInstanceName},原因:{reason},查看链接:{detailUrl}', '["processInstanceName","reason","detailUrl"]', NULL, 'suibian', '4', 'DEBUG_DING_TALK', '1', TO_DATE('2022-01-22 00:03:31', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-01-22 00:24:31', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_SMS_TEMPLATE" ("ID", "TYPE", "STATUS", "CODE", "NAME", "CONTENT", "PARAMS", "REMARK", "API_TEMPLATE_ID", "CHANNEL_ID", "CHANNEL_CODE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('11', '2', '0', 'bpm_process_instance_approve', '【工作流】流程被通过', '您的流程被审批通过:{processInstanceName},查看链接:{detailUrl}', '["processInstanceName","detailUrl"]', NULL, 'suibian', '4', 'DEBUG_DING_TALK', '1', TO_DATE('2022-01-22 00:04:31', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-01-22 00:24:23', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_SMS_TEMPLATE" ("ID", "TYPE", "STATUS", "CODE", "NAME", "CONTENT", "PARAMS", "REMARK", "API_TEMPLATE_ID", "CHANNEL_ID", "CHANNEL_CODE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('13', '1', '0', 'admin-sms-login', '后台用户短信登录', '您的验证码是{code}', '["code"]', NULL, '4372216', '1', 'YUN_PIAN', '1', TO_DATE('2021-10-11 08:10:00', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2021-10-11 08:10:00', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for SYSTEM_SOCIAL_USER +-- ---------------------------- +DROP TABLE "SYSTEM_SOCIAL_USER"; +CREATE TABLE "SYSTEM_SOCIAL_USER" ( + "ID" NUMBER(20,0) NOT NULL, + "USER_ID" NUMBER(20,0) NOT NULL, + "USER_TYPE" NUMBER(4,0) NOT NULL, + "TYPE" NUMBER(4,0) NOT NULL, + "OPENID" NVARCHAR2(32), + "TOKEN" NVARCHAR2(256), + "UNION_ID" NVARCHAR2(32), + "RAW_TOKEN_INFO" NCLOB, + "NICKNAME" NVARCHAR2(32), + "AVATAR" NVARCHAR2(255), + "RAW_USER_INFO" NCLOB, + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "TENANT_ID" NUMBER(20,0) NOT NULL, + "DELETED" NUMBER(1,0) DEFAULT 0 NOT NULL +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "SYSTEM_SOCIAL_USER"."ID" IS '主键(自增策略)'; +COMMENT ON COLUMN "SYSTEM_SOCIAL_USER"."USER_ID" IS '关联的用户编号'; +COMMENT ON COLUMN "SYSTEM_SOCIAL_USER"."USER_TYPE" IS '用户类型'; +COMMENT ON COLUMN "SYSTEM_SOCIAL_USER"."TYPE" IS '社交平台的类型'; +COMMENT ON COLUMN "SYSTEM_SOCIAL_USER"."OPENID" IS '社交 openid'; +COMMENT ON COLUMN "SYSTEM_SOCIAL_USER"."TOKEN" IS '社交 token'; +COMMENT ON COLUMN "SYSTEM_SOCIAL_USER"."UNION_ID" IS '社交的全局编号'; +COMMENT ON COLUMN "SYSTEM_SOCIAL_USER"."RAW_TOKEN_INFO" IS '原始 Token 数据,一般是 JSON 格式'; +COMMENT ON COLUMN "SYSTEM_SOCIAL_USER"."NICKNAME" IS '用户昵称'; +COMMENT ON COLUMN "SYSTEM_SOCIAL_USER"."AVATAR" IS '用户头像'; +COMMENT ON COLUMN "SYSTEM_SOCIAL_USER"."RAW_USER_INFO" IS '原始用户数据,一般是 JSON 格式'; +COMMENT ON COLUMN "SYSTEM_SOCIAL_USER"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "SYSTEM_SOCIAL_USER"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SYSTEM_SOCIAL_USER"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "SYSTEM_SOCIAL_USER"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "SYSTEM_SOCIAL_USER"."TENANT_ID" IS '租户编号'; +COMMENT ON COLUMN "SYSTEM_SOCIAL_USER"."DELETED" IS '是否删除'; +COMMENT ON TABLE "SYSTEM_SOCIAL_USER" IS '社交用户'; + +-- ---------------------------- +-- Records of SYSTEM_SOCIAL_USER +-- ---------------------------- +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for SYSTEM_TENANT +-- ---------------------------- +DROP TABLE "SYSTEM_TENANT"; +CREATE TABLE "SYSTEM_TENANT" ( + "ID" NUMBER(20,0) NOT NULL, + "NAME" NVARCHAR2(30), + "CONTACT_USER_ID" NUMBER(20,0), + "CONTACT_NAME" NVARCHAR2(30), + "CONTACT_MOBILE" NVARCHAR2(500), + "STATUS" NUMBER(4,0) NOT NULL, + "DOMAIN" NVARCHAR2(256), + "PACKAGE_ID" NUMBER(20,0) NOT NULL, + "EXPIRE_TIME" DATE NOT NULL, + "ACCOUNT_COUNT" NUMBER(11,0) NOT NULL, + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "DELETED" NUMBER(1,0) DEFAULT 0 NOT NULL +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "SYSTEM_TENANT"."ID" IS '租户编号'; +COMMENT ON COLUMN "SYSTEM_TENANT"."NAME" IS '租户名'; +COMMENT ON COLUMN "SYSTEM_TENANT"."CONTACT_USER_ID" IS '联系人的用户编号'; +COMMENT ON COLUMN "SYSTEM_TENANT"."CONTACT_NAME" IS '联系人'; +COMMENT ON COLUMN "SYSTEM_TENANT"."CONTACT_MOBILE" IS '联系手机'; +COMMENT ON COLUMN "SYSTEM_TENANT"."STATUS" IS '租户状态(0正常 1停用)'; +COMMENT ON COLUMN "SYSTEM_TENANT"."DOMAIN" IS '绑定域名'; +COMMENT ON COLUMN "SYSTEM_TENANT"."PACKAGE_ID" IS '租户套餐编号'; +COMMENT ON COLUMN "SYSTEM_TENANT"."EXPIRE_TIME" IS '过期时间'; +COMMENT ON COLUMN "SYSTEM_TENANT"."ACCOUNT_COUNT" IS '账号数量'; +COMMENT ON COLUMN "SYSTEM_TENANT"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "SYSTEM_TENANT"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SYSTEM_TENANT"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "SYSTEM_TENANT"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "SYSTEM_TENANT"."DELETED" IS '是否删除'; +COMMENT ON TABLE "SYSTEM_TENANT" IS '租户表'; + +-- ---------------------------- +-- Records of SYSTEM_TENANT +-- ---------------------------- +INSERT INTO "SYSTEM_TENANT" ("ID", "NAME", "CONTACT_USER_ID", "CONTACT_NAME", "CONTACT_MOBILE", "STATUS", "DOMAIN", "PACKAGE_ID", "EXPIRE_TIME", "ACCOUNT_COUNT", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1', '闻荫源码', NULL, '芋艿', '17321315478', '0', 'https://www.iocoder.cn', '0', TO_DATE('2099-02-19 17:14:16', 'SYYYY-MM-DD HH24:MI:SS'), '9999', '1', TO_DATE('2021-01-05 17:03:47', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-23 12:15:11', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_TENANT" ("ID", "NAME", "CONTACT_USER_ID", "CONTACT_NAME", "CONTACT_MOBILE", "STATUS", "DOMAIN", "PACKAGE_ID", "EXPIRE_TIME", "ACCOUNT_COUNT", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('121', '小租户', '110', '小王2', '15601691300', '0', 'http://www.iocoder.cn', '111', TO_DATE('2024-03-11 00:00:00', 'SYYYY-MM-DD HH24:MI:SS'), '20', '1', TO_DATE('2022-02-22 00:56:14', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 18:37:20', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "SYSTEM_TENANT" ("ID", "NAME", "CONTACT_USER_ID", "CONTACT_NAME", "CONTACT_MOBILE", "STATUS", "DOMAIN", "PACKAGE_ID", "EXPIRE_TIME", "ACCOUNT_COUNT", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('122', '测试租户', '113', '闻荫', '15601691300', '0', 'https://www.iocoder.cn', '111', TO_DATE('2022-04-30 00:00:00', 'SYYYY-MM-DD HH24:MI:SS'), '50', '1', TO_DATE('2022-03-07 21:37:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-07 21:37:58', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for SYSTEM_TENANT_PACKAGE +-- ---------------------------- +DROP TABLE "SYSTEM_TENANT_PACKAGE"; +CREATE TABLE "SYSTEM_TENANT_PACKAGE" ( + "ID" NUMBER(20,0) NOT NULL, + "NAME" NVARCHAR2(30), + "STATUS" NUMBER(4,0) NOT NULL, + "REMARK" NVARCHAR2(256), + "MENU_IDS" NCLOB, + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "DELETED" NUMBER(4,0) DEFAULT 0 NOT NULL +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "SYSTEM_TENANT_PACKAGE"."ID" IS '套餐编号'; +COMMENT ON COLUMN "SYSTEM_TENANT_PACKAGE"."NAME" IS '套餐名'; +COMMENT ON COLUMN "SYSTEM_TENANT_PACKAGE"."STATUS" IS '租户状态(0正常 1停用)'; +COMMENT ON COLUMN "SYSTEM_TENANT_PACKAGE"."REMARK" IS '备注'; +COMMENT ON COLUMN "SYSTEM_TENANT_PACKAGE"."MENU_IDS" IS '关联的菜单编号'; +COMMENT ON COLUMN "SYSTEM_TENANT_PACKAGE"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "SYSTEM_TENANT_PACKAGE"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SYSTEM_TENANT_PACKAGE"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "SYSTEM_TENANT_PACKAGE"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "SYSTEM_TENANT_PACKAGE"."DELETED" IS '是否删除'; +COMMENT ON TABLE "SYSTEM_TENANT_PACKAGE" IS '租户套餐表'; + +-- ---------------------------- +-- Records of SYSTEM_TENANT_PACKAGE +-- ---------------------------- +INSERT INTO "SYSTEM_TENANT_PACKAGE" ("ID", "NAME", "STATUS", "REMARK", "MENU_IDS", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('111', '普通套餐', '0', '小功能', '[1024,1025,1,102,103,104,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023]', '1', TO_DATE('2022-02-22 00:54:00', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 18:39:13', 'SYYYY-MM-DD HH24:MI:SS'), '0'); +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for SYSTEM_USERS +-- ---------------------------- +DROP TABLE "SYSTEM_USERS"; +CREATE TABLE "SYSTEM_USERS" ( + "ID" NUMBER(20,0) NOT NULL, + "USERNAME" NVARCHAR2(30), + "PASSWORD" NVARCHAR2(100), + "NICKNAME" NVARCHAR2(30), + "REMARK" NVARCHAR2(500), + "DEPT_ID" NUMBER(20,0), + "POST_IDS" NVARCHAR2(255), + "EMAIL" NVARCHAR2(50), + "MOBILE" NVARCHAR2(11), + "SEX" NUMBER(4,0), + "AVATAR" NVARCHAR2(100), + "STATUS" NUMBER(4,0) NOT NULL, + "LOGIN_IP" NVARCHAR2(50), + "LOGIN_DATE" DATE, + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "TENANT_ID" NUMBER(20,0) NOT NULL, + "DELETED" NUMBER(1,0) DEFAULT 0 NOT NULL +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "SYSTEM_USERS"."ID" IS '用户ID'; +COMMENT ON COLUMN "SYSTEM_USERS"."USERNAME" IS '用户账号'; +COMMENT ON COLUMN "SYSTEM_USERS"."PASSWORD" IS '密码'; +COMMENT ON COLUMN "SYSTEM_USERS"."NICKNAME" IS '用户昵称'; +COMMENT ON COLUMN "SYSTEM_USERS"."REMARK" IS '备注'; +COMMENT ON COLUMN "SYSTEM_USERS"."DEPT_ID" IS '部门ID'; +COMMENT ON COLUMN "SYSTEM_USERS"."POST_IDS" IS '岗位编号数组'; +COMMENT ON COLUMN "SYSTEM_USERS"."EMAIL" IS '用户邮箱'; +COMMENT ON COLUMN "SYSTEM_USERS"."MOBILE" IS '手机号码'; +COMMENT ON COLUMN "SYSTEM_USERS"."SEX" IS '用户性别'; +COMMENT ON COLUMN "SYSTEM_USERS"."AVATAR" IS '头像地址'; +COMMENT ON COLUMN "SYSTEM_USERS"."STATUS" IS '帐号状态(0正常 1停用)'; +COMMENT ON COLUMN "SYSTEM_USERS"."LOGIN_IP" IS '最后登录IP'; +COMMENT ON COLUMN "SYSTEM_USERS"."LOGIN_DATE" IS '最后登录时间'; +COMMENT ON COLUMN "SYSTEM_USERS"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "SYSTEM_USERS"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SYSTEM_USERS"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "SYSTEM_USERS"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "SYSTEM_USERS"."TENANT_ID" IS '租户编号'; +COMMENT ON COLUMN "SYSTEM_USERS"."DELETED" IS '是否删除'; +COMMENT ON TABLE "SYSTEM_USERS" IS '用户信息表'; + +-- ---------------------------- +-- Records of SYSTEM_USERS +-- ---------------------------- +INSERT INTO "SYSTEM_USERS" ("ID", "USERNAME", "PASSWORD", "NICKNAME", "REMARK", "DEPT_ID", "POST_IDS", "EMAIL", "MOBILE", "SEX", "AVATAR", "STATUS", "LOGIN_IP", "LOGIN_DATE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('115', 'anzhen', '$2a$10$Qr2lBUuwvDMb98p/o7iSPuHb7GRi4zPHSq4g01ETuY.l4O5txXfvi', 'anzhen', NULL, '100', '[]', NULL, NULL, NULL, NULL, '0', NULL, NULL, '1', TO_DATE('2022-03-24 18:50:59', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-24 18:50:59', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_USERS" ("ID", "USERNAME", "PASSWORD", "NICKNAME", "REMARK", "DEPT_ID", "POST_IDS", "EMAIL", "MOBILE", "SEX", "AVATAR", "STATUS", "LOGIN_IP", "LOGIN_DATE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1', 'admin', '$2a$10$0acJOIk2D25/oC87nyclE..0lzeu9DtQ/n3geP4fkun/zIVRhHJIO', '闻荫源码', '管理员', '103', '[1,2]', 'aoteman@126.com', '15612345678', '1', 'http://test.win.iocoder.cn/a294ecb2-73dd-4353-bf40-296b8931d0bf', '0', '127.0.0.1', TO_DATE('2022-05-13 09:40:57', 'SYYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2021-01-05 17:03:47', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-05-13 09:40:57', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_USERS" ("ID", "USERNAME", "PASSWORD", "NICKNAME", "REMARK", "DEPT_ID", "POST_IDS", "EMAIL", "MOBILE", "SEX", "AVATAR", "STATUS", "LOGIN_IP", "LOGIN_DATE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('100', 'win', '$2a$10$11U48RhyJ5pSBYWSn12AD./ld671.ycSzJHbyrtpeoMeYiw31eo8a', '闻荫', '不要吓我', '104', '[1]', 'win@iocoder.cn', '15601691300', '1', NULL, '1', NULL, NULL, NULL, TO_DATE('2021-01-07 09:07:17', 'SYYYY-MM-DD HH24:MI:SS'), '104', TO_DATE('2021-12-16 09:26:10', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_USERS" ("ID", "USERNAME", "PASSWORD", "NICKNAME", "REMARK", "DEPT_ID", "POST_IDS", "EMAIL", "MOBILE", "SEX", "AVATAR", "STATUS", "LOGIN_IP", "LOGIN_DATE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('103', 'yuanma', '$2a$10$wWoPT7sqriM2O1YXRL.je.GiL538OR6ZTN8aQZr9JAGdnpCH2tpYe', '源码', NULL, '106', NULL, 'yuanma@iocoder.cn', '15601701300', '0', NULL, '0', '127.0.0.1', TO_DATE('2022-01-18 00:33:40', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2021-01-13 23:50:35', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-01-18 00:33:40', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_USERS" ("ID", "USERNAME", "PASSWORD", "NICKNAME", "REMARK", "DEPT_ID", "POST_IDS", "EMAIL", "MOBILE", "SEX", "AVATAR", "STATUS", "LOGIN_IP", "LOGIN_DATE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('104', 'test', '$2a$10$e5RpuDCC0GYSt0Hvd2.CjujIXwgGct4SnXi6dVGxdgFsnqgEryk5a', '测试号', NULL, '107', '[]', '111@qq.com', '15601691200', '1', NULL, '0', '127.0.0.1', TO_DATE('2022-03-19 21:46:19', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2021-01-21 02:13:53', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-03-19 21:46:19', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_USERS" ("ID", "USERNAME", "PASSWORD", "NICKNAME", "REMARK", "DEPT_ID", "POST_IDS", "EMAIL", "MOBILE", "SEX", "AVATAR", "STATUS", "LOGIN_IP", "LOGIN_DATE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('107', 'admin107', '$2a$10$dYOOBKMO93v/.ReCqzyFg.o67Tqk.bbc2bhrpyBGkIw9aypCtr2pm', '芋艿', NULL, NULL, NULL, NULL, '15601691300', '0', NULL, '0', NULL, NULL, '1', TO_DATE('2022-02-20 22:59:33', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-27 08:26:51', 'SYYYY-MM-DD HH24:MI:SS'), '118', '0'); +INSERT INTO "SYSTEM_USERS" ("ID", "USERNAME", "PASSWORD", "NICKNAME", "REMARK", "DEPT_ID", "POST_IDS", "EMAIL", "MOBILE", "SEX", "AVATAR", "STATUS", "LOGIN_IP", "LOGIN_DATE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('108', 'admin108', '$2a$10$y6mfvKoNYL1GXWak8nYwVOH.kCWqjactkzdoIDgiKl93WN3Ejg.Lu', '芋艿', NULL, NULL, NULL, NULL, '15601691300', '0', NULL, '0', NULL, NULL, '1', TO_DATE('2022-02-20 23:00:50', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-27 08:26:53', 'SYYYY-MM-DD HH24:MI:SS'), '119', '0'); +INSERT INTO "SYSTEM_USERS" ("ID", "USERNAME", "PASSWORD", "NICKNAME", "REMARK", "DEPT_ID", "POST_IDS", "EMAIL", "MOBILE", "SEX", "AVATAR", "STATUS", "LOGIN_IP", "LOGIN_DATE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('109', 'admin109', '$2a$10$JAqvH0tEc0I7dfDVBI7zyuB4E3j.uH6daIjV53.vUS6PknFkDJkuK', '芋艿', NULL, NULL, NULL, NULL, '15601691300', '0', NULL, '0', NULL, NULL, '1', TO_DATE('2022-02-20 23:11:50', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-27 08:26:56', 'SYYYY-MM-DD HH24:MI:SS'), '120', '0'); +INSERT INTO "SYSTEM_USERS" ("ID", "USERNAME", "PASSWORD", "NICKNAME", "REMARK", "DEPT_ID", "POST_IDS", "EMAIL", "MOBILE", "SEX", "AVATAR", "STATUS", "LOGIN_IP", "LOGIN_DATE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('110', 'admin110', '$2a$10$qYxoXs0ogPHgYllyEneYde9xcCW5hZgukrxeXZ9lmLhKse8TK6IwW', '小王', NULL, NULL, NULL, NULL, '15601691300', '0', NULL, '0', '127.0.0.1', TO_DATE('2022-02-23 19:36:28', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-22 00:56:14', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-02-27 08:26:59', 'SYYYY-MM-DD HH24:MI:SS'), '121', '0'); +INSERT INTO "SYSTEM_USERS" ("ID", "USERNAME", "PASSWORD", "NICKNAME", "REMARK", "DEPT_ID", "POST_IDS", "EMAIL", "MOBILE", "SEX", "AVATAR", "STATUS", "LOGIN_IP", "LOGIN_DATE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('111', 'test', '$2a$10$mExveopHUx9Q4QiLtAzhDeH3n4/QlNLzEsM4AqgxKrU.ciUZDXZCy', '测试用户', NULL, NULL, '[]', NULL, NULL, '0', NULL, '0', NULL, NULL, '110', TO_DATE('2022-02-23 13:14:33', 'SYYYY-MM-DD HH24:MI:SS'), '110', TO_DATE('2022-02-23 13:14:33', 'SYYYY-MM-DD HH24:MI:SS'), '121', '0'); +INSERT INTO "SYSTEM_USERS" ("ID", "USERNAME", "PASSWORD", "NICKNAME", "REMARK", "DEPT_ID", "POST_IDS", "EMAIL", "MOBILE", "SEX", "AVATAR", "STATUS", "LOGIN_IP", "LOGIN_DATE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('112', 'newobject', '$2a$10$jh5MsR.ud/gKe3mVeUp5t.nEXGDSmHyv5OYjWQwHO8wlGmMSI9Twy', '新对象', NULL, NULL, '[]', NULL, NULL, '0', NULL, '0', NULL, NULL, '1', TO_DATE('2022-02-23 19:08:03', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-23 19:08:03', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_USERS" ("ID", "USERNAME", "PASSWORD", "NICKNAME", "REMARK", "DEPT_ID", "POST_IDS", "EMAIL", "MOBILE", "SEX", "AVATAR", "STATUS", "LOGIN_IP", "LOGIN_DATE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('113', 'aoteman', '$2a$10$0acJOIk2D25/oC87nyclE..0lzeu9DtQ/n3geP4fkun/zIVRhHJIO', '闻荫', NULL, NULL, NULL, NULL, '15601691300', '0', NULL, '0', '127.0.0.1', TO_DATE('2022-03-19 18:38:51', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-07 21:37:58', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-03-19 18:38:51', 'SYYYY-MM-DD HH24:MI:SS'), '122', '0'); +INSERT INTO "SYSTEM_USERS" ("ID", "USERNAME", "PASSWORD", "NICKNAME", "REMARK", "DEPT_ID", "POST_IDS", "EMAIL", "MOBILE", "SEX", "AVATAR", "STATUS", "LOGIN_IP", "LOGIN_DATE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('114', 'hrmgr', '$2a$10$TR4eybBioGRhBmDBWkqWLO6NIh3mzYa8KBKDDB5woiGYFVlRAi.fu', 'hr 小姐姐', NULL, NULL, '[3]', NULL, NULL, '0', NULL, '0', '127.0.0.1', TO_DATE('2022-03-19 22:15:43', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 21:50:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-05-01 01:08:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_USERS" ("ID", "USERNAME", "PASSWORD", "NICKNAME", "REMARK", "DEPT_ID", "POST_IDS", "EMAIL", "MOBILE", "SEX", "AVATAR", "STATUS", "LOGIN_IP", "LOGIN_DATE", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('0', 'admin2', '$2a$10$KYL8IPJPIzuZWfOgPqOuU.VeZqWistCv5pxtoaq2SwPBDgBR4uh6G', '123', NULL, NULL, '[]', NULL, NULL, NULL, NULL, '0', NULL, NULL, '1', TO_DATE('2022-05-01 01:05:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-05-01 01:05:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for SYSTEM_USER_POST +-- ---------------------------- +DROP TABLE "SYSTEM_USER_POST"; +CREATE TABLE "SYSTEM_USER_POST" ( + "ID" NUMBER(20,0) NOT NULL, + "USER_ID" NUMBER(20,0) NOT NULL, + "POST_ID" NUMBER(20,0) NOT NULL, + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE NOT NULL, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE NOT NULL, + "DELETED" NUMBER(1,0) DEFAULT 0 NOT NULL, + "TENANT_ID" NUMBER(20,0) DEFAULT 0 NOT NULL +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "SYSTEM_USER_POST"."ID" IS 'id'; +COMMENT ON COLUMN "SYSTEM_USER_POST"."USER_ID" IS '用户ID'; +COMMENT ON COLUMN "SYSTEM_USER_POST"."POST_ID" IS '岗位ID'; +COMMENT ON COLUMN "SYSTEM_USER_POST"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "SYSTEM_USER_POST"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SYSTEM_USER_POST"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "SYSTEM_USER_POST"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "SYSTEM_USER_POST"."DELETED" IS '是否删除'; +COMMENT ON COLUMN "SYSTEM_USER_POST"."TENANT_ID" IS '租户编号'; +COMMENT ON TABLE "SYSTEM_USER_POST" IS '用户岗位表'; + +-- ---------------------------- +-- Records of SYSTEM_USER_POST +-- ---------------------------- +INSERT INTO "SYSTEM_USER_POST" ("ID", "USER_ID", "POST_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED", "TENANT_ID") VALUES ('112', '1', '1', 'admin', TO_DATE('2022-05-02 07:25:24', 'SYYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2022-05-02 07:25:24', 'SYYYY-MM-DD HH24:MI:SS'), '0', '1'); +INSERT INTO "SYSTEM_USER_POST" ("ID", "USER_ID", "POST_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED", "TENANT_ID") VALUES ('113', '100', '1', 'admin', TO_DATE('2022-05-02 07:25:24', 'SYYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2022-05-02 07:25:24', 'SYYYY-MM-DD HH24:MI:SS'), '0', '1'); +INSERT INTO "SYSTEM_USER_POST" ("ID", "USER_ID", "POST_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED", "TENANT_ID") VALUES ('114', '114', '3', 'admin', TO_DATE('2022-05-02 07:25:24', 'SYYYY-MM-DD HH24:MI:SS'), 'admin', TO_DATE('2022-05-02 07:25:24', 'SYYYY-MM-DD HH24:MI:SS'), '0', '1'); +COMMIT; +COMMIT; + +-- ---------------------------- +-- Table structure for SYSTEM_USER_ROLE +-- ---------------------------- +DROP TABLE "SYSTEM_USER_ROLE"; +CREATE TABLE "SYSTEM_USER_ROLE" ( + "ID" NUMBER(20,0) NOT NULL, + "USER_ID" NUMBER(20,0) NOT NULL, + "ROLE_ID" NUMBER(20,0) NOT NULL, + "CREATOR" NVARCHAR2(64), + "CREATE_TIME" DATE, + "UPDATER" NVARCHAR2(64), + "UPDATE_TIME" DATE, + "TENANT_ID" NUMBER(20,0) NOT NULL, + "DELETED" NUMBER(1,0) DEFAULT 0 NOT NULL +) +LOGGING +NOCOMPRESS +PCTFREE 10 +INITRANS 1 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +) +PARALLEL 1 +NOCACHE +DISABLE ROW MOVEMENT +; +COMMENT ON COLUMN "SYSTEM_USER_ROLE"."ID" IS '自增编号'; +COMMENT ON COLUMN "SYSTEM_USER_ROLE"."USER_ID" IS '用户ID'; +COMMENT ON COLUMN "SYSTEM_USER_ROLE"."ROLE_ID" IS '角色ID'; +COMMENT ON COLUMN "SYSTEM_USER_ROLE"."CREATOR" IS '创建者'; +COMMENT ON COLUMN "SYSTEM_USER_ROLE"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "SYSTEM_USER_ROLE"."UPDATER" IS '更新者'; +COMMENT ON COLUMN "SYSTEM_USER_ROLE"."UPDATE_TIME" IS '更新时间'; +COMMENT ON COLUMN "SYSTEM_USER_ROLE"."TENANT_ID" IS '租户编号'; +COMMENT ON COLUMN "SYSTEM_USER_ROLE"."DELETED" IS '是否删除'; +COMMENT ON TABLE "SYSTEM_USER_ROLE" IS '用户和角色关联表'; + +-- ---------------------------- +-- Records of SYSTEM_USER_ROLE +-- ---------------------------- +INSERT INTO "SYSTEM_USER_ROLE" ("ID", "USER_ID", "ROLE_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('1', '1', '1', NULL, TO_DATE('2022-02-20 22:59:33', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-02-20 22:59:33', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_USER_ROLE" ("ID", "USER_ID", "ROLE_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('2', '2', '2', NULL, TO_DATE('2022-02-20 22:59:33', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-02-20 22:59:33', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_USER_ROLE" ("ID", "USER_ID", "ROLE_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('4', '100', '101', NULL, TO_DATE('2022-02-20 22:59:33', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-02-20 22:59:33', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_USER_ROLE" ("ID", "USER_ID", "ROLE_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('5', '100', '1', NULL, TO_DATE('2022-02-20 22:59:33', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-02-20 22:59:33', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_USER_ROLE" ("ID", "USER_ID", "ROLE_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('6', '100', '2', NULL, TO_DATE('2022-02-20 22:59:33', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-02-20 22:59:33', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_USER_ROLE" ("ID", "USER_ID", "ROLE_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('7', '104', '101', NULL, TO_DATE('2022-02-20 22:59:33', 'SYYYY-MM-DD HH24:MI:SS'), NULL, TO_DATE('2022-02-20 22:59:33', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_USER_ROLE" ("ID", "USER_ID", "ROLE_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('10', '103', '1', '1', TO_DATE('2022-01-11 13:19:45', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-01-11 13:19:45', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +INSERT INTO "SYSTEM_USER_ROLE" ("ID", "USER_ID", "ROLE_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('11', '107', '106', '1', TO_DATE('2022-02-20 22:59:33', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-20 22:59:33', 'SYYYY-MM-DD HH24:MI:SS'), '118', '0'); +INSERT INTO "SYSTEM_USER_ROLE" ("ID", "USER_ID", "ROLE_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('12', '108', '107', '1', TO_DATE('2022-02-20 23:00:50', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-20 23:00:50', 'SYYYY-MM-DD HH24:MI:SS'), '119', '0'); +INSERT INTO "SYSTEM_USER_ROLE" ("ID", "USER_ID", "ROLE_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('13', '109', '108', '1', TO_DATE('2022-02-20 23:11:50', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-20 23:11:50', 'SYYYY-MM-DD HH24:MI:SS'), '120', '0'); +INSERT INTO "SYSTEM_USER_ROLE" ("ID", "USER_ID", "ROLE_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('14', '110', '109', '1', TO_DATE('2022-02-22 00:56:14', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-02-22 00:56:14', 'SYYYY-MM-DD HH24:MI:SS'), '121', '0'); +INSERT INTO "SYSTEM_USER_ROLE" ("ID", "USER_ID", "ROLE_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('15', '111', '110', '110', TO_DATE('2022-02-23 13:14:38', 'SYYYY-MM-DD HH24:MI:SS'), '110', TO_DATE('2022-02-23 13:14:38', 'SYYYY-MM-DD HH24:MI:SS'), '121', '0'); +INSERT INTO "SYSTEM_USER_ROLE" ("ID", "USER_ID", "ROLE_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('16', '113', '111', '1', TO_DATE('2022-03-07 21:37:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-07 21:37:58', 'SYYYY-MM-DD HH24:MI:SS'), '122', '0'); +INSERT INTO "SYSTEM_USER_ROLE" ("ID", "USER_ID", "ROLE_ID", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "TENANT_ID", "DELETED") VALUES ('17', '114', '101', '1', TO_DATE('2022-03-19 21:51:13', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-03-19 21:51:13', 'SYYYY-MM-DD HH24:MI:SS'), '1', '0'); +COMMIT; +COMMIT; + +-- ---------------------------- +-- Sequence structure for BPM_FORM_SEQ +-- ---------------------------- +DROP SEQUENCE "BPM_FORM_SEQ"; +CREATE SEQUENCE "BPM_FORM_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for BPM_OA_LEAVE_SEQ +-- ---------------------------- +DROP SEQUENCE "BPM_OA_LEAVE_SEQ"; +CREATE SEQUENCE "BPM_OA_LEAVE_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for BPM_PROCESS_DEFINITION_EXT_SEQ +-- ---------------------------- +DROP SEQUENCE "BPM_PROCESS_DEFINITION_EXT_SEQ"; +CREATE SEQUENCE "BPM_PROCESS_DEFINITION_EXT_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for BPM_PROCESS_INSTANCE_EXT_SEQ +-- ---------------------------- +DROP SEQUENCE "BPM_PROCESS_INSTANCE_EXT_SEQ"; +CREATE SEQUENCE "BPM_PROCESS_INSTANCE_EXT_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for BPM_TASK_ASSIGN_RULE_SEQ +-- ---------------------------- +DROP SEQUENCE "BPM_TASK_ASSIGN_RULE_SEQ"; +CREATE SEQUENCE "BPM_TASK_ASSIGN_RULE_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for BPM_TASK_EXT_SEQ +-- ---------------------------- +DROP SEQUENCE "BPM_TASK_EXT_SEQ"; +CREATE SEQUENCE "BPM_TASK_EXT_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for BPM_USER_GROUP_SEQ +-- ---------------------------- +DROP SEQUENCE "BPM_USER_GROUP_SEQ"; +CREATE SEQUENCE "BPM_USER_GROUP_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for INFRA_API_ACCESS_LOG_SEQ +-- ---------------------------- +DROP SEQUENCE "INFRA_API_ACCESS_LOG_SEQ"; +CREATE SEQUENCE "INFRA_API_ACCESS_LOG_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for INFRA_API_ERROR_LOG_SEQ +-- ---------------------------- +DROP SEQUENCE "INFRA_API_ERROR_LOG_SEQ"; +CREATE SEQUENCE "INFRA_API_ERROR_LOG_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for INFRA_CODEGEN_COLUMN_SEQ +-- ---------------------------- +DROP SEQUENCE "INFRA_CODEGEN_COLUMN_SEQ"; +CREATE SEQUENCE "INFRA_CODEGEN_COLUMN_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for INFRA_CODEGEN_TABLE_SEQ +-- ---------------------------- +DROP SEQUENCE "INFRA_CODEGEN_TABLE_SEQ"; +CREATE SEQUENCE "INFRA_CODEGEN_TABLE_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for INFRA_CONFIG_SEQ +-- ---------------------------- +DROP SEQUENCE "INFRA_CONFIG_SEQ"; +CREATE SEQUENCE "INFRA_CONFIG_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for INFRA_DATA_SOURCE_CONFIG_SEQ +-- ---------------------------- +DROP SEQUENCE "INFRA_DATA_SOURCE_CONFIG_SEQ"; +CREATE SEQUENCE "INFRA_DATA_SOURCE_CONFIG_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for INFRA_FILE_CONFIG_SEQ +-- ---------------------------- +DROP SEQUENCE "INFRA_FILE_CONFIG_SEQ"; +CREATE SEQUENCE "INFRA_FILE_CONFIG_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for INFRA_FILE_CONTENT_SEQ +-- ---------------------------- +DROP SEQUENCE "INFRA_FILE_CONTENT_SEQ"; +CREATE SEQUENCE "INFRA_FILE_CONTENT_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for INFRA_FILE_SEQ +-- ---------------------------- +DROP SEQUENCE "INFRA_FILE_SEQ"; +CREATE SEQUENCE "INFRA_FILE_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for INFRA_JOB_LOG_SEQ +-- ---------------------------- +DROP SEQUENCE "INFRA_JOB_LOG_SEQ"; +CREATE SEQUENCE "INFRA_JOB_LOG_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for INFRA_JOB_SEQ +-- ---------------------------- +DROP SEQUENCE "INFRA_JOB_SEQ"; +CREATE SEQUENCE "INFRA_JOB_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for INFRA_TEST_DEMO_SEQ +-- ---------------------------- +DROP SEQUENCE "INFRA_TEST_DEMO_SEQ"; +CREATE SEQUENCE "INFRA_TEST_DEMO_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for MEMBER_USER_SEQ +-- ---------------------------- +DROP SEQUENCE "MEMBER_USER_SEQ"; +CREATE SEQUENCE "MEMBER_USER_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for PAY_APP_SEQ +-- ---------------------------- +DROP SEQUENCE "PAY_APP_SEQ"; +CREATE SEQUENCE "PAY_APP_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for PAY_CHANNEL_SEQ +-- ---------------------------- +DROP SEQUENCE "PAY_CHANNEL_SEQ"; +CREATE SEQUENCE "PAY_CHANNEL_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for PAY_MERCHANT_SEQ +-- ---------------------------- +DROP SEQUENCE "PAY_MERCHANT_SEQ"; +CREATE SEQUENCE "PAY_MERCHANT_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for PAY_NOTIFY_LOG_SEQ +-- ---------------------------- +DROP SEQUENCE "PAY_NOTIFY_LOG_SEQ"; +CREATE SEQUENCE "PAY_NOTIFY_LOG_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for PAY_NOTIFY_TASK_SEQ +-- ---------------------------- +DROP SEQUENCE "PAY_NOTIFY_TASK_SEQ"; +CREATE SEQUENCE "PAY_NOTIFY_TASK_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for PAY_ORDER_EXTENSION_SEQ +-- ---------------------------- +DROP SEQUENCE "PAY_ORDER_EXTENSION_SEQ"; +CREATE SEQUENCE "PAY_ORDER_EXTENSION_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for PAY_ORDER_SEQ +-- ---------------------------- +DROP SEQUENCE "PAY_ORDER_SEQ"; +CREATE SEQUENCE "PAY_ORDER_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for PAY_REFUND_SEQ +-- ---------------------------- +DROP SEQUENCE "PAY_REFUND_SEQ"; +CREATE SEQUENCE "PAY_REFUND_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for SYSTEM_DEPT_SEQ +-- ---------------------------- +DROP SEQUENCE "SYSTEM_DEPT_SEQ"; +CREATE SEQUENCE "SYSTEM_DEPT_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for SYSTEM_DICT_DATA_SEQ +-- ---------------------------- +DROP SEQUENCE "SYSTEM_DICT_DATA_SEQ"; +CREATE SEQUENCE "SYSTEM_DICT_DATA_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for SYSTEM_DICT_TYPE_SEQ +-- ---------------------------- +DROP SEQUENCE "SYSTEM_DICT_TYPE_SEQ"; +CREATE SEQUENCE "SYSTEM_DICT_TYPE_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for SYSTEM_ERROR_CODE_SEQ +-- ---------------------------- +DROP SEQUENCE "SYSTEM_ERROR_CODE_SEQ"; +CREATE SEQUENCE "SYSTEM_ERROR_CODE_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for SYSTEM_LOGIN_LOG_SEQ +-- ---------------------------- +DROP SEQUENCE "SYSTEM_LOGIN_LOG_SEQ"; +CREATE SEQUENCE "SYSTEM_LOGIN_LOG_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for SYSTEM_MENU_SEQ +-- ---------------------------- +DROP SEQUENCE "SYSTEM_MENU_SEQ"; +CREATE SEQUENCE "SYSTEM_MENU_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for SYSTEM_NOTICE_SEQ +-- ---------------------------- +DROP SEQUENCE "SYSTEM_NOTICE_SEQ"; +CREATE SEQUENCE "SYSTEM_NOTICE_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for SYSTEM_OAUTH2_ACCESS_TOKEN_SEQ +-- ---------------------------- +DROP SEQUENCE "SYSTEM_OAUTH2_ACCESS_TOKEN_SEQ"; +CREATE SEQUENCE "SYSTEM_OAUTH2_ACCESS_TOKEN_SEQ" MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for SYSTEM_OAUTH2_APPROVE_SEQ +-- ---------------------------- +DROP SEQUENCE "SYSTEM_OAUTH2_APPROVE_SEQ"; +CREATE SEQUENCE "SYSTEM_OAUTH2_APPROVE_SEQ" MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for SYSTEM_OAUTH2_CLIENT_SEQ +-- ---------------------------- +DROP SEQUENCE "SYSTEM_OAUTH2_CLIENT_SEQ"; +CREATE SEQUENCE "SYSTEM_OAUTH2_CLIENT_SEQ" MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for SYSTEM_OAUTH2_CODE_SEQ +-- ---------------------------- +DROP SEQUENCE "SYSTEM_OAUTH2_CODE_SEQ"; +CREATE SEQUENCE "SYSTEM_OAUTH2_CODE_SEQ" MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for SYSTEM_OPERATE_LOG_SEQ +-- ---------------------------- +DROP SEQUENCE "SYSTEM_OPERATE_LOG_SEQ"; +CREATE SEQUENCE "SYSTEM_OPERATE_LOG_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for SYSTEM_POST_SEQ +-- ---------------------------- +DROP SEQUENCE "SYSTEM_POST_SEQ"; +CREATE SEQUENCE "SYSTEM_POST_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for SYSTEM_ROLE_MENU_SEQ +-- ---------------------------- +DROP SEQUENCE "SYSTEM_ROLE_MENU_SEQ"; +CREATE SEQUENCE "SYSTEM_ROLE_MENU_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for SYSTEM_ROLE_SEQ +-- ---------------------------- +DROP SEQUENCE "SYSTEM_ROLE_SEQ"; +CREATE SEQUENCE "SYSTEM_ROLE_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for SYSTEM_SENSITIVE_WORD_SEQ +-- ---------------------------- +DROP SEQUENCE "SYSTEM_SENSITIVE_WORD_SEQ"; +CREATE SEQUENCE "SYSTEM_SENSITIVE_WORD_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for SYSTEM_SMS_CHANNEL_SEQ +-- ---------------------------- +DROP SEQUENCE "SYSTEM_SMS_CHANNEL_SEQ"; +CREATE SEQUENCE "SYSTEM_SMS_CHANNEL_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for SYSTEM_SMS_CODE_SEQ +-- ---------------------------- +DROP SEQUENCE "SYSTEM_SMS_CODE_SEQ"; +CREATE SEQUENCE "SYSTEM_SMS_CODE_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for SYSTEM_SMS_LOG_SEQ +-- ---------------------------- +DROP SEQUENCE "SYSTEM_SMS_LOG_SEQ"; +CREATE SEQUENCE "SYSTEM_SMS_LOG_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for SYSTEM_SMS_TEMPLATE_SEQ +-- ---------------------------- +DROP SEQUENCE "SYSTEM_SMS_TEMPLATE_SEQ"; +CREATE SEQUENCE "SYSTEM_SMS_TEMPLATE_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for SYSTEM_SOCIAL_USER_BIND_SEQ +-- ---------------------------- +DROP SEQUENCE "SYSTEM_SOCIAL_USER_BIND_SEQ"; +CREATE SEQUENCE "SYSTEM_SOCIAL_USER_BIND_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for SYSTEM_SOCIAL_USER_SEQ +-- ---------------------------- +DROP SEQUENCE "SYSTEM_SOCIAL_USER_SEQ"; +CREATE SEQUENCE "SYSTEM_SOCIAL_USER_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for SYSTEM_TENANT_PACKAGE_SEQ +-- ---------------------------- +DROP SEQUENCE "SYSTEM_TENANT_PACKAGE_SEQ"; +CREATE SEQUENCE "SYSTEM_TENANT_PACKAGE_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for SYSTEM_TENANT_SEQ +-- ---------------------------- +DROP SEQUENCE "SYSTEM_TENANT_SEQ"; +CREATE SEQUENCE "SYSTEM_TENANT_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for SYSTEM_USER_POST_SEQ +-- ---------------------------- +DROP SEQUENCE "SYSTEM_USER_POST_SEQ"; +CREATE SEQUENCE "SYSTEM_USER_POST_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for SYSTEM_USER_ROLE_SEQ +-- ---------------------------- +DROP SEQUENCE "SYSTEM_USER_ROLE_SEQ"; +CREATE SEQUENCE "SYSTEM_USER_ROLE_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for SYSTEM_USER_SEQ +-- ---------------------------- +DROP SEQUENCE "SYSTEM_USER_SEQ"; +CREATE SEQUENCE "SYSTEM_USER_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Sequence structure for SYSTEM_USER_SESSION_SEQ +-- ---------------------------- +DROP SEQUENCE "SYSTEM_USER_SESSION_SEQ"; +CREATE SEQUENCE "SYSTEM_USER_SESSION_SEQ" MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20; + +-- ---------------------------- +-- Checks structure for table BPM_FORM +-- ---------------------------- +ALTER TABLE "BPM_FORM" ADD CONSTRAINT "SYS_C007768" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_FORM" ADD CONSTRAINT "SYS_C007769" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_FORM" ADD CONSTRAINT "SYS_C007770" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_FORM" ADD CONSTRAINT "SYS_C007771" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_FORM" ADD CONSTRAINT "SYS_C007772" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_FORM" ADD CONSTRAINT "SYS_C008199" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_FORM" ADD CONSTRAINT "SYS_C008446" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_FORM" ADD CONSTRAINT "SYS_C008447" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_FORM" ADD CONSTRAINT "SYS_C008448" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_FORM" ADD CONSTRAINT "SYS_C008449" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_FORM" ADD CONSTRAINT "SYS_C008450" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_FORM" ADD CONSTRAINT "SYS_C008451" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table BPM_OA_LEAVE +-- ---------------------------- +ALTER TABLE "BPM_OA_LEAVE" ADD CONSTRAINT "SYS_C007773" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_OA_LEAVE" ADD CONSTRAINT "SYS_C007774" CHECK ("USER_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_OA_LEAVE" ADD CONSTRAINT "SYS_C007775" CHECK ("TYPE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_OA_LEAVE" ADD CONSTRAINT "SYS_C007776" CHECK ("START_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_OA_LEAVE" ADD CONSTRAINT "SYS_C007777" CHECK ("END_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_OA_LEAVE" ADD CONSTRAINT "SYS_C007778" CHECK ("DAY" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_OA_LEAVE" ADD CONSTRAINT "SYS_C007779" CHECK ("RESULT" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_OA_LEAVE" ADD CONSTRAINT "SYS_C007780" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_OA_LEAVE" ADD CONSTRAINT "SYS_C007781" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_OA_LEAVE" ADD CONSTRAINT "SYS_C007782" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_OA_LEAVE" ADD CONSTRAINT "SYS_C008200" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_OA_LEAVE" ADD CONSTRAINT "SYS_C008452" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_OA_LEAVE" ADD CONSTRAINT "SYS_C008453" CHECK ("USER_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_OA_LEAVE" ADD CONSTRAINT "SYS_C008454" CHECK ("TYPE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_OA_LEAVE" ADD CONSTRAINT "SYS_C008455" CHECK ("START_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_OA_LEAVE" ADD CONSTRAINT "SYS_C008456" CHECK ("END_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_OA_LEAVE" ADD CONSTRAINT "SYS_C008457" CHECK ("DAY" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_OA_LEAVE" ADD CONSTRAINT "SYS_C008458" CHECK ("RESULT" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_OA_LEAVE" ADD CONSTRAINT "SYS_C008459" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_OA_LEAVE" ADD CONSTRAINT "SYS_C008460" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_OA_LEAVE" ADD CONSTRAINT "SYS_C008461" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_OA_LEAVE" ADD CONSTRAINT "SYS_C008462" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table BPM_PROCESS_DEFINITION_EXT +-- ---------------------------- +ALTER TABLE "BPM_PROCESS_DEFINITION_EXT" ADD CONSTRAINT "SYS_C007783" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_PROCESS_DEFINITION_EXT" ADD CONSTRAINT "SYS_C007784" CHECK ("FORM_TYPE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_PROCESS_DEFINITION_EXT" ADD CONSTRAINT "SYS_C007785" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_PROCESS_DEFINITION_EXT" ADD CONSTRAINT "SYS_C007786" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_PROCESS_DEFINITION_EXT" ADD CONSTRAINT "SYS_C007787" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_PROCESS_DEFINITION_EXT" ADD CONSTRAINT "SYS_C008201" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_PROCESS_DEFINITION_EXT" ADD CONSTRAINT "SYS_C008463" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_PROCESS_DEFINITION_EXT" ADD CONSTRAINT "SYS_C008464" CHECK ("FORM_TYPE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_PROCESS_DEFINITION_EXT" ADD CONSTRAINT "SYS_C008465" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_PROCESS_DEFINITION_EXT" ADD CONSTRAINT "SYS_C008466" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_PROCESS_DEFINITION_EXT" ADD CONSTRAINT "SYS_C008467" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_PROCESS_DEFINITION_EXT" ADD CONSTRAINT "SYS_C008468" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table BPM_PROCESS_INSTANCE_EXT +-- ---------------------------- +ALTER TABLE "BPM_PROCESS_INSTANCE_EXT" ADD CONSTRAINT "SYS_C007788" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_PROCESS_INSTANCE_EXT" ADD CONSTRAINT "SYS_C007789" CHECK ("START_USER_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_PROCESS_INSTANCE_EXT" ADD CONSTRAINT "SYS_C007790" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_PROCESS_INSTANCE_EXT" ADD CONSTRAINT "SYS_C007791" CHECK ("RESULT" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_PROCESS_INSTANCE_EXT" ADD CONSTRAINT "SYS_C007792" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_PROCESS_INSTANCE_EXT" ADD CONSTRAINT "SYS_C007793" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_PROCESS_INSTANCE_EXT" ADD CONSTRAINT "SYS_C007794" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_PROCESS_INSTANCE_EXT" ADD CONSTRAINT "SYS_C008202" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_PROCESS_INSTANCE_EXT" ADD CONSTRAINT "SYS_C008469" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_PROCESS_INSTANCE_EXT" ADD CONSTRAINT "SYS_C008470" CHECK ("START_USER_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_PROCESS_INSTANCE_EXT" ADD CONSTRAINT "SYS_C008471" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_PROCESS_INSTANCE_EXT" ADD CONSTRAINT "SYS_C008472" CHECK ("RESULT" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_PROCESS_INSTANCE_EXT" ADD CONSTRAINT "SYS_C008473" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_PROCESS_INSTANCE_EXT" ADD CONSTRAINT "SYS_C008474" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_PROCESS_INSTANCE_EXT" ADD CONSTRAINT "SYS_C008475" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_PROCESS_INSTANCE_EXT" ADD CONSTRAINT "SYS_C008476" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table BPM_TASK_ASSIGN_RULE +-- ---------------------------- +ALTER TABLE "BPM_TASK_ASSIGN_RULE" ADD CONSTRAINT "SYS_C007795" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_TASK_ASSIGN_RULE" ADD CONSTRAINT "SYS_C007796" CHECK ("TYPE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_TASK_ASSIGN_RULE" ADD CONSTRAINT "SYS_C007797" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_TASK_ASSIGN_RULE" ADD CONSTRAINT "SYS_C007798" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_TASK_ASSIGN_RULE" ADD CONSTRAINT "SYS_C007799" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_TASK_ASSIGN_RULE" ADD CONSTRAINT "SYS_C008203" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_TASK_ASSIGN_RULE" ADD CONSTRAINT "SYS_C008477" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_TASK_ASSIGN_RULE" ADD CONSTRAINT "SYS_C008478" CHECK ("TYPE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_TASK_ASSIGN_RULE" ADD CONSTRAINT "SYS_C008479" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_TASK_ASSIGN_RULE" ADD CONSTRAINT "SYS_C008480" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_TASK_ASSIGN_RULE" ADD CONSTRAINT "SYS_C008481" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_TASK_ASSIGN_RULE" ADD CONSTRAINT "SYS_C008482" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table BPM_TASK_EXT +-- ---------------------------- +ALTER TABLE "BPM_TASK_EXT" ADD CONSTRAINT "SYS_C007800" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_TASK_EXT" ADD CONSTRAINT "SYS_C007801" CHECK ("RESULT" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_TASK_EXT" ADD CONSTRAINT "SYS_C007802" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_TASK_EXT" ADD CONSTRAINT "SYS_C007803" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_TASK_EXT" ADD CONSTRAINT "SYS_C007804" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_TASK_EXT" ADD CONSTRAINT "SYS_C008204" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_TASK_EXT" ADD CONSTRAINT "SYS_C008483" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_TASK_EXT" ADD CONSTRAINT "SYS_C008484" CHECK ("RESULT" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_TASK_EXT" ADD CONSTRAINT "SYS_C008485" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_TASK_EXT" ADD CONSTRAINT "SYS_C008486" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_TASK_EXT" ADD CONSTRAINT "SYS_C008487" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_TASK_EXT" ADD CONSTRAINT "SYS_C008488" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table BPM_USER_GROUP +-- ---------------------------- +ALTER TABLE "BPM_USER_GROUP" ADD CONSTRAINT "SYS_C007807" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_USER_GROUP" ADD CONSTRAINT "SYS_C007808" CHECK ("MEMBER_USER_IDS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_USER_GROUP" ADD CONSTRAINT "SYS_C007809" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_USER_GROUP" ADD CONSTRAINT "SYS_C007810" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_USER_GROUP" ADD CONSTRAINT "SYS_C007811" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_USER_GROUP" ADD CONSTRAINT "SYS_C007812" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_USER_GROUP" ADD CONSTRAINT "SYS_C008205" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_USER_GROUP" ADD CONSTRAINT "SYS_C008489" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_USER_GROUP" ADD CONSTRAINT "SYS_C008490" CHECK ("MEMBER_USER_IDS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_USER_GROUP" ADD CONSTRAINT "SYS_C008491" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_USER_GROUP" ADD CONSTRAINT "SYS_C008492" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_USER_GROUP" ADD CONSTRAINT "SYS_C008493" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_USER_GROUP" ADD CONSTRAINT "SYS_C008494" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "BPM_USER_GROUP" ADD CONSTRAINT "SYS_C008495" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table INFRA_API_ACCESS_LOG +-- ---------------------------- +ALTER TABLE "INFRA_API_ACCESS_LOG" ADD CONSTRAINT "SYS_C007829" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_API_ACCESS_LOG" ADD CONSTRAINT "SYS_C007830" CHECK ("USER_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_API_ACCESS_LOG" ADD CONSTRAINT "SYS_C007831" CHECK ("USER_TYPE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_API_ACCESS_LOG" ADD CONSTRAINT "SYS_C007832" CHECK ("BEGIN_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_API_ACCESS_LOG" ADD CONSTRAINT "SYS_C007833" CHECK ("END_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_API_ACCESS_LOG" ADD CONSTRAINT "SYS_C007834" CHECK ("DURATION" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_API_ACCESS_LOG" ADD CONSTRAINT "SYS_C007835" CHECK ("RESULT_CODE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_API_ACCESS_LOG" ADD CONSTRAINT "SYS_C007836" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_API_ACCESS_LOG" ADD CONSTRAINT "SYS_C007837" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_API_ACCESS_LOG" ADD CONSTRAINT "SYS_C007838" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_API_ACCESS_LOG" ADD CONSTRAINT "SYS_C008496" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_API_ACCESS_LOG" ADD CONSTRAINT "SYS_C008497" CHECK ("USER_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_API_ACCESS_LOG" ADD CONSTRAINT "SYS_C008498" CHECK ("USER_TYPE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_API_ACCESS_LOG" ADD CONSTRAINT "SYS_C008499" CHECK ("BEGIN_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_API_ACCESS_LOG" ADD CONSTRAINT "SYS_C008500" CHECK ("END_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_API_ACCESS_LOG" ADD CONSTRAINT "SYS_C008501" CHECK ("DURATION" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_API_ACCESS_LOG" ADD CONSTRAINT "SYS_C008502" CHECK ("RESULT_CODE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_API_ACCESS_LOG" ADD CONSTRAINT "SYS_C008503" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_API_ACCESS_LOG" ADD CONSTRAINT "SYS_C008504" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_API_ACCESS_LOG" ADD CONSTRAINT "SYS_C008505" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table INFRA_API_ERROR_LOG +-- ---------------------------- +ALTER TABLE "INFRA_API_ERROR_LOG" ADD CONSTRAINT "SYS_C007851" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_API_ERROR_LOG" ADD CONSTRAINT "SYS_C007852" CHECK ("USER_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_API_ERROR_LOG" ADD CONSTRAINT "SYS_C007853" CHECK ("USER_TYPE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_API_ERROR_LOG" ADD CONSTRAINT "SYS_C007854" CHECK ("EXCEPTION_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_API_ERROR_LOG" ADD CONSTRAINT "SYS_C007855" CHECK ("EXCEPTION_MESSAGE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_API_ERROR_LOG" ADD CONSTRAINT "SYS_C007856" CHECK ("EXCEPTION_ROOT_CAUSE_MESSAGE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_API_ERROR_LOG" ADD CONSTRAINT "SYS_C007857" CHECK ("EXCEPTION_STACK_TRACE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_API_ERROR_LOG" ADD CONSTRAINT "SYS_C007858" CHECK ("EXCEPTION_LINE_NUMBER" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_API_ERROR_LOG" ADD CONSTRAINT "SYS_C007859" CHECK ("PROCESS_STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_API_ERROR_LOG" ADD CONSTRAINT "SYS_C007860" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_API_ERROR_LOG" ADD CONSTRAINT "SYS_C007861" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_API_ERROR_LOG" ADD CONSTRAINT "SYS_C007862" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_API_ERROR_LOG" ADD CONSTRAINT "SYS_C008506" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_API_ERROR_LOG" ADD CONSTRAINT "SYS_C008507" CHECK ("USER_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_API_ERROR_LOG" ADD CONSTRAINT "SYS_C008508" CHECK ("USER_TYPE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_API_ERROR_LOG" ADD CONSTRAINT "SYS_C008509" CHECK ("EXCEPTION_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_API_ERROR_LOG" ADD CONSTRAINT "SYS_C008510" CHECK ("EXCEPTION_MESSAGE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_API_ERROR_LOG" ADD CONSTRAINT "SYS_C008511" CHECK ("EXCEPTION_ROOT_CAUSE_MESSAGE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_API_ERROR_LOG" ADD CONSTRAINT "SYS_C008512" CHECK ("EXCEPTION_STACK_TRACE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_API_ERROR_LOG" ADD CONSTRAINT "SYS_C008513" CHECK ("EXCEPTION_LINE_NUMBER" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_API_ERROR_LOG" ADD CONSTRAINT "SYS_C008514" CHECK ("PROCESS_STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_API_ERROR_LOG" ADD CONSTRAINT "SYS_C008515" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_API_ERROR_LOG" ADD CONSTRAINT "SYS_C008516" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_API_ERROR_LOG" ADD CONSTRAINT "SYS_C008517" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table INFRA_CODEGEN_COLUMN +-- ---------------------------- +ALTER TABLE "INFRA_CODEGEN_COLUMN" ADD CONSTRAINT "SYS_C007839" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_CODEGEN_COLUMN" ADD CONSTRAINT "SYS_C007840" CHECK ("TABLE_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_CODEGEN_COLUMN" ADD CONSTRAINT "SYS_C007841" CHECK ("ORDINAL_POSITION" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_CODEGEN_COLUMN" ADD CONSTRAINT "SYS_C007842" CHECK ("LIST_OPERATION_CONDITION" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_CODEGEN_COLUMN" ADD CONSTRAINT "SYS_C007843" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_CODEGEN_COLUMN" ADD CONSTRAINT "SYS_C007844" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_CODEGEN_COLUMN" ADD CONSTRAINT "SYS_C008518" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_CODEGEN_COLUMN" ADD CONSTRAINT "SYS_C008519" CHECK ("TABLE_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_CODEGEN_COLUMN" ADD CONSTRAINT "SYS_C008520" CHECK ("ORDINAL_POSITION" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_CODEGEN_COLUMN" ADD CONSTRAINT "SYS_C008521" CHECK ("LIST_OPERATION_CONDITION" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_CODEGEN_COLUMN" ADD CONSTRAINT "SYS_C008522" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_CODEGEN_COLUMN" ADD CONSTRAINT "SYS_C008523" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table INFRA_CODEGEN_TABLE +-- ---------------------------- +ALTER TABLE "INFRA_CODEGEN_TABLE" ADD CONSTRAINT "SYS_C007845" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_CODEGEN_TABLE" ADD CONSTRAINT "SYS_C007846" CHECK ("DATA_SOURCE_CONFIG_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_CODEGEN_TABLE" ADD CONSTRAINT "SYS_C007847" CHECK ("SCENE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_CODEGEN_TABLE" ADD CONSTRAINT "SYS_C007848" CHECK ("TEMPLATE_TYPE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_CODEGEN_TABLE" ADD CONSTRAINT "SYS_C007849" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_CODEGEN_TABLE" ADD CONSTRAINT "SYS_C007850" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_CODEGEN_TABLE" ADD CONSTRAINT "SYS_C008524" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_CODEGEN_TABLE" ADD CONSTRAINT "SYS_C008525" CHECK ("DATA_SOURCE_CONFIG_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_CODEGEN_TABLE" ADD CONSTRAINT "SYS_C008526" CHECK ("SCENE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_CODEGEN_TABLE" ADD CONSTRAINT "SYS_C008527" CHECK ("TEMPLATE_TYPE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_CODEGEN_TABLE" ADD CONSTRAINT "SYS_C008528" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_CODEGEN_TABLE" ADD CONSTRAINT "SYS_C008529" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table INFRA_CONFIG +-- ---------------------------- +ALTER TABLE "INFRA_CONFIG" ADD CONSTRAINT "SYS_C007863" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_CONFIG" ADD CONSTRAINT "SYS_C007864" CHECK ("TYPE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_CONFIG" ADD CONSTRAINT "SYS_C007865" CHECK ("VISIBLE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_CONFIG" ADD CONSTRAINT "SYS_C007866" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_CONFIG" ADD CONSTRAINT "SYS_C007867" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_CONFIG" ADD CONSTRAINT "SYS_C008530" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_CONFIG" ADD CONSTRAINT "SYS_C008531" CHECK ("TYPE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_CONFIG" ADD CONSTRAINT "SYS_C008532" CHECK ("VISIBLE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_CONFIG" ADD CONSTRAINT "SYS_C008533" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_CONFIG" ADD CONSTRAINT "SYS_C008534" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table INFRA_DATA_SOURCE_CONFIG +-- ---------------------------- +ALTER TABLE "INFRA_DATA_SOURCE_CONFIG" ADD CONSTRAINT "SYS_C008187" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_DATA_SOURCE_CONFIG" ADD CONSTRAINT "SYS_C008188" CHECK ("NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_DATA_SOURCE_CONFIG" ADD CONSTRAINT "SYS_C008189" CHECK ("URL" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_DATA_SOURCE_CONFIG" ADD CONSTRAINT "SYS_C008190" CHECK ("USERNAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_DATA_SOURCE_CONFIG" ADD CONSTRAINT "SYS_C008191" CHECK ("PASSWORD" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_DATA_SOURCE_CONFIG" ADD CONSTRAINT "SYS_C008192" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_DATA_SOURCE_CONFIG" ADD CONSTRAINT "SYS_C008193" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_DATA_SOURCE_CONFIG" ADD CONSTRAINT "SYS_C008194" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_DATA_SOURCE_CONFIG" ADD CONSTRAINT "SYS_C008535" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_DATA_SOURCE_CONFIG" ADD CONSTRAINT "SYS_C008536" CHECK ("NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_DATA_SOURCE_CONFIG" ADD CONSTRAINT "SYS_C008537" CHECK ("URL" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_DATA_SOURCE_CONFIG" ADD CONSTRAINT "SYS_C008538" CHECK ("USERNAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_DATA_SOURCE_CONFIG" ADD CONSTRAINT "SYS_C008539" CHECK ("PASSWORD" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_DATA_SOURCE_CONFIG" ADD CONSTRAINT "SYS_C008540" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_DATA_SOURCE_CONFIG" ADD CONSTRAINT "SYS_C008541" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_DATA_SOURCE_CONFIG" ADD CONSTRAINT "SYS_C008542" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table INFRA_FILE +-- ---------------------------- +ALTER TABLE "INFRA_FILE" ADD CONSTRAINT "SYS_C007868" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_FILE" ADD CONSTRAINT "SYS_C007869" CHECK ("SIZE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_FILE" ADD CONSTRAINT "SYS_C007870" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_FILE" ADD CONSTRAINT "SYS_C007871" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_FILE" ADD CONSTRAINT "SYS_C008543" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_FILE" ADD CONSTRAINT "SYS_C008544" CHECK ("SIZE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_FILE" ADD CONSTRAINT "SYS_C008545" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_FILE" ADD CONSTRAINT "SYS_C008546" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table INFRA_FILE_CONFIG +-- ---------------------------- +ALTER TABLE "INFRA_FILE_CONFIG" ADD CONSTRAINT "SYS_C007872" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_FILE_CONFIG" ADD CONSTRAINT "SYS_C007873" CHECK ("STORAGE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_FILE_CONFIG" ADD CONSTRAINT "SYS_C007874" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_FILE_CONFIG" ADD CONSTRAINT "SYS_C007875" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_FILE_CONFIG" ADD CONSTRAINT "SYS_C008547" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_FILE_CONFIG" ADD CONSTRAINT "SYS_C008548" CHECK ("STORAGE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_FILE_CONFIG" ADD CONSTRAINT "SYS_C008549" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_FILE_CONFIG" ADD CONSTRAINT "SYS_C008550" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table INFRA_FILE_CONTENT +-- ---------------------------- +ALTER TABLE "INFRA_FILE_CONTENT" ADD CONSTRAINT "SYS_C007876" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_FILE_CONTENT" ADD CONSTRAINT "SYS_C007877" CHECK ("CONFIG_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_FILE_CONTENT" ADD CONSTRAINT "SYS_C007878" CHECK ("CONTENT" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_FILE_CONTENT" ADD CONSTRAINT "SYS_C007879" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_FILE_CONTENT" ADD CONSTRAINT "SYS_C007880" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_FILE_CONTENT" ADD CONSTRAINT "SYS_C008551" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_FILE_CONTENT" ADD CONSTRAINT "SYS_C008552" CHECK ("CONFIG_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_FILE_CONTENT" ADD CONSTRAINT "SYS_C008553" CHECK ("CONTENT" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_FILE_CONTENT" ADD CONSTRAINT "SYS_C008554" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_FILE_CONTENT" ADD CONSTRAINT "SYS_C008555" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table INFRA_JOB +-- ---------------------------- +ALTER TABLE "INFRA_JOB" ADD CONSTRAINT "SYS_C007881" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_JOB" ADD CONSTRAINT "SYS_C007882" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_JOB" ADD CONSTRAINT "SYS_C007883" CHECK ("RETRY_COUNT" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_JOB" ADD CONSTRAINT "SYS_C007884" CHECK ("RETRY_INTERVAL" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_JOB" ADD CONSTRAINT "SYS_C007885" CHECK ("MONITOR_TIMEOUT" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_JOB" ADD CONSTRAINT "SYS_C007886" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_JOB" ADD CONSTRAINT "SYS_C007887" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_JOB" ADD CONSTRAINT "SYS_C008556" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_JOB" ADD CONSTRAINT "SYS_C008557" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_JOB" ADD CONSTRAINT "SYS_C008558" CHECK ("RETRY_COUNT" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_JOB" ADD CONSTRAINT "SYS_C008559" CHECK ("RETRY_INTERVAL" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_JOB" ADD CONSTRAINT "SYS_C008560" CHECK ("MONITOR_TIMEOUT" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_JOB" ADD CONSTRAINT "SYS_C008561" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_JOB" ADD CONSTRAINT "SYS_C008562" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table INFRA_JOB_LOG +-- ---------------------------- +ALTER TABLE "INFRA_JOB_LOG" ADD CONSTRAINT "SYS_C007894" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_JOB_LOG" ADD CONSTRAINT "SYS_C007895" CHECK ("JOB_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_JOB_LOG" ADD CONSTRAINT "SYS_C007896" CHECK ("EXECUTE_INDEX" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_JOB_LOG" ADD CONSTRAINT "SYS_C007897" CHECK ("BEGIN_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_JOB_LOG" ADD CONSTRAINT "SYS_C007898" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_JOB_LOG" ADD CONSTRAINT "SYS_C007899" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_JOB_LOG" ADD CONSTRAINT "SYS_C007900" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_JOB_LOG" ADD CONSTRAINT "SYS_C008563" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_JOB_LOG" ADD CONSTRAINT "SYS_C008564" CHECK ("JOB_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_JOB_LOG" ADD CONSTRAINT "SYS_C008565" CHECK ("EXECUTE_INDEX" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_JOB_LOG" ADD CONSTRAINT "SYS_C008566" CHECK ("BEGIN_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_JOB_LOG" ADD CONSTRAINT "SYS_C008567" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_JOB_LOG" ADD CONSTRAINT "SYS_C008568" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_JOB_LOG" ADD CONSTRAINT "SYS_C008569" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table INFRA_TEST_DEMO +-- ---------------------------- +ALTER TABLE "INFRA_TEST_DEMO" ADD CONSTRAINT "SYS_C007888" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_TEST_DEMO" ADD CONSTRAINT "SYS_C007889" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_TEST_DEMO" ADD CONSTRAINT "SYS_C007890" CHECK ("TYPE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_TEST_DEMO" ADD CONSTRAINT "SYS_C007891" CHECK ("CATEGORY" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_TEST_DEMO" ADD CONSTRAINT "SYS_C007892" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_TEST_DEMO" ADD CONSTRAINT "SYS_C007893" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_TEST_DEMO" ADD CONSTRAINT "SYS_C008570" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_TEST_DEMO" ADD CONSTRAINT "SYS_C008571" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_TEST_DEMO" ADD CONSTRAINT "SYS_C008572" CHECK ("TYPE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_TEST_DEMO" ADD CONSTRAINT "SYS_C008573" CHECK ("CATEGORY" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_TEST_DEMO" ADD CONSTRAINT "SYS_C008574" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "INFRA_TEST_DEMO" ADD CONSTRAINT "SYS_C008575" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table MEMBER_USER +-- ---------------------------- +ALTER TABLE "MEMBER_USER" ADD CONSTRAINT "SYS_C007901" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "MEMBER_USER" ADD CONSTRAINT "SYS_C007902" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "MEMBER_USER" ADD CONSTRAINT "SYS_C007903" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "MEMBER_USER" ADD CONSTRAINT "SYS_C007904" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "MEMBER_USER" ADD CONSTRAINT "SYS_C007905" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "MEMBER_USER" ADD CONSTRAINT "SYS_C008576" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "MEMBER_USER" ADD CONSTRAINT "SYS_C008577" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "MEMBER_USER" ADD CONSTRAINT "SYS_C008578" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "MEMBER_USER" ADD CONSTRAINT "SYS_C008579" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "MEMBER_USER" ADD CONSTRAINT "SYS_C008580" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table PAY_APP +-- ---------------------------- +ALTER TABLE "PAY_APP" ADD CONSTRAINT "SYS_C007906" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_APP" ADD CONSTRAINT "SYS_C007907" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_APP" ADD CONSTRAINT "SYS_C007908" CHECK ("MERCHANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_APP" ADD CONSTRAINT "SYS_C007909" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_APP" ADD CONSTRAINT "SYS_C007910" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_APP" ADD CONSTRAINT "SYS_C007911" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_APP" ADD CONSTRAINT "SYS_C008581" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_APP" ADD CONSTRAINT "SYS_C008582" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_APP" ADD CONSTRAINT "SYS_C008583" CHECK ("MERCHANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_APP" ADD CONSTRAINT "SYS_C008584" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_APP" ADD CONSTRAINT "SYS_C008585" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_APP" ADD CONSTRAINT "SYS_C008586" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table PAY_CHANNEL +-- ---------------------------- +ALTER TABLE "PAY_CHANNEL" ADD CONSTRAINT "SYS_C007912" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_CHANNEL" ADD CONSTRAINT "SYS_C007913" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_CHANNEL" ADD CONSTRAINT "SYS_C007914" CHECK ("FEE_RATE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_CHANNEL" ADD CONSTRAINT "SYS_C007915" CHECK ("MERCHANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_CHANNEL" ADD CONSTRAINT "SYS_C007916" CHECK ("APP_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_CHANNEL" ADD CONSTRAINT "SYS_C007917" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_CHANNEL" ADD CONSTRAINT "SYS_C007918" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_CHANNEL" ADD CONSTRAINT "SYS_C007919" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_CHANNEL" ADD CONSTRAINT "SYS_C008587" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_CHANNEL" ADD CONSTRAINT "SYS_C008588" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_CHANNEL" ADD CONSTRAINT "SYS_C008589" CHECK ("FEE_RATE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_CHANNEL" ADD CONSTRAINT "SYS_C008590" CHECK ("MERCHANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_CHANNEL" ADD CONSTRAINT "SYS_C008591" CHECK ("APP_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_CHANNEL" ADD CONSTRAINT "SYS_C008592" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_CHANNEL" ADD CONSTRAINT "SYS_C008593" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_CHANNEL" ADD CONSTRAINT "SYS_C008594" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table PAY_MERCHANT +-- ---------------------------- +ALTER TABLE "PAY_MERCHANT" ADD CONSTRAINT "SYS_C007920" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_MERCHANT" ADD CONSTRAINT "SYS_C007921" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_MERCHANT" ADD CONSTRAINT "SYS_C007922" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_MERCHANT" ADD CONSTRAINT "SYS_C007923" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_MERCHANT" ADD CONSTRAINT "SYS_C007924" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_MERCHANT" ADD CONSTRAINT "SYS_C008595" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_MERCHANT" ADD CONSTRAINT "SYS_C008596" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_MERCHANT" ADD CONSTRAINT "SYS_C008597" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_MERCHANT" ADD CONSTRAINT "SYS_C008598" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_MERCHANT" ADD CONSTRAINT "SYS_C008599" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table PAY_NOTIFY_LOG +-- ---------------------------- +ALTER TABLE "PAY_NOTIFY_LOG" ADD CONSTRAINT "SYS_C007925" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_NOTIFY_LOG" ADD CONSTRAINT "SYS_C007926" CHECK ("TASK_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_NOTIFY_LOG" ADD CONSTRAINT "SYS_C007927" CHECK ("NOTIFY_TIMES" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_NOTIFY_LOG" ADD CONSTRAINT "SYS_C007928" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_NOTIFY_LOG" ADD CONSTRAINT "SYS_C007929" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_NOTIFY_LOG" ADD CONSTRAINT "SYS_C007930" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_NOTIFY_LOG" ADD CONSTRAINT "SYS_C007931" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_NOTIFY_LOG" ADD CONSTRAINT "SYS_C008600" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_NOTIFY_LOG" ADD CONSTRAINT "SYS_C008601" CHECK ("TASK_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_NOTIFY_LOG" ADD CONSTRAINT "SYS_C008602" CHECK ("NOTIFY_TIMES" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_NOTIFY_LOG" ADD CONSTRAINT "SYS_C008603" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_NOTIFY_LOG" ADD CONSTRAINT "SYS_C008604" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_NOTIFY_LOG" ADD CONSTRAINT "SYS_C008605" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_NOTIFY_LOG" ADD CONSTRAINT "SYS_C008606" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table PAY_NOTIFY_TASK +-- ---------------------------- +ALTER TABLE "PAY_NOTIFY_TASK" ADD CONSTRAINT "SYS_C007932" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_NOTIFY_TASK" ADD CONSTRAINT "SYS_C007933" CHECK ("MERCHANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_NOTIFY_TASK" ADD CONSTRAINT "SYS_C007934" CHECK ("APP_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_NOTIFY_TASK" ADD CONSTRAINT "SYS_C007935" CHECK ("TYPE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_NOTIFY_TASK" ADD CONSTRAINT "SYS_C007936" CHECK ("DATA_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_NOTIFY_TASK" ADD CONSTRAINT "SYS_C007937" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_NOTIFY_TASK" ADD CONSTRAINT "SYS_C007938" CHECK ("NEXT_NOTIFY_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_NOTIFY_TASK" ADD CONSTRAINT "SYS_C007939" CHECK ("LAST_EXECUTE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_NOTIFY_TASK" ADD CONSTRAINT "SYS_C007940" CHECK ("NOTIFY_TIMES" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_NOTIFY_TASK" ADD CONSTRAINT "SYS_C007941" CHECK ("MAX_NOTIFY_TIMES" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_NOTIFY_TASK" ADD CONSTRAINT "SYS_C007942" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_NOTIFY_TASK" ADD CONSTRAINT "SYS_C007943" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_NOTIFY_TASK" ADD CONSTRAINT "SYS_C007944" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_NOTIFY_TASK" ADD CONSTRAINT "SYS_C008607" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_NOTIFY_TASK" ADD CONSTRAINT "SYS_C008608" CHECK ("MERCHANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_NOTIFY_TASK" ADD CONSTRAINT "SYS_C008609" CHECK ("APP_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_NOTIFY_TASK" ADD CONSTRAINT "SYS_C008610" CHECK ("TYPE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_NOTIFY_TASK" ADD CONSTRAINT "SYS_C008611" CHECK ("DATA_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_NOTIFY_TASK" ADD CONSTRAINT "SYS_C008612" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_NOTIFY_TASK" ADD CONSTRAINT "SYS_C008613" CHECK ("NEXT_NOTIFY_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_NOTIFY_TASK" ADD CONSTRAINT "SYS_C008614" CHECK ("LAST_EXECUTE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_NOTIFY_TASK" ADD CONSTRAINT "SYS_C008615" CHECK ("NOTIFY_TIMES" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_NOTIFY_TASK" ADD CONSTRAINT "SYS_C008616" CHECK ("MAX_NOTIFY_TIMES" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_NOTIFY_TASK" ADD CONSTRAINT "SYS_C008617" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_NOTIFY_TASK" ADD CONSTRAINT "SYS_C008618" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_NOTIFY_TASK" ADD CONSTRAINT "SYS_C008619" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table PAY_ORDER +-- ---------------------------- +ALTER TABLE "PAY_ORDER" ADD CONSTRAINT "SYS_C007945" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_ORDER" ADD CONSTRAINT "SYS_C007946" CHECK ("MERCHANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_ORDER" ADD CONSTRAINT "SYS_C007947" CHECK ("APP_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_ORDER" ADD CONSTRAINT "SYS_C007948" CHECK ("NOTIFY_STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_ORDER" ADD CONSTRAINT "SYS_C007949" CHECK ("AMOUNT" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_ORDER" ADD CONSTRAINT "SYS_C007950" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_ORDER" ADD CONSTRAINT "SYS_C007951" CHECK ("EXPIRE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_ORDER" ADD CONSTRAINT "SYS_C007952" CHECK ("REFUND_STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_ORDER" ADD CONSTRAINT "SYS_C007953" CHECK ("REFUND_TIMES" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_ORDER" ADD CONSTRAINT "SYS_C007954" CHECK ("REFUND_AMOUNT" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_ORDER" ADD CONSTRAINT "SYS_C007955" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_ORDER" ADD CONSTRAINT "SYS_C007956" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_ORDER" ADD CONSTRAINT "SYS_C007957" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_ORDER" ADD CONSTRAINT "SYS_C008620" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_ORDER" ADD CONSTRAINT "SYS_C008621" CHECK ("MERCHANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_ORDER" ADD CONSTRAINT "SYS_C008622" CHECK ("APP_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_ORDER" ADD CONSTRAINT "SYS_C008623" CHECK ("NOTIFY_STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_ORDER" ADD CONSTRAINT "SYS_C008624" CHECK ("AMOUNT" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_ORDER" ADD CONSTRAINT "SYS_C008625" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_ORDER" ADD CONSTRAINT "SYS_C008626" CHECK ("EXPIRE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_ORDER" ADD CONSTRAINT "SYS_C008627" CHECK ("REFUND_STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_ORDER" ADD CONSTRAINT "SYS_C008628" CHECK ("REFUND_TIMES" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_ORDER" ADD CONSTRAINT "SYS_C008629" CHECK ("REFUND_AMOUNT" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_ORDER" ADD CONSTRAINT "SYS_C008630" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_ORDER" ADD CONSTRAINT "SYS_C008631" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_ORDER" ADD CONSTRAINT "SYS_C008632" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table PAY_ORDER_EXTENSION +-- ---------------------------- +ALTER TABLE "PAY_ORDER_EXTENSION" ADD CONSTRAINT "SYS_C007958" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_ORDER_EXTENSION" ADD CONSTRAINT "SYS_C007959" CHECK ("ORDER_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_ORDER_EXTENSION" ADD CONSTRAINT "SYS_C007960" CHECK ("CHANNEL_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_ORDER_EXTENSION" ADD CONSTRAINT "SYS_C007961" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_ORDER_EXTENSION" ADD CONSTRAINT "SYS_C007962" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_ORDER_EXTENSION" ADD CONSTRAINT "SYS_C007963" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_ORDER_EXTENSION" ADD CONSTRAINT "SYS_C007964" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_ORDER_EXTENSION" ADD CONSTRAINT "SYS_C008633" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_ORDER_EXTENSION" ADD CONSTRAINT "SYS_C008634" CHECK ("ORDER_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_ORDER_EXTENSION" ADD CONSTRAINT "SYS_C008635" CHECK ("CHANNEL_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_ORDER_EXTENSION" ADD CONSTRAINT "SYS_C008636" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_ORDER_EXTENSION" ADD CONSTRAINT "SYS_C008637" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_ORDER_EXTENSION" ADD CONSTRAINT "SYS_C008638" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_ORDER_EXTENSION" ADD CONSTRAINT "SYS_C008639" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table PAY_REFUND +-- ---------------------------- +ALTER TABLE "PAY_REFUND" ADD CONSTRAINT "SYS_C007965" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_REFUND" ADD CONSTRAINT "SYS_C007966" CHECK ("MERCHANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_REFUND" ADD CONSTRAINT "SYS_C007967" CHECK ("APP_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_REFUND" ADD CONSTRAINT "SYS_C007968" CHECK ("CHANNEL_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_REFUND" ADD CONSTRAINT "SYS_C007969" CHECK ("ORDER_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_REFUND" ADD CONSTRAINT "SYS_C007970" CHECK ("NOTIFY_STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_REFUND" ADD CONSTRAINT "SYS_C007971" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_REFUND" ADD CONSTRAINT "SYS_C007972" CHECK ("TYPE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_REFUND" ADD CONSTRAINT "SYS_C007973" CHECK ("PAY_AMOUNT" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_REFUND" ADD CONSTRAINT "SYS_C007974" CHECK ("REFUND_AMOUNT" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_REFUND" ADD CONSTRAINT "SYS_C007975" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_REFUND" ADD CONSTRAINT "SYS_C007976" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_REFUND" ADD CONSTRAINT "SYS_C007977" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_REFUND" ADD CONSTRAINT "SYS_C008640" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_REFUND" ADD CONSTRAINT "SYS_C008641" CHECK ("MERCHANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_REFUND" ADD CONSTRAINT "SYS_C008642" CHECK ("APP_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_REFUND" ADD CONSTRAINT "SYS_C008643" CHECK ("CHANNEL_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_REFUND" ADD CONSTRAINT "SYS_C008644" CHECK ("ORDER_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_REFUND" ADD CONSTRAINT "SYS_C008645" CHECK ("NOTIFY_STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_REFUND" ADD CONSTRAINT "SYS_C008646" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_REFUND" ADD CONSTRAINT "SYS_C008647" CHECK ("TYPE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_REFUND" ADD CONSTRAINT "SYS_C008648" CHECK ("PAY_AMOUNT" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_REFUND" ADD CONSTRAINT "SYS_C008649" CHECK ("REFUND_AMOUNT" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_REFUND" ADD CONSTRAINT "SYS_C008650" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_REFUND" ADD CONSTRAINT "SYS_C008651" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "PAY_REFUND" ADD CONSTRAINT "SYS_C008652" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Primary Key structure for table QRTZ_BLOB_TRIGGERS +-- ---------------------------- +ALTER TABLE "QRTZ_BLOB_TRIGGERS" ADD CONSTRAINT "QRTZ_BLOB_TRIG_PK" PRIMARY KEY ("SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP"); + +-- ---------------------------- +-- Checks structure for table QRTZ_BLOB_TRIGGERS +-- ---------------------------- +ALTER TABLE "QRTZ_BLOB_TRIGGERS" ADD CONSTRAINT "SYS_C008266" CHECK ("SCHED_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_BLOB_TRIGGERS" ADD CONSTRAINT "SYS_C008267" CHECK ("TRIGGER_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_BLOB_TRIGGERS" ADD CONSTRAINT "SYS_C008268" CHECK ("TRIGGER_GROUP" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_BLOB_TRIGGERS" ADD CONSTRAINT "SYS_C008653" CHECK ("SCHED_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_BLOB_TRIGGERS" ADD CONSTRAINT "SYS_C008654" CHECK ("TRIGGER_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_BLOB_TRIGGERS" ADD CONSTRAINT "SYS_C008655" CHECK ("TRIGGER_GROUP" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Primary Key structure for table QRTZ_CALENDARS +-- ---------------------------- +ALTER TABLE "QRTZ_CALENDARS" ADD CONSTRAINT "QRTZ_CALENDARS_PK" PRIMARY KEY ("SCHED_NAME", "CALENDAR_NAME"); + +-- ---------------------------- +-- Checks structure for table QRTZ_CALENDARS +-- ---------------------------- +ALTER TABLE "QRTZ_CALENDARS" ADD CONSTRAINT "SYS_C008271" CHECK ("SCHED_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_CALENDARS" ADD CONSTRAINT "SYS_C008272" CHECK ("CALENDAR_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_CALENDARS" ADD CONSTRAINT "SYS_C008273" CHECK ("CALENDAR" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_CALENDARS" ADD CONSTRAINT "SYS_C008656" CHECK ("SCHED_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_CALENDARS" ADD CONSTRAINT "SYS_C008657" CHECK ("CALENDAR_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_CALENDARS" ADD CONSTRAINT "SYS_C008658" CHECK ("CALENDAR" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Primary Key structure for table QRTZ_CRON_TRIGGERS +-- ---------------------------- +ALTER TABLE "QRTZ_CRON_TRIGGERS" ADD CONSTRAINT "QRTZ_CRON_TRIG_PK" PRIMARY KEY ("SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP"); + +-- ---------------------------- +-- Checks structure for table QRTZ_CRON_TRIGGERS +-- ---------------------------- +ALTER TABLE "QRTZ_CRON_TRIGGERS" ADD CONSTRAINT "SYS_C008255" CHECK ("SCHED_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_CRON_TRIGGERS" ADD CONSTRAINT "SYS_C008256" CHECK ("TRIGGER_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_CRON_TRIGGERS" ADD CONSTRAINT "SYS_C008257" CHECK ("TRIGGER_GROUP" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_CRON_TRIGGERS" ADD CONSTRAINT "SYS_C008258" CHECK ("CRON_EXPRESSION" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_CRON_TRIGGERS" ADD CONSTRAINT "SYS_C008659" CHECK ("SCHED_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_CRON_TRIGGERS" ADD CONSTRAINT "SYS_C008660" CHECK ("TRIGGER_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_CRON_TRIGGERS" ADD CONSTRAINT "SYS_C008661" CHECK ("TRIGGER_GROUP" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_CRON_TRIGGERS" ADD CONSTRAINT "SYS_C008662" CHECK ("CRON_EXPRESSION" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Primary Key structure for table QRTZ_FIRED_TRIGGERS +-- ---------------------------- +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CONSTRAINT "QRTZ_FIRED_TRIGGER_PK" PRIMARY KEY ("SCHED_NAME", "ENTRY_ID"); + +-- ---------------------------- +-- Checks structure for table QRTZ_FIRED_TRIGGERS +-- ---------------------------- +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CONSTRAINT "SYS_C008278" CHECK ("SCHED_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CONSTRAINT "SYS_C008279" CHECK ("ENTRY_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CONSTRAINT "SYS_C008280" CHECK ("TRIGGER_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CONSTRAINT "SYS_C008281" CHECK ("TRIGGER_GROUP" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CONSTRAINT "SYS_C008282" CHECK ("INSTANCE_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CONSTRAINT "SYS_C008283" CHECK ("FIRED_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CONSTRAINT "SYS_C008284" CHECK ("SCHED_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CONSTRAINT "SYS_C008285" CHECK ("PRIORITY" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CONSTRAINT "SYS_C008286" CHECK ("STATE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CONSTRAINT "SYS_C008663" CHECK ("SCHED_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CONSTRAINT "SYS_C008664" CHECK ("ENTRY_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CONSTRAINT "SYS_C008665" CHECK ("TRIGGER_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CONSTRAINT "SYS_C008666" CHECK ("TRIGGER_GROUP" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CONSTRAINT "SYS_C008667" CHECK ("INSTANCE_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CONSTRAINT "SYS_C008668" CHECK ("FIRED_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CONSTRAINT "SYS_C008669" CHECK ("SCHED_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CONSTRAINT "SYS_C008670" CHECK ("PRIORITY" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_FIRED_TRIGGERS" ADD CONSTRAINT "SYS_C008671" CHECK ("STATE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Indexes structure for table QRTZ_FIRED_TRIGGERS +-- ---------------------------- +CREATE INDEX "IDX_QRTZ_FT_INST_JOB_REQ_RCVRY" + ON "QRTZ_FIRED_TRIGGERS" ("SCHED_NAME" ASC, "INSTANCE_NAME" ASC, "REQUESTS_RECOVERY" ASC) + LOGGING + VISIBLE +PCTFREE 10 +INITRANS 2 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +); +CREATE INDEX "IDX_QRTZ_FT_JG" + ON "QRTZ_FIRED_TRIGGERS" ("SCHED_NAME" ASC, "JOB_GROUP" ASC) + LOGGING + ONLINE + NOSORT + VISIBLE +PCTFREE 10 +INITRANS 2 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +); +CREATE INDEX "IDX_QRTZ_FT_J_G" + ON "QRTZ_FIRED_TRIGGERS" ("SCHED_NAME" ASC, "JOB_NAME" ASC, "JOB_GROUP" ASC) + LOGGING + VISIBLE +PCTFREE 10 +INITRANS 2 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +); +CREATE INDEX "IDX_QRTZ_FT_TG" + ON "QRTZ_FIRED_TRIGGERS" ("SCHED_NAME" ASC, "TRIGGER_GROUP" ASC) LOCAL + LOGGING + NOSORT + VISIBLE +PCTFREE 10 +INITRANS 2 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +); + +-- ---------------------------- +-- Primary Key structure for table QRTZ_JOB_DETAILS +-- ---------------------------- +ALTER TABLE "QRTZ_JOB_DETAILS" ADD CONSTRAINT "QRTZ_JOB_DETAILS_PK" PRIMARY KEY ("SCHED_NAME", "JOB_NAME", "JOB_GROUP"); + +-- ---------------------------- +-- Checks structure for table QRTZ_JOB_DETAILS +-- ---------------------------- +ALTER TABLE "QRTZ_JOB_DETAILS" ADD CONSTRAINT "SYS_C008228" CHECK ("SCHED_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_JOB_DETAILS" ADD CONSTRAINT "SYS_C008229" CHECK ("JOB_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_JOB_DETAILS" ADD CONSTRAINT "SYS_C008230" CHECK ("JOB_GROUP" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_JOB_DETAILS" ADD CONSTRAINT "SYS_C008231" CHECK ("JOB_CLASS_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_JOB_DETAILS" ADD CONSTRAINT "SYS_C008232" CHECK ("IS_DURABLE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_JOB_DETAILS" ADD CONSTRAINT "SYS_C008233" CHECK ("IS_NONCONCURRENT" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_JOB_DETAILS" ADD CONSTRAINT "SYS_C008234" CHECK ("IS_UPDATE_DATA" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_JOB_DETAILS" ADD CONSTRAINT "SYS_C008235" CHECK ("REQUESTS_RECOVERY" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Indexes structure for table QRTZ_JOB_DETAILS +-- ---------------------------- +CREATE INDEX "IDX_QRTZ_J_GRP" + ON "QRTZ_JOB_DETAILS" ("SCHED_NAME" ASC, "JOB_GROUP" ASC) + LOGGING + VISIBLE +PCTFREE 10 +INITRANS 2 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +); +CREATE INDEX "IDX_QRTZ_J_REQ_RECOVERY" + ON "QRTZ_JOB_DETAILS" ("SCHED_NAME" ASC, "REQUESTS_RECOVERY" ASC) LOCAL + LOGGING + VISIBLE +PCTFREE 10 +INITRANS 2 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +); + +-- ---------------------------- +-- Primary Key structure for table QRTZ_LOCKS +-- ---------------------------- +ALTER TABLE "QRTZ_LOCKS" ADD CONSTRAINT "QRTZ_LOCKS_PK" PRIMARY KEY ("SCHED_NAME", "LOCK_NAME"); + +-- ---------------------------- +-- Checks structure for table QRTZ_LOCKS +-- ---------------------------- +ALTER TABLE "QRTZ_LOCKS" ADD CONSTRAINT "SYS_C008293" CHECK ("SCHED_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_LOCKS" ADD CONSTRAINT "SYS_C008294" CHECK ("LOCK_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_LOCKS" ADD CONSTRAINT "SYS_C008672" CHECK ("SCHED_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_LOCKS" ADD CONSTRAINT "SYS_C008673" CHECK ("LOCK_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Primary Key structure for table QRTZ_PAUSED_TRIGGER_GRPS +-- ---------------------------- +ALTER TABLE "QRTZ_PAUSED_TRIGGER_GRPS" ADD CONSTRAINT "QRTZ_PAUSED_TRIG_GRPS_PK" PRIMARY KEY ("SCHED_NAME", "TRIGGER_GROUP"); + +-- ---------------------------- +-- Checks structure for table QRTZ_PAUSED_TRIGGER_GRPS +-- ---------------------------- +ALTER TABLE "QRTZ_PAUSED_TRIGGER_GRPS" ADD CONSTRAINT "SYS_C008275" CHECK ("SCHED_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_PAUSED_TRIGGER_GRPS" ADD CONSTRAINT "SYS_C008276" CHECK ("TRIGGER_GROUP" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_PAUSED_TRIGGER_GRPS" ADD CONSTRAINT "SYS_C008674" CHECK ("SCHED_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_PAUSED_TRIGGER_GRPS" ADD CONSTRAINT "SYS_C008675" CHECK ("TRIGGER_GROUP" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Primary Key structure for table QRTZ_SCHEDULER_STATE +-- ---------------------------- +ALTER TABLE "QRTZ_SCHEDULER_STATE" ADD CONSTRAINT "QRTZ_SCHEDULER_STATE_PK" PRIMARY KEY ("SCHED_NAME", "INSTANCE_NAME"); + +-- ---------------------------- +-- Checks structure for table QRTZ_SCHEDULER_STATE +-- ---------------------------- +ALTER TABLE "QRTZ_SCHEDULER_STATE" ADD CONSTRAINT "SYS_C008288" CHECK ("SCHED_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_SCHEDULER_STATE" ADD CONSTRAINT "SYS_C008289" CHECK ("INSTANCE_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_SCHEDULER_STATE" ADD CONSTRAINT "SYS_C008290" CHECK ("LAST_CHECKIN_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_SCHEDULER_STATE" ADD CONSTRAINT "SYS_C008291" CHECK ("CHECKIN_INTERVAL" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_SCHEDULER_STATE" ADD CONSTRAINT "SYS_C008676" CHECK ("SCHED_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_SCHEDULER_STATE" ADD CONSTRAINT "SYS_C008677" CHECK ("INSTANCE_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_SCHEDULER_STATE" ADD CONSTRAINT "SYS_C008678" CHECK ("LAST_CHECKIN_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_SCHEDULER_STATE" ADD CONSTRAINT "SYS_C008679" CHECK ("CHECKIN_INTERVAL" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Primary Key structure for table QRTZ_SIMPLE_TRIGGERS +-- ---------------------------- +ALTER TABLE "QRTZ_SIMPLE_TRIGGERS" ADD CONSTRAINT "QRTZ_SIMPLE_TRIG_PK" PRIMARY KEY ("SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP"); + +-- ---------------------------- +-- Checks structure for table QRTZ_SIMPLE_TRIGGERS +-- ---------------------------- +ALTER TABLE "QRTZ_SIMPLE_TRIGGERS" ADD CONSTRAINT "SYS_C008247" CHECK ("SCHED_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_SIMPLE_TRIGGERS" ADD CONSTRAINT "SYS_C008248" CHECK ("TRIGGER_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_SIMPLE_TRIGGERS" ADD CONSTRAINT "SYS_C008249" CHECK ("TRIGGER_GROUP" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_SIMPLE_TRIGGERS" ADD CONSTRAINT "SYS_C008250" CHECK ("REPEAT_COUNT" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_SIMPLE_TRIGGERS" ADD CONSTRAINT "SYS_C008251" CHECK ("REPEAT_INTERVAL" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_SIMPLE_TRIGGERS" ADD CONSTRAINT "SYS_C008252" CHECK ("TIMES_TRIGGERED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_SIMPLE_TRIGGERS" ADD CONSTRAINT "SYS_C008680" CHECK ("SCHED_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_SIMPLE_TRIGGERS" ADD CONSTRAINT "SYS_C008681" CHECK ("TRIGGER_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_SIMPLE_TRIGGERS" ADD CONSTRAINT "SYS_C008682" CHECK ("TRIGGER_GROUP" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_SIMPLE_TRIGGERS" ADD CONSTRAINT "SYS_C008683" CHECK ("REPEAT_COUNT" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_SIMPLE_TRIGGERS" ADD CONSTRAINT "SYS_C008684" CHECK ("REPEAT_INTERVAL" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_SIMPLE_TRIGGERS" ADD CONSTRAINT "SYS_C008685" CHECK ("TIMES_TRIGGERED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Primary Key structure for table QRTZ_SIMPROP_TRIGGERS +-- ---------------------------- +ALTER TABLE "QRTZ_SIMPROP_TRIGGERS" ADD CONSTRAINT "QRTZ_SIMPROP_TRIG_PK" PRIMARY KEY ("SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP"); + +-- ---------------------------- +-- Checks structure for table QRTZ_SIMPROP_TRIGGERS +-- ---------------------------- +ALTER TABLE "QRTZ_SIMPROP_TRIGGERS" ADD CONSTRAINT "SYS_C008261" CHECK ("SCHED_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_SIMPROP_TRIGGERS" ADD CONSTRAINT "SYS_C008262" CHECK ("TRIGGER_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_SIMPROP_TRIGGERS" ADD CONSTRAINT "SYS_C008263" CHECK ("TRIGGER_GROUP" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_SIMPROP_TRIGGERS" ADD CONSTRAINT "SYS_C008686" CHECK ("SCHED_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_SIMPROP_TRIGGERS" ADD CONSTRAINT "SYS_C008687" CHECK ("TRIGGER_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_SIMPROP_TRIGGERS" ADD CONSTRAINT "SYS_C008688" CHECK ("TRIGGER_GROUP" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Primary Key structure for table QRTZ_TRIGGERS +-- ---------------------------- +ALTER TABLE "QRTZ_TRIGGERS" ADD CONSTRAINT "QRTZ_TRIGGERS_PK" PRIMARY KEY ("SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP"); + +-- ---------------------------- +-- Checks structure for table QRTZ_TRIGGERS +-- ---------------------------- +ALTER TABLE "QRTZ_TRIGGERS" ADD CONSTRAINT "SYS_C008237" CHECK ("SCHED_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_TRIGGERS" ADD CONSTRAINT "SYS_C008238" CHECK ("TRIGGER_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_TRIGGERS" ADD CONSTRAINT "SYS_C008239" CHECK ("TRIGGER_GROUP" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_TRIGGERS" ADD CONSTRAINT "SYS_C008240" CHECK ("JOB_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_TRIGGERS" ADD CONSTRAINT "SYS_C008241" CHECK ("JOB_GROUP" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_TRIGGERS" ADD CONSTRAINT "SYS_C008242" CHECK ("TRIGGER_STATE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_TRIGGERS" ADD CONSTRAINT "SYS_C008243" CHECK ("TRIGGER_TYPE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_TRIGGERS" ADD CONSTRAINT "SYS_C008244" CHECK ("START_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_TRIGGERS" ADD CONSTRAINT "SYS_C008689" CHECK ("SCHED_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_TRIGGERS" ADD CONSTRAINT "SYS_C008690" CHECK ("TRIGGER_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_TRIGGERS" ADD CONSTRAINT "SYS_C008691" CHECK ("TRIGGER_GROUP" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_TRIGGERS" ADD CONSTRAINT "SYS_C008692" CHECK ("JOB_NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_TRIGGERS" ADD CONSTRAINT "SYS_C008693" CHECK ("JOB_GROUP" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_TRIGGERS" ADD CONSTRAINT "SYS_C008694" CHECK ("TRIGGER_STATE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_TRIGGERS" ADD CONSTRAINT "SYS_C008695" CHECK ("TRIGGER_TYPE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "QRTZ_TRIGGERS" ADD CONSTRAINT "SYS_C008696" CHECK ("START_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Indexes structure for table QRTZ_TRIGGERS +-- ---------------------------- +CREATE INDEX "IDX_QRTZ_T_C" + ON "QRTZ_TRIGGERS" ("SCHED_NAME" ASC, "CALENDAR_NAME" ASC) LOCAL + LOGGING + ONLINE + NOSORT + VISIBLE +PCTFREE 10 +INITRANS 2 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +); +CREATE INDEX "IDX_QRTZ_T_J" + ON "QRTZ_TRIGGERS" ("SCHED_NAME" ASC, "JOB_NAME" ASC, "JOB_GROUP" ASC) + LOGGING + VISIBLE +PCTFREE 10 +INITRANS 2 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +); +CREATE INDEX "IDX_QRTZ_T_JG" + ON "QRTZ_TRIGGERS" ("SCHED_NAME" ASC, "JOB_GROUP" ASC) LOCAL + LOGGING + ONLINE + NOSORT + VISIBLE +PCTFREE 10 +INITRANS 2 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +); +CREATE INDEX "IDX_QRTZ_T_NEXT_FIRE_TIME" + ON "QRTZ_TRIGGERS" ("SCHED_NAME" ASC, "NEXT_FIRE_TIME" ASC) + LOGGING + VISIBLE +PCTFREE 10 +INITRANS 2 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +); +CREATE INDEX "IDX_QRTZ_T_NFT_ST" + ON "QRTZ_TRIGGERS" ("SCHED_NAME" ASC, "TRIGGER_STATE" ASC, "NEXT_FIRE_TIME" ASC) LOCAL + LOGGING + VISIBLE +PCTFREE 10 +INITRANS 2 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +); +CREATE INDEX "IDX_QRTZ_T_NFT_ST_MISFIRE" + ON "QRTZ_TRIGGERS" ("SCHED_NAME" ASC, "MISFIRE_INSTR" ASC, "NEXT_FIRE_TIME" ASC, "TRIGGER_STATE" ASC) LOCAL + LOGGING + ONLINE + NOSORT + VISIBLE +PCTFREE 10 +INITRANS 2 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +); +CREATE INDEX "IDX_QRTZ_T_STATE" + ON "QRTZ_TRIGGERS" ("SCHED_NAME" ASC, "TRIGGER_STATE" ASC) + LOGGING + VISIBLE +PCTFREE 10 +INITRANS 2 +STORAGE ( + INITIAL 65536 + NEXT 1048576 + MINEXTENTS 1 + MAXEXTENTS 2147483645 + FREELISTS 1 + FREELIST GROUPS 1 + BUFFER_POOL DEFAULT +); + +-- ---------------------------- +-- Checks structure for table SYSTEM_DEPT +-- ---------------------------- +ALTER TABLE "SYSTEM_DEPT" ADD CONSTRAINT "SYS_C008030" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_DEPT" ADD CONSTRAINT "SYS_C008031" CHECK ("PARENT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_DEPT" ADD CONSTRAINT "SYS_C008032" CHECK ("SORT" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_DEPT" ADD CONSTRAINT "SYS_C008033" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_DEPT" ADD CONSTRAINT "SYS_C008034" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_DEPT" ADD CONSTRAINT "SYS_C008035" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_DEPT" ADD CONSTRAINT "SYS_C008036" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_DEPT" ADD CONSTRAINT "SYS_C008206" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_DEPT" ADD CONSTRAINT "SYS_C008697" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_DEPT" ADD CONSTRAINT "SYS_C008698" CHECK ("PARENT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_DEPT" ADD CONSTRAINT "SYS_C008699" CHECK ("SORT" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_DEPT" ADD CONSTRAINT "SYS_C008700" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_DEPT" ADD CONSTRAINT "SYS_C008701" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_DEPT" ADD CONSTRAINT "SYS_C008702" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_DEPT" ADD CONSTRAINT "SYS_C008703" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_DEPT" ADD CONSTRAINT "SYS_C008704" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table SYSTEM_DICT_DATA +-- ---------------------------- +ALTER TABLE "SYSTEM_DICT_DATA" ADD CONSTRAINT "SYS_C008037" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_DICT_DATA" ADD CONSTRAINT "SYS_C008038" CHECK ("SORT" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_DICT_DATA" ADD CONSTRAINT "SYS_C008039" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_DICT_DATA" ADD CONSTRAINT "SYS_C008040" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_DICT_DATA" ADD CONSTRAINT "SYS_C008041" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_DICT_DATA" ADD CONSTRAINT "SYS_C008207" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_DICT_DATA" ADD CONSTRAINT "SYS_C008705" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_DICT_DATA" ADD CONSTRAINT "SYS_C008706" CHECK ("SORT" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_DICT_DATA" ADD CONSTRAINT "SYS_C008707" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_DICT_DATA" ADD CONSTRAINT "SYS_C008708" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_DICT_DATA" ADD CONSTRAINT "SYS_C008709" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_DICT_DATA" ADD CONSTRAINT "SYS_C008710" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table SYSTEM_DICT_TYPE +-- ---------------------------- +ALTER TABLE "SYSTEM_DICT_TYPE" ADD CONSTRAINT "SYS_C008042" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_DICT_TYPE" ADD CONSTRAINT "SYS_C008043" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_DICT_TYPE" ADD CONSTRAINT "SYS_C008044" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_DICT_TYPE" ADD CONSTRAINT "SYS_C008045" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_DICT_TYPE" ADD CONSTRAINT "SYS_C008208" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_DICT_TYPE" ADD CONSTRAINT "SYS_C008711" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_DICT_TYPE" ADD CONSTRAINT "SYS_C008712" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_DICT_TYPE" ADD CONSTRAINT "SYS_C008713" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_DICT_TYPE" ADD CONSTRAINT "SYS_C008714" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_DICT_TYPE" ADD CONSTRAINT "SYS_C008715" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table SYSTEM_ERROR_CODE +-- ---------------------------- +ALTER TABLE "SYSTEM_ERROR_CODE" ADD CONSTRAINT "SYS_C008046" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_ERROR_CODE" ADD CONSTRAINT "SYS_C008047" CHECK ("TYPE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_ERROR_CODE" ADD CONSTRAINT "SYS_C008048" CHECK ("CODE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_ERROR_CODE" ADD CONSTRAINT "SYS_C008049" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_ERROR_CODE" ADD CONSTRAINT "SYS_C008050" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_ERROR_CODE" ADD CONSTRAINT "SYS_C008209" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_ERROR_CODE" ADD CONSTRAINT "SYS_C008716" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_ERROR_CODE" ADD CONSTRAINT "SYS_C008717" CHECK ("TYPE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_ERROR_CODE" ADD CONSTRAINT "SYS_C008718" CHECK ("CODE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_ERROR_CODE" ADD CONSTRAINT "SYS_C008719" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_ERROR_CODE" ADD CONSTRAINT "SYS_C008720" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_ERROR_CODE" ADD CONSTRAINT "SYS_C008721" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table SYSTEM_LOGIN_LOG +-- ---------------------------- +ALTER TABLE "SYSTEM_LOGIN_LOG" ADD CONSTRAINT "SYS_C008056" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_LOGIN_LOG" ADD CONSTRAINT "SYS_C008057" CHECK ("LOG_TYPE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_LOGIN_LOG" ADD CONSTRAINT "SYS_C008058" CHECK ("USER_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_LOGIN_LOG" ADD CONSTRAINT "SYS_C008059" CHECK ("USER_TYPE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_LOGIN_LOG" ADD CONSTRAINT "SYS_C008060" CHECK ("RESULT" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_LOGIN_LOG" ADD CONSTRAINT "SYS_C008061" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_LOGIN_LOG" ADD CONSTRAINT "SYS_C008062" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_LOGIN_LOG" ADD CONSTRAINT "SYS_C008063" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_LOGIN_LOG" ADD CONSTRAINT "SYS_C008210" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_LOGIN_LOG" ADD CONSTRAINT "SYS_C008722" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_LOGIN_LOG" ADD CONSTRAINT "SYS_C008723" CHECK ("LOG_TYPE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_LOGIN_LOG" ADD CONSTRAINT "SYS_C008724" CHECK ("USER_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_LOGIN_LOG" ADD CONSTRAINT "SYS_C008725" CHECK ("USER_TYPE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_LOGIN_LOG" ADD CONSTRAINT "SYS_C008726" CHECK ("RESULT" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_LOGIN_LOG" ADD CONSTRAINT "SYS_C008727" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_LOGIN_LOG" ADD CONSTRAINT "SYS_C008728" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_LOGIN_LOG" ADD CONSTRAINT "SYS_C008729" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_LOGIN_LOG" ADD CONSTRAINT "SYS_C008730" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table SYSTEM_MENU +-- ---------------------------- +ALTER TABLE "SYSTEM_MENU" ADD CONSTRAINT "SYS_C009625" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_MENU" ADD CONSTRAINT "SYS_C009626" CHECK ("NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_MENU" ADD CONSTRAINT "SYS_C009628" CHECK ("TYPE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_MENU" ADD CONSTRAINT "SYS_C009629" CHECK ("SORT" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_MENU" ADD CONSTRAINT "SYS_C009630" CHECK ("PARENT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_MENU" ADD CONSTRAINT "SYS_C009631" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_MENU" ADD CONSTRAINT "SYS_C009632" CHECK ("VISIBLE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_MENU" ADD CONSTRAINT "SYS_C009633" CHECK ("KEEP_ALIVE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_MENU" ADD CONSTRAINT "SYS_C009634" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_MENU" ADD CONSTRAINT "SYS_C009635" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_MENU" ADD CONSTRAINT "SYS_C009636" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table SYSTEM_NOTICE +-- ---------------------------- +ALTER TABLE "SYSTEM_NOTICE" ADD CONSTRAINT "SYS_C009566" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_NOTICE" ADD CONSTRAINT "SYS_C009567" CHECK ("CONTENT" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_NOTICE" ADD CONSTRAINT "SYS_C009568" CHECK ("NOTICE_TYPE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_NOTICE" ADD CONSTRAINT "SYS_C009569" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_NOTICE" ADD CONSTRAINT "SYS_C009570" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_NOTICE" ADD CONSTRAINT "SYS_C009571" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_NOTICE" ADD CONSTRAINT "SYS_C009572" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_NOTICE" ADD CONSTRAINT "SYS_C009573" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Primary Key structure for table SYSTEM_OAUTH2_ACCESS_TOKEN +-- ---------------------------- +ALTER TABLE "SYSTEM_OAUTH2_ACCESS_TOKEN" ADD CONSTRAINT "SYS_C008444" PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Checks structure for table SYSTEM_OAUTH2_ACCESS_TOKEN +-- ---------------------------- +ALTER TABLE "SYSTEM_OAUTH2_ACCESS_TOKEN" ADD CONSTRAINT "SYS_C008418" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_ACCESS_TOKEN" ADD CONSTRAINT "SYS_C008419" CHECK ("USER_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_ACCESS_TOKEN" ADD CONSTRAINT "SYS_C008420" CHECK ("ACCESS_TOKEN" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_ACCESS_TOKEN" ADD CONSTRAINT "SYS_C008421" CHECK ("REFRESH_TOKEN" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_ACCESS_TOKEN" ADD CONSTRAINT "SYS_C008422" CHECK ("USER_TYPE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_ACCESS_TOKEN" ADD CONSTRAINT "SYS_C008423" CHECK ("CLIENT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_ACCESS_TOKEN" ADD CONSTRAINT "SYS_C008424" CHECK ("EXPIRES_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_ACCESS_TOKEN" ADD CONSTRAINT "SYS_C008425" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_ACCESS_TOKEN" ADD CONSTRAINT "SYS_C008426" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_ACCESS_TOKEN" ADD CONSTRAINT "SYS_C008427" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_ACCESS_TOKEN" ADD CONSTRAINT "SYS_C008428" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table SYSTEM_OAUTH2_APPROVE +-- ---------------------------- +ALTER TABLE "SYSTEM_OAUTH2_APPROVE" ADD CONSTRAINT "SYS_C009679" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_APPROVE" ADD CONSTRAINT "SYS_C009691" CHECK ("USER_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_APPROVE" ADD CONSTRAINT "SYS_C009692" CHECK ("USER_TYPE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_APPROVE" ADD CONSTRAINT "SYS_C009693" CHECK ("CLIENT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_APPROVE" ADD CONSTRAINT "SYS_C009694" CHECK ("SCOPE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_APPROVE" ADD CONSTRAINT "SYS_C009695" CHECK ("APPROVED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_APPROVE" ADD CONSTRAINT "SYS_C009696" CHECK ("EXPIRES_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_APPROVE" ADD CONSTRAINT "SYS_C009697" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_APPROVE" ADD CONSTRAINT "SYS_C009698" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_APPROVE" ADD CONSTRAINT "SYS_C009699" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_APPROVE" ADD CONSTRAINT "SYS_C009700" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Primary Key structure for table SYSTEM_OAUTH2_CLIENT +-- ---------------------------- +ALTER TABLE "SYSTEM_OAUTH2_CLIENT" ADD CONSTRAINT "SYS_C008445" PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Checks structure for table SYSTEM_OAUTH2_CLIENT +-- ---------------------------- +ALTER TABLE "SYSTEM_OAUTH2_CLIENT" ADD CONSTRAINT "SYS_C008429" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_CLIENT" ADD CONSTRAINT "SYS_C008430" CHECK ("CLIENT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_CLIENT" ADD CONSTRAINT "SYS_C008431" CHECK ("SECRET" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_CLIENT" ADD CONSTRAINT "SYS_C008432" CHECK ("NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_CLIENT" ADD CONSTRAINT "SYS_C008433" CHECK ("LOGO" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_CLIENT" ADD CONSTRAINT "SYS_C008434" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_CLIENT" ADD CONSTRAINT "SYS_C008435" CHECK ("ACCESS_TOKEN_VALIDITY_SECONDS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_CLIENT" ADD CONSTRAINT "SYS_C008436" CHECK ("REFRESH_TOKEN_VALIDITY_SECONDS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_CLIENT" ADD CONSTRAINT "SYS_C008437" CHECK ("REDIRECT_URIS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_CLIENT" ADD CONSTRAINT "SYS_C008439" CHECK ("AUTHORIZED_GRANT_TYPES" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_CLIENT" ADD CONSTRAINT "SYS_C008440" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_CLIENT" ADD CONSTRAINT "SYS_C008441" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_CLIENT" ADD CONSTRAINT "SYS_C008442" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table SYSTEM_OAUTH2_CODE +-- ---------------------------- +ALTER TABLE "SYSTEM_OAUTH2_CODE" ADD CONSTRAINT "SYS_C009680" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_CODE" ADD CONSTRAINT "SYS_C009681" CHECK ("USER_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_CODE" ADD CONSTRAINT "SYS_C009682" CHECK ("USER_TYPE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_CODE" ADD CONSTRAINT "SYS_C009683" CHECK ("CODE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_CODE" ADD CONSTRAINT "SYS_C009684" CHECK ("CLIENT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_CODE" ADD CONSTRAINT "SYS_C009685" CHECK ("EXPIRES_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_CODE" ADD CONSTRAINT "SYS_C009687" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_CODE" ADD CONSTRAINT "SYS_C009688" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_CODE" ADD CONSTRAINT "SYS_C009689" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_CODE" ADD CONSTRAINT "SYS_C009690" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Primary Key structure for table SYSTEM_OAUTH2_REFRESH_TOKEN +-- ---------------------------- +ALTER TABLE "SYSTEM_OAUTH2_REFRESH_TOKEN" ADD CONSTRAINT "SYS_C008443" PRIMARY KEY ("ID"); + +-- ---------------------------- +-- Checks structure for table SYSTEM_OAUTH2_REFRESH_TOKEN +-- ---------------------------- +ALTER TABLE "SYSTEM_OAUTH2_REFRESH_TOKEN" ADD CONSTRAINT "SYS_C008408" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_REFRESH_TOKEN" ADD CONSTRAINT "SYS_C008409" CHECK ("USER_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_REFRESH_TOKEN" ADD CONSTRAINT "SYS_C008410" CHECK ("REFRESH_TOKEN" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_REFRESH_TOKEN" ADD CONSTRAINT "SYS_C008411" CHECK ("USER_TYPE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_REFRESH_TOKEN" ADD CONSTRAINT "SYS_C008412" CHECK ("CLIENT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_REFRESH_TOKEN" ADD CONSTRAINT "SYS_C008413" CHECK ("EXPIRES_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_REFRESH_TOKEN" ADD CONSTRAINT "SYS_C008414" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_REFRESH_TOKEN" ADD CONSTRAINT "SYS_C008415" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_REFRESH_TOKEN" ADD CONSTRAINT "SYS_C008416" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OAUTH2_REFRESH_TOKEN" ADD CONSTRAINT "SYS_C008417" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table SYSTEM_OPERATE_LOG +-- ---------------------------- +ALTER TABLE "SYSTEM_OPERATE_LOG" ADD CONSTRAINT "SYS_C009574" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OPERATE_LOG" ADD CONSTRAINT "SYS_C009575" CHECK ("USER_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OPERATE_LOG" ADD CONSTRAINT "SYS_C009576" CHECK ("USER_TYPE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OPERATE_LOG" ADD CONSTRAINT "SYS_C009577" CHECK ("TYPE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OPERATE_LOG" ADD CONSTRAINT "SYS_C009578" CHECK ("START_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OPERATE_LOG" ADD CONSTRAINT "SYS_C009579" CHECK ("DURATION" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OPERATE_LOG" ADD CONSTRAINT "SYS_C009580" CHECK ("RESULT_CODE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OPERATE_LOG" ADD CONSTRAINT "SYS_C009581" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OPERATE_LOG" ADD CONSTRAINT "SYS_C009582" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OPERATE_LOG" ADD CONSTRAINT "SYS_C009583" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_OPERATE_LOG" ADD CONSTRAINT "SYS_C009584" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table SYSTEM_POST +-- ---------------------------- +ALTER TABLE "SYSTEM_POST" ADD CONSTRAINT "SYS_C009585" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_POST" ADD CONSTRAINT "SYS_C009586" CHECK ("SORT" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_POST" ADD CONSTRAINT "SYS_C009587" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_POST" ADD CONSTRAINT "SYS_C009588" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_POST" ADD CONSTRAINT "SYS_C009589" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_POST" ADD CONSTRAINT "SYS_C009590" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_POST" ADD CONSTRAINT "SYS_C009591" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table SYSTEM_ROLE +-- ---------------------------- +ALTER TABLE "SYSTEM_ROLE" ADD CONSTRAINT "SYS_C009592" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_ROLE" ADD CONSTRAINT "SYS_C009593" CHECK ("SORT" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_ROLE" ADD CONSTRAINT "SYS_C009594" CHECK ("DATA_SCOPE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_ROLE" ADD CONSTRAINT "SYS_C009595" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_ROLE" ADD CONSTRAINT "SYS_C009596" CHECK ("TYPE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_ROLE" ADD CONSTRAINT "SYS_C009597" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_ROLE" ADD CONSTRAINT "SYS_C009598" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_ROLE" ADD CONSTRAINT "SYS_C009599" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_ROLE" ADD CONSTRAINT "SYS_C009600" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table SYSTEM_ROLE_MENU +-- ---------------------------- +ALTER TABLE "SYSTEM_ROLE_MENU" ADD CONSTRAINT "SYS_C008108" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_ROLE_MENU" ADD CONSTRAINT "SYS_C008109" CHECK ("ROLE_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_ROLE_MENU" ADD CONSTRAINT "SYS_C008110" CHECK ("MENU_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_ROLE_MENU" ADD CONSTRAINT "SYS_C008111" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_ROLE_MENU" ADD CONSTRAINT "SYS_C008112" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_ROLE_MENU" ADD CONSTRAINT "SYS_C008113" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_ROLE_MENU" ADD CONSTRAINT "SYS_C008218" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_ROLE_MENU" ADD CONSTRAINT "SYS_C008776" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_ROLE_MENU" ADD CONSTRAINT "SYS_C008777" CHECK ("ROLE_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_ROLE_MENU" ADD CONSTRAINT "SYS_C008778" CHECK ("MENU_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_ROLE_MENU" ADD CONSTRAINT "SYS_C008779" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_ROLE_MENU" ADD CONSTRAINT "SYS_C008780" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_ROLE_MENU" ADD CONSTRAINT "SYS_C008781" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_ROLE_MENU" ADD CONSTRAINT "SYS_C008782" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table SYSTEM_SENSITIVE_WORD +-- ---------------------------- +ALTER TABLE "SYSTEM_SENSITIVE_WORD" ADD CONSTRAINT "SYS_C008102" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SENSITIVE_WORD" ADD CONSTRAINT "SYS_C008103" CHECK ("NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SENSITIVE_WORD" ADD CONSTRAINT "SYS_C008104" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SENSITIVE_WORD" ADD CONSTRAINT "SYS_C008105" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SENSITIVE_WORD" ADD CONSTRAINT "SYS_C008106" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SENSITIVE_WORD" ADD CONSTRAINT "SYS_C008107" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SENSITIVE_WORD" ADD CONSTRAINT "SYS_C008783" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SENSITIVE_WORD" ADD CONSTRAINT "SYS_C008784" CHECK ("NAME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SENSITIVE_WORD" ADD CONSTRAINT "SYS_C008785" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SENSITIVE_WORD" ADD CONSTRAINT "SYS_C008786" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SENSITIVE_WORD" ADD CONSTRAINT "SYS_C008787" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SENSITIVE_WORD" ADD CONSTRAINT "SYS_C008788" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table SYSTEM_SMS_CHANNEL +-- ---------------------------- +ALTER TABLE "SYSTEM_SMS_CHANNEL" ADD CONSTRAINT "SYS_C008114" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_CHANNEL" ADD CONSTRAINT "SYS_C008115" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_CHANNEL" ADD CONSTRAINT "SYS_C008116" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_CHANNEL" ADD CONSTRAINT "SYS_C008117" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_CHANNEL" ADD CONSTRAINT "SYS_C008219" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_CHANNEL" ADD CONSTRAINT "SYS_C008789" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_CHANNEL" ADD CONSTRAINT "SYS_C008790" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_CHANNEL" ADD CONSTRAINT "SYS_C008791" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_CHANNEL" ADD CONSTRAINT "SYS_C008792" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_CHANNEL" ADD CONSTRAINT "SYS_C008793" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table SYSTEM_SMS_CODE +-- ---------------------------- +ALTER TABLE "SYSTEM_SMS_CODE" ADD CONSTRAINT "SYS_C008118" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_CODE" ADD CONSTRAINT "SYS_C008119" CHECK ("SCENE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_CODE" ADD CONSTRAINT "SYS_C008120" CHECK ("TODAY_INDEX" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_CODE" ADD CONSTRAINT "SYS_C008121" CHECK ("USED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_CODE" ADD CONSTRAINT "SYS_C008122" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_CODE" ADD CONSTRAINT "SYS_C008123" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_CODE" ADD CONSTRAINT "SYS_C008124" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_CODE" ADD CONSTRAINT "SYS_C008220" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_CODE" ADD CONSTRAINT "SYS_C008794" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_CODE" ADD CONSTRAINT "SYS_C008795" CHECK ("SCENE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_CODE" ADD CONSTRAINT "SYS_C008796" CHECK ("TODAY_INDEX" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_CODE" ADD CONSTRAINT "SYS_C008797" CHECK ("USED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_CODE" ADD CONSTRAINT "SYS_C008798" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_CODE" ADD CONSTRAINT "SYS_C008799" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_CODE" ADD CONSTRAINT "SYS_C008800" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_CODE" ADD CONSTRAINT "SYS_C008801" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table SYSTEM_SMS_LOG +-- ---------------------------- +ALTER TABLE "SYSTEM_SMS_LOG" ADD CONSTRAINT "SYS_C008125" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_LOG" ADD CONSTRAINT "SYS_C008126" CHECK ("CHANNEL_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_LOG" ADD CONSTRAINT "SYS_C008127" CHECK ("TEMPLATE_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_LOG" ADD CONSTRAINT "SYS_C008128" CHECK ("TEMPLATE_TYPE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_LOG" ADD CONSTRAINT "SYS_C008129" CHECK ("SEND_STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_LOG" ADD CONSTRAINT "SYS_C008130" CHECK ("RECEIVE_STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_LOG" ADD CONSTRAINT "SYS_C008131" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_LOG" ADD CONSTRAINT "SYS_C008132" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_LOG" ADD CONSTRAINT "SYS_C008221" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_LOG" ADD CONSTRAINT "SYS_C008802" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_LOG" ADD CONSTRAINT "SYS_C008803" CHECK ("CHANNEL_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_LOG" ADD CONSTRAINT "SYS_C008804" CHECK ("TEMPLATE_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_LOG" ADD CONSTRAINT "SYS_C008805" CHECK ("TEMPLATE_TYPE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_LOG" ADD CONSTRAINT "SYS_C008806" CHECK ("SEND_STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_LOG" ADD CONSTRAINT "SYS_C008807" CHECK ("RECEIVE_STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_LOG" ADD CONSTRAINT "SYS_C008808" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_LOG" ADD CONSTRAINT "SYS_C008809" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_LOG" ADD CONSTRAINT "SYS_C008810" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table SYSTEM_SMS_TEMPLATE +-- ---------------------------- +ALTER TABLE "SYSTEM_SMS_TEMPLATE" ADD CONSTRAINT "SYS_C008133" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_TEMPLATE" ADD CONSTRAINT "SYS_C008134" CHECK ("TYPE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_TEMPLATE" ADD CONSTRAINT "SYS_C008135" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_TEMPLATE" ADD CONSTRAINT "SYS_C008136" CHECK ("CHANNEL_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_TEMPLATE" ADD CONSTRAINT "SYS_C008137" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_TEMPLATE" ADD CONSTRAINT "SYS_C008138" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_TEMPLATE" ADD CONSTRAINT "SYS_C008222" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_TEMPLATE" ADD CONSTRAINT "SYS_C008811" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_TEMPLATE" ADD CONSTRAINT "SYS_C008812" CHECK ("TYPE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_TEMPLATE" ADD CONSTRAINT "SYS_C008813" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_TEMPLATE" ADD CONSTRAINT "SYS_C008814" CHECK ("CHANNEL_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_TEMPLATE" ADD CONSTRAINT "SYS_C008815" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_TEMPLATE" ADD CONSTRAINT "SYS_C008816" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SMS_TEMPLATE" ADD CONSTRAINT "SYS_C008817" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table SYSTEM_SOCIAL_USER +-- ---------------------------- +ALTER TABLE "SYSTEM_SOCIAL_USER" ADD CONSTRAINT "SYS_C008139" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SOCIAL_USER" ADD CONSTRAINT "SYS_C008140" CHECK ("USER_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SOCIAL_USER" ADD CONSTRAINT "SYS_C008141" CHECK ("USER_TYPE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SOCIAL_USER" ADD CONSTRAINT "SYS_C008142" CHECK ("TYPE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SOCIAL_USER" ADD CONSTRAINT "SYS_C008143" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SOCIAL_USER" ADD CONSTRAINT "SYS_C008144" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SOCIAL_USER" ADD CONSTRAINT "SYS_C008145" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SOCIAL_USER" ADD CONSTRAINT "SYS_C008223" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SOCIAL_USER" ADD CONSTRAINT "SYS_C008818" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SOCIAL_USER" ADD CONSTRAINT "SYS_C008819" CHECK ("USER_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SOCIAL_USER" ADD CONSTRAINT "SYS_C008820" CHECK ("USER_TYPE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SOCIAL_USER" ADD CONSTRAINT "SYS_C008821" CHECK ("TYPE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SOCIAL_USER" ADD CONSTRAINT "SYS_C008822" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SOCIAL_USER" ADD CONSTRAINT "SYS_C008823" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SOCIAL_USER" ADD CONSTRAINT "SYS_C008824" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_SOCIAL_USER" ADD CONSTRAINT "SYS_C008825" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table SYSTEM_TENANT +-- ---------------------------- +ALTER TABLE "SYSTEM_TENANT" ADD CONSTRAINT "SYS_C008146" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_TENANT" ADD CONSTRAINT "SYS_C008147" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_TENANT" ADD CONSTRAINT "SYS_C008148" CHECK ("PACKAGE_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_TENANT" ADD CONSTRAINT "SYS_C008149" CHECK ("EXPIRE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_TENANT" ADD CONSTRAINT "SYS_C008150" CHECK ("ACCOUNT_COUNT" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_TENANT" ADD CONSTRAINT "SYS_C008151" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_TENANT" ADD CONSTRAINT "SYS_C008152" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_TENANT" ADD CONSTRAINT "SYS_C008224" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_TENANT" ADD CONSTRAINT "SYS_C008826" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_TENANT" ADD CONSTRAINT "SYS_C008827" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_TENANT" ADD CONSTRAINT "SYS_C008828" CHECK ("PACKAGE_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_TENANT" ADD CONSTRAINT "SYS_C008829" CHECK ("EXPIRE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_TENANT" ADD CONSTRAINT "SYS_C008830" CHECK ("ACCOUNT_COUNT" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_TENANT" ADD CONSTRAINT "SYS_C008831" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_TENANT" ADD CONSTRAINT "SYS_C008832" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_TENANT" ADD CONSTRAINT "SYS_C008833" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table SYSTEM_TENANT_PACKAGE +-- ---------------------------- +ALTER TABLE "SYSTEM_TENANT_PACKAGE" ADD CONSTRAINT "SYS_C008153" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_TENANT_PACKAGE" ADD CONSTRAINT "SYS_C008154" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_TENANT_PACKAGE" ADD CONSTRAINT "SYS_C008155" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_TENANT_PACKAGE" ADD CONSTRAINT "SYS_C008156" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_TENANT_PACKAGE" ADD CONSTRAINT "SYS_C008197" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_TENANT_PACKAGE" ADD CONSTRAINT "SYS_C008834" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_TENANT_PACKAGE" ADD CONSTRAINT "SYS_C008835" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_TENANT_PACKAGE" ADD CONSTRAINT "SYS_C008836" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_TENANT_PACKAGE" ADD CONSTRAINT "SYS_C008837" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_TENANT_PACKAGE" ADD CONSTRAINT "SYS_C008838" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table SYSTEM_USERS +-- ---------------------------- +ALTER TABLE "SYSTEM_USERS" ADD CONSTRAINT "SYS_C008157" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_USERS" ADD CONSTRAINT "SYS_C008158" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_USERS" ADD CONSTRAINT "SYS_C008159" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_USERS" ADD CONSTRAINT "SYS_C008160" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_USERS" ADD CONSTRAINT "SYS_C008161" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_USERS" ADD CONSTRAINT "SYS_C008227" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_USERS" ADD CONSTRAINT "SYS_C008839" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_USERS" ADD CONSTRAINT "SYS_C008840" CHECK ("STATUS" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_USERS" ADD CONSTRAINT "SYS_C008841" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_USERS" ADD CONSTRAINT "SYS_C008842" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_USERS" ADD CONSTRAINT "SYS_C008843" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_USERS" ADD CONSTRAINT "SYS_C008844" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table SYSTEM_USER_POST +-- ---------------------------- +ALTER TABLE "SYSTEM_USER_POST" ADD CONSTRAINT "SYS_C008302" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_USER_POST" ADD CONSTRAINT "SYS_C008303" CHECK ("USER_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_USER_POST" ADD CONSTRAINT "SYS_C008304" CHECK ("POST_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_USER_POST" ADD CONSTRAINT "SYS_C008305" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_USER_POST" ADD CONSTRAINT "SYS_C008306" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_USER_POST" ADD CONSTRAINT "SYS_C008307" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_USER_POST" ADD CONSTRAINT "SYS_C008308" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_USER_POST" ADD CONSTRAINT "SYS_C008845" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_USER_POST" ADD CONSTRAINT "SYS_C008846" CHECK ("USER_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_USER_POST" ADD CONSTRAINT "SYS_C008847" CHECK ("POST_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_USER_POST" ADD CONSTRAINT "SYS_C008848" CHECK ("CREATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_USER_POST" ADD CONSTRAINT "SYS_C008849" CHECK ("UPDATE_TIME" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_USER_POST" ADD CONSTRAINT "SYS_C008850" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_USER_POST" ADD CONSTRAINT "SYS_C008851" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Checks structure for table SYSTEM_USER_ROLE +-- ---------------------------- +ALTER TABLE "SYSTEM_USER_ROLE" ADD CONSTRAINT "SYS_C008162" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_USER_ROLE" ADD CONSTRAINT "SYS_C008163" CHECK ("USER_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_USER_ROLE" ADD CONSTRAINT "SYS_C008164" CHECK ("ROLE_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_USER_ROLE" ADD CONSTRAINT "SYS_C008165" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_USER_ROLE" ADD CONSTRAINT "SYS_C008226" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_USER_ROLE" ADD CONSTRAINT "SYS_C008852" CHECK ("ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_USER_ROLE" ADD CONSTRAINT "SYS_C008853" CHECK ("USER_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_USER_ROLE" ADD CONSTRAINT "SYS_C008854" CHECK ("ROLE_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_USER_ROLE" ADD CONSTRAINT "SYS_C008855" CHECK ("TENANT_ID" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; +ALTER TABLE "SYSTEM_USER_ROLE" ADD CONSTRAINT "SYS_C008856" CHECK ("DELETED" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Foreign Keys structure for table QRTZ_BLOB_TRIGGERS +-- ---------------------------- +ALTER TABLE "QRTZ_BLOB_TRIGGERS" ADD CONSTRAINT "QRTZ_BLOB_TRIG_TO_TRIG_FK" FOREIGN KEY ("SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP") REFERENCES "QRTZ_TRIGGERS" ("SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP") NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Foreign Keys structure for table QRTZ_CRON_TRIGGERS +-- ---------------------------- +ALTER TABLE "QRTZ_CRON_TRIGGERS" ADD CONSTRAINT "QRTZ_CRON_TRIG_TO_TRIG_FK" FOREIGN KEY ("SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP") REFERENCES "QRTZ_TRIGGERS" ("SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP") NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Foreign Keys structure for table QRTZ_SIMPLE_TRIGGERS +-- ---------------------------- +ALTER TABLE "QRTZ_SIMPLE_TRIGGERS" ADD CONSTRAINT "QRTZ_SIMPLE_TRIG_TO_TRIG_FK" FOREIGN KEY ("SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP") REFERENCES "QRTZ_TRIGGERS" ("SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP") NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; + +-- ---------------------------- +-- Foreign Keys structure for table QRTZ_SIMPROP_TRIGGERS +-- ---------------------------- +ALTER TABLE "QRTZ_SIMPROP_TRIGGERS" ADD CONSTRAINT "QRTZ_SIMPROP_TRIG_TO_TRIG_FK" FOREIGN KEY ("SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP") REFERENCES "QRTZ_TRIGGERS" ("SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP") NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE; diff --git a/sql/postgresql/ruoyi-vue-pro.sql b/sql/postgresql/ruoyi-vue-pro.sql new file mode 100644 index 0000000..4cd3cbf --- /dev/null +++ b/sql/postgresql/ruoyi-vue-pro.sql @@ -0,0 +1,8358 @@ +/* + Navicat Premium Data Transfer + + Source Server : 127.0.0.1 PostgreSQL + Source Server Type : PostgreSQL + Source Server Version : 140002 + Source Host : 127.0.0.1:5432 + Source Catalog : ruoyi-vue-pro + Source Schema : public + + Target Server Type : PostgreSQL + Target Server Version : 140002 + File Encoding : 65001 + + Date: 28/07/2022 23:48:10 +*/ + + +-- ---------------------------- +-- Sequence structure for bpm_form_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "bpm_form_seq"; +CREATE SEQUENCE "bpm_form_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for bpm_oa_leave_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "bpm_oa_leave_seq"; +CREATE SEQUENCE "bpm_oa_leave_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for bpm_process_definition_ext_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "bpm_process_definition_ext_seq"; +CREATE SEQUENCE "bpm_process_definition_ext_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for bpm_process_instance_ext_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "bpm_process_instance_ext_seq"; +CREATE SEQUENCE "bpm_process_instance_ext_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for bpm_task_assign_rule_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "bpm_task_assign_rule_seq"; +CREATE SEQUENCE "bpm_task_assign_rule_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for bpm_task_ext_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "bpm_task_ext_seq"; +CREATE SEQUENCE "bpm_task_ext_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for bpm_user_group_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "bpm_user_group_seq"; +CREATE SEQUENCE "bpm_user_group_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for infra_api_access_log_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "infra_api_access_log_seq"; +CREATE SEQUENCE "infra_api_access_log_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for infra_api_error_log_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "infra_api_error_log_seq"; +CREATE SEQUENCE "infra_api_error_log_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for infra_codegen_column_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "infra_codegen_column_seq"; +CREATE SEQUENCE "infra_codegen_column_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for infra_codegen_table_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "infra_codegen_table_seq"; +CREATE SEQUENCE "infra_codegen_table_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for infra_config_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "infra_config_seq"; +CREATE SEQUENCE "infra_config_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for infra_data_source_config_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "infra_data_source_config_seq"; +CREATE SEQUENCE "infra_data_source_config_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for infra_file_config_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "infra_file_config_seq"; +CREATE SEQUENCE "infra_file_config_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for infra_file_content_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "infra_file_content_seq"; +CREATE SEQUENCE "infra_file_content_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for infra_file_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "infra_file_seq"; +CREATE SEQUENCE "infra_file_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for infra_job_log_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "infra_job_log_seq"; +CREATE SEQUENCE "infra_job_log_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for infra_job_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "infra_job_seq"; +CREATE SEQUENCE "infra_job_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for infra_test_demo_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "infra_test_demo_seq"; +CREATE SEQUENCE "infra_test_demo_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for member_user_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "member_user_seq"; +CREATE SEQUENCE "member_user_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for pay_app_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "pay_app_seq"; +CREATE SEQUENCE "pay_app_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for pay_channel_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "pay_channel_seq"; +CREATE SEQUENCE "pay_channel_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for pay_merchant_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "pay_merchant_seq"; +CREATE SEQUENCE "pay_merchant_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for pay_notify_log_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "pay_notify_log_seq"; +CREATE SEQUENCE "pay_notify_log_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for pay_notify_task_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "pay_notify_task_seq"; +CREATE SEQUENCE "pay_notify_task_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for pay_order_extension_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "pay_order_extension_seq"; +CREATE SEQUENCE "pay_order_extension_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for pay_order_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "pay_order_seq"; +CREATE SEQUENCE "pay_order_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for pay_refund_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "pay_refund_seq"; +CREATE SEQUENCE "pay_refund_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for system_dept_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "system_dept_seq"; +CREATE SEQUENCE "system_dept_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for system_dict_data_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "system_dict_data_seq"; +CREATE SEQUENCE "system_dict_data_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for system_dict_type_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "system_dict_type_seq"; +CREATE SEQUENCE "system_dict_type_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for system_error_code_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "system_error_code_seq"; +CREATE SEQUENCE "system_error_code_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for system_login_log_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "system_login_log_seq"; +CREATE SEQUENCE "system_login_log_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for system_menu_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "system_menu_seq"; +CREATE SEQUENCE "system_menu_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for system_notice_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "system_notice_seq"; +CREATE SEQUENCE "system_notice_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for system_oauth2_access_token_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "system_oauth2_access_token_seq"; +CREATE SEQUENCE "system_oauth2_access_token_seq" + INCREMENT 1 +MINVALUE 1 +MAXVALUE 9223372036854775807 +START 1 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for system_oauth2_approve_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "system_oauth2_approve_seq"; +CREATE SEQUENCE "system_oauth2_approve_seq" + INCREMENT 1 +MINVALUE 1 +MAXVALUE 9223372036854775807 +START 1 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for system_oauth2_client_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "system_oauth2_client_seq"; +CREATE SEQUENCE "system_oauth2_client_seq" + INCREMENT 1 +MINVALUE 1 +MAXVALUE 9223372036854775807 +START 1 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for system_oauth2_code_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "system_oauth2_code_seq"; +CREATE SEQUENCE "system_oauth2_code_seq" + INCREMENT 1 +MINVALUE 1 +MAXVALUE 9223372036854775807 +START 1 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for system_oauth2_refresh_token_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "system_oauth2_refresh_token_seq"; +CREATE SEQUENCE "system_oauth2_refresh_token_seq" + INCREMENT 1 +MINVALUE 1 +MAXVALUE 9223372036854775807 +START 1 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for system_operate_log_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "system_operate_log_seq"; +CREATE SEQUENCE "system_operate_log_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for system_post_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "system_post_seq"; +CREATE SEQUENCE "system_post_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for system_role_menu_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "system_role_menu_seq"; +CREATE SEQUENCE "system_role_menu_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for system_role_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "system_role_seq"; +CREATE SEQUENCE "system_role_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for system_sensitive_word_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "system_sensitive_word_seq"; +CREATE SEQUENCE "system_sensitive_word_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for system_sms_channel_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "system_sms_channel_seq"; +CREATE SEQUENCE "system_sms_channel_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for system_sms_code_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "system_sms_code_seq"; +CREATE SEQUENCE "system_sms_code_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for system_sms_log_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "system_sms_log_seq"; +CREATE SEQUENCE "system_sms_log_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for system_sms_template_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "system_sms_template_seq"; +CREATE SEQUENCE "system_sms_template_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for system_social_user_bind_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "system_social_user_bind_seq"; +CREATE SEQUENCE "system_social_user_bind_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for system_social_user_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "system_social_user_seq"; +CREATE SEQUENCE "system_social_user_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for system_tenant_package_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "system_tenant_package_seq"; +CREATE SEQUENCE "system_tenant_package_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for system_tenant_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "system_tenant_seq"; +CREATE SEQUENCE "system_tenant_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for system_user_post_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "system_user_post_seq"; +CREATE SEQUENCE "system_user_post_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for system_user_role_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "system_user_role_seq"; +CREATE SEQUENCE "system_user_role_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for system_user_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "system_user_seq"; +CREATE SEQUENCE "system_user_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for system_mail_account_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "system_mail_account_seq"; +CREATE SEQUENCE "system_mail_account_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for system_mail_log_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "system_mail_log_seq"; +CREATE SEQUENCE "system_mail_log_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for system_mail_template_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "system_mail_template_seq"; +CREATE SEQUENCE "system_mail_template_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for system_notify_message_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "system_notify_message_seq"; +CREATE SEQUENCE "system_notify_message_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for system_notify_template_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "system_notify_template_seq"; +CREATE SEQUENCE "system_notify_template_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Sequence structure for system_user_session_seq +-- ---------------------------- +DROP SEQUENCE IF EXISTS "system_user_session_seq"; +CREATE SEQUENCE "system_user_session_seq" + INCREMENT 1 +MAXVALUE 9223372036854775807 +CACHE 1; + +-- ---------------------------- +-- Table structure for bpm_form +-- ---------------------------- +DROP TABLE IF EXISTS "bpm_form"; +CREATE TABLE "bpm_form" +( + "id" int8 NOT NULL, + "name" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "status" int2 NOT NULL, + "conf" varchar(1000) COLLATE "pg_catalog"."default" NOT NULL, + "fields" varchar(5000) COLLATE "pg_catalog"."default" NOT NULL, + "remark" varchar(255) COLLATE "pg_catalog"."default", + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0, + "tenant_id" int8 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "bpm_form"."id" IS '编号'; +COMMENT +ON COLUMN "bpm_form"."name" IS '表单名'; +COMMENT +ON COLUMN "bpm_form"."status" IS '开启状态'; +COMMENT +ON COLUMN "bpm_form"."conf" IS '表单的配置'; +COMMENT +ON COLUMN "bpm_form"."fields" IS '表单项的数组'; +COMMENT +ON COLUMN "bpm_form"."remark" IS '备注'; +COMMENT +ON COLUMN "bpm_form"."creator" IS '创建者'; +COMMENT +ON COLUMN "bpm_form"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "bpm_form"."updater" IS '更新者'; +COMMENT +ON COLUMN "bpm_form"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "bpm_form"."deleted" IS '是否删除'; +COMMENT +ON COLUMN "bpm_form"."tenant_id" IS '租户编号'; +COMMENT +ON TABLE "bpm_form" IS '工作流的表单定义'; + +-- ---------------------------- +-- Records of bpm_form +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for bpm_oa_leave +-- ---------------------------- +DROP TABLE IF EXISTS "bpm_oa_leave"; +CREATE TABLE "bpm_oa_leave" +( + "id" int8 NOT NULL, + "user_id" int8 NOT NULL, + "type" int2 NOT NULL, + "reason" varchar(200) COLLATE "pg_catalog"."default" NOT NULL, + "start_time" timestamp(6) NOT NULL, + "end_time" timestamp(6) NOT NULL, + "day" int2 NOT NULL, + "result" int2 NOT NULL, + "process_instance_id" varchar(64) COLLATE "pg_catalog"."default", + "creator" varchar(64) COLLATE "pg_catalog"."default" DEFAULT '':: character varying, + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default" DEFAULT '':: character varying, + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0, + "tenant_id" int8 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "bpm_oa_leave"."id" IS '请假表单主键'; +COMMENT +ON COLUMN "bpm_oa_leave"."user_id" IS '申请人的用户编号'; +COMMENT +ON COLUMN "bpm_oa_leave"."type" IS '请假类型'; +COMMENT +ON COLUMN "bpm_oa_leave"."reason" IS '请假原因'; +COMMENT +ON COLUMN "bpm_oa_leave"."start_time" IS '开始时间'; +COMMENT +ON COLUMN "bpm_oa_leave"."end_time" IS '结束时间'; +COMMENT +ON COLUMN "bpm_oa_leave"."day" IS '请假天数'; +COMMENT +ON COLUMN "bpm_oa_leave"."result" IS '请假结果'; +COMMENT +ON COLUMN "bpm_oa_leave"."process_instance_id" IS '流程实例的编号'; +COMMENT +ON COLUMN "bpm_oa_leave"."creator" IS '创建者'; +COMMENT +ON COLUMN "bpm_oa_leave"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "bpm_oa_leave"."updater" IS '更新者'; +COMMENT +ON COLUMN "bpm_oa_leave"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "bpm_oa_leave"."deleted" IS '是否删除'; +COMMENT +ON COLUMN "bpm_oa_leave"."tenant_id" IS '租户编号'; +COMMENT +ON TABLE "bpm_oa_leave" IS 'OA 请假申请表'; + +-- ---------------------------- +-- Records of bpm_oa_leave +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for bpm_process_definition_ext +-- ---------------------------- +DROP TABLE IF EXISTS "bpm_process_definition_ext"; +CREATE TABLE "bpm_process_definition_ext" +( + "id" int8 NOT NULL, + "process_definition_id" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "model_id" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "description" varchar(255) COLLATE "pg_catalog"."default", + "form_type" int2 NOT NULL, + "form_id" int8, + "form_conf" varchar(1000) COLLATE "pg_catalog"."default", + "form_fields" varchar(5000) COLLATE "pg_catalog"."default", + "form_custom_create_path" varchar(255) COLLATE "pg_catalog"."default", + "form_custom_view_path" varchar(255) COLLATE "pg_catalog"."default", + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0, + "tenant_id" int8 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "bpm_process_definition_ext"."id" IS '编号'; +COMMENT +ON COLUMN "bpm_process_definition_ext"."process_definition_id" IS '流程定义的编号'; +COMMENT +ON COLUMN "bpm_process_definition_ext"."model_id" IS '流程模型的编号'; +COMMENT +ON COLUMN "bpm_process_definition_ext"."description" IS '描述'; +COMMENT +ON COLUMN "bpm_process_definition_ext"."form_type" IS '表单类型'; +COMMENT +ON COLUMN "bpm_process_definition_ext"."form_id" IS '表单编号'; +COMMENT +ON COLUMN "bpm_process_definition_ext"."form_conf" IS '表单的配置'; +COMMENT +ON COLUMN "bpm_process_definition_ext"."form_fields" IS '表单项的数组'; +COMMENT +ON COLUMN "bpm_process_definition_ext"."form_custom_create_path" IS '自定义表单的提交路径'; +COMMENT +ON COLUMN "bpm_process_definition_ext"."form_custom_view_path" IS '自定义表单的查看路径'; +COMMENT +ON COLUMN "bpm_process_definition_ext"."creator" IS '创建者'; +COMMENT +ON COLUMN "bpm_process_definition_ext"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "bpm_process_definition_ext"."updater" IS '更新者'; +COMMENT +ON COLUMN "bpm_process_definition_ext"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "bpm_process_definition_ext"."deleted" IS '是否删除'; +COMMENT +ON COLUMN "bpm_process_definition_ext"."tenant_id" IS '租户编号'; +COMMENT +ON TABLE "bpm_process_definition_ext" IS 'Bpm 流程定义的拓展表 +'; + +-- ---------------------------- +-- Records of bpm_process_definition_ext +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for bpm_process_instance_ext +-- ---------------------------- +DROP TABLE IF EXISTS "bpm_process_instance_ext"; +CREATE TABLE "bpm_process_instance_ext" +( + "id" int8 NOT NULL, + "start_user_id" int8 NOT NULL, + "name" varchar(64) COLLATE "pg_catalog"."default", + "process_instance_id" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "process_definition_id" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "category" varchar(64) COLLATE "pg_catalog"."default", + "status" int2 NOT NULL, + "result" int2 NOT NULL, + "end_time" timestamp(6), + "form_variables" varchar(5000) COLLATE "pg_catalog"."default", + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0, + "tenant_id" int8 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "bpm_process_instance_ext"."id" IS '编号'; +COMMENT +ON COLUMN "bpm_process_instance_ext"."start_user_id" IS '发起流程的用户编号'; +COMMENT +ON COLUMN "bpm_process_instance_ext"."name" IS '流程实例的名字'; +COMMENT +ON COLUMN "bpm_process_instance_ext"."process_instance_id" IS '流程实例的编号'; +COMMENT +ON COLUMN "bpm_process_instance_ext"."process_definition_id" IS '流程定义的编号'; +COMMENT +ON COLUMN "bpm_process_instance_ext"."category" IS '流程分类'; +COMMENT +ON COLUMN "bpm_process_instance_ext"."status" IS '流程实例的状态'; +COMMENT +ON COLUMN "bpm_process_instance_ext"."result" IS '流程实例的结果'; +COMMENT +ON COLUMN "bpm_process_instance_ext"."end_time" IS '结束时间'; +COMMENT +ON COLUMN "bpm_process_instance_ext"."form_variables" IS '表单值'; +COMMENT +ON COLUMN "bpm_process_instance_ext"."creator" IS '创建者'; +COMMENT +ON COLUMN "bpm_process_instance_ext"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "bpm_process_instance_ext"."updater" IS '更新者'; +COMMENT +ON COLUMN "bpm_process_instance_ext"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "bpm_process_instance_ext"."deleted" IS '是否删除'; +COMMENT +ON COLUMN "bpm_process_instance_ext"."tenant_id" IS '租户编号'; +COMMENT +ON TABLE "bpm_process_instance_ext" IS '工作流的流程实例的拓展'; + +-- ---------------------------- +-- Records of bpm_process_instance_ext +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for bpm_task_assign_rule +-- ---------------------------- +DROP TABLE IF EXISTS "bpm_task_assign_rule"; +CREATE TABLE "bpm_task_assign_rule" +( + "id" int8 NOT NULL, + "model_id" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "process_definition_id" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "task_definition_key" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "type" int2 NOT NULL, + "options" varchar(1024) COLLATE "pg_catalog"."default" NOT NULL, + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0, + "tenant_id" int8 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "bpm_task_assign_rule"."id" IS '编号'; +COMMENT +ON COLUMN "bpm_task_assign_rule"."model_id" IS '流程模型的编号'; +COMMENT +ON COLUMN "bpm_task_assign_rule"."process_definition_id" IS '流程定义的编号'; +COMMENT +ON COLUMN "bpm_task_assign_rule"."task_definition_key" IS '流程任务定义的 key'; +COMMENT +ON COLUMN "bpm_task_assign_rule"."type" IS '规则类型'; +COMMENT +ON COLUMN "bpm_task_assign_rule"."options" IS '规则值,JSON 数组'; +COMMENT +ON COLUMN "bpm_task_assign_rule"."creator" IS '创建者'; +COMMENT +ON COLUMN "bpm_task_assign_rule"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "bpm_task_assign_rule"."updater" IS '更新者'; +COMMENT +ON COLUMN "bpm_task_assign_rule"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "bpm_task_assign_rule"."deleted" IS '是否删除'; +COMMENT +ON COLUMN "bpm_task_assign_rule"."tenant_id" IS '租户编号'; +COMMENT +ON TABLE "bpm_task_assign_rule" IS 'Bpm 任务规则表'; + +-- ---------------------------- +-- Records of bpm_task_assign_rule +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for bpm_task_ext +-- ---------------------------- +DROP TABLE IF EXISTS "bpm_task_ext"; +CREATE TABLE "bpm_task_ext" +( + "id" int8 NOT NULL, + "assignee_user_id" int8, + "name" varchar(64) COLLATE "pg_catalog"."default", + "task_id" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "result" int2 NOT NULL, + "reason" varchar(255) COLLATE "pg_catalog"."default", + "end_time" timestamp(6), + "process_instance_id" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "process_definition_id" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0, + "tenant_id" int8 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "bpm_task_ext"."id" IS '编号'; +COMMENT +ON COLUMN "bpm_task_ext"."assignee_user_id" IS '任务的审批人'; +COMMENT +ON COLUMN "bpm_task_ext"."name" IS '任务的名字'; +COMMENT +ON COLUMN "bpm_task_ext"."task_id" IS '任务的编号'; +COMMENT +ON COLUMN "bpm_task_ext"."result" IS '任务的结果'; +COMMENT +ON COLUMN "bpm_task_ext"."reason" IS '审批建议'; +COMMENT +ON COLUMN "bpm_task_ext"."end_time" IS '任务的结束时间'; +COMMENT +ON COLUMN "bpm_task_ext"."process_instance_id" IS '流程实例的编号'; +COMMENT +ON COLUMN "bpm_task_ext"."process_definition_id" IS '流程定义的编号'; +COMMENT +ON COLUMN "bpm_task_ext"."creator" IS '创建者'; +COMMENT +ON COLUMN "bpm_task_ext"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "bpm_task_ext"."updater" IS '更新者'; +COMMENT +ON COLUMN "bpm_task_ext"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "bpm_task_ext"."deleted" IS '是否删除'; +COMMENT +ON COLUMN "bpm_task_ext"."tenant_id" IS '租户编号'; +COMMENT +ON TABLE "bpm_task_ext" IS '工作流的流程任务的拓展表'; + +-- ---------------------------- +-- Records of bpm_task_ext +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for bpm_user_group +-- ---------------------------- +DROP TABLE IF EXISTS "bpm_user_group"; +CREATE TABLE "bpm_user_group" +( + "id" int8 NOT NULL, + "name" varchar(30) COLLATE "pg_catalog"."default" NOT NULL, + "description" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, + "member_user_ids" varchar(1024) COLLATE "pg_catalog"."default" NOT NULL, + "status" int2 NOT NULL, + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0, + "tenant_id" int8 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "bpm_user_group"."id" IS '编号'; +COMMENT +ON COLUMN "bpm_user_group"."name" IS '组名'; +COMMENT +ON COLUMN "bpm_user_group"."description" IS '描述'; +COMMENT +ON COLUMN "bpm_user_group"."member_user_ids" IS '成员编号数组'; +COMMENT +ON COLUMN "bpm_user_group"."status" IS '状态(0正常 1停用)'; +COMMENT +ON COLUMN "bpm_user_group"."creator" IS '创建者'; +COMMENT +ON COLUMN "bpm_user_group"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "bpm_user_group"."updater" IS '更新者'; +COMMENT +ON COLUMN "bpm_user_group"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "bpm_user_group"."deleted" IS '是否删除'; +COMMENT +ON COLUMN "bpm_user_group"."tenant_id" IS '租户编号'; +COMMENT +ON TABLE "bpm_user_group" IS '用户组'; + +-- ---------------------------- +-- Records of bpm_user_group +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for dual +-- ---------------------------- +DROP TABLE IF EXISTS "dual"; +CREATE TABLE "dual" +( + +) +; + +-- ---------------------------- +-- Records of dual +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for infra_api_access_log +-- ---------------------------- +DROP TABLE IF EXISTS "infra_api_access_log"; +CREATE TABLE "infra_api_access_log" +( + "id" int8 NOT NULL, + "trace_id" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "user_id" int8 NOT NULL DEFAULT 0, + "user_type" int2 NOT NULL DEFAULT 0, + "application_name" varchar(50) COLLATE "pg_catalog"."default" NOT NULL, + "request_method" varchar(16) COLLATE "pg_catalog"."default" NOT NULL, + "request_url" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, + "request_params" varchar(8000) COLLATE "pg_catalog"."default" NOT NULL, + "user_ip" varchar(50) COLLATE "pg_catalog"."default" NOT NULL, + "user_agent" varchar(512) COLLATE "pg_catalog"."default" NOT NULL, + "begin_time" timestamp(6) NOT NULL, + "end_time" timestamp(6) NOT NULL, + "duration" int4 NOT NULL, + "result_code" int4 NOT NULL, + "result_msg" varchar(512) COLLATE "pg_catalog"."default", + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0, + "tenant_id" int8 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "infra_api_access_log"."id" IS '日志主键'; +COMMENT +ON COLUMN "infra_api_access_log"."trace_id" IS '链路追踪编号'; +COMMENT +ON COLUMN "infra_api_access_log"."user_id" IS '用户编号'; +COMMENT +ON COLUMN "infra_api_access_log"."user_type" IS '用户类型'; +COMMENT +ON COLUMN "infra_api_access_log"."application_name" IS '应用名'; +COMMENT +ON COLUMN "infra_api_access_log"."request_method" IS '请求方法名'; +COMMENT +ON COLUMN "infra_api_access_log"."request_url" IS '请求地址'; +COMMENT +ON COLUMN "infra_api_access_log"."request_params" IS '请求参数'; +COMMENT +ON COLUMN "infra_api_access_log"."user_ip" IS '用户 IP'; +COMMENT +ON COLUMN "infra_api_access_log"."user_agent" IS '浏览器 UA'; +COMMENT +ON COLUMN "infra_api_access_log"."begin_time" IS '开始请求时间'; +COMMENT +ON COLUMN "infra_api_access_log"."end_time" IS '结束请求时间'; +COMMENT +ON COLUMN "infra_api_access_log"."duration" IS '执行时长'; +COMMENT +ON COLUMN "infra_api_access_log"."result_code" IS '结果码'; +COMMENT +ON COLUMN "infra_api_access_log"."result_msg" IS '结果提示'; +COMMENT +ON COLUMN "infra_api_access_log"."creator" IS '创建者'; +COMMENT +ON COLUMN "infra_api_access_log"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "infra_api_access_log"."updater" IS '更新者'; +COMMENT +ON COLUMN "infra_api_access_log"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "infra_api_access_log"."deleted" IS '是否删除'; +COMMENT +ON COLUMN "infra_api_access_log"."tenant_id" IS '租户编号'; +COMMENT +ON TABLE "infra_api_access_log" IS 'API 访问日志表'; + +-- ---------------------------- +-- Records of infra_api_access_log +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for infra_api_error_log +-- ---------------------------- +DROP TABLE IF EXISTS "infra_api_error_log"; +CREATE TABLE "infra_api_error_log" +( + "id" int4 NOT NULL, + "trace_id" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "user_id" int4 NOT NULL DEFAULT 0, + "user_type" int2 NOT NULL DEFAULT 0, + "application_name" varchar(50) COLLATE "pg_catalog"."default" NOT NULL, + "request_method" varchar(16) COLLATE "pg_catalog"."default" NOT NULL, + "request_url" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, + "request_params" varchar(8000) COLLATE "pg_catalog"."default" NOT NULL, + "user_ip" varchar(50) COLLATE "pg_catalog"."default" NOT NULL, + "user_agent" varchar(512) COLLATE "pg_catalog"."default" NOT NULL, + "exception_time" timestamp(6) NOT NULL, + "exception_name" varchar(128) COLLATE "pg_catalog"."default" NOT NULL, + "exception_message" text COLLATE "pg_catalog"."default" NOT NULL, + "exception_root_cause_message" text COLLATE "pg_catalog"."default" NOT NULL, + "exception_stack_trace" text COLLATE "pg_catalog"."default" NOT NULL, + "exception_class_name" varchar(512) COLLATE "pg_catalog"."default" NOT NULL, + "exception_file_name" varchar(512) COLLATE "pg_catalog"."default" NOT NULL, + "exception_method_name" varchar(512) COLLATE "pg_catalog"."default" NOT NULL, + "exception_line_number" int4 NOT NULL, + "process_status" int2 NOT NULL, + "process_time" timestamp(6), + "process_user_id" int4, + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0, + "tenant_id" int8 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "infra_api_error_log"."id" IS '编号'; +COMMENT +ON COLUMN "infra_api_error_log"."trace_id" IS '链路追踪编号 + * + * 一般来说,通过链路追踪编号,可以将访问日志,错误日志,链路追踪日志,logger 打印日志等,结合在一起,从而进行排错。'; +COMMENT +ON COLUMN "infra_api_error_log"."user_id" IS '用户编号'; +COMMENT +ON COLUMN "infra_api_error_log"."user_type" IS '用户类型'; +COMMENT +ON COLUMN "infra_api_error_log"."application_name" IS '应用名 + * + * 目前读取 spring.application.name'; +COMMENT +ON COLUMN "infra_api_error_log"."request_method" IS '请求方法名'; +COMMENT +ON COLUMN "infra_api_error_log"."request_url" IS '请求地址'; +COMMENT +ON COLUMN "infra_api_error_log"."request_params" IS '请求参数'; +COMMENT +ON COLUMN "infra_api_error_log"."user_ip" IS '用户 IP'; +COMMENT +ON COLUMN "infra_api_error_log"."user_agent" IS '浏览器 UA'; +COMMENT +ON COLUMN "infra_api_error_log"."exception_time" IS '异常发生时间'; +COMMENT +ON COLUMN "infra_api_error_log"."exception_name" IS '异常名 + * + * {@link Throwable#getClass()} 的类全名'; +COMMENT +ON COLUMN "infra_api_error_log"."exception_message" IS '异常导致的消息 + * + * {@link cn.iocoder.common.framework.util.ExceptionUtil#getMessage(Throwable)}'; +COMMENT +ON COLUMN "infra_api_error_log"."exception_root_cause_message" IS '异常导致的根消息 + * + * {@link cn.iocoder.common.framework.util.ExceptionUtil#getRootCauseMessage(Throwable)}'; +COMMENT +ON COLUMN "infra_api_error_log"."exception_stack_trace" IS '异常的栈轨迹 + * + * {@link cn.iocoder.common.framework.util.ExceptionUtil#getServiceException(Exception)}'; +COMMENT +ON COLUMN "infra_api_error_log"."exception_class_name" IS '异常发生的类全名 + * + * {@link StackTraceElement#getClassName()}'; +COMMENT +ON COLUMN "infra_api_error_log"."exception_file_name" IS '异常发生的类文件 + * + * {@link StackTraceElement#getFileName()}'; +COMMENT +ON COLUMN "infra_api_error_log"."exception_method_name" IS '异常发生的方法名 + * + * {@link StackTraceElement#getMethodName()}'; +COMMENT +ON COLUMN "infra_api_error_log"."exception_line_number" IS '异常发生的方法所在行 + * + * {@link StackTraceElement#getLineNumber()}'; +COMMENT +ON COLUMN "infra_api_error_log"."process_status" IS '处理状态'; +COMMENT +ON COLUMN "infra_api_error_log"."process_time" IS '处理时间'; +COMMENT +ON COLUMN "infra_api_error_log"."process_user_id" IS '处理用户编号'; +COMMENT +ON COLUMN "infra_api_error_log"."creator" IS '创建者'; +COMMENT +ON COLUMN "infra_api_error_log"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "infra_api_error_log"."updater" IS '更新者'; +COMMENT +ON COLUMN "infra_api_error_log"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "infra_api_error_log"."deleted" IS '是否删除'; +COMMENT +ON COLUMN "infra_api_error_log"."tenant_id" IS '租户编号'; +COMMENT +ON TABLE "infra_api_error_log" IS '系统异常日志'; + +-- ---------------------------- +-- Records of infra_api_error_log +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for infra_codegen_column +-- ---------------------------- +DROP TABLE IF EXISTS "infra_codegen_column"; +CREATE TABLE "infra_codegen_column" +( + "id" int8 NOT NULL, + "table_id" int8 NOT NULL, + "column_name" varchar(200) COLLATE "pg_catalog"."default" NOT NULL, + "data_type" varchar(100) COLLATE "pg_catalog"."default" NOT NULL, + "column_comment" varchar(500) COLLATE "pg_catalog"."default" NOT NULL, + "nullable" bool NOT NULL, + "primary_key" bool NOT NULL, + "auto_increment" bool NOT NULL, + "ordinal_position" int4 NOT NULL, + "java_type" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, + "java_field" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "dict_type" varchar(200) COLLATE "pg_catalog"."default", + "example" varchar(255) COLLATE "pg_catalog"."default", + "create_operation" bool NOT NULL, + "update_operation" bool NOT NULL, + "list_operation" bool NOT NULL, + "list_operation_condition" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, + "list_operation_result" bool NOT NULL, + "html_type" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "infra_codegen_column"."id" IS '编号'; +COMMENT +ON COLUMN "infra_codegen_column"."table_id" IS '表编号'; +COMMENT +ON COLUMN "infra_codegen_column"."column_name" IS '字段名'; +COMMENT +ON COLUMN "infra_codegen_column"."data_type" IS '字段类型'; +COMMENT +ON COLUMN "infra_codegen_column"."column_comment" IS '字段描述'; +COMMENT +ON COLUMN "infra_codegen_column"."nullable" IS '是否允许为空'; +COMMENT +ON COLUMN "infra_codegen_column"."primary_key" IS '是否主键'; +COMMENT +ON COLUMN "infra_codegen_column"."auto_increment" IS '是否自增'; +COMMENT +ON COLUMN "infra_codegen_column"."ordinal_position" IS '排序'; +COMMENT +ON COLUMN "infra_codegen_column"."java_type" IS 'Java 属性类型'; +COMMENT +ON COLUMN "infra_codegen_column"."java_field" IS 'Java 属性名'; +COMMENT +ON COLUMN "infra_codegen_column"."dict_type" IS '字典类型'; +COMMENT +ON COLUMN "infra_codegen_column"."example" IS '数据示例'; +COMMENT +ON COLUMN "infra_codegen_column"."create_operation" IS '是否为 Create 创建操作的字段'; +COMMENT +ON COLUMN "infra_codegen_column"."update_operation" IS '是否为 Update 更新操作的字段'; +COMMENT +ON COLUMN "infra_codegen_column"."list_operation" IS '是否为 List 查询操作的字段'; +COMMENT +ON COLUMN "infra_codegen_column"."list_operation_condition" IS 'List 查询操作的条件类型'; +COMMENT +ON COLUMN "infra_codegen_column"."list_operation_result" IS '是否为 List 查询操作的返回字段'; +COMMENT +ON COLUMN "infra_codegen_column"."html_type" IS '显示类型'; +COMMENT +ON COLUMN "infra_codegen_column"."creator" IS '创建者'; +COMMENT +ON COLUMN "infra_codegen_column"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "infra_codegen_column"."updater" IS '更新者'; +COMMENT +ON COLUMN "infra_codegen_column"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "infra_codegen_column"."deleted" IS '是否删除'; +COMMENT +ON TABLE "infra_codegen_column" IS '代码生成表字段定义'; + +-- ---------------------------- +-- Records of infra_codegen_column +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for infra_codegen_table +-- ---------------------------- +DROP TABLE IF EXISTS "infra_codegen_table"; +CREATE TABLE "infra_codegen_table" +( + "id" int8 NOT NULL, + "data_source_config_id" int8 NOT NULL, + "scene" int2 NOT NULL, + "table_name" varchar(200) COLLATE "pg_catalog"."default" NOT NULL, + "table_comment" varchar(500) COLLATE "pg_catalog"."default" NOT NULL, + "remark" varchar(500) COLLATE "pg_catalog"."default", + "module_name" varchar(30) COLLATE "pg_catalog"."default" NOT NULL, + "business_name" varchar(30) COLLATE "pg_catalog"."default" NOT NULL, + "class_name" varchar(100) COLLATE "pg_catalog"."default" NOT NULL, + "class_comment" varchar(50) COLLATE "pg_catalog"."default" NOT NULL, + "author" varchar(50) COLLATE "pg_catalog"."default" NOT NULL, + "template_type" int2 NOT NULL, + "parent_menu_id" int8, + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "infra_codegen_table"."id" IS '编号'; +COMMENT +ON COLUMN "infra_codegen_table"."data_source_config_id" IS '数据源配置的编号'; +COMMENT +ON COLUMN "infra_codegen_table"."scene" IS '生成场景'; +COMMENT +ON COLUMN "infra_codegen_table"."table_name" IS '表名称'; +COMMENT +ON COLUMN "infra_codegen_table"."table_comment" IS '表描述'; +COMMENT +ON COLUMN "infra_codegen_table"."remark" IS '备注'; +COMMENT +ON COLUMN "infra_codegen_table"."module_name" IS '模块名'; +COMMENT +ON COLUMN "infra_codegen_table"."business_name" IS '业务名'; +COMMENT +ON COLUMN "infra_codegen_table"."class_name" IS '类名称'; +COMMENT +ON COLUMN "infra_codegen_table"."class_comment" IS '类描述'; +COMMENT +ON COLUMN "infra_codegen_table"."author" IS '作者'; +COMMENT +ON COLUMN "infra_codegen_table"."template_type" IS '模板类型'; +COMMENT +ON COLUMN "infra_codegen_table"."parent_menu_id" IS '父菜单编号'; +COMMENT +ON COLUMN "infra_codegen_table"."creator" IS '创建者'; +COMMENT +ON COLUMN "infra_codegen_table"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "infra_codegen_table"."updater" IS '更新者'; +COMMENT +ON COLUMN "infra_codegen_table"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "infra_codegen_table"."deleted" IS '是否删除'; +COMMENT +ON TABLE "infra_codegen_table" IS '代码生成表定义'; + +ALTER TABLE infra_codegen_table + ADD front_type int4 NOT NULL; +COMMENT +ON COLUMN infra_codegen_table.front_type IS '前端类型'; + +-- ---------------------------- +-- Records of infra_codegen_table +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for infra_config +-- ---------------------------- +DROP TABLE IF EXISTS "infra_config"; +CREATE TABLE "infra_config" +( + "id" int4 NOT NULL, + "category" varchar(50) COLLATE "pg_catalog"."default" NOT NULL, + "type" int2 NOT NULL, + "name" varchar(100) COLLATE "pg_catalog"."default" NOT NULL, + "config_key" varchar(100) COLLATE "pg_catalog"."default" NOT NULL, + "value" varchar(500) COLLATE "pg_catalog"."default" NOT NULL, + "visible" varchar(5) COLLATE "pg_catalog"."default" NOT NULL, + "remark" varchar(500) COLLATE "pg_catalog"."default", + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "infra_config"."id" IS '参数主键'; +COMMENT +ON COLUMN "infra_config"."category" IS '参数分组'; +COMMENT +ON COLUMN "infra_config"."type" IS '参数类型'; +COMMENT +ON COLUMN "infra_config"."name" IS '参数名称'; +COMMENT +ON COLUMN "infra_config"."config_key" IS '参数键名'; +COMMENT +ON COLUMN "infra_config"."value" IS '参数键值'; +COMMENT +ON COLUMN "infra_config"."visible" IS '是否可见'; +COMMENT +ON COLUMN "infra_config"."remark" IS '备注'; +COMMENT +ON COLUMN "infra_config"."creator" IS '创建者'; +COMMENT +ON COLUMN "infra_config"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "infra_config"."updater" IS '更新者'; +COMMENT +ON COLUMN "infra_config"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "infra_config"."deleted" IS '是否删除'; +COMMENT +ON TABLE "infra_config" IS '参数配置表'; + +-- ---------------------------- +-- Records of infra_config +-- ---------------------------- +BEGIN; +INSERT INTO "infra_config" ("id", "category", "type", "name", "config_key", "value", "visible", "remark", "creator", + "create_time", "updater", "update_time", "deleted") +VALUES (1, 'ui', 1, '主框架页-默认皮肤样式名称', 'sys.index.skinName', 'skin-blue', '0', + '蓝色 skin-blue、绿色 skin-green、紫色 skin-purple、红色 skin-red、黄色 skin-yellow', 'admin', + '2021-01-05 17:03:48', '1', '2022-03-26 23:10:31', 0); +INSERT INTO "infra_config" ("id", "category", "type", "name", "config_key", "value", "visible", "remark", "creator", + "create_time", "updater", "update_time", "deleted") +VALUES (2, 'biz', 1, '用户管理-账号初始密码', 'sys.user.init-password', '123456', '0', '初始化密码 123456', 'admin', + '2021-01-05 17:03:48', '1', '2022-03-20 02:25:51', 0); +INSERT INTO "infra_config" ("id", "category", "type", "name", "config_key", "value", "visible", "remark", "creator", + "create_time", "updater", "update_time", "deleted") +VALUES (3, 'ui', 1, '主框架页-侧边栏主题', 'sys.index.sideTheme', 'theme-dark', '0', + '深色主题theme-dark,浅色主题theme-light', 'admin', '2021-01-05 17:03:48', '', '2021-01-19 03:05:21', 0); +INSERT INTO "infra_config" ("id", "category", "type", "name", "config_key", "value", "visible", "remark", "creator", + "create_time", "updater", "update_time", "deleted") +VALUES (4, '1', 2, 'xxx', 'demo.test', '10', '0', '5', '', '2021-01-19 03:10:26', '', '2021-01-20 09:25:55', 0); +INSERT INTO "infra_config" ("id", "category", "type", "name", "config_key", "value", "visible", "remark", "creator", + "create_time", "updater", "update_time", "deleted") +VALUES (5, 'xxx', 2, 'xxx', 'xxx', 'xxx', '1', 'xxx', '', '2021-02-09 20:06:47', '', '2021-02-09 20:06:47', 0); +INSERT INTO "infra_config" ("id", "category", "type", "name", "config_key", "value", "visible", "remark", "creator", + "create_time", "updater", "update_time", "deleted") +VALUES (6, 'biz', 2, '登陆验证码的开关', 'win.captcha.enable', 'true', '1', NULL, '1', '2022-02-17 00:03:11', '1', + '2022-04-04 12:51:40', 0); +COMMIT; + +-- ---------------------------- +-- Table structure for infra_data_source_config +-- ---------------------------- +DROP TABLE IF EXISTS "infra_data_source_config"; +CREATE TABLE "infra_data_source_config" +( + "id" int8 NOT NULL, + "name" varchar(100) COLLATE "pg_catalog"."default" NOT NULL, + "url" varchar(1024) COLLATE "pg_catalog"."default" NOT NULL, + "username" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, + "password" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "infra_data_source_config"."id" IS '主键编号'; +COMMENT +ON COLUMN "infra_data_source_config"."name" IS '参数名称'; +COMMENT +ON COLUMN "infra_data_source_config"."url" IS '数据源连接'; +COMMENT +ON COLUMN "infra_data_source_config"."username" IS '用户名'; +COMMENT +ON COLUMN "infra_data_source_config"."password" IS '密码'; +COMMENT +ON COLUMN "infra_data_source_config"."creator" IS '创建者'; +COMMENT +ON COLUMN "infra_data_source_config"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "infra_data_source_config"."updater" IS '更新者'; +COMMENT +ON COLUMN "infra_data_source_config"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "infra_data_source_config"."deleted" IS '是否删除'; +COMMENT +ON TABLE "infra_data_source_config" IS '数据源配置表'; + +-- ---------------------------- +-- Records of infra_data_source_config +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for infra_file +-- ---------------------------- +DROP TABLE IF EXISTS "infra_file"; +CREATE TABLE "infra_file" +( + "id" int8 NOT NULL DEFAULT 0, + "config_id" int8, + "path" varchar(512) COLLATE "pg_catalog"."default" NOT NULL, + "url" varchar(1024) COLLATE "pg_catalog"."default" NOT NULL, + "type" varchar(127) COLLATE "pg_catalog"."default", + "size" int4 NOT NULL, + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0, + "name" varchar(255) COLLATE "pg_catalog"."default" +) +; +COMMENT +ON COLUMN "infra_file"."id" IS '文件编号'; +COMMENT +ON COLUMN "infra_file"."config_id" IS '配置编号'; +COMMENT +ON COLUMN "infra_file"."path" IS '文件路径'; +COMMENT +ON COLUMN "infra_file"."url" IS '文件 URL'; +COMMENT +ON COLUMN "infra_file"."type" IS '文件类型'; +COMMENT +ON COLUMN "infra_file"."size" IS '文件大小'; +COMMENT +ON COLUMN "infra_file"."creator" IS '创建者'; +COMMENT +ON COLUMN "infra_file"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "infra_file"."updater" IS '更新者'; +COMMENT +ON COLUMN "infra_file"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "infra_file"."deleted" IS '是否删除'; +COMMENT +ON COLUMN "infra_file"."name" IS '文件名'; +COMMENT +ON TABLE "infra_file" IS '文件表'; + +-- ---------------------------- +-- Records of infra_file +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for infra_file_config +-- ---------------------------- +DROP TABLE IF EXISTS "infra_file_config"; +CREATE TABLE "infra_file_config" +( + "id" int8 NOT NULL, + "name" varchar(63) COLLATE "pg_catalog"."default" NOT NULL, + "storage" int2 NOT NULL, + "remark" varchar(255) COLLATE "pg_catalog"."default", + "master" bool NOT NULL, + "config" varchar(4096) COLLATE "pg_catalog"."default" NOT NULL, + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "infra_file_config"."id" IS '编号'; +COMMENT +ON COLUMN "infra_file_config"."name" IS '配置名'; +COMMENT +ON COLUMN "infra_file_config"."storage" IS '存储器'; +COMMENT +ON COLUMN "infra_file_config"."remark" IS '备注'; +COMMENT +ON COLUMN "infra_file_config"."master" IS '是否为主配置'; +COMMENT +ON COLUMN "infra_file_config"."config" IS '存储配置'; +COMMENT +ON COLUMN "infra_file_config"."creator" IS '创建者'; +COMMENT +ON COLUMN "infra_file_config"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "infra_file_config"."updater" IS '更新者'; +COMMENT +ON COLUMN "infra_file_config"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "infra_file_config"."deleted" IS '是否删除'; +COMMENT +ON TABLE "infra_file_config" IS '文件配置表'; + +-- ---------------------------- +-- Records of infra_file_config +-- ---------------------------- +BEGIN; +INSERT INTO "infra_file_config" ("id", "name", "storage", "remark", "master", "config", "creator", "create_time", + "updater", "update_time", "deleted") +VALUES (4, '数据库', 1, '我是数据库', 'f', + '{"@class":"com.win.framework.file.core.client.db.DBFileClientConfig","domain":"http://127.0.0.1:48080"}', + '1', '2022-03-15 23:56:24', '1', '2022-03-26 21:39:26', 0); +INSERT INTO "infra_file_config" ("id", "name", "storage", "remark", "master", "config", "creator", "create_time", + "updater", "update_time", "deleted") +VALUES (5, '本地磁盘', 10, '测试下本地存储', 'f', + '{"@class":"com.win.framework.file.core.client.local.LocalFileClientConfig","basePath":"/Users/yunai/file_test","domain":"http://127.0.0.1:48080"}', + '1', '2022-03-15 23:57:00', '1', '2022-03-26 21:39:26', 0); +INSERT INTO "infra_file_config" ("id", "name", "storage", "remark", "master", "config", "creator", "create_time", + "updater", "update_time", "deleted") +VALUES (11, 'S3 - 七牛云', 20, NULL, 't', + '{"@class":"com.win.framework.file.core.client.s3.S3FileClientConfig","endpoint":"s3-cn-south-1.qiniucs.com","domain":"http://test.win.iocoder.cn","bucket":"ruoyi-vue-pro","accessKey":"b7yvuhBSAGjmtPhMFcn9iMOxUOY_I06cA_p0ZUx8","accessSecret":"kXM1l5ia1RvSX3QaOEcwI3RLz3Y2rmNszWonKZtP"}', + '1', '2022-03-19 18:00:03', '1', '2022-05-26 00:03:47.17', 0); +COMMIT; + +-- ---------------------------- +-- Table structure for infra_file_content +-- ---------------------------- +DROP TABLE IF EXISTS "infra_file_content"; +CREATE TABLE "infra_file_content" +( + "id" int8 NOT NULL, + "config_id" int8 NOT NULL, + "path" varchar(512) COLLATE "pg_catalog"."default" NOT NULL, + "content" bytea NOT NULL, + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "infra_file_content"."id" IS '编号'; +COMMENT +ON COLUMN "infra_file_content"."config_id" IS '配置编号'; +COMMENT +ON COLUMN "infra_file_content"."path" IS '文件路径'; +COMMENT +ON COLUMN "infra_file_content"."content" IS '文件内容'; +COMMENT +ON COLUMN "infra_file_content"."creator" IS '创建者'; +COMMENT +ON COLUMN "infra_file_content"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "infra_file_content"."updater" IS '更新者'; +COMMENT +ON COLUMN "infra_file_content"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "infra_file_content"."deleted" IS '是否删除'; +COMMENT +ON TABLE "infra_file_content" IS '文件表'; + +-- ---------------------------- +-- Records of infra_file_content +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for infra_job +-- ---------------------------- +DROP TABLE IF EXISTS "infra_job"; +CREATE TABLE "infra_job" +( + "id" int8 NOT NULL, + "name" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, + "status" int2 NOT NULL, + "handler_name" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "handler_param" varchar(255) COLLATE "pg_catalog"."default", + "cron_expression" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, + "retry_count" int4 NOT NULL, + "retry_interval" int4 NOT NULL, + "monitor_timeout" int4 NOT NULL, + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "infra_job"."id" IS '任务编号'; +COMMENT +ON COLUMN "infra_job"."name" IS '任务名称'; +COMMENT +ON COLUMN "infra_job"."status" IS '任务状态'; +COMMENT +ON COLUMN "infra_job"."handler_name" IS '处理器的名字'; +COMMENT +ON COLUMN "infra_job"."handler_param" IS '处理器的参数'; +COMMENT +ON COLUMN "infra_job"."cron_expression" IS 'CRON 表达式'; +COMMENT +ON COLUMN "infra_job"."retry_count" IS '重试次数'; +COMMENT +ON COLUMN "infra_job"."retry_interval" IS '重试间隔'; +COMMENT +ON COLUMN "infra_job"."monitor_timeout" IS '监控超时时间'; +COMMENT +ON COLUMN "infra_job"."creator" IS '创建者'; +COMMENT +ON COLUMN "infra_job"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "infra_job"."updater" IS '更新者'; +COMMENT +ON COLUMN "infra_job"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "infra_job"."deleted" IS '是否删除'; +COMMENT +ON TABLE "infra_job" IS '定时任务表'; + +-- ---------------------------- +-- Records of infra_job +-- ---------------------------- +BEGIN; +INSERT INTO "infra_job" ("id", "name", "status", "handler_name", "handler_param", "cron_expression", "retry_count", + "retry_interval", "monitor_timeout", "creator", "create_time", "updater", "update_time", + "deleted") +VALUES (5, '支付通知 Job', 2, 'payNotifyJob', NULL, '* * * * * ?', 0, 0, 0, '1', '2021-10-27 08:34:42', '1', + '2022-04-03 20:35:25', 0); +COMMIT; + +-- ---------------------------- +-- Table structure for infra_job_log +-- ---------------------------- +DROP TABLE IF EXISTS "infra_job_log"; +CREATE TABLE "infra_job_log" +( + "id" int8 NOT NULL, + "job_id" int8 NOT NULL, + "handler_name" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "handler_param" varchar(255) COLLATE "pg_catalog"."default", + "execute_index" int2 NOT NULL, + "begin_time" timestamp(6) NOT NULL, + "end_time" timestamp(6), + "duration" int4, + "status" int2 NOT NULL, + "result" varchar(4000) COLLATE "pg_catalog"."default", + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "infra_job_log"."id" IS '日志编号'; +COMMENT +ON COLUMN "infra_job_log"."job_id" IS '任务编号'; +COMMENT +ON COLUMN "infra_job_log"."handler_name" IS '处理器的名字'; +COMMENT +ON COLUMN "infra_job_log"."handler_param" IS '处理器的参数'; +COMMENT +ON COLUMN "infra_job_log"."execute_index" IS '第几次执行'; +COMMENT +ON COLUMN "infra_job_log"."begin_time" IS '开始执行时间'; +COMMENT +ON COLUMN "infra_job_log"."end_time" IS '结束执行时间'; +COMMENT +ON COLUMN "infra_job_log"."duration" IS '执行时长'; +COMMENT +ON COLUMN "infra_job_log"."status" IS '任务状态'; +COMMENT +ON COLUMN "infra_job_log"."result" IS '结果数据'; +COMMENT +ON COLUMN "infra_job_log"."creator" IS '创建者'; +COMMENT +ON COLUMN "infra_job_log"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "infra_job_log"."updater" IS '更新者'; +COMMENT +ON COLUMN "infra_job_log"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "infra_job_log"."deleted" IS '是否删除'; +COMMENT +ON TABLE "infra_job_log" IS '定时任务日志表'; + +-- ---------------------------- +-- Records of infra_job_log +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for infra_test_demo +-- ---------------------------- +DROP TABLE IF EXISTS "infra_test_demo"; +CREATE TABLE "infra_test_demo" +( + "id" int8 NOT NULL, + "name" varchar(100) COLLATE "pg_catalog"."default" NOT NULL, + "status" int2 NOT NULL, + "type" int2 NOT NULL, + "category" int2 NOT NULL, + "remark" varchar(500) COLLATE "pg_catalog"."default", + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "infra_test_demo"."id" IS '编号'; +COMMENT +ON COLUMN "infra_test_demo"."name" IS '名字'; +COMMENT +ON COLUMN "infra_test_demo"."status" IS '状态'; +COMMENT +ON COLUMN "infra_test_demo"."type" IS '类型'; +COMMENT +ON COLUMN "infra_test_demo"."category" IS '分类'; +COMMENT +ON COLUMN "infra_test_demo"."remark" IS '备注'; +COMMENT +ON COLUMN "infra_test_demo"."creator" IS '创建者'; +COMMENT +ON COLUMN "infra_test_demo"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "infra_test_demo"."updater" IS '更新者'; +COMMENT +ON COLUMN "infra_test_demo"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "infra_test_demo"."deleted" IS '是否删除'; +COMMENT +ON TABLE "infra_test_demo" IS '字典类型表'; + +-- ---------------------------- +-- Records of infra_test_demo +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for member_user +-- ---------------------------- +DROP TABLE IF EXISTS "member_user"; +CREATE TABLE "member_user" +( + "id" int8 NOT NULL, + "nickname" varchar(30) COLLATE "pg_catalog"."default" NOT NULL DEFAULT '', + "avatar" varchar(255) COLLATE "pg_catalog"."default" NOT NULL DEFAULT '', + "status" int2 NOT NULL, + "mobile" varchar(11) COLLATE "pg_catalog"."default" NOT NULL, + "password" varchar(100) COLLATE "pg_catalog"."default" NOT NULL DEFAULT '', + "register_ip" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, + "login_ip" varchar(50) COLLATE "pg_catalog"."default" DEFAULT '', + "login_date" timestamp(6), + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0, + "tenant_id" int8 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "member_user"."id" IS '编号'; +COMMENT +ON COLUMN "member_user"."nickname" IS '用户昵称'; +COMMENT +ON COLUMN "member_user"."avatar" IS '头像'; +COMMENT +ON COLUMN "member_user"."status" IS '状态'; +COMMENT +ON COLUMN "member_user"."mobile" IS '手机号'; +COMMENT +ON COLUMN "member_user"."password" IS '密码'; +COMMENT +ON COLUMN "member_user"."register_ip" IS '注册 IP'; +COMMENT +ON COLUMN "member_user"."login_ip" IS '最后登录IP'; +COMMENT +ON COLUMN "member_user"."login_date" IS '最后登录时间'; +COMMENT +ON COLUMN "member_user"."creator" IS '创建者'; +COMMENT +ON COLUMN "member_user"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "member_user"."updater" IS '更新者'; +COMMENT +ON COLUMN "member_user"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "member_user"."deleted" IS '是否删除'; +COMMENT +ON COLUMN "member_user"."tenant_id" IS '租户编号'; +COMMENT +ON TABLE "member_user" IS '用户'; + +-- ---------------------------- +-- Records of member_user +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for pay_app +-- ---------------------------- +DROP TABLE IF EXISTS "pay_app"; +CREATE TABLE "pay_app" +( + "id" int8 NOT NULL, + "name" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "status" int2 NOT NULL, + "remark" varchar(255) COLLATE "pg_catalog"."default", + "pay_notify_url" varchar(1024) COLLATE "pg_catalog"."default" NOT NULL, + "refund_notify_url" varchar(1024) COLLATE "pg_catalog"."default" NOT NULL, + "merchant_id" int8 NOT NULL, + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0, + "tenant_id" int8 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "pay_app"."id" IS '应用编号'; +COMMENT +ON COLUMN "pay_app"."name" IS '应用名'; +COMMENT +ON COLUMN "pay_app"."status" IS '开启状态'; +COMMENT +ON COLUMN "pay_app"."remark" IS '备注'; +COMMENT +ON COLUMN "pay_app"."pay_notify_url" IS '支付结果的回调地址'; +COMMENT +ON COLUMN "pay_app"."refund_notify_url" IS '退款结果的回调地址'; +COMMENT +ON COLUMN "pay_app"."merchant_id" IS '商户编号'; +COMMENT +ON COLUMN "pay_app"."creator" IS '创建者'; +COMMENT +ON COLUMN "pay_app"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "pay_app"."updater" IS '更新者'; +COMMENT +ON COLUMN "pay_app"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "pay_app"."deleted" IS '是否删除'; +COMMENT +ON COLUMN "pay_app"."tenant_id" IS '租户编号'; +COMMENT +ON TABLE "pay_app" IS '支付应用信息'; + +-- ---------------------------- +-- Records of pay_app +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for pay_channel +-- ---------------------------- +DROP TABLE IF EXISTS "pay_channel"; +CREATE TABLE "pay_channel" +( + "id" int8 NOT NULL, + "code" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, + "status" int2 NOT NULL, + "remark" varchar(255) COLLATE "pg_catalog"."default", + "fee_rate" float8 NOT NULL, + "merchant_id" int8 NOT NULL, + "app_id" int8 NOT NULL, + "config" varchar(4096) COLLATE "pg_catalog"."default" NOT NULL, + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0, + "tenant_id" int8 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "pay_channel"."id" IS '商户编号'; +COMMENT +ON COLUMN "pay_channel"."code" IS '渠道编码'; +COMMENT +ON COLUMN "pay_channel"."status" IS '开启状态'; +COMMENT +ON COLUMN "pay_channel"."remark" IS '备注'; +COMMENT +ON COLUMN "pay_channel"."fee_rate" IS '渠道费率,单位:百分比'; +COMMENT +ON COLUMN "pay_channel"."merchant_id" IS '商户编号'; +COMMENT +ON COLUMN "pay_channel"."app_id" IS '应用编号'; +COMMENT +ON COLUMN "pay_channel"."config" IS '支付渠道配置'; +COMMENT +ON COLUMN "pay_channel"."creator" IS '创建者'; +COMMENT +ON COLUMN "pay_channel"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "pay_channel"."updater" IS '更新者'; +COMMENT +ON COLUMN "pay_channel"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "pay_channel"."deleted" IS '是否删除'; +COMMENT +ON COLUMN "pay_channel"."tenant_id" IS '租户编号'; +COMMENT +ON TABLE "pay_channel" IS '支付渠道 +'; + +-- ---------------------------- +-- Records of pay_channel +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for pay_merchant +-- ---------------------------- +DROP TABLE IF EXISTS "pay_merchant"; +CREATE TABLE "pay_merchant" +( + "id" int8 NOT NULL, + "no" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, + "name" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "short_name" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "status" int2 NOT NULL, + "remark" varchar(255) COLLATE "pg_catalog"."default", + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0, + "tenant_id" int8 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "pay_merchant"."id" IS '商户编号'; +COMMENT +ON COLUMN "pay_merchant"."no" IS '商户号'; +COMMENT +ON COLUMN "pay_merchant"."name" IS '商户全称'; +COMMENT +ON COLUMN "pay_merchant"."short_name" IS '商户简称'; +COMMENT +ON COLUMN "pay_merchant"."status" IS '开启状态'; +COMMENT +ON COLUMN "pay_merchant"."remark" IS '备注'; +COMMENT +ON COLUMN "pay_merchant"."creator" IS '创建者'; +COMMENT +ON COLUMN "pay_merchant"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "pay_merchant"."updater" IS '更新者'; +COMMENT +ON COLUMN "pay_merchant"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "pay_merchant"."deleted" IS '是否删除'; +COMMENT +ON COLUMN "pay_merchant"."tenant_id" IS '租户编号'; +COMMENT +ON TABLE "pay_merchant" IS '支付商户信息'; + +-- ---------------------------- +-- Records of pay_merchant +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for pay_notify_log +-- ---------------------------- +DROP TABLE IF EXISTS "pay_notify_log"; +CREATE TABLE "pay_notify_log" +( + "id" int8 NOT NULL, + "task_id" int8 NOT NULL, + "notify_times" int2 NOT NULL, + "response" varchar(2048) COLLATE "pg_catalog"."default" NOT NULL, + "status" int2 NOT NULL, + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0, + "tenant_id" int8 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "pay_notify_log"."id" IS '日志编号'; +COMMENT +ON COLUMN "pay_notify_log"."task_id" IS '通知任务编号'; +COMMENT +ON COLUMN "pay_notify_log"."notify_times" IS '第几次被通知'; +COMMENT +ON COLUMN "pay_notify_log"."response" IS '请求参数'; +COMMENT +ON COLUMN "pay_notify_log"."status" IS '通知状态'; +COMMENT +ON COLUMN "pay_notify_log"."creator" IS '创建者'; +COMMENT +ON COLUMN "pay_notify_log"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "pay_notify_log"."updater" IS '更新者'; +COMMENT +ON COLUMN "pay_notify_log"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "pay_notify_log"."deleted" IS '是否删除'; +COMMENT +ON COLUMN "pay_notify_log"."tenant_id" IS '租户编号'; +COMMENT +ON TABLE "pay_notify_log" IS '支付通知 App 的日志'; + +-- ---------------------------- +-- Records of pay_notify_log +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for pay_notify_task +-- ---------------------------- +DROP TABLE IF EXISTS "pay_notify_task"; +CREATE TABLE "pay_notify_task" +( + "id" int8 NOT NULL, + "merchant_id" int8 NOT NULL, + "app_id" int8 NOT NULL, + "type" int2 NOT NULL, + "data_id" int8 NOT NULL, + "status" int2 NOT NULL, + "merchant_order_id" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "next_notify_time" timestamp(6) NOT NULL, + "last_execute_time" timestamp(6) NOT NULL, + "notify_times" int2 NOT NULL, + "max_notify_times" int2 NOT NULL, + "notify_url" varchar(1024) COLLATE "pg_catalog"."default" NOT NULL, + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0, + "tenant_id" int8 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "pay_notify_task"."id" IS '任务编号'; +COMMENT +ON COLUMN "pay_notify_task"."merchant_id" IS '商户编号'; +COMMENT +ON COLUMN "pay_notify_task"."app_id" IS '应用编号'; +COMMENT +ON COLUMN "pay_notify_task"."type" IS '通知类型'; +COMMENT +ON COLUMN "pay_notify_task"."data_id" IS '数据编号'; +COMMENT +ON COLUMN "pay_notify_task"."status" IS '通知状态'; +COMMENT +ON COLUMN "pay_notify_task"."merchant_order_id" IS '商户订单编号'; +COMMENT +ON COLUMN "pay_notify_task"."next_notify_time" IS '下一次通知时间'; +COMMENT +ON COLUMN "pay_notify_task"."last_execute_time" IS '最后一次执行时间'; +COMMENT +ON COLUMN "pay_notify_task"."notify_times" IS '当前通知次数'; +COMMENT +ON COLUMN "pay_notify_task"."max_notify_times" IS '最大可通知次数'; +COMMENT +ON COLUMN "pay_notify_task"."notify_url" IS '异步通知地址'; +COMMENT +ON COLUMN "pay_notify_task"."creator" IS '创建者'; +COMMENT +ON COLUMN "pay_notify_task"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "pay_notify_task"."updater" IS '更新者'; +COMMENT +ON COLUMN "pay_notify_task"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "pay_notify_task"."deleted" IS '是否删除'; +COMMENT +ON COLUMN "pay_notify_task"."tenant_id" IS '租户编号'; +COMMENT +ON TABLE "pay_notify_task" IS '商户支付、退款等的通知 +'; + +-- ---------------------------- +-- Records of pay_notify_task +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for pay_order +-- ---------------------------- +DROP TABLE IF EXISTS "pay_order"; +CREATE TABLE "pay_order" +( + "id" int8 NOT NULL, + "merchant_id" int8 NOT NULL, + "app_id" int8 NOT NULL, + "channel_id" int8, + "channel_code" varchar(32) COLLATE "pg_catalog"."default", + "merchant_order_id" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "subject" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, + "body" varchar(128) COLLATE "pg_catalog"."default" NOT NULL, + "notify_url" varchar(1024) COLLATE "pg_catalog"."default" NOT NULL, + "notify_status" int2 NOT NULL, + "amount" int8 NOT NULL, + "channel_fee_rate" float8, + "channel_fee_amount" int8, + "status" int2 NOT NULL, + "user_ip" varchar(50) COLLATE "pg_catalog"."default" NOT NULL, + "expire_time" timestamp(6) NOT NULL, + "success_time" timestamp(6), + "notify_time" timestamp(6), + "success_extension_id" int8, + "refund_status" int2 NOT NULL, + "refund_times" int2 NOT NULL, + "refund_amount" int8 NOT NULL, + "channel_user_id" varchar(255) COLLATE "pg_catalog"."default", + "channel_order_no" varchar(64) COLLATE "pg_catalog"."default", + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0, + "tenant_id" int8 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "pay_order"."id" IS '支付订单编号'; +COMMENT +ON COLUMN "pay_order"."merchant_id" IS '商户编号'; +COMMENT +ON COLUMN "pay_order"."app_id" IS '应用编号'; +COMMENT +ON COLUMN "pay_order"."channel_id" IS '渠道编号'; +COMMENT +ON COLUMN "pay_order"."channel_code" IS '渠道编码'; +COMMENT +ON COLUMN "pay_order"."merchant_order_id" IS '商户订单编号'; +COMMENT +ON COLUMN "pay_order"."subject" IS '商品标题'; +COMMENT +ON COLUMN "pay_order"."body" IS '商品描述'; +COMMENT +ON COLUMN "pay_order"."notify_url" IS '异步通知地址'; +COMMENT +ON COLUMN "pay_order"."notify_status" IS '通知商户支付结果的回调状态'; +COMMENT +ON COLUMN "pay_order"."amount" IS '支付金额,单位:分'; +COMMENT +ON COLUMN "pay_order"."channel_fee_rate" IS '渠道手续费,单位:百分比'; +COMMENT +ON COLUMN "pay_order"."channel_fee_amount" IS '渠道手续金额,单位:分'; +COMMENT +ON COLUMN "pay_order"."status" IS '支付状态'; +COMMENT +ON COLUMN "pay_order"."user_ip" IS '用户 IP'; +COMMENT +ON COLUMN "pay_order"."expire_time" IS '订单失效时间'; +COMMENT +ON COLUMN "pay_order"."success_time" IS '订单支付成功时间'; +COMMENT +ON COLUMN "pay_order"."notify_time" IS '订单支付通知时间'; +COMMENT +ON COLUMN "pay_order"."success_extension_id" IS '支付成功的订单拓展单编号'; +COMMENT +ON COLUMN "pay_order"."refund_status" IS '退款状态'; +COMMENT +ON COLUMN "pay_order"."refund_times" IS '退款次数'; +COMMENT +ON COLUMN "pay_order"."refund_amount" IS '退款总金额,单位:分'; +COMMENT +ON COLUMN "pay_order"."channel_user_id" IS '渠道用户编号'; +COMMENT +ON COLUMN "pay_order"."channel_order_no" IS '渠道订单号'; +COMMENT +ON COLUMN "pay_order"."creator" IS '创建者'; +COMMENT +ON COLUMN "pay_order"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "pay_order"."updater" IS '更新者'; +COMMENT +ON COLUMN "pay_order"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "pay_order"."deleted" IS '是否删除'; +COMMENT +ON COLUMN "pay_order"."tenant_id" IS '租户编号'; +COMMENT +ON TABLE "pay_order" IS '支付订单 +'; + +-- ---------------------------- +-- Records of pay_order +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for pay_order_extension +-- ---------------------------- +DROP TABLE IF EXISTS "pay_order_extension"; +CREATE TABLE "pay_order_extension" +( + "id" int8 NOT NULL, + "no" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "order_id" int8 NOT NULL, + "channel_id" int8 NOT NULL, + "channel_code" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, + "user_ip" varchar(50) COLLATE "pg_catalog"."default" NOT NULL, + "status" int2 NOT NULL, + "channel_extras" varchar(256) COLLATE "pg_catalog"."default", + "channel_notify_data" varchar(1024) COLLATE "pg_catalog"."default", + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0, + "tenant_id" int8 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "pay_order_extension"."id" IS '支付订单编号'; +COMMENT +ON COLUMN "pay_order_extension"."no" IS '支付订单号'; +COMMENT +ON COLUMN "pay_order_extension"."order_id" IS '支付订单编号'; +COMMENT +ON COLUMN "pay_order_extension"."channel_id" IS '渠道编号'; +COMMENT +ON COLUMN "pay_order_extension"."channel_code" IS '渠道编码'; +COMMENT +ON COLUMN "pay_order_extension"."user_ip" IS '用户 IP'; +COMMENT +ON COLUMN "pay_order_extension"."status" IS '支付状态'; +COMMENT +ON COLUMN "pay_order_extension"."channel_extras" IS '支付渠道的额外参数'; +COMMENT +ON COLUMN "pay_order_extension"."channel_notify_data" IS '支付渠道异步通知的内容'; +COMMENT +ON COLUMN "pay_order_extension"."creator" IS '创建者'; +COMMENT +ON COLUMN "pay_order_extension"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "pay_order_extension"."updater" IS '更新者'; +COMMENT +ON COLUMN "pay_order_extension"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "pay_order_extension"."deleted" IS '是否删除'; +COMMENT +ON COLUMN "pay_order_extension"."tenant_id" IS '租户编号'; +COMMENT +ON TABLE "pay_order_extension" IS '支付订单 +'; + +-- ---------------------------- +-- Records of pay_order_extension +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for pay_refund +-- ---------------------------- +DROP TABLE IF EXISTS "pay_refund"; +CREATE TABLE "pay_refund" +( + "id" int8 NOT NULL, + "merchant_id" int8 NOT NULL, + "app_id" int8 NOT NULL, + "channel_id" int8 NOT NULL, + "channel_code" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, + "order_id" int8 NOT NULL, + "trade_no" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "merchant_order_id" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "merchant_refund_no" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "notify_url" varchar(1024) COLLATE "pg_catalog"."default" NOT NULL, + "notify_status" int2 NOT NULL, + "status" int2 NOT NULL, + "type" int2 NOT NULL, + "pay_amount" int8 NOT NULL, + "refund_amount" int8 NOT NULL, + "reason" varchar(256) COLLATE "pg_catalog"."default" NOT NULL, + "user_ip" varchar(50) COLLATE "pg_catalog"."default", + "channel_order_no" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "channel_refund_no" varchar(64) COLLATE "pg_catalog"."default", + "channel_error_code" varchar(128) COLLATE "pg_catalog"."default", + "channel_error_msg" varchar(256) COLLATE "pg_catalog"."default", + "channel_extras" varchar(1024) COLLATE "pg_catalog"."default", + "expire_time" timestamp(6), + "success_time" timestamp(6), + "notify_time" timestamp(6), + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0, + "tenant_id" int8 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "pay_refund"."id" IS '支付退款编号'; +COMMENT +ON COLUMN "pay_refund"."merchant_id" IS '商户编号'; +COMMENT +ON COLUMN "pay_refund"."app_id" IS '应用编号'; +COMMENT +ON COLUMN "pay_refund"."channel_id" IS '渠道编号'; +COMMENT +ON COLUMN "pay_refund"."channel_code" IS '渠道编码'; +COMMENT +ON COLUMN "pay_refund"."order_id" IS '支付订单编号 pay_order 表id'; +COMMENT +ON COLUMN "pay_refund"."trade_no" IS '交易订单号 pay_extension 表no 字段'; +COMMENT +ON COLUMN "pay_refund"."merchant_order_id" IS '商户订单编号(商户系统生成)'; +COMMENT +ON COLUMN "pay_refund"."merchant_refund_no" IS '商户退款订单号(商户系统生成)'; +COMMENT +ON COLUMN "pay_refund"."notify_url" IS '异步通知商户地址'; +COMMENT +ON COLUMN "pay_refund"."notify_status" IS '通知商户退款结果的回调状态'; +COMMENT +ON COLUMN "pay_refund"."status" IS '退款状态'; +COMMENT +ON COLUMN "pay_refund"."type" IS '退款类型(部分退款,全部退款)'; +COMMENT +ON COLUMN "pay_refund"."pay_amount" IS '支付金额,单位分'; +COMMENT +ON COLUMN "pay_refund"."refund_amount" IS '退款金额,单位分'; +COMMENT +ON COLUMN "pay_refund"."reason" IS '退款原因'; +COMMENT +ON COLUMN "pay_refund"."user_ip" IS '用户 IP'; +COMMENT +ON COLUMN "pay_refund"."channel_order_no" IS '渠道订单号,pay_order 中的channel_order_no 对应'; +COMMENT +ON COLUMN "pay_refund"."channel_refund_no" IS '渠道退款单号,渠道返回'; +COMMENT +ON COLUMN "pay_refund"."channel_error_code" IS '渠道调用报错时,错误码'; +COMMENT +ON COLUMN "pay_refund"."channel_error_msg" IS '渠道调用报错时,错误信息'; +COMMENT +ON COLUMN "pay_refund"."channel_extras" IS '支付渠道的额外参数'; +COMMENT +ON COLUMN "pay_refund"."expire_time" IS '退款失效时间'; +COMMENT +ON COLUMN "pay_refund"."success_time" IS '退款成功时间'; +COMMENT +ON COLUMN "pay_refund"."notify_time" IS '退款通知时间'; +COMMENT +ON COLUMN "pay_refund"."creator" IS '创建者'; +COMMENT +ON COLUMN "pay_refund"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "pay_refund"."updater" IS '更新者'; +COMMENT +ON COLUMN "pay_refund"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "pay_refund"."deleted" IS '是否删除'; +COMMENT +ON COLUMN "pay_refund"."tenant_id" IS '租户编号'; +COMMENT +ON TABLE "pay_refund" IS '退款订单'; + +-- ---------------------------- +-- Records of pay_refund +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for qrtz_blob_triggers +-- ---------------------------- +DROP TABLE IF EXISTS "qrtz_blob_triggers"; +CREATE TABLE "qrtz_blob_triggers" +( + "sched_name" varchar(120) COLLATE "pg_catalog"."default" NOT NULL, + "trigger_name" varchar(200) COLLATE "pg_catalog"."default" NOT NULL, + "trigger_group" varchar(200) COLLATE "pg_catalog"."default" NOT NULL, + "blob_data" bytea +) +; + +-- ---------------------------- +-- Records of qrtz_blob_triggers +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for qrtz_calendars +-- ---------------------------- +DROP TABLE IF EXISTS "qrtz_calendars"; +CREATE TABLE "qrtz_calendars" +( + "sched_name" varchar(120) COLLATE "pg_catalog"."default" NOT NULL, + "calendar_name" varchar(200) COLLATE "pg_catalog"."default" NOT NULL, + "calendar" bytea NOT NULL +) +; + +-- ---------------------------- +-- Records of qrtz_calendars +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for qrtz_cron_triggers +-- ---------------------------- +DROP TABLE IF EXISTS "qrtz_cron_triggers"; +CREATE TABLE "qrtz_cron_triggers" +( + "sched_name" varchar(120) COLLATE "pg_catalog"."default" NOT NULL, + "trigger_name" varchar(200) COLLATE "pg_catalog"."default" NOT NULL, + "trigger_group" varchar(200) COLLATE "pg_catalog"."default" NOT NULL, + "cron_expression" varchar(120) COLLATE "pg_catalog"."default" NOT NULL, + "time_zone_id" varchar(80) COLLATE "pg_catalog"."default" +) +; + +-- ---------------------------- +-- Records of qrtz_cron_triggers +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for qrtz_fired_triggers +-- ---------------------------- +DROP TABLE IF EXISTS "qrtz_fired_triggers"; +CREATE TABLE "qrtz_fired_triggers" +( + "sched_name" varchar(120) COLLATE "pg_catalog"."default" NOT NULL, + "entry_id" varchar(95) COLLATE "pg_catalog"."default" NOT NULL, + "trigger_name" varchar(200) COLLATE "pg_catalog"."default" NOT NULL, + "trigger_group" varchar(200) COLLATE "pg_catalog"."default" NOT NULL, + "instance_name" varchar(200) COLLATE "pg_catalog"."default" NOT NULL, + "fired_time" int8 NOT NULL, + "sched_time" int8 NOT NULL, + "priority" int4 NOT NULL, + "state" varchar(16) COLLATE "pg_catalog"."default" NOT NULL, + "job_name" varchar(200) COLLATE "pg_catalog"."default", + "job_group" varchar(200) COLLATE "pg_catalog"."default", + "is_nonconcurrent" bool, + "requests_recovery" bool +) +; + +-- ---------------------------- +-- Records of qrtz_fired_triggers +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for qrtz_job_details +-- ---------------------------- +DROP TABLE IF EXISTS "qrtz_job_details"; +CREATE TABLE "qrtz_job_details" +( + "sched_name" varchar(120) COLLATE "pg_catalog"."default" NOT NULL, + "job_name" varchar(200) COLLATE "pg_catalog"."default" NOT NULL, + "job_group" varchar(200) COLLATE "pg_catalog"."default" NOT NULL, + "description" varchar(250) COLLATE "pg_catalog"."default", + "job_class_name" varchar(250) COLLATE "pg_catalog"."default" NOT NULL, + "is_durable" bool NOT NULL, + "is_nonconcurrent" bool NOT NULL, + "is_update_data" bool NOT NULL, + "requests_recovery" bool NOT NULL, + "job_data" bytea +) +; + +-- ---------------------------- +-- Records of qrtz_job_details +-- ---------------------------- +BEGIN; +INSERT INTO "qrtz_job_details" ("sched_name", "job_name", "job_group", "description", "job_class_name", "is_durable", + "is_nonconcurrent", "is_update_data", "requests_recovery", "job_data") +VALUES ('schedulerName', 'userSessionTimeoutJob', 'DEFAULT', NULL, + 'com.win.framework.quartz.core.handler.JobHandlerInvoker', 'f', 't', 't', 'f', + '\\254\\355\\000\\005sr\\000\\025org.quartz.JobDataMap\\237\\260\\203\\350\\277\\251\\260\\313\\002\\000\\000xr\\000&org.quartz.utils.StringKeyDirtyFlagMap\\202\\010\\350\\303\\373\\305](\\002\\000\\001Z\\000\\023allowsTransientDataxr\\000\\035org.quartz.utils.DirtyFlagMap\\023\\346.\\255(v\\012\\316\\002\\000\\002Z\\000\\005dirtyL\\000\\003mapt\\000\\017Ljava/util/Map;xp\\001sr\\000\\021java.util.HashMap\\005\\007\\332\\301\\303\\026`\\321\\003\\000\\002F\\000\\012loadFactorI\\000\\011thresholdxp?@\\000\\000\\000\\000\\000\\014w\\010\\000\\000\\000\\020\\000\\000\\000\\002t\\000\\006JOB_IDsr\\000\\016java.lang.Long;\\213\\344\\220\\314\\217#\\337\\002\\000\\001J\\000\\005valuexr\\000\\020java.lang.Number\\206\\254\\225\\035\\013\\224\\340\\213\\002\\000\\000xp\\000\\000\\000\\000\\000\\000\\000\\002t\\000\\020JOB_HANDLER_NAMEt\\000\\025userSessionTimeoutJobx\\000'); +COMMIT; + +-- ---------------------------- +-- Table structure for qrtz_locks +-- ---------------------------- +DROP TABLE IF EXISTS "qrtz_locks"; +CREATE TABLE "qrtz_locks" +( + "sched_name" varchar(120) COLLATE "pg_catalog"."default" NOT NULL, + "lock_name" varchar(40) COLLATE "pg_catalog"."default" NOT NULL +) +; + +-- ---------------------------- +-- Records of qrtz_locks +-- ---------------------------- +BEGIN; +INSERT INTO "qrtz_locks" ("sched_name", "lock_name") +VALUES ('schedulerName', 'TRIGGER_ACCESS'); +INSERT INTO "qrtz_locks" ("sched_name", "lock_name") +VALUES ('schedulerName', 'STATE_ACCESS'); +COMMIT; + +-- ---------------------------- +-- Table structure for qrtz_paused_trigger_grps +-- ---------------------------- +DROP TABLE IF EXISTS "qrtz_paused_trigger_grps"; +CREATE TABLE "qrtz_paused_trigger_grps" +( + "sched_name" varchar(120) COLLATE "pg_catalog"."default" NOT NULL, + "trigger_group" varchar(200) COLLATE "pg_catalog"."default" NOT NULL +) +; + +-- ---------------------------- +-- Records of qrtz_paused_trigger_grps +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for qrtz_scheduler_state +-- ---------------------------- +DROP TABLE IF EXISTS "qrtz_scheduler_state"; +CREATE TABLE "qrtz_scheduler_state" +( + "sched_name" varchar(120) COLLATE "pg_catalog"."default" NOT NULL, + "instance_name" varchar(200) COLLATE "pg_catalog"."default" NOT NULL, + "last_checkin_time" int8 NOT NULL, + "checkin_interval" int8 NOT NULL +) +; + +-- ---------------------------- +-- Records of qrtz_scheduler_state +-- ---------------------------- +BEGIN; +INSERT INTO "qrtz_scheduler_state" ("sched_name", "instance_name", "last_checkin_time", "checkin_interval") +VALUES ('schedulerName', 'Yunai.local1651328569660', 1651328650075, 15000); +COMMIT; + +-- ---------------------------- +-- Table structure for qrtz_simple_triggers +-- ---------------------------- +DROP TABLE IF EXISTS "qrtz_simple_triggers"; +CREATE TABLE "qrtz_simple_triggers" +( + "sched_name" varchar(120) COLLATE "pg_catalog"."default" NOT NULL, + "trigger_name" varchar(200) COLLATE "pg_catalog"."default" NOT NULL, + "trigger_group" varchar(200) COLLATE "pg_catalog"."default" NOT NULL, + "repeat_count" int8 NOT NULL, + "repeat_interval" int8 NOT NULL, + "times_triggered" int8 NOT NULL +) +; + +-- ---------------------------- +-- Records of qrtz_simple_triggers +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for qrtz_simprop_triggers +-- ---------------------------- +DROP TABLE IF EXISTS "qrtz_simprop_triggers"; +CREATE TABLE "qrtz_simprop_triggers" +( + "sched_name" varchar(120) COLLATE "pg_catalog"."default" NOT NULL, + "trigger_name" varchar(200) COLLATE "pg_catalog"."default" NOT NULL, + "trigger_group" varchar(200) COLLATE "pg_catalog"."default" NOT NULL, + "str_prop_1" varchar(512) COLLATE "pg_catalog"."default", + "str_prop_2" varchar(512) COLLATE "pg_catalog"."default", + "str_prop_3" varchar(512) COLLATE "pg_catalog"."default", + "int_prop_1" int4, + "int_prop_2" int4, + "long_prop_1" int8, + "long_prop_2" int8, + "dec_prop_1" numeric(13, 4), + "dec_prop_2" numeric(13, 4), + "bool_prop_1" bool, + "bool_prop_2" bool +) +; + +-- ---------------------------- +-- Records of qrtz_simprop_triggers +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for qrtz_triggers +-- ---------------------------- +DROP TABLE IF EXISTS "qrtz_triggers"; +CREATE TABLE "qrtz_triggers" +( + "sched_name" varchar(120) COLLATE "pg_catalog"."default" NOT NULL, + "trigger_name" varchar(200) COLLATE "pg_catalog"."default" NOT NULL, + "trigger_group" varchar(200) COLLATE "pg_catalog"."default" NOT NULL, + "job_name" varchar(200) COLLATE "pg_catalog"."default" NOT NULL, + "job_group" varchar(200) COLLATE "pg_catalog"."default" NOT NULL, + "description" varchar(250) COLLATE "pg_catalog"."default", + "next_fire_time" int8, + "prev_fire_time" int8, + "priority" int4, + "trigger_state" varchar(16) COLLATE "pg_catalog"."default" NOT NULL, + "trigger_type" varchar(8) COLLATE "pg_catalog"."default" NOT NULL, + "start_time" int8 NOT NULL, + "end_time" int8, + "calendar_name" varchar(200) COLLATE "pg_catalog"."default", + "misfire_instr" int2, + "job_data" bytea +) +; + +-- ---------------------------- +-- Records of qrtz_triggers +-- ---------------------------- +BEGIN; +INSERT INTO "qrtz_triggers" ("sched_name", "trigger_name", "trigger_group", "job_name", "job_group", "description", + "next_fire_time", "prev_fire_time", "priority", "trigger_state", "trigger_type", + "start_time", "end_time", "calendar_name", "misfire_instr", "job_data") +VALUES ('schedulerName', 'userSessionTimeoutJob', 'DEFAULT', 'userSessionTimeoutJob', 'DEFAULT', NULL, 1651328700000, + 1651328640000, 5, 'WAITING', 'CRON', 1651328526000, 0, NULL, 0, + '\\254\\355\\000\\005sr\\000\\025org.quartz.JobDataMap\\237\\260\\203\\350\\277\\251\\260\\313\\002\\000\\000xr\\000&org.quartz.utils.StringKeyDirtyFlagMap\\202\\010\\350\\303\\373\\305](\\002\\000\\001Z\\000\\023allowsTransientDataxr\\000\\035org.quartz.utils.DirtyFlagMap\\023\\346.\\255(v\\012\\316\\002\\000\\002Z\\000\\005dirtyL\\000\\003mapt\\000\\017Ljava/util/Map;xp\\001sr\\000\\021java.util.HashMap\\005\\007\\332\\301\\303\\026`\\321\\003\\000\\002F\\000\\012loadFactorI\\000\\011thresholdxp?@\\000\\000\\000\\000\\000\\014w\\010\\000\\000\\000\\020\\000\\000\\000\\003t\\000\\021JOB_HANDLER_PARAMpt\\000\\022JOB_RETRY_INTERVALsr\\000\\021java.lang.Integer\\022\\342\\240\\244\\367\\201\\2078\\002\\000\\001I\\000\\005valuexr\\000\\020java.lang.Number\\206\\254\\225\\035\\013\\224\\340\\213\\002\\000\\000xp\\000\\000\\007\\320t\\000\\017JOB_RETRY_COUNTsq\\000~\\000\\011\\000\\000\\000\\003x\\000'); +COMMIT; + +-- ---------------------------- +-- Table structure for system_dept +-- ---------------------------- +DROP TABLE IF EXISTS "system_dept"; +CREATE TABLE "system_dept" +( + "id" int8 NOT NULL, + "name" varchar(30) COLLATE "pg_catalog"."default" NOT NULL, + "parent_id" int8 NOT NULL, + "sort" int4 NOT NULL, + "leader_user_id" int8, + "phone" varchar(11) COLLATE "pg_catalog"."default", + "email" varchar(50) COLLATE "pg_catalog"."default", + "status" int2 NOT NULL, + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0, + "tenant_id" int8 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "system_dept"."id" IS '部门id'; +COMMENT +ON COLUMN "system_dept"."name" IS '部门名称'; +COMMENT +ON COLUMN "system_dept"."parent_id" IS '父部门id'; +COMMENT +ON COLUMN "system_dept"."sort" IS '显示顺序'; +COMMENT +ON COLUMN "system_dept"."leader_user_id" IS '负责人'; +COMMENT +ON COLUMN "system_dept"."phone" IS '联系电话'; +COMMENT +ON COLUMN "system_dept"."email" IS '邮箱'; +COMMENT +ON COLUMN "system_dept"."status" IS '部门状态(0正常 1停用)'; +COMMENT +ON COLUMN "system_dept"."creator" IS '创建者'; +COMMENT +ON COLUMN "system_dept"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "system_dept"."updater" IS '更新者'; +COMMENT +ON COLUMN "system_dept"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "system_dept"."deleted" IS '是否删除'; +COMMENT +ON COLUMN "system_dept"."tenant_id" IS '租户编号'; +COMMENT +ON TABLE "system_dept" IS '部门表'; + +-- ---------------------------- +-- Records of system_dept +-- ---------------------------- +BEGIN; +INSERT INTO "system_dept" ("id", "name", "parent_id", "sort", "leader_user_id", "phone", "email", "status", "creator", + "create_time", "updater", "update_time", "deleted", "tenant_id") +VALUES (100, '闻荫源码', 0, 0, 1, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '103', + '2022-01-14 01:04:05', 0, 1); +INSERT INTO "system_dept" ("id", "name", "parent_id", "sort", "leader_user_id", "phone", "email", "status", "creator", + "create_time", "updater", "update_time", "deleted", "tenant_id") +VALUES (101, '深圳总公司', 100, 1, 104, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '1', + '2022-02-22 19:47:48', 0, 1); +INSERT INTO "system_dept" ("id", "name", "parent_id", "sort", "leader_user_id", "phone", "email", "status", "creator", + "create_time", "updater", "update_time", "deleted", "tenant_id") +VALUES (102, '长沙分公司', 100, 2, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', + '2021-12-15 05:01:40', 0, 1); +INSERT INTO "system_dept" ("id", "name", "parent_id", "sort", "leader_user_id", "phone", "email", "status", "creator", + "create_time", "updater", "update_time", "deleted", "tenant_id") +VALUES (103, '研发部门', 101, 1, 104, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '103', + '2022-01-14 01:04:14', 0, 1); +INSERT INTO "system_dept" ("id", "name", "parent_id", "sort", "leader_user_id", "phone", "email", "status", "creator", + "create_time", "updater", "update_time", "deleted", "tenant_id") +VALUES (104, '市场部门', 101, 2, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', + '2021-12-15 05:01:38', 0, 1); +INSERT INTO "system_dept" ("id", "name", "parent_id", "sort", "leader_user_id", "phone", "email", "status", "creator", + "create_time", "updater", "update_time", "deleted", "tenant_id") +VALUES (105, '测试部门', 101, 3, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', + '2021-12-15 05:01:37', 0, 1); +INSERT INTO "system_dept" ("id", "name", "parent_id", "sort", "leader_user_id", "phone", "email", "status", "creator", + "create_time", "updater", "update_time", "deleted", "tenant_id") +VALUES (106, '财务部门', 101, 4, 103, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '103', + '2022-01-15 21:32:22', 0, 1); +INSERT INTO "system_dept" ("id", "name", "parent_id", "sort", "leader_user_id", "phone", "email", "status", "creator", + "create_time", "updater", "update_time", "deleted", "tenant_id") +VALUES (107, '运维部门', 101, 5, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', + '2021-12-15 05:01:33', 0, 1); +INSERT INTO "system_dept" ("id", "name", "parent_id", "sort", "leader_user_id", "phone", "email", "status", "creator", + "create_time", "updater", "update_time", "deleted", "tenant_id") +VALUES (108, '市场部门', 102, 1, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '1', + '2022-02-16 08:35:45', 0, 1); +INSERT INTO "system_dept" ("id", "name", "parent_id", "sort", "leader_user_id", "phone", "email", "status", "creator", + "create_time", "updater", "update_time", "deleted", "tenant_id") +VALUES (109, '财务部门', 102, 2, NULL, '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', + '2021-12-15 05:01:29', 0, 1); +INSERT INTO "system_dept" ("id", "name", "parent_id", "sort", "leader_user_id", "phone", "email", "status", "creator", + "create_time", "updater", "update_time", "deleted", "tenant_id") +VALUES (110, '新部门', 0, 1, NULL, NULL, NULL, 0, '110', '2022-02-23 20:46:30', '110', '2022-02-23 20:46:30', 0, 121); +INSERT INTO "system_dept" ("id", "name", "parent_id", "sort", "leader_user_id", "phone", "email", "status", "creator", + "create_time", "updater", "update_time", "deleted", "tenant_id") +VALUES (111, '顶级部门', 0, 1, NULL, NULL, NULL, 0, '113', '2022-03-07 21:44:50', '113', '2022-03-07 21:44:50', 0, 122); +COMMIT; + +-- ---------------------------- +-- Table structure for system_dict_data +-- ---------------------------- +DROP TABLE IF EXISTS "system_dict_data"; +CREATE TABLE "system_dict_data" +( + "id" int8 NOT NULL, + "sort" int4 NOT NULL, + "label" varchar(100) COLLATE "pg_catalog"."default" NOT NULL, + "value" varchar(100) COLLATE "pg_catalog"."default" NOT NULL, + "dict_type" varchar(100) COLLATE "pg_catalog"."default" NOT NULL, + "status" int2 NOT NULL, + "color_type" varchar(100) COLLATE "pg_catalog"."default", + "css_class" varchar(100) COLLATE "pg_catalog"."default", + "remark" varchar(500) COLLATE "pg_catalog"."default", + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "system_dict_data"."id" IS '字典编码'; +COMMENT +ON COLUMN "system_dict_data"."sort" IS '字典排序'; +COMMENT +ON COLUMN "system_dict_data"."label" IS '字典标签'; +COMMENT +ON COLUMN "system_dict_data"."value" IS '字典键值'; +COMMENT +ON COLUMN "system_dict_data"."dict_type" IS '字典类型'; +COMMENT +ON COLUMN "system_dict_data"."status" IS '状态(0正常 1停用)'; +COMMENT +ON COLUMN "system_dict_data"."color_type" IS '颜色类型'; +COMMENT +ON COLUMN "system_dict_data"."css_class" IS 'css 样式'; +COMMENT +ON COLUMN "system_dict_data"."remark" IS '备注'; +COMMENT +ON COLUMN "system_dict_data"."creator" IS '创建者'; +COMMENT +ON COLUMN "system_dict_data"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "system_dict_data"."updater" IS '更新者'; +COMMENT +ON COLUMN "system_dict_data"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "system_dict_data"."deleted" IS '是否删除'; +COMMENT +ON TABLE "system_dict_data" IS '字典数据表'; + +-- ---------------------------- +-- Records of system_dict_data +-- ---------------------------- +BEGIN; +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (1, 1, '男', '1', 'system_user_sex', 0, 'default', 'A', '性别男', 'admin', '2021-01-05 17:03:48', '1', + '2022-03-29 00:14:39', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (2, 2, '女', '2', 'system_user_sex', 1, 'success', '', '性别女', 'admin', '2021-01-05 17:03:48', '1', + '2022-02-16 01:30:51', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (8, 1, '正常', '1', 'infra_job_status', 0, 'success', '', '正常状态', 'admin', '2021-01-05 17:03:48', '1', + '2022-02-16 19:33:38', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (9, 2, '暂停', '2', 'infra_job_status', 0, 'danger', '', '停用状态', 'admin', '2021-01-05 17:03:48', '1', + '2022-02-16 19:33:45', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (12, 1, '系统内置', '1', 'infra_config_type', 0, 'danger', '', '参数类型 - 系统内置', 'admin', + '2021-01-05 17:03:48', '1', '2022-02-16 19:06:02', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (13, 2, '自定义', '2', 'infra_config_type', 0, 'primary', '', '参数类型 - 自定义', 'admin', + '2021-01-05 17:03:48', '1', '2022-02-16 19:06:07', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (14, 1, '通知', '1', 'system_notice_type', 0, 'success', '', '通知', 'admin', '2021-01-05 17:03:48', '1', + '2022-02-16 13:05:57', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (15, 2, '公告', '2', 'system_notice_type', 0, 'info', '', '公告', 'admin', '2021-01-05 17:03:48', '1', + '2022-02-16 13:06:01', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (16, 0, '其它', '0', 'system_operate_type', 0, 'default', '', '其它操作', 'admin', '2021-01-05 17:03:48', '1', + '2022-02-16 09:32:46', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (17, 1, '查询', '1', 'system_operate_type', 0, 'info', '', '查询操作', 'admin', '2021-01-05 17:03:48', '1', + '2022-02-16 09:33:16', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (18, 2, '新增', '2', 'system_operate_type', 0, 'primary', '', '新增操作', 'admin', '2021-01-05 17:03:48', '1', + '2022-02-16 09:33:13', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (19, 3, '修改', '3', 'system_operate_type', 0, 'warning', '', '修改操作', 'admin', '2021-01-05 17:03:48', '1', + '2022-02-16 09:33:22', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (20, 4, '删除', '4', 'system_operate_type', 0, 'danger', '', '删除操作', 'admin', '2021-01-05 17:03:48', '1', + '2022-02-16 09:33:27', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (22, 5, '导出', '5', 'system_operate_type', 0, 'default', '', '导出操作', 'admin', '2021-01-05 17:03:48', '1', + '2022-02-16 09:33:32', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (23, 6, '导入', '6', 'system_operate_type', 0, 'default', '', '导入操作', 'admin', '2021-01-05 17:03:48', '1', + '2022-02-16 09:33:35', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (27, 1, '开启', '0', 'common_status', 0, 'primary', '', '开启状态', 'admin', '2021-01-05 17:03:48', '1', + '2022-02-16 08:00:39', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (28, 2, '关闭', '1', 'common_status', 0, 'info', '', '关闭状态', 'admin', '2021-01-05 17:03:48', '1', + '2022-02-16 08:00:44', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (29, 1, '目录', '1', 'system_menu_type', 0, '', '', '目录', 'admin', '2021-01-05 17:03:48', '', + '2022-02-01 16:43:45', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (30, 2, '菜单', '2', 'system_menu_type', 0, '', '', '菜单', 'admin', '2021-01-05 17:03:48', '', + '2022-02-01 16:43:41', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (31, 3, '按钮', '3', 'system_menu_type', 0, '', '', '按钮', 'admin', '2021-01-05 17:03:48', '', + '2022-02-01 16:43:39', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (32, 1, '内置', '1', 'system_role_type', 0, 'danger', '', '内置角色', 'admin', '2021-01-05 17:03:48', '1', + '2022-02-16 13:02:08', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (33, 2, '自定义', '2', 'system_role_type', 0, 'primary', '', '自定义角色', 'admin', '2021-01-05 17:03:48', '1', + '2022-02-16 13:02:12', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (34, 1, '全部数据权限', '1', 'system_data_scope', 0, '', '', '全部数据权限', 'admin', '2021-01-05 17:03:48', '', + '2022-02-01 16:47:17', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (35, 2, '指定部门数据权限', '2', 'system_data_scope', 0, '', '', '指定部门数据权限', 'admin', + '2021-01-05 17:03:48', '', '2022-02-01 16:47:18', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (36, 3, '本部门数据权限', '3', 'system_data_scope', 0, '', '', '本部门数据权限', 'admin', '2021-01-05 17:03:48', + '', '2022-02-01 16:47:16', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (37, 4, '本部门及以下数据权限', '4', 'system_data_scope', 0, '', '', '本部门及以下数据权限', 'admin', + '2021-01-05 17:03:48', '', '2022-02-01 16:47:21', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (38, 5, '仅本人数据权限', '5', 'system_data_scope', 0, '', '', '仅本人数据权限', 'admin', '2021-01-05 17:03:48', + '', '2022-02-01 16:47:23', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (39, 0, '成功', '0', 'system_login_result', 0, 'success', '', '登陆结果 - 成功', '', '2021-01-18 06:17:36', '1', + '2022-02-16 13:23:49', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (40, 10, '账号或密码不正确', '10', 'system_login_result', 0, 'primary', '', '登陆结果 - 账号或密码不正确', '', + '2021-01-18 06:17:54', '1', '2022-02-16 13:24:27', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (41, 20, '用户被禁用', '20', 'system_login_result', 0, 'warning', '', '登陆结果 - 用户被禁用', '', + '2021-01-18 06:17:54', '1', '2022-02-16 13:23:57', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (42, 30, '验证码不存在', '30', 'system_login_result', 0, 'info', '', '登陆结果 - 验证码不存在', '', + '2021-01-18 06:17:54', '1', '2022-02-16 13:24:07', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (43, 31, '验证码不正确', '31', 'system_login_result', 0, 'info', '', '登陆结果 - 验证码不正确', '', + '2021-01-18 06:17:54', '1', '2022-02-16 13:24:11', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (44, 100, '未知异常', '100', 'system_login_result', 0, 'danger', '', '登陆结果 - 未知异常', '', + '2021-01-18 06:17:54', '1', '2022-02-16 13:24:23', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (45, 1, '是', 'true', 'infra_boolean_string', 0, 'danger', '', 'Boolean 是否类型 - 是', '', + '2021-01-19 03:20:55', '1', '2022-03-15 23:01:45', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (46, 1, '否', 'false', 'infra_boolean_string', 0, 'info', '', 'Boolean 是否类型 - 否', '', '2021-01-19 03:20:55', + '1', '2022-03-15 23:09:45', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (47, 1, '永不超时', '1', 'infra_redis_timeout_type', 0, 'primary', '', 'Redis 未设置超时的情况', '', + '2021-01-26 00:53:17', '1', '2022-02-16 19:03:35', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (48, 1, '动态超时', '2', 'infra_redis_timeout_type', 0, 'info', '', '程序里动态传入超时时间,无法固定', '', + '2021-01-26 00:55:00', '1', '2022-02-16 19:03:41', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (49, 3, '固定超时', '3', 'infra_redis_timeout_type', 0, 'success', '', 'Redis 设置了过期时间', '', + '2021-01-26 00:55:26', '1', '2022-02-16 19:03:45', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (50, 1, '单表(增删改查)', '1', 'infra_codegen_template_type', 0, '', '', NULL, '', '2021-02-05 07:09:06', '', + '2022-03-10 16:33:15', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (51, 2, '树表(增删改查)', '2', 'infra_codegen_template_type', 0, '', '', NULL, '', '2021-02-05 07:14:46', '', + '2022-03-10 16:33:19', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (53, 0, '初始化中', '0', 'infra_job_status', 0, 'primary', '', NULL, '', '2021-02-07 07:46:49', '1', + '2022-02-16 19:33:29', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (57, 0, '运行中', '0', 'infra_job_log_status', 0, 'primary', '', 'RUNNING', '', '2021-02-08 10:04:24', '1', + '2022-02-16 19:07:48', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (58, 1, '成功', '1', 'infra_job_log_status', 0, 'success', '', NULL, '', '2021-02-08 10:06:57', '1', + '2022-02-16 19:07:52', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (59, 2, '失败', '2', 'infra_job_log_status', 0, 'warning', '', '失败', '', '2021-02-08 10:07:38', '1', + '2022-02-16 19:07:56', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (60, 1, '会员', '1', 'user_type', 0, 'primary', '', NULL, '', '2021-02-26 00:16:27', '1', '2022-02-16 10:22:19', + 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (61, 2, '管理员', '2', 'user_type', 0, 'success', '', NULL, '', '2021-02-26 00:16:34', '1', + '2022-02-16 10:22:22', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (62, 0, '未处理', '0', 'infra_api_error_log_process_status', 0, 'primary', '', NULL, '', '2021-02-26 07:07:19', + '1', '2022-02-16 20:14:17', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (63, 1, '已处理', '1', 'infra_api_error_log_process_status', 0, 'success', '', NULL, '', '2021-02-26 07:07:26', + '1', '2022-02-16 20:14:08', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (64, 2, '已忽略', '2', 'infra_api_error_log_process_status', 0, 'danger', '', NULL, '', '2021-02-26 07:07:34', + '1', '2022-02-16 20:14:14', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (66, 2, '阿里云', 'ALIYUN', 'system_sms_channel_code', 0, 'primary', '', NULL, '1', '2021-04-05 01:05:26', '1', + '2022-02-16 10:09:52', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (67, 1, '验证码', '1', 'system_sms_template_type', 0, 'warning', '', NULL, '1', '2021-04-05 21:50:57', '1', + '2022-02-16 12:48:30', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (68, 2, '通知', '2', 'system_sms_template_type', 0, 'primary', '', NULL, '1', '2021-04-05 21:51:08', '1', + '2022-02-16 12:48:27', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (69, 0, '营销', '3', 'system_sms_template_type', 0, 'danger', '', NULL, '1', '2021-04-05 21:51:15', '1', + '2022-02-16 12:48:22', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (70, 0, '初始化', '0', 'system_sms_send_status', 0, 'primary', '', NULL, '1', '2021-04-11 20:18:33', '1', + '2022-02-16 10:26:07', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (71, 1, '发送成功', '10', 'system_sms_send_status', 0, 'success', '', NULL, '1', '2021-04-11 20:18:43', '1', + '2022-02-16 10:25:56', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (72, 2, '发送失败', '20', 'system_sms_send_status', 0, 'danger', '', NULL, '1', '2021-04-11 20:18:49', '1', + '2022-02-16 10:26:03', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (73, 3, '不发送', '30', 'system_sms_send_status', 0, 'info', '', NULL, '1', '2021-04-11 20:19:44', '1', + '2022-02-16 10:26:10', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (74, 0, '等待结果', '0', 'system_sms_receive_status', 0, 'primary', '', NULL, '1', '2021-04-11 20:27:43', '1', + '2022-02-16 10:28:24', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (75, 1, '接收成功', '10', 'system_sms_receive_status', 0, 'success', '', NULL, '1', '2021-04-11 20:29:25', '1', + '2022-02-16 10:28:28', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (76, 2, '接收失败', '20', 'system_sms_receive_status', 0, 'danger', '', NULL, '1', '2021-04-11 20:29:31', '1', + '2022-02-16 10:28:32', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (77, 0, '调试(钉钉)', 'DEBUG_DING_TALK', 'system_sms_channel_code', 0, 'info', '', NULL, '1', + '2021-04-13 00:20:37', '1', '2022-02-16 10:10:00', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (78, 1, '自动生成', '1', 'system_error_code_type', 0, 'warning', '', NULL, '1', '2021-04-21 00:06:48', '1', + '2022-02-16 13:57:20', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (79, 2, '手动编辑', '2', 'system_error_code_type', 0, 'primary', '', NULL, '1', '2021-04-21 00:07:14', '1', + '2022-02-16 13:57:24', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (80, 100, '账号登录', '100', 'system_login_type', 0, 'primary', '', '账号登录', '1', '2021-10-06 00:52:02', '1', + '2022-02-16 13:11:34', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (81, 101, '社交登录', '101', 'system_login_type', 0, 'info', '', '社交登录', '1', '2021-10-06 00:52:17', '1', + '2022-02-16 13:11:40', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (83, 200, '主动登出', '200', 'system_login_type', 0, 'primary', '', '主动登出', '1', '2021-10-06 00:52:58', '1', + '2022-02-16 13:11:49', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (85, 202, '强制登出', '202', 'system_login_type', 0, 'danger', '', '强制退出', '1', '2021-10-06 00:53:41', '1', + '2022-02-16 13:11:57', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (86, 0, '病假', '1', 'bpm_oa_leave_type', 0, 'primary', '', NULL, '1', '2021-09-21 22:35:28', '1', + '2022-02-16 10:00:41', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (87, 1, '事假', '2', 'bpm_oa_leave_type', 0, 'info', '', NULL, '1', '2021-09-21 22:36:11', '1', + '2022-02-16 10:00:49', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (88, 2, '婚假', '3', 'bpm_oa_leave_type', 0, 'warning', '', NULL, '1', '2021-09-21 22:36:38', '1', + '2022-02-16 10:00:53', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (98, 1, 'v2', 'v2', 'pay_channel_wechat_version', 0, '', '', 'v2版本', '1', '2021-11-08 17:00:58', '1', + '2021-11-08 17:00:58', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (99, 2, 'v3', 'v3', 'pay_channel_wechat_version', 0, '', '', 'v3版本', '1', '2021-11-08 17:01:07', '1', + '2021-11-08 17:01:07', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (108, 1, 'RSA2', 'RSA2', 'pay_channel_alipay_sign_type', 0, '', '', 'RSA2', '1', '2021-11-18 15:39:29', '1', + '2021-11-18 15:39:29', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (109, 1, '公钥模式', '1', 'pay_channel_alipay_mode', 0, '', '', '公钥模式:privateKey + alipayPublicKey', '1', + '2021-11-18 15:45:23', '1', '2021-11-18 15:45:23', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (110, 2, '证书模式', '2', 'pay_channel_alipay_mode', 0, '', '', + '证书模式:appCertContent + alipayPublicCertContent + rootCertContent', '1', '2021-11-18 15:45:40', '1', + '2021-11-18 15:45:40', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (111, 1, '线上', 'https://openapi.alipay.com/gateway.do', 'pay_channel_alipay_server_type', 0, '', '', + '网关地址 - 线上', '1', '2021-11-18 16:59:32', '1', '2021-11-21 17:37:29', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (112, 2, '沙箱', 'https://openapi.alipaydev.com/gateway.do', 'pay_channel_alipay_server_type', 0, '', '', + '网关地址 - 沙箱', '1', '2021-11-18 16:59:48', '1', '2021-11-21 17:37:39', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (113, 1, '微信 JSAPI 支付', 'wx_pub', 'pay_channel_code_type', 0, '', '', '微信 JSAPI(公众号) 支付', '1', + '2021-12-03 10:40:24', '1', '2021-12-04 16:41:00', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (114, 2, '微信小程序支付', 'wx_lite', 'pay_channel_code_type', 0, '', '', '微信小程序支付', '1', + '2021-12-03 10:41:06', '1', '2021-12-03 10:41:06', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (115, 3, '微信 App 支付', 'wx_app', 'pay_channel_code_type', 0, '', '', '微信 App 支付', '1', + '2021-12-03 10:41:20', '1', '2021-12-03 10:41:20', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (116, 4, '支付宝 PC 网站支付', 'alipay_pc', 'pay_channel_code_type', 0, '', '', '支付宝 PC 网站支付', '1', + '2021-12-03 10:42:09', '1', '2021-12-03 10:42:09', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (117, 5, '支付宝 Wap 网站支付', 'alipay_wap', 'pay_channel_code_type', 0, '', '', '支付宝 Wap 网站支付', '1', + '2021-12-03 10:42:26', '1', '2021-12-03 10:42:26', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (118, 6, '支付宝App 支付', 'alipay_app', 'pay_channel_code_type', 0, '', '', '支付宝App 支付', '1', + '2021-12-03 10:42:55', '1', '2021-12-03 10:42:55', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (119, 7, '支付宝扫码支付', 'alipay_qr', 'pay_channel_code_type', 0, '', '', '支付宝扫码支付', '1', + '2021-12-03 10:43:10', '1', '2021-12-03 10:43:10', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (120, 1, '通知成功', '10', 'pay_order_notify_status', 0, 'success', '', '通知成功', '1', '2021-12-03 11:02:41', + '1', '2022-02-16 13:59:13', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (121, 2, '通知失败', '20', 'pay_order_notify_status', 0, 'danger', '', '通知失败', '1', '2021-12-03 11:02:59', + '1', '2022-02-16 13:59:17', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (122, 3, '未通知', '0', 'pay_order_notify_status', 0, 'info', '', '未通知', '1', '2021-12-03 11:03:10', '1', + '2022-02-16 13:59:23', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (123, 1, '支付成功', '10', 'pay_order_status', 0, 'success', '', '支付成功', '1', '2021-12-03 11:18:29', '1', + '2022-02-16 15:24:25', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (124, 2, '支付关闭', '20', 'pay_order_status', 0, 'danger', '', '支付关闭', '1', '2021-12-03 11:18:42', '1', + '2022-02-16 15:24:31', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (125, 3, '未支付', '0', 'pay_order_status', 0, 'info', '', '未支付', '1', '2021-12-03 11:18:18', '1', + '2022-02-16 15:24:35', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (126, 1, '未退款', '0', 'pay_order_refund_status', 0, '', '', '未退款', '1', '2021-12-03 11:30:35', '1', + '2021-12-03 11:34:05', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (127, 2, '部分退款', '10', 'pay_order_refund_status', 0, '', '', '部分退款', '1', '2021-12-03 11:30:44', '1', + '2021-12-03 11:34:10', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (128, 3, '全部退款', '20', 'pay_order_refund_status', 0, '', '', '全部退款', '1', '2021-12-03 11:30:52', '1', + '2021-12-03 11:34:14', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (1117, 1, '退款订单生成', '0', 'pay_refund_order_status', 0, 'primary', '', '退款订单生成', '1', + '2021-12-10 16:44:44', '1', '2022-02-16 14:05:24', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (1118, 2, '退款成功', '1', 'pay_refund_order_status', 0, 'success', '', '退款成功', '1', '2021-12-10 16:44:59', + '1', '2022-02-16 14:05:28', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (1119, 3, '退款失败', '2', 'pay_refund_order_status', 0, 'danger', '', '退款失败', '1', '2021-12-10 16:45:10', + '1', '2022-02-16 14:05:34', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (1124, 8, '退款关闭', '99', 'pay_refund_order_status', 0, 'info', '', '退款关闭', '1', '2021-12-10 16:46:26', + '1', '2022-02-16 14:05:40', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (1125, 0, '默认', '1', 'bpm_model_category', 0, 'primary', '', '流程分类 - 默认', '1', '2022-01-02 08:41:11', + '1', '2022-02-16 20:01:42', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (1126, 0, 'OA', '2', 'bpm_model_category', 0, 'success', '', '流程分类 - OA', '1', '2022-01-02 08:41:22', '1', + '2022-02-16 20:01:50', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (1127, 0, '进行中', '1', 'bpm_process_instance_status', 0, 'primary', '', '流程实例的状态 - 进行中', '1', + '2022-01-07 23:47:22', '1', '2022-02-16 20:07:49', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (1128, 2, '已完成', '2', 'bpm_process_instance_status', 0, 'success', '', '流程实例的状态 - 已完成', '1', + '2022-01-07 23:47:49', '1', '2022-02-16 20:07:54', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (1129, 1, '处理中', '1', 'bpm_process_instance_result', 0, 'primary', '', '流程实例的结果 - 处理中', '1', + '2022-01-07 23:48:32', '1', '2022-02-16 09:53:26', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (1130, 2, '通过', '2', 'bpm_process_instance_result', 0, 'success', '', '流程实例的结果 - 通过', '1', + '2022-01-07 23:48:45', '1', '2022-02-16 09:53:31', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (1131, 3, '不通过', '3', 'bpm_process_instance_result', 0, 'danger', '', '流程实例的结果 - 不通过', '1', + '2022-01-07 23:48:55', '1', '2022-02-16 09:53:38', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (1132, 4, '已取消', '4', 'bpm_process_instance_result', 0, 'info', '', '流程实例的结果 - 撤销', '1', + '2022-01-07 23:49:06', '1', '2022-02-16 09:53:42', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (1133, 10, '流程表单', '10', 'bpm_model_form_type', 0, '', '', '流程的表单类型 - 流程表单', '103', + '2022-01-11 23:51:30', '103', '2022-01-11 23:51:30', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (1134, 20, '业务表单', '20', 'bpm_model_form_type', 0, '', '', '流程的表单类型 - 业务表单', '103', + '2022-01-11 23:51:47', '103', '2022-01-11 23:51:47', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (1135, 10, '角色', '10', 'bpm_task_assign_rule_type', 0, 'info', '', '任务分配规则的类型 - 角色', '103', + '2022-01-12 23:21:22', '1', '2022-02-16 20:06:14', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (1136, 20, '部门的成员', '20', 'bpm_task_assign_rule_type', 0, 'primary', '', '任务分配规则的类型 - 部门的成员', + '103', '2022-01-12 23:21:47', '1', '2022-02-16 20:05:28', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (1137, 21, '部门的负责人', '21', 'bpm_task_assign_rule_type', 0, 'primary', '', + '任务分配规则的类型 - 部门的负责人', '103', '2022-01-12 23:33:36', '1', '2022-02-16 20:05:31', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (1138, 30, '用户', '30', 'bpm_task_assign_rule_type', 0, 'info', '', '任务分配规则的类型 - 用户', '103', + '2022-01-12 23:34:02', '1', '2022-02-16 20:05:50', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (1139, 40, '用户组', '40', 'bpm_task_assign_rule_type', 0, 'warning', '', '任务分配规则的类型 - 用户组', '103', + '2022-01-12 23:34:21', '1', '2022-02-16 20:05:57', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (1140, 50, '自定义脚本', '50', 'bpm_task_assign_rule_type', 0, 'danger', '', '任务分配规则的类型 - 自定义脚本', + '103', '2022-01-12 23:34:43', '1', '2022-02-16 20:06:01', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (1141, 22, '岗位', '22', 'bpm_task_assign_rule_type', 0, 'success', '', '任务分配规则的类型 - 岗位', '103', + '2022-01-14 18:41:55', '1', '2022-02-16 20:05:39', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (1142, 10, '流程发起人', '10', 'bpm_task_assign_script', 0, '', '', '任务分配自定义脚本 - 流程发起人', '103', + '2022-01-15 00:10:57', '103', '2022-01-15 21:24:10', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (1143, 20, '流程发起人的一级领导', '20', 'bpm_task_assign_script', 0, '', '', + '任务分配自定义脚本 - 流程发起人的一级领导', '103', '2022-01-15 21:24:31', '103', '2022-01-15 21:24:31', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (1144, 21, '流程发起人的二级领导', '21', 'bpm_task_assign_script', 0, '', '', + '任务分配自定义脚本 - 流程发起人的二级领导', '103', '2022-01-15 21:24:46', '103', '2022-01-15 21:24:57', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (1145, 1, '管理后台', '1', 'infra_codegen_scene', 0, '', '', '代码生成的场景枚举 - 管理后台', '1', + '2022-02-02 13:15:06', '1', '2022-03-10 16:32:59', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (1146, 2, '用户 APP', '2', 'infra_codegen_scene', 0, '', '', '代码生成的场景枚举 - 用户 APP', '1', + '2022-02-02 13:15:19', '1', '2022-03-10 16:33:03', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (1147, 0, '未退款', '0', 'pay_refund_order_type', 0, 'info', '', '退款类型 - 未退款', '1', '2022-02-16 14:09:01', + '1', '2022-02-16 14:09:01', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (1148, 10, '部分退款', '10', 'pay_refund_order_type', 0, 'success', '', '退款类型 - 部分退款', '1', + '2022-02-16 14:09:25', '1', '2022-02-16 14:11:38', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (1149, 20, '全部退款', '20', 'pay_refund_order_type', 0, 'warning', '', '退款类型 - 全部退款', '1', + '2022-02-16 14:11:33', '1', '2022-02-16 14:11:33', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (1150, 1, '数据库', '1', 'infra_file_storage', 0, 'default', '', NULL, '1', '2022-03-15 00:25:28', '1', + '2022-03-15 00:25:28', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (1151, 10, '本地磁盘', '10', 'infra_file_storage', 0, 'default', '', NULL, '1', '2022-03-15 00:25:41', '1', + '2022-03-15 00:25:56', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (1152, 11, 'FTP 服务器', '11', 'infra_file_storage', 0, 'default', '', NULL, '1', '2022-03-15 00:26:06', '1', + '2022-03-15 00:26:10', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (1153, 12, 'SFTP 服务器', '12', 'infra_file_storage', 0, 'default', '', NULL, '1', '2022-03-15 00:26:22', '1', + '2022-03-15 00:26:22', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (1154, 20, 'S3 对象存储', '20', 'infra_file_storage', 0, 'default', '', NULL, '1', '2022-03-15 00:26:31', '1', + '2022-03-15 00:26:45', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (1155, 103, '短信登录', '103', 'system_login_type', 0, 'default', '', NULL, '1', '2022-05-09 23:57:58', '1', + '2022-05-09 23:58:09', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (1156, 1, 'password', 'password', 'system_oauth2_grant_type', 0, 'default', '', '密码模式', '1', + '2022-05-12 00:22:05', '1', '2022-05-11 16:26:01', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (1157, 2, 'authorization_code', 'authorization_code', 'system_oauth2_grant_type', 0, 'primary', '', '授权码模式', + '1', '2022-05-12 00:22:59', '1', '2022-05-11 16:26:02', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (1158, 3, 'implicit', 'implicit', 'system_oauth2_grant_type', 0, 'success', '', '简化模式', '1', + '2022-05-12 00:23:40', '1', '2022-05-11 16:26:05', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (1159, 4, 'client_credentials', 'client_credentials', 'system_oauth2_grant_type', 0, 'default', '', '客户端模式', + '1', '2022-05-12 00:23:51', '1', '2022-05-11 16:26:08', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (1160, 5, 'refresh_token', 'refresh_token', 'system_oauth2_grant_type', 0, 'info', '', '刷新模式', '1', + '2022-05-12 00:24:02', '1', '2022-05-11 16:26:11', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (1161, 4, 'Vue 3 Vben', '30', 'infra_codegen_front_type', 0, '', '', '', '1', '2023-06-14 15:24:37.447', '1', + '2023-06-14 15:24:37.447', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (1162, 3, 'Vue 3 Schema', '21', 'infra_codegen_front_type', 0, '', '', 'Vue 3 Element Plus Schema', '1', + '2023-06-14 15:24:18.714', '1', '2023-06-14 15:36:40.317', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (1163, 2, 'Vue 3', '20', 'infra_codegen_front_type', 0, '', '', 'Vue 3 Element Plus', '1', + '2023-06-14 15:24:05.654', '1', '2023-06-14 15:24:05.654', 0); +INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", + "remark", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (1164, 1, 'Vue 2', '10', 'infra_codegen_front_type', 0, '', '', 'Vue 2', '1', '2023-06-14 15:23:12.211', '1', + '2023-06-14 15:23:57.816', 0); +COMMIT; + +-- ---------------------------- +-- Table structure for system_dict_type +-- ---------------------------- +DROP TABLE IF EXISTS "system_dict_type"; +CREATE TABLE "system_dict_type" +( + "id" int8 NOT NULL, + "name" varchar(100) COLLATE "pg_catalog"."default" NOT NULL, + "type" varchar(100) COLLATE "pg_catalog"."default" NOT NULL, + "status" int2 NOT NULL, + "remark" varchar(500) COLLATE "pg_catalog"."default", + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted_time" timestamp(6), + "deleted" int2 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "system_dict_type"."id" IS '字典主键'; +COMMENT +ON COLUMN "system_dict_type"."name" IS '字典名称'; +COMMENT +ON COLUMN "system_dict_type"."type" IS '字典类型'; +COMMENT +ON COLUMN "system_dict_type"."status" IS '状态(0正常 1停用)'; +COMMENT +ON COLUMN "system_dict_type"."remark" IS '备注'; +COMMENT +ON COLUMN "system_dict_type"."creator" IS '创建者'; +COMMENT +ON COLUMN "system_dict_type"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "system_dict_type"."updater" IS '更新者'; +COMMENT +ON COLUMN "system_dict_type"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "system_dict_type"."deleted_time" IS '删除时间'; +COMMENT +ON COLUMN "system_dict_type"."deleted" IS '是否删除'; +COMMENT +ON TABLE "system_dict_type" IS '字典类型表'; + +-- ---------------------------- +-- Records of system_dict_type +-- ---------------------------- +BEGIN; +INSERT INTO "system_dict_type" ("id", "name", "type", "status", "remark", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (1, '用户性别', 'system_user_sex', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:30:31', 0); +INSERT INTO "system_dict_type" ("id", "name", "type", "status", "remark", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (6, '参数类型', 'infra_config_type', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:36:54', 0); +INSERT INTO "system_dict_type" ("id", "name", "type", "status", "remark", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (7, '通知类型', 'system_notice_type', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:35:26', 0); +INSERT INTO "system_dict_type" ("id", "name", "type", "status", "remark", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (9, '操作类型', 'system_operate_type', 0, NULL, 'admin', '2021-01-05 17:03:48', '1', '2022-02-16 09:32:21', 0); +INSERT INTO "system_dict_type" ("id", "name", "type", "status", "remark", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (10, '系统状态', 'common_status', 0, NULL, 'admin', '2021-01-05 17:03:48', '', '2022-02-01 16:21:28', 0); +INSERT INTO "system_dict_type" ("id", "name", "type", "status", "remark", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (11, 'Boolean 是否类型', 'infra_boolean_string', 0, 'boolean 转是否', '', '2021-01-19 03:20:08', '', + '2022-02-01 16:37:10', 0); +INSERT INTO "system_dict_type" ("id", "name", "type", "status", "remark", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (104, '登陆结果', 'system_login_result', 0, '登陆结果', '', '2021-01-18 06:17:11', '', '2022-02-01 16:36:00', 0); +INSERT INTO "system_dict_type" ("id", "name", "type", "status", "remark", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (105, 'Redis 超时类型', 'infra_redis_timeout_type', 0, 'RedisKeyDefine.TimeoutTypeEnum', '', + '2021-01-26 00:52:50', '', '2022-02-01 16:50:29', 0); +INSERT INTO "system_dict_type" ("id", "name", "type", "status", "remark", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (106, '代码生成模板类型', 'infra_codegen_template_type', 0, NULL, '', '2021-02-05 07:08:06', '', + '2022-03-10 16:33:42', 0); +INSERT INTO "system_dict_type" ("id", "name", "type", "status", "remark", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (107, '定时任务状态', 'infra_job_status', 0, NULL, '', '2021-02-07 07:44:16', '', '2022-02-01 16:51:11', 0); +INSERT INTO "system_dict_type" ("id", "name", "type", "status", "remark", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (108, '定时任务日志状态', 'infra_job_log_status', 0, NULL, '', '2021-02-08 10:03:51', '', '2022-02-01 16:50:43', + 0); +INSERT INTO "system_dict_type" ("id", "name", "type", "status", "remark", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (109, '用户类型', 'user_type', 0, NULL, '', '2021-02-26 00:15:51', '', '2021-02-26 00:15:51', 0); +INSERT INTO "system_dict_type" ("id", "name", "type", "status", "remark", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (110, 'API 异常数据的处理状态', 'infra_api_error_log_process_status', 0, NULL, '', '2021-02-26 07:07:01', '', + '2022-02-01 16:50:53', 0); +INSERT INTO "system_dict_type" ("id", "name", "type", "status", "remark", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (111, '短信渠道编码', 'system_sms_channel_code', 0, NULL, '1', '2021-04-05 01:04:50', '1', '2022-02-16 02:09:08', + 0); +INSERT INTO "system_dict_type" ("id", "name", "type", "status", "remark", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (112, '短信模板的类型', 'system_sms_template_type', 0, NULL, '1', '2021-04-05 21:50:43', '1', + '2022-02-01 16:35:06', 0); +INSERT INTO "system_dict_type" ("id", "name", "type", "status", "remark", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (113, '短信发送状态', 'system_sms_send_status', 0, NULL, '1', '2021-04-11 20:18:03', '1', '2022-02-01 16:35:09', + 0); +INSERT INTO "system_dict_type" ("id", "name", "type", "status", "remark", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (114, '短信接收状态', 'system_sms_receive_status', 0, NULL, '1', '2021-04-11 20:27:14', '1', + '2022-02-01 16:35:14', 0); +INSERT INTO "system_dict_type" ("id", "name", "type", "status", "remark", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (115, '错误码的类型', 'system_error_code_type', 0, NULL, '1', '2021-04-21 00:06:30', '1', '2022-02-01 16:36:49', + 0); +INSERT INTO "system_dict_type" ("id", "name", "type", "status", "remark", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (116, '登陆日志的类型', 'system_login_type', 0, '登陆日志的类型', '1', '2021-10-06 00:50:46', '1', + '2022-02-01 16:35:56', 0); +INSERT INTO "system_dict_type" ("id", "name", "type", "status", "remark", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (117, 'OA 请假类型', 'bpm_oa_leave_type', 0, NULL, '1', '2021-09-21 22:34:33', '1', '2022-01-22 10:41:37', 0); +INSERT INTO "system_dict_type" ("id", "name", "type", "status", "remark", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (122, '支付渠道微信版本', 'pay_channel_wechat_version', 0, '支付渠道微信版本', '1', '2021-11-08 17:00:26', '1', + '2021-11-08 17:00:26', 0); +INSERT INTO "system_dict_type" ("id", "name", "type", "status", "remark", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (127, '支付渠道支付宝算法类型', 'pay_channel_alipay_sign_type', 0, '支付渠道支付宝算法类型', '1', + '2021-11-18 15:39:09', '1', '2021-11-18 15:39:09', 0); +INSERT INTO "system_dict_type" ("id", "name", "type", "status", "remark", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (128, '支付渠道支付宝公钥类型', 'pay_channel_alipay_mode', 0, '支付渠道支付宝公钥类型', '1', + '2021-11-18 15:44:28', '1', '2021-11-18 15:44:28', 0); +INSERT INTO "system_dict_type" ("id", "name", "type", "status", "remark", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (129, '支付宝网关地址', 'pay_channel_alipay_server_type', 0, '支付宝网关地址', '1', '2021-11-18 16:58:55', '1', + '2021-11-18 17:01:34', 0); +INSERT INTO "system_dict_type" ("id", "name", "type", "status", "remark", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (130, '支付渠道编码类型', 'pay_channel_code_type', 0, '支付渠道的编码', '1', '2021-12-03 10:35:08', '1', + '2021-12-03 10:35:08', 0); +INSERT INTO "system_dict_type" ("id", "name", "type", "status", "remark", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (131, '支付订单回调状态', 'pay_order_notify_status', 0, '支付订单回调状态', '1', '2021-12-03 10:53:29', '1', + '2021-12-03 10:53:29', 0); +INSERT INTO "system_dict_type" ("id", "name", "type", "status", "remark", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (132, '支付订单状态', 'pay_order_status', 0, '支付订单状态', '1', '2021-12-03 11:17:50', '1', + '2021-12-03 11:17:50', 0); +INSERT INTO "system_dict_type" ("id", "name", "type", "status", "remark", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (133, '支付订单退款状态', 'pay_order_refund_status', 0, '支付订单退款状态', '1', '2021-12-03 11:27:31', '1', + '2021-12-03 11:27:31', 0); +INSERT INTO "system_dict_type" ("id", "name", "type", "status", "remark", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (134, '退款订单状态', 'pay_refund_order_status', 0, '退款订单状态', '1', '2021-12-10 16:42:50', '1', + '2021-12-10 16:42:50', 0); +INSERT INTO "system_dict_type" ("id", "name", "type", "status", "remark", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (135, '退款订单类别', 'pay_refund_order_type', 0, '退款订单类别', '1', '2021-12-10 17:14:53', '1', + '2021-12-10 17:14:53', 0); +INSERT INTO "system_dict_type" ("id", "name", "type", "status", "remark", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (138, '流程分类', 'bpm_model_category', 0, '流程分类', '1', '2022-01-02 08:40:45', '1', '2022-01-02 08:40:45', + 0); +INSERT INTO "system_dict_type" ("id", "name", "type", "status", "remark", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (139, '流程实例的状态', 'bpm_process_instance_status', 0, '流程实例的状态', '1', '2022-01-07 23:46:42', '1', + '2022-01-07 23:46:42', 0); +INSERT INTO "system_dict_type" ("id", "name", "type", "status", "remark", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (140, '流程实例的结果', 'bpm_process_instance_result', 0, '流程实例的结果', '1', '2022-01-07 23:48:10', '1', + '2022-01-07 23:48:10', 0); +INSERT INTO "system_dict_type" ("id", "name", "type", "status", "remark", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (141, '流程的表单类型', 'bpm_model_form_type', 0, '流程的表单类型', '103', '2022-01-11 23:50:45', '103', + '2022-01-11 23:50:45', 0); +INSERT INTO "system_dict_type" ("id", "name", "type", "status", "remark", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (142, '任务分配规则的类型', 'bpm_task_assign_rule_type', 0, '任务分配规则的类型', '103', '2022-01-12 23:21:04', + '103', '2022-01-12 15:46:10', 0); +INSERT INTO "system_dict_type" ("id", "name", "type", "status", "remark", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (143, '任务分配自定义脚本', 'bpm_task_assign_script', 0, '任务分配自定义脚本', '103', '2022-01-15 00:10:35', + '103', '2022-01-15 00:10:35', 0); +INSERT INTO "system_dict_type" ("id", "name", "type", "status", "remark", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (144, '代码生成的场景枚举', 'infra_codegen_scene', 0, '代码生成的场景枚举', '1', '2022-02-02 13:14:45', '1', + '2022-03-10 16:33:46', 0); +INSERT INTO "system_dict_type" ("id", "name", "type", "status", "remark", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (145, '角色类型', 'system_role_type', 0, '角色类型', '1', '2022-02-16 13:01:46', '1', '2022-02-16 13:01:46', 0); +INSERT INTO "system_dict_type" ("id", "name", "type", "status", "remark", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (146, '文件存储器', 'infra_file_storage', 0, '文件存储器', '1', '2022-03-15 00:24:38', '1', + '2022-03-15 00:24:38', 0); +INSERT INTO "system_dict_type" ("id", "name", "type", "status", "remark", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (147, 'OAuth 2.0 授权类型', 'system_oauth2_grant_type', 0, 'OAuth 2.0 授权类型(模式)', '1', + '2022-05-12 00:20:52', '1', '2022-05-11 16:25:49', 0); +INSERT INTO "system_dict_type" ("id", "name", "type", "status", "remark", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (148, '生成前端代码类型', 'infra_codegen_front_type', 0, '生成前端代码类型', '1', '2023-6-14 16:07:35', '1', + '2023-6-14 16:07:39', 0); +COMMIT; + +-- ---------------------------- +-- Table structure for system_error_code +-- ---------------------------- +DROP TABLE IF EXISTS "system_error_code"; +CREATE TABLE "system_error_code" +( + "id" int8 NOT NULL, + "type" int2 NOT NULL, + "application_name" varchar(50) COLLATE "pg_catalog"."default" NOT NULL, + "code" int4 NOT NULL, + "message" varchar(512) COLLATE "pg_catalog"."default" NOT NULL, + "memo" varchar(512) COLLATE "pg_catalog"."default", + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "system_error_code"."id" IS '错误码编号'; +COMMENT +ON COLUMN "system_error_code"."type" IS '错误码类型'; +COMMENT +ON COLUMN "system_error_code"."application_name" IS '应用名'; +COMMENT +ON COLUMN "system_error_code"."code" IS '错误码编码'; +COMMENT +ON COLUMN "system_error_code"."message" IS '错误码错误提示'; +COMMENT +ON COLUMN "system_error_code"."memo" IS '备注'; +COMMENT +ON COLUMN "system_error_code"."creator" IS '创建者'; +COMMENT +ON COLUMN "system_error_code"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "system_error_code"."updater" IS '更新者'; +COMMENT +ON COLUMN "system_error_code"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "system_error_code"."deleted" IS '是否删除'; +COMMENT +ON TABLE "system_error_code" IS '错误码表'; + +-- ---------------------------- +-- Records of system_error_code +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for system_login_log +-- ---------------------------- +DROP TABLE IF EXISTS "system_login_log"; +CREATE TABLE "system_login_log" +( + "id" int8 NOT NULL, + "log_type" int8 NOT NULL, + "trace_id" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "user_id" int8 NOT NULL DEFAULT 0, + "user_type" int2 NOT NULL, + "username" varchar(50) COLLATE "pg_catalog"."default" NOT NULL, + "result" int2 NOT NULL, + "user_ip" varchar(50) COLLATE "pg_catalog"."default" NOT NULL, + "user_agent" varchar(512) COLLATE "pg_catalog"."default" NOT NULL, + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0, + "tenant_id" int8 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "system_login_log"."id" IS '访问ID'; +COMMENT +ON COLUMN "system_login_log"."log_type" IS '日志类型'; +COMMENT +ON COLUMN "system_login_log"."trace_id" IS '链路追踪编号'; +COMMENT +ON COLUMN "system_login_log"."user_id" IS '用户编号'; +COMMENT +ON COLUMN "system_login_log"."user_type" IS '用户类型'; +COMMENT +ON COLUMN "system_login_log"."username" IS '用户账号'; +COMMENT +ON COLUMN "system_login_log"."result" IS '登陆结果'; +COMMENT +ON COLUMN "system_login_log"."user_ip" IS '用户 IP'; +COMMENT +ON COLUMN "system_login_log"."user_agent" IS '浏览器 UA'; +COMMENT +ON COLUMN "system_login_log"."creator" IS '创建者'; +COMMENT +ON COLUMN "system_login_log"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "system_login_log"."updater" IS '更新者'; +COMMENT +ON COLUMN "system_login_log"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "system_login_log"."deleted" IS '是否删除'; +COMMENT +ON COLUMN "system_login_log"."tenant_id" IS '租户编号'; +COMMENT +ON TABLE "system_login_log" IS '系统访问记录'; + +-- ---------------------------- +-- Records of system_login_log +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for system_menu +-- ---------------------------- +DROP TABLE IF EXISTS "system_menu"; +CREATE TABLE "system_menu" +( + "id" int8 NOT NULL DEFAULT nextval('system_menu_seq'::regclass), + "name" varchar(50) COLLATE "pg_catalog"."default" NOT NULL, + "permission" varchar(100) COLLATE "pg_catalog"."default" NOT NULL, + "type" int2 NOT NULL, + "sort" int4 NOT NULL, + "parent_id" int8 NOT NULL, + "path" varchar(200) COLLATE "pg_catalog"."default", + "icon" varchar(100) COLLATE "pg_catalog"."default", + "component" varchar(255) COLLATE "pg_catalog"."default", + "status" int2 NOT NULL, + "visible" bool NOT NULL DEFAULT true, + "keep_alive" bool NOT NULL DEFAULT false, + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), + "deleted" int2 NOT NULL DEFAULT 0, + "component_name" varchar(255) COLLATE "pg_catalog"."default", + "always_show" bool NOT NULL DEFAULT false +) +; +COMMENT +ON COLUMN "system_menu"."id" IS '菜单ID'; +COMMENT +ON COLUMN "system_menu"."name" IS '菜单名称'; +COMMENT +ON COLUMN "system_menu"."permission" IS '权限标识'; +COMMENT +ON COLUMN "system_menu"."type" IS '菜单类型'; +COMMENT +ON COLUMN "system_menu"."sort" IS '显示顺序'; +COMMENT +ON COLUMN "system_menu"."parent_id" IS '父菜单ID'; +COMMENT +ON COLUMN "system_menu"."path" IS '路由地址'; +COMMENT +ON COLUMN "system_menu"."icon" IS '菜单图标'; +COMMENT +ON COLUMN "system_menu"."component" IS '组件路径'; +COMMENT +ON COLUMN "system_menu"."status" IS '菜单状态'; +COMMENT +ON COLUMN "system_menu"."visible" IS '是否可见'; +COMMENT +ON COLUMN "system_menu"."keep_alive" IS '是否缓存'; +COMMENT +ON COLUMN "system_menu"."creator" IS '创建者'; +COMMENT +ON COLUMN "system_menu"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "system_menu"."updater" IS '更新者'; +COMMENT +ON COLUMN "system_menu"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "system_menu"."deleted" IS '是否删除'; +COMMENT +ON COLUMN "system_menu"."component_name" IS '组件名称'; +COMMENT +ON COLUMN "system_menu"."always_show" IS '是否总是显示'; +COMMENT +ON TABLE "system_menu" IS '菜单权限表'; + +ALTER TABLE system_menu + ALTER COLUMN permission SET DEFAULT ''; +-- ---------------------------- +-- Records of system_menu +-- ---------------------------- +BEGIN; +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1, '系统管理', '', 1, 10, 0, '/system', 'system', NULL, 0, 't', 't', 'admin', '2021-01-05 17:03:48', '1', + '2022-05-13 01:02:57.073', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (2, '基础设施', '', 1, 20, 0, '/infra', 'monitor', NULL, 0, 't', 't', 'admin', '2021-01-05 17:03:48', '1', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (5, 'OA 示例', '', 1, 40, 1185, 'oa', 'people', NULL, 0, 't', 't', 'admin', '2021-09-20 16:26:19', '1', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (100, '用户管理', 'system:user:list', 2, 1, 1, 'user', 'user', 'system/user/index', 0, 't', 't', 'admin', + '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', 0, 'User', '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (101, '角色管理', '', 2, 2, 1, 'role', 'peoples', 'system/role/index', 0, 't', 't', 'admin', + '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (102, '菜单管理', '', 2, 3, 1, 'menu', 'tree-table', 'system/menu/index', 0, 't', 't', 'admin', + '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (103, '部门管理', '', 2, 4, 1, 'dept', 'tree', 'system/dept/index', 0, 't', 't', 'admin', '2021-01-05 17:03:48', + '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (104, '岗位管理', '', 2, 5, 1, 'post', 'post', 'system/post/index', 0, 't', 't', 'admin', '2021-01-05 17:03:48', + '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (105, '字典管理', '', 2, 6, 1, 'dict', 'dict', 'system/dict/index', 0, 't', 't', 'admin', '2021-01-05 17:03:48', + '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (106, '配置管理', '', 2, 6, 2, 'config', 'edit', 'infra/config/index', 0, 't', 't', 'admin', + '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (107, '通知公告', '', 2, 8, 1, 'notice', 'message', 'system/notice/index', 0, 't', 't', 'admin', + '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (108, '审计日志', '', 1, 9, 1, 'log', 'log', '', 0, 't', 't', 'admin', '2021-01-05 17:03:48', '1', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (109, '令牌管理', '', 2, 2, 1261, 'token', 'online', 'system/oauth2/token/index', 0, 't', 't', 'admin', + '2021-01-05 17:03:48', '1', '2022-05-11 23:31:42', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (110, '定时任务', '', 2, 12, 2, 'job', 'job', 'infra/job/index', 0, 't', 't', 'admin', '2021-01-05 17:03:48', + '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (111, 'MySQL 监控', '', 2, 9, 2, 'druid', 'druid', 'infra/druid/index', 0, 't', 't', 'admin', + '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (112, 'Java 监控', '', 2, 11, 2, 'admin-server', 'server', 'infra/server/index', 0, 't', 't', 'admin', + '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (113, 'Redis 监控', '', 2, 10, 2, 'redis', 'redis', 'infra/redis/index', 0, 't', 't', 'admin', + '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (114, '表单构建', 'infra:build:list', 2, 2, 2, 'build', 'build', 'infra/build/index', 0, 't', 't', 'admin', + '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (115, '代码生成', 'infra:codegen:query', 2, 1, 2, 'codegen', 'code', 'infra/codegen/index', 0, 't', 't', 'admin', + '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (116, '系统接口', 'infra:swagger:list', 2, 3, 2, 'swagger', 'swagger', 'infra/swagger/index', 0, 't', 't', + 'admin', '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (500, '操作日志', '', 2, 1, 108, 'operate-log', 'form', 'system/operatelog/index', 0, 't', 't', 'admin', + '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (501, '登录日志', '', 2, 2, 108, 'login-log', 'logininfor', 'system/loginlog/index', 0, 't', 't', 'admin', + '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1001, '用户查询', 'system:user:query', 3, 1, 100, '', '#', '', 0, 't', 't', 'admin', '2021-01-05 17:03:48', '', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1002, '用户新增', 'system:user:create', 3, 2, 100, '', '', '', 0, 't', 't', 'admin', '2021-01-05 17:03:48', '1', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1003, '用户修改', 'system:user:update', 3, 3, 100, '', '', '', 0, 't', 't', 'admin', '2021-01-05 17:03:48', '1', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1004, '用户删除', 'system:user:delete', 3, 4, 100, '', '', '', 0, 't', 't', 'admin', '2021-01-05 17:03:48', '1', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1005, '用户导出', 'system:user:export', 3, 5, 100, '', '#', '', 0, 't', 't', 'admin', '2021-01-05 17:03:48', '', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1006, '用户导入', 'system:user:import', 3, 6, 100, '', '#', '', 0, 't', 't', 'admin', '2021-01-05 17:03:48', '', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1007, '重置密码', 'system:user:update-password', 3, 7, 100, '', '', '', 0, 't', 't', 'admin', + '2021-01-05 17:03:48', '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1008, '角色查询', 'system:role:query', 3, 1, 101, '', '#', '', 0, 't', 't', 'admin', '2021-01-05 17:03:48', '', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1009, '角色新增', 'system:role:create', 3, 2, 101, '', '', '', 0, 't', 't', 'admin', '2021-01-05 17:03:48', '1', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1010, '角色修改', 'system:role:update', 3, 3, 101, '', '', '', 0, 't', 't', 'admin', '2021-01-05 17:03:48', '1', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1011, '角色删除', 'system:role:delete', 3, 4, 101, '', '', '', 0, 't', 't', 'admin', '2021-01-05 17:03:48', '1', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1012, '角色导出', 'system:role:export', 3, 5, 101, '', '#', '', 0, 't', 't', 'admin', '2021-01-05 17:03:48', '', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1013, '菜单查询', 'system:menu:query', 3, 1, 102, '', '#', '', 0, 't', 't', 'admin', '2021-01-05 17:03:48', '', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1014, '菜单新增', 'system:menu:create', 3, 2, 102, '', '#', '', 0, 't', 't', 'admin', '2021-01-05 17:03:48', '', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1015, '菜单修改', 'system:menu:update', 3, 3, 102, '', '#', '', 0, 't', 't', 'admin', '2021-01-05 17:03:48', '', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1016, '菜单删除', 'system:menu:delete', 3, 4, 102, '', '#', '', 0, 't', 't', 'admin', '2021-01-05 17:03:48', '', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1017, '部门查询', 'system:dept:query', 3, 1, 103, '', '#', '', 0, 't', 't', 'admin', '2021-01-05 17:03:48', '', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1018, '部门新增', 'system:dept:create', 3, 2, 103, '', '', '', 0, 't', 't', 'admin', '2021-01-05 17:03:48', '1', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1019, '部门修改', 'system:dept:update', 3, 3, 103, '', '', '', 0, 't', 't', 'admin', '2021-01-05 17:03:48', '1', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1020, '部门删除', 'system:dept:delete', 3, 4, 103, '', '', '', 0, 't', 't', 'admin', '2021-01-05 17:03:48', '1', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1021, '岗位查询', 'system:post:query', 3, 1, 104, '', '#', '', 0, 't', 't', 'admin', '2021-01-05 17:03:48', '', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1022, '岗位新增', 'system:post:create', 3, 2, 104, '', '', '', 0, 't', 't', 'admin', '2021-01-05 17:03:48', '1', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1023, '岗位修改', 'system:post:update', 3, 3, 104, '', '', '', 0, 't', 't', 'admin', '2021-01-05 17:03:48', '1', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1024, '岗位删除', 'system:post:delete', 3, 4, 104, '', '', '', 0, 't', 't', 'admin', '2021-01-05 17:03:48', '1', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1025, '岗位导出', 'system:post:export', 3, 5, 104, '', '#', '', 0, 't', 't', 'admin', '2021-01-05 17:03:48', '', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1026, '字典查询', 'system:dict:query', 3, 1, 105, '#', '#', '', 0, 't', 't', 'admin', '2021-01-05 17:03:48', '', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1027, '字典新增', 'system:dict:create', 3, 2, 105, '', '', '', 0, 't', 't', 'admin', '2021-01-05 17:03:48', '1', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1028, '字典修改', 'system:dict:update', 3, 3, 105, '', '', '', 0, 't', 't', 'admin', '2021-01-05 17:03:48', '1', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1029, '字典删除', 'system:dict:delete', 3, 4, 105, '', '', '', 0, 't', 't', 'admin', '2021-01-05 17:03:48', '1', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1030, '字典导出', 'system:dict:export', 3, 5, 105, '#', '#', '', 0, 't', 't', 'admin', '2021-01-05 17:03:48', + '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1031, '配置查询', 'infra:config:query', 3, 1, 106, '', '', '', 0, 't', 't', 'admin', '2021-01-05 17:03:48', '', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1032, '配置新增', 'infra:config:create', 3, 2, 106, '', '', '', 0, 't', 't', 'admin', '2021-01-05 17:03:48', + '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1033, '配置修改', 'infra:config:update', 3, 3, 106, '', '', '', 0, 't', 't', 'admin', '2021-01-05 17:03:48', + '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1034, '配置删除', 'infra:config:delete', 3, 4, 106, '', '', '', 0, 't', 't', 'admin', '2021-01-05 17:03:48', + '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1035, '配置导出', 'infra:config:export', 3, 5, 106, '', '', '', 0, 't', 't', 'admin', '2021-01-05 17:03:48', '', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1036, '公告查询', 'system:notice:query', 3, 1, 107, '#', '#', '', 0, 't', 't', 'admin', '2021-01-05 17:03:48', + '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1037, '公告新增', 'system:notice:create', 3, 2, 107, '', '', '', 0, 't', 't', 'admin', '2021-01-05 17:03:48', + '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1038, '公告修改', 'system:notice:update', 3, 3, 107, '', '', '', 0, 't', 't', 'admin', '2021-01-05 17:03:48', + '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1039, '公告删除', 'system:notice:delete', 3, 4, 107, '', '', '', 0, 't', 't', 'admin', '2021-01-05 17:03:48', + '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1040, '操作查询', 'system:operate-log:query', 3, 1, 500, '', '', '', 0, 't', 't', 'admin', + '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1042, '日志导出', 'system:operate-log:export', 3, 2, 500, '', '', '', 0, 't', 't', 'admin', + '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1043, '登录查询', 'system:login-log:query', 3, 1, 501, '#', '#', '', 0, 't', 't', 'admin', + '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1045, '日志导出', 'system:login-log:export', 3, 3, 501, '#', '#', '', 0, 't', 't', 'admin', + '2021-01-05 17:03:48', '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1046, '令牌列表', 'system:oauth2-token:page', 3, 1, 109, '', '', '', 0, 't', 't', 'admin', + '2021-01-05 17:03:48', '1', '2022-05-09 23:54:42', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1048, '令牌删除', 'system:oauth2-token:delete', 3, 2, 109, '', '', '', 0, 't', 't', 'admin', + '2021-01-05 17:03:48', '1', '2022-05-09 23:54:53', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1050, '任务新增', 'infra:job:create', 3, 2, 110, '', '', '', 0, 't', 't', 'admin', '2021-01-05 17:03:48', '', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1051, '任务修改', 'infra:job:update', 3, 3, 110, '', '', '', 0, 't', 't', 'admin', '2021-01-05 17:03:48', '', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1052, '任务删除', 'infra:job:delete', 3, 4, 110, '', '', '', 0, 't', 't', 'admin', '2021-01-05 17:03:48', '', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1053, '状态修改', 'infra:job:update', 3, 5, 110, '', '', '', 0, 't', 't', 'admin', '2021-01-05 17:03:48', '', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1054, '任务导出', 'infra:job:export', 3, 7, 110, '', '', '', 0, 't', 't', 'admin', '2021-01-05 17:03:48', '', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1056, '生成修改', 'infra:codegen:update', 3, 2, 115, '', '', '', 0, 't', 't', 'admin', '2021-01-05 17:03:48', + '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1057, '生成删除', 'infra:codegen:delete', 3, 3, 115, '', '', '', 0, 't', 't', 'admin', '2021-01-05 17:03:48', + '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1058, '导入代码', 'infra:codegen:create', 3, 2, 115, '', '', '', 0, 't', 't', 'admin', '2021-01-05 17:03:48', + '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1059, '预览代码', 'infra:codegen:preview', 3, 4, 115, '', '', '', 0, 't', 't', 'admin', '2021-01-05 17:03:48', + '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1060, '生成代码', 'infra:codegen:download', 3, 5, 115, '', '', '', 0, 't', 't', 'admin', '2021-01-05 17:03:48', + '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1063, '设置角色菜单权限', 'system:permission:assign-role-menu', 3, 6, 101, '', '', '', 0, 't', 't', '', + '2021-01-06 17:53:44', '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1064, '设置角色数据权限', 'system:permission:assign-role-data-scope', 3, 7, 101, '', '', '', 0, 't', 't', '', + '2021-01-06 17:56:31', '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1065, '设置用户角色', 'system:permission:assign-user-role', 3, 8, 101, '', '', '', 0, 't', 't', '', + '2021-01-07 10:23:28', '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1066, '获得 Redis 监控信息', 'infra:redis:get-monitor-info', 3, 1, 113, '', '', '', 0, 't', 't', '', + '2021-01-26 01:02:31', '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1067, '获得 Redis Key 列表', 'infra:redis:get-key-list', 3, 2, 113, '', '', '', 0, 't', 't', '', + '2021-01-26 01:02:52', '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1070, '代码生成示例', 'infra:test-demo:query', 2, 1, 2, 'test-demo', 'validCode', 'infra/testDemo/index', 0, + 't', 't', '', '2021-02-06 12:42:49', '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1071, '测试示例表创建', 'infra:test-demo:create', 3, 1, 1070, '', '', '', 0, 't', 't', '', + '2021-02-06 12:42:49', '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1072, '测试示例表更新', 'infra:test-demo:update', 3, 2, 1070, '', '', '', 0, 't', 't', '', + '2021-02-06 12:42:49', '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1073, '测试示例表删除', 'infra:test-demo:delete', 3, 3, 1070, '', '', '', 0, 't', 't', '', + '2021-02-06 12:42:49', '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1074, '测试示例表导出', 'infra:test-demo:export', 3, 4, 1070, '', '', '', 0, 't', 't', '', + '2021-02-06 12:42:49', '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1075, '任务触发', 'infra:job:trigger', 3, 8, 110, '', '', '', 0, 't', 't', '', '2021-02-07 13:03:10', '', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1076, '数据库文档', '', 2, 4, 2, 'db-doc', 'table', 'infra/dbDoc/index', 0, 't', 't', '', '2021-02-08 01:41:47', + '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1077, '监控平台', '', 2, 13, 2, 'skywalking', 'eye-open', 'infra/skywalking/index', 0, 't', 't', '', + '2021-02-08 20:41:31', '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1078, '访问日志', '', 2, 1, 1083, 'api-access-log', 'log', 'infra/apiAccessLog/index', 0, 't', 't', '', + '2021-02-26 01:32:59', '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1082, '日志导出', 'infra:api-access-log:export', 3, 2, 1078, '', '', '', 0, 't', 't', '', '2021-02-26 01:32:59', + '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1083, 'API 日志', '', 2, 8, 2, 'log', 'log', NULL, 0, 't', 't', '', '2021-02-26 02:18:24', '1', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1084, '错误日志', 'infra:api-error-log:query', 2, 2, 1083, 'api-error-log', 'log', 'infra/apiErrorLog/index', 0, + 't', 't', '', '2021-02-26 07:53:20', '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1085, '日志处理', 'infra:api-error-log:update-status', 3, 2, 1084, '', '', '', 0, 't', 't', '', + '2021-02-26 07:53:20', '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1086, '日志导出', 'infra:api-error-log:export', 3, 3, 1084, '', '', '', 0, 't', 't', '', '2021-02-26 07:53:20', + '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1087, '任务查询', 'infra:job:query', 3, 1, 110, '', '', '', 0, 't', 't', '1', '2021-03-10 01:26:19', '1', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1088, '日志查询', 'infra:api-access-log:query', 3, 1, 1078, '', '', '', 0, 't', 't', '1', '2021-03-10 01:28:04', + '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1089, '日志查询', 'infra:api-error-log:query', 3, 1, 1084, '', '', '', 0, 't', 't', '1', '2021-03-10 01:29:09', + '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1090, '文件列表', '', 2, 5, 1243, 'file', 'upload', 'infra/file/index', 0, 't', 't', '', '2021-03-12 20:16:20', + '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1091, '文件查询', 'infra:file:query', 3, 1, 1090, '', '', '', 0, 't', 't', '', '2021-03-12 20:16:20', '', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1092, '文件删除', 'infra:file:delete', 3, 4, 1090, '', '', '', 0, 't', 't', '', '2021-03-12 20:16:20', '', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1093, '短信管理', '', 1, 11, 1, 'sms', 'validCode', NULL, 0, 't', 't', '1', '2021-04-05 01:10:16', '1', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1094, '短信渠道', '', 2, 0, 1093, 'sms-channel', 'phone', 'system/sms/channel', 0, 't', 't', '', + '2021-04-01 11:07:15', '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1095, '短信渠道查询', 'system:sms-channel:query', 3, 1, 1094, '', '', '', 0, 't', 't', '', + '2021-04-01 11:07:15', '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1096, '短信渠道创建', 'system:sms-channel:create', 3, 2, 1094, '', '', '', 0, 't', 't', '', + '2021-04-01 11:07:15', '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1097, '短信渠道更新', 'system:sms-channel:update', 3, 3, 1094, '', '', '', 0, 't', 't', '', + '2021-04-01 11:07:15', '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1098, '短信渠道删除', 'system:sms-channel:delete', 3, 4, 1094, '', '', '', 0, 't', 't', '', + '2021-04-01 11:07:15', '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1100, '短信模板', '', 2, 1, 1093, 'sms-template', 'phone', 'system/sms/template', 0, 't', 't', '', + '2021-04-01 17:35:17', '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1101, '短信模板查询', 'system:sms-template:query', 3, 1, 1100, '', '', '', 0, 't', 't', '', + '2021-04-01 17:35:17', '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1102, '短信模板创建', 'system:sms-template:create', 3, 2, 1100, '', '', '', 0, 't', 't', '', + '2021-04-01 17:35:17', '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1103, '短信模板更新', 'system:sms-template:update', 3, 3, 1100, '', '', '', 0, 't', 't', '', + '2021-04-01 17:35:17', '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1104, '短信模板删除', 'system:sms-template:delete', 3, 4, 1100, '', '', '', 0, 't', 't', '', + '2021-04-01 17:35:17', '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1105, '短信模板导出', 'system:sms-template:export', 3, 5, 1100, '', '', '', 0, 't', 't', '', + '2021-04-01 17:35:17', '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1106, '发送测试短信', 'system:sms-template:send-sms', 3, 6, 1100, '', '', '', 0, 't', 't', '1', + '2021-04-11 00:26:40', '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1107, '短信日志', '', 2, 2, 1093, 'sms-log', 'phone', 'system/sms/log', 0, 't', 't', '', '2021-04-11 08:37:05', + '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1108, '短信日志查询', 'system:sms-log:query', 3, 1, 1107, '', '', '', 0, 't', 't', '', '2021-04-11 08:37:05', + '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1109, '短信日志导出', 'system:sms-log:export', 3, 5, 1107, '', '', '', 0, 't', 't', '', '2021-04-11 08:37:05', + '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1110, '错误码管理', '', 2, 12, 1, 'error-code', 'code', 'system/errorCode/index', 0, 't', 't', '', + '2021-04-13 21:46:42', '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1111, '错误码查询', 'system:error-code:query', 3, 1, 1110, '', '', '', 0, 't', 't', '', '2021-04-13 21:46:42', + '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1112, '错误码创建', 'system:error-code:create', 3, 2, 1110, '', '', '', 0, 't', 't', '', '2021-04-13 21:46:42', + '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1113, '错误码更新', 'system:error-code:update', 3, 3, 1110, '', '', '', 0, 't', 't', '', '2021-04-13 21:46:42', + '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1114, '错误码删除', 'system:error-code:delete', 3, 4, 1110, '', '', '', 0, 't', 't', '', '2021-04-13 21:46:42', + '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1115, '错误码导出', 'system:error-code:export', 3, 5, 1110, '', '', '', 0, 't', 't', '', '2021-04-13 21:46:42', + '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1117, '支付管理', '', 1, 11, 0, '/pay', 'money', NULL, 0, 't', 't', '1', '2021-12-25 16:43:41', '1', + '2022-05-13 01:02:25.244', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1118, '请假查询', '', 2, 0, 5, 'leave', 'user', 'bpm/oa/leave/index', 0, 't', 't', '', '2021-09-20 08:51:03', + '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1119, '请假申请查询', 'bpm:oa-leave:query', 3, 1, 1118, '', '', '', 0, 't', 't', '', '2021-09-20 08:51:03', '1', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1120, '请假申请创建', 'bpm:oa-leave:create', 3, 2, 1118, '', '', '', 0, 't', 't', '', '2021-09-20 08:51:03', + '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1126, '应用信息', '', 2, 1, 1117, 'app', 'table', 'pay/app/index', 0, 't', 't', '', '2021-11-10 01:13:30', '1', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1127, '支付应用信息查询', 'pay:app:query', 3, 1, 1126, '', '', '', 0, 't', 't', '', '2021-11-10 01:13:31', '', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1128, '支付应用信息创建', 'pay:app:create', 3, 2, 1126, '', '', '', 0, 't', 't', '', '2021-11-10 01:13:31', '', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1129, '支付应用信息更新', 'pay:app:update', 3, 3, 1126, '', '', '', 0, 't', 't', '', '2021-11-10 01:13:31', '', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1130, '支付应用信息删除', 'pay:app:delete', 3, 4, 1126, '', '', '', 0, 't', 't', '', '2021-11-10 01:13:31', '', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1131, '支付应用信息导出', 'pay:app:export', 3, 5, 1126, '', '', '', 0, 't', 't', '', '2021-11-10 01:13:31', '', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1132, '秘钥解析', 'pay:channel:parsing', 3, 6, 1129, '', '', '', 0, 't', 't', '1', '2021-11-08 15:15:47', '1', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1133, '支付商户信息查询', 'pay:merchant:query', 3, 1, 1132, '', '', '', 0, 't', 't', '', '2021-11-10 01:13:41', + '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1134, '支付商户信息创建', 'pay:merchant:create', 3, 2, 1132, '', '', '', 0, 't', 't', '', '2021-11-10 01:13:41', + '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1135, '支付商户信息更新', 'pay:merchant:update', 3, 3, 1132, '', '', '', 0, 't', 't', '', '2021-11-10 01:13:41', + '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1136, '支付商户信息删除', 'pay:merchant:delete', 3, 4, 1132, '', '', '', 0, 't', 't', '', '2021-11-10 01:13:41', + '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1137, '支付商户信息导出', 'pay:merchant:export', 3, 5, 1132, '', '', '', 0, 't', 't', '', '2021-11-10 01:13:41', + '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1138, '租户列表', '', 2, 0, 1224, 'list', 'peoples', 'system/tenant/index', 0, 't', 't', '', + '2021-12-14 12:31:43', '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1139, '租户查询', 'system:tenant:query', 3, 1, 1138, '', '', '', 0, 't', 't', '', '2021-12-14 12:31:44', '', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1140, '租户创建', 'system:tenant:create', 3, 2, 1138, '', '', '', 0, 't', 't', '', '2021-12-14 12:31:44', '', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1141, '租户更新', 'system:tenant:update', 3, 3, 1138, '', '', '', 0, 't', 't', '', '2021-12-14 12:31:44', '', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1142, '租户删除', 'system:tenant:delete', 3, 4, 1138, '', '', '', 0, 't', 't', '', '2021-12-14 12:31:44', '', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1143, '租户导出', 'system:tenant:export', 3, 5, 1138, '', '', '', 0, 't', 't', '', '2021-12-14 12:31:44', '', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1150, '秘钥解析', '', 3, 6, 1129, '', '', '', 0, 't', 't', '1', '2021-11-08 15:15:47', '1', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1161, '退款订单', '', 2, 3, 1117, 'refund', 'order', 'pay/refund/index', 0, 't', 't', '', '2021-12-25 08:29:07', + '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1162, '退款订单查询', 'pay:refund:query', 3, 1, 1161, '', '', '', 0, 't', 't', '', '2021-12-25 08:29:07', '', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1163, '退款订单创建', 'pay:refund:create', 3, 2, 1161, '', '', '', 0, 't', 't', '', '2021-12-25 08:29:07', '', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1164, '退款订单更新', 'pay:refund:update', 3, 3, 1161, '', '', '', 0, 't', 't', '', '2021-12-25 08:29:07', '', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1165, '退款订单删除', 'pay:refund:delete', 3, 4, 1161, '', '', '', 0, 't', 't', '', '2021-12-25 08:29:07', '', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1166, '退款订单导出', 'pay:refund:export', 3, 5, 1161, '', '', '', 0, 't', 't', '', '2021-12-25 08:29:07', '', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1173, '支付订单', '', 2, 2, 1117, 'order', 'pay', 'pay/order/index', 0, 't', 't', '', '2021-12-25 08:49:43', + '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1174, '支付订单查询', 'pay:order:query', 3, 1, 1173, '', '', '', 0, 't', 't', '', '2021-12-25 08:49:43', '', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1175, '支付订单创建', 'pay:order:create', 3, 2, 1173, '', '', '', 0, 't', 't', '', '2021-12-25 08:49:43', '', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1176, '支付订单更新', 'pay:order:update', 3, 3, 1173, '', '', '', 0, 't', 't', '', '2021-12-25 08:49:43', '', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1177, '支付订单删除', 'pay:order:delete', 3, 4, 1173, '', '', '', 0, 't', 't', '', '2021-12-25 08:49:43', '', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1178, '支付订单导出', 'pay:order:export', 3, 5, 1173, '', '', '', 0, 't', 't', '', '2021-12-25 08:49:43', '', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1179, '商户信息', '', 2, 0, 1117, 'merchant', 'merchant', 'pay/merchant/index', 0, 't', 't', '', + '2021-12-25 09:01:44', '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1180, '支付商户信息查询', 'pay:merchant:query', 3, 1, 1179, '', '', '', 0, 't', 't', '', '2021-12-25 09:01:44', + '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1181, '支付商户信息创建', 'pay:merchant:create', 3, 2, 1179, '', '', '', 0, 't', 't', '', '2021-12-25 09:01:44', + '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1182, '支付商户信息更新', 'pay:merchant:update', 3, 3, 1179, '', '', '', 0, 't', 't', '', '2021-12-25 09:01:44', + '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1183, '支付商户信息删除', '', 3, 4, 1179, '', '', '', 0, 't', 't', '', '2021-12-25 09:01:44', '', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1184, '支付商户信息导出', 'pay:merchant:export', 3, 5, 1179, '', '', '', 0, 't', 't', '', '2021-12-25 09:01:44', + '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1185, '工作流程', '', 1, 50, 0, '/bpm', 'tool', NULL, 0, 't', 't', '1', '2021-12-30 20:26:36', '103', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1186, '流程管理', '', 1, 10, 1185, 'manager', 'nested', NULL, 0, 't', 't', '1', '2021-12-30 20:28:30', '1', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1187, '流程表单', '', 2, 0, 1186, 'form', 'form', 'bpm/form/index', 0, 't', 't', '', '2021-12-30 12:38:22', '1', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1188, '表单查询', 'bpm:form:query', 3, 1, 1187, '', '', '', 0, 't', 't', '', '2021-12-30 12:38:22', '1', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1189, '表单创建', 'bpm:form:create', 3, 2, 1187, '', '', '', 0, 't', 't', '', '2021-12-30 12:38:22', '1', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1190, '表单更新', 'bpm:form:update', 3, 3, 1187, '', '', '', 0, 't', 't', '', '2021-12-30 12:38:22', '1', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1191, '表单删除', 'bpm:form:delete', 3, 4, 1187, '', '', '', 0, 't', 't', '', '2021-12-30 12:38:22', '1', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1192, '表单导出', 'bpm:form:export', 3, 5, 1187, '', '', '', 0, 't', 't', '', '2021-12-30 12:38:22', '1', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1193, '流程模型', '', 2, 5, 1186, 'model', 'guide', 'bpm/model/index', 0, 't', 't', '1', '2021-12-31 23:24:58', + '103', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1194, '模型查询', 'bpm:model:query', 3, 1, 1193, '', '', '', 0, 't', 't', '1', '2022-01-03 19:01:10', '1', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1195, '模型创建', 'bpm:model:create', 3, 2, 1193, '', '', '', 0, 't', 't', '1', '2022-01-03 19:01:24', '1', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1196, '模型导入', 'bpm:model:import', 3, 3, 1193, '', '', '', 0, 't', 't', '1', '2022-01-03 19:01:35', '1', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1197, '模型更新', 'bpm:model:update', 3, 4, 1193, '', '', '', 0, 't', 't', '1', '2022-01-03 19:02:28', '1', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1198, '模型删除', 'bpm:model:delete', 3, 5, 1193, '', '', '', 0, 't', 't', '1', '2022-01-03 19:02:43', '1', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1199, '模型发布', 'bpm:model:deploy', 3, 6, 1193, '', '', '', 0, 't', 't', '1', '2022-01-03 19:03:24', '1', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1200, '任务管理', '', 1, 20, 1185, 'task', 'cascader', NULL, 0, 't', 't', '1', '2022-01-07 23:51:48', '1', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1201, '我的流程', '', 2, 0, 1200, 'my', 'people', 'bpm/processInstance/index', 0, 't', 't', '', + '2022-01-07 15:53:44', '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1202, '流程实例的查询', 'bpm:process-instance:query', 3, 1, 1201, '', '', '', 0, 't', 't', '', + '2022-01-07 15:53:44', '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1207, '待办任务', '', 2, 10, 1200, 'todo', 'eye-open', 'bpm/task/todo', 0, 't', 't', '1', '2022-01-08 10:33:37', + '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1208, '已办任务', '', 2, 20, 1200, 'done', 'eye', 'bpm/task/done', 0, 't', 't', '1', '2022-01-08 10:34:13', '1', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1209, '用户分组', '', 2, 2, 1186, 'user-group', 'people', 'bpm/group/index', 0, 't', 't', '', + '2022-01-14 02:14:20', '103', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1210, '用户组查询', 'bpm:user-group:query', 3, 1, 1209, '', '', '', 0, 't', 't', '', '2022-01-14 02:14:20', '', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1211, '用户组创建', 'bpm:user-group:create', 3, 2, 1209, '', '', '', 0, 't', 't', '', '2022-01-14 02:14:20', '', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1212, '用户组更新', 'bpm:user-group:update', 3, 3, 1209, '', '', '', 0, 't', 't', '', '2022-01-14 02:14:20', '', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1213, '用户组删除', 'bpm:user-group:delete', 3, 4, 1209, '', '', '', 0, 't', 't', '', '2022-01-14 02:14:20', '', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1215, '流程定义查询', 'bpm:process-definition:query', 3, 10, 1193, '', '', '', 0, 't', 't', '1', + '2022-01-23 00:21:43', '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1216, '流程任务分配规则查询', 'bpm:task-assign-rule:query', 3, 20, 1193, '', '', '', 0, 't', 't', '1', + '2022-01-23 00:26:53', '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1217, '流程任务分配规则创建', 'bpm:task-assign-rule:create', 3, 21, 1193, '', '', '', 0, 't', 't', '1', + '2022-01-23 00:28:15', '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1218, '流程任务分配规则更新', 'bpm:task-assign-rule:update', 3, 22, 1193, '', '', '', 0, 't', 't', '1', + '2022-01-23 00:28:41', '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1219, '流程实例的创建', 'bpm:process-instance:create', 3, 2, 1201, '', '', '', 0, 't', 't', '1', + '2022-01-23 00:36:15', '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1220, '流程实例的取消', 'bpm:process-instance:cancel', 3, 3, 1201, '', '', '', 0, 't', 't', '1', + '2022-01-23 00:36:33', '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1221, '流程任务的查询', 'bpm:task:query', 3, 1, 1207, '', '', '', 0, 't', 't', '1', '2022-01-23 00:38:52', '1', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1222, '流程任务的更新', 'bpm:task:update', 3, 2, 1207, '', '', '', 0, 't', 't', '1', '2022-01-23 00:39:24', '1', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1224, '租户管理', '', 2, 0, 1, 'tenant', 'peoples', NULL, 0, 't', 't', '1', '2022-02-20 01:41:13', '1', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1225, '租户套餐', '', 2, 0, 1224, 'package', 'eye', 'system/tenantPackage/index', 0, 't', 't', '', + '2022-02-19 17:44:06', '1', '2022-04-21 01:21:25', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1226, '租户套餐查询', 'system:tenant-package:query', 3, 1, 1225, '', '', '', 0, 't', 't', '', + '2022-02-19 17:44:06', '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1227, '租户套餐创建', 'system:tenant-package:create', 3, 2, 1225, '', '', '', 0, 't', 't', '', + '2022-02-19 17:44:06', '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1228, '租户套餐更新', 'system:tenant-package:update', 3, 3, 1225, '', '', '', 0, 't', 't', '', + '2022-02-19 17:44:06', '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1229, '租户套餐删除', 'system:tenant-package:delete', 3, 4, 1225, '', '', '', 0, 't', 't', '', + '2022-02-19 17:44:06', '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1237, '文件配置', '', 2, 0, 1243, 'file-config', 'config', 'infra/fileConfig/index', 0, 't', 't', '', + '2022-03-15 14:35:28', '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1238, '文件配置查询', 'infra:file-config:query', 3, 1, 1237, '', '', '', 0, 't', 't', '', '2022-03-15 14:35:28', + '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1239, '文件配置创建', 'infra:file-config:create', 3, 2, 1237, '', '', '', 0, 't', 't', '', + '2022-03-15 14:35:28', '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1240, '文件配置更新', 'infra:file-config:update', 3, 3, 1237, '', '', '', 0, 't', 't', '', + '2022-03-15 14:35:28', '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1241, '文件配置删除', 'infra:file-config:delete', 3, 4, 1237, '', '', '', 0, 't', 't', '', + '2022-03-15 14:35:28', '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1242, '文件配置导出', 'infra:file-config:export', 3, 5, 1237, '', '', '', 0, 't', 't', '', + '2022-03-15 14:35:28', '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1243, '文件管理', '', 2, 5, 2, 'file', 'download', NULL, 0, 't', 't', '1', '2022-03-16 23:47:40', '1', + '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1247, '敏感词管理', '', 2, 13, 1, 'sensitive-word', 'education', 'system/sensitiveWord/index', 0, 't', 't', '', + '2022-04-07 16:55:03', '1', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1248, '敏感词查询', 'system:sensitive-word:query', 3, 1, 1247, '', '', '', 0, 't', 't', '', + '2022-04-07 16:55:03', '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1249, '敏感词创建', 'system:sensitive-word:create', 3, 2, 1247, '', '', '', 0, 't', 't', '', + '2022-04-07 16:55:03', '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1250, '敏感词更新', 'system:sensitive-word:update', 3, 3, 1247, '', '', '', 0, 't', 't', '', + '2022-04-07 16:55:03', '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1251, '敏感词删除', 'system:sensitive-word:delete', 3, 4, 1247, '', '', '', 0, 't', 't', '', + '2022-04-07 16:55:03', '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1252, '敏感词导出', 'system:sensitive-word:export', 3, 5, 1247, '', '', '', 0, 't', 't', '', + '2022-04-07 16:55:03', '', '2022-04-20 17:03:10', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1254, '作者动态', '', 1, 0, 0, 'https://www.iocoder.cn', 'people', NULL, 0, 't', 't', '1', + '2022-04-23 01:03:15', '1', '2022-04-23 01:03:15', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1255, '数据源配置', '', 2, 1, 2, 'data-source-config', 'rate', 'infra/dataSourceConfig/index', 0, 't', 't', '', + '2022-04-27 14:37:32', '1', '2022-04-27 22:42:06', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1256, '数据源配置查询', 'infra:data-source-config:query', 3, 1, 1255, '', '', '', 0, 't', 't', '', + '2022-04-27 14:37:32', '', '2022-04-27 14:37:32', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1257, '数据源配置创建', 'infra:data-source-config:create', 3, 2, 1255, '', '', '', 0, 't', 't', '', + '2022-04-27 14:37:32', '', '2022-04-27 14:37:32', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1258, '数据源配置更新', 'infra:data-source-config:update', 3, 3, 1255, '', '', '', 0, 't', 't', '', + '2022-04-27 14:37:32', '', '2022-04-27 14:37:32', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1259, '数据源配置删除', 'infra:data-source-config:delete', 3, 4, 1255, '', '', '', 0, 't', 't', '', + '2022-04-27 14:37:32', '', '2022-04-27 14:37:32', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1260, '数据源配置导出', 'infra:data-source-config:export', 3, 5, 1255, '', '', '', 0, 't', 't', '', + '2022-04-27 14:37:32', '', '2022-04-27 14:37:32', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1261, 'OAuth 2.0', '', 1, 10, 1, 'oauth2', 'people', NULL, 0, 't', 't', '1', '2022-05-09 23:38:17', '1', + '2022-05-11 23:51:46', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1263, '应用管理', '', 2, 0, 1261, 'oauth2/application', 'tool', 'system/oauth2/client/index', 0, 't', 't', '', + '2022-05-10 16:26:33', '1', '2022-05-11 23:31:36', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1264, '客户端查询', 'system:oauth2-client:query', 3, 1, 1263, '', '', '', 0, 't', 't', '', + '2022-05-10 16:26:33', '1', '2022-05-11 00:31:06', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1265, '客户端创建', 'system:oauth2-client:create', 3, 2, 1263, '', '', '', 0, 't', 't', '', + '2022-05-10 16:26:33', '1', '2022-05-11 00:31:23', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1266, '客户端更新', 'system:oauth2-client:update', 3, 3, 1263, '', '', '', 0, 't', 't', '', + '2022-05-10 16:26:33', '1', '2022-05-11 00:31:28', 0, NULL, '1'); +INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", + "status", "visible", "keep_alive", "creator", "create_time", "updater", "update_time", + "deleted", "component_name", "always_show") +VALUES (1267, '客户端删除', 'system:oauth2-client:delete', 3, 4, 1263, '', '', '', 0, 't', 't', '', + '2022-05-10 16:26:33', '1', '2022-05-11 00:31:33', 0, NULL, '1'); +COMMIT; + +-- ---------------------------- +-- Table structure for system_notice +-- ---------------------------- +DROP TABLE IF EXISTS "system_notice"; +CREATE TABLE "system_notice" +( + "id" int8 NOT NULL, + "title" varchar(50) COLLATE "pg_catalog"."default" NOT NULL, + "content" text COLLATE "pg_catalog"."default" NOT NULL, + "type" int2 NOT NULL, + "status" int2 NOT NULL, + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0, + "tenant_id" int8 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "system_notice"."id" IS '公告ID'; +COMMENT +ON COLUMN "system_notice"."title" IS '公告标题'; +COMMENT +ON COLUMN "system_notice"."content" IS '公告内容'; +COMMENT +ON COLUMN "system_notice"."type" IS '公告类型(1通知 2公告)'; +COMMENT +ON COLUMN "system_notice"."status" IS '公告状态(0正常 1关闭)'; +COMMENT +ON COLUMN "system_notice"."creator" IS '创建者'; +COMMENT +ON COLUMN "system_notice"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "system_notice"."updater" IS '更新者'; +COMMENT +ON COLUMN "system_notice"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "system_notice"."deleted" IS '是否删除'; +COMMENT +ON COLUMN "system_notice"."tenant_id" IS '租户编号'; +COMMENT +ON TABLE "system_notice" IS '通知公告表'; + +-- ---------------------------- +-- Records of system_notice +-- ---------------------------- +BEGIN; +INSERT INTO "system_notice" ("id", "title", "content", "type", "status", "creator", "create_time", "updater", + "update_time", "deleted", "tenant_id") +VALUES (1, '闻荫的公众', '

新版本内容133

', 1, 0, 'admin', '2021-01-05 17:03:48', '1', '2022-05-04 21:00:20', 0, + 1); +INSERT INTO "system_notice" ("id", "title", "content", "type", "status", "creator", "create_time", "updater", + "update_time", "deleted", "tenant_id") +VALUES (2, '维护通知:2018-07-01 若依系统凌晨维护', + '

维护内容

', 2, 1, 'admin', + '2021-01-05 17:03:48', '1', '2022-05-11 12:34:24', 0, 1); +INSERT INTO "system_notice" ("id", "title", "content", "type", "status", "creator", "create_time", "updater", + "update_time", "deleted", "tenant_id") +VALUES (4, '我是测试标题', '

哈哈哈哈123

', 1, 0, '110', '2022-02-22 01:01:25', '110', '2022-02-22 01:01:46', 0, + 121); +COMMIT; + +-- ---------------------------- +-- Table structure for system_oauth2_access_token +-- ---------------------------- +DROP TABLE IF EXISTS "system_oauth2_access_token"; +CREATE TABLE "system_oauth2_access_token" +( + "id" int8 NOT NULL, + "user_id" int8 NOT NULL, + "access_token" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, + "refresh_token" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, + "user_type" int2 NOT NULL, + "client_id" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, + "expires_time" timestamp(6) NOT NULL, + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0, + "tenant_id" int8 NOT NULL DEFAULT 0, + "scopes" varchar(255) COLLATE "pg_catalog"."default" DEFAULT '':: character varying +) +; +COMMENT +ON COLUMN "system_oauth2_access_token"."id" IS '编号'; +COMMENT +ON COLUMN "system_oauth2_access_token"."user_id" IS '用户编号'; +COMMENT +ON COLUMN "system_oauth2_access_token"."access_token" IS '访问令牌'; +COMMENT +ON COLUMN "system_oauth2_access_token"."refresh_token" IS '刷新令牌'; +COMMENT +ON COLUMN "system_oauth2_access_token"."user_type" IS '用户类型'; +COMMENT +ON COLUMN "system_oauth2_access_token"."client_id" IS '客户端编号'; +COMMENT +ON COLUMN "system_oauth2_access_token"."expires_time" IS '过期时间'; +COMMENT +ON COLUMN "system_oauth2_access_token"."creator" IS '创建者'; +COMMENT +ON COLUMN "system_oauth2_access_token"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "system_oauth2_access_token"."updater" IS '更新者'; +COMMENT +ON COLUMN "system_oauth2_access_token"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "system_oauth2_access_token"."deleted" IS '是否删除'; +COMMENT +ON COLUMN "system_oauth2_access_token"."tenant_id" IS '租户编号'; +COMMENT +ON COLUMN "system_oauth2_access_token"."scopes" IS '授权范围'; +COMMENT +ON TABLE "system_oauth2_access_token" IS '刷新令牌'; + +-- ---------------------------- +-- Records of system_oauth2_access_token +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for system_oauth2_approve +-- ---------------------------- +DROP TABLE IF EXISTS "system_oauth2_approve"; +CREATE TABLE "system_oauth2_approve" +( + "id" int8 NOT NULL, + "user_id" int8 NOT NULL, + "user_type" int2 NOT NULL, + "client_id" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, + "scope" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, + "approved" bool NOT NULL, + "expires_time" timestamp(6) NOT NULL, + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0, + "tenant_id" int8 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "system_oauth2_approve"."id" IS '编号'; +COMMENT +ON COLUMN "system_oauth2_approve"."user_id" IS '用户编号'; +COMMENT +ON COLUMN "system_oauth2_approve"."user_type" IS '用户类型'; +COMMENT +ON COLUMN "system_oauth2_approve"."client_id" IS '客户端编号'; +COMMENT +ON COLUMN "system_oauth2_approve"."scope" IS '授权范围'; +COMMENT +ON COLUMN "system_oauth2_approve"."approved" IS '是否接受'; +COMMENT +ON COLUMN "system_oauth2_approve"."expires_time" IS '过期时间'; +COMMENT +ON COLUMN "system_oauth2_approve"."creator" IS '创建者'; +COMMENT +ON COLUMN "system_oauth2_approve"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "system_oauth2_approve"."updater" IS '更新者'; +COMMENT +ON COLUMN "system_oauth2_approve"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "system_oauth2_approve"."deleted" IS '是否删除'; +COMMENT +ON COLUMN "system_oauth2_approve"."tenant_id" IS '租户编号'; +COMMENT +ON TABLE "system_oauth2_approve" IS 'OAuth2 批准表'; + +-- ---------------------------- +-- Records of system_oauth2_approve +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for system_oauth2_client +-- ---------------------------- +DROP TABLE IF EXISTS "system_oauth2_client"; +CREATE TABLE "system_oauth2_client" +( + "id" int8 NOT NULL, + "client_id" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, + "secret" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, + "name" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, + "logo" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, + "description" varchar(255) COLLATE "pg_catalog"."default", + "status" int2 NOT NULL, + "access_token_validity_seconds" int4 NOT NULL, + "refresh_token_validity_seconds" int4 NOT NULL, + "redirect_uris" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, + "authorized_grant_types" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, + "scopes" varchar(255) COLLATE "pg_catalog"."default", + "authorities" varchar(255) COLLATE "pg_catalog"."default", + "resource_ids" varchar(255) COLLATE "pg_catalog"."default", + "additional_information" varchar(4096) COLLATE "pg_catalog"."default", + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0, + "auto_approve_scopes" varchar(255) COLLATE "pg_catalog"."default" +) +; +COMMENT +ON COLUMN "system_oauth2_client"."id" IS '编号'; +COMMENT +ON COLUMN "system_oauth2_client"."client_id" IS '客户端编号'; +COMMENT +ON COLUMN "system_oauth2_client"."secret" IS '客户端密钥'; +COMMENT +ON COLUMN "system_oauth2_client"."name" IS '应用名'; +COMMENT +ON COLUMN "system_oauth2_client"."logo" IS '应用图标'; +COMMENT +ON COLUMN "system_oauth2_client"."description" IS '应用描述'; +COMMENT +ON COLUMN "system_oauth2_client"."status" IS '状态'; +COMMENT +ON COLUMN "system_oauth2_client"."access_token_validity_seconds" IS '访问令牌的有效期'; +COMMENT +ON COLUMN "system_oauth2_client"."refresh_token_validity_seconds" IS '刷新令牌的有效期'; +COMMENT +ON COLUMN "system_oauth2_client"."redirect_uris" IS '可重定向的 URI 地址'; +COMMENT +ON COLUMN "system_oauth2_client"."authorized_grant_types" IS '授权类型'; +COMMENT +ON COLUMN "system_oauth2_client"."scopes" IS '授权范围'; +COMMENT +ON COLUMN "system_oauth2_client"."authorities" IS '权限'; +COMMENT +ON COLUMN "system_oauth2_client"."resource_ids" IS '资源'; +COMMENT +ON COLUMN "system_oauth2_client"."additional_information" IS '附加信息'; +COMMENT +ON COLUMN "system_oauth2_client"."creator" IS '创建者'; +COMMENT +ON COLUMN "system_oauth2_client"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "system_oauth2_client"."updater" IS '更新者'; +COMMENT +ON COLUMN "system_oauth2_client"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "system_oauth2_client"."deleted" IS '是否删除'; +COMMENT +ON COLUMN "system_oauth2_client"."auto_approve_scopes" IS '自动通过的授权范围'; +COMMENT +ON TABLE "system_oauth2_client" IS 'OAuth2 客户端表'; + +-- ---------------------------- +-- Records of system_oauth2_client +-- ---------------------------- +BEGIN; +INSERT INTO "system_oauth2_client" ("id", "client_id", "secret", "name", "logo", "description", "status", + "access_token_validity_seconds", "refresh_token_validity_seconds", "redirect_uris", + "authorized_grant_types", "scopes", "authorities", "resource_ids", + "additional_information", "creator", "create_time", "updater", "update_time", + "deleted", "auto_approve_scopes") +VALUES (1, 'default', 'admin123', '闻荫源码', 'http://test.win.iocoder.cn/a5e2e244368878a366b516805a4aabf1.png', + '我是描述', 0, 180, 8640, '["https://www.iocoder.cn","https://doc.iocoder.cn"]', + '["password","authorization_code","implicit","refresh_token"]', '["user.read","user.write"]', + '["system:user:query"]', '[]', '{}', '1', '2022-05-11 21:47:12', '1', '2022-05-12 01:00:20', 0, NULL); +INSERT INTO "system_oauth2_client" ("id", "client_id", "secret", "name", "logo", "description", "status", + "access_token_validity_seconds", "refresh_token_validity_seconds", "redirect_uris", + "authorized_grant_types", "scopes", "authorities", "resource_ids", + "additional_information", "creator", "create_time", "updater", "update_time", + "deleted", "auto_approve_scopes") +VALUES (40, 'test', 'test2', 'biubiu', 'http://test.win.iocoder.cn/277a899d573723f1fcdfb57340f00379.png', NULL, 0, + 1800, 43200, '["https://www.iocoder.cn"]', '["password","authorization_code","implicit"]', '[]', '[]', '[]', + '{}', '1', '2022-05-12 00:28:20', '1', '2022-05-25 23:45:33.005', 0, '[]'); +COMMIT; + +-- ---------------------------- +-- Table structure for system_oauth2_code +-- ---------------------------- +DROP TABLE IF EXISTS "system_oauth2_code"; +CREATE TABLE "system_oauth2_code" +( + "id" int8 NOT NULL, + "user_id" int8 NOT NULL, + "user_type" int2 NOT NULL, + "code" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, + "client_id" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, + "scopes" varchar(255) COLLATE "pg_catalog"."default", + "expires_time" timestamp(6) NOT NULL, + "redirect_uri" varchar(255) COLLATE "pg_catalog"."default", + "state" varchar(255) COLLATE "pg_catalog"."default", + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0, + "tenant_id" int8 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "system_oauth2_code"."id" IS '编号'; +COMMENT +ON COLUMN "system_oauth2_code"."user_id" IS '用户编号'; +COMMENT +ON COLUMN "system_oauth2_code"."user_type" IS '用户类型'; +COMMENT +ON COLUMN "system_oauth2_code"."code" IS '授权码'; +COMMENT +ON COLUMN "system_oauth2_code"."client_id" IS '客户端编号'; +COMMENT +ON COLUMN "system_oauth2_code"."scopes" IS '授权范围'; +COMMENT +ON COLUMN "system_oauth2_code"."expires_time" IS '过期时间'; +COMMENT +ON COLUMN "system_oauth2_code"."redirect_uri" IS '可重定向的 URI 地址'; +COMMENT +ON COLUMN "system_oauth2_code"."state" IS '状态'; +COMMENT +ON COLUMN "system_oauth2_code"."creator" IS '创建者'; +COMMENT +ON COLUMN "system_oauth2_code"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "system_oauth2_code"."updater" IS '更新者'; +COMMENT +ON COLUMN "system_oauth2_code"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "system_oauth2_code"."deleted" IS '是否删除'; +COMMENT +ON COLUMN "system_oauth2_code"."tenant_id" IS '租户编号'; +COMMENT +ON TABLE "system_oauth2_code" IS 'OAuth2 授权码表'; + +-- ---------------------------- +-- Records of system_oauth2_code +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for system_oauth2_refresh_token +-- ---------------------------- +DROP TABLE IF EXISTS "system_oauth2_refresh_token"; +CREATE TABLE "system_oauth2_refresh_token" +( + "id" int8 NOT NULL, + "user_id" int8 NOT NULL, + "refresh_token" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, + "user_type" int2 NOT NULL, + "client_id" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, + "expires_time" timestamp(6) NOT NULL, + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0, + "tenant_id" int8 NOT NULL DEFAULT 0, + "scopes" varchar(255) COLLATE "pg_catalog"."default" DEFAULT '':: character varying +) +; +COMMENT +ON COLUMN "system_oauth2_refresh_token"."id" IS '编号'; +COMMENT +ON COLUMN "system_oauth2_refresh_token"."user_id" IS '用户编号'; +COMMENT +ON COLUMN "system_oauth2_refresh_token"."refresh_token" IS '刷新令牌'; +COMMENT +ON COLUMN "system_oauth2_refresh_token"."user_type" IS '用户类型'; +COMMENT +ON COLUMN "system_oauth2_refresh_token"."client_id" IS '客户端编号'; +COMMENT +ON COLUMN "system_oauth2_refresh_token"."expires_time" IS '过期时间'; +COMMENT +ON COLUMN "system_oauth2_refresh_token"."creator" IS '创建者'; +COMMENT +ON COLUMN "system_oauth2_refresh_token"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "system_oauth2_refresh_token"."updater" IS '更新者'; +COMMENT +ON COLUMN "system_oauth2_refresh_token"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "system_oauth2_refresh_token"."deleted" IS '是否删除'; +COMMENT +ON COLUMN "system_oauth2_refresh_token"."tenant_id" IS '租户编号'; +COMMENT +ON COLUMN "system_oauth2_refresh_token"."scopes" IS '授权范围'; +COMMENT +ON TABLE "system_oauth2_refresh_token" IS '刷新令牌'; + +-- ---------------------------- +-- Records of system_oauth2_refresh_token +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for system_operate_log +-- ---------------------------- +DROP TABLE IF EXISTS "system_operate_log"; +CREATE TABLE "system_operate_log" +( + "id" int8 NOT NULL, + "trace_id" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "user_id" int8 NOT NULL, + "user_type" int2 NOT NULL, + "module" varchar(50) COLLATE "pg_catalog"."default" NOT NULL, + "name" varchar(50) COLLATE "pg_catalog"."default" NOT NULL, + "type" int8 NOT NULL, + "content" varchar(2000) COLLATE "pg_catalog"."default" NOT NULL DEFAULT '':: character varying, + "exts" varchar(512) COLLATE "pg_catalog"."default" NOT NULL DEFAULT '':: character varying, + "request_method" varchar(16) COLLATE "pg_catalog"."default", + "request_url" varchar(255) COLLATE "pg_catalog"."default", + "user_ip" varchar(50) COLLATE "pg_catalog"."default", + "user_agent" varchar(200) COLLATE "pg_catalog"."default", + "java_method" varchar(512) COLLATE "pg_catalog"."default" NOT NULL, + "java_method_args" varchar(8000) COLLATE "pg_catalog"."default", + "start_time" timestamp(6) NOT NULL, + "duration" int4 NOT NULL, + "result_code" int4 NOT NULL, + "result_msg" varchar(512) COLLATE "pg_catalog"."default", + "result_data" varchar(4000) COLLATE "pg_catalog"."default", + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0, + "tenant_id" int8 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "system_operate_log"."id" IS '日志主键'; +COMMENT +ON COLUMN "system_operate_log"."trace_id" IS '链路追踪编号'; +COMMENT +ON COLUMN "system_operate_log"."user_id" IS '用户编号'; +COMMENT +ON COLUMN "system_operate_log"."user_type" IS '用户类型'; +COMMENT +ON COLUMN "system_operate_log"."module" IS '模块标题'; +COMMENT +ON COLUMN "system_operate_log"."name" IS '操作名'; +COMMENT +ON COLUMN "system_operate_log"."type" IS '操作分类'; +COMMENT +ON COLUMN "system_operate_log"."content" IS '操作内容'; +COMMENT +ON COLUMN "system_operate_log"."exts" IS '拓展字段'; +COMMENT +ON COLUMN "system_operate_log"."request_method" IS '请求方法名'; +COMMENT +ON COLUMN "system_operate_log"."request_url" IS '请求地址'; +COMMENT +ON COLUMN "system_operate_log"."user_ip" IS '用户 IP'; +COMMENT +ON COLUMN "system_operate_log"."user_agent" IS '浏览器 UA'; +COMMENT +ON COLUMN "system_operate_log"."java_method" IS 'Java 方法名'; +COMMENT +ON COLUMN "system_operate_log"."java_method_args" IS 'Java 方法的参数'; +COMMENT +ON COLUMN "system_operate_log"."start_time" IS '操作时间'; +COMMENT +ON COLUMN "system_operate_log"."duration" IS '执行时长'; +COMMENT +ON COLUMN "system_operate_log"."result_code" IS '结果码'; +COMMENT +ON COLUMN "system_operate_log"."result_msg" IS '结果提示'; +COMMENT +ON COLUMN "system_operate_log"."result_data" IS '结果数据'; +COMMENT +ON COLUMN "system_operate_log"."creator" IS '创建者'; +COMMENT +ON COLUMN "system_operate_log"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "system_operate_log"."updater" IS '更新者'; +COMMENT +ON COLUMN "system_operate_log"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "system_operate_log"."deleted" IS '是否删除'; +COMMENT +ON COLUMN "system_operate_log"."tenant_id" IS '租户编号'; +COMMENT +ON TABLE "system_operate_log" IS '操作日志记录'; + +-- ---------------------------- +-- Records of system_operate_log +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for system_post +-- ---------------------------- +DROP TABLE IF EXISTS "system_post"; +CREATE TABLE "system_post" +( + "id" int8 NOT NULL DEFAULT 0, + "code" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "name" varchar(50) COLLATE "pg_catalog"."default" NOT NULL, + "sort" int4 NOT NULL, + "status" int2 NOT NULL, + "remark" varchar(500) COLLATE "pg_catalog"."default", + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0, + "tenant_id" int8 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "system_post"."id" IS '岗位ID'; +COMMENT +ON COLUMN "system_post"."code" IS '岗位编码'; +COMMENT +ON COLUMN "system_post"."name" IS '岗位名称'; +COMMENT +ON COLUMN "system_post"."sort" IS '显示顺序'; +COMMENT +ON COLUMN "system_post"."status" IS '状态(0正常 1停用)'; +COMMENT +ON COLUMN "system_post"."remark" IS '备注'; +COMMENT +ON COLUMN "system_post"."creator" IS '创建者'; +COMMENT +ON COLUMN "system_post"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "system_post"."updater" IS '更新者'; +COMMENT +ON COLUMN "system_post"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "system_post"."deleted" IS '是否删除'; +COMMENT +ON COLUMN "system_post"."tenant_id" IS '租户编号'; +COMMENT +ON TABLE "system_post" IS '岗位信息表'; + +-- ---------------------------- +-- Records of system_post +-- ---------------------------- +BEGIN; +INSERT INTO "system_post" ("id", "code", "name", "sort", "status", "remark", "creator", "create_time", "updater", + "update_time", "deleted", "tenant_id") +VALUES (1, 'ceo', '董事长', 1, 0, '', 'admin', '2021-01-06 17:03:48', '1', '2022-04-19 16:53:39', 0, 1); +INSERT INTO "system_post" ("id", "code", "name", "sort", "status", "remark", "creator", "create_time", "updater", + "update_time", "deleted", "tenant_id") +VALUES (2, 'se', '项目经理', 2, 0, '', 'admin', '2021-01-05 17:03:48', '1', '2021-12-12 10:47:47', 0, 1); +INSERT INTO "system_post" ("id", "code", "name", "sort", "status", "remark", "creator", "create_time", "updater", + "update_time", "deleted", "tenant_id") +VALUES (4, 'user', '普通员工', 4, 0, '111', 'admin', '2021-01-05 17:03:48', '1', '2022-05-04 22:46:35', 0, 1); +COMMIT; + +-- ---------------------------- +-- Table structure for system_role +-- ---------------------------- +DROP TABLE IF EXISTS "system_role"; +CREATE TABLE "system_role" +( + "id" int8 NOT NULL, + "name" varchar(30) COLLATE "pg_catalog"."default" NOT NULL, + "code" varchar(100) COLLATE "pg_catalog"."default" NOT NULL, + "sort" int4 NOT NULL, + "data_scope" int2 NOT NULL, + "data_scope_dept_ids" varchar(500) COLLATE "pg_catalog"."default" NOT NULL DEFAULT '', + "status" int2 NOT NULL, + "type" int2 NOT NULL, + "remark" varchar(500) COLLATE "pg_catalog"."default", + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0, + "tenant_id" int8 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "system_role"."id" IS '角色ID'; +COMMENT +ON COLUMN "system_role"."name" IS '角色名称'; +COMMENT +ON COLUMN "system_role"."code" IS '角色权限字符串'; +COMMENT +ON COLUMN "system_role"."sort" IS '显示顺序'; +COMMENT +ON COLUMN "system_role"."data_scope" IS '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)'; +COMMENT +ON COLUMN "system_role"."data_scope_dept_ids" IS '数据范围(指定部门数组)'; +COMMENT +ON COLUMN "system_role"."status" IS '角色状态(0正常 1停用)'; +COMMENT +ON COLUMN "system_role"."type" IS '角色类型'; +COMMENT +ON COLUMN "system_role"."remark" IS '备注'; +COMMENT +ON COLUMN "system_role"."creator" IS '创建者'; +COMMENT +ON COLUMN "system_role"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "system_role"."updater" IS '更新者'; +COMMENT +ON COLUMN "system_role"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "system_role"."deleted" IS '是否删除'; +COMMENT +ON COLUMN "system_role"."tenant_id" IS '租户编号'; +COMMENT +ON TABLE "system_role" IS '角色信息表'; + +-- ---------------------------- +-- Records of system_role +-- ---------------------------- +BEGIN; +INSERT INTO "system_role" ("id", "name", "code", "sort", "data_scope", "data_scope_dept_ids", "status", "type", + "remark", "creator", "create_time", "updater", "update_time", "deleted", "tenant_id") +VALUES (1, '超级管理员', 'super_admin', 1, 1, '', 0, 1, '超级管理员', 'admin', '2021-01-05 17:03:48', '', + '2022-02-22 05:08:21', 0, 1); +INSERT INTO "system_role" ("id", "name", "code", "sort", "data_scope", "data_scope_dept_ids", "status", "type", + "remark", "creator", "create_time", "updater", "update_time", "deleted", "tenant_id") +VALUES (2, '普通角色', 'common', 2, 2, '', 0, 1, '普通角色', 'admin', '2021-01-05 17:03:48', '', '2022-02-22 05:08:20', + 0, 1); +INSERT INTO "system_role" ("id", "name", "code", "sort", "data_scope", "data_scope_dept_ids", "status", "type", + "remark", "creator", "create_time", "updater", "update_time", "deleted", "tenant_id") +VALUES (101, '测试账号', 'test', 0, 1, '[]', 0, 2, '132', '', '2021-01-06 13:49:35', '1', '2022-04-01 21:37:13', 0, 1); +INSERT INTO "system_role" ("id", "name", "code", "sort", "data_scope", "data_scope_dept_ids", "status", "type", + "remark", "creator", "create_time", "updater", "update_time", "deleted", "tenant_id") +VALUES (109, '租户管理员', 'tenant_admin', 0, 1, '', 0, 1, '系统自动生成', '1', '2022-02-22 00:56:14', '1', + '2022-02-22 00:56:14', 0, 121); +INSERT INTO "system_role" ("id", "name", "code", "sort", "data_scope", "data_scope_dept_ids", "status", "type", + "remark", "creator", "create_time", "updater", "update_time", "deleted", "tenant_id") +VALUES (110, '测试角色', 'test', 0, 1, '[]', 0, 2, '嘿嘿', '110', '2022-02-23 00:14:34', '110', '2022-02-23 13:14:58', + 0, 121); +INSERT INTO "system_role" ("id", "name", "code", "sort", "data_scope", "data_scope_dept_ids", "status", "type", + "remark", "creator", "create_time", "updater", "update_time", "deleted", "tenant_id") +VALUES (111, '租户管理员', 'tenant_admin', 0, 1, '', 0, 1, '系统自动生成', '1', '2022-03-07 21:37:58', '1', + '2022-03-07 21:37:58', 0, 122); +COMMIT; + +-- ---------------------------- +-- Table structure for system_role_menu +-- ---------------------------- +DROP TABLE IF EXISTS "system_role_menu"; +CREATE TABLE "system_role_menu" +( + "id" int8 NOT NULL, + "role_id" int8 NOT NULL, + "menu_id" int8 NOT NULL, + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0, + "tenant_id" int8 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "system_role_menu"."id" IS '自增编号'; +COMMENT +ON COLUMN "system_role_menu"."role_id" IS '角色ID'; +COMMENT +ON COLUMN "system_role_menu"."menu_id" IS '菜单ID'; +COMMENT +ON COLUMN "system_role_menu"."creator" IS '创建者'; +COMMENT +ON COLUMN "system_role_menu"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "system_role_menu"."updater" IS '更新者'; +COMMENT +ON COLUMN "system_role_menu"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "system_role_menu"."deleted" IS '是否删除'; +COMMENT +ON COLUMN "system_role_menu"."tenant_id" IS '租户编号'; +COMMENT +ON TABLE "system_role_menu" IS '角色和菜单关联表'; + +-- ---------------------------- +-- Records of system_role_menu +-- ---------------------------- +BEGIN; +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (263, 109, 1, '1', '2022-02-22 00:56:14', '1', '2022-02-22 00:56:14', 0, 121); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (434, 2, 1, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (454, 2, 1093, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (455, 2, 1094, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (460, 2, 1100, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (467, 2, 1107, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (470, 2, 1110, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (476, 2, 1117, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (477, 2, 100, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (478, 2, 101, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (479, 2, 102, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (480, 2, 1126, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (481, 2, 103, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (483, 2, 104, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (485, 2, 105, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (488, 2, 107, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (490, 2, 108, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (492, 2, 109, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (498, 2, 1138, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (523, 2, 1224, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (524, 2, 1225, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (541, 2, 500, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (543, 2, 501, '1', '2022-02-22 13:09:12', '1', '2022-02-22 13:09:12', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (675, 2, 2, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (689, 2, 1077, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (690, 2, 1078, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (692, 2, 1083, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (693, 2, 1084, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (699, 2, 1090, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (703, 2, 106, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (704, 2, 110, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (705, 2, 111, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (706, 2, 112, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (707, 2, 113, '1', '2022-02-22 13:16:57', '1', '2022-02-22 13:16:57', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1296, 110, 1, '110', '2022-02-23 00:23:55', '110', '2022-02-23 00:23:55', 0, 121); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1486, 109, 103, '1', '2022-02-23 19:32:14', '1', '2022-02-23 19:32:14', 0, 121); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1487, 109, 104, '1', '2022-02-23 19:32:14', '1', '2022-02-23 19:32:14', 0, 121); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1489, 1, 1, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1490, 1, 2, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1494, 1, 1077, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1495, 1, 1078, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1496, 1, 1083, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1497, 1, 1084, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1498, 1, 1090, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1499, 1, 1093, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1500, 1, 1094, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1501, 1, 1100, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1502, 1, 1107, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1503, 1, 1110, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1505, 1, 1117, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1506, 1, 100, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1507, 1, 101, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1508, 1, 102, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1509, 1, 1126, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1510, 1, 103, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1511, 1, 104, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1512, 1, 105, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1513, 1, 106, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1514, 1, 107, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1515, 1, 108, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1516, 1, 109, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1517, 1, 110, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1518, 1, 111, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1519, 1, 112, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1520, 1, 113, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1522, 1, 1138, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1525, 1, 1224, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1526, 1, 1225, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1527, 1, 500, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1528, 1, 501, '1', '2022-02-23 20:03:57', '1', '2022-02-23 20:03:57', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1529, 109, 1024, '1', '2022-02-23 20:30:14', '1', '2022-02-23 20:30:14', 0, 121); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1530, 109, 1025, '1', '2022-02-23 20:30:14', '1', '2022-02-23 20:30:14', 0, 121); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1536, 109, 1017, '1', '2022-02-23 20:30:14', '1', '2022-02-23 20:30:14', 0, 121); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1537, 109, 1018, '1', '2022-02-23 20:30:14', '1', '2022-02-23 20:30:14', 0, 121); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1538, 109, 1019, '1', '2022-02-23 20:30:14', '1', '2022-02-23 20:30:14', 0, 121); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1539, 109, 1020, '1', '2022-02-23 20:30:14', '1', '2022-02-23 20:30:14', 0, 121); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1540, 109, 1021, '1', '2022-02-23 20:30:14', '1', '2022-02-23 20:30:14', 0, 121); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1541, 109, 1022, '1', '2022-02-23 20:30:14', '1', '2022-02-23 20:30:14', 0, 121); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1542, 109, 1023, '1', '2022-02-23 20:30:14', '1', '2022-02-23 20:30:14', 0, 121); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1576, 111, 1024, '1', '2022-03-07 21:37:58', '1', '2022-03-07 21:37:58', 0, 122); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1577, 111, 1025, '1', '2022-03-07 21:37:58', '1', '2022-03-07 21:37:58', 0, 122); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1578, 111, 1, '1', '2022-03-07 21:37:58', '1', '2022-03-07 21:37:58', 0, 122); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1584, 111, 103, '1', '2022-03-07 21:37:58', '1', '2022-03-07 21:37:58', 0, 122); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1585, 111, 104, '1', '2022-03-07 21:37:58', '1', '2022-03-07 21:37:58', 0, 122); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1587, 111, 1017, '1', '2022-03-07 21:37:58', '1', '2022-03-07 21:37:58', 0, 122); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1588, 111, 1018, '1', '2022-03-07 21:37:58', '1', '2022-03-07 21:37:58', 0, 122); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1589, 111, 1019, '1', '2022-03-07 21:37:58', '1', '2022-03-07 21:37:58', 0, 122); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1590, 111, 1020, '1', '2022-03-07 21:37:58', '1', '2022-03-07 21:37:58', 0, 122); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1591, 111, 1021, '1', '2022-03-07 21:37:58', '1', '2022-03-07 21:37:58', 0, 122); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1592, 111, 1022, '1', '2022-03-07 21:37:58', '1', '2022-03-07 21:37:58', 0, 122); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1593, 111, 1023, '1', '2022-03-07 21:37:58', '1', '2022-03-07 21:37:58', 0, 122); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1594, 109, 102, '1', '2022-03-19 18:39:13', '1', '2022-03-19 18:39:13', 0, 121); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1595, 109, 1013, '1', '2022-03-19 18:39:13', '1', '2022-03-19 18:39:13', 0, 121); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1596, 109, 1014, '1', '2022-03-19 18:39:13', '1', '2022-03-19 18:39:13', 0, 121); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1597, 109, 1015, '1', '2022-03-19 18:39:13', '1', '2022-03-19 18:39:13', 0, 121); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1598, 109, 1016, '1', '2022-03-19 18:39:13', '1', '2022-03-19 18:39:13', 0, 121); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1599, 111, 102, '1', '2022-03-19 18:39:13', '1', '2022-03-19 18:39:13', 0, 122); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1600, 111, 1013, '1', '2022-03-19 18:39:13', '1', '2022-03-19 18:39:13', 0, 122); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1601, 111, 1014, '1', '2022-03-19 18:39:13', '1', '2022-03-19 18:39:13', 0, 122); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1602, 111, 1015, '1', '2022-03-19 18:39:13', '1', '2022-03-19 18:39:13', 0, 122); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1603, 111, 1016, '1', '2022-03-19 18:39:13', '1', '2022-03-19 18:39:13', 0, 122); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1604, 101, 1216, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1605, 101, 1217, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1606, 101, 1218, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1607, 101, 1219, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1608, 101, 1220, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1609, 101, 1221, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1610, 101, 5, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1611, 101, 1222, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1612, 101, 1118, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1613, 101, 1119, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1614, 101, 1120, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1615, 101, 1185, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1616, 101, 1186, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1617, 101, 1187, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1618, 101, 1188, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1619, 101, 1189, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1620, 101, 1190, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1621, 101, 1191, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1622, 101, 1192, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1623, 101, 1193, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1624, 101, 1194, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1625, 101, 1195, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1626, 101, 1196, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1627, 101, 1197, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1628, 101, 1198, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1629, 101, 1199, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1630, 101, 1200, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1631, 101, 1201, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1632, 101, 1202, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1633, 101, 1207, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1634, 101, 1208, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1635, 101, 1209, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1636, 101, 1210, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1637, 101, 1211, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1638, 101, 1212, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1639, 101, 1213, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1640, 101, 1215, '1', '2022-03-19 21:45:52', '1', '2022-03-19 21:45:52', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1641, 101, 2, '1', '2022-04-01 22:21:24', '1', '2022-04-01 22:21:24', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1642, 101, 1031, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1643, 101, 1032, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1644, 101, 1033, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1645, 101, 1034, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1646, 101, 1035, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1647, 101, 1050, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1648, 101, 1051, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1649, 101, 1052, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1650, 101, 1053, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1651, 101, 1054, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1652, 101, 1056, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1653, 101, 1057, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1654, 101, 1058, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1655, 101, 1059, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1656, 101, 1060, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1657, 101, 1066, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1658, 101, 1067, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1659, 101, 1070, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1660, 101, 1071, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1661, 101, 1072, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1662, 101, 1073, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1663, 101, 1074, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1664, 101, 1075, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1665, 101, 1076, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1666, 101, 1077, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1667, 101, 1078, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1668, 101, 1082, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1669, 101, 1083, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1670, 101, 1084, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1671, 101, 1085, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1672, 101, 1086, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1673, 101, 1087, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1674, 101, 1088, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1675, 101, 1089, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1676, 101, 1090, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1677, 101, 1091, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1678, 101, 1092, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1679, 101, 1237, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1680, 101, 1238, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1681, 101, 1239, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1682, 101, 1240, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1683, 101, 1241, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1684, 101, 1242, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1685, 101, 1243, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1687, 101, 106, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1688, 101, 110, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1689, 101, 111, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1690, 101, 112, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1691, 101, 113, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1692, 101, 114, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1693, 101, 115, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +INSERT INTO "system_role_menu" ("id", "role_id", "menu_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1694, 101, 116, '1', '2022-04-01 22:21:37', '1', '2022-04-01 22:21:37', 0, 1); +COMMIT; + +-- ---------------------------- +-- Table structure for system_sensitive_word +-- ---------------------------- +DROP TABLE IF EXISTS "system_sensitive_word"; +CREATE TABLE "system_sensitive_word" +( + "id" int8 NOT NULL, + "name" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, + "description" varchar(512) COLLATE "pg_catalog"."default", + "tags" varchar(255) COLLATE "pg_catalog"."default", + "status" int2 NOT NULL, + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "system_sensitive_word"."id" IS '编号'; +COMMENT +ON COLUMN "system_sensitive_word"."name" IS '敏感词'; +COMMENT +ON COLUMN "system_sensitive_word"."description" IS '描述'; +COMMENT +ON COLUMN "system_sensitive_word"."tags" IS '标签数组'; +COMMENT +ON COLUMN "system_sensitive_word"."status" IS '状态'; +COMMENT +ON COLUMN "system_sensitive_word"."creator" IS '创建者'; +COMMENT +ON COLUMN "system_sensitive_word"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "system_sensitive_word"."updater" IS '更新者'; +COMMENT +ON COLUMN "system_sensitive_word"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "system_sensitive_word"."deleted" IS '是否删除'; +COMMENT +ON TABLE "system_sensitive_word" IS '敏感词'; + +-- ---------------------------- +-- Records of system_sensitive_word +-- ---------------------------- +BEGIN; +INSERT INTO "system_sensitive_word" ("id", "name", "description", "tags", "status", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (3, '土豆', '好呀', '蔬菜,短信', 0, '1', '2022-04-08 21:07:12', '1', '2022-04-09 10:28:14', 0); +INSERT INTO "system_sensitive_word" ("id", "name", "description", "tags", "status", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (4, 'XXX', NULL, '短信', 0, '1', '2022-04-08 21:27:49', '1', '2022-04-08 21:27:49', 0); +COMMIT; + +-- ---------------------------- +-- Table structure for system_sms_channel +-- ---------------------------- +DROP TABLE IF EXISTS "system_sms_channel"; +CREATE TABLE "system_sms_channel" +( + "id" int8 NOT NULL, + "signature" varchar(12) COLLATE "pg_catalog"."default" NOT NULL, + "code" varchar(63) COLLATE "pg_catalog"."default" NOT NULL, + "status" int2 NOT NULL, + "remark" varchar(255) COLLATE "pg_catalog"."default", + "api_key" varchar(128) COLLATE "pg_catalog"."default" NOT NULL, + "api_secret" varchar(128) COLLATE "pg_catalog"."default", + "callback_url" varchar(255) COLLATE "pg_catalog"."default", + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "system_sms_channel"."id" IS '编号'; +COMMENT +ON COLUMN "system_sms_channel"."signature" IS '短信签名'; +COMMENT +ON COLUMN "system_sms_channel"."code" IS '渠道编码'; +COMMENT +ON COLUMN "system_sms_channel"."status" IS '开启状态'; +COMMENT +ON COLUMN "system_sms_channel"."remark" IS '备注'; +COMMENT +ON COLUMN "system_sms_channel"."api_key" IS '短信 API 的账号'; +COMMENT +ON COLUMN "system_sms_channel"."api_secret" IS '短信 API 的秘钥'; +COMMENT +ON COLUMN "system_sms_channel"."callback_url" IS '短信发送回调 URL'; +COMMENT +ON COLUMN "system_sms_channel"."creator" IS '创建者'; +COMMENT +ON COLUMN "system_sms_channel"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "system_sms_channel"."updater" IS '更新者'; +COMMENT +ON COLUMN "system_sms_channel"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "system_sms_channel"."deleted" IS '是否删除'; +COMMENT +ON TABLE "system_sms_channel" IS '短信渠道'; + +-- ---------------------------- +-- Records of system_sms_channel +-- ---------------------------- +BEGIN; +INSERT INTO "system_sms_channel" ("id", "signature", "code", "status", "remark", "api_key", "api_secret", + "callback_url", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (2, 'Ballcat', 'ALIYUN', 0, '啦啦啦', 'LTAI5tCnKso2uG3kJ5gRav88', 'fGJ5SNXL7P1NHNRmJ7DJaMJGPyE55C', NULL, '', + '2021-03-31 11:53:10', '1', '2021-04-14 00:08:37', 0); +INSERT INTO "system_sms_channel" ("id", "signature", "code", "status", "remark", "api_key", "api_secret", + "callback_url", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (4, '测试渠道', 'DEBUG_DING_TALK', 0, '123', '696b5d8ead48071237e4aa5861ff08dbadb2b4ded1c688a7b7c9afc615579859', + 'SEC5c4e5ff888bc8a9923ae47f59e7ccd30af1f14d93c55b4e2c9cb094e35aeed67', NULL, '1', '2021-04-13 00:23:14', '1', + '2022-03-27 20:29:49', 0); +INSERT INTO "system_sms_channel" ("id", "signature", "code", "status", "remark", "api_key", "api_secret", + "callback_url", "creator", "create_time", "updater", "update_time", "deleted") +VALUES (6, '测试演示', 'DEBUG_DING_TALK', 0, NULL, '696b5d8ead48071237e4aa5861ff08dbadb2b4ded1c688a7b7c9afc615579859', + 'SEC5c4e5ff888bc8a9923ae47f59e7ccd30af1f14d93c55b4e2c9cb094e35aeed67', NULL, '1', '2022-04-10 23:07:59', '1', + '2022-04-10 23:07:59', 0); +COMMIT; + +-- ---------------------------- +-- Table structure for system_sms_code +-- ---------------------------- +DROP TABLE IF EXISTS "system_sms_code"; +CREATE TABLE "system_sms_code" +( + "id" int8 NOT NULL, + "mobile" varchar(11) COLLATE "pg_catalog"."default" NOT NULL, + "code" varchar(6) COLLATE "pg_catalog"."default" NOT NULL, + "create_ip" varchar(15) COLLATE "pg_catalog"."default" NOT NULL, + "scene" int2 NOT NULL, + "today_index" int2 NOT NULL, + "used" bool NOT NULL, + "used_time" timestamp(6), + "used_ip" varchar(255) COLLATE "pg_catalog"."default", + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0, + "tenant_id" int8 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "system_sms_code"."id" IS '编号'; +COMMENT +ON COLUMN "system_sms_code"."mobile" IS '手机号'; +COMMENT +ON COLUMN "system_sms_code"."code" IS '验证码'; +COMMENT +ON COLUMN "system_sms_code"."create_ip" IS '创建 IP'; +COMMENT +ON COLUMN "system_sms_code"."scene" IS '发送场景'; +COMMENT +ON COLUMN "system_sms_code"."today_index" IS '今日发送的第几条'; +COMMENT +ON COLUMN "system_sms_code"."used" IS '是否使用'; +COMMENT +ON COLUMN "system_sms_code"."used_time" IS '使用时间'; +COMMENT +ON COLUMN "system_sms_code"."used_ip" IS '使用 IP'; +COMMENT +ON COLUMN "system_sms_code"."creator" IS '创建者'; +COMMENT +ON COLUMN "system_sms_code"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "system_sms_code"."updater" IS '更新者'; +COMMENT +ON COLUMN "system_sms_code"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "system_sms_code"."deleted" IS '是否删除'; +COMMENT +ON COLUMN "system_sms_code"."tenant_id" IS '租户编号'; +COMMENT +ON TABLE "system_sms_code" IS '手机验证码'; + +-- ---------------------------- +-- Records of system_sms_code +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for system_sms_log +-- ---------------------------- +DROP TABLE IF EXISTS "system_sms_log"; +CREATE TABLE "system_sms_log" +( + "id" int8 NOT NULL, + "channel_id" int8 NOT NULL, + "channel_code" varchar(63) COLLATE "pg_catalog"."default" NOT NULL, + "template_id" int8 NOT NULL, + "template_code" varchar(63) COLLATE "pg_catalog"."default" NOT NULL, + "template_type" int2 NOT NULL, + "template_content" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, + "template_params" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, + "api_template_id" varchar(63) COLLATE "pg_catalog"."default" NOT NULL, + "mobile" varchar(11) COLLATE "pg_catalog"."default" NOT NULL, + "user_id" int8, + "user_type" int2, + "send_status" int2 NOT NULL, + "send_time" timestamp(6), + "send_code" int4, + "send_msg" varchar(255) COLLATE "pg_catalog"."default", + "api_send_code" varchar(63) COLLATE "pg_catalog"."default", + "api_send_msg" varchar(255) COLLATE "pg_catalog"."default", + "api_request_id" varchar(255) COLLATE "pg_catalog"."default", + "api_serial_no" varchar(255) COLLATE "pg_catalog"."default", + "receive_status" int2 NOT NULL, + "receive_time" timestamp(6), + "api_receive_code" varchar(63) COLLATE "pg_catalog"."default", + "api_receive_msg" varchar(255) COLLATE "pg_catalog"."default", + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "system_sms_log"."id" IS '编号'; +COMMENT +ON COLUMN "system_sms_log"."channel_id" IS '短信渠道编号'; +COMMENT +ON COLUMN "system_sms_log"."channel_code" IS '短信渠道编码'; +COMMENT +ON COLUMN "system_sms_log"."template_id" IS '模板编号'; +COMMENT +ON COLUMN "system_sms_log"."template_code" IS '模板编码'; +COMMENT +ON COLUMN "system_sms_log"."template_type" IS '短信类型'; +COMMENT +ON COLUMN "system_sms_log"."template_content" IS '短信内容'; +COMMENT +ON COLUMN "system_sms_log"."template_params" IS '短信参数'; +COMMENT +ON COLUMN "system_sms_log"."api_template_id" IS '短信 API 的模板编号'; +COMMENT +ON COLUMN "system_sms_log"."mobile" IS '手机号'; +COMMENT +ON COLUMN "system_sms_log"."user_id" IS '用户编号'; +COMMENT +ON COLUMN "system_sms_log"."user_type" IS '用户类型'; +COMMENT +ON COLUMN "system_sms_log"."send_status" IS '发送状态'; +COMMENT +ON COLUMN "system_sms_log"."send_time" IS '发送时间'; +COMMENT +ON COLUMN "system_sms_log"."send_code" IS '发送结果的编码'; +COMMENT +ON COLUMN "system_sms_log"."send_msg" IS '发送结果的提示'; +COMMENT +ON COLUMN "system_sms_log"."api_send_code" IS '短信 API 发送结果的编码'; +COMMENT +ON COLUMN "system_sms_log"."api_send_msg" IS '短信 API 发送失败的提示'; +COMMENT +ON COLUMN "system_sms_log"."api_request_id" IS '短信 API 发送返回的唯一请求 ID'; +COMMENT +ON COLUMN "system_sms_log"."api_serial_no" IS '短信 API 发送返回的序号'; +COMMENT +ON COLUMN "system_sms_log"."receive_status" IS '接收状态'; +COMMENT +ON COLUMN "system_sms_log"."receive_time" IS '接收时间'; +COMMENT +ON COLUMN "system_sms_log"."api_receive_code" IS 'API 接收结果的编码'; +COMMENT +ON COLUMN "system_sms_log"."api_receive_msg" IS 'API 接收结果的说明'; +COMMENT +ON COLUMN "system_sms_log"."creator" IS '创建者'; +COMMENT +ON COLUMN "system_sms_log"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "system_sms_log"."updater" IS '更新者'; +COMMENT +ON COLUMN "system_sms_log"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "system_sms_log"."deleted" IS '是否删除'; +COMMENT +ON TABLE "system_sms_log" IS '短信日志'; + +-- ---------------------------- +-- Records of system_sms_log +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for system_sms_template +-- ---------------------------- +DROP TABLE IF EXISTS "system_sms_template"; +CREATE TABLE "system_sms_template" +( + "id" int8 NOT NULL, + "type" int2 NOT NULL, + "status" int2 NOT NULL, + "code" varchar(63) COLLATE "pg_catalog"."default" NOT NULL, + "name" varchar(63) COLLATE "pg_catalog"."default" NOT NULL, + "content" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, + "params" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, + "remark" varchar(255) COLLATE "pg_catalog"."default", + "api_template_id" varchar(63) COLLATE "pg_catalog"."default" NOT NULL, + "channel_id" int8 NOT NULL, + "channel_code" varchar(63) COLLATE "pg_catalog"."default" NOT NULL, + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "system_sms_template"."id" IS '编号'; +COMMENT +ON COLUMN "system_sms_template"."type" IS '短信签名'; +COMMENT +ON COLUMN "system_sms_template"."status" IS '开启状态'; +COMMENT +ON COLUMN "system_sms_template"."code" IS '模板编码'; +COMMENT +ON COLUMN "system_sms_template"."name" IS '模板名称'; +COMMENT +ON COLUMN "system_sms_template"."content" IS '模板内容'; +COMMENT +ON COLUMN "system_sms_template"."params" IS '参数数组'; +COMMENT +ON COLUMN "system_sms_template"."remark" IS '备注'; +COMMENT +ON COLUMN "system_sms_template"."api_template_id" IS '短信 API 的模板编号'; +COMMENT +ON COLUMN "system_sms_template"."channel_id" IS '短信渠道编号'; +COMMENT +ON COLUMN "system_sms_template"."channel_code" IS '短信渠道编码'; +COMMENT +ON COLUMN "system_sms_template"."creator" IS '创建者'; +COMMENT +ON COLUMN "system_sms_template"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "system_sms_template"."updater" IS '更新者'; +COMMENT +ON COLUMN "system_sms_template"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "system_sms_template"."deleted" IS '是否删除'; +COMMENT +ON TABLE "system_sms_template" IS '短信模板'; + +-- ---------------------------- +-- Records of system_sms_template +-- ---------------------------- +BEGIN; +INSERT INTO "system_sms_template" ("id", "type", "status", "code", "name", "content", "params", "remark", + "api_template_id", "channel_id", "channel_code", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (2, 1, 0, 'test_01', '测试验证码短信', '正在进行登录操作{operation},您的验证码是{code}', '["operation","code"]', + NULL, '4383920', 1, 'YUN_PIAN', '', '2021-03-31 10:49:38', '1', '2021-04-10 01:22:00', 0); +INSERT INTO "system_sms_template" ("id", "type", "status", "code", "name", "content", "params", "remark", + "api_template_id", "channel_id", "channel_code", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (3, 1, 0, 'test_02', '公告通知', '您的验证码{code},该验证码5分钟内有效,请勿泄漏于他人!', '["code"]', NULL, + 'SMS_207945135', 2, 'ALIYUN', '', '2021-03-31 11:56:30', '1', '2021-04-10 01:22:02', 0); +INSERT INTO "system_sms_template" ("id", "type", "status", "code", "name", "content", "params", "remark", + "api_template_id", "channel_id", "channel_code", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (6, 3, 0, 'test-01', '测试模板', '哈哈哈 {name}', '["name"]', 'f哈哈哈', '4383920', 1, 'YUN_PIAN', '1', + '2021-04-10 01:07:21', '1', '2021-04-10 01:22:05', 0); +INSERT INTO "system_sms_template" ("id", "type", "status", "code", "name", "content", "params", "remark", + "api_template_id", "channel_id", "channel_code", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (7, 3, 0, 'test-04', '测试下', '老鸡{name},牛逼{code}', '["name","code"]', NULL, 'suibian', 4, 'DEBUG_DING_TALK', + '1', '2021-04-13 00:29:53', '1', '2021-04-14 00:30:38', 0); +INSERT INTO "system_sms_template" ("id", "type", "status", "code", "name", "content", "params", "remark", + "api_template_id", "channel_id", "channel_code", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (8, 1, 0, 'user-sms-login', '前台用户短信登录', '您的验证码是{code}', '["code"]', NULL, '4372216', 1, 'YUN_PIAN', + '1', '2021-10-11 08:10:00', '1', '2021-10-11 08:10:00', 0); +INSERT INTO "system_sms_template" ("id", "type", "status", "code", "name", "content", "params", "remark", + "api_template_id", "channel_id", "channel_code", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (9, 2, 0, 'bpm_task_assigned', '【工作流】任务被分配', + '您收到了一条新的待办任务:{processInstanceName}-{taskName},申请人:{startUserNickname},处理链接:{detailUrl}', + '["processInstanceName","taskName","startUserNickname","detailUrl"]', NULL, 'suibian', 4, 'DEBUG_DING_TALK', + '1', '2022-01-21 22:31:19', '1', '2022-01-22 00:03:36', 0); +INSERT INTO "system_sms_template" ("id", "type", "status", "code", "name", "content", "params", "remark", + "api_template_id", "channel_id", "channel_code", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (10, 2, 0, 'bpm_process_instance_reject', '【工作流】流程被不通过', + '您的流程被审批不通过:{processInstanceName},原因:{reason},查看链接:{detailUrl}', + '["processInstanceName","reason","detailUrl"]', NULL, 'suibian', 4, 'DEBUG_DING_TALK', '1', + '2022-01-22 00:03:31', '1', '2022-05-01 12:33:14', 0); +INSERT INTO "system_sms_template" ("id", "type", "status", "code", "name", "content", "params", "remark", + "api_template_id", "channel_id", "channel_code", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (11, 2, 0, 'bpm_process_instance_approve', '【工作流】流程被通过', + '您的流程被审批通过:{processInstanceName},查看链接:{detailUrl}', '["processInstanceName","detailUrl"]', NULL, + 'suibian', 4, 'DEBUG_DING_TALK', '1', '2022-01-22 00:04:31', '1', '2022-03-27 20:32:21', 0); +INSERT INTO "system_sms_template" ("id", "type", "status", "code", "name", "content", "params", "remark", + "api_template_id", "channel_id", "channel_code", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (12, 2, 0, 'demo', '演示模板', '我就是测试一下下', '[]', NULL, 'biubiubiu', 6, 'DEBUG_DING_TALK', '1', + '2022-04-10 23:22:49', '1', '2022-04-10 23:22:49', 0); +INSERT INTO "system_sms_template" ("id", "type", "status", "code", "name", "content", "params", "remark", + "api_template_id", "channel_id", "channel_code", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (13, 1, 0, 'admin-sms-login', '后台用户短信登录', '您的验证码是{code}', '["code"]', '', '4372216', 1, 'YUN_PIAN', + '1', '2021-10-11 08:10:00', '1', '2021-10-11 08:10:00', 0); +COMMIT; + +-- ---------------------------- +-- Table structure for system_social_user +-- ---------------------------- +DROP TABLE IF EXISTS "system_social_user"; +CREATE TABLE "system_social_user" +( + "id" numeric(20, 0) NOT NULL, + "type" int2 NOT NULL, + "openid" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, + "token" varchar(256) COLLATE "pg_catalog"."default", + "raw_token_info" varchar(1024) COLLATE "pg_catalog"."default" NOT NULL, + "nickname" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, + "avatar" varchar(255) COLLATE "pg_catalog"."default", + "raw_user_info" varchar(1024) COLLATE "pg_catalog"."default" NOT NULL, + "code" varchar(256) COLLATE "pg_catalog"."default" NOT NULL, + "state" varchar(256) COLLATE "pg_catalog"."default", + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0, + "tenant_id" int8 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "system_social_user"."id" IS '主键(自增策略)'; +COMMENT +ON COLUMN "system_social_user"."type" IS '社交平台的类型'; +COMMENT +ON COLUMN "system_social_user"."openid" IS '社交 openid'; +COMMENT +ON COLUMN "system_social_user"."token" IS '社交 token'; +COMMENT +ON COLUMN "system_social_user"."raw_token_info" IS '原始 Token 数据,一般是 JSON 格式'; +COMMENT +ON COLUMN "system_social_user"."nickname" IS '用户昵称'; +COMMENT +ON COLUMN "system_social_user"."avatar" IS '用户头像'; +COMMENT +ON COLUMN "system_social_user"."raw_user_info" IS '原始用户数据,一般是 JSON 格式'; +COMMENT +ON COLUMN "system_social_user"."code" IS '最后一次的认证 code'; +COMMENT +ON COLUMN "system_social_user"."state" IS '最后一次的认证 state'; +COMMENT +ON COLUMN "system_social_user"."creator" IS '创建者'; +COMMENT +ON COLUMN "system_social_user"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "system_social_user"."updater" IS '更新者'; +COMMENT +ON COLUMN "system_social_user"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "system_social_user"."deleted" IS '是否删除'; +COMMENT +ON COLUMN "system_social_user"."tenant_id" IS '租户编号'; +COMMENT +ON TABLE "system_social_user" IS '社交用户表'; + +-- ---------------------------- +-- Records of system_social_user +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for system_social_user_bind +-- ---------------------------- +DROP TABLE IF EXISTS "system_social_user_bind"; +CREATE TABLE "system_social_user_bind" +( + "id" numeric(20, 0) NOT NULL, + "user_id" int8 NOT NULL, + "user_type" int2 NOT NULL, + "social_type" int2 NOT NULL, + "social_user_id" int8 NOT NULL, + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0, + "tenant_id" int8 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "system_social_user_bind"."id" IS '主键(自增策略)'; +COMMENT +ON COLUMN "system_social_user_bind"."user_id" IS '用户编号'; +COMMENT +ON COLUMN "system_social_user_bind"."user_type" IS '用户类型'; +COMMENT +ON COLUMN "system_social_user_bind"."social_type" IS '社交平台的类型'; +COMMENT +ON COLUMN "system_social_user_bind"."social_user_id" IS '社交用户的编号'; +COMMENT +ON COLUMN "system_social_user_bind"."creator" IS '创建者'; +COMMENT +ON COLUMN "system_social_user_bind"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "system_social_user_bind"."updater" IS '更新者'; +COMMENT +ON COLUMN "system_social_user_bind"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "system_social_user_bind"."deleted" IS '是否删除'; +COMMENT +ON COLUMN "system_social_user_bind"."tenant_id" IS '租户编号'; +COMMENT +ON TABLE "system_social_user_bind" IS '社交绑定表'; + +-- ---------------------------- +-- Records of system_social_user_bind +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for system_tenant +-- ---------------------------- +DROP TABLE IF EXISTS "system_tenant"; +CREATE TABLE "system_tenant" +( + "id" int8 NOT NULL, + "name" varchar(30) COLLATE "pg_catalog"."default" NOT NULL, + "contact_user_id" int8, + "contact_name" varchar(30) COLLATE "pg_catalog"."default" NOT NULL, + "contact_mobile" varchar(500) COLLATE "pg_catalog"."default", + "status" int2 NOT NULL, + "domain" varchar(256) COLLATE "pg_catalog"."default", + "package_id" int8 NOT NULL, + "expire_time" timestamp(6) NOT NULL, + "account_count" int4 NOT NULL, + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "system_tenant"."id" IS '租户编号'; +COMMENT +ON COLUMN "system_tenant"."name" IS '租户名'; +COMMENT +ON COLUMN "system_tenant"."contact_user_id" IS '联系人的用户编号'; +COMMENT +ON COLUMN "system_tenant"."contact_name" IS '联系人'; +COMMENT +ON COLUMN "system_tenant"."contact_mobile" IS '联系手机'; +COMMENT +ON COLUMN "system_tenant"."status" IS '租户状态(0正常 1停用)'; +COMMENT +ON COLUMN "system_tenant"."domain" IS '绑定域名'; +COMMENT +ON COLUMN "system_tenant"."package_id" IS '租户套餐编号'; +COMMENT +ON COLUMN "system_tenant"."expire_time" IS '过期时间'; +COMMENT +ON COLUMN "system_tenant"."account_count" IS '账号数量'; +COMMENT +ON COLUMN "system_tenant"."creator" IS '创建者'; +COMMENT +ON COLUMN "system_tenant"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "system_tenant"."updater" IS '更新者'; +COMMENT +ON COLUMN "system_tenant"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "system_tenant"."deleted" IS '是否删除'; +COMMENT +ON TABLE "system_tenant" IS '租户表'; + +-- ---------------------------- +-- Records of system_tenant +-- ---------------------------- +BEGIN; +INSERT INTO "system_tenant" ("id", "name", "contact_user_id", "contact_name", "contact_mobile", "status", "domain", + "package_id", "expire_time", "account_count", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (1, '闻荫源码', NULL, '芋艿', '17321315478', 0, 'https://www.iocoder.cn', 0, '2099-02-19 17:14:16', 9999, '1', + '2021-01-05 17:03:47', '1', '2022-02-23 12:15:11', 0); +INSERT INTO "system_tenant" ("id", "name", "contact_user_id", "contact_name", "contact_mobile", "status", "domain", + "package_id", "expire_time", "account_count", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (121, '小租户', 110, '小王2', '15601691300', 0, 'http://www.iocoder.cn', 111, '2024-03-11 00:00:00', 20, '1', + '2022-02-22 00:56:14', '1', '2022-03-19 18:37:20', 0); +INSERT INTO "system_tenant" ("id", "name", "contact_user_id", "contact_name", "contact_mobile", "status", "domain", + "package_id", "expire_time", "account_count", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (122, '测试租户', 113, '闻荫', '15601691300', 0, 'https://www.iocoder.cn', 111, '2022-04-30 00:00:00', 50, '1', + '2022-03-07 21:37:58', '1', '2022-03-07 21:37:58', 0); +COMMIT; + +-- ---------------------------- +-- Table structure for system_tenant_package +-- ---------------------------- +DROP TABLE IF EXISTS "system_tenant_package"; +CREATE TABLE "system_tenant_package" +( + "id" int8 NOT NULL, + "name" varchar(30) COLLATE "pg_catalog"."default" NOT NULL, + "status" int2 NOT NULL, + "remark" varchar(256) COLLATE "pg_catalog"."default", + "menu_ids" varchar(2048) COLLATE "pg_catalog"."default" NOT NULL, + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "system_tenant_package"."id" IS '套餐编号'; +COMMENT +ON COLUMN "system_tenant_package"."name" IS '套餐名'; +COMMENT +ON COLUMN "system_tenant_package"."status" IS '租户状态(0正常 1停用)'; +COMMENT +ON COLUMN "system_tenant_package"."remark" IS '备注'; +COMMENT +ON COLUMN "system_tenant_package"."menu_ids" IS '关联的菜单编号'; +COMMENT +ON COLUMN "system_tenant_package"."creator" IS '创建者'; +COMMENT +ON COLUMN "system_tenant_package"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "system_tenant_package"."updater" IS '更新者'; +COMMENT +ON COLUMN "system_tenant_package"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "system_tenant_package"."deleted" IS '是否删除'; +COMMENT +ON TABLE "system_tenant_package" IS '租户套餐表'; + +-- ---------------------------- +-- Records of system_tenant_package +-- ---------------------------- +BEGIN; +INSERT INTO "system_tenant_package" ("id", "name", "status", "remark", "menu_ids", "creator", "create_time", "updater", + "update_time", "deleted") +VALUES (111, '普通套餐', 0, '小功能', + '[1024,1025,1,102,103,104,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023]', '1', '2022-02-22 00:54:00', + '1', '2022-03-19 18:39:13', 0); +COMMIT; + +-- ---------------------------- +-- Table structure for system_user_post +-- ---------------------------- +DROP TABLE IF EXISTS "system_user_post"; +CREATE TABLE "system_user_post" +( + "id" int8 NOT NULL, + "user_id" int8 NOT NULL, + "post_id" int8 NOT NULL, + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "tenant_id" int8 NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "system_user_post"."id" IS 'id'; +COMMENT +ON COLUMN "system_user_post"."user_id" IS '用户ID'; +COMMENT +ON COLUMN "system_user_post"."post_id" IS '岗位ID'; +COMMENT +ON COLUMN "system_user_post"."creator" IS '创建者'; +COMMENT +ON COLUMN "system_user_post"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "system_user_post"."updater" IS '更新者'; +COMMENT +ON COLUMN "system_user_post"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "system_user_post"."tenant_id" IS '租户编号'; +COMMENT +ON COLUMN "system_user_post"."deleted" IS '是否删除'; +COMMENT +ON TABLE "system_user_post" IS '用户岗位表'; + +-- ---------------------------- +-- Records of system_user_post +-- ---------------------------- +BEGIN; +INSERT INTO "system_user_post" ("id", "user_id", "post_id", "creator", "create_time", "updater", "update_time", + "tenant_id", "deleted") +VALUES (112, 1, 1, 'admin', '2022-05-02 07:25:24', 'admin', '2022-05-02 07:25:24', 1, 0); +INSERT INTO "system_user_post" ("id", "user_id", "post_id", "creator", "create_time", "updater", "update_time", + "tenant_id", "deleted") +VALUES (113, 100, 1, 'admin', '2022-05-02 07:25:24', 'admin', '2022-05-02 07:25:24', 1, 0); +INSERT INTO "system_user_post" ("id", "user_id", "post_id", "creator", "create_time", "updater", "update_time", + "tenant_id", "deleted") +VALUES (114, 114, 3, 'admin', '2022-05-02 07:25:24', 'admin', '2022-05-02 07:25:24', 1, 0); +COMMIT; + +-- ---------------------------- +-- Table structure for system_user_role +-- ---------------------------- +DROP TABLE IF EXISTS "system_user_role"; +CREATE TABLE "system_user_role" +( + "id" int8 NOT NULL, + "user_id" int8 NOT NULL, + "role_id" int8 NOT NULL, + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6), + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6), + "deleted" int2 NOT NULL DEFAULT 0, + "tenant_id" int8 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "system_user_role"."id" IS '自增编号'; +COMMENT +ON COLUMN "system_user_role"."user_id" IS '用户ID'; +COMMENT +ON COLUMN "system_user_role"."role_id" IS '角色ID'; +COMMENT +ON COLUMN "system_user_role"."creator" IS '创建者'; +COMMENT +ON COLUMN "system_user_role"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "system_user_role"."updater" IS '更新者'; +COMMENT +ON COLUMN "system_user_role"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "system_user_role"."deleted" IS '是否删除'; +COMMENT +ON COLUMN "system_user_role"."tenant_id" IS '租户编号'; +COMMENT +ON TABLE "system_user_role" IS '用户和角色关联表'; + +-- ---------------------------- +-- Records of system_user_role +-- ---------------------------- +BEGIN; +INSERT INTO "system_user_role" ("id", "user_id", "role_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (1, 1, 1, '', '2022-01-11 13:19:45', '', '2022-05-12 12:35:17', 0, 1); +INSERT INTO "system_user_role" ("id", "user_id", "role_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (2, 2, 2, '', '2022-01-11 13:19:45', '', '2022-05-12 12:35:13', 0, 1); +INSERT INTO "system_user_role" ("id", "user_id", "role_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (4, 100, 101, '', '2022-01-11 13:19:45', '', '2022-05-12 12:35:13', 0, 1); +INSERT INTO "system_user_role" ("id", "user_id", "role_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (5, 100, 1, '', '2022-01-11 13:19:45', '', '2022-05-12 12:35:12', 0, 1); +INSERT INTO "system_user_role" ("id", "user_id", "role_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (6, 100, 2, '', '2022-01-11 13:19:45', '', '2022-05-12 12:35:11', 0, 1); +INSERT INTO "system_user_role" ("id", "user_id", "role_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (7, 104, 101, '', '2022-01-11 13:19:45', '', '2022-05-12 12:35:11', 0, 1); +INSERT INTO "system_user_role" ("id", "user_id", "role_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (10, 103, 1, '1', '2022-01-11 13:19:45', '1', '2022-01-11 13:19:45', 0, 1); +INSERT INTO "system_user_role" ("id", "user_id", "role_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (11, 107, 106, '1', '2022-02-20 22:59:33', '1', '2022-02-20 22:59:33', 0, 118); +INSERT INTO "system_user_role" ("id", "user_id", "role_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (12, 108, 107, '1', '2022-02-20 23:00:50', '1', '2022-02-20 23:00:50', 0, 119); +INSERT INTO "system_user_role" ("id", "user_id", "role_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (13, 109, 108, '1', '2022-02-20 23:11:50', '1', '2022-02-20 23:11:50', 0, 120); +INSERT INTO "system_user_role" ("id", "user_id", "role_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (14, 110, 109, '1', '2022-02-22 00:56:14', '1', '2022-02-22 00:56:14', 0, 121); +INSERT INTO "system_user_role" ("id", "user_id", "role_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (15, 111, 110, '110', '2022-02-23 13:14:38', '110', '2022-02-23 13:14:38', 0, 121); +INSERT INTO "system_user_role" ("id", "user_id", "role_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (16, 113, 111, '1', '2022-03-07 21:37:58', '1', '2022-03-07 21:37:58', 0, 122); +INSERT INTO "system_user_role" ("id", "user_id", "role_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (17, 114, 101, '1', '2022-03-19 21:51:13', '1', '2022-03-19 21:51:13', 0, 1); +INSERT INTO "system_user_role" ("id", "user_id", "role_id", "creator", "create_time", "updater", "update_time", + "deleted", "tenant_id") +VALUES (18, 1, 2, '1', '2022-05-12 20:39:29', '1', '2022-05-12 20:39:29', 0, 1); +COMMIT; + +-- ---------------------------- +-- Table structure for system_users +-- ---------------------------- +DROP TABLE IF EXISTS "system_users"; +CREATE TABLE "system_users" +( + "id" int8 NOT NULL, + "username" varchar(30) COLLATE "pg_catalog"."default" NOT NULL, + "password" varchar(100) COLLATE "pg_catalog"."default" NOT NULL, + "nickname" varchar(30) COLLATE "pg_catalog"."default" NOT NULL, + "remark" varchar(500) COLLATE "pg_catalog"."default", + "dept_id" int8, + "post_ids" varchar(255) COLLATE "pg_catalog"."default", + "email" varchar(50) COLLATE "pg_catalog"."default", + "mobile" varchar(11) COLLATE "pg_catalog"."default", + "sex" int2, + "avatar" varchar(100) COLLATE "pg_catalog"."default", + "status" int2 NOT NULL, + "login_ip" varchar(50) COLLATE "pg_catalog"."default", + "login_date" timestamp(6), + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0, + "tenant_id" int8 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "system_users"."id" IS '用户ID'; +COMMENT +ON COLUMN "system_users"."username" IS '用户账号'; +COMMENT +ON COLUMN "system_users"."password" IS '密码'; +COMMENT +ON COLUMN "system_users"."nickname" IS '用户昵称'; +COMMENT +ON COLUMN "system_users"."remark" IS '备注'; +COMMENT +ON COLUMN "system_users"."dept_id" IS '部门ID'; +COMMENT +ON COLUMN "system_users"."post_ids" IS '岗位编号数组'; +COMMENT +ON COLUMN "system_users"."email" IS '用户邮箱'; +COMMENT +ON COLUMN "system_users"."mobile" IS '手机号码'; +COMMENT +ON COLUMN "system_users"."sex" IS '用户性别'; +COMMENT +ON COLUMN "system_users"."avatar" IS '头像地址'; +COMMENT +ON COLUMN "system_users"."status" IS '帐号状态(0正常 1停用)'; +COMMENT +ON COLUMN "system_users"."login_ip" IS '最后登录IP'; +COMMENT +ON COLUMN "system_users"."login_date" IS '最后登录时间'; +COMMENT +ON COLUMN "system_users"."creator" IS '创建者'; +COMMENT +ON COLUMN "system_users"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "system_users"."updater" IS '更新者'; +COMMENT +ON COLUMN "system_users"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "system_users"."deleted" IS '是否删除'; +COMMENT +ON COLUMN "system_users"."tenant_id" IS '租户编号'; +COMMENT +ON TABLE "system_users" IS '用户信息表'; + +-- ---------------------------- +-- Records of system_users +-- ---------------------------- +BEGIN; +INSERT INTO "system_users" ("id", "username", "password", "nickname", "remark", "dept_id", "post_ids", "email", + "mobile", "sex", "avatar", "status", "login_ip", "login_date", "creator", "create_time", + "updater", "update_time", "deleted", "tenant_id") +VALUES (100, 'win', '$2a$10$11U48RhyJ5pSBYWSn12AD./ld671.ycSzJHbyrtpeoMeYiw31eo8a', '闻荫', '不要吓我', 104, '[1]', + 'win@iocoder.cn', '15601691300', 1, '', 1, '', NULL, '', '2021-01-07 09:07:17', '104', '2021-12-16 09:26:10', + 0, 1); +INSERT INTO "system_users" ("id", "username", "password", "nickname", "remark", "dept_id", "post_ids", "email", + "mobile", "sex", "avatar", "status", "login_ip", "login_date", "creator", "create_time", + "updater", "update_time", "deleted", "tenant_id") +VALUES (103, 'yuanma', '$2a$10$wWoPT7sqriM2O1YXRL.je.GiL538OR6ZTN8aQZr9JAGdnpCH2tpYe', '源码', NULL, 106, NULL, + 'yuanma@iocoder.cn', '15601701300', 0, '', 0, '127.0.0.1', '2022-01-18 00:33:40', '', '2021-01-13 23:50:35', + NULL, '2022-01-18 00:33:40', 0, 1); +INSERT INTO "system_users" ("id", "username", "password", "nickname", "remark", "dept_id", "post_ids", "email", + "mobile", "sex", "avatar", "status", "login_ip", "login_date", "creator", "create_time", + "updater", "update_time", "deleted", "tenant_id") +VALUES (104, 'test', '$2a$10$e5RpuDCC0GYSt0Hvd2.CjujIXwgGct4SnXi6dVGxdgFsnqgEryk5a', '测试号', NULL, 107, '[]', + '111@qq.com', '15601691200', 1, '', 0, '127.0.0.1', '2022-03-19 21:46:19', '', '2021-01-21 02:13:53', NULL, + '2022-03-19 21:46:19', 0, 1); +INSERT INTO "system_users" ("id", "username", "password", "nickname", "remark", "dept_id", "post_ids", "email", + "mobile", "sex", "avatar", "status", "login_ip", "login_date", "creator", "create_time", + "updater", "update_time", "deleted", "tenant_id") +VALUES (107, 'admin107', '$2a$10$dYOOBKMO93v/.ReCqzyFg.o67Tqk.bbc2bhrpyBGkIw9aypCtr2pm', '芋艿', NULL, NULL, NULL, '', + '15601691300', 0, '', 0, '', NULL, '1', '2022-02-20 22:59:33', '1', '2022-02-27 08:26:51', 0, 118); +INSERT INTO "system_users" ("id", "username", "password", "nickname", "remark", "dept_id", "post_ids", "email", + "mobile", "sex", "avatar", "status", "login_ip", "login_date", "creator", "create_time", + "updater", "update_time", "deleted", "tenant_id") +VALUES (108, 'admin108', '$2a$10$y6mfvKoNYL1GXWak8nYwVOH.kCWqjactkzdoIDgiKl93WN3Ejg.Lu', '芋艿', NULL, NULL, NULL, '', + '15601691300', 0, '', 0, '', NULL, '1', '2022-02-20 23:00:50', '1', '2022-02-27 08:26:53', 0, 119); +INSERT INTO "system_users" ("id", "username", "password", "nickname", "remark", "dept_id", "post_ids", "email", + "mobile", "sex", "avatar", "status", "login_ip", "login_date", "creator", "create_time", + "updater", "update_time", "deleted", "tenant_id") +VALUES (109, 'admin109', '$2a$10$JAqvH0tEc0I7dfDVBI7zyuB4E3j.uH6daIjV53.vUS6PknFkDJkuK', '芋艿', NULL, NULL, NULL, '', + '15601691300', 0, '', 0, '', NULL, '1', '2022-02-20 23:11:50', '1', '2022-02-27 08:26:56', 0, 120); +INSERT INTO "system_users" ("id", "username", "password", "nickname", "remark", "dept_id", "post_ids", "email", + "mobile", "sex", "avatar", "status", "login_ip", "login_date", "creator", "create_time", + "updater", "update_time", "deleted", "tenant_id") +VALUES (110, 'admin110', '$2a$10$qYxoXs0ogPHgYllyEneYde9xcCW5hZgukrxeXZ9lmLhKse8TK6IwW', '小王', NULL, NULL, NULL, '', + '15601691300', 0, '', 0, '127.0.0.1', '2022-02-23 19:36:28', '1', '2022-02-22 00:56:14', NULL, + '2022-02-27 08:26:59', 0, 121); +INSERT INTO "system_users" ("id", "username", "password", "nickname", "remark", "dept_id", "post_ids", "email", + "mobile", "sex", "avatar", "status", "login_ip", "login_date", "creator", "create_time", + "updater", "update_time", "deleted", "tenant_id") +VALUES (111, 'test', '$2a$10$mExveopHUx9Q4QiLtAzhDeH3n4/QlNLzEsM4AqgxKrU.ciUZDXZCy', '测试用户', NULL, NULL, '[]', '', + '', 0, '', 0, '', NULL, '110', '2022-02-23 13:14:33', '110', '2022-02-23 13:14:33', 0, 121); +INSERT INTO "system_users" ("id", "username", "password", "nickname", "remark", "dept_id", "post_ids", "email", + "mobile", "sex", "avatar", "status", "login_ip", "login_date", "creator", "create_time", + "updater", "update_time", "deleted", "tenant_id") +VALUES (112, 'newobject', '$2a$10$jh5MsR.ud/gKe3mVeUp5t.nEXGDSmHyv5OYjWQwHO8wlGmMSI9Twy', '新对象', NULL, NULL, '[]', + '', '', 0, '', 0, '', NULL, '1', '2022-02-23 19:08:03', '1', '2022-02-23 19:08:03', 0, 1); +INSERT INTO "system_users" ("id", "username", "password", "nickname", "remark", "dept_id", "post_ids", "email", + "mobile", "sex", "avatar", "status", "login_ip", "login_date", "creator", "create_time", + "updater", "update_time", "deleted", "tenant_id") +VALUES (113, 'aoteman', '$2a$10$0acJOIk2D25/oC87nyclE..0lzeu9DtQ/n3geP4fkun/zIVRhHJIO', '闻荫', NULL, NULL, NULL, '', + '15601691300', 0, '', 0, '127.0.0.1', '2022-03-19 18:38:51', '1', '2022-03-07 21:37:58', NULL, + '2022-03-19 18:38:51', 0, 122); +INSERT INTO "system_users" ("id", "username", "password", "nickname", "remark", "dept_id", "post_ids", "email", + "mobile", "sex", "avatar", "status", "login_ip", "login_date", "creator", "create_time", + "updater", "update_time", "deleted", "tenant_id") +VALUES (114, 'hrmgr', '$2a$10$TR4eybBioGRhBmDBWkqWLO6NIh3mzYa8KBKDDB5woiGYFVlRAi.fu', 'hr 小姐姐', NULL, NULL, '[3]', + '', '', 0, '', 0, '127.0.0.1', '2022-03-19 22:15:43', '1', '2022-03-19 21:50:58', NULL, '2022-03-19 22:15:43', + 0, 1); +INSERT INTO "system_users" ("id", "username", "password", "nickname", "remark", "dept_id", "post_ids", "email", + "mobile", "sex", "avatar", "status", "login_ip", "login_date", "creator", "create_time", + "updater", "update_time", "deleted", "tenant_id") +VALUES (115, 'aotemane', '$2a$10$/WCwGHu1eq0wOVDd/u8HweJ0gJCHyLS6T7ndCqI8UXZAQom1etk2e', '1', '11', 100, '[]', '', '', + 0, '', 0, '', NULL, '1', '2022-04-30 02:55:43', '1', '2022-04-30 02:55:43', 0, 1); +INSERT INTO "system_users" ("id", "username", "password", "nickname", "remark", "dept_id", "post_ids", "email", + "mobile", "sex", "avatar", "status", "login_ip", "login_date", "creator", "create_time", + "updater", "update_time", "deleted", "tenant_id") +VALUES (1, 'admin', '$2a$10$0acJOIk2D25/oC87nyclE..0lzeu9DtQ/n3geP4fkun/zIVRhHJIO', '闻荫源码', '管理员', 103, '[1]', + 'aoteman@126.com', '15612345678', 1, 'http://test.win.iocoder.cn/48934f2f-92d4-4250-b917-d10d2b262c6a', 0, + '127.0.0.1', '2022-05-25 23:44:33.003', 'admin', '2021-01-05 17:03:47', NULL, '2022-05-25 23:44:33.003', 0, 1); +COMMIT; + + + +-- ---------------------------- +-- Table structure for system_mail_account +-- ---------------------------- +DROP TABLE IF EXISTS "system_mail_account"; +CREATE TABLE "system_mail_account" +( + "id" int8 NOT NULL, + "mail" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, + "username" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, + "password" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, + "host" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, + "port" int4 NOT NULL, + "ssl_enable" varchar(1) COLLATE "pg_catalog"."default" NOT NULL, + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL +) +; +COMMENT +ON COLUMN "system_mail_account"."id" IS '主键'; +COMMENT +ON COLUMN "system_mail_account"."mail" IS '邮箱'; +COMMENT +ON COLUMN "system_mail_account"."username" IS '用户名'; +COMMENT +ON COLUMN "system_mail_account"."password" IS '密码'; +COMMENT +ON COLUMN "system_mail_account"."host" IS 'SMTP 服务器域名'; +COMMENT +ON COLUMN "system_mail_account"."port" IS 'SMTP 服务器端口'; +COMMENT +ON COLUMN "system_mail_account"."ssl_enable" IS '是否开启 SSL'; +COMMENT +ON COLUMN "system_mail_account"."creator" IS '创建者'; +COMMENT +ON COLUMN "system_mail_account"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "system_mail_account"."updater" IS '更新者'; +COMMENT +ON COLUMN "system_mail_account"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "system_mail_account"."deleted" IS '是否删除'; +COMMENT +ON TABLE "system_mail_account" IS '邮箱账号表'; + + +-- ---------------------------- +-- Table structure for system_mail_log +-- ---------------------------- +DROP TABLE IF EXISTS "system_mail_log"; +CREATE TABLE "system_mail_log" +( + "id" int8 NOT NULL, + "user_id" int8, + "user_type" int2, + "to_mail" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, + "account_id" int8 NOT NULL, + "from_mail" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, + "template_id" int8 NOT NULL, + "template_code" varchar(63) COLLATE "pg_catalog"."default" NOT NULL, + "template_nickname" varchar(255) COLLATE "pg_catalog"."default", + "template_title" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, + "template_content" varchar(10240) COLLATE "pg_catalog"."default" NOT NULL, + "template_params" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, + "send_status" int2 NOT NULL, + "send_time" timestamp(6), + "send_message_id" varchar(255) COLLATE "pg_catalog"."default", + "send_exception" varchar(4096) COLLATE "pg_catalog"."default", + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "system_mail_log"."id" IS '编号'; +COMMENT +ON COLUMN "system_mail_log"."user_id" IS '用户编号'; +COMMENT +ON COLUMN "system_mail_log"."user_type" IS '用户类型'; +COMMENT +ON COLUMN "system_mail_log"."to_mail" IS '接收邮箱地址'; +COMMENT +ON COLUMN "system_mail_log"."account_id" IS '邮箱账号编号'; +COMMENT +ON COLUMN "system_mail_log"."from_mail" IS '发送邮箱地址'; +COMMENT +ON COLUMN "system_mail_log"."template_id" IS '模板编号'; +COMMENT +ON COLUMN "system_mail_log"."template_code" IS '模板编码'; +COMMENT +ON COLUMN "system_mail_log"."template_nickname" IS '模版发送人名称'; +COMMENT +ON COLUMN "system_mail_log"."template_title" IS '邮件标题'; +COMMENT +ON COLUMN "system_mail_log"."template_content" IS '邮件内容'; +COMMENT +ON COLUMN "system_mail_log"."template_params" IS '邮件参数'; +COMMENT +ON COLUMN "system_mail_log"."send_status" IS '发送状态'; +COMMENT +ON COLUMN "system_mail_log"."send_time" IS '发送时间'; +COMMENT +ON COLUMN "system_mail_log"."send_message_id" IS '发送返回的消息 ID'; +COMMENT +ON COLUMN "system_mail_log"."send_exception" IS '发送异常'; +COMMENT +ON COLUMN "system_mail_log"."creator" IS '创建者'; +COMMENT +ON COLUMN "system_mail_log"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "system_mail_log"."updater" IS '更新者'; +COMMENT +ON COLUMN "system_mail_log"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "system_mail_log"."deleted" IS '是否删除'; +COMMENT +ON TABLE "system_mail_log" IS '邮件日志表'; + + +-- ---------------------------- +-- Table structure for system_mail_template +-- ---------------------------- +DROP TABLE IF EXISTS "system_mail_template"; +CREATE TABLE "system_mail_template" +( + "id" int8 NOT NULL, + "name" varchar(63) COLLATE "pg_catalog"."default" NOT NULL, + "code" varchar(63) COLLATE "pg_catalog"."default" NOT NULL, + "account_id" int8 NOT NULL, + "nickname" varchar(255) COLLATE "pg_catalog"."default", + "title" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, + "content" varchar(10240) COLLATE "pg_catalog"."default" NOT NULL, + "params" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, + "status" int2 NOT NULL, + "remark" varchar(255) COLLATE "pg_catalog"."default", + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "system_mail_template"."id" IS '编号'; +COMMENT +ON COLUMN "system_mail_template"."name" IS '模板名称'; +COMMENT +ON COLUMN "system_mail_template"."code" IS '模板编码'; +COMMENT +ON COLUMN "system_mail_template"."account_id" IS '发送的邮箱账号编号'; +COMMENT +ON COLUMN "system_mail_template"."nickname" IS '发送人名称'; +COMMENT +ON COLUMN "system_mail_template"."title" IS '模板标题'; +COMMENT +ON COLUMN "system_mail_template"."content" IS '模板内容'; +COMMENT +ON COLUMN "system_mail_template"."params" IS '参数数组'; +COMMENT +ON COLUMN "system_mail_template"."status" IS '开启状态'; +COMMENT +ON COLUMN "system_mail_template"."remark" IS '备注'; +COMMENT +ON COLUMN "system_mail_template"."creator" IS '创建者'; +COMMENT +ON COLUMN "system_mail_template"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "system_mail_template"."updater" IS '更新者'; +COMMENT +ON COLUMN "system_mail_template"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "system_mail_template"."deleted" IS '是否删除'; +COMMENT +ON TABLE "system_mail_template" IS '邮件模版表'; + + + +-- ---------------------------- +-- Table structure for system_notify_message +-- ---------------------------- +DROP TABLE IF EXISTS "system_notify_message"; +CREATE TABLE "system_notify_message" +( + "id" int8 NOT NULL, + "user_id" int8 NOT NULL, + "user_type" int2 NOT NULL, + "template_id" int8 NOT NULL, + "template_code" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "template_nickname" varchar(63) COLLATE "pg_catalog"."default" NOT NULL, + "template_content" varchar(1024) COLLATE "pg_catalog"."default" NOT NULL, + "template_type" int4 NOT NULL, + "template_params" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, + "read_status" bool NOT NULL DEFAULT false, + "read_time" timestamp(6), + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0, + "tenant_id" int8 NOT NULL +) +; +COMMENT +ON COLUMN "system_notify_message"."id" IS '用户ID'; +COMMENT +ON COLUMN "system_notify_message"."user_id" IS '用户id'; +COMMENT +ON COLUMN "system_notify_message"."user_type" IS '用户类型'; +COMMENT +ON COLUMN "system_notify_message"."template_id" IS '模版编号'; +COMMENT +ON COLUMN "system_notify_message"."template_code" IS '模板编码'; +COMMENT +ON COLUMN "system_notify_message"."template_nickname" IS '模版发送人名称'; +COMMENT +ON COLUMN "system_notify_message"."template_content" IS '模版内容'; +COMMENT +ON COLUMN "system_notify_message"."template_type" IS '模版类型'; +COMMENT +ON COLUMN "system_notify_message"."template_params" IS '模版参数'; +COMMENT +ON COLUMN "system_notify_message"."read_status" IS '是否已读'; +COMMENT +ON COLUMN "system_notify_message"."read_time" IS '阅读时间'; +COMMENT +ON COLUMN "system_notify_message"."creator" IS '创建者'; +COMMENT +ON COLUMN "system_notify_message"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "system_notify_message"."updater" IS '更新者'; +COMMENT +ON COLUMN "system_notify_message"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "system_notify_message"."deleted" IS '是否删除'; +COMMENT +ON COLUMN "system_notify_message"."tenant_id" IS '租户编号'; +COMMENT +ON TABLE "system_notify_message" IS '站内信消息表'; + + + +-- ---------------------------- +-- Table structure for system_notify_template +-- ---------------------------- +DROP TABLE IF EXISTS "system_notify_template"; +CREATE TABLE "system_notify_template" +( + "id" int8 NOT NULL, + "name" varchar(63) COLLATE "pg_catalog"."default" NOT NULL, + "code" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "nickname" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, + "content" varchar(1024) COLLATE "pg_catalog"."default" NOT NULL, + "type" int2 NOT NULL, + "params" varchar(255) COLLATE "pg_catalog"."default", + "status" int2 NOT NULL, + "remark" varchar(255) COLLATE "pg_catalog"."default", + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0 +) +; +COMMENT +ON COLUMN "system_notify_template"."id" IS '主键'; +COMMENT +ON COLUMN "system_notify_template"."name" IS '模板名称'; +COMMENT +ON COLUMN "system_notify_template"."code" IS '模版编码'; +COMMENT +ON COLUMN "system_notify_template"."nickname" IS '发送人名称'; +COMMENT +ON COLUMN "system_notify_template"."content" IS '模版内容'; +COMMENT +ON COLUMN "system_notify_template"."type" IS '类型'; +COMMENT +ON COLUMN "system_notify_template"."params" IS '参数数组'; +COMMENT +ON COLUMN "system_notify_template"."status" IS '状态'; +COMMENT +ON COLUMN "system_notify_template"."remark" IS '备注'; +COMMENT +ON COLUMN "system_notify_template"."creator" IS '创建者'; +COMMENT +ON COLUMN "system_notify_template"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "system_notify_template"."updater" IS '更新者'; +COMMENT +ON COLUMN "system_notify_template"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "system_notify_template"."deleted" IS '是否删除'; +COMMENT +ON TABLE "system_notify_template" IS '站内信模板表'; + + + +-- ---------------------------- +-- Table structure for system_user_session +-- ---------------------------- +DROP TABLE IF EXISTS "system_user_session"; +CREATE TABLE "system_user_session" +( + "id" int8 NOT NULL, + "token" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, + "user_id" int8 NOT NULL, + "user_type" int2 NOT NULL, + "session_timeout" timestamp(6) NOT NULL, + "username" varchar(30) COLLATE "pg_catalog"."default" NOT NULL, + "user_ip" varchar(50) COLLATE "pg_catalog"."default" NOT NULL, + "user_agent" varchar(512) COLLATE "pg_catalog"."default" NOT NULL, + "creator" varchar(64) COLLATE "pg_catalog"."default", + "create_time" timestamp(6) NOT NULL, + "updater" varchar(64) COLLATE "pg_catalog"."default", + "update_time" timestamp(6) NOT NULL, + "deleted" int2 NOT NULL DEFAULT 0, + "tenant_id" int8 NOT NULL +) +; +COMMENT +ON COLUMN "system_user_session"."id" IS '编号'; +COMMENT +ON COLUMN "system_user_session"."token" IS '会话编号'; +COMMENT +ON COLUMN "system_user_session"."user_id" IS '用户编号'; +COMMENT +ON COLUMN "system_user_session"."user_type" IS '用户类型'; +COMMENT +ON COLUMN "system_user_session"."session_timeout" IS '会话超时时间'; +COMMENT +ON COLUMN "system_user_session"."username" IS '用户账号'; +COMMENT +ON COLUMN "system_user_session"."user_ip" IS '用户 IP'; +COMMENT +ON COLUMN "system_user_session"."user_agent" IS '浏览器 UA'; +COMMENT +ON COLUMN "system_user_session"."creator" IS '创建者'; +COMMENT +ON COLUMN "system_user_session"."create_time" IS '创建时间'; +COMMENT +ON COLUMN "system_user_session"."updater" IS '更新者'; +COMMENT +ON COLUMN "system_user_session"."update_time" IS '更新时间'; +COMMENT +ON COLUMN "system_user_session"."deleted" IS '是否删除'; +COMMENT +ON COLUMN "system_user_session"."tenant_id" IS '租户编号'; +COMMENT +ON TABLE "system_user_session" IS '用户在线 Session'; + + + + + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- +SELECT setval('"bpm_oa_leave_seq"', 1, true); + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- +SELECT setval('"bpm_task_assign_rule_seq"', 1, true); + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- +SELECT setval('"infra_api_access_log_seq"', 537, true); + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- +SELECT setval('"infra_api_error_log_seq"', 73, true); + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- +SELECT setval('"infra_job_log_seq"', 1, true); + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- +SELECT setval('"infra_job_seq"', 2, true); + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- +SELECT setval('"system_error_code_seq"', 186, true); + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- +SELECT setval('"system_login_log_seq"', 23, true); + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- +SELECT setval('"system_oauth2_access_token_seq"', 11, true); + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- +SELECT setval('"system_oauth2_approve_seq"', 4, true); + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- +SELECT setval('"system_oauth2_client_seq"', 1, false); + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- +SELECT setval('"system_oauth2_code_seq"', 4, true); + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- +SELECT setval('"system_oauth2_refresh_token_seq"', 1, true); + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- +SELECT setval('"system_operate_log_seq"', 44, true); + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- +SELECT setval('"system_sms_log_seq"', 1, true); + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- + +-- ---------------------------- +-- Alter sequences owned by +-- ---------------------------- + +-- ---------------------------- +-- Primary Key structure for table bpm_form +-- ---------------------------- +ALTER TABLE "bpm_form" + ADD CONSTRAINT "bpm_form_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table bpm_oa_leave +-- ---------------------------- +ALTER TABLE "bpm_oa_leave" + ADD CONSTRAINT "bpm_oa_leave_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table bpm_process_definition_ext +-- ---------------------------- +ALTER TABLE "bpm_process_definition_ext" + ADD CONSTRAINT "bpm_process_definition_ext_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table bpm_process_instance_ext +-- ---------------------------- +ALTER TABLE "bpm_process_instance_ext" + ADD CONSTRAINT "bpm_process_instance_ext_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table bpm_task_assign_rule +-- ---------------------------- +ALTER TABLE "bpm_task_assign_rule" + ADD CONSTRAINT "bpm_task_assign_rule_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table bpm_task_ext +-- ---------------------------- +ALTER TABLE "bpm_task_ext" + ADD CONSTRAINT "bpm_task_ext_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table bpm_user_group +-- ---------------------------- +ALTER TABLE "bpm_user_group" + ADD CONSTRAINT "bpm_user_group_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table infra_api_access_log +-- ---------------------------- +ALTER TABLE "infra_api_access_log" + ADD CONSTRAINT "infra_api_access_log_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table infra_api_error_log +-- ---------------------------- +ALTER TABLE "infra_api_error_log" + ADD CONSTRAINT "infra_api_error_log_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table infra_codegen_column +-- ---------------------------- +ALTER TABLE "infra_codegen_column" + ADD CONSTRAINT "infra_codegen_column_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table infra_codegen_table +-- ---------------------------- +ALTER TABLE "infra_codegen_table" + ADD CONSTRAINT "infra_codegen_table_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table infra_config +-- ---------------------------- +ALTER TABLE "infra_config" + ADD CONSTRAINT "infra_config_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table infra_data_source_config +-- ---------------------------- +ALTER TABLE "infra_data_source_config" + ADD CONSTRAINT "infra_data_source_config_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table infra_file +-- ---------------------------- +ALTER TABLE "infra_file" + ADD CONSTRAINT "infra_file_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table infra_file_config +-- ---------------------------- +ALTER TABLE "infra_file_config" + ADD CONSTRAINT "infra_file_config_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table infra_file_content +-- ---------------------------- +ALTER TABLE "infra_file_content" + ADD CONSTRAINT "infra_file_content_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table infra_job +-- ---------------------------- +ALTER TABLE "infra_job" + ADD CONSTRAINT "infra_job_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table infra_job_log +-- ---------------------------- +ALTER TABLE "infra_job_log" + ADD CONSTRAINT "infra_job_log_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table infra_test_demo +-- ---------------------------- +ALTER TABLE "infra_test_demo" + ADD CONSTRAINT "infra_test_demo_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Indexes structure for table member_user +-- ---------------------------- +CREATE UNIQUE INDEX "uk_mobile" ON "member_user" USING btree ( + "mobile" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST + ); +COMMENT +ON INDEX "uk_mobile" IS '手机号'; + +-- ---------------------------- +-- Primary Key structure for table member_user +-- ---------------------------- +ALTER TABLE "member_user" + ADD CONSTRAINT "member_user_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table pay_app +-- ---------------------------- +ALTER TABLE "pay_app" + ADD CONSTRAINT "pay_app_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table pay_channel +-- ---------------------------- +ALTER TABLE "pay_channel" + ADD CONSTRAINT "pay_channel_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table pay_merchant +-- ---------------------------- +ALTER TABLE "pay_merchant" + ADD CONSTRAINT "pay_merchant_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table pay_notify_log +-- ---------------------------- +ALTER TABLE "pay_notify_log" + ADD CONSTRAINT "pay_notify_log_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table pay_notify_task +-- ---------------------------- +ALTER TABLE "pay_notify_task" + ADD CONSTRAINT "pay_notify_task_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table pay_order +-- ---------------------------- +ALTER TABLE "pay_order" + ADD CONSTRAINT "pay_order_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table pay_order_extension +-- ---------------------------- +ALTER TABLE "pay_order_extension" + ADD CONSTRAINT "pay_order_extension_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table pay_refund +-- ---------------------------- +ALTER TABLE "pay_refund" + ADD CONSTRAINT "pay_refund_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table qrtz_blob_triggers +-- ---------------------------- +ALTER TABLE "qrtz_blob_triggers" + ADD CONSTRAINT "qrtz_blob_triggers_pkey" PRIMARY KEY ("sched_name", "trigger_name", "trigger_group"); + +-- ---------------------------- +-- Primary Key structure for table qrtz_calendars +-- ---------------------------- +ALTER TABLE "qrtz_calendars" + ADD CONSTRAINT "qrtz_calendars_pkey" PRIMARY KEY ("sched_name", "calendar_name"); + +-- ---------------------------- +-- Primary Key structure for table qrtz_cron_triggers +-- ---------------------------- +ALTER TABLE "qrtz_cron_triggers" + ADD CONSTRAINT "qrtz_cron_triggers_pkey" PRIMARY KEY ("sched_name", "trigger_name", "trigger_group"); + +-- ---------------------------- +-- Indexes structure for table qrtz_fired_triggers +-- ---------------------------- +CREATE INDEX "idx_qrtz_ft_inst_job_req_rcvry" ON "qrtz_fired_triggers" USING btree ( + "sched_name" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST, + "instance_name" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST, + "requests_recovery" "pg_catalog"."bool_ops" ASC NULLS LAST + ); +CREATE INDEX "idx_qrtz_ft_j_g" ON "qrtz_fired_triggers" USING btree ( + "sched_name" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST, + "job_name" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST, + "job_group" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST + ); +CREATE INDEX "idx_qrtz_ft_jg" ON "qrtz_fired_triggers" USING btree ( + "sched_name" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST, + "job_group" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST + ); +CREATE INDEX "idx_qrtz_ft_t_g" ON "qrtz_fired_triggers" USING btree ( + "sched_name" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST, + "trigger_name" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST, + "trigger_group" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST + ); +CREATE INDEX "idx_qrtz_ft_tg" ON "qrtz_fired_triggers" USING btree ( + "sched_name" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST, + "trigger_group" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST + ); +CREATE INDEX "idx_qrtz_ft_trig_inst_name" ON "qrtz_fired_triggers" USING btree ( + "sched_name" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST, + "instance_name" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST + ); + +-- ---------------------------- +-- Primary Key structure for table qrtz_fired_triggers +-- ---------------------------- +ALTER TABLE "qrtz_fired_triggers" + ADD CONSTRAINT "qrtz_fired_triggers_pkey" PRIMARY KEY ("sched_name", "entry_id"); + +-- ---------------------------- +-- Indexes structure for table qrtz_job_details +-- ---------------------------- +CREATE INDEX "idx_qrtz_j_grp" ON "qrtz_job_details" USING btree ( + "sched_name" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST, + "job_group" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST + ); +CREATE INDEX "idx_qrtz_j_req_recovery" ON "qrtz_job_details" USING btree ( + "sched_name" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST, + "requests_recovery" "pg_catalog"."bool_ops" ASC NULLS LAST + ); + +-- ---------------------------- +-- Primary Key structure for table qrtz_job_details +-- ---------------------------- +ALTER TABLE "qrtz_job_details" + ADD CONSTRAINT "qrtz_job_details_pkey" PRIMARY KEY ("sched_name", "job_name", "job_group"); + +-- ---------------------------- +-- Primary Key structure for table qrtz_locks +-- ---------------------------- +ALTER TABLE "qrtz_locks" + ADD CONSTRAINT "qrtz_locks_pkey" PRIMARY KEY ("sched_name", "lock_name"); + +-- ---------------------------- +-- Primary Key structure for table qrtz_paused_trigger_grps +-- ---------------------------- +ALTER TABLE "qrtz_paused_trigger_grps" + ADD CONSTRAINT "qrtz_paused_trigger_grps_pkey" PRIMARY KEY ("sched_name", "trigger_group"); + +-- ---------------------------- +-- Primary Key structure for table qrtz_scheduler_state +-- ---------------------------- +ALTER TABLE "qrtz_scheduler_state" + ADD CONSTRAINT "qrtz_scheduler_state_pkey" PRIMARY KEY ("sched_name", "instance_name"); + +-- ---------------------------- +-- Primary Key structure for table qrtz_simple_triggers +-- ---------------------------- +ALTER TABLE "qrtz_simple_triggers" + ADD CONSTRAINT "qrtz_simple_triggers_pkey" PRIMARY KEY ("sched_name", "trigger_name", "trigger_group"); + +-- ---------------------------- +-- Primary Key structure for table qrtz_simprop_triggers +-- ---------------------------- +ALTER TABLE "qrtz_simprop_triggers" + ADD CONSTRAINT "qrtz_simprop_triggers_pkey" PRIMARY KEY ("sched_name", "trigger_name", "trigger_group"); + +-- ---------------------------- +-- Indexes structure for table qrtz_triggers +-- ---------------------------- +CREATE INDEX "idx_qrtz_t_c" ON "qrtz_triggers" USING btree ( + "sched_name" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST, + "calendar_name" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST + ); +CREATE INDEX "idx_qrtz_t_g" ON "qrtz_triggers" USING btree ( + "sched_name" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST, + "trigger_group" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST + ); +CREATE INDEX "idx_qrtz_t_j" ON "qrtz_triggers" USING btree ( + "sched_name" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST, + "job_name" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST, + "job_group" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST + ); +CREATE INDEX "idx_qrtz_t_jg" ON "qrtz_triggers" USING btree ( + "sched_name" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST, + "job_group" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST + ); +CREATE INDEX "idx_qrtz_t_n_g_state" ON "qrtz_triggers" USING btree ( + "sched_name" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST, + "trigger_group" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST, + "trigger_state" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST + ); +CREATE INDEX "idx_qrtz_t_n_state" ON "qrtz_triggers" USING btree ( + "sched_name" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST, + "trigger_name" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST, + "trigger_group" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST, + "trigger_state" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST + ); +CREATE INDEX "idx_qrtz_t_next_fire_time" ON "qrtz_triggers" USING btree ( + "sched_name" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST, + "next_fire_time" "pg_catalog"."int8_ops" ASC NULLS LAST + ); +CREATE INDEX "idx_qrtz_t_nft_misfire" ON "qrtz_triggers" USING btree ( + "sched_name" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST, + "misfire_instr" "pg_catalog"."int2_ops" ASC NULLS LAST, + "next_fire_time" "pg_catalog"."int8_ops" ASC NULLS LAST + ); +CREATE INDEX "idx_qrtz_t_nft_st" ON "qrtz_triggers" USING btree ( + "sched_name" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST, + "trigger_state" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST, + "next_fire_time" "pg_catalog"."int8_ops" ASC NULLS LAST + ); +CREATE INDEX "idx_qrtz_t_nft_st_misfire" ON "qrtz_triggers" USING btree ( + "sched_name" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST, + "misfire_instr" "pg_catalog"."int2_ops" ASC NULLS LAST, + "next_fire_time" "pg_catalog"."int8_ops" ASC NULLS LAST, + "trigger_state" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST + ); +CREATE INDEX "idx_qrtz_t_nft_st_misfire_grp" ON "qrtz_triggers" USING btree ( + "sched_name" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST, + "misfire_instr" "pg_catalog"."int2_ops" ASC NULLS LAST, + "next_fire_time" "pg_catalog"."int8_ops" ASC NULLS LAST, + "trigger_group" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST, + "trigger_state" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST + ); +CREATE INDEX "idx_qrtz_t_state" ON "qrtz_triggers" USING btree ( + "sched_name" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST, + "trigger_state" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST + ); + +-- ---------------------------- +-- Primary Key structure for table qrtz_triggers +-- ---------------------------- +ALTER TABLE "qrtz_triggers" + ADD CONSTRAINT "qrtz_triggers_pkey" PRIMARY KEY ("sched_name", "trigger_name", "trigger_group"); + +-- ---------------------------- +-- Primary Key structure for table system_dept +-- ---------------------------- +ALTER TABLE "system_dept" + ADD CONSTRAINT "system_dept_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table system_dict_data +-- ---------------------------- +ALTER TABLE "system_dict_data" + ADD CONSTRAINT "system_dict_data_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Indexes structure for table system_dict_type +-- ---------------------------- +CREATE UNIQUE INDEX "dict_type" ON "system_dict_type" USING btree ( + "type" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST + ); + +-- ---------------------------- +-- Primary Key structure for table system_dict_type +-- ---------------------------- +ALTER TABLE "system_dict_type" + ADD CONSTRAINT "system_dict_type_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table system_error_code +-- ---------------------------- +ALTER TABLE "system_error_code" + ADD CONSTRAINT "system_error_code_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table system_login_log +-- ---------------------------- +ALTER TABLE "system_login_log" + ADD CONSTRAINT "system_login_log_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table system_menu +-- ---------------------------- +ALTER TABLE "system_menu" + ADD CONSTRAINT "system_menu_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table system_notice +-- ---------------------------- +ALTER TABLE "system_notice" + ADD CONSTRAINT "system_notice_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table system_oauth2_access_token +-- ---------------------------- +ALTER TABLE "system_oauth2_access_token" + ADD CONSTRAINT "system_oauth2_access_token_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table system_oauth2_approve +-- ---------------------------- +ALTER TABLE "system_oauth2_approve" + ADD CONSTRAINT "system_oauth2_approve_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table system_oauth2_client +-- ---------------------------- +ALTER TABLE "system_oauth2_client" + ADD CONSTRAINT "system_oauth2_client_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table system_oauth2_code +-- ---------------------------- +ALTER TABLE "system_oauth2_code" + ADD CONSTRAINT "system_oauth2_code_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table system_oauth2_refresh_token +-- ---------------------------- +ALTER TABLE "system_oauth2_refresh_token" + ADD CONSTRAINT "system_oauth2_refresh_token_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table system_operate_log +-- ---------------------------- +ALTER TABLE "system_operate_log" + ADD CONSTRAINT "system_operate_log_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table system_post +-- ---------------------------- +ALTER TABLE "system_post" + ADD CONSTRAINT "system_post_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table system_role +-- ---------------------------- +ALTER TABLE "system_role" + ADD CONSTRAINT "system_role_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table system_role_menu +-- ---------------------------- +ALTER TABLE "system_role_menu" + ADD CONSTRAINT "system_role_menu_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table system_sensitive_word +-- ---------------------------- +ALTER TABLE "system_sensitive_word" + ADD CONSTRAINT "system_sensitive_word_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table system_sms_channel +-- ---------------------------- +ALTER TABLE "system_sms_channel" + ADD CONSTRAINT "system_sms_channel_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Indexes structure for table system_sms_code +-- ---------------------------- +CREATE INDEX "idx_mobile" ON "system_sms_code" USING btree ( + "mobile" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST + ); +COMMENT +ON INDEX "idx_mobile" IS '手机号'; + +-- ---------------------------- +-- Primary Key structure for table system_sms_code +-- ---------------------------- +ALTER TABLE "system_sms_code" + ADD CONSTRAINT "system_sms_code_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table system_sms_log +-- ---------------------------- +ALTER TABLE "system_sms_log" + ADD CONSTRAINT "system_sms_log_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table system_sms_template +-- ---------------------------- +ALTER TABLE "system_sms_template" + ADD CONSTRAINT "system_sms_template_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table system_social_user +-- ---------------------------- +ALTER TABLE "system_social_user" + ADD CONSTRAINT "system_social_user_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table system_social_user_bind +-- ---------------------------- +ALTER TABLE "system_social_user_bind" + ADD CONSTRAINT "system_social_user_bind_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table system_tenant +-- ---------------------------- +ALTER TABLE "system_tenant" + ADD CONSTRAINT "system_tenant_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table system_tenant_package +-- ---------------------------- +ALTER TABLE "system_tenant_package" + ADD CONSTRAINT "system_tenant_package_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table system_user_post +-- ---------------------------- +ALTER TABLE "system_user_post" + ADD CONSTRAINT "system_user_post_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table system_user_role +-- ---------------------------- +ALTER TABLE "system_user_role" + ADD CONSTRAINT "system_user_role_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Indexes structure for table system_users +-- ---------------------------- +CREATE UNIQUE INDEX "idx_username" ON "system_users" USING btree ( + "username" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST, + "update_time" "pg_catalog"."timestamp_ops" ASC NULLS LAST, + "tenant_id" "pg_catalog"."int8_ops" ASC NULLS LAST + ); + +-- ---------------------------- +-- Primary Key structure for table system_users +-- ---------------------------- +ALTER TABLE "system_users" + ADD CONSTRAINT "system_user_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Foreign Keys structure for table qrtz_blob_triggers +-- ---------------------------- +ALTER TABLE "qrtz_blob_triggers" + ADD CONSTRAINT "qrtz_blob_triggers_sched_name_trigger_name_trigger_group_fkey" FOREIGN KEY ("sched_name", "trigger_name", "trigger_group") REFERENCES "qrtz_triggers" ("sched_name", "trigger_name", "trigger_group") ON DELETE NO ACTION ON UPDATE NO ACTION; + +-- ---------------------------- +-- Foreign Keys structure for table qrtz_cron_triggers +-- ---------------------------- +ALTER TABLE "qrtz_cron_triggers" + ADD CONSTRAINT "qrtz_cron_triggers_sched_name_trigger_name_trigger_group_fkey" FOREIGN KEY ("sched_name", "trigger_name", "trigger_group") REFERENCES "qrtz_triggers" ("sched_name", "trigger_name", "trigger_group") ON DELETE NO ACTION ON UPDATE NO ACTION; + +-- ---------------------------- +-- Foreign Keys structure for table qrtz_simple_triggers +-- ---------------------------- +ALTER TABLE "qrtz_simple_triggers" + ADD CONSTRAINT "qrtz_simple_triggers_sched_name_trigger_name_trigger_group_fkey" FOREIGN KEY ("sched_name", "trigger_name", "trigger_group") REFERENCES "qrtz_triggers" ("sched_name", "trigger_name", "trigger_group") ON DELETE NO ACTION ON UPDATE NO ACTION; + +-- ---------------------------- +-- Foreign Keys structure for table qrtz_simprop_triggers +-- ---------------------------- +ALTER TABLE "qrtz_simprop_triggers" + ADD CONSTRAINT "qrtz_simprop_triggers_sched_name_trigger_name_trigger_grou_fkey" FOREIGN KEY ("sched_name", "trigger_name", "trigger_group") REFERENCES "qrtz_triggers" ("sched_name", "trigger_name", "trigger_group") ON DELETE NO ACTION ON UPDATE NO ACTION; + +-- ---------------------------- +-- Foreign Keys structure for table qrtz_triggers +-- ---------------------------- +ALTER TABLE "qrtz_triggers" + ADD CONSTRAINT "qrtz_triggers_sched_name_job_name_job_group_fkey" FOREIGN KEY ("sched_name", "job_name", "job_group") REFERENCES "qrtz_job_details" ("sched_name", "job_name", "job_group") ON DELETE NO ACTION ON UPDATE NO ACTION; diff --git a/sql/sqlserver/ruoyi-vue-pro.sql b/sql/sqlserver/ruoyi-vue-pro.sql new file mode 100644 index 0000000..48bdc5d --- /dev/null +++ b/sql/sqlserver/ruoyi-vue-pro.sql @@ -0,0 +1,12399 @@ +/* + Navicat Premium Data Transfer + + Source Server : 127.0.0.1 SQLServer + Source Server Type : SQL Server + Source Server Version : 15004198 + Source Host : 127.0.0.1:1433 + Source Catalog : ruoyi-vue-pro + Source Schema : dbo + + Target Server Type : SQL Server + Target Server Version : 15004198 + File Encoding : 65001 + + Date: 15/06/2022 08:15:45 +*/ + + +-- ---------------------------- +-- Table structure for QRTZ_BLOB_TRIGGERS +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[QRTZ_BLOB_TRIGGERS]') AND type IN ('U')) + DROP TABLE [dbo].[QRTZ_BLOB_TRIGGERS] +GO + +CREATE TABLE [dbo].[QRTZ_BLOB_TRIGGERS] ( + [SCHED_NAME] varchar(120) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [TRIGGER_NAME] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [TRIGGER_GROUP] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [BLOB_DATA] varbinary(max) NULL +) +GO + +ALTER TABLE [dbo].[QRTZ_BLOB_TRIGGERS] SET (LOCK_ESCALATION = TABLE) +GO + + +-- ---------------------------- +-- Records of QRTZ_BLOB_TRIGGERS +-- ---------------------------- +BEGIN TRANSACTION +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for QRTZ_CALENDARS +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[QRTZ_CALENDARS]') AND type IN ('U')) + DROP TABLE [dbo].[QRTZ_CALENDARS] +GO + +CREATE TABLE [dbo].[QRTZ_CALENDARS] ( + [SCHED_NAME] varchar(120) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [CALENDAR_NAME] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [CALENDAR] varbinary(max) NOT NULL +) +GO + +ALTER TABLE [dbo].[QRTZ_CALENDARS] SET (LOCK_ESCALATION = TABLE) +GO + + +-- ---------------------------- +-- Records of QRTZ_CALENDARS +-- ---------------------------- +BEGIN TRANSACTION +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for QRTZ_CRON_TRIGGERS +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[QRTZ_CRON_TRIGGERS]') AND type IN ('U')) + DROP TABLE [dbo].[QRTZ_CRON_TRIGGERS] +GO + +CREATE TABLE [dbo].[QRTZ_CRON_TRIGGERS] ( + [SCHED_NAME] varchar(120) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [TRIGGER_NAME] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [TRIGGER_GROUP] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [CRON_EXPRESSION] varchar(120) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [TIME_ZONE_ID] varchar(80) COLLATE SQL_Latin1_General_CP1_CI_AS NULL +) +GO + +ALTER TABLE [dbo].[QRTZ_CRON_TRIGGERS] SET (LOCK_ESCALATION = TABLE) +GO + + +-- ---------------------------- +-- Records of QRTZ_CRON_TRIGGERS +-- ---------------------------- +BEGIN TRANSACTION +GO + +INSERT INTO [dbo].[QRTZ_CRON_TRIGGERS] ([SCHED_NAME], [TRIGGER_NAME], [TRIGGER_GROUP], [CRON_EXPRESSION], [TIME_ZONE_ID]) VALUES (N'schedulerName', N'userSessionTimeoutJob', N'DEFAULT', N'0 * * * * ? *', N'Asia/Shanghai') +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for QRTZ_FIRED_TRIGGERS +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[QRTZ_FIRED_TRIGGERS]') AND type IN ('U')) + DROP TABLE [dbo].[QRTZ_FIRED_TRIGGERS] +GO + +CREATE TABLE [dbo].[QRTZ_FIRED_TRIGGERS] ( + [SCHED_NAME] varchar(120) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [ENTRY_ID] varchar(95) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [TRIGGER_NAME] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [TRIGGER_GROUP] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [INSTANCE_NAME] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [FIRED_TIME] bigint NOT NULL, + [SCHED_TIME] bigint NOT NULL, + [PRIORITY] int NOT NULL, + [STATE] varchar(16) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [JOB_NAME] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [JOB_GROUP] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [IS_NONCONCURRENT] varchar(1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [REQUESTS_RECOVERY] varchar(1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL +) +GO + +ALTER TABLE [dbo].[QRTZ_FIRED_TRIGGERS] SET (LOCK_ESCALATION = TABLE) +GO + + +-- ---------------------------- +-- Records of QRTZ_FIRED_TRIGGERS +-- ---------------------------- +BEGIN TRANSACTION +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for QRTZ_JOB_DETAILS +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[QRTZ_JOB_DETAILS]') AND type IN ('U')) + DROP TABLE [dbo].[QRTZ_JOB_DETAILS] +GO + +CREATE TABLE [dbo].[QRTZ_JOB_DETAILS] ( + [SCHED_NAME] varchar(120) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [JOB_NAME] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [JOB_GROUP] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [DESCRIPTION] varchar(250) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [JOB_CLASS_NAME] varchar(250) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [IS_DURABLE] varchar(1) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [IS_NONCONCURRENT] varchar(1) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [IS_UPDATE_DATA] varchar(1) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [REQUESTS_RECOVERY] varchar(1) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [JOB_DATA] varbinary(max) NULL +) +GO + +ALTER TABLE [dbo].[QRTZ_JOB_DETAILS] SET (LOCK_ESCALATION = TABLE) +GO + + +-- ---------------------------- +-- Records of QRTZ_JOB_DETAILS +-- ---------------------------- +BEGIN TRANSACTION +GO + +INSERT INTO [dbo].[QRTZ_JOB_DETAILS] ([SCHED_NAME], [JOB_NAME], [JOB_GROUP], [DESCRIPTION], [JOB_CLASS_NAME], [IS_DURABLE], [IS_NONCONCURRENT], [IS_UPDATE_DATA], [REQUESTS_RECOVERY], [JOB_DATA]) VALUES (N'schedulerName', N'userSessionTimeoutJob', N'DEFAULT', NULL, N'com.win.framework.quartz.core.handler.JobHandlerInvoker', N'0', N'1', N'1', N'0', 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C770800000010000000027400064A4F425F49447372000E6A6176612E6C616E672E4C6F6E673B8BE490CC8F23DF0200014A000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B020000787000000000000000107400104A4F425F48414E444C45525F4E414D457400157573657253657373696F6E54696D656F75744A6F627800) +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for QRTZ_LOCKS +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[QRTZ_LOCKS]') AND type IN ('U')) + DROP TABLE [dbo].[QRTZ_LOCKS] +GO + +CREATE TABLE [dbo].[QRTZ_LOCKS] ( + [SCHED_NAME] varchar(120) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [LOCK_NAME] varchar(40) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL +) +GO + +ALTER TABLE [dbo].[QRTZ_LOCKS] SET (LOCK_ESCALATION = TABLE) +GO + + +-- ---------------------------- +-- Records of QRTZ_LOCKS +-- ---------------------------- +BEGIN TRANSACTION +GO + +INSERT INTO [dbo].[QRTZ_LOCKS] ([SCHED_NAME], [LOCK_NAME]) VALUES (N'schedulerName', N'STATE_ACCESS') +GO + +INSERT INTO [dbo].[QRTZ_LOCKS] ([SCHED_NAME], [LOCK_NAME]) VALUES (N'schedulerName', N'TRIGGER_ACCESS') +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for QRTZ_PAUSED_TRIGGER_GRPS +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[QRTZ_PAUSED_TRIGGER_GRPS]') AND type IN ('U')) + DROP TABLE [dbo].[QRTZ_PAUSED_TRIGGER_GRPS] +GO + +CREATE TABLE [dbo].[QRTZ_PAUSED_TRIGGER_GRPS] ( + [SCHED_NAME] varchar(120) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [TRIGGER_GROUP] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL +) +GO + +ALTER TABLE [dbo].[QRTZ_PAUSED_TRIGGER_GRPS] SET (LOCK_ESCALATION = TABLE) +GO + + +-- ---------------------------- +-- Records of QRTZ_PAUSED_TRIGGER_GRPS +-- ---------------------------- +BEGIN TRANSACTION +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for QRTZ_SCHEDULER_STATE +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[QRTZ_SCHEDULER_STATE]') AND type IN ('U')) + DROP TABLE [dbo].[QRTZ_SCHEDULER_STATE] +GO + +CREATE TABLE [dbo].[QRTZ_SCHEDULER_STATE] ( + [SCHED_NAME] varchar(120) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [INSTANCE_NAME] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [LAST_CHECKIN_TIME] bigint NOT NULL, + [CHECKIN_INTERVAL] bigint NOT NULL +) +GO + +ALTER TABLE [dbo].[QRTZ_SCHEDULER_STATE] SET (LOCK_ESCALATION = TABLE) +GO + + +-- ---------------------------- +-- Records of QRTZ_SCHEDULER_STATE +-- ---------------------------- +BEGIN TRANSACTION +GO + +INSERT INTO [dbo].[QRTZ_SCHEDULER_STATE] ([SCHED_NAME], [INSTANCE_NAME], [LAST_CHECKIN_TIME], [CHECKIN_INTERVAL]) VALUES (N'schedulerName', N'Yunai1651483828928', N'1651484588813', N'15000') +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for QRTZ_SIMPLE_TRIGGERS +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[QRTZ_SIMPLE_TRIGGERS]') AND type IN ('U')) + DROP TABLE [dbo].[QRTZ_SIMPLE_TRIGGERS] +GO + +CREATE TABLE [dbo].[QRTZ_SIMPLE_TRIGGERS] ( + [SCHED_NAME] varchar(120) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [TRIGGER_NAME] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [TRIGGER_GROUP] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [REPEAT_COUNT] bigint NOT NULL, + [REPEAT_INTERVAL] bigint NOT NULL, + [TIMES_TRIGGERED] bigint NOT NULL +) +GO + +ALTER TABLE [dbo].[QRTZ_SIMPLE_TRIGGERS] SET (LOCK_ESCALATION = TABLE) +GO + + +-- ---------------------------- +-- Records of QRTZ_SIMPLE_TRIGGERS +-- ---------------------------- +BEGIN TRANSACTION +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for QRTZ_SIMPROP_TRIGGERS +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[QRTZ_SIMPROP_TRIGGERS]') AND type IN ('U')) + DROP TABLE [dbo].[QRTZ_SIMPROP_TRIGGERS] +GO + +CREATE TABLE [dbo].[QRTZ_SIMPROP_TRIGGERS] ( + [SCHED_NAME] varchar(120) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [TRIGGER_NAME] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [TRIGGER_GROUP] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [STR_PROP_1] varchar(512) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [STR_PROP_2] varchar(512) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [STR_PROP_3] varchar(512) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [INT_PROP_1] int NULL, + [INT_PROP_2] int NULL, + [LONG_PROP_1] bigint NULL, + [LONG_PROP_2] bigint NULL, + [DEC_PROP_1] numeric(13,4) NULL, + [DEC_PROP_2] numeric(13,4) NULL, + [BOOL_PROP_1] varchar(1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [BOOL_PROP_2] varchar(1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL +) +GO + +ALTER TABLE [dbo].[QRTZ_SIMPROP_TRIGGERS] SET (LOCK_ESCALATION = TABLE) +GO + + +-- ---------------------------- +-- Records of QRTZ_SIMPROP_TRIGGERS +-- ---------------------------- +BEGIN TRANSACTION +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for QRTZ_TRIGGERS +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[QRTZ_TRIGGERS]') AND type IN ('U')) + DROP TABLE [dbo].[QRTZ_TRIGGERS] +GO + +CREATE TABLE [dbo].[QRTZ_TRIGGERS] ( + [SCHED_NAME] varchar(120) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [TRIGGER_NAME] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [TRIGGER_GROUP] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [JOB_NAME] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [JOB_GROUP] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [DESCRIPTION] varchar(250) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [NEXT_FIRE_TIME] bigint NULL, + [PREV_FIRE_TIME] bigint NULL, + [PRIORITY] int NULL, + [TRIGGER_STATE] varchar(16) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [TRIGGER_TYPE] varchar(8) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [START_TIME] bigint NOT NULL, + [END_TIME] bigint NULL, + [CALENDAR_NAME] varchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [MISFIRE_INSTR] smallint NULL, + [JOB_DATA] varbinary(max) NULL +) +GO + +ALTER TABLE [dbo].[QRTZ_TRIGGERS] SET (LOCK_ESCALATION = TABLE) +GO + + +-- ---------------------------- +-- Records of QRTZ_TRIGGERS +-- ---------------------------- +BEGIN TRANSACTION +GO + +INSERT INTO [dbo].[QRTZ_TRIGGERS] ([SCHED_NAME], [TRIGGER_NAME], [TRIGGER_GROUP], [JOB_NAME], [JOB_GROUP], [DESCRIPTION], [NEXT_FIRE_TIME], [PREV_FIRE_TIME], [PRIORITY], [TRIGGER_STATE], [TRIGGER_TYPE], [START_TIME], [END_TIME], [CALENDAR_NAME], [MISFIRE_INSTR], [JOB_DATA]) VALUES (N'schedulerName', N'userSessionTimeoutJob', N'DEFAULT', N'userSessionTimeoutJob', N'DEFAULT', NULL, N'1651484640000', N'1651484580000', N'5', N'WAITING', N'CRON', N'1651483728000', N'0', NULL, N'0', 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C770800000010000000037400114A4F425F48414E444C45525F504152414D707400124A4F425F52455452595F494E54455256414C737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B02000078700000000374000F4A4F425F52455452595F434F554E547371007E0009000007D07800) +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for bpm_form +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[bpm_form]') AND type IN ('U')) + DROP TABLE [dbo].[bpm_form] +GO + +CREATE TABLE [dbo].[bpm_form] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [name] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [status] tinyint NOT NULL, + [conf] nvarchar(1000) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [fields] nvarchar(max) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [remark] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL, + [tenant_id] bigint DEFAULT 0 NOT NULL +) +GO + +ALTER TABLE [dbo].[bpm_form] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'编号', +'SCHEMA', N'dbo', +'TABLE', N'bpm_form', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'表单名', +'SCHEMA', N'dbo', +'TABLE', N'bpm_form', +'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'开启状态', +'SCHEMA', N'dbo', +'TABLE', N'bpm_form', +'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'表单的配置', +'SCHEMA', N'dbo', +'TABLE', N'bpm_form', +'COLUMN', N'conf' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'表单项的数组', +'SCHEMA', N'dbo', +'TABLE', N'bpm_form', +'COLUMN', N'fields' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'备注', +'SCHEMA', N'dbo', +'TABLE', N'bpm_form', +'COLUMN', N'remark' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'bpm_form', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'bpm_form', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'bpm_form', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'bpm_form', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'bpm_form', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户编号', +'SCHEMA', N'dbo', +'TABLE', N'bpm_form', +'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'工作流的表单定义', +'SCHEMA', N'dbo', +'TABLE', N'bpm_form' +GO + + +-- ---------------------------- +-- Records of bpm_form +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[bpm_form] ON +GO + +SET IDENTITY_INSERT [dbo].[bpm_form] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for bpm_oa_leave +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[bpm_oa_leave]') AND type IN ('U')) + DROP TABLE [dbo].[bpm_oa_leave] +GO + +CREATE TABLE [dbo].[bpm_oa_leave] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [user_id] bigint NOT NULL, + [type] tinyint NOT NULL, + [reason] nvarchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [start_time] datetime2(7) NOT NULL, + [end_time] datetime2(7) NOT NULL, + [day] tinyint NOT NULL, + [result] tinyint NOT NULL, + [process_instance_id] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [tenant_id] bigint DEFAULT 0 NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL +) +GO + +ALTER TABLE [dbo].[bpm_oa_leave] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'请假表单主键', +'SCHEMA', N'dbo', +'TABLE', N'bpm_oa_leave', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'申请人的用户编号', +'SCHEMA', N'dbo', +'TABLE', N'bpm_oa_leave', +'COLUMN', N'user_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'请假类型', +'SCHEMA', N'dbo', +'TABLE', N'bpm_oa_leave', +'COLUMN', N'type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'请假原因', +'SCHEMA', N'dbo', +'TABLE', N'bpm_oa_leave', +'COLUMN', N'reason' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'开始时间', +'SCHEMA', N'dbo', +'TABLE', N'bpm_oa_leave', +'COLUMN', N'start_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'结束时间', +'SCHEMA', N'dbo', +'TABLE', N'bpm_oa_leave', +'COLUMN', N'end_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'请假天数', +'SCHEMA', N'dbo', +'TABLE', N'bpm_oa_leave', +'COLUMN', N'day' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'请假结果', +'SCHEMA', N'dbo', +'TABLE', N'bpm_oa_leave', +'COLUMN', N'result' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'流程实例的编号', +'SCHEMA', N'dbo', +'TABLE', N'bpm_oa_leave', +'COLUMN', N'process_instance_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'bpm_oa_leave', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'bpm_oa_leave', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'bpm_oa_leave', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'bpm_oa_leave', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户编号', +'SCHEMA', N'dbo', +'TABLE', N'bpm_oa_leave', +'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'bpm_oa_leave', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'OA 请假申请表', +'SCHEMA', N'dbo', +'TABLE', N'bpm_oa_leave' +GO + + +-- ---------------------------- +-- Records of bpm_oa_leave +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[bpm_oa_leave] ON +GO + +SET IDENTITY_INSERT [dbo].[bpm_oa_leave] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for bpm_process_definition_ext +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[bpm_process_definition_ext]') AND type IN ('U')) + DROP TABLE [dbo].[bpm_process_definition_ext] +GO + +CREATE TABLE [dbo].[bpm_process_definition_ext] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [process_definition_id] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [model_id] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [description] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [form_type] tinyint NOT NULL, + [form_id] bigint NULL, + [form_conf] nvarchar(1000) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [form_fields] nvarchar(max) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [form_custom_create_path] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [form_custom_view_path] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [tenant_id] bigint DEFAULT 0 NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL +) +GO + +ALTER TABLE [dbo].[bpm_process_definition_ext] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'编号', +'SCHEMA', N'dbo', +'TABLE', N'bpm_process_definition_ext', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'流程定义的编号', +'SCHEMA', N'dbo', +'TABLE', N'bpm_process_definition_ext', +'COLUMN', N'process_definition_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'流程模型的编号', +'SCHEMA', N'dbo', +'TABLE', N'bpm_process_definition_ext', +'COLUMN', N'model_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'描述', +'SCHEMA', N'dbo', +'TABLE', N'bpm_process_definition_ext', +'COLUMN', N'description' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'表单类型', +'SCHEMA', N'dbo', +'TABLE', N'bpm_process_definition_ext', +'COLUMN', N'form_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'表单编号', +'SCHEMA', N'dbo', +'TABLE', N'bpm_process_definition_ext', +'COLUMN', N'form_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'表单的配置', +'SCHEMA', N'dbo', +'TABLE', N'bpm_process_definition_ext', +'COLUMN', N'form_conf' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'表单项的数组', +'SCHEMA', N'dbo', +'TABLE', N'bpm_process_definition_ext', +'COLUMN', N'form_fields' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'自定义表单的提交路径', +'SCHEMA', N'dbo', +'TABLE', N'bpm_process_definition_ext', +'COLUMN', N'form_custom_create_path' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'自定义表单的查看路径', +'SCHEMA', N'dbo', +'TABLE', N'bpm_process_definition_ext', +'COLUMN', N'form_custom_view_path' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'bpm_process_definition_ext', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'bpm_process_definition_ext', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'bpm_process_definition_ext', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'bpm_process_definition_ext', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户编号', +'SCHEMA', N'dbo', +'TABLE', N'bpm_process_definition_ext', +'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'bpm_process_definition_ext', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'Bpm 流程定义的拓展表 +', +'SCHEMA', N'dbo', +'TABLE', N'bpm_process_definition_ext' +GO + + +-- ---------------------------- +-- Records of bpm_process_definition_ext +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[bpm_process_definition_ext] ON +GO + +SET IDENTITY_INSERT [dbo].[bpm_process_definition_ext] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for bpm_process_instance_ext +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[bpm_process_instance_ext]') AND type IN ('U')) + DROP TABLE [dbo].[bpm_process_instance_ext] +GO + +CREATE TABLE [dbo].[bpm_process_instance_ext] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [start_user_id] bigint NOT NULL, + [name] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [process_instance_id] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [process_definition_id] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [category] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [status] tinyint NOT NULL, + [result] tinyint NOT NULL, + [end_time] datetime2(7) NULL, + [form_variables] nvarchar(max) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [tenant_id] bigint NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL +) +GO + +ALTER TABLE [dbo].[bpm_process_instance_ext] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'编号', +'SCHEMA', N'dbo', +'TABLE', N'bpm_process_instance_ext', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'发起流程的用户编号', +'SCHEMA', N'dbo', +'TABLE', N'bpm_process_instance_ext', +'COLUMN', N'start_user_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'流程实例的名字', +'SCHEMA', N'dbo', +'TABLE', N'bpm_process_instance_ext', +'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'流程实例的编号', +'SCHEMA', N'dbo', +'TABLE', N'bpm_process_instance_ext', +'COLUMN', N'process_instance_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'流程定义的编号', +'SCHEMA', N'dbo', +'TABLE', N'bpm_process_instance_ext', +'COLUMN', N'process_definition_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'流程分类', +'SCHEMA', N'dbo', +'TABLE', N'bpm_process_instance_ext', +'COLUMN', N'category' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'流程实例的状态', +'SCHEMA', N'dbo', +'TABLE', N'bpm_process_instance_ext', +'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'流程实例的结果', +'SCHEMA', N'dbo', +'TABLE', N'bpm_process_instance_ext', +'COLUMN', N'result' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'结束时间', +'SCHEMA', N'dbo', +'TABLE', N'bpm_process_instance_ext', +'COLUMN', N'end_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'表单值', +'SCHEMA', N'dbo', +'TABLE', N'bpm_process_instance_ext', +'COLUMN', N'form_variables' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'bpm_process_instance_ext', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'bpm_process_instance_ext', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'bpm_process_instance_ext', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'bpm_process_instance_ext', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户编号', +'SCHEMA', N'dbo', +'TABLE', N'bpm_process_instance_ext', +'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'bpm_process_instance_ext', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'工作流的流程实例的拓展', +'SCHEMA', N'dbo', +'TABLE', N'bpm_process_instance_ext' +GO + + +-- ---------------------------- +-- Records of bpm_process_instance_ext +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[bpm_process_instance_ext] ON +GO + +SET IDENTITY_INSERT [dbo].[bpm_process_instance_ext] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for bpm_task_assign_rule +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[bpm_task_assign_rule]') AND type IN ('U')) + DROP TABLE [dbo].[bpm_task_assign_rule] +GO + +CREATE TABLE [dbo].[bpm_task_assign_rule] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [model_id] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [process_definition_id] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [task_definition_key] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [type] tinyint NOT NULL, + [options] nvarchar(1024) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [tenant_id] bigint NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL +) +GO + +ALTER TABLE [dbo].[bpm_task_assign_rule] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'编号', +'SCHEMA', N'dbo', +'TABLE', N'bpm_task_assign_rule', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'流程模型的编号', +'SCHEMA', N'dbo', +'TABLE', N'bpm_task_assign_rule', +'COLUMN', N'model_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'流程定义的编号', +'SCHEMA', N'dbo', +'TABLE', N'bpm_task_assign_rule', +'COLUMN', N'process_definition_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'流程任务定义的 key', +'SCHEMA', N'dbo', +'TABLE', N'bpm_task_assign_rule', +'COLUMN', N'task_definition_key' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'规则类型', +'SCHEMA', N'dbo', +'TABLE', N'bpm_task_assign_rule', +'COLUMN', N'type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'规则值,JSON 数组', +'SCHEMA', N'dbo', +'TABLE', N'bpm_task_assign_rule', +'COLUMN', N'options' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'bpm_task_assign_rule', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'bpm_task_assign_rule', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'bpm_task_assign_rule', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'bpm_task_assign_rule', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户编号', +'SCHEMA', N'dbo', +'TABLE', N'bpm_task_assign_rule', +'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'bpm_task_assign_rule', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'Bpm 任务规则表', +'SCHEMA', N'dbo', +'TABLE', N'bpm_task_assign_rule' +GO + + +-- ---------------------------- +-- Records of bpm_task_assign_rule +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[bpm_task_assign_rule] ON +GO + +SET IDENTITY_INSERT [dbo].[bpm_task_assign_rule] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for bpm_task_ext +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[bpm_task_ext]') AND type IN ('U')) + DROP TABLE [dbo].[bpm_task_ext] +GO + +CREATE TABLE [dbo].[bpm_task_ext] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [assignee_user_id] bigint NULL, + [name] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [task_id] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [result] tinyint NOT NULL, + [reason] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [end_time] datetime2(7) NULL, + [process_instance_id] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [process_definition_id] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [tenant_id] bigint NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL +) +GO + +ALTER TABLE [dbo].[bpm_task_ext] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'编号', +'SCHEMA', N'dbo', +'TABLE', N'bpm_task_ext', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'任务的审批人', +'SCHEMA', N'dbo', +'TABLE', N'bpm_task_ext', +'COLUMN', N'assignee_user_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'任务的名字', +'SCHEMA', N'dbo', +'TABLE', N'bpm_task_ext', +'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'任务的编号', +'SCHEMA', N'dbo', +'TABLE', N'bpm_task_ext', +'COLUMN', N'task_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'任务的结果', +'SCHEMA', N'dbo', +'TABLE', N'bpm_task_ext', +'COLUMN', N'result' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'审批建议', +'SCHEMA', N'dbo', +'TABLE', N'bpm_task_ext', +'COLUMN', N'reason' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'任务的结束时间', +'SCHEMA', N'dbo', +'TABLE', N'bpm_task_ext', +'COLUMN', N'end_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'流程实例的编号', +'SCHEMA', N'dbo', +'TABLE', N'bpm_task_ext', +'COLUMN', N'process_instance_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'流程定义的编号', +'SCHEMA', N'dbo', +'TABLE', N'bpm_task_ext', +'COLUMN', N'process_definition_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'bpm_task_ext', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'bpm_task_ext', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'bpm_task_ext', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'bpm_task_ext', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户编号', +'SCHEMA', N'dbo', +'TABLE', N'bpm_task_ext', +'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'bpm_task_ext', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'工作流的流程任务的拓展表', +'SCHEMA', N'dbo', +'TABLE', N'bpm_task_ext' +GO + + +-- ---------------------------- +-- Records of bpm_task_ext +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[bpm_task_ext] ON +GO + +SET IDENTITY_INSERT [dbo].[bpm_task_ext] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for bpm_user_group +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[bpm_user_group]') AND type IN ('U')) + DROP TABLE [dbo].[bpm_user_group] +GO + +CREATE TABLE [dbo].[bpm_user_group] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [name] nvarchar(30) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [description] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [member_user_ids] nvarchar(1024) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [status] tinyint NOT NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [tenant_id] bigint NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL +) +GO + +ALTER TABLE [dbo].[bpm_user_group] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'编号', +'SCHEMA', N'dbo', +'TABLE', N'bpm_user_group', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'组名', +'SCHEMA', N'dbo', +'TABLE', N'bpm_user_group', +'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'描述', +'SCHEMA', N'dbo', +'TABLE', N'bpm_user_group', +'COLUMN', N'description' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'成员编号数组', +'SCHEMA', N'dbo', +'TABLE', N'bpm_user_group', +'COLUMN', N'member_user_ids' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'状态(0正常 1停用)', +'SCHEMA', N'dbo', +'TABLE', N'bpm_user_group', +'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'bpm_user_group', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'bpm_user_group', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'bpm_user_group', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'bpm_user_group', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户编号', +'SCHEMA', N'dbo', +'TABLE', N'bpm_user_group', +'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'bpm_user_group', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户组', +'SCHEMA', N'dbo', +'TABLE', N'bpm_user_group' +GO + + +-- ---------------------------- +-- Records of bpm_user_group +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[bpm_user_group] ON +GO + +SET IDENTITY_INSERT [dbo].[bpm_user_group] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for dual +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[dual]') AND type IN ('U')) + DROP TABLE [dbo].[dual] +GO + +CREATE TABLE [dbo].[dual] ( + [id] int NULL +) +GO + +ALTER TABLE [dbo].[dual] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'数据库连接的表', +'SCHEMA', N'dbo', +'TABLE', N'dual' +GO + + +-- ---------------------------- +-- Records of dual +-- ---------------------------- +BEGIN TRANSACTION +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for infra_api_access_log +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[infra_api_access_log]') AND type IN ('U')) + DROP TABLE [dbo].[infra_api_access_log] +GO + +CREATE TABLE [dbo].[infra_api_access_log] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [trace_id] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [user_id] bigint DEFAULT 0 NOT NULL, + [user_type] tinyint DEFAULT 0 NOT NULL, + [application_name] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [request_method] nvarchar(16) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [request_url] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [request_params] nvarchar(max) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [user_ip] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [user_agent] nvarchar(512) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [begin_time] datetime2(7) NOT NULL, + [end_time] datetime2(7) NOT NULL, + [duration] int NOT NULL, + [result_code] int NOT NULL, + [result_msg] nvarchar(512) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL, + [tenant_id] bigint NOT NULL +) +GO + +ALTER TABLE [dbo].[infra_api_access_log] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'编号', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_access_log', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'链路追踪编号', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_access_log', +'COLUMN', N'trace_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户编号', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_access_log', +'COLUMN', N'user_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户类型', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_access_log', +'COLUMN', N'user_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'应用名', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_access_log', +'COLUMN', N'application_name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'请求方法名', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_access_log', +'COLUMN', N'request_method' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'请求地址', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_access_log', +'COLUMN', N'request_url' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'请求参数', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_access_log', +'COLUMN', N'request_params' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户 IP', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_access_log', +'COLUMN', N'user_ip' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'浏览器 UA', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_access_log', +'COLUMN', N'user_agent' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'开始请求时间', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_access_log', +'COLUMN', N'begin_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'结束请求时间', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_access_log', +'COLUMN', N'end_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'执行时长', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_access_log', +'COLUMN', N'duration' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'结果码', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_access_log', +'COLUMN', N'result_code' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'结果提示', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_access_log', +'COLUMN', N'result_msg' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_access_log', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_access_log', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_access_log', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_access_log', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_access_log', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户编号', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_access_log', +'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'API 访问日志表', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_access_log' +GO + + +-- ---------------------------- +-- Records of infra_api_access_log +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[infra_api_access_log] ON +GO + +SET IDENTITY_INSERT [dbo].[infra_api_access_log] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for infra_api_error_log +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[infra_api_error_log]') AND type IN ('U')) + DROP TABLE [dbo].[infra_api_error_log] +GO + +CREATE TABLE [dbo].[infra_api_error_log] ( + [id] int IDENTITY(1,1) NOT NULL, + [trace_id] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [user_id] int DEFAULT 0 NOT NULL, + [user_type] tinyint DEFAULT 0 NOT NULL, + [application_name] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [request_method] nvarchar(16) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [request_url] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [request_params] nvarchar(max) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [user_ip] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [user_agent] nvarchar(512) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [exception_time] datetime2(7) NOT NULL, + [exception_name] nvarchar(128) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [exception_message] nvarchar(max) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [exception_root_cause_message] nvarchar(max) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [exception_stack_trace] nvarchar(max) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [exception_class_name] nvarchar(512) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [exception_file_name] nvarchar(512) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [exception_method_name] nvarchar(512) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [exception_line_number] int NOT NULL, + [process_status] tinyint NOT NULL, + [process_time] datetime2(7) NULL, + [process_user_id] int NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [tenant_id] bigint NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL +) +GO + +ALTER TABLE [dbo].[infra_api_error_log] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'编号', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_error_log', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'链路追踪编号 + * + * 一般来说,通过链路追踪编号,可以将访问日志,错误日志,链路追踪日志,logger 打印日志等,结合在一起,从而进行排错。', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_error_log', +'COLUMN', N'trace_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户编号', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_error_log', +'COLUMN', N'user_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户类型', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_error_log', +'COLUMN', N'user_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'应用名 + * + * 目前读取 spring.application.name', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_error_log', +'COLUMN', N'application_name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'请求方法名', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_error_log', +'COLUMN', N'request_method' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'请求地址', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_error_log', +'COLUMN', N'request_url' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'请求参数', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_error_log', +'COLUMN', N'request_params' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户 IP', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_error_log', +'COLUMN', N'user_ip' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'浏览器 UA', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_error_log', +'COLUMN', N'user_agent' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'异常发生时间', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_error_log', +'COLUMN', N'exception_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'异常名 + * + * {@link Throwable#getClass()} 的类全名', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_error_log', +'COLUMN', N'exception_name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'异常导致的消息 + * + * {@link cn.iocoder.common.framework.util.ExceptionUtil#getMessage(Throwable)}', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_error_log', +'COLUMN', N'exception_message' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'异常导致的根消息 + * + * {@link cn.iocoder.common.framework.util.ExceptionUtil#getRootCauseMessage(Throwable)}', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_error_log', +'COLUMN', N'exception_root_cause_message' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'异常的栈轨迹 + * + * {@link cn.iocoder.common.framework.util.ExceptionUtil#getServiceException(Exception)}', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_error_log', +'COLUMN', N'exception_stack_trace' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'异常发生的类全名 + * + * {@link StackTraceElement#getClassName()}', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_error_log', +'COLUMN', N'exception_class_name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'异常发生的类文件 + * + * {@link StackTraceElement#getFileName()}', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_error_log', +'COLUMN', N'exception_file_name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'异常发生的方法名 + * + * {@link StackTraceElement#getMethodName()}', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_error_log', +'COLUMN', N'exception_method_name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'异常发生的方法所在行 + * + * {@link StackTraceElement#getLineNumber()}', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_error_log', +'COLUMN', N'exception_line_number' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'处理状态', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_error_log', +'COLUMN', N'process_status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'处理时间', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_error_log', +'COLUMN', N'process_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'处理用户编号', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_error_log', +'COLUMN', N'process_user_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_error_log', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_error_log', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_error_log', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_error_log', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户编号', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_error_log', +'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_error_log', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'系统异常日志', +'SCHEMA', N'dbo', +'TABLE', N'infra_api_error_log' +GO + + +-- ---------------------------- +-- Records of infra_api_error_log +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[infra_api_error_log] ON +GO + +SET IDENTITY_INSERT [dbo].[infra_api_error_log] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for infra_codegen_column +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[infra_codegen_column]') AND type IN ('U')) + DROP TABLE [dbo].[infra_codegen_column] +GO + +CREATE TABLE [dbo].[infra_codegen_column] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [table_id] bigint NOT NULL, + [column_name] nvarchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [data_type] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [column_comment] nvarchar(500) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [nullable] varchar(1) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [primary_key] varchar(1) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [auto_increment] nchar(1) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [ordinal_position] int NOT NULL, + [java_type] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [java_field] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [dict_type] nvarchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [example] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_operation] varchar(1) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [update_operation] varchar(1) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [list_operation] varchar(1) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [list_operation_condition] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [list_operation_result] varchar(1) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [html_type] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL +) +GO + +ALTER TABLE [dbo].[infra_codegen_column] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'编号', +'SCHEMA', N'dbo', +'TABLE', N'infra_codegen_column', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'表编号', +'SCHEMA', N'dbo', +'TABLE', N'infra_codegen_column', +'COLUMN', N'table_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'字段名', +'SCHEMA', N'dbo', +'TABLE', N'infra_codegen_column', +'COLUMN', N'column_name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'字段类型', +'SCHEMA', N'dbo', +'TABLE', N'infra_codegen_column', +'COLUMN', N'data_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'字段描述', +'SCHEMA', N'dbo', +'TABLE', N'infra_codegen_column', +'COLUMN', N'column_comment' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否允许为空', +'SCHEMA', N'dbo', +'TABLE', N'infra_codegen_column', +'COLUMN', N'nullable' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否主键', +'SCHEMA', N'dbo', +'TABLE', N'infra_codegen_column', +'COLUMN', N'primary_key' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否自增', +'SCHEMA', N'dbo', +'TABLE', N'infra_codegen_column', +'COLUMN', N'auto_increment' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'排序', +'SCHEMA', N'dbo', +'TABLE', N'infra_codegen_column', +'COLUMN', N'ordinal_position' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'Java 属性类型', +'SCHEMA', N'dbo', +'TABLE', N'infra_codegen_column', +'COLUMN', N'java_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'Java 属性名', +'SCHEMA', N'dbo', +'TABLE', N'infra_codegen_column', +'COLUMN', N'java_field' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'字典类型', +'SCHEMA', N'dbo', +'TABLE', N'infra_codegen_column', +'COLUMN', N'dict_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'数据示例', +'SCHEMA', N'dbo', +'TABLE', N'infra_codegen_column', +'COLUMN', N'example' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否为 Create 创建操作的字段', +'SCHEMA', N'dbo', +'TABLE', N'infra_codegen_column', +'COLUMN', N'create_operation' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否为 Update 更新操作的字段', +'SCHEMA', N'dbo', +'TABLE', N'infra_codegen_column', +'COLUMN', N'update_operation' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否为 List 查询操作的字段', +'SCHEMA', N'dbo', +'TABLE', N'infra_codegen_column', +'COLUMN', N'list_operation' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'List 查询操作的条件类型', +'SCHEMA', N'dbo', +'TABLE', N'infra_codegen_column', +'COLUMN', N'list_operation_condition' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否为 List 查询操作的返回字段', +'SCHEMA', N'dbo', +'TABLE', N'infra_codegen_column', +'COLUMN', N'list_operation_result' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'显示类型', +'SCHEMA', N'dbo', +'TABLE', N'infra_codegen_column', +'COLUMN', N'html_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'infra_codegen_column', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'infra_codegen_column', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'infra_codegen_column', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'infra_codegen_column', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'infra_codegen_column', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'代码生成表字段定义', +'SCHEMA', N'dbo', +'TABLE', N'infra_codegen_column' +GO + + +-- ---------------------------- +-- Records of infra_codegen_column +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[infra_codegen_column] ON +GO + +SET IDENTITY_INSERT [dbo].[infra_codegen_column] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for infra_codegen_table +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[infra_codegen_table]') AND type IN ('U')) + DROP TABLE [dbo].[infra_codegen_table] +GO + +CREATE TABLE [dbo].[infra_codegen_table] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [data_source_config_id] bigint NOT NULL, + [scene] tinyint NOT NULL, + [table_name] nvarchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [table_comment] nvarchar(500) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [remark] nvarchar(500) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [module_name] nvarchar(30) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [business_name] nvarchar(30) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [class_name] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [class_comment] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [author] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [template_type] tinyint NOT NULL, + [parent_menu_id] bigint NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL +) +GO + +ALTER TABLE [dbo].[infra_codegen_table] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'编号', +'SCHEMA', N'dbo', +'TABLE', N'infra_codegen_table', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'数据源配置的编号', +'SCHEMA', N'dbo', +'TABLE', N'infra_codegen_table', +'COLUMN', N'data_source_config_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'生成场景', +'SCHEMA', N'dbo', +'TABLE', N'infra_codegen_table', +'COLUMN', N'scene' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'表名称', +'SCHEMA', N'dbo', +'TABLE', N'infra_codegen_table', +'COLUMN', N'table_name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'表描述', +'SCHEMA', N'dbo', +'TABLE', N'infra_codegen_table', +'COLUMN', N'table_comment' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'备注', +'SCHEMA', N'dbo', +'TABLE', N'infra_codegen_table', +'COLUMN', N'remark' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'模块名', +'SCHEMA', N'dbo', +'TABLE', N'infra_codegen_table', +'COLUMN', N'module_name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'业务名', +'SCHEMA', N'dbo', +'TABLE', N'infra_codegen_table', +'COLUMN', N'business_name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'类名称', +'SCHEMA', N'dbo', +'TABLE', N'infra_codegen_table', +'COLUMN', N'class_name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'类描述', +'SCHEMA', N'dbo', +'TABLE', N'infra_codegen_table', +'COLUMN', N'class_comment' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'作者', +'SCHEMA', N'dbo', +'TABLE', N'infra_codegen_table', +'COLUMN', N'author' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'模板类型', +'SCHEMA', N'dbo', +'TABLE', N'infra_codegen_table', +'COLUMN', N'template_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'父菜单编号', +'SCHEMA', N'dbo', +'TABLE', N'infra_codegen_table', +'COLUMN', N'parent_menu_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'infra_codegen_table', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'infra_codegen_table', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'infra_codegen_table', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'infra_codegen_table', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'infra_codegen_table', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'代码生成表定义', +'SCHEMA', N'dbo', +'TABLE', N'infra_codegen_table' +GO + + +-- ---------------------------- +-- Records of infra_codegen_table +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[infra_codegen_table] ON +GO + +SET IDENTITY_INSERT [dbo].[infra_codegen_table] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for infra_config +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[infra_config]') AND type IN ('U')) + DROP TABLE [dbo].[infra_config] +GO + +CREATE TABLE [dbo].[infra_config] ( + [id] int NOT NULL, + [category] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [type] tinyint NOT NULL, + [name] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [config_key] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [value] nvarchar(500) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [visible] varchar(1) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [remark] nvarchar(500) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL +) +GO + +ALTER TABLE [dbo].[infra_config] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'参数主键', +'SCHEMA', N'dbo', +'TABLE', N'infra_config', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'参数分组', +'SCHEMA', N'dbo', +'TABLE', N'infra_config', +'COLUMN', N'category' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'参数类型', +'SCHEMA', N'dbo', +'TABLE', N'infra_config', +'COLUMN', N'type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'参数名称', +'SCHEMA', N'dbo', +'TABLE', N'infra_config', +'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'参数键名', +'SCHEMA', N'dbo', +'TABLE', N'infra_config', +'COLUMN', N'config_key' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'参数键值', +'SCHEMA', N'dbo', +'TABLE', N'infra_config', +'COLUMN', N'value' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否可见', +'SCHEMA', N'dbo', +'TABLE', N'infra_config', +'COLUMN', N'visible' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'备注', +'SCHEMA', N'dbo', +'TABLE', N'infra_config', +'COLUMN', N'remark' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'infra_config', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'infra_config', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'infra_config', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'infra_config', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'infra_config', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'参数配置表', +'SCHEMA', N'dbo', +'TABLE', N'infra_config' +GO + + +-- ---------------------------- +-- Records of infra_config +-- ---------------------------- +BEGIN TRANSACTION +GO + +INSERT INTO [dbo].[infra_config] ([id], [category], [type], [name], [config_key], [value], [visible], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1', N'ui', N'1', N'主框架页-默认皮肤样式名称', N'sys.index.skinName', N'skin-blue', N'0', N'蓝色 skin-blue、绿色 skin-green、紫色 skin-purple、红色 skin-red、黄色 skin-yellow', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-03-26 23:10:31.0000000', N'0') +GO + +INSERT INTO [dbo].[infra_config] ([id], [category], [type], [name], [config_key], [value], [visible], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'2', N'biz', N'1', N'用户管理-账号初始密码', N'sys.user.init-password', N'123456', N'0', N'初始化密码 123456', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-03-20 02:25:51.0000000', N'0') +GO + +INSERT INTO [dbo].[infra_config] ([id], [category], [type], [name], [config_key], [value], [visible], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'3', N'ui', N'1', N'主框架页-侧边栏主题', N'sys.index.sideTheme', N'theme-dark', N'0', N'深色主题theme-dark,浅色主题theme-light', N'admin', N'2021-01-05 17:03:48.0000000', N'', N'2021-01-19 03:05:21.0000000', N'0') +GO + +INSERT INTO [dbo].[infra_config] ([id], [category], [type], [name], [config_key], [value], [visible], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'6', N'biz', N'2', N'登陆验证码的开关', N'win.captcha.enable', N'true', N'1', NULL, N'1', N'2022-02-17 00:03:11.0000000', N'1', N'2022-04-04 12:51:40.0000000', N'0') +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for infra_data_source_config +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[infra_data_source_config]') AND type IN ('U')) + DROP TABLE [dbo].[infra_data_source_config] +GO + +CREATE TABLE [dbo].[infra_data_source_config] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [name] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [url] nvarchar(1024) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [username] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [password] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL +) +GO + +ALTER TABLE [dbo].[infra_data_source_config] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'主键编号', +'SCHEMA', N'dbo', +'TABLE', N'infra_data_source_config', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'参数名称', +'SCHEMA', N'dbo', +'TABLE', N'infra_data_source_config', +'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'数据源连接', +'SCHEMA', N'dbo', +'TABLE', N'infra_data_source_config', +'COLUMN', N'url' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户名', +'SCHEMA', N'dbo', +'TABLE', N'infra_data_source_config', +'COLUMN', N'username' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'密码', +'SCHEMA', N'dbo', +'TABLE', N'infra_data_source_config', +'COLUMN', N'password' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'infra_data_source_config', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'infra_data_source_config', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'infra_data_source_config', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'infra_data_source_config', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'infra_data_source_config', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'数据源配置表', +'SCHEMA', N'dbo', +'TABLE', N'infra_data_source_config' +GO + + +-- ---------------------------- +-- Records of infra_data_source_config +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[infra_data_source_config] ON +GO + +INSERT INTO [dbo].[infra_data_source_config] ([id], [name], [url], [username], [password], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'8', N'test', N'jdbc:mysql://127.0.0.1:3306/testb5f4', N'root', N'3xgHTSHmF3mlgL3Ybw45ztewGDxGgEkWF3wTSYey7k+uXI/wdz45TrvYvYssQtmA', N'1', N'2022-04-27 22:48:20.0000000', N'1', N'2022-04-28 20:04:06.0000000', N'0') +GO + +INSERT INTO [dbo].[infra_data_source_config] ([id], [name], [url], [username], [password], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'9', N'oracle_test', N'jdbc:oracle:thin:@127.0.0.1:1521:xe', N'root', N'vwmNAPLiEi+NX4AVdC+zNvpejPLwcFXp6dlhgNxCfDTi4vKRy76iIeFqyvpRerNC', N'1', N'2022-04-28 20:41:26.0000000', N'1', N'2022-04-28 20:41:26.0000000', N'0') +GO + +SET IDENTITY_INSERT [dbo].[infra_data_source_config] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for infra_file +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[infra_file]') AND type IN ('U')) + DROP TABLE [dbo].[infra_file] +GO + +CREATE TABLE [dbo].[infra_file] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [config_id] bigint NULL, + [path] nvarchar(512) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [url] nvarchar(1024) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [type] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [size] int NOT NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL, + [name] nvarchar(512) COLLATE SQL_Latin1_General_CP1_CI_AS NULL +) +GO + +ALTER TABLE [dbo].[infra_file] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'文件编号', +'SCHEMA', N'dbo', +'TABLE', N'infra_file', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'配置编号', +'SCHEMA', N'dbo', +'TABLE', N'infra_file', +'COLUMN', N'config_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'文件路径', +'SCHEMA', N'dbo', +'TABLE', N'infra_file', +'COLUMN', N'path' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'文件 URL', +'SCHEMA', N'dbo', +'TABLE', N'infra_file', +'COLUMN', N'url' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'文件 MIME 类型', +'SCHEMA', N'dbo', +'TABLE', N'infra_file', +'COLUMN', N'type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'文件大小', +'SCHEMA', N'dbo', +'TABLE', N'infra_file', +'COLUMN', N'size' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'infra_file', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'infra_file', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'infra_file', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'infra_file', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'infra_file', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'文件路径', +'SCHEMA', N'dbo', +'TABLE', N'infra_file', +'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'文件表', +'SCHEMA', N'dbo', +'TABLE', N'infra_file' +GO + + +-- ---------------------------- +-- Records of infra_file +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[infra_file] ON +GO + +SET IDENTITY_INSERT [dbo].[infra_file] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for infra_file_config +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[infra_file_config]') AND type IN ('U')) + DROP TABLE [dbo].[infra_file_config] +GO + +CREATE TABLE [dbo].[infra_file_config] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [name] nvarchar(63) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [storage] tinyint NOT NULL, + [remark] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [master] varchar(1) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [config] nvarchar(max) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL +) +GO + +ALTER TABLE [dbo].[infra_file_config] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'编号', +'SCHEMA', N'dbo', +'TABLE', N'infra_file_config', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'配置名', +'SCHEMA', N'dbo', +'TABLE', N'infra_file_config', +'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'存储器', +'SCHEMA', N'dbo', +'TABLE', N'infra_file_config', +'COLUMN', N'storage' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'备注', +'SCHEMA', N'dbo', +'TABLE', N'infra_file_config', +'COLUMN', N'remark' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否为主配置', +'SCHEMA', N'dbo', +'TABLE', N'infra_file_config', +'COLUMN', N'master' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'存储配置', +'SCHEMA', N'dbo', +'TABLE', N'infra_file_config', +'COLUMN', N'config' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'infra_file_config', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'infra_file_config', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'infra_file_config', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'infra_file_config', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'infra_file_config', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'文件配置表', +'SCHEMA', N'dbo', +'TABLE', N'infra_file_config' +GO + + +-- ---------------------------- +-- Records of infra_file_config +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[infra_file_config] ON +GO + +INSERT INTO [dbo].[infra_file_config] ([id], [name], [storage], [remark], [master], [config], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'4', N'数据库', N'1', N'我是数据库', N'0', N'{"@class":"com.win.framework.file.core.client.db.DBFileClientConfig","domain":"http://127.0.0.1:48080"}', N'1', N'2022-03-15 23:56:24.0000000', N'1', N'2022-03-26 21:39:26.0000000', N'0') +GO + +INSERT INTO [dbo].[infra_file_config] ([id], [name], [storage], [remark], [master], [config], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'5', N'本地磁盘', N'10', N'测试下本地存储', N'0', N'{"@class":"com.win.framework.file.core.client.local.LocalFileClientConfig","basePath":"/Users/yunai/file_test","domain":"http://127.0.0.1:48080"}', N'1', N'2022-03-15 23:57:00.0000000', N'1', N'2022-03-26 21:39:26.0000000', N'0') +GO + +INSERT INTO [dbo].[infra_file_config] ([id], [name], [storage], [remark], [master], [config], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'11', N'S3 - 七牛云', N'20', NULL, N'1', N'{"@class":"com.win.framework.file.core.client.s3.S3FileClientConfig","endpoint":"s3-cn-south-1.qiniucs.com","domain":"http://test.win.iocoder.cn","bucket":"ruoyi-vue-pro","accessKey":"b7yvuhBSAGjmtPhMFcn9iMOxUOY_I06cA_p0ZUx8","accessSecret":"kXM1l5ia1RvSX3QaOEcwI3RLz3Y2rmNszWonKZtP"}', N'1', N'2022-03-19 18:00:03.0000000', N'1', N'2022-03-26 21:39:26.0000000', N'0') +GO + +SET IDENTITY_INSERT [dbo].[infra_file_config] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for infra_file_content +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[infra_file_content]') AND type IN ('U')) + DROP TABLE [dbo].[infra_file_content] +GO + +CREATE TABLE [dbo].[infra_file_content] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [config_id] bigint NOT NULL, + [path] nvarchar(512) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [content] varbinary(max) NOT NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL +) +GO + +ALTER TABLE [dbo].[infra_file_content] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'编号', +'SCHEMA', N'dbo', +'TABLE', N'infra_file_content', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'配置编号', +'SCHEMA', N'dbo', +'TABLE', N'infra_file_content', +'COLUMN', N'config_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'文件路径', +'SCHEMA', N'dbo', +'TABLE', N'infra_file_content', +'COLUMN', N'path' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'文件内容', +'SCHEMA', N'dbo', +'TABLE', N'infra_file_content', +'COLUMN', N'content' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'infra_file_content', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'infra_file_content', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'infra_file_content', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'infra_file_content', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'infra_file_content', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'文件表', +'SCHEMA', N'dbo', +'TABLE', N'infra_file_content' +GO + + +-- ---------------------------- +-- Records of infra_file_content +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[infra_file_content] ON +GO + +SET IDENTITY_INSERT [dbo].[infra_file_content] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for infra_job +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[infra_job]') AND type IN ('U')) + DROP TABLE [dbo].[infra_job] +GO + +CREATE TABLE [dbo].[infra_job] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [name] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [status] tinyint NOT NULL, + [handler_name] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [handler_param] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [cron_expression] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [retry_count] int NOT NULL, + [retry_interval] int NOT NULL, + [monitor_timeout] int NOT NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL +) +GO + +ALTER TABLE [dbo].[infra_job] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'任务编号', +'SCHEMA', N'dbo', +'TABLE', N'infra_job', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'任务名称', +'SCHEMA', N'dbo', +'TABLE', N'infra_job', +'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'任务状态', +'SCHEMA', N'dbo', +'TABLE', N'infra_job', +'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'处理器的名字', +'SCHEMA', N'dbo', +'TABLE', N'infra_job', +'COLUMN', N'handler_name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'处理器的参数', +'SCHEMA', N'dbo', +'TABLE', N'infra_job', +'COLUMN', N'handler_param' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'CRON 表达式', +'SCHEMA', N'dbo', +'TABLE', N'infra_job', +'COLUMN', N'cron_expression' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'重试次数', +'SCHEMA', N'dbo', +'TABLE', N'infra_job', +'COLUMN', N'retry_count' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'重试间隔', +'SCHEMA', N'dbo', +'TABLE', N'infra_job', +'COLUMN', N'retry_interval' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'监控超时时间', +'SCHEMA', N'dbo', +'TABLE', N'infra_job', +'COLUMN', N'monitor_timeout' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'infra_job', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'infra_job', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'infra_job', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'infra_job', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'infra_job', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'定时任务表', +'SCHEMA', N'dbo', +'TABLE', N'infra_job' +GO + + +-- ---------------------------- +-- Records of infra_job +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[infra_job] ON +GO + +INSERT INTO [dbo].[infra_job] ([id], [name], [status], [handler_name], [handler_param], [cron_expression], [retry_count], [retry_interval], [monitor_timeout], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'16', N'用户 Session 超时 Job', N'1', N'userSessionTimeoutJob', NULL, N'0 * * * * ? *', N'2000', N'3', N'0', N'1', N'2022-05-02 17:28:48.8850000', N'1', N'2022-05-02 17:28:49.0240000', N'0') +GO + +SET IDENTITY_INSERT [dbo].[infra_job] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for infra_job_log +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[infra_job_log]') AND type IN ('U')) + DROP TABLE [dbo].[infra_job_log] +GO + +CREATE TABLE [dbo].[infra_job_log] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [job_id] bigint NOT NULL, + [handler_name] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [handler_param] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [execute_index] tinyint NOT NULL, + [begin_time] datetime2(7) NOT NULL, + [end_time] datetime2(7) NULL, + [duration] int NULL, + [status] tinyint NOT NULL, + [result] nvarchar(4000) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL +) +GO + +ALTER TABLE [dbo].[infra_job_log] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'日志编号', +'SCHEMA', N'dbo', +'TABLE', N'infra_job_log', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'任务编号', +'SCHEMA', N'dbo', +'TABLE', N'infra_job_log', +'COLUMN', N'job_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'处理器的名字', +'SCHEMA', N'dbo', +'TABLE', N'infra_job_log', +'COLUMN', N'handler_name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'处理器的参数', +'SCHEMA', N'dbo', +'TABLE', N'infra_job_log', +'COLUMN', N'handler_param' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'第几次执行', +'SCHEMA', N'dbo', +'TABLE', N'infra_job_log', +'COLUMN', N'execute_index' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'开始执行时间', +'SCHEMA', N'dbo', +'TABLE', N'infra_job_log', +'COLUMN', N'begin_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'结束执行时间', +'SCHEMA', N'dbo', +'TABLE', N'infra_job_log', +'COLUMN', N'end_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'执行时长', +'SCHEMA', N'dbo', +'TABLE', N'infra_job_log', +'COLUMN', N'duration' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'任务状态', +'SCHEMA', N'dbo', +'TABLE', N'infra_job_log', +'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'结果数据', +'SCHEMA', N'dbo', +'TABLE', N'infra_job_log', +'COLUMN', N'result' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'infra_job_log', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'infra_job_log', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'infra_job_log', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'infra_job_log', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'infra_job_log', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'定时任务日志表', +'SCHEMA', N'dbo', +'TABLE', N'infra_job_log' +GO + + +-- ---------------------------- +-- Records of infra_job_log +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[infra_job_log] ON +GO + +SET IDENTITY_INSERT [dbo].[infra_job_log] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for infra_test_demo +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[infra_test_demo]') AND type IN ('U')) + DROP TABLE [dbo].[infra_test_demo] +GO + +CREATE TABLE [dbo].[infra_test_demo] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [name] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [status] tinyint NOT NULL, + [type] tinyint NOT NULL, + [category] tinyint NOT NULL, + [remark] nvarchar(500) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL +) +GO + +ALTER TABLE [dbo].[infra_test_demo] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'编号', +'SCHEMA', N'dbo', +'TABLE', N'infra_test_demo', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'名字', +'SCHEMA', N'dbo', +'TABLE', N'infra_test_demo', +'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'状态', +'SCHEMA', N'dbo', +'TABLE', N'infra_test_demo', +'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'类型', +'SCHEMA', N'dbo', +'TABLE', N'infra_test_demo', +'COLUMN', N'type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'分类', +'SCHEMA', N'dbo', +'TABLE', N'infra_test_demo', +'COLUMN', N'category' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'备注', +'SCHEMA', N'dbo', +'TABLE', N'infra_test_demo', +'COLUMN', N'remark' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'infra_test_demo', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'infra_test_demo', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'infra_test_demo', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'infra_test_demo', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'infra_test_demo', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'字典类型表', +'SCHEMA', N'dbo', +'TABLE', N'infra_test_demo' +GO + + +-- ---------------------------- +-- Records of infra_test_demo +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[infra_test_demo] ON +GO + +SET IDENTITY_INSERT [dbo].[infra_test_demo] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for member_user +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[member_user]') AND type IN ('U')) + DROP TABLE [dbo].[member_user] +GO + +CREATE TABLE [dbo].[member_user] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [nickname] nvarchar(30) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [avatar] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [status] tinyint NOT NULL, + [mobile] nvarchar(11) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [password] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [register_ip] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [login_ip] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [login_date] datetime2(7) NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [tenant_id] bigint NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL +) +GO + +ALTER TABLE [dbo].[member_user] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'编号', +'SCHEMA', N'dbo', +'TABLE', N'member_user', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户昵称', +'SCHEMA', N'dbo', +'TABLE', N'member_user', +'COLUMN', N'nickname' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'头像', +'SCHEMA', N'dbo', +'TABLE', N'member_user', +'COLUMN', N'avatar' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'状态', +'SCHEMA', N'dbo', +'TABLE', N'member_user', +'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'手机号', +'SCHEMA', N'dbo', +'TABLE', N'member_user', +'COLUMN', N'mobile' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'密码', +'SCHEMA', N'dbo', +'TABLE', N'member_user', +'COLUMN', N'password' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'注册 IP', +'SCHEMA', N'dbo', +'TABLE', N'member_user', +'COLUMN', N'register_ip' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'最后登录IP', +'SCHEMA', N'dbo', +'TABLE', N'member_user', +'COLUMN', N'login_ip' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'最后登录时间', +'SCHEMA', N'dbo', +'TABLE', N'member_user', +'COLUMN', N'login_date' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'member_user', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'member_user', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'member_user', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'member_user', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户编号', +'SCHEMA', N'dbo', +'TABLE', N'member_user', +'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'member_user', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户', +'SCHEMA', N'dbo', +'TABLE', N'member_user' +GO + + +-- ---------------------------- +-- Records of member_user +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[member_user] ON +GO + +SET IDENTITY_INSERT [dbo].[member_user] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for pay_app +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[pay_app]') AND type IN ('U')) + DROP TABLE [dbo].[pay_app] +GO + +CREATE TABLE [dbo].[pay_app] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [name] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [status] tinyint NOT NULL, + [remark] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [pay_notify_url] nvarchar(1024) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [refund_notify_url] nvarchar(1024) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [merchant_id] bigint NOT NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [tenant_id] bigint NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL +) +GO + +ALTER TABLE [dbo].[pay_app] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'应用编号', +'SCHEMA', N'dbo', +'TABLE', N'pay_app', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'应用名', +'SCHEMA', N'dbo', +'TABLE', N'pay_app', +'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'开启状态', +'SCHEMA', N'dbo', +'TABLE', N'pay_app', +'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'备注', +'SCHEMA', N'dbo', +'TABLE', N'pay_app', +'COLUMN', N'remark' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'支付结果的回调地址', +'SCHEMA', N'dbo', +'TABLE', N'pay_app', +'COLUMN', N'pay_notify_url' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'退款结果的回调地址', +'SCHEMA', N'dbo', +'TABLE', N'pay_app', +'COLUMN', N'refund_notify_url' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'商户编号', +'SCHEMA', N'dbo', +'TABLE', N'pay_app', +'COLUMN', N'merchant_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'pay_app', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'pay_app', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'pay_app', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'pay_app', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户编号', +'SCHEMA', N'dbo', +'TABLE', N'pay_app', +'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'pay_app', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'支付应用信息', +'SCHEMA', N'dbo', +'TABLE', N'pay_app' +GO + + +-- ---------------------------- +-- Records of pay_app +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[pay_app] ON +GO + +INSERT INTO [dbo].[pay_app] ([id], [name], [status], [remark], [pay_notify_url], [refund_notify_url], [merchant_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'6', N'闻荫', N'0', N'我是一个公众号', N'http://127.0.0.1:28080/api/shop/order/pay-notify', N'http://127.0.0.1', N'1', N'', N'2021-10-23 08:49:25.0000000', N'', N'2022-02-27 04:14:53.0000000', N'1', N'0') +GO + +SET IDENTITY_INSERT [dbo].[pay_app] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for pay_channel +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[pay_channel]') AND type IN ('U')) + DROP TABLE [dbo].[pay_channel] +GO + +CREATE TABLE [dbo].[pay_channel] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [code] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [status] tinyint NOT NULL, + [remark] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [fee_rate] float(53) NOT NULL, + [merchant_id] bigint NOT NULL, + [app_id] bigint NOT NULL, + [config] nvarchar(max) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [tenant_id] bigint NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL +) +GO + +ALTER TABLE [dbo].[pay_channel] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'商户编号', +'SCHEMA', N'dbo', +'TABLE', N'pay_channel', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'渠道编码', +'SCHEMA', N'dbo', +'TABLE', N'pay_channel', +'COLUMN', N'code' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'开启状态', +'SCHEMA', N'dbo', +'TABLE', N'pay_channel', +'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'备注', +'SCHEMA', N'dbo', +'TABLE', N'pay_channel', +'COLUMN', N'remark' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'渠道费率,单位:百分比', +'SCHEMA', N'dbo', +'TABLE', N'pay_channel', +'COLUMN', N'fee_rate' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'商户编号', +'SCHEMA', N'dbo', +'TABLE', N'pay_channel', +'COLUMN', N'merchant_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'应用编号', +'SCHEMA', N'dbo', +'TABLE', N'pay_channel', +'COLUMN', N'app_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'支付渠道配置', +'SCHEMA', N'dbo', +'TABLE', N'pay_channel', +'COLUMN', N'config' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'pay_channel', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'pay_channel', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'pay_channel', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'pay_channel', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户编号', +'SCHEMA', N'dbo', +'TABLE', N'pay_channel', +'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'pay_channel', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'支付渠道 +', +'SCHEMA', N'dbo', +'TABLE', N'pay_channel' +GO + + +-- ---------------------------- +-- Records of pay_channel +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[pay_channel] ON +GO + +INSERT INTO [dbo].[pay_channel] ([id], [code], [status], [remark], [fee_rate], [merchant_id], [app_id], [config], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'9', N'wx_pub', N'0', NULL, N'1', N'1', N'6', N'{"@class":"com.win.framework.pay.core.client.impl.wx.WXPayClientConfig","appId":"wx041349c6f39b268b","mchId":"1545083881","apiVersion":"v2","mchKey":"0alL64UDQdlCwiKZ73ib7ypaIjMns06p","privateKeyContent":"-----BEGIN PRIVATE KEY-----\nMIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC5q2hYE3loOQoH\nl/2kh/epuj17W8VpV5vBl7ysJWAbBXux6mlq4gKTHD0QUQdiKtDEUm/bKC9Bi6VU\nuklM5Y8oCaCbhjklHRbET8jsgd9phSNGviHclYRLsQRO8oXnN89kN0y7DYKm0hYd\nmaiS12Z3v8VaImSTr4HVeHlC/z3S6mdwSr263stKt931YTcbTj/QFH7znsv9Na0u\nX6LaMBEEAsJctWdm8Ndrd1tGh9Fzf0DA5VRXsJR3kkWspy+IwiDTPV/FDKOU9NJC\nSxMmDePerTfkoZ2s1rltqBK0ykDJrXtxR+hTzEsKZ/KpNi8tyYpfNZsviHIlUsLP\nFJ5UvUhpAgMBAAECggEAd90NltazqTIxpGdeCwrwOzWNnYbIclJprlhMKIJUgf1P\nNrPTbHoOGXTAgzkcYCat8iAaMEzH/TOu/3zn92m3uqxEcEL9v1UBLqknWHAbkB6w\ngGocqDAqYUcdNe5hvbyM+fCta5C0SQgV2PQrHOlMMICwYpkTfzhtxCdreXIYMoGg\nJEIRkZWgrm/N7LTtNgizznuUjy6OURWjXaWKPcs3b3j6G1gLj9Vp++z4y0u51nqM\n4R6fcvl8M6BjlcC8zo6DbOvCW8cXtuXsnru+2TPrUnsGeybJok4fEQsfW1BvpvPo\nief38rYJn4OWxIrHcpWrhNtXtgRPeiMGFfIsEQDmVQKBgQDzXK6Nn3Nr3TFfGVTy\n8QYrzOuY2NqzH8nnsLL6qn3HoKxTv+PcFKOTPsi6f4hIYCzBP0esRrPv0ffMu9oQ\nJvFtCJvMmcKGtp0Q5hcj0y/XkbC3AWuahJtBv8lhKXVnQXSL0j3+ombljw4/8yN0\nAzgBz+j/skQQgZ3sN5h+DHGtgwKBgQDDT784/2pd4m86c/uBmrwYfqu6MJo0eHJh\n1XPtE+u8pOHyNTFk77rKobKDqN5VlrF0uEmBc/08LKhyxJ3vh/zAbcmqT1Mq778y\nAKKUtVmvcaVDrvSQHsnhj0zt4SHGmmU34U2b9hV+nocq5VszX6/jp//HJi9bs3We\ndAzfFCmaowKBgC1MmDVGc+6lCraf+X8LPFHU4Bnga70h8qxM6NPd/nG1R76DHn/t\n25DiA+0rJgwK0unZxJadxoqic9TJNssA5Lmd+5o3GM2Imm311mLVwbcHqHQ4MHZf\nrqKrd2m9lNv2hCIurVmDk1Gxsj5XHMdQfhFgSQengCHubp30r07vNA3PAoGAUEAE\nIjdQTSMs8KeXP7mEb8wcY3R05/pVhT1fVJpK0kgtTofss7yM05V88/v+3sv8Pik6\niqZN9tuimwWOn00Q3UA/DGtrkMjRlooMQ24AW8YmUZkhg9YivTtUMKnAZwopbLx2\nVw7V5iDdCRMUVheK/c+ZmQpnixZBzcmBQGfYcGECgYBjEq3Mem+Aw6pXOu6+0FwH\n9y6Xi4HhBkq0OOZZuXFtWVry7YrD3pBgzWVAZJqJCkyPKKZzCzwdbFd3u0lYBs35\nzYgx7ug4hR+wfI980a3vxjcWGOqnOUUnUJ7ucIa+KDgnYV/bBy4jqpVreXmWAJXl\nfyjG3eLWBrtrsI9YX6zeAA==\n-----END PRIVATE KEY-----\n","privateCertContent":"-----BEGIN CERTIFICATE-----\nMIID6TCCAtGgAwIBAgIUNkEHq6aQcF80NSYqWS58ybsJzI4wDQYJKoZIhvcNAQEL\nBQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT\nFFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg\nQ0EwHhcNMjExMDIxMDU0NTQxWhcNMjYxMDIwMDU0NTQxWjB7MRMwEQYDVQQDDAox\nNTQ1MDgzODgxMRswGQYDVQQKDBLlvq7kv6HllYbmiLfns7vnu58xJzAlBgNVBAsM\nHuWOhuWfjuWMuuWkp+adjuWwp+aXpeeUqOWTgeW6lzELMAkGA1UEBgwCQ04xETAP\nBgNVBAcMCFNoZW5aaGVuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\nuatoWBN5aDkKB5f9pIf3qbo9e1vFaVebwZe8rCVgGwV7seppauICkxw9EFEHYirQ\nxFJv2ygvQYulVLpJTOWPKAmgm4Y5JR0WxE/I7IHfaYUjRr4h3JWES7EETvKF5zfP\nZDdMuw2CptIWHZmoktdmd7/FWiJkk6+B1Xh5Qv890upncEq9ut7LSrfd9WE3G04/\n0BR+857L/TWtLl+i2jARBALCXLVnZvDXa3dbRofRc39AwOVUV7CUd5JFrKcviMIg\n0z1fxQyjlPTSQksTJg3j3q035KGdrNa5bagStMpAya17cUfoU8xLCmfyqTYvLcmK\nXzWbL4hyJVLCzxSeVL1IaQIDAQABo4GBMH8wCQYDVR0TBAIwADALBgNVHQ8EBAMC\nBPAwZQYDVR0fBF4wXDBaoFigVoZUaHR0cDovL2V2Y2EuaXRydXMuY29tLmNuL3B1\nYmxpYy9pdHJ1c2NybD9DQT0xQkQ0MjIwRTUwREJDMDRCMDZBRDM5NzU0OTg0NkMw\nMUMzRThFQkQyMA0GCSqGSIb3DQEBCwUAA4IBAQBe7XgncAY/1PLbCsnMsYt11k3V\n2cdNZ+yuCxhlOEKk3nHE6WCTL6zL0qWlTKKpnw1rE/+4OS76Tg72wWXcHfHDAOgt\n9icp62cKx1WO3QweeZpSvLDmtdLgKKrqeIWh+rL8+ZhuAOxSkaRwcsMTWDaLeDOi\n0pGeqvfG8WNhPxkkaSI8xbiTK641Yg9WT/Q4yfHS7Q6wg1dj9YQdo0dvVB0S2Nir\nX9IK6PUaHDnQeFKDmKgLkDGLaKaiijEvC91wMEE6qB8b0eNhciaxq2YhGHcFmSRP\nWUyc5CmBadt7wIOH5Z3bfuwWGxqxKjNw/baM/d+nk7hlDr01YL9c0g16B9MW\n-----END CERTIFICATE-----\n","apiV3Key":"joerVi8y5DJ3o4ttA0o1uH47Xz1u2Ase"}', NULL, N'2021-10-23 17:12:10.0000000', NULL, N'2022-02-27 04:15:13.0000000', N'1', N'0') +GO + +INSERT INTO [dbo].[pay_channel] ([id], [code], [status], [remark], [fee_rate], [merchant_id], [app_id], [config], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'10', N'wx_pub', N'0', NULL, N'1', N'1', N'6', N'{"@class":"com.win.framework.pay.core.client.impl.wx.WXPayClientConfig","appId":"wx041349c6f39b268b","mchId":"1545083881","apiVersion":"v2","mchKey":"0alL64UDQdlCwiKZ73ib7ypaIjMns06p","privateKeyContent":"-----BEGIN PRIVATE KEY-----\nMIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC5q2hYE3loOQoH\nl/2kh/epuj17W8VpV5vBl7ysJWAbBXux6mlq4gKTHD0QUQdiKtDEUm/bKC9Bi6VU\nuklM5Y8oCaCbhjklHRbET8jsgd9phSNGviHclYRLsQRO8oXnN89kN0y7DYKm0hYd\nmaiS12Z3v8VaImSTr4HVeHlC/z3S6mdwSr263stKt931YTcbTj/QFH7znsv9Na0u\nX6LaMBEEAsJctWdm8Ndrd1tGh9Fzf0DA5VRXsJR3kkWspy+IwiDTPV/FDKOU9NJC\nSxMmDePerTfkoZ2s1rltqBK0ykDJrXtxR+hTzEsKZ/KpNi8tyYpfNZsviHIlUsLP\nFJ5UvUhpAgMBAAECggEAd90NltazqTIxpGdeCwrwOzWNnYbIclJprlhMKIJUgf1P\nNrPTbHoOGXTAgzkcYCat8iAaMEzH/TOu/3zn92m3uqxEcEL9v1UBLqknWHAbkB6w\ngGocqDAqYUcdNe5hvbyM+fCta5C0SQgV2PQrHOlMMICwYpkTfzhtxCdreXIYMoGg\nJEIRkZWgrm/N7LTtNgizznuUjy6OURWjXaWKPcs3b3j6G1gLj9Vp++z4y0u51nqM\n4R6fcvl8M6BjlcC8zo6DbOvCW8cXtuXsnru+2TPrUnsGeybJok4fEQsfW1BvpvPo\nief38rYJn4OWxIrHcpWrhNtXtgRPeiMGFfIsEQDmVQKBgQDzXK6Nn3Nr3TFfGVTy\n8QYrzOuY2NqzH8nnsLL6qn3HoKxTv+PcFKOTPsi6f4hIYCzBP0esRrPv0ffMu9oQ\nJvFtCJvMmcKGtp0Q5hcj0y/XkbC3AWuahJtBv8lhKXVnQXSL0j3+ombljw4/8yN0\nAzgBz+j/skQQgZ3sN5h+DHGtgwKBgQDDT784/2pd4m86c/uBmrwYfqu6MJo0eHJh\n1XPtE+u8pOHyNTFk77rKobKDqN5VlrF0uEmBc/08LKhyxJ3vh/zAbcmqT1Mq778y\nAKKUtVmvcaVDrvSQHsnhj0zt4SHGmmU34U2b9hV+nocq5VszX6/jp//HJi9bs3We\ndAzfFCmaowKBgC1MmDVGc+6lCraf+X8LPFHU4Bnga70h8qxM6NPd/nG1R76DHn/t\n25DiA+0rJgwK0unZxJadxoqic9TJNssA5Lmd+5o3GM2Imm311mLVwbcHqHQ4MHZf\nrqKrd2m9lNv2hCIurVmDk1Gxsj5XHMdQfhFgSQengCHubp30r07vNA3PAoGAUEAE\nIjdQTSMs8KeXP7mEb8wcY3R05/pVhT1fVJpK0kgtTofss7yM05V88/v+3sv8Pik6\niqZN9tuimwWOn00Q3UA/DGtrkMjRlooMQ24AW8YmUZkhg9YivTtUMKnAZwopbLx2\nVw7V5iDdCRMUVheK/c+ZmQpnixZBzcmBQGfYcGECgYBjEq3Mem+Aw6pXOu6+0FwH\n9y6Xi4HhBkq0OOZZuXFtWVry7YrD3pBgzWVAZJqJCkyPKKZzCzwdbFd3u0lYBs35\nzYgx7ug4hR+wfI980a3vxjcWGOqnOUUnUJ7ucIa+KDgnYV/bBy4jqpVreXmWAJXl\nfyjG3eLWBrtrsI9YX6zeAA==\n-----END PRIVATE KEY-----\n","privateCertContent":"-----BEGIN CERTIFICATE-----\nMIID6TCCAtGgAwIBAgIUNkEHq6aQcF80NSYqWS58ybsJzI4wDQYJKoZIhvcNAQEL\nBQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT\nFFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg\nQ0EwHhcNMjExMDIxMDU0NTQxWhcNMjYxMDIwMDU0NTQxWjB7MRMwEQYDVQQDDAox\nNTQ1MDgzODgxMRswGQYDVQQKDBLlvq7kv6HllYbmiLfns7vnu58xJzAlBgNVBAsM\nHuWOhuWfjuWMuuWkp+adjuWwp+aXpeeUqOWTgeW6lzELMAkGA1UEBgwCQ04xETAP\nBgNVBAcMCFNoZW5aaGVuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\nuatoWBN5aDkKB5f9pIf3qbo9e1vFaVebwZe8rCVgGwV7seppauICkxw9EFEHYirQ\nxFJv2ygvQYulVLpJTOWPKAmgm4Y5JR0WxE/I7IHfaYUjRr4h3JWES7EETvKF5zfP\nZDdMuw2CptIWHZmoktdmd7/FWiJkk6+B1Xh5Qv890upncEq9ut7LSrfd9WE3G04/\n0BR+857L/TWtLl+i2jARBALCXLVnZvDXa3dbRofRc39AwOVUV7CUd5JFrKcviMIg\n0z1fxQyjlPTSQksTJg3j3q035KGdrNa5bagStMpAya17cUfoU8xLCmfyqTYvLcmK\nXzWbL4hyJVLCzxSeVL1IaQIDAQABo4GBMH8wCQYDVR0TBAIwADALBgNVHQ8EBAMC\nBPAwZQYDVR0fBF4wXDBaoFigVoZUaHR0cDovL2V2Y2EuaXRydXMuY29tLmNuL3B1\nYmxpYy9pdHJ1c2NybD9DQT0xQkQ0MjIwRTUwREJDMDRCMDZBRDM5NzU0OTg0NkMw\nMUMzRThFQkQyMA0GCSqGSIb3DQEBCwUAA4IBAQBe7XgncAY/1PLbCsnMsYt11k3V\n2cdNZ+yuCxhlOEKk3nHE6WCTL6zL0qWlTKKpnw1rE/+4OS76Tg72wWXcHfHDAOgt\n9icp62cKx1WO3QweeZpSvLDmtdLgKKrqeIWh+rL8+ZhuAOxSkaRwcsMTWDaLeDOi\n0pGeqvfG8WNhPxkkaSI8xbiTK641Yg9WT/Q4yfHS7Q6wg1dj9YQdo0dvVB0S2Nir\nX9IK6PUaHDnQeFKDmKgLkDGLaKaiijEvC91wMEE6qB8b0eNhciaxq2YhGHcFmSRP\nWUyc5CmBadt7wIOH5Z3bfuwWGxqxKjNw/baM/d+nk7hlDr01YL9c0g16B9MW\n-----END CERTIFICATE-----\n","apiV3Key":"joerVi8y5DJ3o4ttA0o1uH47Xz1u2Ase"}', NULL, N'2021-12-14 22:01:24.0000000', NULL, N'2022-02-27 04:15:12.0000000', N'1', N'0') +GO + +INSERT INTO [dbo].[pay_channel] ([id], [code], [status], [remark], [fee_rate], [merchant_id], [app_id], [config], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'11', N'wx_pub', N'0', NULL, N'1', N'1', N'6', N'{"@class":"com.win.framework.pay.core.client.impl.wx.WXPayClientConfig","appId":"wx041349c6f39b268b","mchId":"1545083881","apiVersion":"v2","mchKey":"0alL64UDQdlCwiKZ73ib7ypaIjMns06p","privateKeyContent":"-----BEGIN PRIVATE KEY-----\nMIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC5q2hYE3loOQoH\nl/2kh/epuj17W8VpV5vBl7ysJWAbBXux6mlq4gKTHD0QUQdiKtDEUm/bKC9Bi6VU\nuklM5Y8oCaCbhjklHRbET8jsgd9phSNGviHclYRLsQRO8oXnN89kN0y7DYKm0hYd\nmaiS12Z3v8VaImSTr4HVeHlC/z3S6mdwSr263stKt931YTcbTj/QFH7znsv9Na0u\nX6LaMBEEAsJctWdm8Ndrd1tGh9Fzf0DA5VRXsJR3kkWspy+IwiDTPV/FDKOU9NJC\nSxMmDePerTfkoZ2s1rltqBK0ykDJrXtxR+hTzEsKZ/KpNi8tyYpfNZsviHIlUsLP\nFJ5UvUhpAgMBAAECggEAd90NltazqTIxpGdeCwrwOzWNnYbIclJprlhMKIJUgf1P\nNrPTbHoOGXTAgzkcYCat8iAaMEzH/TOu/3zn92m3uqxEcEL9v1UBLqknWHAbkB6w\ngGocqDAqYUcdNe5hvbyM+fCta5C0SQgV2PQrHOlMMICwYpkTfzhtxCdreXIYMoGg\nJEIRkZWgrm/N7LTtNgizznuUjy6OURWjXaWKPcs3b3j6G1gLj9Vp++z4y0u51nqM\n4R6fcvl8M6BjlcC8zo6DbOvCW8cXtuXsnru+2TPrUnsGeybJok4fEQsfW1BvpvPo\nief38rYJn4OWxIrHcpWrhNtXtgRPeiMGFfIsEQDmVQKBgQDzXK6Nn3Nr3TFfGVTy\n8QYrzOuY2NqzH8nnsLL6qn3HoKxTv+PcFKOTPsi6f4hIYCzBP0esRrPv0ffMu9oQ\nJvFtCJvMmcKGtp0Q5hcj0y/XkbC3AWuahJtBv8lhKXVnQXSL0j3+ombljw4/8yN0\nAzgBz+j/skQQgZ3sN5h+DHGtgwKBgQDDT784/2pd4m86c/uBmrwYfqu6MJo0eHJh\n1XPtE+u8pOHyNTFk77rKobKDqN5VlrF0uEmBc/08LKhyxJ3vh/zAbcmqT1Mq778y\nAKKUtVmvcaVDrvSQHsnhj0zt4SHGmmU34U2b9hV+nocq5VszX6/jp//HJi9bs3We\ndAzfFCmaowKBgC1MmDVGc+6lCraf+X8LPFHU4Bnga70h8qxM6NPd/nG1R76DHn/t\n25DiA+0rJgwK0unZxJadxoqic9TJNssA5Lmd+5o3GM2Imm311mLVwbcHqHQ4MHZf\nrqKrd2m9lNv2hCIurVmDk1Gxsj5XHMdQfhFgSQengCHubp30r07vNA3PAoGAUEAE\nIjdQTSMs8KeXP7mEb8wcY3R05/pVhT1fVJpK0kgtTofss7yM05V88/v+3sv8Pik6\niqZN9tuimwWOn00Q3UA/DGtrkMjRlooMQ24AW8YmUZkhg9YivTtUMKnAZwopbLx2\nVw7V5iDdCRMUVheK/c+ZmQpnixZBzcmBQGfYcGECgYBjEq3Mem+Aw6pXOu6+0FwH\n9y6Xi4HhBkq0OOZZuXFtWVry7YrD3pBgzWVAZJqJCkyPKKZzCzwdbFd3u0lYBs35\nzYgx7ug4hR+wfI980a3vxjcWGOqnOUUnUJ7ucIa+KDgnYV/bBy4jqpVreXmWAJXl\nfyjG3eLWBrtrsI9YX6zeAA==\n-----END PRIVATE KEY-----\n","privateCertContent":"-----BEGIN CERTIFICATE-----\nMIID6TCCAtGgAwIBAgIUNkEHq6aQcF80NSYqWS58ybsJzI4wDQYJKoZIhvcNAQEL\nBQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT\nFFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg\nQ0EwHhcNMjExMDIxMDU0NTQxWhcNMjYxMDIwMDU0NTQxWjB7MRMwEQYDVQQDDAox\nNTQ1MDgzODgxMRswGQYDVQQKDBLlvq7kv6HllYbmiLfns7vnu58xJzAlBgNVBAsM\nHuWOhuWfjuWMuuWkp+adjuWwp+aXpeeUqOWTgeW6lzELMAkGA1UEBgwCQ04xETAP\nBgNVBAcMCFNoZW5aaGVuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\nuatoWBN5aDkKB5f9pIf3qbo9e1vFaVebwZe8rCVgGwV7seppauICkxw9EFEHYirQ\nxFJv2ygvQYulVLpJTOWPKAmgm4Y5JR0WxE/I7IHfaYUjRr4h3JWES7EETvKF5zfP\nZDdMuw2CptIWHZmoktdmd7/FWiJkk6+B1Xh5Qv890upncEq9ut7LSrfd9WE3G04/\n0BR+857L/TWtLl+i2jARBALCXLVnZvDXa3dbRofRc39AwOVUV7CUd5JFrKcviMIg\n0z1fxQyjlPTSQksTJg3j3q035KGdrNa5bagStMpAya17cUfoU8xLCmfyqTYvLcmK\nXzWbL4hyJVLCzxSeVL1IaQIDAQABo4GBMH8wCQYDVR0TBAIwADALBgNVHQ8EBAMC\nBPAwZQYDVR0fBF4wXDBaoFigVoZUaHR0cDovL2V2Y2EuaXRydXMuY29tLmNuL3B1\nYmxpYy9pdHJ1c2NybD9DQT0xQkQ0MjIwRTUwREJDMDRCMDZBRDM5NzU0OTg0NkMw\nMUMzRThFQkQyMA0GCSqGSIb3DQEBCwUAA4IBAQBe7XgncAY/1PLbCsnMsYt11k3V\n2cdNZ+yuCxhlOEKk3nHE6WCTL6zL0qWlTKKpnw1rE/+4OS76Tg72wWXcHfHDAOgt\n9icp62cKx1WO3QweeZpSvLDmtdLgKKrqeIWh+rL8+ZhuAOxSkaRwcsMTWDaLeDOi\n0pGeqvfG8WNhPxkkaSI8xbiTK641Yg9WT/Q4yfHS7Q6wg1dj9YQdo0dvVB0S2Nir\nX9IK6PUaHDnQeFKDmKgLkDGLaKaiijEvC91wMEE6qB8b0eNhciaxq2YhGHcFmSRP\nWUyc5CmBadt7wIOH5Z3bfuwWGxqxKjNw/baM/d+nk7hlDr01YL9c0g16B9MW\n-----END CERTIFICATE-----\n","apiV3Key":"joerVi8y5DJ3o4ttA0o1uH47Xz1u2Ase"}', NULL, N'2021-12-14 22:02:57.0000000', NULL, N'2022-02-27 04:15:11.0000000', N'1', N'0') +GO + +INSERT INTO [dbo].[pay_channel] ([id], [code], [status], [remark], [fee_rate], [merchant_id], [app_id], [config], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'12', N'wx_pub', N'0', NULL, N'1', N'1', N'6', N'{"@class":"com.win.framework.pay.core.client.impl.wx.WXPayClientConfig","appId":"wx041349c6f39b268b","mchId":"1545083881","apiVersion":"v2","mchKey":"0alL64UDQdlCwiKZ73ib7ypaIjMns06p","privateKeyContent":"-----BEGIN PRIVATE KEY-----\nMIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC5q2hYE3loOQoH\nl/2kh/epuj17W8VpV5vBl7ysJWAbBXux6mlq4gKTHD0QUQdiKtDEUm/bKC9Bi6VU\nuklM5Y8oCaCbhjklHRbET8jsgd9phSNGviHclYRLsQRO8oXnN89kN0y7DYKm0hYd\nmaiS12Z3v8VaImSTr4HVeHlC/z3S6mdwSr263stKt931YTcbTj/QFH7znsv9Na0u\nX6LaMBEEAsJctWdm8Ndrd1tGh9Fzf0DA5VRXsJR3kkWspy+IwiDTPV/FDKOU9NJC\nSxMmDePerTfkoZ2s1rltqBK0ykDJrXtxR+hTzEsKZ/KpNi8tyYpfNZsviHIlUsLP\nFJ5UvUhpAgMBAAECggEAd90NltazqTIxpGdeCwrwOzWNnYbIclJprlhMKIJUgf1P\nNrPTbHoOGXTAgzkcYCat8iAaMEzH/TOu/3zn92m3uqxEcEL9v1UBLqknWHAbkB6w\ngGocqDAqYUcdNe5hvbyM+fCta5C0SQgV2PQrHOlMMICwYpkTfzhtxCdreXIYMoGg\nJEIRkZWgrm/N7LTtNgizznuUjy6OURWjXaWKPcs3b3j6G1gLj9Vp++z4y0u51nqM\n4R6fcvl8M6BjlcC8zo6DbOvCW8cXtuXsnru+2TPrUnsGeybJok4fEQsfW1BvpvPo\nief38rYJn4OWxIrHcpWrhNtXtgRPeiMGFfIsEQDmVQKBgQDzXK6Nn3Nr3TFfGVTy\n8QYrzOuY2NqzH8nnsLL6qn3HoKxTv+PcFKOTPsi6f4hIYCzBP0esRrPv0ffMu9oQ\nJvFtCJvMmcKGtp0Q5hcj0y/XkbC3AWuahJtBv8lhKXVnQXSL0j3+ombljw4/8yN0\nAzgBz+j/skQQgZ3sN5h+DHGtgwKBgQDDT784/2pd4m86c/uBmrwYfqu6MJo0eHJh\n1XPtE+u8pOHyNTFk77rKobKDqN5VlrF0uEmBc/08LKhyxJ3vh/zAbcmqT1Mq778y\nAKKUtVmvcaVDrvSQHsnhj0zt4SHGmmU34U2b9hV+nocq5VszX6/jp//HJi9bs3We\ndAzfFCmaowKBgC1MmDVGc+6lCraf+X8LPFHU4Bnga70h8qxM6NPd/nG1R76DHn/t\n25DiA+0rJgwK0unZxJadxoqic9TJNssA5Lmd+5o3GM2Imm311mLVwbcHqHQ4MHZf\nrqKrd2m9lNv2hCIurVmDk1Gxsj5XHMdQfhFgSQengCHubp30r07vNA3PAoGAUEAE\nIjdQTSMs8KeXP7mEb8wcY3R05/pVhT1fVJpK0kgtTofss7yM05V88/v+3sv8Pik6\niqZN9tuimwWOn00Q3UA/DGtrkMjRlooMQ24AW8YmUZkhg9YivTtUMKnAZwopbLx2\nVw7V5iDdCRMUVheK/c+ZmQpnixZBzcmBQGfYcGECgYBjEq3Mem+Aw6pXOu6+0FwH\n9y6Xi4HhBkq0OOZZuXFtWVry7YrD3pBgzWVAZJqJCkyPKKZzCzwdbFd3u0lYBs35\nzYgx7ug4hR+wfI980a3vxjcWGOqnOUUnUJ7ucIa+KDgnYV/bBy4jqpVreXmWAJXl\nfyjG3eLWBrtrsI9YX6zeAA==\n-----END PRIVATE KEY-----\n","privateCertContent":"-----BEGIN CERTIFICATE-----\nMIID6TCCAtGgAwIBAgIUNkEHq6aQcF80NSYqWS58ybsJzI4wDQYJKoZIhvcNAQEL\nBQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT\nFFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg\nQ0EwHhcNMjExMDIxMDU0NTQxWhcNMjYxMDIwMDU0NTQxWjB7MRMwEQYDVQQDDAox\nNTQ1MDgzODgxMRswGQYDVQQKDBLlvq7kv6HllYbmiLfns7vnu58xJzAlBgNVBAsM\nHuWOhuWfjuWMuuWkp+adjuWwp+aXpeeUqOWTgeW6lzELMAkGA1UEBgwCQ04xETAP\nBgNVBAcMCFNoZW5aaGVuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\nuatoWBN5aDkKB5f9pIf3qbo9e1vFaVebwZe8rCVgGwV7seppauICkxw9EFEHYirQ\nxFJv2ygvQYulVLpJTOWPKAmgm4Y5JR0WxE/I7IHfaYUjRr4h3JWES7EETvKF5zfP\nZDdMuw2CptIWHZmoktdmd7/FWiJkk6+B1Xh5Qv890upncEq9ut7LSrfd9WE3G04/\n0BR+857L/TWtLl+i2jARBALCXLVnZvDXa3dbRofRc39AwOVUV7CUd5JFrKcviMIg\n0z1fxQyjlPTSQksTJg3j3q035KGdrNa5bagStMpAya17cUfoU8xLCmfyqTYvLcmK\nXzWbL4hyJVLCzxSeVL1IaQIDAQABo4GBMH8wCQYDVR0TBAIwADALBgNVHQ8EBAMC\nBPAwZQYDVR0fBF4wXDBaoFigVoZUaHR0cDovL2V2Y2EuaXRydXMuY29tLmNuL3B1\nYmxpYy9pdHJ1c2NybD9DQT0xQkQ0MjIwRTUwREJDMDRCMDZBRDM5NzU0OTg0NkMw\nMUMzRThFQkQyMA0GCSqGSIb3DQEBCwUAA4IBAQBe7XgncAY/1PLbCsnMsYt11k3V\n2cdNZ+yuCxhlOEKk3nHE6WCTL6zL0qWlTKKpnw1rE/+4OS76Tg72wWXcHfHDAOgt\n9icp62cKx1WO3QweeZpSvLDmtdLgKKrqeIWh+rL8+ZhuAOxSkaRwcsMTWDaLeDOi\n0pGeqvfG8WNhPxkkaSI8xbiTK641Yg9WT/Q4yfHS7Q6wg1dj9YQdo0dvVB0S2Nir\nX9IK6PUaHDnQeFKDmKgLkDGLaKaiijEvC91wMEE6qB8b0eNhciaxq2YhGHcFmSRP\nWUyc5CmBadt7wIOH5Z3bfuwWGxqxKjNw/baM/d+nk7hlDr01YL9c0g16B9MW\n-----END CERTIFICATE-----\n","apiV3Key":"joerVi8y5DJ3o4ttA0o1uH47Xz1u2Ase"}', NULL, N'2021-12-14 22:06:10.0000000', NULL, N'2022-02-27 04:15:09.0000000', N'1', N'0') +GO + +INSERT INTO [dbo].[pay_channel] ([id], [code], [status], [remark], [fee_rate], [merchant_id], [app_id], [config], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'13', N'wx_pub', N'0', NULL, N'1', N'1', N'6', N'{"@class":"com.win.framework.pay.core.client.impl.wx.WXPayClientConfig","appId":"wx041349c6f39b268b","mchId":"1545083881","apiVersion":"v2","mchKey":"0alL64UDQdlCwiKZ73ib7ypaIjMns06p","privateKeyContent":"-----BEGIN PRIVATE KEY-----\nMIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC5q2hYE3loOQoH\nl/2kh/epuj17W8VpV5vBl7ysJWAbBXux6mlq4gKTHD0QUQdiKtDEUm/bKC9Bi6VU\nuklM5Y8oCaCbhjklHRbET8jsgd9phSNGviHclYRLsQRO8oXnN89kN0y7DYKm0hYd\nmaiS12Z3v8VaImSTr4HVeHlC/z3S6mdwSr263stKt931YTcbTj/QFH7znsv9Na0u\nX6LaMBEEAsJctWdm8Ndrd1tGh9Fzf0DA5VRXsJR3kkWspy+IwiDTPV/FDKOU9NJC\nSxMmDePerTfkoZ2s1rltqBK0ykDJrXtxR+hTzEsKZ/KpNi8tyYpfNZsviHIlUsLP\nFJ5UvUhpAgMBAAECggEAd90NltazqTIxpGdeCwrwOzWNnYbIclJprlhMKIJUgf1P\nNrPTbHoOGXTAgzkcYCat8iAaMEzH/TOu/3zn92m3uqxEcEL9v1UBLqknWHAbkB6w\ngGocqDAqYUcdNe5hvbyM+fCta5C0SQgV2PQrHOlMMICwYpkTfzhtxCdreXIYMoGg\nJEIRkZWgrm/N7LTtNgizznuUjy6OURWjXaWKPcs3b3j6G1gLj9Vp++z4y0u51nqM\n4R6fcvl8M6BjlcC8zo6DbOvCW8cXtuXsnru+2TPrUnsGeybJok4fEQsfW1BvpvPo\nief38rYJn4OWxIrHcpWrhNtXtgRPeiMGFfIsEQDmVQKBgQDzXK6Nn3Nr3TFfGVTy\n8QYrzOuY2NqzH8nnsLL6qn3HoKxTv+PcFKOTPsi6f4hIYCzBP0esRrPv0ffMu9oQ\nJvFtCJvMmcKGtp0Q5hcj0y/XkbC3AWuahJtBv8lhKXVnQXSL0j3+ombljw4/8yN0\nAzgBz+j/skQQgZ3sN5h+DHGtgwKBgQDDT784/2pd4m86c/uBmrwYfqu6MJo0eHJh\n1XPtE+u8pOHyNTFk77rKobKDqN5VlrF0uEmBc/08LKhyxJ3vh/zAbcmqT1Mq778y\nAKKUtVmvcaVDrvSQHsnhj0zt4SHGmmU34U2b9hV+nocq5VszX6/jp//HJi9bs3We\ndAzfFCmaowKBgC1MmDVGc+6lCraf+X8LPFHU4Bnga70h8qxM6NPd/nG1R76DHn/t\n25DiA+0rJgwK0unZxJadxoqic9TJNssA5Lmd+5o3GM2Imm311mLVwbcHqHQ4MHZf\nrqKrd2m9lNv2hCIurVmDk1Gxsj5XHMdQfhFgSQengCHubp30r07vNA3PAoGAUEAE\nIjdQTSMs8KeXP7mEb8wcY3R05/pVhT1fVJpK0kgtTofss7yM05V88/v+3sv8Pik6\niqZN9tuimwWOn00Q3UA/DGtrkMjRlooMQ24AW8YmUZkhg9YivTtUMKnAZwopbLx2\nVw7V5iDdCRMUVheK/c+ZmQpnixZBzcmBQGfYcGECgYBjEq3Mem+Aw6pXOu6+0FwH\n9y6Xi4HhBkq0OOZZuXFtWVry7YrD3pBgzWVAZJqJCkyPKKZzCzwdbFd3u0lYBs35\nzYgx7ug4hR+wfI980a3vxjcWGOqnOUUnUJ7ucIa+KDgnYV/bBy4jqpVreXmWAJXl\nfyjG3eLWBrtrsI9YX6zeAA==\n-----END PRIVATE KEY-----\n","privateCertContent":"-----BEGIN CERTIFICATE-----\nMIID6TCCAtGgAwIBAgIUNkEHq6aQcF80NSYqWS58ybsJzI4wDQYJKoZIhvcNAQEL\nBQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT\nFFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg\nQ0EwHhcNMjExMDIxMDU0NTQxWhcNMjYxMDIwMDU0NTQxWjB7MRMwEQYDVQQDDAox\nNTQ1MDgzODgxMRswGQYDVQQKDBLlvq7kv6HllYbmiLfns7vnu58xJzAlBgNVBAsM\nHuWOhuWfjuWMuuWkp+adjuWwp+aXpeeUqOWTgeW6lzELMAkGA1UEBgwCQ04xETAP\nBgNVBAcMCFNoZW5aaGVuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\nuatoWBN5aDkKB5f9pIf3qbo9e1vFaVebwZe8rCVgGwV7seppauICkxw9EFEHYirQ\nxFJv2ygvQYulVLpJTOWPKAmgm4Y5JR0WxE/I7IHfaYUjRr4h3JWES7EETvKF5zfP\nZDdMuw2CptIWHZmoktdmd7/FWiJkk6+B1Xh5Qv890upncEq9ut7LSrfd9WE3G04/\n0BR+857L/TWtLl+i2jARBALCXLVnZvDXa3dbRofRc39AwOVUV7CUd5JFrKcviMIg\n0z1fxQyjlPTSQksTJg3j3q035KGdrNa5bagStMpAya17cUfoU8xLCmfyqTYvLcmK\nXzWbL4hyJVLCzxSeVL1IaQIDAQABo4GBMH8wCQYDVR0TBAIwADALBgNVHQ8EBAMC\nBPAwZQYDVR0fBF4wXDBaoFigVoZUaHR0cDovL2V2Y2EuaXRydXMuY29tLmNuL3B1\nYmxpYy9pdHJ1c2NybD9DQT0xQkQ0MjIwRTUwREJDMDRCMDZBRDM5NzU0OTg0NkMw\nMUMzRThFQkQyMA0GCSqGSIb3DQEBCwUAA4IBAQBe7XgncAY/1PLbCsnMsYt11k3V\n2cdNZ+yuCxhlOEKk3nHE6WCTL6zL0qWlTKKpnw1rE/+4OS76Tg72wWXcHfHDAOgt\n9icp62cKx1WO3QweeZpSvLDmtdLgKKrqeIWh+rL8+ZhuAOxSkaRwcsMTWDaLeDOi\n0pGeqvfG8WNhPxkkaSI8xbiTK641Yg9WT/Q4yfHS7Q6wg1dj9YQdo0dvVB0S2Nir\nX9IK6PUaHDnQeFKDmKgLkDGLaKaiijEvC91wMEE6qB8b0eNhciaxq2YhGHcFmSRP\nWUyc5CmBadt7wIOH5Z3bfuwWGxqxKjNw/baM/d+nk7hlDr01YL9c0g16B9MW\n-----END CERTIFICATE-----\n","apiV3Key":"joerVi8y5DJ3o4ttA0o1uH47Xz1u2Ase"}', NULL, N'2021-12-14 22:09:39.0000000', NULL, N'2022-02-27 04:15:08.0000000', N'1', N'0') +GO + +INSERT INTO [dbo].[pay_channel] ([id], [code], [status], [remark], [fee_rate], [merchant_id], [app_id], [config], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'14', N'wx_pub', N'0', NULL, N'1', N'1', N'6', N'{"@class":"com.win.framework.pay.core.client.impl.wx.WXPayClientConfig","appId":"wx041349c6f39b268b","mchId":"1545083881","apiVersion":"v2","mchKey":"0alL64UDQdlCwiKZ73ib7ypaIjMns06p","privateKeyContent":"-----BEGIN PRIVATE KEY-----\nMIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC5q2hYE3loOQoH\nl/2kh/epuj17W8VpV5vBl7ysJWAbBXux6mlq4gKTHD0QUQdiKtDEUm/bKC9Bi6VU\nuklM5Y8oCaCbhjklHRbET8jsgd9phSNGviHclYRLsQRO8oXnN89kN0y7DYKm0hYd\nmaiS12Z3v8VaImSTr4HVeHlC/z3S6mdwSr263stKt931YTcbTj/QFH7znsv9Na0u\nX6LaMBEEAsJctWdm8Ndrd1tGh9Fzf0DA5VRXsJR3kkWspy+IwiDTPV/FDKOU9NJC\nSxMmDePerTfkoZ2s1rltqBK0ykDJrXtxR+hTzEsKZ/KpNi8tyYpfNZsviHIlUsLP\nFJ5UvUhpAgMBAAECggEAd90NltazqTIxpGdeCwrwOzWNnYbIclJprlhMKIJUgf1P\nNrPTbHoOGXTAgzkcYCat8iAaMEzH/TOu/3zn92m3uqxEcEL9v1UBLqknWHAbkB6w\ngGocqDAqYUcdNe5hvbyM+fCta5C0SQgV2PQrHOlMMICwYpkTfzhtxCdreXIYMoGg\nJEIRkZWgrm/N7LTtNgizznuUjy6OURWjXaWKPcs3b3j6G1gLj9Vp++z4y0u51nqM\n4R6fcvl8M6BjlcC8zo6DbOvCW8cXtuXsnru+2TPrUnsGeybJok4fEQsfW1BvpvPo\nief38rYJn4OWxIrHcpWrhNtXtgRPeiMGFfIsEQDmVQKBgQDzXK6Nn3Nr3TFfGVTy\n8QYrzOuY2NqzH8nnsLL6qn3HoKxTv+PcFKOTPsi6f4hIYCzBP0esRrPv0ffMu9oQ\nJvFtCJvMmcKGtp0Q5hcj0y/XkbC3AWuahJtBv8lhKXVnQXSL0j3+ombljw4/8yN0\nAzgBz+j/skQQgZ3sN5h+DHGtgwKBgQDDT784/2pd4m86c/uBmrwYfqu6MJo0eHJh\n1XPtE+u8pOHyNTFk77rKobKDqN5VlrF0uEmBc/08LKhyxJ3vh/zAbcmqT1Mq778y\nAKKUtVmvcaVDrvSQHsnhj0zt4SHGmmU34U2b9hV+nocq5VszX6/jp//HJi9bs3We\ndAzfFCmaowKBgC1MmDVGc+6lCraf+X8LPFHU4Bnga70h8qxM6NPd/nG1R76DHn/t\n25DiA+0rJgwK0unZxJadxoqic9TJNssA5Lmd+5o3GM2Imm311mLVwbcHqHQ4MHZf\nrqKrd2m9lNv2hCIurVmDk1Gxsj5XHMdQfhFgSQengCHubp30r07vNA3PAoGAUEAE\nIjdQTSMs8KeXP7mEb8wcY3R05/pVhT1fVJpK0kgtTofss7yM05V88/v+3sv8Pik6\niqZN9tuimwWOn00Q3UA/DGtrkMjRlooMQ24AW8YmUZkhg9YivTtUMKnAZwopbLx2\nVw7V5iDdCRMUVheK/c+ZmQpnixZBzcmBQGfYcGECgYBjEq3Mem+Aw6pXOu6+0FwH\n9y6Xi4HhBkq0OOZZuXFtWVry7YrD3pBgzWVAZJqJCkyPKKZzCzwdbFd3u0lYBs35\nzYgx7ug4hR+wfI980a3vxjcWGOqnOUUnUJ7ucIa+KDgnYV/bBy4jqpVreXmWAJXl\nfyjG3eLWBrtrsI9YX6zeAA==\n-----END PRIVATE KEY-----\n","privateCertContent":"-----BEGIN CERTIFICATE-----\nMIID6TCCAtGgAwIBAgIUNkEHq6aQcF80NSYqWS58ybsJzI4wDQYJKoZIhvcNAQEL\nBQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT\nFFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg\nQ0EwHhcNMjExMDIxMDU0NTQxWhcNMjYxMDIwMDU0NTQxWjB7MRMwEQYDVQQDDAox\nNTQ1MDgzODgxMRswGQYDVQQKDBLlvq7kv6HllYbmiLfns7vnu58xJzAlBgNVBAsM\nHuWOhuWfjuWMuuWkp+adjuWwp+aXpeeUqOWTgeW6lzELMAkGA1UEBgwCQ04xETAP\nBgNVBAcMCFNoZW5aaGVuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\nuatoWBN5aDkKB5f9pIf3qbo9e1vFaVebwZe8rCVgGwV7seppauICkxw9EFEHYirQ\nxFJv2ygvQYulVLpJTOWPKAmgm4Y5JR0WxE/I7IHfaYUjRr4h3JWES7EETvKF5zfP\nZDdMuw2CptIWHZmoktdmd7/FWiJkk6+B1Xh5Qv890upncEq9ut7LSrfd9WE3G04/\n0BR+857L/TWtLl+i2jARBALCXLVnZvDXa3dbRofRc39AwOVUV7CUd5JFrKcviMIg\n0z1fxQyjlPTSQksTJg3j3q035KGdrNa5bagStMpAya17cUfoU8xLCmfyqTYvLcmK\nXzWbL4hyJVLCzxSeVL1IaQIDAQABo4GBMH8wCQYDVR0TBAIwADALBgNVHQ8EBAMC\nBPAwZQYDVR0fBF4wXDBaoFigVoZUaHR0cDovL2V2Y2EuaXRydXMuY29tLmNuL3B1\nYmxpYy9pdHJ1c2NybD9DQT0xQkQ0MjIwRTUwREJDMDRCMDZBRDM5NzU0OTg0NkMw\nMUMzRThFQkQyMA0GCSqGSIb3DQEBCwUAA4IBAQBe7XgncAY/1PLbCsnMsYt11k3V\n2cdNZ+yuCxhlOEKk3nHE6WCTL6zL0qWlTKKpnw1rE/+4OS76Tg72wWXcHfHDAOgt\n9icp62cKx1WO3QweeZpSvLDmtdLgKKrqeIWh+rL8+ZhuAOxSkaRwcsMTWDaLeDOi\n0pGeqvfG8WNhPxkkaSI8xbiTK641Yg9WT/Q4yfHS7Q6wg1dj9YQdo0dvVB0S2Nir\nX9IK6PUaHDnQeFKDmKgLkDGLaKaiijEvC91wMEE6qB8b0eNhciaxq2YhGHcFmSRP\nWUyc5CmBadt7wIOH5Z3bfuwWGxqxKjNw/baM/d+nk7hlDr01YL9c0g16B9MW\n-----END CERTIFICATE-----\n","apiV3Key":"joerVi8y5DJ3o4ttA0o1uH47Xz1u2Ase"}', NULL, N'2021-12-14 22:38:49.0000000', NULL, N'2022-02-27 04:15:05.0000000', N'1', N'0') +GO + +INSERT INTO [dbo].[pay_channel] ([id], [code], [status], [remark], [fee_rate], [merchant_id], [app_id], [config], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'15', N'wx_pub', N'0', NULL, N'1', N'1', N'6', N'{"@class":"com.win.framework.pay.core.client.impl.wx.WXPayClientConfig","appId":"wx041349c6f39b268b","mchId":"1545083881","apiVersion":"v2","mchKey":"0alL64UDQdlCwiKZ73ib7ypaIjMns06p","privateKeyContent":"-----BEGIN PRIVATE KEY-----\nMIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC5q2hYE3loOQoH\nl/2kh/epuj17W8VpV5vBl7ysJWAbBXux6mlq4gKTHD0QUQdiKtDEUm/bKC9Bi6VU\nuklM5Y8oCaCbhjklHRbET8jsgd9phSNGviHclYRLsQRO8oXnN89kN0y7DYKm0hYd\nmaiS12Z3v8VaImSTr4HVeHlC/z3S6mdwSr263stKt931YTcbTj/QFH7znsv9Na0u\nX6LaMBEEAsJctWdm8Ndrd1tGh9Fzf0DA5VRXsJR3kkWspy+IwiDTPV/FDKOU9NJC\nSxMmDePerTfkoZ2s1rltqBK0ykDJrXtxR+hTzEsKZ/KpNi8tyYpfNZsviHIlUsLP\nFJ5UvUhpAgMBAAECggEAd90NltazqTIxpGdeCwrwOzWNnYbIclJprlhMKIJUgf1P\nNrPTbHoOGXTAgzkcYCat8iAaMEzH/TOu/3zn92m3uqxEcEL9v1UBLqknWHAbkB6w\ngGocqDAqYUcdNe5hvbyM+fCta5C0SQgV2PQrHOlMMICwYpkTfzhtxCdreXIYMoGg\nJEIRkZWgrm/N7LTtNgizznuUjy6OURWjXaWKPcs3b3j6G1gLj9Vp++z4y0u51nqM\n4R6fcvl8M6BjlcC8zo6DbOvCW8cXtuXsnru+2TPrUnsGeybJok4fEQsfW1BvpvPo\nief38rYJn4OWxIrHcpWrhNtXtgRPeiMGFfIsEQDmVQKBgQDzXK6Nn3Nr3TFfGVTy\n8QYrzOuY2NqzH8nnsLL6qn3HoKxTv+PcFKOTPsi6f4hIYCzBP0esRrPv0ffMu9oQ\nJvFtCJvMmcKGtp0Q5hcj0y/XkbC3AWuahJtBv8lhKXVnQXSL0j3+ombljw4/8yN0\nAzgBz+j/skQQgZ3sN5h+DHGtgwKBgQDDT784/2pd4m86c/uBmrwYfqu6MJo0eHJh\n1XPtE+u8pOHyNTFk77rKobKDqN5VlrF0uEmBc/08LKhyxJ3vh/zAbcmqT1Mq778y\nAKKUtVmvcaVDrvSQHsnhj0zt4SHGmmU34U2b9hV+nocq5VszX6/jp//HJi9bs3We\ndAzfFCmaowKBgC1MmDVGc+6lCraf+X8LPFHU4Bnga70h8qxM6NPd/nG1R76DHn/t\n25DiA+0rJgwK0unZxJadxoqic9TJNssA5Lmd+5o3GM2Imm311mLVwbcHqHQ4MHZf\nrqKrd2m9lNv2hCIurVmDk1Gxsj5XHMdQfhFgSQengCHubp30r07vNA3PAoGAUEAE\nIjdQTSMs8KeXP7mEb8wcY3R05/pVhT1fVJpK0kgtTofss7yM05V88/v+3sv8Pik6\niqZN9tuimwWOn00Q3UA/DGtrkMjRlooMQ24AW8YmUZkhg9YivTtUMKnAZwopbLx2\nVw7V5iDdCRMUVheK/c+ZmQpnixZBzcmBQGfYcGECgYBjEq3Mem+Aw6pXOu6+0FwH\n9y6Xi4HhBkq0OOZZuXFtWVry7YrD3pBgzWVAZJqJCkyPKKZzCzwdbFd3u0lYBs35\nzYgx7ug4hR+wfI980a3vxjcWGOqnOUUnUJ7ucIa+KDgnYV/bBy4jqpVreXmWAJXl\nfyjG3eLWBrtrsI9YX6zeAA==\n-----END PRIVATE KEY-----\n","privateCertContent":"-----BEGIN CERTIFICATE-----\nMIID6TCCAtGgAwIBAgIUNkEHq6aQcF80NSYqWS58ybsJzI4wDQYJKoZIhvcNAQEL\nBQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT\nFFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg\nQ0EwHhcNMjExMDIxMDU0NTQxWhcNMjYxMDIwMDU0NTQxWjB7MRMwEQYDVQQDDAox\nNTQ1MDgzODgxMRswGQYDVQQKDBLlvq7kv6HllYbmiLfns7vnu58xJzAlBgNVBAsM\nHuWOhuWfjuWMuuWkp+adjuWwp+aXpeeUqOWTgeW6lzELMAkGA1UEBgwCQ04xETAP\nBgNVBAcMCFNoZW5aaGVuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\nuatoWBN5aDkKB5f9pIf3qbo9e1vFaVebwZe8rCVgGwV7seppauICkxw9EFEHYirQ\nxFJv2ygvQYulVLpJTOWPKAmgm4Y5JR0WxE/I7IHfaYUjRr4h3JWES7EETvKF5zfP\nZDdMuw2CptIWHZmoktdmd7/FWiJkk6+B1Xh5Qv890upncEq9ut7LSrfd9WE3G04/\n0BR+857L/TWtLl+i2jARBALCXLVnZvDXa3dbRofRc39AwOVUV7CUd5JFrKcviMIg\n0z1fxQyjlPTSQksTJg3j3q035KGdrNa5bagStMpAya17cUfoU8xLCmfyqTYvLcmK\nXzWbL4hyJVLCzxSeVL1IaQIDAQABo4GBMH8wCQYDVR0TBAIwADALBgNVHQ8EBAMC\nBPAwZQYDVR0fBF4wXDBaoFigVoZUaHR0cDovL2V2Y2EuaXRydXMuY29tLmNuL3B1\nYmxpYy9pdHJ1c2NybD9DQT0xQkQ0MjIwRTUwREJDMDRCMDZBRDM5NzU0OTg0NkMw\nMUMzRThFQkQyMA0GCSqGSIb3DQEBCwUAA4IBAQBe7XgncAY/1PLbCsnMsYt11k3V\n2cdNZ+yuCxhlOEKk3nHE6WCTL6zL0qWlTKKpnw1rE/+4OS76Tg72wWXcHfHDAOgt\n9icp62cKx1WO3QweeZpSvLDmtdLgKKrqeIWh+rL8+ZhuAOxSkaRwcsMTWDaLeDOi\n0pGeqvfG8WNhPxkkaSI8xbiTK641Yg9WT/Q4yfHS7Q6wg1dj9YQdo0dvVB0S2Nir\nX9IK6PUaHDnQeFKDmKgLkDGLaKaiijEvC91wMEE6qB8b0eNhciaxq2YhGHcFmSRP\nWUyc5CmBadt7wIOH5Z3bfuwWGxqxKjNw/baM/d+nk7hlDr01YL9c0g16B9MW\n-----END CERTIFICATE-----\n","apiV3Key":"joerVi8y5DJ3o4ttA0o1uH47Xz1u2Ase"}', NULL, N'2021-12-15 09:32:26.0000000', NULL, N'2022-02-27 04:15:04.0000000', N'1', N'0') +GO + +INSERT INTO [dbo].[pay_channel] ([id], [code], [status], [remark], [fee_rate], [merchant_id], [app_id], [config], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'16', N'wx_pub', N'0', NULL, N'1', N'1', N'6', N'{"@class":"com.win.framework.pay.core.client.impl.wx.WXPayClientConfig","appId":"wx041349c6f39b268b","mchId":"1545083881","apiVersion":"v2","mchKey":"0alL64UDQdlCwiKZ73ib7ypaIjMns06p","privateKeyContent":"-----BEGIN PRIVATE KEY-----\nMIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC5q2hYE3loOQoH\nl/2kh/epuj17W8VpV5vBl7ysJWAbBXux6mlq4gKTHD0QUQdiKtDEUm/bKC9Bi6VU\nuklM5Y8oCaCbhjklHRbET8jsgd9phSNGviHclYRLsQRO8oXnN89kN0y7DYKm0hYd\nmaiS12Z3v8VaImSTr4HVeHlC/z3S6mdwSr263stKt931YTcbTj/QFH7znsv9Na0u\nX6LaMBEEAsJctWdm8Ndrd1tGh9Fzf0DA5VRXsJR3kkWspy+IwiDTPV/FDKOU9NJC\nSxMmDePerTfkoZ2s1rltqBK0ykDJrXtxR+hTzEsKZ/KpNi8tyYpfNZsviHIlUsLP\nFJ5UvUhpAgMBAAECggEAd90NltazqTIxpGdeCwrwOzWNnYbIclJprlhMKIJUgf1P\nNrPTbHoOGXTAgzkcYCat8iAaMEzH/TOu/3zn92m3uqxEcEL9v1UBLqknWHAbkB6w\ngGocqDAqYUcdNe5hvbyM+fCta5C0SQgV2PQrHOlMMICwYpkTfzhtxCdreXIYMoGg\nJEIRkZWgrm/N7LTtNgizznuUjy6OURWjXaWKPcs3b3j6G1gLj9Vp++z4y0u51nqM\n4R6fcvl8M6BjlcC8zo6DbOvCW8cXtuXsnru+2TPrUnsGeybJok4fEQsfW1BvpvPo\nief38rYJn4OWxIrHcpWrhNtXtgRPeiMGFfIsEQDmVQKBgQDzXK6Nn3Nr3TFfGVTy\n8QYrzOuY2NqzH8nnsLL6qn3HoKxTv+PcFKOTPsi6f4hIYCzBP0esRrPv0ffMu9oQ\nJvFtCJvMmcKGtp0Q5hcj0y/XkbC3AWuahJtBv8lhKXVnQXSL0j3+ombljw4/8yN0\nAzgBz+j/skQQgZ3sN5h+DHGtgwKBgQDDT784/2pd4m86c/uBmrwYfqu6MJo0eHJh\n1XPtE+u8pOHyNTFk77rKobKDqN5VlrF0uEmBc/08LKhyxJ3vh/zAbcmqT1Mq778y\nAKKUtVmvcaVDrvSQHsnhj0zt4SHGmmU34U2b9hV+nocq5VszX6/jp//HJi9bs3We\ndAzfFCmaowKBgC1MmDVGc+6lCraf+X8LPFHU4Bnga70h8qxM6NPd/nG1R76DHn/t\n25DiA+0rJgwK0unZxJadxoqic9TJNssA5Lmd+5o3GM2Imm311mLVwbcHqHQ4MHZf\nrqKrd2m9lNv2hCIurVmDk1Gxsj5XHMdQfhFgSQengCHubp30r07vNA3PAoGAUEAE\nIjdQTSMs8KeXP7mEb8wcY3R05/pVhT1fVJpK0kgtTofss7yM05V88/v+3sv8Pik6\niqZN9tuimwWOn00Q3UA/DGtrkMjRlooMQ24AW8YmUZkhg9YivTtUMKnAZwopbLx2\nVw7V5iDdCRMUVheK/c+ZmQpnixZBzcmBQGfYcGECgYBjEq3Mem+Aw6pXOu6+0FwH\n9y6Xi4HhBkq0OOZZuXFtWVry7YrD3pBgzWVAZJqJCkyPKKZzCzwdbFd3u0lYBs35\nzYgx7ug4hR+wfI980a3vxjcWGOqnOUUnUJ7ucIa+KDgnYV/bBy4jqpVreXmWAJXl\nfyjG3eLWBrtrsI9YX6zeAA==\n-----END PRIVATE KEY-----\n","privateCertContent":"-----BEGIN CERTIFICATE-----\nMIID6TCCAtGgAwIBAgIUNkEHq6aQcF80NSYqWS58ybsJzI4wDQYJKoZIhvcNAQEL\nBQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT\nFFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg\nQ0EwHhcNMjExMDIxMDU0NTQxWhcNMjYxMDIwMDU0NTQxWjB7MRMwEQYDVQQDDAox\nNTQ1MDgzODgxMRswGQYDVQQKDBLlvq7kv6HllYbmiLfns7vnu58xJzAlBgNVBAsM\nHuWOhuWfjuWMuuWkp+adjuWwp+aXpeeUqOWTgeW6lzELMAkGA1UEBgwCQ04xETAP\nBgNVBAcMCFNoZW5aaGVuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\nuatoWBN5aDkKB5f9pIf3qbo9e1vFaVebwZe8rCVgGwV7seppauICkxw9EFEHYirQ\nxFJv2ygvQYulVLpJTOWPKAmgm4Y5JR0WxE/I7IHfaYUjRr4h3JWES7EETvKF5zfP\nZDdMuw2CptIWHZmoktdmd7/FWiJkk6+B1Xh5Qv890upncEq9ut7LSrfd9WE3G04/\n0BR+857L/TWtLl+i2jARBALCXLVnZvDXa3dbRofRc39AwOVUV7CUd5JFrKcviMIg\n0z1fxQyjlPTSQksTJg3j3q035KGdrNa5bagStMpAya17cUfoU8xLCmfyqTYvLcmK\nXzWbL4hyJVLCzxSeVL1IaQIDAQABo4GBMH8wCQYDVR0TBAIwADALBgNVHQ8EBAMC\nBPAwZQYDVR0fBF4wXDBaoFigVoZUaHR0cDovL2V2Y2EuaXRydXMuY29tLmNuL3B1\nYmxpYy9pdHJ1c2NybD9DQT0xQkQ0MjIwRTUwREJDMDRCMDZBRDM5NzU0OTg0NkMw\nMUMzRThFQkQyMA0GCSqGSIb3DQEBCwUAA4IBAQBe7XgncAY/1PLbCsnMsYt11k3V\n2cdNZ+yuCxhlOEKk3nHE6WCTL6zL0qWlTKKpnw1rE/+4OS76Tg72wWXcHfHDAOgt\n9icp62cKx1WO3QweeZpSvLDmtdLgKKrqeIWh+rL8+ZhuAOxSkaRwcsMTWDaLeDOi\n0pGeqvfG8WNhPxkkaSI8xbiTK641Yg9WT/Q4yfHS7Q6wg1dj9YQdo0dvVB0S2Nir\nX9IK6PUaHDnQeFKDmKgLkDGLaKaiijEvC91wMEE6qB8b0eNhciaxq2YhGHcFmSRP\nWUyc5CmBadt7wIOH5Z3bfuwWGxqxKjNw/baM/d+nk7hlDr01YL9c0g16B9MW\n-----END CERTIFICATE-----\n","apiV3Key":"joerVi8y5DJ3o4ttA0o1uH47Xz1u2Ase"}', NULL, N'2022-01-31 22:13:25.0000000', NULL, N'2022-02-27 04:15:03.0000000', N'1', N'0') +GO + +INSERT INTO [dbo].[pay_channel] ([id], [code], [status], [remark], [fee_rate], [merchant_id], [app_id], [config], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'17', N'alipay_qr', N'0', NULL, N'1', N'1', N'6', N'{"@class":"com.win.framework.pay.core.client.impl.alipay.AlipayPayClientConfig","serverUrl":"https://openapi.alipaydev.com/gateway.do","appId":"2021000118634035","signType":"RSA2","mode":null,"privateKey":"MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCHsEV1cDupwJv890x84qbppUtRIfhaKSwSVN0thCcsDCaAsGR5MZslDkO8NCT9V4r2SVXjyY7eJUZlZd1M0C8T01Tg4UOx5LUbic0O3A1uJMy6V1n9IyYwbAW3AEZhBd5bSbPgrqvmv3NeWSTQT6Anxnllf+2iDH6zyA2fPl7cYyQtbZoDJQFGqr4F+cGh2R6akzRKNoBkAeMYwoY6es2lX8sJxCVPWUmxNUoL3tScwlSpd7Bxw0q9c/X01jMwuQ0+Va358zgFiGERTE6yD01eu40OBDXOYO3z++y+TAYHlQQ2toMO63trepo88X3xV3R44/1DH+k2pAm2IF5ixiLrAgMBAAECggEAPx3SoXcseaD7rmcGcE0p4SMfbsUDdkUSmBBbtfF0GzwnqNLkWa+mgE0rWt9SmXngTQH97vByAYmLPl1s3G82ht1V7Sk7yQMe74lhFllr8eEyTjeVx3dTK1EEM4TwN+936DTXdFsr4TELJEcJJdD0KaxcCcfBLRDs2wnitEFZ9N+GoZybVmY8w0e0MI7PLObUZ2l0X4RurQnfG9ZxjXjC7PkeMVv7cGGylpNFi3BbvkRhdhLPDC2E6wqnr9e7zk+hiENivAezXrtxtwKovzCtnWJ1r0IO14Rh47H509Ic0wFnj+o5YyUL4LdmpL7yaaH6fM7zcSLFjNZPHvZCKPwYcQKBgQDQFho98QvnL8ex4v6cry4VitGpjSXm1qP3vmMQk4rTsn8iPWtcxPjqGEqOQJjdi4Mi0VZKQOLFwlH0kl95wNrD/isJ4O1yeYfX7YAXApzHqYNINzM79HemO3Yx1qLMW3okRFJ9pPRzbQ9qkTpsaegsmyX316zOBhzGRYjKbutTYwKBgQCm7phr9XdFW5Vh+XR90mVs483nrLmMiDKg7YKxSLJ8amiDjzPejCn7i95Hah08P+2MIZLIPbh2VLacczR6ltRRzN5bg5etFuqSgfkuHyxpoDmpjbe08+Q2h8JBYqcC5Nhv1AKU4iOUhVLHo/FBAQliMcGc/J3eiYTFC7EsNx382QKBgClb20doe7cttgFTXswBvaUmfFm45kmla924B7SpvrQpDD/f+VDtDZRp05fGmxuduSjYdtA3aVtpLiTwWu22OUUvZZqHDGruYOO4Hvdz23mL5b4ayqImCwoNU4bAZIc9v18p/UNf3/55NNE3oGcf/bev9rH2OjCQ4nM+Ktwhg8CFAoGACSgvbkShzUkv0ZcIf9ppu+ZnJh1AdGgINvGwaJ8vQ0nm/8h8NOoFZ4oNoGc+wU5Ubops7dUM6FjPR5e+OjdJ4E7Xp7d5O4J1TaIZlCEbo5OpdhaTDDcQvrkFu+Z4eN0qzj+YAKjDAOOrXc4tbr5q0FsgXscwtcNfaBuzFVTUrUkCgYEAwzPnMNhWG3zOWLUs2QFA2GP4Y+J8cpUYfj6pbKKzeLwyG9qBwF1NJpN8m+q9q7V9P2LY+9Lp9e1mGsGeqt5HMEA3P6vIpcqLJLqE/4PBLLRzfccTcmqb1m71+erxTRhHBRkGS+I7dZEb3olQfnS1Y1tpMBxiwYwR3LW4oXuJwj8=","alipayPublicKey":"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnq90KnF4dTnlzzmxpujbI05OYqi5WxAS6cL0gnZFv2gK51HExF8v/BaP7P979PhFMgWTqmOOI+Dtno5s+yD09XTY1WkshbLk6i4g2Xlr8fyW9ODnkU88RI2w9UdPhQU4cPPwBNlrsYhKkVK2OxwM3kFqjoBBY0CZoZCsSQ3LDH5WeZqPArlsS6xa2zqJBuuoKjMrdpELl3eXSjP8K54eDJCbeetCZNKWLL3DPahTPB7LZikfYmslb0QUvCgGapD0xkS7eVq70NaL1G57MWABs4tbfWgxike4Daj3EfUrzIVspQxj7w8HEj9WozJPgL88kSJSits0pqD3n5r8HSuseQIDAQAB","appCertContent":null,"alipayPublicCertContent":null,"rootCertContent":null}', NULL, N'2022-01-31 22:13:25.0000000', NULL, N'2022-02-27 04:15:02.0000000', N'1', N'0') +GO + +SET IDENTITY_INSERT [dbo].[pay_channel] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for pay_merchant +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[pay_merchant]') AND type IN ('U')) + DROP TABLE [dbo].[pay_merchant] +GO + +CREATE TABLE [dbo].[pay_merchant] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [no] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [name] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [short_name] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [status] tinyint NOT NULL, + [remark] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [tenant_id] bigint NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL +) +GO + +ALTER TABLE [dbo].[pay_merchant] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'商户编号', +'SCHEMA', N'dbo', +'TABLE', N'pay_merchant', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'商户号', +'SCHEMA', N'dbo', +'TABLE', N'pay_merchant', +'COLUMN', N'no' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'商户全称', +'SCHEMA', N'dbo', +'TABLE', N'pay_merchant', +'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'商户简称', +'SCHEMA', N'dbo', +'TABLE', N'pay_merchant', +'COLUMN', N'short_name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'开启状态', +'SCHEMA', N'dbo', +'TABLE', N'pay_merchant', +'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'备注', +'SCHEMA', N'dbo', +'TABLE', N'pay_merchant', +'COLUMN', N'remark' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'pay_merchant', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'pay_merchant', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'pay_merchant', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'pay_merchant', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户编号', +'SCHEMA', N'dbo', +'TABLE', N'pay_merchant', +'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'pay_merchant', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'支付商户信息', +'SCHEMA', N'dbo', +'TABLE', N'pay_merchant' +GO + + +-- ---------------------------- +-- Records of pay_merchant +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[pay_merchant] ON +GO + +INSERT INTO [dbo].[pay_merchant] ([id], [no], [name], [short_name], [status], [remark], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'1', N'M233666999', N'闻荫源码', N'芋艿', N'0', N'我是备注', N'', N'2021-10-23 08:31:14.0000000', N'', N'2022-02-27 04:15:20.0000000', N'1', N'0') +GO + +SET IDENTITY_INSERT [dbo].[pay_merchant] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for pay_notify_log +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[pay_notify_log]') AND type IN ('U')) + DROP TABLE [dbo].[pay_notify_log] +GO + +CREATE TABLE [dbo].[pay_notify_log] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [task_id] bigint NOT NULL, + [notify_times] tinyint NOT NULL, + [response] nvarchar(2048) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [status] tinyint NOT NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [tenant_id] bigint NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL +) +GO + +ALTER TABLE [dbo].[pay_notify_log] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'日志编号', +'SCHEMA', N'dbo', +'TABLE', N'pay_notify_log', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'通知任务编号', +'SCHEMA', N'dbo', +'TABLE', N'pay_notify_log', +'COLUMN', N'task_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'第几次被通知', +'SCHEMA', N'dbo', +'TABLE', N'pay_notify_log', +'COLUMN', N'notify_times' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'请求参数', +'SCHEMA', N'dbo', +'TABLE', N'pay_notify_log', +'COLUMN', N'response' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'通知状态', +'SCHEMA', N'dbo', +'TABLE', N'pay_notify_log', +'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'pay_notify_log', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'pay_notify_log', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'pay_notify_log', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'pay_notify_log', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户编号', +'SCHEMA', N'dbo', +'TABLE', N'pay_notify_log', +'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'pay_notify_log', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'支付通知 App 的日志', +'SCHEMA', N'dbo', +'TABLE', N'pay_notify_log' +GO + + +-- ---------------------------- +-- Records of pay_notify_log +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[pay_notify_log] ON +GO + +SET IDENTITY_INSERT [dbo].[pay_notify_log] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for pay_notify_task +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[pay_notify_task]') AND type IN ('U')) + DROP TABLE [dbo].[pay_notify_task] +GO + +CREATE TABLE [dbo].[pay_notify_task] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [merchant_id] bigint NOT NULL, + [app_id] bigint NOT NULL, + [type] tinyint NOT NULL, + [data_id] bigint NOT NULL, + [status] tinyint NOT NULL, + [merchant_order_id] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [next_notify_time] datetime2(7) NOT NULL, + [last_execute_time] datetime2(7) NOT NULL, + [notify_times] tinyint NOT NULL, + [max_notify_times] tinyint NOT NULL, + [notify_url] nvarchar(1024) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [tenant_id] bigint NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL +) +GO + +ALTER TABLE [dbo].[pay_notify_task] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'任务编号', +'SCHEMA', N'dbo', +'TABLE', N'pay_notify_task', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'商户编号', +'SCHEMA', N'dbo', +'TABLE', N'pay_notify_task', +'COLUMN', N'merchant_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'应用编号', +'SCHEMA', N'dbo', +'TABLE', N'pay_notify_task', +'COLUMN', N'app_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'通知类型', +'SCHEMA', N'dbo', +'TABLE', N'pay_notify_task', +'COLUMN', N'type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'数据编号', +'SCHEMA', N'dbo', +'TABLE', N'pay_notify_task', +'COLUMN', N'data_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'通知状态', +'SCHEMA', N'dbo', +'TABLE', N'pay_notify_task', +'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'商户订单编号', +'SCHEMA', N'dbo', +'TABLE', N'pay_notify_task', +'COLUMN', N'merchant_order_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'下一次通知时间', +'SCHEMA', N'dbo', +'TABLE', N'pay_notify_task', +'COLUMN', N'next_notify_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'最后一次执行时间', +'SCHEMA', N'dbo', +'TABLE', N'pay_notify_task', +'COLUMN', N'last_execute_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'当前通知次数', +'SCHEMA', N'dbo', +'TABLE', N'pay_notify_task', +'COLUMN', N'notify_times' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'最大可通知次数', +'SCHEMA', N'dbo', +'TABLE', N'pay_notify_task', +'COLUMN', N'max_notify_times' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'异步通知地址', +'SCHEMA', N'dbo', +'TABLE', N'pay_notify_task', +'COLUMN', N'notify_url' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'pay_notify_task', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'pay_notify_task', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'pay_notify_task', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'pay_notify_task', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户编号', +'SCHEMA', N'dbo', +'TABLE', N'pay_notify_task', +'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'pay_notify_task', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'商户支付、退款等的通知 +', +'SCHEMA', N'dbo', +'TABLE', N'pay_notify_task' +GO + + +-- ---------------------------- +-- Records of pay_notify_task +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[pay_notify_task] ON +GO + +SET IDENTITY_INSERT [dbo].[pay_notify_task] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for pay_order +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[pay_order]') AND type IN ('U')) + DROP TABLE [dbo].[pay_order] +GO + +CREATE TABLE [dbo].[pay_order] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [merchant_id] bigint NOT NULL, + [app_id] bigint NOT NULL, + [channel_id] bigint NULL, + [channel_code] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [merchant_order_id] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [subject] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [body] nvarchar(128) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [notify_url] nvarchar(1024) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [notify_status] tinyint NOT NULL, + [amount] bigint NOT NULL, + [channel_fee_rate] float(53) NULL, + [channel_fee_amount] bigint NULL, + [status] tinyint NOT NULL, + [user_ip] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [expire_time] datetime2(7) NOT NULL, + [success_time] datetime2(7) NULL, + [notify_time] datetime2(7) NULL, + [success_extension_id] bigint NULL, + [refund_status] tinyint NOT NULL, + [refund_times] tinyint NOT NULL, + [refund_amount] bigint NOT NULL, + [channel_user_id] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [channel_order_no] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [tenant_id] bigint NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL +) +GO + +ALTER TABLE [dbo].[pay_order] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'支付订单编号', +'SCHEMA', N'dbo', +'TABLE', N'pay_order', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'商户编号', +'SCHEMA', N'dbo', +'TABLE', N'pay_order', +'COLUMN', N'merchant_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'应用编号', +'SCHEMA', N'dbo', +'TABLE', N'pay_order', +'COLUMN', N'app_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'渠道编号', +'SCHEMA', N'dbo', +'TABLE', N'pay_order', +'COLUMN', N'channel_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'渠道编码', +'SCHEMA', N'dbo', +'TABLE', N'pay_order', +'COLUMN', N'channel_code' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'商户订单编号', +'SCHEMA', N'dbo', +'TABLE', N'pay_order', +'COLUMN', N'merchant_order_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'商品标题', +'SCHEMA', N'dbo', +'TABLE', N'pay_order', +'COLUMN', N'subject' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'商品描述', +'SCHEMA', N'dbo', +'TABLE', N'pay_order', +'COLUMN', N'body' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'异步通知地址', +'SCHEMA', N'dbo', +'TABLE', N'pay_order', +'COLUMN', N'notify_url' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'通知商户支付结果的回调状态', +'SCHEMA', N'dbo', +'TABLE', N'pay_order', +'COLUMN', N'notify_status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'支付金额,单位:分', +'SCHEMA', N'dbo', +'TABLE', N'pay_order', +'COLUMN', N'amount' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'渠道手续费,单位:百分比', +'SCHEMA', N'dbo', +'TABLE', N'pay_order', +'COLUMN', N'channel_fee_rate' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'渠道手续金额,单位:分', +'SCHEMA', N'dbo', +'TABLE', N'pay_order', +'COLUMN', N'channel_fee_amount' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'支付状态', +'SCHEMA', N'dbo', +'TABLE', N'pay_order', +'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户 IP', +'SCHEMA', N'dbo', +'TABLE', N'pay_order', +'COLUMN', N'user_ip' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'订单失效时间', +'SCHEMA', N'dbo', +'TABLE', N'pay_order', +'COLUMN', N'expire_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'订单支付成功时间', +'SCHEMA', N'dbo', +'TABLE', N'pay_order', +'COLUMN', N'success_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'订单支付通知时间', +'SCHEMA', N'dbo', +'TABLE', N'pay_order', +'COLUMN', N'notify_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'支付成功的订单拓展单编号', +'SCHEMA', N'dbo', +'TABLE', N'pay_order', +'COLUMN', N'success_extension_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'退款状态', +'SCHEMA', N'dbo', +'TABLE', N'pay_order', +'COLUMN', N'refund_status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'退款次数', +'SCHEMA', N'dbo', +'TABLE', N'pay_order', +'COLUMN', N'refund_times' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'退款总金额,单位:分', +'SCHEMA', N'dbo', +'TABLE', N'pay_order', +'COLUMN', N'refund_amount' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'渠道用户编号', +'SCHEMA', N'dbo', +'TABLE', N'pay_order', +'COLUMN', N'channel_user_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'渠道订单号', +'SCHEMA', N'dbo', +'TABLE', N'pay_order', +'COLUMN', N'channel_order_no' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'pay_order', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'pay_order', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'pay_order', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'pay_order', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户编号', +'SCHEMA', N'dbo', +'TABLE', N'pay_order', +'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'pay_order', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'支付订单 +', +'SCHEMA', N'dbo', +'TABLE', N'pay_order' +GO + + +-- ---------------------------- +-- Records of pay_order +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[pay_order] ON +GO + +SET IDENTITY_INSERT [dbo].[pay_order] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for pay_order_extension +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[pay_order_extension]') AND type IN ('U')) + DROP TABLE [dbo].[pay_order_extension] +GO + +CREATE TABLE [dbo].[pay_order_extension] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [no] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [order_id] bigint NOT NULL, + [channel_id] bigint NOT NULL, + [channel_code] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [user_ip] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [status] tinyint NOT NULL, + [channel_extras] nvarchar(256) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [channel_notify_data] nvarchar(1024) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [tenant_id] bigint NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL +) +GO + +ALTER TABLE [dbo].[pay_order_extension] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'支付订单编号', +'SCHEMA', N'dbo', +'TABLE', N'pay_order_extension', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'支付订单号', +'SCHEMA', N'dbo', +'TABLE', N'pay_order_extension', +'COLUMN', N'no' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'支付订单编号', +'SCHEMA', N'dbo', +'TABLE', N'pay_order_extension', +'COLUMN', N'order_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'渠道编号', +'SCHEMA', N'dbo', +'TABLE', N'pay_order_extension', +'COLUMN', N'channel_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'渠道编码', +'SCHEMA', N'dbo', +'TABLE', N'pay_order_extension', +'COLUMN', N'channel_code' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户 IP', +'SCHEMA', N'dbo', +'TABLE', N'pay_order_extension', +'COLUMN', N'user_ip' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'支付状态', +'SCHEMA', N'dbo', +'TABLE', N'pay_order_extension', +'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'支付渠道的额外参数', +'SCHEMA', N'dbo', +'TABLE', N'pay_order_extension', +'COLUMN', N'channel_extras' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'支付渠道异步通知的内容', +'SCHEMA', N'dbo', +'TABLE', N'pay_order_extension', +'COLUMN', N'channel_notify_data' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'pay_order_extension', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'pay_order_extension', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'pay_order_extension', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'pay_order_extension', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户编号', +'SCHEMA', N'dbo', +'TABLE', N'pay_order_extension', +'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'pay_order_extension', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'支付订单 +', +'SCHEMA', N'dbo', +'TABLE', N'pay_order_extension' +GO + + +-- ---------------------------- +-- Records of pay_order_extension +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[pay_order_extension] ON +GO + +SET IDENTITY_INSERT [dbo].[pay_order_extension] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for pay_refund +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[pay_refund]') AND type IN ('U')) + DROP TABLE [dbo].[pay_refund] +GO + +CREATE TABLE [dbo].[pay_refund] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [merchant_id] bigint NOT NULL, + [app_id] bigint NOT NULL, + [channel_id] bigint NOT NULL, + [channel_code] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [order_id] bigint NOT NULL, + [trade_no] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [merchant_order_id] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [merchant_refund_no] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [notify_url] nvarchar(1024) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [notify_status] tinyint NOT NULL, + [status] tinyint NOT NULL, + [type] tinyint NOT NULL, + [pay_amount] bigint NOT NULL, + [refund_amount] bigint NOT NULL, + [reason] nvarchar(256) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [user_ip] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [channel_order_no] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [channel_refund_no] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [channel_error_code] nvarchar(128) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [channel_error_msg] nvarchar(256) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [channel_extras] nvarchar(1024) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [expire_time] datetime2(7) NULL, + [success_time] datetime2(7) NULL, + [notify_time] datetime2(7) NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [tenant_id] bigint NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL +) +GO + +ALTER TABLE [dbo].[pay_refund] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'支付退款编号', +'SCHEMA', N'dbo', +'TABLE', N'pay_refund', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'商户编号', +'SCHEMA', N'dbo', +'TABLE', N'pay_refund', +'COLUMN', N'merchant_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'应用编号', +'SCHEMA', N'dbo', +'TABLE', N'pay_refund', +'COLUMN', N'app_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'渠道编号', +'SCHEMA', N'dbo', +'TABLE', N'pay_refund', +'COLUMN', N'channel_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'渠道编码', +'SCHEMA', N'dbo', +'TABLE', N'pay_refund', +'COLUMN', N'channel_code' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'支付订单编号 pay_order 表id', +'SCHEMA', N'dbo', +'TABLE', N'pay_refund', +'COLUMN', N'order_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'交易订单号 pay_extension 表no 字段', +'SCHEMA', N'dbo', +'TABLE', N'pay_refund', +'COLUMN', N'trade_no' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'商户订单编号(商户系统生成)', +'SCHEMA', N'dbo', +'TABLE', N'pay_refund', +'COLUMN', N'merchant_order_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'商户退款订单号(商户系统生成)', +'SCHEMA', N'dbo', +'TABLE', N'pay_refund', +'COLUMN', N'merchant_refund_no' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'异步通知商户地址', +'SCHEMA', N'dbo', +'TABLE', N'pay_refund', +'COLUMN', N'notify_url' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'通知商户退款结果的回调状态', +'SCHEMA', N'dbo', +'TABLE', N'pay_refund', +'COLUMN', N'notify_status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'退款状态', +'SCHEMA', N'dbo', +'TABLE', N'pay_refund', +'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'退款类型(部分退款,全部退款)', +'SCHEMA', N'dbo', +'TABLE', N'pay_refund', +'COLUMN', N'type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'支付金额,单位分', +'SCHEMA', N'dbo', +'TABLE', N'pay_refund', +'COLUMN', N'pay_amount' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'退款金额,单位分', +'SCHEMA', N'dbo', +'TABLE', N'pay_refund', +'COLUMN', N'refund_amount' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'退款原因', +'SCHEMA', N'dbo', +'TABLE', N'pay_refund', +'COLUMN', N'reason' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户 IP', +'SCHEMA', N'dbo', +'TABLE', N'pay_refund', +'COLUMN', N'user_ip' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'渠道订单号,pay_order 中的channel_order_no 对应', +'SCHEMA', N'dbo', +'TABLE', N'pay_refund', +'COLUMN', N'channel_order_no' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'渠道退款单号,渠道返回', +'SCHEMA', N'dbo', +'TABLE', N'pay_refund', +'COLUMN', N'channel_refund_no' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'渠道调用报错时,错误码', +'SCHEMA', N'dbo', +'TABLE', N'pay_refund', +'COLUMN', N'channel_error_code' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'渠道调用报错时,错误信息', +'SCHEMA', N'dbo', +'TABLE', N'pay_refund', +'COLUMN', N'channel_error_msg' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'支付渠道的额外参数', +'SCHEMA', N'dbo', +'TABLE', N'pay_refund', +'COLUMN', N'channel_extras' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'退款失效时间', +'SCHEMA', N'dbo', +'TABLE', N'pay_refund', +'COLUMN', N'expire_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'退款成功时间', +'SCHEMA', N'dbo', +'TABLE', N'pay_refund', +'COLUMN', N'success_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'退款通知时间', +'SCHEMA', N'dbo', +'TABLE', N'pay_refund', +'COLUMN', N'notify_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'pay_refund', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'pay_refund', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'pay_refund', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'pay_refund', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户编号', +'SCHEMA', N'dbo', +'TABLE', N'pay_refund', +'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'pay_refund', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'退款订单', +'SCHEMA', N'dbo', +'TABLE', N'pay_refund' +GO + + +-- ---------------------------- +-- Records of pay_refund +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[pay_refund] ON +GO + +SET IDENTITY_INSERT [dbo].[pay_refund] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for system_dept +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[system_dept]') AND type IN ('U')) + DROP TABLE [dbo].[system_dept] +GO + +CREATE TABLE [dbo].[system_dept] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [name] nvarchar(30) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [parent_id] bigint NOT NULL, + [sort] int NOT NULL, + [leader_user_id] bigint NULL, + [phone] nvarchar(11) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [email] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [status] tinyint NOT NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [tenant_id] bigint NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL +) +GO + +ALTER TABLE [dbo].[system_dept] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'部门id', +'SCHEMA', N'dbo', +'TABLE', N'system_dept', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'部门名称', +'SCHEMA', N'dbo', +'TABLE', N'system_dept', +'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'父部门id', +'SCHEMA', N'dbo', +'TABLE', N'system_dept', +'COLUMN', N'parent_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'显示顺序', +'SCHEMA', N'dbo', +'TABLE', N'system_dept', +'COLUMN', N'sort' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'负责人', +'SCHEMA', N'dbo', +'TABLE', N'system_dept', +'COLUMN', N'leader_user_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'联系电话', +'SCHEMA', N'dbo', +'TABLE', N'system_dept', +'COLUMN', N'phone' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'邮箱', +'SCHEMA', N'dbo', +'TABLE', N'system_dept', +'COLUMN', N'email' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'部门状态(0正常 1停用)', +'SCHEMA', N'dbo', +'TABLE', N'system_dept', +'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'system_dept', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'system_dept', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'system_dept', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'system_dept', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户编号', +'SCHEMA', N'dbo', +'TABLE', N'system_dept', +'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'system_dept', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'部门表', +'SCHEMA', N'dbo', +'TABLE', N'system_dept' +GO + + +-- ---------------------------- +-- Records of system_dept +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[system_dept] ON +GO + +INSERT INTO [dbo].[system_dept] ([id], [name], [parent_id], [sort], [leader_user_id], [phone], [email], [status], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'100', N'闻荫源码', N'0', N'0', N'1', N'15888888888', N'ry@qq.com', N'0', N'admin', N'2021-01-05 17:03:47.0000000', N'103', N'2022-01-14 01:04:05.0000000', N'1', N'0') +GO + +INSERT INTO [dbo].[system_dept] ([id], [name], [parent_id], [sort], [leader_user_id], [phone], [email], [status], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'101', N'深圳总公司', N'100', N'1', N'104', N'15888888888', N'ry@qq.com', N'0', N'admin', N'2021-01-05 17:03:47.0000000', N'1', N'2022-02-22 19:47:48.0000000', N'1', N'0') +GO + +INSERT INTO [dbo].[system_dept] ([id], [name], [parent_id], [sort], [leader_user_id], [phone], [email], [status], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'102', N'长沙分公司', N'100', N'2', NULL, N'15888888888', N'ry@qq.com', N'0', N'admin', N'2021-01-05 17:03:47.0000000', N'', N'2021-12-15 05:01:40.0000000', N'1', N'0') +GO + +INSERT INTO [dbo].[system_dept] ([id], [name], [parent_id], [sort], [leader_user_id], [phone], [email], [status], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'103', N'研发部门', N'101', N'1', N'104', N'15888888888', N'ry@qq.com', N'0', N'admin', N'2021-01-05 17:03:47.0000000', N'103', N'2022-01-14 01:04:14.0000000', N'1', N'0') +GO + +INSERT INTO [dbo].[system_dept] ([id], [name], [parent_id], [sort], [leader_user_id], [phone], [email], [status], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'104', N'市场部门', N'101', N'2', NULL, N'15888888888', N'ry@qq.com', N'0', N'admin', N'2021-01-05 17:03:47.0000000', N'', N'2021-12-15 05:01:38.0000000', N'1', N'0') +GO + +INSERT INTO [dbo].[system_dept] ([id], [name], [parent_id], [sort], [leader_user_id], [phone], [email], [status], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'105', N'测试部门', N'101', N'3', NULL, N'15888888888', N'ry@qq.com', N'0', N'admin', N'2021-01-05 17:03:47.0000000', N'', N'2021-12-15 05:01:37.0000000', N'1', N'0') +GO + +INSERT INTO [dbo].[system_dept] ([id], [name], [parent_id], [sort], [leader_user_id], [phone], [email], [status], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'106', N'财务部门', N'101', N'4', N'103', N'15888888888', N'ry@qq.com', N'0', N'admin', N'2021-01-05 17:03:47.0000000', N'103', N'2022-01-15 21:32:22.0000000', N'1', N'0') +GO + +INSERT INTO [dbo].[system_dept] ([id], [name], [parent_id], [sort], [leader_user_id], [phone], [email], [status], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'107', N'运维部门', N'101', N'5', NULL, N'15888888888', N'ry@qq.com', N'0', N'admin', N'2021-01-05 17:03:47.0000000', N'', N'2021-12-15 05:01:33.0000000', N'1', N'0') +GO + +INSERT INTO [dbo].[system_dept] ([id], [name], [parent_id], [sort], [leader_user_id], [phone], [email], [status], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'108', N'市场部门', N'102', N'1', NULL, N'15888888888', N'ry@qq.com', N'0', N'admin', N'2021-01-05 17:03:47.0000000', N'1', N'2022-02-16 08:35:45.0000000', N'1', N'0') +GO + +INSERT INTO [dbo].[system_dept] ([id], [name], [parent_id], [sort], [leader_user_id], [phone], [email], [status], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'109', N'财务部门', N'102', N'2', NULL, N'15888888888', N'ry@qq.com', N'0', N'admin', N'2021-01-05 17:03:47.0000000', N'', N'2021-12-15 05:01:29.0000000', N'1', N'0') +GO + +INSERT INTO [dbo].[system_dept] ([id], [name], [parent_id], [sort], [leader_user_id], [phone], [email], [status], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'110', N'新部门', N'0', N'1', NULL, NULL, NULL, N'0', N'110', N'2022-02-23 20:46:30.0000000', N'110', N'2022-02-23 20:46:30.0000000', N'121', N'0') +GO + +INSERT INTO [dbo].[system_dept] ([id], [name], [parent_id], [sort], [leader_user_id], [phone], [email], [status], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'111', N'顶级部门', N'0', N'1', NULL, NULL, NULL, N'0', N'113', N'2022-03-07 21:44:50.0000000', N'113', N'2022-03-07 21:44:50.0000000', N'122', N'0') +GO + +SET IDENTITY_INSERT [dbo].[system_dept] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for system_dict_data +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[system_dict_data]') AND type IN ('U')) + DROP TABLE [dbo].[system_dict_data] +GO + +CREATE TABLE [dbo].[system_dict_data] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [sort] int NOT NULL, + [label] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [value] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [dict_type] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [status] tinyint NOT NULL, + [color_type] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [css_class] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [remark] nvarchar(500) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL +) +GO + +ALTER TABLE [dbo].[system_dict_data] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'字典编码', +'SCHEMA', N'dbo', +'TABLE', N'system_dict_data', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'字典排序', +'SCHEMA', N'dbo', +'TABLE', N'system_dict_data', +'COLUMN', N'sort' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'字典标签', +'SCHEMA', N'dbo', +'TABLE', N'system_dict_data', +'COLUMN', N'label' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'字典键值', +'SCHEMA', N'dbo', +'TABLE', N'system_dict_data', +'COLUMN', N'value' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'字典类型', +'SCHEMA', N'dbo', +'TABLE', N'system_dict_data', +'COLUMN', N'dict_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'状态(0正常 1停用)', +'SCHEMA', N'dbo', +'TABLE', N'system_dict_data', +'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'颜色类型', +'SCHEMA', N'dbo', +'TABLE', N'system_dict_data', +'COLUMN', N'color_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'css 样式', +'SCHEMA', N'dbo', +'TABLE', N'system_dict_data', +'COLUMN', N'css_class' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'备注', +'SCHEMA', N'dbo', +'TABLE', N'system_dict_data', +'COLUMN', N'remark' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'system_dict_data', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'system_dict_data', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'system_dict_data', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'system_dict_data', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'system_dict_data', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'字典数据表', +'SCHEMA', N'dbo', +'TABLE', N'system_dict_data' +GO + + +-- ---------------------------- +-- Records of system_dict_data +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[system_dict_data] ON +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1', N'1', N'男', N'1', N'system_user_sex', N'0', N'default', N'A', N'性别男', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-03-29 00:14:39.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'2', N'2', N'女', N'2', N'system_user_sex', N'1', N'success', N'', N'性别女', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-02-16 01:30:51.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'8', N'1', N'正常', N'1', N'infra_job_status', N'0', N'success', N'', N'正常状态', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-02-16 19:33:38.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'9', N'2', N'暂停', N'2', N'infra_job_status', N'0', N'danger', N'', N'停用状态', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-02-16 19:33:45.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'12', N'1', N'系统内置', N'1', N'infra_config_type', N'0', N'danger', N'', N'参数类型 - 系统内置', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-02-16 19:06:02.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'13', N'2', N'自定义', N'2', N'infra_config_type', N'0', N'primary', N'', N'参数类型 - 自定义', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-02-16 19:06:07.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'14', N'1', N'通知', N'1', N'system_notice_type', N'0', N'success', N'', N'通知', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-02-16 13:05:57.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'15', N'2', N'公告', N'2', N'system_notice_type', N'0', N'info', N'', N'公告', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-02-16 13:06:01.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'16', N'0', N'其它', N'0', N'system_operate_type', N'0', N'default', N'', N'其它操作', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-02-16 09:32:46.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'17', N'1', N'查询', N'1', N'system_operate_type', N'0', N'info', N'', N'查询操作', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-02-16 09:33:16.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'18', N'2', N'新增', N'2', N'system_operate_type', N'0', N'primary', N'', N'新增操作', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-02-16 09:33:13.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'19', N'3', N'修改', N'3', N'system_operate_type', N'0', N'warning', N'', N'修改操作', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-02-16 09:33:22.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'20', N'4', N'删除', N'4', N'system_operate_type', N'0', N'danger', N'', N'删除操作', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-02-16 09:33:27.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'22', N'5', N'导出', N'5', N'system_operate_type', N'0', N'default', N'', N'导出操作', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-02-16 09:33:32.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'23', N'6', N'导入', N'6', N'system_operate_type', N'0', N'default', N'', N'导入操作', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-02-16 09:33:35.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'27', N'1', N'开启', N'0', N'common_status', N'0', N'primary', N'', N'开启状态', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-02-16 08:00:39.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'28', N'2', N'关闭', N'1', N'common_status', N'0', N'info', N'', N'关闭状态', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-02-16 08:00:44.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'29', N'1', N'目录', N'1', N'system_menu_type', N'0', N'', N'', N'目录', N'admin', N'2021-01-05 17:03:48.0000000', N'', N'2022-02-01 16:43:45.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'30', N'2', N'菜单', N'2', N'system_menu_type', N'0', N'', N'', N'菜单', N'admin', N'2021-01-05 17:03:48.0000000', N'', N'2022-02-01 16:43:41.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'31', N'3', N'按钮', N'3', N'system_menu_type', N'0', N'', N'', N'按钮', N'admin', N'2021-01-05 17:03:48.0000000', N'', N'2022-02-01 16:43:39.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'32', N'1', N'内置', N'1', N'system_role_type', N'0', N'danger', N'', N'内置角色', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-02-16 13:02:08.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'33', N'2', N'自定义', N'2', N'system_role_type', N'0', N'primary', N'', N'自定义角色', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-02-16 13:02:12.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'34', N'1', N'全部数据权限', N'1', N'system_data_scope', N'0', N'', N'', N'全部数据权限', N'admin', N'2021-01-05 17:03:48.0000000', N'', N'2022-02-01 16:47:17.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'35', N'2', N'指定部门数据权限', N'2', N'system_data_scope', N'0', N'', N'', N'指定部门数据权限', N'admin', N'2021-01-05 17:03:48.0000000', N'', N'2022-02-01 16:47:18.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'36', N'3', N'本部门数据权限', N'3', N'system_data_scope', N'0', N'', N'', N'本部门数据权限', N'admin', N'2021-01-05 17:03:48.0000000', N'', N'2022-02-01 16:47:16.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'37', N'4', N'本部门及以下数据权限', N'4', N'system_data_scope', N'0', N'', N'', N'本部门及以下数据权限', N'admin', N'2021-01-05 17:03:48.0000000', N'', N'2022-02-01 16:47:21.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'38', N'5', N'仅本人数据权限', N'5', N'system_data_scope', N'0', N'', N'', N'仅本人数据权限', N'admin', N'2021-01-05 17:03:48.0000000', N'', N'2022-02-01 16:47:23.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'39', N'0', N'成功', N'0', N'system_login_result', N'0', N'success', N'', N'登陆结果 - 成功', N'', N'2021-01-18 06:17:36.0000000', N'1', N'2022-02-16 13:23:49.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'40', N'10', N'账号或密码不正确', N'10', N'system_login_result', N'0', N'primary', N'', N'登陆结果 - 账号或密码不正确', N'', N'2021-01-18 06:17:54.0000000', N'1', N'2022-02-16 13:24:27.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'41', N'20', N'用户被禁用', N'20', N'system_login_result', N'0', N'warning', N'', N'登陆结果 - 用户被禁用', N'', N'2021-01-18 06:17:54.0000000', N'1', N'2022-02-16 13:23:57.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'42', N'30', N'验证码不存在', N'30', N'system_login_result', N'0', N'info', N'', N'登陆结果 - 验证码不存在', N'', N'2021-01-18 06:17:54.0000000', N'1', N'2022-02-16 13:24:07.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'43', N'31', N'验证码不正确', N'31', N'system_login_result', N'0', N'info', N'', N'登陆结果 - 验证码不正确', N'', N'2021-01-18 06:17:54.0000000', N'1', N'2022-02-16 13:24:11.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'44', N'100', N'未知异常', N'100', N'system_login_result', N'0', N'danger', N'', N'登陆结果 - 未知异常', N'', N'2021-01-18 06:17:54.0000000', N'1', N'2022-02-16 13:24:23.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'45', N'1', N'是', N'true', N'infra_boolean_string', N'0', N'danger', N'', N'Boolean 是否类型 - 是', N'', N'2021-01-19 03:20:55.0000000', N'1', N'2022-03-15 23:01:45.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'46', N'1', N'否', N'false', N'infra_boolean_string', N'0', N'info', N'', N'Boolean 是否类型 - 否', N'', N'2021-01-19 03:20:55.0000000', N'1', N'2022-03-15 23:09:45.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'47', N'1', N'永不超时', N'1', N'infra_redis_timeout_type', N'0', N'primary', N'', N'Redis 未设置超时的情况', N'', N'2021-01-26 00:53:17.0000000', N'1', N'2022-02-16 19:03:35.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'48', N'1', N'动态超时', N'2', N'infra_redis_timeout_type', N'0', N'info', N'', N'程序里动态传入超时时间,无法固定', N'', N'2021-01-26 00:55:00.0000000', N'1', N'2022-02-16 19:03:41.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'49', N'3', N'固定超时', N'3', N'infra_redis_timeout_type', N'0', N'success', N'', N'Redis 设置了过期时间', N'', N'2021-01-26 00:55:26.0000000', N'1', N'2022-02-16 19:03:45.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'50', N'1', N'单表(增删改查)', N'1', N'infra_codegen_template_type', N'0', N'', N'', NULL, N'', N'2021-02-05 07:09:06.0000000', N'', N'2022-03-10 16:33:15.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'51', N'2', N'树表(增删改查)', N'2', N'infra_codegen_template_type', N'0', N'', N'', NULL, N'', N'2021-02-05 07:14:46.0000000', N'', N'2022-03-10 16:33:19.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'53', N'0', N'初始化中', N'0', N'infra_job_status', N'0', N'primary', N'', NULL, N'', N'2021-02-07 07:46:49.0000000', N'1', N'2022-02-16 19:33:29.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'57', N'0', N'运行中', N'0', N'infra_job_log_status', N'0', N'primary', N'', N'RUNNING', N'', N'2021-02-08 10:04:24.0000000', N'1', N'2022-02-16 19:07:48.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'58', N'1', N'成功', N'1', N'infra_job_log_status', N'0', N'success', N'', NULL, N'', N'2021-02-08 10:06:57.0000000', N'1', N'2022-02-16 19:07:52.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'59', N'2', N'失败', N'2', N'infra_job_log_status', N'0', N'warning', N'', N'失败', N'', N'2021-02-08 10:07:38.0000000', N'1', N'2022-02-16 19:07:56.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'60', N'1', N'会员', N'1', N'user_type', N'0', N'primary', N'', NULL, N'', N'2021-02-26 00:16:27.0000000', N'1', N'2022-02-16 10:22:19.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'61', N'2', N'管理员', N'2', N'user_type', N'0', N'success', N'', NULL, N'', N'2021-02-26 00:16:34.0000000', N'1', N'2022-02-16 10:22:22.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'62', N'0', N'未处理', N'0', N'infra_api_error_log_process_status', N'0', N'primary', N'', NULL, N'', N'2021-02-26 07:07:19.0000000', N'1', N'2022-02-16 20:14:17.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'63', N'1', N'已处理', N'1', N'infra_api_error_log_process_status', N'0', N'success', N'', NULL, N'', N'2021-02-26 07:07:26.0000000', N'1', N'2022-02-16 20:14:08.0000000', N'0') +GO + + + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'66', N'2', N'阿里云', N'ALIYUN', N'system_sms_channel_code', N'0', N'primary', N'', NULL, N'1', N'2021-04-05 01:05:26.0000000', N'1', N'2022-02-16 10:09:52.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'67', N'1', N'验证码', N'1', N'system_sms_template_type', N'0', N'warning', N'', NULL, N'1', N'2021-04-05 21:50:57.0000000', N'1', N'2022-02-16 12:48:30.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'68', N'2', N'通知', N'2', N'system_sms_template_type', N'0', N'primary', N'', NULL, N'1', N'2021-04-05 21:51:08.0000000', N'1', N'2022-02-16 12:48:27.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'69', N'0', N'营销', N'3', N'system_sms_template_type', N'0', N'danger', N'', NULL, N'1', N'2021-04-05 21:51:15.0000000', N'1', N'2022-02-16 12:48:22.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'70', N'0', N'初始化', N'0', N'system_sms_send_status', N'0', N'primary', N'', NULL, N'1', N'2021-04-11 20:18:33.0000000', N'1', N'2022-02-16 10:26:07.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'71', N'1', N'发送成功', N'10', N'system_sms_send_status', N'0', N'success', N'', NULL, N'1', N'2021-04-11 20:18:43.0000000', N'1', N'2022-02-16 10:25:56.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'72', N'2', N'发送失败', N'20', N'system_sms_send_status', N'0', N'danger', N'', NULL, N'1', N'2021-04-11 20:18:49.0000000', N'1', N'2022-02-16 10:26:03.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'73', N'3', N'不发送', N'30', N'system_sms_send_status', N'0', N'info', N'', NULL, N'1', N'2021-04-11 20:19:44.0000000', N'1', N'2022-02-16 10:26:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'74', N'0', N'等待结果', N'0', N'system_sms_receive_status', N'0', N'primary', N'', NULL, N'1', N'2021-04-11 20:27:43.0000000', N'1', N'2022-02-16 10:28:24.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'75', N'1', N'接收成功', N'10', N'system_sms_receive_status', N'0', N'success', N'', NULL, N'1', N'2021-04-11 20:29:25.0000000', N'1', N'2022-02-16 10:28:28.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'76', N'2', N'接收失败', N'20', N'system_sms_receive_status', N'0', N'danger', N'', NULL, N'1', N'2021-04-11 20:29:31.0000000', N'1', N'2022-02-16 10:28:32.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'77', N'0', N'调试(钉钉)', N'DEBUG_DING_TALK', N'system_sms_channel_code', N'0', N'info', N'', NULL, N'1', N'2021-04-13 00:20:37.0000000', N'1', N'2022-02-16 10:10:00.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'78', N'1', N'自动生成', N'1', N'system_error_code_type', N'0', N'warning', N'', NULL, N'1', N'2021-04-21 00:06:48.0000000', N'1', N'2022-02-16 13:57:20.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'79', N'2', N'手动编辑', N'2', N'system_error_code_type', N'0', N'primary', N'', NULL, N'1', N'2021-04-21 00:07:14.0000000', N'1', N'2022-02-16 13:57:24.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'80', N'100', N'账号登录', N'100', N'system_login_type', N'0', N'primary', N'', N'账号登录', N'1', N'2021-10-06 00:52:02.0000000', N'1', N'2022-02-16 13:11:34.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'81', N'101', N'社交登录', N'101', N'system_login_type', N'0', N'info', N'', N'社交登录', N'1', N'2021-10-06 00:52:17.0000000', N'1', N'2022-02-16 13:11:40.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'83', N'200', N'主动登出', N'200', N'system_login_type', N'0', N'primary', N'', N'主动登出', N'1', N'2021-10-06 00:52:58.0000000', N'1', N'2022-02-16 13:11:49.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'85', N'202', N'强制登出', N'202', N'system_login_type', N'0', N'danger', N'', N'强制退出', N'1', N'2021-10-06 00:53:41.0000000', N'1', N'2022-02-16 13:11:57.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'86', N'0', N'病假', N'1', N'bpm_oa_leave_type', N'0', N'primary', N'', NULL, N'1', N'2021-09-21 22:35:28.0000000', N'1', N'2022-02-16 10:00:41.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'87', N'1', N'事假', N'2', N'bpm_oa_leave_type', N'0', N'info', N'', NULL, N'1', N'2021-09-21 22:36:11.0000000', N'1', N'2022-02-16 10:00:49.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'88', N'2', N'婚假', N'3', N'bpm_oa_leave_type', N'0', N'warning', N'', NULL, N'1', N'2021-09-21 22:36:38.0000000', N'1', N'2022-02-16 10:00:53.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'98', N'1', N'v2', N'v2', N'pay_channel_wechat_version', N'0', N'', N'', N'v2版本', N'1', N'2021-11-08 17:00:58.0000000', N'1', N'2021-11-08 17:00:58.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'99', N'2', N'v3', N'v3', N'pay_channel_wechat_version', N'0', N'', N'', N'v3版本', N'1', N'2021-11-08 17:01:07.0000000', N'1', N'2021-11-08 17:01:07.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'108', N'1', N'RSA2', N'RSA2', N'pay_channel_alipay_sign_type', N'0', N'', N'', N'RSA2', N'1', N'2021-11-18 15:39:29.0000000', N'1', N'2021-11-18 15:39:29.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'109', N'1', N'公钥模式', N'1', N'pay_channel_alipay_mode', N'0', N'', N'', N'公钥模式:privateKey + alipayPublicKey', N'1', N'2021-11-18 15:45:23.0000000', N'1', N'2021-11-18 15:45:23.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'110', N'2', N'证书模式', N'2', N'pay_channel_alipay_mode', N'0', N'', N'', N'证书模式:appCertContent + alipayPublicCertContent + rootCertContent', N'1', N'2021-11-18 15:45:40.0000000', N'1', N'2021-11-18 15:45:40.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'111', N'1', N'线上', N'https://openapi.alipay.com/gateway.do', N'pay_channel_alipay_server_type', N'0', N'', N'', N'网关地址 - 线上', N'1', N'2021-11-18 16:59:32.0000000', N'1', N'2021-11-21 17:37:29.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'112', N'2', N'沙箱', N'https://openapi.alipaydev.com/gateway.do', N'pay_channel_alipay_server_type', N'0', N'', N'', N'网关地址 - 沙箱', N'1', N'2021-11-18 16:59:48.0000000', N'1', N'2021-11-21 17:37:39.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'113', N'1', N'微信 JSAPI 支付', N'wx_pub', N'pay_channel_code_type', N'0', N'', N'', N'微信 JSAPI(公众号) 支付', N'1', N'2021-12-03 10:40:24.0000000', N'1', N'2021-12-04 16:41:00.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'114', N'2', N'微信小程序支付', N'wx_lite', N'pay_channel_code_type', N'0', N'', N'', N'微信小程序支付', N'1', N'2021-12-03 10:41:06.0000000', N'1', N'2021-12-03 10:41:06.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'115', N'3', N'微信 App 支付', N'wx_app', N'pay_channel_code_type', N'0', N'', N'', N'微信 App 支付', N'1', N'2021-12-03 10:41:20.0000000', N'1', N'2021-12-03 10:41:20.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'116', N'4', N'支付宝 PC 网站支付', N'alipay_pc', N'pay_channel_code_type', N'0', N'', N'', N'支付宝 PC 网站支付', N'1', N'2021-12-03 10:42:09.0000000', N'1', N'2021-12-03 10:42:09.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'117', N'5', N'支付宝 Wap 网站支付', N'alipay_wap', N'pay_channel_code_type', N'0', N'', N'', N'支付宝 Wap 网站支付', N'1', N'2021-12-03 10:42:26.0000000', N'1', N'2021-12-03 10:42:26.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'118', N'6', N'支付宝App 支付', N'alipay_app', N'pay_channel_code_type', N'0', N'', N'', N'支付宝App 支付', N'1', N'2021-12-03 10:42:55.0000000', N'1', N'2021-12-03 10:42:55.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'119', N'7', N'支付宝扫码支付', N'alipay_qr', N'pay_channel_code_type', N'0', N'', N'', N'支付宝扫码支付', N'1', N'2021-12-03 10:43:10.0000000', N'1', N'2021-12-03 10:43:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'120', N'1', N'通知成功', N'10', N'pay_order_notify_status', N'0', N'success', N'', N'通知成功', N'1', N'2021-12-03 11:02:41.0000000', N'1', N'2022-02-16 13:59:13.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'121', N'2', N'通知失败', N'20', N'pay_order_notify_status', N'0', N'danger', N'', N'通知失败', N'1', N'2021-12-03 11:02:59.0000000', N'1', N'2022-02-16 13:59:17.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'122', N'3', N'未通知', N'0', N'pay_order_notify_status', N'0', N'info', N'', N'未通知', N'1', N'2021-12-03 11:03:10.0000000', N'1', N'2022-02-16 13:59:23.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'123', N'1', N'支付成功', N'10', N'pay_order_status', N'0', N'success', N'', N'支付成功', N'1', N'2021-12-03 11:18:29.0000000', N'1', N'2022-02-16 15:24:25.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'124', N'2', N'支付关闭', N'20', N'pay_order_status', N'0', N'danger', N'', N'支付关闭', N'1', N'2021-12-03 11:18:42.0000000', N'1', N'2022-02-16 15:24:31.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'125', N'3', N'未支付', N'0', N'pay_order_status', N'0', N'info', N'', N'未支付', N'1', N'2021-12-03 11:18:18.0000000', N'1', N'2022-02-16 15:24:35.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'126', N'1', N'未退款', N'0', N'pay_order_refund_status', N'0', N'', N'', N'未退款', N'1', N'2021-12-03 11:30:35.0000000', N'1', N'2021-12-03 11:34:05.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'127', N'2', N'部分退款', N'10', N'pay_order_refund_status', N'0', N'', N'', N'部分退款', N'1', N'2021-12-03 11:30:44.0000000', N'1', N'2021-12-03 11:34:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'128', N'3', N'全部退款', N'20', N'pay_order_refund_status', N'0', N'', N'', N'全部退款', N'1', N'2021-12-03 11:30:52.0000000', N'1', N'2021-12-03 11:34:14.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1117', N'1', N'退款订单生成', N'0', N'pay_refund_order_status', N'0', N'primary', N'', N'退款订单生成', N'1', N'2021-12-10 16:44:44.0000000', N'1', N'2022-02-16 14:05:24.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1118', N'2', N'退款成功', N'1', N'pay_refund_order_status', N'0', N'success', N'', N'退款成功', N'1', N'2021-12-10 16:44:59.0000000', N'1', N'2022-02-16 14:05:28.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1119', N'3', N'退款失败', N'2', N'pay_refund_order_status', N'0', N'danger', N'', N'退款失败', N'1', N'2021-12-10 16:45:10.0000000', N'1', N'2022-02-16 14:05:34.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1124', N'8', N'退款关闭', N'99', N'pay_refund_order_status', N'0', N'info', N'', N'退款关闭', N'1', N'2021-12-10 16:46:26.0000000', N'1', N'2022-02-16 14:05:40.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1125', N'0', N'默认', N'1', N'bpm_model_category', N'0', N'primary', N'', N'流程分类 - 默认', N'1', N'2022-01-02 08:41:11.0000000', N'1', N'2022-02-16 20:01:42.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1126', N'0', N'OA', N'2', N'bpm_model_category', N'0', N'success', N'', N'流程分类 - OA', N'1', N'2022-01-02 08:41:22.0000000', N'1', N'2022-02-16 20:01:50.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1127', N'0', N'进行中', N'1', N'bpm_process_instance_status', N'0', N'primary', N'', N'流程实例的状态 - 进行中', N'1', N'2022-01-07 23:47:22.0000000', N'1', N'2022-02-16 20:07:49.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1128', N'2', N'已完成', N'2', N'bpm_process_instance_status', N'0', N'success', N'', N'流程实例的状态 - 已完成', N'1', N'2022-01-07 23:47:49.0000000', N'1', N'2022-02-16 20:07:54.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1129', N'1', N'处理中', N'1', N'bpm_process_instance_result', N'0', N'primary', N'', N'流程实例的结果 - 处理中', N'1', N'2022-01-07 23:48:32.0000000', N'1', N'2022-02-16 09:53:26.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1130', N'2', N'通过', N'2', N'bpm_process_instance_result', N'0', N'success', N'', N'流程实例的结果 - 通过', N'1', N'2022-01-07 23:48:45.0000000', N'1', N'2022-02-16 09:53:31.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1131', N'3', N'不通过', N'3', N'bpm_process_instance_result', N'0', N'danger', N'', N'流程实例的结果 - 不通过', N'1', N'2022-01-07 23:48:55.0000000', N'1', N'2022-02-16 09:53:38.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1132', N'4', N'已取消', N'4', N'bpm_process_instance_result', N'0', N'info', N'', N'流程实例的结果 - 撤销', N'1', N'2022-01-07 23:49:06.0000000', N'1', N'2022-02-16 09:53:42.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1133', N'10', N'流程表单', N'10', N'bpm_model_form_type', N'0', N'', N'', N'流程的表单类型 - 流程表单', N'103', N'2022-01-11 23:51:30.0000000', N'103', N'2022-01-11 23:51:30.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1134', N'20', N'业务表单', N'20', N'bpm_model_form_type', N'0', N'', N'', N'流程的表单类型 - 业务表单', N'103', N'2022-01-11 23:51:47.0000000', N'103', N'2022-01-11 23:51:47.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1135', N'10', N'角色', N'10', N'bpm_task_assign_rule_type', N'0', N'info', N'', N'任务分配规则的类型 - 角色', N'103', N'2022-01-12 23:21:22.0000000', N'1', N'2022-02-16 20:06:14.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1136', N'20', N'部门的成员', N'20', N'bpm_task_assign_rule_type', N'0', N'primary', N'', N'任务分配规则的类型 - 部门的成员', N'103', N'2022-01-12 23:21:47.0000000', N'1', N'2022-02-16 20:05:28.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1137', N'21', N'部门的负责人', N'21', N'bpm_task_assign_rule_type', N'0', N'primary', N'', N'任务分配规则的类型 - 部门的负责人', N'103', N'2022-01-12 23:33:36.0000000', N'1', N'2022-02-16 20:05:31.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1138', N'30', N'用户', N'30', N'bpm_task_assign_rule_type', N'0', N'info', N'', N'任务分配规则的类型 - 用户', N'103', N'2022-01-12 23:34:02.0000000', N'1', N'2022-02-16 20:05:50.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1139', N'40', N'用户组', N'40', N'bpm_task_assign_rule_type', N'0', N'warning', N'', N'任务分配规则的类型 - 用户组', N'103', N'2022-01-12 23:34:21.0000000', N'1', N'2022-02-16 20:05:57.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1140', N'50', N'自定义脚本', N'50', N'bpm_task_assign_rule_type', N'0', N'danger', N'', N'任务分配规则的类型 - 自定义脚本', N'103', N'2022-01-12 23:34:43.0000000', N'1', N'2022-02-16 20:06:01.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1141', N'22', N'岗位', N'22', N'bpm_task_assign_rule_type', N'0', N'success', N'', N'任务分配规则的类型 - 岗位', N'103', N'2022-01-14 18:41:55.0000000', N'1', N'2022-02-16 20:05:39.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1142', N'10', N'流程发起人', N'10', N'bpm_task_assign_script', N'0', N'', N'', N'任务分配自定义脚本 - 流程发起人', N'103', N'2022-01-15 00:10:57.0000000', N'103', N'2022-01-15 21:24:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1143', N'20', N'流程发起人的一级领导', N'20', N'bpm_task_assign_script', N'0', N'', N'', N'任务分配自定义脚本 - 流程发起人的一级领导', N'103', N'2022-01-15 21:24:31.0000000', N'103', N'2022-01-15 21:24:31.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1144', N'21', N'流程发起人的二级领导', N'21', N'bpm_task_assign_script', N'0', N'', N'', N'任务分配自定义脚本 - 流程发起人的二级领导', N'103', N'2022-01-15 21:24:46.0000000', N'103', N'2022-01-15 21:24:57.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1145', N'1', N'管理后台', N'1', N'infra_codegen_scene', N'0', N'', N'', N'代码生成的场景枚举 - 管理后台', N'1', N'2022-02-02 13:15:06.0000000', N'1', N'2022-03-10 16:32:59.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1146', N'2', N'用户 APP', N'2', N'infra_codegen_scene', N'0', N'', N'', N'代码生成的场景枚举 - 用户 APP', N'1', N'2022-02-02 13:15:19.0000000', N'1', N'2022-03-10 16:33:03.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1147', N'0', N'未退款', N'0', N'pay_refund_order_type', N'0', N'info', N'', N'退款类型 - 未退款', N'1', N'2022-02-16 14:09:01.0000000', N'1', N'2022-02-16 14:09:01.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1148', N'10', N'部分退款', N'10', N'pay_refund_order_type', N'0', N'success', N'', N'退款类型 - 部分退款', N'1', N'2022-02-16 14:09:25.0000000', N'1', N'2022-02-16 14:11:38.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1149', N'20', N'全部退款', N'20', N'pay_refund_order_type', N'0', N'warning', N'', N'退款类型 - 全部退款', N'1', N'2022-02-16 14:11:33.0000000', N'1', N'2022-02-16 14:11:33.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1150', N'1', N'数据库', N'1', N'infra_file_storage', N'0', N'default', N'', NULL, N'1', N'2022-03-15 00:25:28.0000000', N'1', N'2022-03-15 00:25:28.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1151', N'10', N'本地磁盘', N'10', N'infra_file_storage', N'0', N'default', N'', NULL, N'1', N'2022-03-15 00:25:41.0000000', N'1', N'2022-03-15 00:25:56.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1152', N'11', N'FTP 服务器', N'11', N'infra_file_storage', N'0', N'default', N'', NULL, N'1', N'2022-03-15 00:26:06.0000000', N'1', N'2022-03-15 00:26:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1153', N'12', N'SFTP 服务器', N'12', N'infra_file_storage', N'0', N'default', N'', NULL, N'1', N'2022-03-15 00:26:22.0000000', N'1', N'2022-03-15 00:26:22.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1154', N'20', N'S3 对象存储', N'20', N'infra_file_storage', N'0', N'default', N'', NULL, N'1', N'2022-03-15 00:26:31.0000000', N'1', N'2022-03-15 00:26:45.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1155', N'103', N'短信登录', N'103', N'system_login_type', N'0', N'default', N'', NULL, N'1', N'2022-05-09 23:57:58.0000000', N'1', N'2022-05-09 23:58:09.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1156', N'1', N'password', N'password', N'system_oauth2_grant_type', N'0', N'default', N'', N'密码模式', N'1', N'2022-05-12 00:22:05.0000000', N'1', N'2022-05-11 16:26:01.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1157', N'2', N'authorization_code', N'authorization_code', N'system_oauth2_grant_type', N'0', N'primary', N'', N'授权码模式', N'1', N'2022-05-12 00:22:59.0000000', N'1', N'2022-05-11 16:26:02.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1158', N'3', N'implicit', N'implicit', N'system_oauth2_grant_type', N'0', N'success', N'', N'简化模式', N'1', N'2022-05-12 00:23:40.0000000', N'1', N'2022-05-11 16:26:05.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1159', N'4', N'client_credentials', N'client_credentials', N'system_oauth2_grant_type', N'0', N'default', N'', N'客户端模式', N'1', N'2022-05-12 00:23:51.0000000', N'1', N'2022-05-11 16:26:08.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_data] ([id], [sort], [label], [value], [dict_type], [status], [color_type], [css_class], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1160', N'5', N'refresh_token', N'refresh_token', N'system_oauth2_grant_type', N'0', N'info', N'', N'刷新模式', N'1', N'2022-05-12 00:24:02.0000000', N'1', N'2022-05-11 16:26:11.0000000', N'0') +GO + +SET IDENTITY_INSERT [dbo].[system_dict_data] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for system_dict_type +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[system_dict_type]') AND type IN ('U')) + DROP TABLE [dbo].[system_dict_type] +GO + +CREATE TABLE [dbo].[system_dict_type] +( + [id] + bigint + IDENTITY +( + 1, + 1 +) NOT NULL, + [name] nvarchar +( + 100 +) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [type] nvarchar +( + 100 +) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [status] tinyint NOT NULL, + [remark] nvarchar +( + 500 +) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [creator] nvarchar +( + 64 +) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2 +( + 7 +) NOT NULL, + [updater] nvarchar +( + 64 +) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2 +( + 7 +) NOT NULL, + [deleted_time] datetime2 +( + 7 +), + [deleted] bit DEFAULT 0 NOT NULL + ) +GO + +ALTER TABLE [dbo].[system_dict_type] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'字典主键', +'SCHEMA', N'dbo', +'TABLE', N'system_dict_type', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'字典名称', +'SCHEMA', N'dbo', +'TABLE', N'system_dict_type', +'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'字典类型', +'SCHEMA', N'dbo', +'TABLE', N'system_dict_type', +'COLUMN', N'type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'状态(0正常 1停用)', +'SCHEMA', N'dbo', +'TABLE', N'system_dict_type', +'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'备注', +'SCHEMA', N'dbo', +'TABLE', N'system_dict_type', +'COLUMN', N'remark' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'system_dict_type', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'system_dict_type', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', + 'TABLE', N'system_dict_type', + 'COLUMN', N'updater' + GO + EXEC sp_addextendedproperty + 'MS_Description', N'更新时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_dict_type', + 'COLUMN', N'update_time' + GO + EXEC sp_addextendedproperty + 'MS_Description', N'删除时间', + 'SCHEMA', N'dbo', + 'TABLE', N'system_dict_type', + 'COLUMN', N'deleted_time' + GO + EXEC sp_addextendedproperty + 'MS_Description', N'是否删除', + 'SCHEMA', N'dbo', + 'TABLE', N'system_dict_type', + 'COLUMN', N'deleted' + GO + EXEC sp_addextendedproperty + 'MS_Description', N'字典类型表', +'SCHEMA', N'dbo', +'TABLE', N'system_dict_type' +GO + + +-- ---------------------------- +-- Records of system_dict_type +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[system_dict_type] ON +GO + +INSERT INTO [dbo].[system_dict_type] ([id], [name], [type], [status], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1', N'用户性别', N'system_user_sex', N'0', NULL, N'admin', N'2021-01-05 17:03:48.0000000', N'', N'2022-02-01 16:30:31.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_type] ([id], [name], [type], [status], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'6', N'参数类型', N'infra_config_type', N'0', NULL, N'admin', N'2021-01-05 17:03:48.0000000', N'', N'2022-02-01 16:36:54.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_type] ([id], [name], [type], [status], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'7', N'通知类型', N'system_notice_type', N'0', NULL, N'admin', N'2021-01-05 17:03:48.0000000', N'', N'2022-02-01 16:35:26.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_type] ([id], [name], [type], [status], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'9', N'操作类型', N'system_operate_type', N'0', NULL, N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-02-16 09:32:21.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_type] ([id], [name], [type], [status], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'10', N'系统状态', N'common_status', N'0', NULL, N'admin', N'2021-01-05 17:03:48.0000000', N'', N'2022-02-01 16:21:28.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_type] ([id], [name], [type], [status], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'11', N'Boolean 是否类型', N'infra_boolean_string', N'0', N'boolean 转是否', N'', N'2021-01-19 03:20:08.0000000', N'', N'2022-02-01 16:37:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_type] ([id], [name], [type], [status], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'104', N'登陆结果', N'system_login_result', N'0', N'登陆结果', N'', N'2021-01-18 06:17:11.0000000', N'', N'2022-02-01 16:36:00.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_type] ([id], [name], [type], [status], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'105', N'Redis 超时类型', N'infra_redis_timeout_type', N'0', N'RedisKeyDefine.TimeoutTypeEnum', N'', N'2021-01-26 00:52:50.0000000', N'', N'2022-02-01 16:50:29.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_type] ([id], [name], [type], [status], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'106', N'代码生成模板类型', N'infra_codegen_template_type', N'0', NULL, N'', N'2021-02-05 07:08:06.0000000', N'', N'2022-03-10 16:33:42.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_type] ([id], [name], [type], [status], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'107', N'定时任务状态', N'infra_job_status', N'0', NULL, N'', N'2021-02-07 07:44:16.0000000', N'', N'2022-02-01 16:51:11.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_type] ([id], [name], [type], [status], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'108', N'定时任务日志状态', N'infra_job_log_status', N'0', NULL, N'', N'2021-02-08 10:03:51.0000000', N'', N'2022-02-01 16:50:43.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_type] ([id], [name], [type], [status], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'109', N'用户类型', N'user_type', N'0', NULL, N'', N'2021-02-26 00:15:51.0000000', N'', N'2021-02-26 00:15:51.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_type] ([id], [name], [type], [status], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'110', N'API 异常数据的处理状态', N'infra_api_error_log_process_status', N'0', NULL, N'', N'2021-02-26 07:07:01.0000000', N'', N'2022-02-01 16:50:53.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_type] ([id], [name], [type], [status], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'111', N'短信渠道编码', N'system_sms_channel_code', N'0', NULL, N'1', N'2021-04-05 01:04:50.0000000', N'1', N'2022-02-16 02:09:08.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_type] ([id], [name], [type], [status], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'112', N'短信模板的类型', N'system_sms_template_type', N'0', NULL, N'1', N'2021-04-05 21:50:43.0000000', N'1', N'2022-02-01 16:35:06.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_type] ([id], [name], [type], [status], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'113', N'短信发送状态', N'system_sms_send_status', N'0', NULL, N'1', N'2021-04-11 20:18:03.0000000', N'1', N'2022-02-01 16:35:09.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_type] ([id], [name], [type], [status], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'114', N'短信接收状态', N'system_sms_receive_status', N'0', NULL, N'1', N'2021-04-11 20:27:14.0000000', N'1', N'2022-02-01 16:35:14.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_type] ([id], [name], [type], [status], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'115', N'错误码的类型', N'system_error_code_type', N'0', NULL, N'1', N'2021-04-21 00:06:30.0000000', N'1', N'2022-02-01 16:36:49.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_type] ([id], [name], [type], [status], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'116', N'登陆日志的类型', N'system_login_type', N'0', N'登陆日志的类型', N'1', N'2021-10-06 00:50:46.0000000', N'1', N'2022-02-01 16:35:56.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_type] ([id], [name], [type], [status], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'117', N'OA 请假类型', N'bpm_oa_leave_type', N'0', NULL, N'1', N'2021-09-21 22:34:33.0000000', N'1', N'2022-01-22 10:41:37.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_type] ([id], [name], [type], [status], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'122', N'支付渠道微信版本', N'pay_channel_wechat_version', N'0', N'支付渠道微信版本', N'1', N'2021-11-08 17:00:26.0000000', N'1', N'2021-11-08 17:00:26.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_type] ([id], [name], [type], [status], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'127', N'支付渠道支付宝算法类型', N'pay_channel_alipay_sign_type', N'0', N'支付渠道支付宝算法类型', N'1', N'2021-11-18 15:39:09.0000000', N'1', N'2021-11-18 15:39:09.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_type] ([id], [name], [type], [status], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'128', N'支付渠道支付宝公钥类型', N'pay_channel_alipay_mode', N'0', N'支付渠道支付宝公钥类型', N'1', N'2021-11-18 15:44:28.0000000', N'1', N'2021-11-18 15:44:28.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_type] ([id], [name], [type], [status], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'129', N'支付宝网关地址', N'pay_channel_alipay_server_type', N'0', N'支付宝网关地址', N'1', N'2021-11-18 16:58:55.0000000', N'1', N'2021-11-18 17:01:34.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_type] ([id], [name], [type], [status], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'130', N'支付渠道编码类型', N'pay_channel_code_type', N'0', N'支付渠道的编码', N'1', N'2021-12-03 10:35:08.0000000', N'1', N'2021-12-03 10:35:08.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_type] ([id], [name], [type], [status], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'131', N'支付订单回调状态', N'pay_order_notify_status', N'0', N'支付订单回调状态', N'1', N'2021-12-03 10:53:29.0000000', N'1', N'2021-12-03 10:53:29.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_type] ([id], [name], [type], [status], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'132', N'支付订单状态', N'pay_order_status', N'0', N'支付订单状态', N'1', N'2021-12-03 11:17:50.0000000', N'1', N'2021-12-03 11:17:50.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_type] ([id], [name], [type], [status], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'133', N'支付订单退款状态', N'pay_order_refund_status', N'0', N'支付订单退款状态', N'1', N'2021-12-03 11:27:31.0000000', N'1', N'2021-12-03 11:27:31.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_type] ([id], [name], [type], [status], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'134', N'退款订单状态', N'pay_refund_order_status', N'0', N'退款订单状态', N'1', N'2021-12-10 16:42:50.0000000', N'1', N'2021-12-10 16:42:50.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_type] ([id], [name], [type], [status], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'135', N'退款订单类别', N'pay_refund_order_type', N'0', N'退款订单类别', N'1', N'2021-12-10 17:14:53.0000000', N'1', N'2021-12-10 17:14:53.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_type] ([id], [name], [type], [status], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'138', N'流程分类', N'bpm_model_category', N'0', N'流程分类', N'1', N'2022-01-02 08:40:45.0000000', N'1', N'2022-01-02 08:40:45.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_type] ([id], [name], [type], [status], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'139', N'流程实例的状态', N'bpm_process_instance_status', N'0', N'流程实例的状态', N'1', N'2022-01-07 23:46:42.0000000', N'1', N'2022-01-07 23:46:42.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_type] ([id], [name], [type], [status], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'140', N'流程实例的结果', N'bpm_process_instance_result', N'0', N'流程实例的结果', N'1', N'2022-01-07 23:48:10.0000000', N'1', N'2022-01-07 23:48:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_type] ([id], [name], [type], [status], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'141', N'流程的表单类型', N'bpm_model_form_type', N'0', N'流程的表单类型', N'103', N'2022-01-11 23:50:45.0000000', N'103', N'2022-01-11 23:50:45.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_type] ([id], [name], [type], [status], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'142', N'任务分配规则的类型', N'bpm_task_assign_rule_type', N'0', N'任务分配规则的类型', N'103', N'2022-01-12 23:21:04.0000000', N'103', N'2022-01-12 15:46:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_type] ([id], [name], [type], [status], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'143', N'任务分配自定义脚本', N'bpm_task_assign_script', N'0', N'任务分配自定义脚本', N'103', N'2022-01-15 00:10:35.0000000', N'103', N'2022-01-15 00:10:35.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_type] ([id], [name], [type], [status], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'144', N'代码生成的场景枚举', N'infra_codegen_scene', N'0', N'代码生成的场景枚举', N'1', N'2022-02-02 13:14:45.0000000', N'1', N'2022-03-10 16:33:46.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_type] ([id], [name], [type], [status], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'145', N'角色类型', N'system_role_type', N'0', N'角色类型', N'1', N'2022-02-16 13:01:46.0000000', N'1', N'2022-02-16 13:01:46.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_type] ([id], [name], [type], [status], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'146', N'文件存储器', N'infra_file_storage', N'0', N'文件存储器', N'1', N'2022-03-15 00:24:38.0000000', N'1', N'2022-03-15 00:24:38.0000000', N'0') +GO + +INSERT INTO [dbo].[system_dict_type] ([id], [name], [type], [status], [remark], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'147', N'OAuth 2.0 授权类型', N'system_oauth2_grant_type', N'0', N'OAuth 2.0 授权类型(模式)', N'1', N'2022-05-12 00:20:52.0000000', N'1', N'2022-05-11 16:25:49.0000000', N'0') +GO + +SET IDENTITY_INSERT [dbo].[system_dict_type] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for system_error_code +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[system_error_code]') AND type IN ('U')) + DROP TABLE [dbo].[system_error_code] +GO + +CREATE TABLE [dbo].[system_error_code] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [type] tinyint NOT NULL, + [application_name] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [code] int NOT NULL, + [message] nvarchar(512) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [memo] nvarchar(512) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL +) +GO + +ALTER TABLE [dbo].[system_error_code] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'错误码编号', +'SCHEMA', N'dbo', +'TABLE', N'system_error_code', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'错误码类型', +'SCHEMA', N'dbo', +'TABLE', N'system_error_code', +'COLUMN', N'type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'应用名', +'SCHEMA', N'dbo', +'TABLE', N'system_error_code', +'COLUMN', N'application_name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'错误码编码', +'SCHEMA', N'dbo', +'TABLE', N'system_error_code', +'COLUMN', N'code' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'错误码错误提示', +'SCHEMA', N'dbo', +'TABLE', N'system_error_code', +'COLUMN', N'message' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'备注', +'SCHEMA', N'dbo', +'TABLE', N'system_error_code', +'COLUMN', N'memo' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'system_error_code', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'system_error_code', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'system_error_code', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'system_error_code', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'system_error_code', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'错误码表', +'SCHEMA', N'dbo', +'TABLE', N'system_error_code' +GO + + +-- ---------------------------- +-- Records of system_error_code +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[system_error_code] ON +GO + +SET IDENTITY_INSERT [dbo].[system_error_code] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for system_login_log +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[system_login_log]') AND type IN ('U')) + DROP TABLE [dbo].[system_login_log] +GO + +CREATE TABLE [dbo].[system_login_log] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [log_type] bigint NOT NULL, + [trace_id] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [user_id] bigint NOT NULL, + [user_type] tinyint NOT NULL, + [username] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [result] tinyint NOT NULL, + [user_ip] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [user_agent] nvarchar(512) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [tenant_id] bigint NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL +) +GO + +ALTER TABLE [dbo].[system_login_log] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'访问ID', +'SCHEMA', N'dbo', +'TABLE', N'system_login_log', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'日志类型', +'SCHEMA', N'dbo', +'TABLE', N'system_login_log', +'COLUMN', N'log_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'链路追踪编号', +'SCHEMA', N'dbo', +'TABLE', N'system_login_log', +'COLUMN', N'trace_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户编号', +'SCHEMA', N'dbo', +'TABLE', N'system_login_log', +'COLUMN', N'user_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户类型', +'SCHEMA', N'dbo', +'TABLE', N'system_login_log', +'COLUMN', N'user_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户账号', +'SCHEMA', N'dbo', +'TABLE', N'system_login_log', +'COLUMN', N'username' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'登陆结果', +'SCHEMA', N'dbo', +'TABLE', N'system_login_log', +'COLUMN', N'result' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户 IP', +'SCHEMA', N'dbo', +'TABLE', N'system_login_log', +'COLUMN', N'user_ip' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'浏览器 UA', +'SCHEMA', N'dbo', +'TABLE', N'system_login_log', +'COLUMN', N'user_agent' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'system_login_log', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'system_login_log', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'system_login_log', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'system_login_log', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户编号', +'SCHEMA', N'dbo', +'TABLE', N'system_login_log', +'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'system_login_log', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'系统访问记录', +'SCHEMA', N'dbo', +'TABLE', N'system_login_log' +GO + + +-- ---------------------------- +-- Records of system_login_log +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[system_login_log] ON +GO + +SET IDENTITY_INSERT [dbo].[system_login_log] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for system_menu +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[system_menu]') AND type IN ('U')) + DROP TABLE [dbo].[system_menu] +GO + +CREATE TABLE [dbo].[system_menu] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [name] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [permission] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [type] tinyint NOT NULL, + [sort] int NOT NULL, + [parent_id] bigint NOT NULL, + [path] nvarchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [icon] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [component] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [status] tinyint NOT NULL, + [visible] varchar(1) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [keep_alive] varchar(1) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL +) +GO + +ALTER TABLE [dbo].[system_menu] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'菜单ID', +'SCHEMA', N'dbo', +'TABLE', N'system_menu', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'菜单名称', +'SCHEMA', N'dbo', +'TABLE', N'system_menu', +'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'权限标识', +'SCHEMA', N'dbo', +'TABLE', N'system_menu', +'COLUMN', N'permission' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'菜单类型', +'SCHEMA', N'dbo', +'TABLE', N'system_menu', +'COLUMN', N'type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'显示顺序', +'SCHEMA', N'dbo', +'TABLE', N'system_menu', +'COLUMN', N'sort' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'父菜单ID', +'SCHEMA', N'dbo', +'TABLE', N'system_menu', +'COLUMN', N'parent_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'路由地址', +'SCHEMA', N'dbo', +'TABLE', N'system_menu', +'COLUMN', N'path' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'菜单图标', +'SCHEMA', N'dbo', +'TABLE', N'system_menu', +'COLUMN', N'icon' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'组件路径', +'SCHEMA', N'dbo', +'TABLE', N'system_menu', +'COLUMN', N'component' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'菜单状态', +'SCHEMA', N'dbo', +'TABLE', N'system_menu', +'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否可见', +'SCHEMA', N'dbo', +'TABLE', N'system_menu', +'COLUMN', N'visible' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否缓存', +'SCHEMA', N'dbo', +'TABLE', N'system_menu', +'COLUMN', N'keep_alive' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'system_menu', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'system_menu', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'system_menu', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'system_menu', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'system_menu', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'菜单权限表', +'SCHEMA', N'dbo', +'TABLE', N'system_menu' +GO + + +-- ---------------------------- +-- Records of system_menu +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[system_menu] ON +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1', N'系统管理', N'', N'1', N'10', N'0', N'/system', N'system', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-05-12 18:11:34.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'2', N'基础设施', N'', N'1', N'20', N'0', N'/infra', N'monitor', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-05-12 18:11:34.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'5', N'OA 示例', N'', N'1', N'40', N'1185', N'oa', N'people', N'', N'0', N'1', N'1', N'admin', N'2021-09-20 16:26:19.0000000', N'1', N'2022-05-12 18:11:34.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'100', N'用户管理', N'system:user:list', N'2', N'1', N'1', N'user', N'user', N'system/user/index', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'101', N'角色管理', N'', N'2', N'2', N'1', N'role', N'peoples', N'system/role/index', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'102', N'菜单管理', N'', N'2', N'3', N'1', N'menu', N'tree-table', N'system/menu/index', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'103', N'部门管理', N'', N'2', N'4', N'1', N'dept', N'tree', N'system/dept/index', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'104', N'岗位管理', N'', N'2', N'5', N'1', N'post', N'post', N'system/post/index', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'105', N'字典管理', N'', N'2', N'6', N'1', N'dict', N'dict', N'system/dict/index', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'106', N'配置管理', N'', N'2', N'6', N'2', N'config', N'edit', N'infra/config/index', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'107', N'通知公告', N'', N'2', N'8', N'1', N'notice', N'message', N'system/notice/index', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'108', N'审计日志', N'', N'1', N'9', N'1', N'log', N'log', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'109', N'令牌管理', N'', N'2', N'2', N'1261', N'token', N'online', N'system/oauth2/token/index', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-05-11 23:31:42.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'110', N'定时任务', N'', N'2', N'12', N'2', N'job', N'job', N'infra/job/index', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'111', N'MySQL 监控', N'', N'2', N'9', N'2', N'druid', N'druid', N'infra/druid/index', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'112', N'Java 监控', N'', N'2', N'11', N'2', N'admin-server', N'server', N'infra/server/index', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'113', N'Redis 监控', N'', N'2', N'10', N'2', N'redis', N'redis', N'infra/redis/index', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'114', N'表单构建', N'infra:build:list', N'2', N'2', N'2', N'build', N'build', N'infra/build/index', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'115', N'代码生成', N'infra:codegen:query', N'2', N'1', N'2', N'codegen', N'code', N'infra/codegen/index', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'116', N'系统接口', N'infra:swagger:list', N'2', N'3', N'2', N'swagger', N'swagger', N'infra/swagger/index', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'500', N'操作日志', N'', N'2', N'1', N'108', N'operate-log', N'form', N'system/operatelog/index', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'501', N'登录日志', N'', N'2', N'2', N'108', N'login-log', N'logininfor', N'system/loginlog/index', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1001', N'用户查询', N'system:user:query', N'3', N'1', N'100', N'', N'#', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1002', N'用户新增', N'system:user:create', N'3', N'2', N'100', N'', N'', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1003', N'用户修改', N'system:user:update', N'3', N'3', N'100', N'', N'', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1004', N'用户删除', N'system:user:delete', N'3', N'4', N'100', N'', N'', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1005', N'用户导出', N'system:user:export', N'3', N'5', N'100', N'', N'#', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1006', N'用户导入', N'system:user:import', N'3', N'6', N'100', N'', N'#', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1007', N'重置密码', N'system:user:update-password', N'3', N'7', N'100', N'', N'', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1008', N'角色查询', N'system:role:query', N'3', N'1', N'101', N'', N'#', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1009', N'角色新增', N'system:role:create', N'3', N'2', N'101', N'', N'', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1010', N'角色修改', N'system:role:update', N'3', N'3', N'101', N'', N'', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1011', N'角色删除', N'system:role:delete', N'3', N'4', N'101', N'', N'', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1012', N'角色导出', N'system:role:export', N'3', N'5', N'101', N'', N'#', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1013', N'菜单查询', N'system:menu:query', N'3', N'1', N'102', N'', N'#', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1014', N'菜单新增', N'system:menu:create', N'3', N'2', N'102', N'', N'#', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1015', N'菜单修改', N'system:menu:update', N'3', N'3', N'102', N'', N'#', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1016', N'菜单删除', N'system:menu:delete', N'3', N'4', N'102', N'', N'#', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1017', N'部门查询', N'system:dept:query', N'3', N'1', N'103', N'', N'#', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1018', N'部门新增', N'system:dept:create', N'3', N'2', N'103', N'', N'', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1019', N'部门修改', N'system:dept:update', N'3', N'3', N'103', N'', N'', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1020', N'部门删除', N'system:dept:delete', N'3', N'4', N'103', N'', N'', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1021', N'岗位查询', N'system:post:query', N'3', N'1', N'104', N'', N'#', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1022', N'岗位新增', N'system:post:create', N'3', N'2', N'104', N'', N'', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1023', N'岗位修改', N'system:post:update', N'3', N'3', N'104', N'', N'', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1024', N'岗位删除', N'system:post:delete', N'3', N'4', N'104', N'', N'', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1025', N'岗位导出', N'system:post:export', N'3', N'5', N'104', N'', N'#', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1026', N'字典查询', N'system:dict:query', N'3', N'1', N'105', N'#', N'#', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1027', N'字典新增', N'system:dict:create', N'3', N'2', N'105', N'', N'', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1028', N'字典修改', N'system:dict:update', N'3', N'3', N'105', N'', N'', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1029', N'字典删除', N'system:dict:delete', N'3', N'4', N'105', N'', N'', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1030', N'字典导出', N'system:dict:export', N'3', N'5', N'105', N'#', N'#', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1031', N'配置查询', N'infra:config:query', N'3', N'1', N'106', N'', N'', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1032', N'配置新增', N'infra:config:create', N'3', N'2', N'106', N'', N'', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1033', N'配置修改', N'infra:config:update', N'3', N'3', N'106', N'', N'', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1034', N'配置删除', N'infra:config:delete', N'3', N'4', N'106', N'', N'', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1035', N'配置导出', N'infra:config:export', N'3', N'5', N'106', N'', N'', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1036', N'公告查询', N'system:notice:query', N'3', N'1', N'107', N'#', N'#', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1037', N'公告新增', N'system:notice:create', N'3', N'2', N'107', N'', N'', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1038', N'公告修改', N'system:notice:update', N'3', N'3', N'107', N'', N'', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1039', N'公告删除', N'system:notice:delete', N'3', N'4', N'107', N'', N'', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1040', N'操作查询', N'system:operate-log:query', N'3', N'1', N'500', N'', N'', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1042', N'日志导出', N'system:operate-log:export', N'3', N'2', N'500', N'', N'', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1043', N'登录查询', N'system:login-log:query', N'3', N'1', N'501', N'#', N'#', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1045', N'日志导出', N'system:login-log:export', N'3', N'3', N'501', N'#', N'#', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1046', N'令牌列表', N'system:oauth2-token:page', N'3', N'1', N'109', N'', N'', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-05-09 23:54:42.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1048', N'令牌删除', N'system:oauth2-token:delete', N'3', N'2', N'109', N'', N'', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-05-09 23:54:53.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1050', N'任务新增', N'infra:job:create', N'3', N'2', N'110', N'', N'', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1051', N'任务修改', N'infra:job:update', N'3', N'3', N'110', N'', N'', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1052', N'任务删除', N'infra:job:delete', N'3', N'4', N'110', N'', N'', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1053', N'状态修改', N'infra:job:update', N'3', N'5', N'110', N'', N'', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1054', N'任务导出', N'infra:job:export', N'3', N'7', N'110', N'', N'', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1056', N'生成修改', N'infra:codegen:update', N'3', N'2', N'115', N'', N'', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1057', N'生成删除', N'infra:codegen:delete', N'3', N'3', N'115', N'', N'', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1058', N'导入代码', N'infra:codegen:create', N'3', N'2', N'115', N'', N'', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1059', N'预览代码', N'infra:codegen:preview', N'3', N'4', N'115', N'', N'', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1060', N'生成代码', N'infra:codegen:download', N'3', N'5', N'115', N'', N'', N'', N'0', N'1', N'1', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1063', N'设置角色菜单权限', N'system:permission:assign-role-menu', N'3', N'6', N'101', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-01-06 17:53:44.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1064', N'设置角色数据权限', N'system:permission:assign-role-data-scope', N'3', N'7', N'101', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-01-06 17:56:31.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1065', N'设置用户角色', N'system:permission:assign-user-role', N'3', N'8', N'101', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-01-07 10:23:28.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1066', N'获得 Redis 监控信息', N'infra:redis:get-monitor-info', N'3', N'1', N'113', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-01-26 01:02:31.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1067', N'获得 Redis Key 列表', N'infra:redis:get-key-list', N'3', N'2', N'113', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-01-26 01:02:52.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1070', N'代码生成示例', N'infra:test-demo:query', N'2', N'1', N'2', N'test-demo', N'validCode', N'infra/testDemo/index', N'0', N'1', N'1', N'', N'2021-02-06 12:42:49.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1071', N'测试示例表创建', N'infra:test-demo:create', N'3', N'1', N'1070', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-02-06 12:42:49.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1072', N'测试示例表更新', N'infra:test-demo:update', N'3', N'2', N'1070', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-02-06 12:42:49.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1073', N'测试示例表删除', N'infra:test-demo:delete', N'3', N'3', N'1070', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-02-06 12:42:49.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1074', N'测试示例表导出', N'infra:test-demo:export', N'3', N'4', N'1070', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-02-06 12:42:49.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1075', N'任务触发', N'infra:job:trigger', N'3', N'8', N'110', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-02-07 13:03:10.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1076', N'数据库文档', N'', N'2', N'4', N'2', N'db-doc', N'table', N'infra/dbDoc/index', N'0', N'1', N'1', N'', N'2021-02-08 01:41:47.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1077', N'监控平台', N'', N'2', N'13', N'2', N'skywalking', N'eye-open', N'infra/skywalking/index', N'0', N'1', N'1', N'', N'2021-02-08 20:41:31.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1078', N'访问日志', N'', N'2', N'1', N'1083', N'api-access-log', N'log', N'infra/apiAccessLog/index', N'0', N'1', N'1', N'', N'2021-02-26 01:32:59.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1082', N'日志导出', N'infra:api-access-log:export', N'3', N'2', N'1078', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-02-26 01:32:59.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1083', N'API 日志', N'', N'2', N'8', N'2', N'log', N'log', N'', N'0', N'1', N'1', N'', N'2021-02-26 02:18:24.0000000', N'1', N'2022-05-12 18:11:34.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1084', N'错误日志', N'infra:api-error-log:query', N'2', N'2', N'1083', N'api-error-log', N'log', N'infra/apiErrorLog/index', N'0', N'1', N'1', N'', N'2021-02-26 07:53:20.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1085', N'日志处理', N'infra:api-error-log:update-status', N'3', N'2', N'1084', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-02-26 07:53:20.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1086', N'日志导出', N'infra:api-error-log:export', N'3', N'3', N'1084', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-02-26 07:53:20.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1087', N'任务查询', N'infra:job:query', N'3', N'1', N'110', N'', N'', N'', N'0', N'1', N'1', N'1', N'2021-03-10 01:26:19.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1088', N'日志查询', N'infra:api-access-log:query', N'3', N'1', N'1078', N'', N'', N'', N'0', N'1', N'1', N'1', N'2021-03-10 01:28:04.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1089', N'日志查询', N'infra:api-error-log:query', N'3', N'1', N'1084', N'', N'', N'', N'0', N'1', N'1', N'1', N'2021-03-10 01:29:09.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1090', N'文件列表', N'', N'2', N'5', N'1243', N'file', N'upload', N'infra/file/index', N'0', N'1', N'1', N'', N'2021-03-12 20:16:20.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1091', N'文件查询', N'infra:file:query', N'3', N'1', N'1090', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-03-12 20:16:20.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1092', N'文件删除', N'infra:file:delete', N'3', N'4', N'1090', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-03-12 20:16:20.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1093', N'短信管理', N'', N'1', N'11', N'1', N'sms', N'validCode', N'', N'0', N'1', N'1', N'1', N'2021-04-05 01:10:16.0000000', N'1', N'2022-05-12 18:11:34.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1094', N'短信渠道', N'', N'2', N'0', N'1093', N'sms-channel', N'phone', N'system/sms/smsChannel', N'0', N'1', N'1', N'', N'2021-04-01 11:07:15.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1095', N'短信渠道查询', N'system:sms-channel:query', N'3', N'1', N'1094', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-04-01 11:07:15.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1096', N'短信渠道创建', N'system:sms-channel:create', N'3', N'2', N'1094', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-04-01 11:07:15.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1097', N'短信渠道更新', N'system:sms-channel:update', N'3', N'3', N'1094', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-04-01 11:07:15.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1098', N'短信渠道删除', N'system:sms-channel:delete', N'3', N'4', N'1094', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-04-01 11:07:15.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1100', N'短信模板', N'', N'2', N'1', N'1093', N'sms-template', N'phone', N'system/sms/smsTemplate', N'0', N'1', N'1', N'', N'2021-04-01 17:35:17.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1101', N'短信模板查询', N'system:sms-template:query', N'3', N'1', N'1100', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-04-01 17:35:17.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1102', N'短信模板创建', N'system:sms-template:create', N'3', N'2', N'1100', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-04-01 17:35:17.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1103', N'短信模板更新', N'system:sms-template:update', N'3', N'3', N'1100', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-04-01 17:35:17.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1104', N'短信模板删除', N'system:sms-template:delete', N'3', N'4', N'1100', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-04-01 17:35:17.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1105', N'短信模板导出', N'system:sms-template:export', N'3', N'5', N'1100', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-04-01 17:35:17.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1106', N'发送测试短信', N'system:sms-template:send-sms', N'3', N'6', N'1100', N'', N'', N'', N'0', N'1', N'1', N'1', N'2021-04-11 00:26:40.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1107', N'短信日志', N'', N'2', N'2', N'1093', N'sms-log', N'phone', N'system/sms/smsLog', N'0', N'1', N'1', N'', N'2021-04-11 08:37:05.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1108', N'短信日志查询', N'system:sms-log:query', N'3', N'1', N'1107', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-04-11 08:37:05.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1109', N'短信日志导出', N'system:sms-log:export', N'3', N'5', N'1107', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-04-11 08:37:05.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1110', N'错误码管理', N'', N'2', N'12', N'1', N'error-code', N'code', N'system/errorCode/index', N'0', N'1', N'1', N'', N'2021-04-13 21:46:42.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1111', N'错误码查询', N'system:error-code:query', N'3', N'1', N'1110', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-04-13 21:46:42.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1112', N'错误码创建', N'system:error-code:create', N'3', N'2', N'1110', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-04-13 21:46:42.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1113', N'错误码更新', N'system:error-code:update', N'3', N'3', N'1110', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-04-13 21:46:42.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1114', N'错误码删除', N'system:error-code:delete', N'3', N'4', N'1110', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-04-13 21:46:42.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1115', N'错误码导出', N'system:error-code:export', N'3', N'5', N'1110', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-04-13 21:46:42.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1117', N'支付管理', N'', N'1', N'11', N'0', N'/pay', N'money', N'', N'0', N'1', N'1', N'1', N'2021-12-25 16:43:41.0000000', N'1', N'2022-05-12 18:11:34.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1118', N'请假查询', N'', N'2', N'0', N'5', N'leave', N'user', N'bpm/oa/leave/index', N'0', N'1', N'1', N'', N'2021-09-20 08:51:03.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1119', N'请假申请查询', N'bpm:oa-leave:query', N'3', N'1', N'1118', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-09-20 08:51:03.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1120', N'请假申请创建', N'bpm:oa-leave:create', N'3', N'2', N'1118', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-09-20 08:51:03.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1126', N'应用信息', N'', N'2', N'1', N'1117', N'app', N'table', N'pay/app/index', N'0', N'1', N'1', N'', N'2021-11-10 01:13:30.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1127', N'支付应用信息查询', N'pay:app:query', N'3', N'1', N'1126', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-11-10 01:13:31.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1128', N'支付应用信息创建', N'pay:app:create', N'3', N'2', N'1126', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-11-10 01:13:31.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1129', N'支付应用信息更新', N'pay:app:update', N'3', N'3', N'1126', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-11-10 01:13:31.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1130', N'支付应用信息删除', N'pay:app:delete', N'3', N'4', N'1126', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-11-10 01:13:31.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1131', N'支付应用信息导出', N'pay:app:export', N'3', N'5', N'1126', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-11-10 01:13:31.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1132', N'秘钥解析', N'pay:channel:parsing', N'3', N'6', N'1129', N'', N'', N'', N'0', N'1', N'1', N'1', N'2021-11-08 15:15:47.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1133', N'支付商户信息查询', N'pay:merchant:query', N'3', N'1', N'1132', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-11-10 01:13:41.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1134', N'支付商户信息创建', N'pay:merchant:create', N'3', N'2', N'1132', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-11-10 01:13:41.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1135', N'支付商户信息更新', N'pay:merchant:update', N'3', N'3', N'1132', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-11-10 01:13:41.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1136', N'支付商户信息删除', N'pay:merchant:delete', N'3', N'4', N'1132', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-11-10 01:13:41.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1137', N'支付商户信息导出', N'pay:merchant:export', N'3', N'5', N'1132', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-11-10 01:13:41.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1138', N'租户列表', N'', N'2', N'0', N'1224', N'list', N'peoples', N'system/tenant/index', N'0', N'1', N'1', N'', N'2021-12-14 12:31:43.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1139', N'租户查询', N'system:tenant:query', N'3', N'1', N'1138', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-12-14 12:31:44.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1140', N'租户创建', N'system:tenant:create', N'3', N'2', N'1138', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-12-14 12:31:44.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1141', N'租户更新', N'system:tenant:update', N'3', N'3', N'1138', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-12-14 12:31:44.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1142', N'租户删除', N'system:tenant:delete', N'3', N'4', N'1138', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-12-14 12:31:44.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1143', N'租户导出', N'system:tenant:export', N'3', N'5', N'1138', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-12-14 12:31:44.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1150', N'秘钥解析', N'', N'3', N'6', N'1129', N'', N'', N'', N'0', N'1', N'1', N'1', N'2021-11-08 15:15:47.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1161', N'退款订单', N'', N'2', N'3', N'1117', N'refund', N'order', N'pay/refund/index', N'0', N'1', N'1', N'', N'2021-12-25 08:29:07.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1162', N'退款订单查询', N'pay:refund:query', N'3', N'1', N'1161', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-12-25 08:29:07.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1163', N'退款订单创建', N'pay:refund:create', N'3', N'2', N'1161', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-12-25 08:29:07.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1164', N'退款订单更新', N'pay:refund:update', N'3', N'3', N'1161', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-12-25 08:29:07.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1165', N'退款订单删除', N'pay:refund:delete', N'3', N'4', N'1161', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-12-25 08:29:07.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1166', N'退款订单导出', N'pay:refund:export', N'3', N'5', N'1161', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-12-25 08:29:07.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1173', N'支付订单', N'', N'2', N'2', N'1117', N'order', N'pay', N'pay/order/index', N'0', N'1', N'1', N'', N'2021-12-25 08:49:43.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1174', N'支付订单查询', N'pay:order:query', N'3', N'1', N'1173', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-12-25 08:49:43.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1175', N'支付订单创建', N'pay:order:create', N'3', N'2', N'1173', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-12-25 08:49:43.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1176', N'支付订单更新', N'pay:order:update', N'3', N'3', N'1173', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-12-25 08:49:43.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1177', N'支付订单删除', N'pay:order:delete', N'3', N'4', N'1173', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-12-25 08:49:43.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1178', N'支付订单导出', N'pay:order:export', N'3', N'5', N'1173', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-12-25 08:49:43.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1179', N'商户信息', N'', N'2', N'0', N'1117', N'merchant', N'merchant', N'pay/merchant/index', N'0', N'1', N'1', N'', N'2021-12-25 09:01:44.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1180', N'支付商户信息查询', N'pay:merchant:query', N'3', N'1', N'1179', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-12-25 09:01:44.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1181', N'支付商户信息创建', N'pay:merchant:create', N'3', N'2', N'1179', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-12-25 09:01:44.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1182', N'支付商户信息更新', N'pay:merchant:update', N'3', N'3', N'1179', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-12-25 09:01:44.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1183', N'支付商户信息删除', N'', N'3', N'4', N'1179', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-12-25 09:01:44.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1184', N'支付商户信息导出', N'pay:merchant:export', N'3', N'5', N'1179', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-12-25 09:01:44.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1185', N'工作流程', N'', N'1', N'50', N'0', N'/bpm', N'tool', N'', N'0', N'1', N'1', N'1', N'2021-12-30 20:26:36.0000000', N'103', N'2022-05-12 18:11:34.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1186', N'流程管理', N'', N'1', N'10', N'1185', N'manager', N'nested', N'', N'0', N'1', N'1', N'1', N'2021-12-30 20:28:30.0000000', N'1', N'2022-05-12 18:11:34.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1187', N'流程表单', N'', N'2', N'0', N'1186', N'form', N'form', N'bpm/form/index', N'0', N'1', N'1', N'', N'2021-12-30 12:38:22.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1188', N'表单查询', N'bpm:form:query', N'3', N'1', N'1187', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-12-30 12:38:22.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1189', N'表单创建', N'bpm:form:create', N'3', N'2', N'1187', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-12-30 12:38:22.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1190', N'表单更新', N'bpm:form:update', N'3', N'3', N'1187', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-12-30 12:38:22.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1191', N'表单删除', N'bpm:form:delete', N'3', N'4', N'1187', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-12-30 12:38:22.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1192', N'表单导出', N'bpm:form:export', N'3', N'5', N'1187', N'', N'', N'', N'0', N'1', N'1', N'', N'2021-12-30 12:38:22.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1193', N'流程模型', N'', N'2', N'5', N'1186', N'model', N'guide', N'bpm/model/index', N'0', N'1', N'1', N'1', N'2021-12-31 23:24:58.0000000', N'103', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1194', N'模型查询', N'bpm:model:query', N'3', N'1', N'1193', N'', N'', N'', N'0', N'1', N'1', N'1', N'2022-01-03 19:01:10.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1195', N'模型创建', N'bpm:model:create', N'3', N'2', N'1193', N'', N'', N'', N'0', N'1', N'1', N'1', N'2022-01-03 19:01:24.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1196', N'模型导入', N'bpm:model:import', N'3', N'3', N'1193', N'', N'', N'', N'0', N'1', N'1', N'1', N'2022-01-03 19:01:35.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1197', N'模型更新', N'bpm:model:update', N'3', N'4', N'1193', N'', N'', N'', N'0', N'1', N'1', N'1', N'2022-01-03 19:02:28.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1198', N'模型删除', N'bpm:model:delete', N'3', N'5', N'1193', N'', N'', N'', N'0', N'1', N'1', N'1', N'2022-01-03 19:02:43.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1199', N'模型发布', N'bpm:model:deploy', N'3', N'6', N'1193', N'', N'', N'', N'0', N'1', N'1', N'1', N'2022-01-03 19:03:24.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1200', N'任务管理', N'', N'1', N'20', N'1185', N'task', N'cascader', N'', N'0', N'1', N'1', N'1', N'2022-01-07 23:51:48.0000000', N'1', N'2022-05-12 18:11:34.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1201', N'我的流程', N'', N'2', N'0', N'1200', N'my', N'people', N'bpm/processInstance/index', N'0', N'1', N'1', N'', N'2022-01-07 15:53:44.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1202', N'流程实例的查询', N'bpm:process-instance:query', N'3', N'1', N'1201', N'', N'', N'', N'0', N'1', N'1', N'', N'2022-01-07 15:53:44.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1207', N'待办任务', N'', N'2', N'10', N'1200', N'todo', N'eye-open', N'bpm/task/todo', N'0', N'1', N'1', N'1', N'2022-01-08 10:33:37.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1208', N'已办任务', N'', N'2', N'20', N'1200', N'done', N'eye', N'bpm/task/done', N'0', N'1', N'1', N'1', N'2022-01-08 10:34:13.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1209', N'用户分组', N'', N'2', N'2', N'1186', N'user-group', N'people', N'bpm/group/index', N'0', N'1', N'1', N'', N'2022-01-14 02:14:20.0000000', N'103', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1210', N'用户组查询', N'bpm:user-group:query', N'3', N'1', N'1209', N'', N'', N'', N'0', N'1', N'1', N'', N'2022-01-14 02:14:20.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1211', N'用户组创建', N'bpm:user-group:create', N'3', N'2', N'1209', N'', N'', N'', N'0', N'1', N'1', N'', N'2022-01-14 02:14:20.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1212', N'用户组更新', N'bpm:user-group:update', N'3', N'3', N'1209', N'', N'', N'', N'0', N'1', N'1', N'', N'2022-01-14 02:14:20.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1213', N'用户组删除', N'bpm:user-group:delete', N'3', N'4', N'1209', N'', N'', N'', N'0', N'1', N'1', N'', N'2022-01-14 02:14:20.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1215', N'流程定义查询', N'bpm:process-definition:query', N'3', N'10', N'1193', N'', N'', N'', N'0', N'1', N'1', N'1', N'2022-01-23 00:21:43.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1216', N'流程任务分配规则查询', N'bpm:task-assign-rule:query', N'3', N'20', N'1193', N'', N'', N'', N'0', N'1', N'1', N'1', N'2022-01-23 00:26:53.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1217', N'流程任务分配规则创建', N'bpm:task-assign-rule:create', N'3', N'21', N'1193', N'', N'', N'', N'0', N'1', N'1', N'1', N'2022-01-23 00:28:15.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1218', N'流程任务分配规则更新', N'bpm:task-assign-rule:update', N'3', N'22', N'1193', N'', N'', N'', N'0', N'1', N'1', N'1', N'2022-01-23 00:28:41.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1219', N'流程实例的创建', N'bpm:process-instance:create', N'3', N'2', N'1201', N'', N'', N'', N'0', N'1', N'1', N'1', N'2022-01-23 00:36:15.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1220', N'流程实例的取消', N'bpm:process-instance:cancel', N'3', N'3', N'1201', N'', N'', N'', N'0', N'1', N'1', N'1', N'2022-01-23 00:36:33.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1221', N'流程任务的查询', N'bpm:task:query', N'3', N'1', N'1207', N'', N'', N'', N'0', N'1', N'1', N'1', N'2022-01-23 00:38:52.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1222', N'流程任务的更新', N'bpm:task:update', N'3', N'2', N'1207', N'', N'', N'', N'0', N'1', N'1', N'1', N'2022-01-23 00:39:24.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1224', N'租户管理', N'', N'2', N'0', N'1', N'tenant', N'peoples', N'', N'0', N'1', N'1', N'1', N'2022-02-20 01:41:13.0000000', N'1', N'2022-05-12 18:11:34.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1225', N'租户套餐', N'', N'2', N'0', N'1224', N'package', N'eye', N'system/tenantPackage/index', N'0', N'1', N'1', N'', N'2022-02-19 17:44:06.0000000', N'1', N'2022-04-21 01:21:25.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1226', N'租户套餐查询', N'system:tenant-package:query', N'3', N'1', N'1225', N'', N'', N'', N'0', N'1', N'1', N'', N'2022-02-19 17:44:06.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1227', N'租户套餐创建', N'system:tenant-package:create', N'3', N'2', N'1225', N'', N'', N'', N'0', N'1', N'1', N'', N'2022-02-19 17:44:06.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1228', N'租户套餐更新', N'system:tenant-package:update', N'3', N'3', N'1225', N'', N'', N'', N'0', N'1', N'1', N'', N'2022-02-19 17:44:06.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1229', N'租户套餐删除', N'system:tenant-package:delete', N'3', N'4', N'1225', N'', N'', N'', N'0', N'1', N'1', N'', N'2022-02-19 17:44:06.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1237', N'文件配置', N'', N'2', N'0', N'1243', N'file-config', N'config', N'infra/fileConfig/index', N'0', N'1', N'1', N'', N'2022-03-15 14:35:28.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1238', N'文件配置查询', N'infra:file-config:query', N'3', N'1', N'1237', N'', N'', N'', N'0', N'1', N'1', N'', N'2022-03-15 14:35:28.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1239', N'文件配置创建', N'infra:file-config:create', N'3', N'2', N'1237', N'', N'', N'', N'0', N'1', N'1', N'', N'2022-03-15 14:35:28.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1240', N'文件配置更新', N'infra:file-config:update', N'3', N'3', N'1237', N'', N'', N'', N'0', N'1', N'1', N'', N'2022-03-15 14:35:28.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1241', N'文件配置删除', N'infra:file-config:delete', N'3', N'4', N'1237', N'', N'', N'', N'0', N'1', N'1', N'', N'2022-03-15 14:35:28.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1242', N'文件配置导出', N'infra:file-config:export', N'3', N'5', N'1237', N'', N'', N'', N'0', N'1', N'1', N'', N'2022-03-15 14:35:28.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1243', N'文件管理', N'', N'2', N'5', N'2', N'file', N'download', N'', N'0', N'1', N'1', N'1', N'2022-03-16 23:47:40.0000000', N'1', N'2022-05-12 18:11:34.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1247', N'敏感词管理', N'', N'2', N'13', N'1', N'sensitive-word', N'education', N'system/sensitiveWord/index', N'0', N'1', N'1', N'', N'2022-04-07 16:55:03.0000000', N'1', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1248', N'敏感词查询', N'system:sensitive-word:query', N'3', N'1', N'1247', N'', N'', N'', N'0', N'1', N'1', N'', N'2022-04-07 16:55:03.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1249', N'敏感词创建', N'system:sensitive-word:create', N'3', N'2', N'1247', N'', N'', N'', N'0', N'1', N'1', N'', N'2022-04-07 16:55:03.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1250', N'敏感词更新', N'system:sensitive-word:update', N'3', N'3', N'1247', N'', N'', N'', N'0', N'1', N'1', N'', N'2022-04-07 16:55:03.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1251', N'敏感词删除', N'system:sensitive-word:delete', N'3', N'4', N'1247', N'', N'', N'', N'0', N'1', N'1', N'', N'2022-04-07 16:55:03.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1252', N'敏感词导出', N'system:sensitive-word:export', N'3', N'5', N'1247', N'', N'', N'', N'0', N'1', N'1', N'', N'2022-04-07 16:55:03.0000000', N'', N'2022-04-20 17:03:10.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1254', N'作者动态', N'', N'1', N'0', N'0', N'https://www.iocoder.cn', N'people', N'', N'0', N'1', N'1', N'1', N'2022-04-23 01:03:15.0000000', N'1', N'2022-05-12 18:11:34.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1255', N'数据源配置', N'', N'2', N'1', N'2', N'data-source-config', N'rate', N'infra/dataSourceConfig/index', N'0', N'1', N'1', N'', N'2022-04-27 14:37:32.0000000', N'1', N'2022-04-27 22:42:06.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1256', N'数据源配置查询', N'infra:data-source-config:query', N'3', N'1', N'1255', N'', N'', N'', N'0', N'1', N'1', N'', N'2022-04-27 14:37:32.0000000', N'', N'2022-04-27 14:37:32.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1257', N'数据源配置创建', N'infra:data-source-config:create', N'3', N'2', N'1255', N'', N'', N'', N'0', N'1', N'1', N'', N'2022-04-27 14:37:32.0000000', N'', N'2022-04-27 14:37:32.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1258', N'数据源配置更新', N'infra:data-source-config:update', N'3', N'3', N'1255', N'', N'', N'', N'0', N'1', N'1', N'', N'2022-04-27 14:37:32.0000000', N'', N'2022-04-27 14:37:32.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1259', N'数据源配置删除', N'infra:data-source-config:delete', N'3', N'4', N'1255', N'', N'', N'', N'0', N'1', N'1', N'', N'2022-04-27 14:37:32.0000000', N'', N'2022-04-27 14:37:32.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1260', N'数据源配置导出', N'infra:data-source-config:export', N'3', N'5', N'1255', N'', N'', N'', N'0', N'1', N'1', N'', N'2022-04-27 14:37:32.0000000', N'', N'2022-04-27 14:37:32.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1261', N'OAuth 2.0', N'', N'1', N'10', N'1', N'oauth2', N'people', N'', N'0', N'1', N'1', N'1', N'2022-05-09 23:38:17.0000000', N'1', N'2022-05-12 18:11:34.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1263', N'应用管理', N'', N'2', N'0', N'1261', N'oauth2/application', N'tool', N'system/oauth2/client/index', N'0', N'1', N'1', N'', N'2022-05-10 16:26:33.0000000', N'1', N'2022-05-11 23:31:36.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1264', N'客户端查询', N'system:oauth2-client:query', N'3', N'1', N'1263', N'', N'', N'', N'0', N'1', N'1', N'', N'2022-05-10 16:26:33.0000000', N'1', N'2022-05-11 00:31:06.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1265', N'客户端创建', N'system:oauth2-client:create', N'3', N'2', N'1263', N'', N'', N'', N'0', N'1', N'1', N'', N'2022-05-10 16:26:33.0000000', N'1', N'2022-05-11 00:31:23.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1266', N'客户端更新', N'system:oauth2-client:update', N'3', N'3', N'1263', N'', N'', N'', N'0', N'1', N'1', N'', N'2022-05-10 16:26:33.0000000', N'1', N'2022-05-11 00:31:28.0000000', N'0') +GO + +INSERT INTO [dbo].[system_menu] ([id], [name], [permission], [type], [sort], [parent_id], [path], [icon], [component], [status], [visible], [keep_alive], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1267', N'客户端删除', N'system:oauth2-client:delete', N'3', N'4', N'1263', N'', N'', N'', N'0', N'1', N'1', N'', N'2022-05-10 16:26:33.0000000', N'1', N'2022-05-11 00:31:33.0000000', N'0') +GO + +SET IDENTITY_INSERT [dbo].[system_menu] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for system_notice +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[system_notice]') AND type IN ('U')) + DROP TABLE [dbo].[system_notice] +GO + +CREATE TABLE [dbo].[system_notice] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [title] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [content] nvarchar(max) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [type] tinyint NOT NULL, + [status] tinyint NOT NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [tenant_id] bigint NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL +) +GO + +ALTER TABLE [dbo].[system_notice] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'公告ID', +'SCHEMA', N'dbo', +'TABLE', N'system_notice', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'公告标题', +'SCHEMA', N'dbo', +'TABLE', N'system_notice', +'COLUMN', N'title' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'公告内容', +'SCHEMA', N'dbo', +'TABLE', N'system_notice', +'COLUMN', N'content' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'公告类型(1通知 2公告)', +'SCHEMA', N'dbo', +'TABLE', N'system_notice', +'COLUMN', N'type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'公告状态(0正常 1关闭)', +'SCHEMA', N'dbo', +'TABLE', N'system_notice', +'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'system_notice', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'system_notice', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'system_notice', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'system_notice', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户编号', +'SCHEMA', N'dbo', +'TABLE', N'system_notice', +'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'system_notice', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'通知公告表', +'SCHEMA', N'dbo', +'TABLE', N'system_notice' +GO + + +-- ---------------------------- +-- Records of system_notice +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[system_notice] ON +GO + +INSERT INTO [dbo].[system_notice] ([id], [title], [content], [type], [status], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'1', N'温馨提醒:2018-07-01 若依新版本发布啦', N'

新版本内容133

', N'2', N'0', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-02-15 19:47:20.0000000', N'1', N'0') +GO + +INSERT INTO [dbo].[system_notice] ([id], [title], [content], [type], [status], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'2', N'维护通知:2018-07-01 若依系统凌晨维护', N'维护内容', N'1', N'0', N'admin', N'2021-01-05 17:03:48.0000000', N'', N'2021-12-15 05:02:22.0000000', N'1', N'0') +GO + +INSERT INTO [dbo].[system_notice] ([id], [title], [content], [type], [status], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'4', N'我是测试标题', N'

哈哈哈哈123

', N'1', N'0', N'110', N'2022-02-22 01:01:25.0000000', N'110', N'2022-02-22 01:01:46.0000000', N'121', N'0') +GO + +SET IDENTITY_INSERT [dbo].[system_notice] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for system_oauth2_access_token +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[system_oauth2_access_token]') AND type IN ('U')) + DROP TABLE [dbo].[system_oauth2_access_token] +GO + +CREATE TABLE [dbo].[system_oauth2_access_token] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [user_id] bigint NOT NULL, + [access_token] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [refresh_token] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [user_type] tinyint NOT NULL, + [client_id] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [expires_time] datetime2(7) NOT NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL, + [tenant_id] bigint DEFAULT 0 NOT NULL, + [scopes] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS DEFAULT '' NULL +) +GO + +ALTER TABLE [dbo].[system_oauth2_access_token] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'编号', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_access_token', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户编号', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_access_token', +'COLUMN', N'user_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'访问令牌', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_access_token', +'COLUMN', N'access_token' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'刷新令牌', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_access_token', +'COLUMN', N'refresh_token' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户类型', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_access_token', +'COLUMN', N'user_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'客户端编号', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_access_token', +'COLUMN', N'client_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'过期时间', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_access_token', +'COLUMN', N'expires_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_access_token', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_access_token', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_access_token', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_access_token', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_access_token', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户编号', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_access_token', +'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'授权范围', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_access_token', +'COLUMN', N'scopes' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'刷新令牌', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_access_token' +GO + + +-- ---------------------------- +-- Records of system_oauth2_access_token +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[system_oauth2_access_token] ON +GO + +SET IDENTITY_INSERT [dbo].[system_oauth2_access_token] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for system_oauth2_approve +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[system_oauth2_approve]') AND type IN ('U')) + DROP TABLE [dbo].[system_oauth2_approve] +GO + +CREATE TABLE [dbo].[system_oauth2_approve] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [user_id] bigint NOT NULL, + [user_type] tinyint NOT NULL, + [client_id] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [scope] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [approved] varchar(1) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [expires_time] datetime2(7) NOT NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL, + [tenant_id] bigint NOT NULL +) +GO + +ALTER TABLE [dbo].[system_oauth2_approve] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'编号', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_approve', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户编号', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_approve', +'COLUMN', N'user_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户类型', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_approve', +'COLUMN', N'user_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'客户端编号', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_approve', +'COLUMN', N'client_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'授权范围', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_approve', +'COLUMN', N'scope' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否接受', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_approve', +'COLUMN', N'approved' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'过期时间', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_approve', +'COLUMN', N'expires_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_approve', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_approve', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_approve', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_approve', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_approve', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户编号', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_approve', +'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'OAuth2 批准表', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_approve' +GO + + +-- ---------------------------- +-- Records of system_oauth2_approve +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[system_oauth2_approve] ON +GO + +SET IDENTITY_INSERT [dbo].[system_oauth2_approve] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for system_oauth2_client +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[system_oauth2_client]') AND type IN ('U')) + DROP TABLE [dbo].[system_oauth2_client] +GO + +CREATE TABLE [dbo].[system_oauth2_client] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [client_id] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [secret] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [name] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [logo] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [description] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [status] tinyint NOT NULL, + [access_token_validity_seconds] int NOT NULL, + [refresh_token_validity_seconds] int NOT NULL, + [redirect_uris] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [auto_approve_scopes] nvarchar(max) COLLATE SQL_Latin1_General_CP1_CI_AS DEFAULT '' NOT NULL, + [authorized_grant_types] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [scopes] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS DEFAULT '' NULL, + [authorities] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [resource_ids] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [additional_information] nvarchar(max) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL +) +GO + +ALTER TABLE [dbo].[system_oauth2_client] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'编号', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_client', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'客户端编号', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_client', +'COLUMN', N'client_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'客户端密钥', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_client', +'COLUMN', N'secret' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'应用名', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_client', +'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'应用图标', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_client', +'COLUMN', N'logo' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'应用描述', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_client', +'COLUMN', N'description' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'状态', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_client', +'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'访问令牌的有效期', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_client', +'COLUMN', N'access_token_validity_seconds' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'刷新令牌的有效期', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_client', +'COLUMN', N'refresh_token_validity_seconds' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'可重定向的 URI 地址', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_client', +'COLUMN', N'redirect_uris' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'自动通过的授权范围', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_client', +'COLUMN', N'auto_approve_scopes' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'授权类型', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_client', +'COLUMN', N'authorized_grant_types' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'授权范围', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_client', +'COLUMN', N'scopes' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'权限', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_client', +'COLUMN', N'authorities' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'资源', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_client', +'COLUMN', N'resource_ids' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'附加信息', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_client', +'COLUMN', N'additional_information' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_client', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_client', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_client', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_client', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_client', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'OAuth2 客户端表', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_client' +GO + + +-- ---------------------------- +-- Records of system_oauth2_client +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[system_oauth2_client] ON +GO + +INSERT INTO [dbo].[system_oauth2_client] ([id], [client_id], [secret], [name], [logo], [description], [status], [access_token_validity_seconds], [refresh_token_validity_seconds], [redirect_uris], [auto_approve_scopes], [authorized_grant_types], [scopes], [authorities], [resource_ids], [additional_information], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1', N'default', N'admin123', N'闻荫源码', N'http://test.win.iocoder.cn/a5e2e244368878a366b516805a4aabf1.png', N'我是描述', N'0', N'180', N'8640', N'["https://www.iocoder.cn","https://doc.iocoder.cn"]', N'', N'["password","authorization_code","implicit","refresh_token"]', N'["user.read", "user.write"]', N'["system:user:query"]', N'[]', N'{}', N'1', N'2022-05-11 21:47:12.0000000', N'1', N'2022-05-13 10:50:16.9620000', N'0') +GO + +SET IDENTITY_INSERT [dbo].[system_oauth2_client] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for system_oauth2_code +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[system_oauth2_code]') AND type IN ('U')) + DROP TABLE [dbo].[system_oauth2_code] +GO + +CREATE TABLE [dbo].[system_oauth2_code] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [user_id] bigint NOT NULL, + [user_type] tinyint NOT NULL, + [code] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [client_id] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [scopes] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [expires_time] datetime2(7) NOT NULL, + [redirect_uri] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [state] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS DEFAULT '' NOT NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL, + [tenant_id] bigint NOT NULL +) +GO + +ALTER TABLE [dbo].[system_oauth2_code] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'编号', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_code', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户编号', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_code', +'COLUMN', N'user_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户类型', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_code', +'COLUMN', N'user_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'授权码', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_code', +'COLUMN', N'code' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'客户端编号', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_code', +'COLUMN', N'client_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'授权范围', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_code', +'COLUMN', N'scopes' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'过期时间', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_code', +'COLUMN', N'expires_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'可重定向的 URI 地址', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_code', +'COLUMN', N'redirect_uri' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'状态', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_code', +'COLUMN', N'state' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_code', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_code', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_code', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_code', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_code', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户编号', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_code', +'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'OAuth2 授权码表', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_code' +GO + + +-- ---------------------------- +-- Records of system_oauth2_code +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[system_oauth2_code] ON +GO + +SET IDENTITY_INSERT [dbo].[system_oauth2_code] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for system_oauth2_refresh_token +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[system_oauth2_refresh_token]') AND type IN ('U')) + DROP TABLE [dbo].[system_oauth2_refresh_token] +GO + +CREATE TABLE [dbo].[system_oauth2_refresh_token] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [user_id] bigint NOT NULL, + [refresh_token] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [user_type] tinyint NOT NULL, + [client_id] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [expires_time] datetime2(7) NOT NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL, + [tenant_id] bigint NOT NULL, + [scopes] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS DEFAULT '' NULL +) +GO + +ALTER TABLE [dbo].[system_oauth2_refresh_token] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'编号', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_refresh_token', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户编号', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_refresh_token', +'COLUMN', N'user_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'刷新令牌', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_refresh_token', +'COLUMN', N'refresh_token' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户类型', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_refresh_token', +'COLUMN', N'user_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'客户端编号', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_refresh_token', +'COLUMN', N'client_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'过期时间', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_refresh_token', +'COLUMN', N'expires_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_refresh_token', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_refresh_token', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_refresh_token', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_refresh_token', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_refresh_token', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户编号', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_refresh_token', +'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'授权范围', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_refresh_token', +'COLUMN', N'scopes' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'刷新令牌', +'SCHEMA', N'dbo', +'TABLE', N'system_oauth2_refresh_token' +GO + + +-- ---------------------------- +-- Records of system_oauth2_refresh_token +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[system_oauth2_refresh_token] ON +GO + +SET IDENTITY_INSERT [dbo].[system_oauth2_refresh_token] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for system_operate_log +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[system_operate_log]') AND type IN ('U')) + DROP TABLE [dbo].[system_operate_log] +GO + +CREATE TABLE [dbo].[system_operate_log] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [trace_id] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [user_id] bigint NOT NULL, + [user_type] tinyint NOT NULL, + [module] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [name] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [type] bigint NOT NULL, + [content] nvarchar(2000) COLLATE SQL_Latin1_General_CP1_CI_AS DEFAULT '' NOT NULL, + [exts] nvarchar(512) COLLATE SQL_Latin1_General_CP1_CI_AS DEFAULT '' NOT NULL, + [request_method] nvarchar(16) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [request_url] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [user_ip] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [user_agent] nvarchar(200) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [java_method] nvarchar(512) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [java_method_args] nvarchar(max) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [start_time] datetime2(7) NOT NULL, + [duration] int NOT NULL, + [result_code] int NOT NULL, + [result_msg] nvarchar(512) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [result_data] nvarchar(4000) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [tenant_id] bigint NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL +) +GO + +ALTER TABLE [dbo].[system_operate_log] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'日志主键', +'SCHEMA', N'dbo', +'TABLE', N'system_operate_log', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'链路追踪编号', +'SCHEMA', N'dbo', +'TABLE', N'system_operate_log', +'COLUMN', N'trace_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户编号', +'SCHEMA', N'dbo', +'TABLE', N'system_operate_log', +'COLUMN', N'user_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户类型', +'SCHEMA', N'dbo', +'TABLE', N'system_operate_log', +'COLUMN', N'user_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'模块标题', +'SCHEMA', N'dbo', +'TABLE', N'system_operate_log', +'COLUMN', N'module' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'操作名', +'SCHEMA', N'dbo', +'TABLE', N'system_operate_log', +'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'操作分类', +'SCHEMA', N'dbo', +'TABLE', N'system_operate_log', +'COLUMN', N'type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'操作内容', +'SCHEMA', N'dbo', +'TABLE', N'system_operate_log', +'COLUMN', N'content' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'拓展字段', +'SCHEMA', N'dbo', +'TABLE', N'system_operate_log', +'COLUMN', N'exts' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'请求方法名', +'SCHEMA', N'dbo', +'TABLE', N'system_operate_log', +'COLUMN', N'request_method' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'请求地址', +'SCHEMA', N'dbo', +'TABLE', N'system_operate_log', +'COLUMN', N'request_url' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户 IP', +'SCHEMA', N'dbo', +'TABLE', N'system_operate_log', +'COLUMN', N'user_ip' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'浏览器 UA', +'SCHEMA', N'dbo', +'TABLE', N'system_operate_log', +'COLUMN', N'user_agent' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'Java 方法名', +'SCHEMA', N'dbo', +'TABLE', N'system_operate_log', +'COLUMN', N'java_method' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'Java 方法的参数', +'SCHEMA', N'dbo', +'TABLE', N'system_operate_log', +'COLUMN', N'java_method_args' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'操作时间', +'SCHEMA', N'dbo', +'TABLE', N'system_operate_log', +'COLUMN', N'start_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'执行时长', +'SCHEMA', N'dbo', +'TABLE', N'system_operate_log', +'COLUMN', N'duration' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'结果码', +'SCHEMA', N'dbo', +'TABLE', N'system_operate_log', +'COLUMN', N'result_code' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'结果提示', +'SCHEMA', N'dbo', +'TABLE', N'system_operate_log', +'COLUMN', N'result_msg' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'结果数据', +'SCHEMA', N'dbo', +'TABLE', N'system_operate_log', +'COLUMN', N'result_data' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'system_operate_log', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'system_operate_log', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'system_operate_log', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'system_operate_log', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户编号', +'SCHEMA', N'dbo', +'TABLE', N'system_operate_log', +'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'system_operate_log', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'操作日志记录', +'SCHEMA', N'dbo', +'TABLE', N'system_operate_log' +GO + + +-- ---------------------------- +-- Records of system_operate_log +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[system_operate_log] ON +GO + +SET IDENTITY_INSERT [dbo].[system_operate_log] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for system_post +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[system_post]') AND type IN ('U')) + DROP TABLE [dbo].[system_post] +GO + +CREATE TABLE [dbo].[system_post] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [code] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [name] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [sort] int NOT NULL, + [status] tinyint NOT NULL, + [remark] nvarchar(500) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [tenant_id] bigint NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL +) +GO + +ALTER TABLE [dbo].[system_post] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'岗位ID', +'SCHEMA', N'dbo', +'TABLE', N'system_post', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'岗位编码', +'SCHEMA', N'dbo', +'TABLE', N'system_post', +'COLUMN', N'code' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'岗位名称', +'SCHEMA', N'dbo', +'TABLE', N'system_post', +'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'显示顺序', +'SCHEMA', N'dbo', +'TABLE', N'system_post', +'COLUMN', N'sort' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'状态(0正常 1停用)', +'SCHEMA', N'dbo', +'TABLE', N'system_post', +'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'备注', +'SCHEMA', N'dbo', +'TABLE', N'system_post', +'COLUMN', N'remark' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'system_post', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'system_post', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'system_post', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'system_post', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户编号', +'SCHEMA', N'dbo', +'TABLE', N'system_post', +'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'system_post', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'岗位信息表', +'SCHEMA', N'dbo', +'TABLE', N'system_post' +GO + + +-- ---------------------------- +-- Records of system_post +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[system_post] ON +GO + +INSERT INTO [dbo].[system_post] ([id], [code], [name], [sort], [status], [remark], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'1', N'ceo', N'董事长', N'1', N'0', N'', N'admin', N'2021-01-06 17:03:48.0000000', N'1', N'2022-04-19 16:53:39.0000000', N'1', N'0') +GO + +INSERT INTO [dbo].[system_post] ([id], [code], [name], [sort], [status], [remark], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'2', N'se', N'项目经理', N'2', N'0', N'', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2021-12-12 10:47:47.0000000', N'1', N'0') +GO + +INSERT INTO [dbo].[system_post] ([id], [code], [name], [sort], [status], [remark], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'4', N'user', N'普通员工', N'4', N'0', N'111', N'admin', N'2021-01-05 17:03:48.0000000', N'1', N'2022-04-20 00:59:35.0000000', N'1', N'0') +GO + +SET IDENTITY_INSERT [dbo].[system_post] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for system_role +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[system_role]') AND type IN ('U')) + DROP TABLE [dbo].[system_role] +GO + +CREATE TABLE [dbo].[system_role] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [name] nvarchar(30) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [code] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [sort] int NOT NULL, + [data_scope] tinyint NOT NULL, + [data_scope_dept_ids] nvarchar(500) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [status] tinyint NOT NULL, + [type] tinyint NOT NULL, + [remark] nvarchar(500) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [tenant_id] bigint NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL +) +GO + +ALTER TABLE [dbo].[system_role] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'角色ID', +'SCHEMA', N'dbo', +'TABLE', N'system_role', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'角色名称', +'SCHEMA', N'dbo', +'TABLE', N'system_role', +'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'角色权限字符串', +'SCHEMA', N'dbo', +'TABLE', N'system_role', +'COLUMN', N'code' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'显示顺序', +'SCHEMA', N'dbo', +'TABLE', N'system_role', +'COLUMN', N'sort' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)', +'SCHEMA', N'dbo', +'TABLE', N'system_role', +'COLUMN', N'data_scope' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'数据范围(指定部门数组)', +'SCHEMA', N'dbo', +'TABLE', N'system_role', +'COLUMN', N'data_scope_dept_ids' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'角色状态(0正常 1停用)', +'SCHEMA', N'dbo', +'TABLE', N'system_role', +'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'角色类型', +'SCHEMA', N'dbo', +'TABLE', N'system_role', +'COLUMN', N'type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'备注', +'SCHEMA', N'dbo', +'TABLE', N'system_role', +'COLUMN', N'remark' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'system_role', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'system_role', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'system_role', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'system_role', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户编号', +'SCHEMA', N'dbo', +'TABLE', N'system_role', +'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'system_role', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'角色信息表', +'SCHEMA', N'dbo', +'TABLE', N'system_role' +GO + + +-- ---------------------------- +-- Records of system_role +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[system_role] ON +GO + +INSERT INTO [dbo].[system_role] ([id], [name], [code], [sort], [data_scope], [data_scope_dept_ids], [status], [type], [remark], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'1', N'超级管理员', N'super_admin', N'1', N'1', N'', N'0', N'1', N'超级管理员', N'admin', N'2021-01-05 17:03:48.0000000', N'', N'2022-02-22 05:08:21.0000000', N'1', N'0') +GO + +INSERT INTO [dbo].[system_role] ([id], [name], [code], [sort], [data_scope], [data_scope_dept_ids], [status], [type], [remark], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'2', N'普通角色', N'common', N'2', N'2', N'', N'0', N'1', N'普通角色', N'admin', N'2021-01-05 17:03:48.0000000', N'', N'2022-02-22 05:08:20.0000000', N'1', N'0') +GO + +INSERT INTO [dbo].[system_role] ([id], [name], [code], [sort], [data_scope], [data_scope_dept_ids], [status], [type], [remark], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'101', N'测试账号', N'test', N'0', N'1', N'[]', N'0', N'2', N'132', N'', N'2021-01-06 13:49:35.0000000', N'1', N'2022-05-02 02:32:06.6180000', N'1', N'0') +GO + +INSERT INTO [dbo].[system_role] ([id], [name], [code], [sort], [data_scope], [data_scope_dept_ids], [status], [type], [remark], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'109', N'租户管理员', N'tenant_admin', N'0', N'1', N'', N'0', N'1', N'系统自动生成', N'1', N'2022-02-22 00:56:14.0000000', N'1', N'2022-02-22 00:56:14.0000000', N'121', N'0') +GO + +INSERT INTO [dbo].[system_role] ([id], [name], [code], [sort], [data_scope], [data_scope_dept_ids], [status], [type], [remark], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'110', N'测试角色', N'test', N'0', N'1', N'[]', N'0', N'2', N'嘿嘿', N'110', N'2022-02-23 00:14:34.0000000', N'110', N'2022-02-23 13:14:58.0000000', N'121', N'0') +GO + +INSERT INTO [dbo].[system_role] ([id], [name], [code], [sort], [data_scope], [data_scope_dept_ids], [status], [type], [remark], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'111', N'租户管理员', N'tenant_admin', N'0', N'1', N'', N'0', N'1', N'系统自动生成', N'1', N'2022-03-07 21:37:58.0000000', N'1', N'2022-03-07 21:37:58.0000000', N'122', N'0') +GO + +SET IDENTITY_INSERT [dbo].[system_role] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for system_role_menu +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[system_role_menu]') AND type IN ('U')) + DROP TABLE [dbo].[system_role_menu] +GO + +CREATE TABLE [dbo].[system_role_menu] ( + [role_id] bigint NOT NULL, + [menu_id] bigint NOT NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [tenant_id] bigint DEFAULT 0 NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL, + [id] bigint IDENTITY(1,1) NOT NULL +) +GO + +ALTER TABLE [dbo].[system_role_menu] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'角色ID', +'SCHEMA', N'dbo', +'TABLE', N'system_role_menu', +'COLUMN', N'role_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'菜单ID', +'SCHEMA', N'dbo', +'TABLE', N'system_role_menu', +'COLUMN', N'menu_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'system_role_menu', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'system_role_menu', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'system_role_menu', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'system_role_menu', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户编号', +'SCHEMA', N'dbo', +'TABLE', N'system_role_menu', +'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'system_role_menu', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'自增编号', +'SCHEMA', N'dbo', +'TABLE', N'system_role_menu', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'角色和菜单关联表', +'SCHEMA', N'dbo', +'TABLE', N'system_role_menu' +GO + + +-- ---------------------------- +-- Records of system_role_menu +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[system_role_menu] ON +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'109', N'1', N'1', N'2022-02-22 00:56:14.0000000', N'1', N'2022-02-22 00:56:14.0000000', N'121', N'0', N'1') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'2', N'1', N'1', N'2022-02-22 13:09:12.0000000', N'1', N'2022-02-22 13:09:12.0000000', N'1', N'0', N'2') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'2', N'1093', N'1', N'2022-02-22 13:09:12.0000000', N'1', N'2022-02-22 13:09:12.0000000', N'1', N'0', N'3') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'2', N'1094', N'1', N'2022-02-22 13:09:12.0000000', N'1', N'2022-02-22 13:09:12.0000000', N'1', N'0', N'4') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'2', N'1100', N'1', N'2022-02-22 13:09:12.0000000', N'1', N'2022-02-22 13:09:12.0000000', N'1', N'0', N'5') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'2', N'1107', N'1', N'2022-02-22 13:09:12.0000000', N'1', N'2022-02-22 13:09:12.0000000', N'1', N'0', N'6') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'2', N'1110', N'1', N'2022-02-22 13:09:12.0000000', N'1', N'2022-02-22 13:09:12.0000000', N'1', N'0', N'7') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'2', N'1117', N'1', N'2022-02-22 13:09:12.0000000', N'1', N'2022-02-22 13:09:12.0000000', N'1', N'0', N'8') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'2', N'100', N'1', N'2022-02-22 13:09:12.0000000', N'1', N'2022-02-22 13:09:12.0000000', N'1', N'0', N'9') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'2', N'101', N'1', N'2022-02-22 13:09:12.0000000', N'1', N'2022-02-22 13:09:12.0000000', N'1', N'0', N'10') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'2', N'102', N'1', N'2022-02-22 13:09:12.0000000', N'1', N'2022-02-22 13:09:12.0000000', N'1', N'0', N'11') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'2', N'1126', N'1', N'2022-02-22 13:09:12.0000000', N'1', N'2022-02-22 13:09:12.0000000', N'1', N'0', N'12') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'2', N'103', N'1', N'2022-02-22 13:09:12.0000000', N'1', N'2022-02-22 13:09:12.0000000', N'1', N'0', N'13') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'2', N'104', N'1', N'2022-02-22 13:09:12.0000000', N'1', N'2022-02-22 13:09:12.0000000', N'1', N'0', N'14') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'2', N'105', N'1', N'2022-02-22 13:09:12.0000000', N'1', N'2022-02-22 13:09:12.0000000', N'1', N'0', N'15') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'2', N'107', N'1', N'2022-02-22 13:09:12.0000000', N'1', N'2022-02-22 13:09:12.0000000', N'1', N'0', N'16') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'2', N'108', N'1', N'2022-02-22 13:09:12.0000000', N'1', N'2022-02-22 13:09:12.0000000', N'1', N'0', N'17') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'2', N'109', N'1', N'2022-02-22 13:09:12.0000000', N'1', N'2022-02-22 13:09:12.0000000', N'1', N'0', N'18') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'2', N'1138', N'1', N'2022-02-22 13:09:12.0000000', N'1', N'2022-02-22 13:09:12.0000000', N'1', N'0', N'19') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'2', N'1224', N'1', N'2022-02-22 13:09:12.0000000', N'1', N'2022-02-22 13:09:12.0000000', N'1', N'0', N'20') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'2', N'1225', N'1', N'2022-02-22 13:09:12.0000000', N'1', N'2022-02-22 13:09:12.0000000', N'1', N'0', N'21') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'2', N'500', N'1', N'2022-02-22 13:09:12.0000000', N'1', N'2022-02-22 13:09:12.0000000', N'1', N'0', N'22') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'2', N'501', N'1', N'2022-02-22 13:09:12.0000000', N'1', N'2022-02-22 13:09:12.0000000', N'1', N'0', N'23') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'2', N'2', N'1', N'2022-02-22 13:16:57.0000000', N'1', N'2022-02-22 13:16:57.0000000', N'1', N'0', N'24') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'2', N'1077', N'1', N'2022-02-22 13:16:57.0000000', N'1', N'2022-02-22 13:16:57.0000000', N'1', N'0', N'25') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'2', N'1078', N'1', N'2022-02-22 13:16:57.0000000', N'1', N'2022-02-22 13:16:57.0000000', N'1', N'0', N'26') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'2', N'1083', N'1', N'2022-02-22 13:16:57.0000000', N'1', N'2022-02-22 13:16:57.0000000', N'1', N'0', N'27') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'2', N'1084', N'1', N'2022-02-22 13:16:57.0000000', N'1', N'2022-02-22 13:16:57.0000000', N'1', N'0', N'28') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'2', N'1090', N'1', N'2022-02-22 13:16:57.0000000', N'1', N'2022-02-22 13:16:57.0000000', N'1', N'0', N'29') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'2', N'106', N'1', N'2022-02-22 13:16:57.0000000', N'1', N'2022-02-22 13:16:57.0000000', N'1', N'0', N'30') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'2', N'110', N'1', N'2022-02-22 13:16:57.0000000', N'1', N'2022-02-22 13:16:57.0000000', N'1', N'0', N'31') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'2', N'111', N'1', N'2022-02-22 13:16:57.0000000', N'1', N'2022-02-22 13:16:57.0000000', N'1', N'0', N'32') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'2', N'112', N'1', N'2022-02-22 13:16:57.0000000', N'1', N'2022-02-22 13:16:57.0000000', N'1', N'0', N'33') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'2', N'113', N'1', N'2022-02-22 13:16:57.0000000', N'1', N'2022-02-22 13:16:57.0000000', N'1', N'0', N'34') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'110', N'1', N'110', N'2022-02-23 00:23:55.0000000', N'110', N'2022-02-23 00:23:55.0000000', N'121', N'0', N'35') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'109', N'103', N'1', N'2022-02-23 19:32:14.0000000', N'1', N'2022-02-23 19:32:14.0000000', N'121', N'0', N'36') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'109', N'104', N'1', N'2022-02-23 19:32:14.0000000', N'1', N'2022-02-23 19:32:14.0000000', N'121', N'0', N'37') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'1', N'1', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'0', N'38') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'1', N'2', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'0', N'39') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'1', N'1077', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'0', N'40') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'1', N'1078', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'0', N'41') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'1', N'1083', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'0', N'42') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'1', N'1084', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'0', N'43') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'1', N'1090', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'0', N'44') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'1', N'1093', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'0', N'45') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'1', N'1094', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'0', N'46') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'1', N'1100', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'0', N'47') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'1', N'1107', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'0', N'48') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'1', N'1110', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'0', N'49') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'1', N'1117', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'0', N'50') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'1', N'100', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'0', N'51') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'1', N'101', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'0', N'52') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'1', N'102', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'0', N'53') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'1', N'1126', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'0', N'54') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'1', N'103', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'0', N'55') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'1', N'104', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'0', N'56') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'1', N'105', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'0', N'57') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'1', N'106', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'0', N'58') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'1', N'107', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'0', N'59') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'1', N'108', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'0', N'60') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'1', N'109', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'0', N'61') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'1', N'110', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'0', N'62') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'1', N'111', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'0', N'63') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'1', N'112', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'0', N'64') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'1', N'113', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'0', N'65') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'1', N'1138', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'0', N'66') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'1', N'1224', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'0', N'67') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'1', N'1225', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'0', N'68') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'1', N'500', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'0', N'69') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'1', N'501', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'2022-02-23 20:03:57.0000000', N'1', N'0', N'70') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'109', N'1024', N'1', N'2022-02-23 20:30:14.0000000', N'1', N'2022-02-23 20:30:14.0000000', N'121', N'0', N'71') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'109', N'1025', N'1', N'2022-02-23 20:30:14.0000000', N'1', N'2022-02-23 20:30:14.0000000', N'121', N'0', N'72') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'109', N'1017', N'1', N'2022-02-23 20:30:14.0000000', N'1', N'2022-02-23 20:30:14.0000000', N'121', N'0', N'73') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'109', N'1018', N'1', N'2022-02-23 20:30:14.0000000', N'1', N'2022-02-23 20:30:14.0000000', N'121', N'0', N'74') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'109', N'1019', N'1', N'2022-02-23 20:30:14.0000000', N'1', N'2022-02-23 20:30:14.0000000', N'121', N'0', N'75') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'109', N'1020', N'1', N'2022-02-23 20:30:14.0000000', N'1', N'2022-02-23 20:30:14.0000000', N'121', N'0', N'76') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'109', N'1021', N'1', N'2022-02-23 20:30:14.0000000', N'1', N'2022-02-23 20:30:14.0000000', N'121', N'0', N'77') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'109', N'1022', N'1', N'2022-02-23 20:30:14.0000000', N'1', N'2022-02-23 20:30:14.0000000', N'121', N'0', N'78') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'109', N'1023', N'1', N'2022-02-23 20:30:14.0000000', N'1', N'2022-02-23 20:30:14.0000000', N'121', N'0', N'79') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'111', N'1024', N'1', N'2022-03-07 21:37:58.0000000', N'1', N'2022-03-07 21:37:58.0000000', N'122', N'0', N'80') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'111', N'1025', N'1', N'2022-03-07 21:37:58.0000000', N'1', N'2022-03-07 21:37:58.0000000', N'122', N'0', N'81') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'111', N'1', N'1', N'2022-03-07 21:37:58.0000000', N'1', N'2022-03-07 21:37:58.0000000', N'122', N'0', N'82') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'111', N'103', N'1', N'2022-03-07 21:37:58.0000000', N'1', N'2022-03-07 21:37:58.0000000', N'122', N'0', N'83') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'111', N'104', N'1', N'2022-03-07 21:37:58.0000000', N'1', N'2022-03-07 21:37:58.0000000', N'122', N'0', N'84') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'111', N'1017', N'1', N'2022-03-07 21:37:58.0000000', N'1', N'2022-03-07 21:37:58.0000000', N'122', N'0', N'85') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'111', N'1018', N'1', N'2022-03-07 21:37:58.0000000', N'1', N'2022-03-07 21:37:58.0000000', N'122', N'0', N'86') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'111', N'1019', N'1', N'2022-03-07 21:37:58.0000000', N'1', N'2022-03-07 21:37:58.0000000', N'122', N'0', N'87') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'111', N'1020', N'1', N'2022-03-07 21:37:58.0000000', N'1', N'2022-03-07 21:37:58.0000000', N'122', N'0', N'88') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'111', N'1021', N'1', N'2022-03-07 21:37:58.0000000', N'1', N'2022-03-07 21:37:58.0000000', N'122', N'0', N'89') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'111', N'1022', N'1', N'2022-03-07 21:37:58.0000000', N'1', N'2022-03-07 21:37:58.0000000', N'122', N'0', N'90') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'111', N'1023', N'1', N'2022-03-07 21:37:58.0000000', N'1', N'2022-03-07 21:37:58.0000000', N'122', N'0', N'91') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'109', N'102', N'1', N'2022-03-19 18:39:13.0000000', N'1', N'2022-03-19 18:39:13.0000000', N'121', N'0', N'92') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'109', N'1013', N'1', N'2022-03-19 18:39:13.0000000', N'1', N'2022-03-19 18:39:13.0000000', N'121', N'0', N'93') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'109', N'1014', N'1', N'2022-03-19 18:39:13.0000000', N'1', N'2022-03-19 18:39:13.0000000', N'121', N'0', N'94') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'109', N'1015', N'1', N'2022-03-19 18:39:13.0000000', N'1', N'2022-03-19 18:39:13.0000000', N'121', N'0', N'95') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'109', N'1016', N'1', N'2022-03-19 18:39:13.0000000', N'1', N'2022-03-19 18:39:13.0000000', N'121', N'0', N'96') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'111', N'102', N'1', N'2022-03-19 18:39:13.0000000', N'1', N'2022-03-19 18:39:13.0000000', N'122', N'0', N'97') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'111', N'1013', N'1', N'2022-03-19 18:39:13.0000000', N'1', N'2022-03-19 18:39:13.0000000', N'122', N'0', N'98') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'111', N'1014', N'1', N'2022-03-19 18:39:13.0000000', N'1', N'2022-03-19 18:39:13.0000000', N'122', N'0', N'99') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'111', N'1015', N'1', N'2022-03-19 18:39:13.0000000', N'1', N'2022-03-19 18:39:13.0000000', N'122', N'0', N'100') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'111', N'1016', N'1', N'2022-03-19 18:39:13.0000000', N'1', N'2022-03-19 18:39:13.0000000', N'122', N'0', N'101') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1216', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'0', N'102') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1217', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'0', N'103') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1218', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'0', N'104') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1219', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'0', N'105') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1220', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'0', N'106') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1221', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'0', N'107') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'5', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'0', N'108') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1222', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'0', N'109') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1118', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'0', N'110') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1119', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'0', N'111') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1120', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'0', N'112') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1185', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'0', N'113') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1186', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'0', N'114') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1187', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'0', N'115') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1188', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'0', N'116') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1189', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'0', N'117') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1190', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'0', N'118') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1191', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'0', N'119') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1192', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'0', N'120') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1193', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'0', N'121') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1194', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'0', N'122') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1195', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'0', N'123') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1196', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'0', N'124') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1197', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'0', N'125') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1198', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'0', N'126') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1199', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'0', N'127') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1200', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'0', N'128') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1201', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'0', N'129') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1202', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'0', N'130') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1207', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'0', N'131') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1208', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'0', N'132') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1209', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'0', N'133') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1210', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'0', N'134') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1211', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'0', N'135') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1212', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'0', N'136') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1213', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'0', N'137') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1215', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'2022-03-19 21:45:52.0000000', N'1', N'0', N'138') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'2', N'1', N'2022-04-01 22:21:24.0000000', N'1', N'2022-04-01 22:21:24.0000000', N'1', N'0', N'139') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1031', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'140') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1032', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'141') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1033', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'142') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1034', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'143') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1035', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'144') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1050', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'145') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1051', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'146') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1052', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'147') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1053', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'148') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1054', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'149') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1056', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'150') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1057', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'151') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1058', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'152') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1059', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'153') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1060', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'154') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1066', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'155') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1067', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'156') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1070', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'157') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1071', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'158') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1072', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'159') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1073', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'160') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1074', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'161') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1075', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'162') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1076', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'163') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1077', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'164') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1078', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'165') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1082', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'166') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1083', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'167') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1084', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'168') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1085', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'169') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1086', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'170') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1087', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'171') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1088', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'172') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1089', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'173') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1090', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'174') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1091', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'175') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1092', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'176') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1237', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'177') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1238', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'178') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1239', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'179') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1240', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'180') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1241', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'181') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1242', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'182') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'1243', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'183') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'106', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'184') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'110', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'185') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'111', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'186') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'112', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'187') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'113', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'188') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'114', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'189') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'115', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'190') +GO + +INSERT INTO [dbo].[system_role_menu] ([role_id], [menu_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted], [id]) VALUES (N'101', N'116', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'2022-04-01 22:21:37.0000000', N'1', N'0', N'191') +GO + +SET IDENTITY_INSERT [dbo].[system_role_menu] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for system_sensitive_word +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[system_sensitive_word]') AND type IN ('U')) + DROP TABLE [dbo].[system_sensitive_word] +GO + +CREATE TABLE [dbo].[system_sensitive_word] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [name] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [description] nvarchar(512) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [tags] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [status] tinyint NOT NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL +) +GO + +ALTER TABLE [dbo].[system_sensitive_word] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'编号', +'SCHEMA', N'dbo', +'TABLE', N'system_sensitive_word', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'敏感词', +'SCHEMA', N'dbo', +'TABLE', N'system_sensitive_word', +'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'描述', +'SCHEMA', N'dbo', +'TABLE', N'system_sensitive_word', +'COLUMN', N'description' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'标签数组', +'SCHEMA', N'dbo', +'TABLE', N'system_sensitive_word', +'COLUMN', N'tags' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'状态', +'SCHEMA', N'dbo', +'TABLE', N'system_sensitive_word', +'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'system_sensitive_word', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'system_sensitive_word', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'system_sensitive_word', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'system_sensitive_word', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'system_sensitive_word', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'敏感词', +'SCHEMA', N'dbo', +'TABLE', N'system_sensitive_word' +GO + + +-- ---------------------------- +-- Records of system_sensitive_word +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[system_sensitive_word] ON +GO + +INSERT INTO [dbo].[system_sensitive_word] ([id], [name], [description], [tags], [status], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'3', N'土豆', N'好呀', N'蔬菜,短信', N'0', N'1', N'2022-04-08 21:07:12.0000000', N'1', N'2022-04-09 10:28:14.0000000', N'0') +GO + +INSERT INTO [dbo].[system_sensitive_word] ([id], [name], [description], [tags], [status], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'4', N'XXX', NULL, N'短信', N'0', N'1', N'2022-04-08 21:27:49.0000000', N'1', N'2022-04-08 21:27:49.0000000', N'0') +GO + +SET IDENTITY_INSERT [dbo].[system_sensitive_word] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for system_sms_channel +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[system_sms_channel]') AND type IN ('U')) + DROP TABLE [dbo].[system_sms_channel] +GO + +CREATE TABLE [dbo].[system_sms_channel] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [signature] nvarchar(12) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [code] nvarchar(63) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [status] tinyint NOT NULL, + [remark] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [api_key] nvarchar(128) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [api_secret] nvarchar(128) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [callback_url] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL +) +GO + +ALTER TABLE [dbo].[system_sms_channel] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'编号', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_channel', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'短信签名', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_channel', +'COLUMN', N'signature' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'渠道编码', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_channel', +'COLUMN', N'code' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'开启状态', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_channel', +'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'备注', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_channel', +'COLUMN', N'remark' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'短信 API 的账号', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_channel', +'COLUMN', N'api_key' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'短信 API 的秘钥', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_channel', +'COLUMN', N'api_secret' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'短信发送回调 URL', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_channel', +'COLUMN', N'callback_url' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_channel', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_channel', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_channel', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_channel', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_channel', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'短信渠道', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_channel' +GO + + +-- ---------------------------- +-- Records of system_sms_channel +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[system_sms_channel] ON +GO + +INSERT INTO [dbo].[system_sms_channel] ([id], [signature], [code], [status], [remark], [api_key], [api_secret], [callback_url], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'2', N'Ballcat', N'ALIYUN', N'0', N'啦啦啦', N'LTAI5tCnKso2uG3kJ5gRav88', N'fGJ5SNXL7P1NHNRmJ7DJaMJGPyE55C', NULL, N'', N'2021-03-31 11:53:10.0000000', N'1', N'2021-04-14 00:08:37.0000000', N'0') +GO + +INSERT INTO [dbo].[system_sms_channel] ([id], [signature], [code], [status], [remark], [api_key], [api_secret], [callback_url], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'4', N'测试渠道', N'DEBUG_DING_TALK', N'0', N'123', N'696b5d8ead48071237e4aa5861ff08dbadb2b4ded1c688a7b7c9afc615579859', N'SEC5c4e5ff888bc8a9923ae47f59e7ccd30af1f14d93c55b4e2c9cb094e35aeed67', NULL, N'1', N'2021-04-13 00:23:14.0000000', N'1', N'2022-03-27 20:29:49.0000000', N'0') +GO + +INSERT INTO [dbo].[system_sms_channel] ([id], [signature], [code], [status], [remark], [api_key], [api_secret], [callback_url], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'6', N'测试演示', N'DEBUG_DING_TALK', N'0', NULL, N'696b5d8ead48071237e4aa5861ff08dbadb2b4ded1c688a7b7c9afc615579859', N'SEC5c4e5ff888bc8a9923ae47f59e7ccd30af1f14d93c55b4e2c9cb094e35aeed67', NULL, N'1', N'2022-04-10 23:07:59.0000000', N'1', N'2022-04-10 23:07:59.0000000', N'0') +GO + +SET IDENTITY_INSERT [dbo].[system_sms_channel] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for system_sms_code +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[system_sms_code]') AND type IN ('U')) + DROP TABLE [dbo].[system_sms_code] +GO + +CREATE TABLE [dbo].[system_sms_code] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [mobile] nvarchar(11) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [code] nvarchar(6) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [create_ip] nvarchar(15) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [scene] tinyint NOT NULL, + [today_index] tinyint NOT NULL, + [used] tinyint NOT NULL, + [used_time] datetime2(7) NULL, + [used_ip] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [tenant_id] bigint NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL +) +GO + +ALTER TABLE [dbo].[system_sms_code] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'编号', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_code', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'手机号', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_code', +'COLUMN', N'mobile' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'验证码', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_code', +'COLUMN', N'code' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建 IP', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_code', +'COLUMN', N'create_ip' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'发送场景', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_code', +'COLUMN', N'scene' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'今日发送的第几条', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_code', +'COLUMN', N'today_index' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否使用', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_code', +'COLUMN', N'used' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'使用时间', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_code', +'COLUMN', N'used_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'使用 IP', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_code', +'COLUMN', N'used_ip' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_code', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_code', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_code', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_code', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户编号', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_code', +'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_code', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'手机验证码', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_code' +GO + + +-- ---------------------------- +-- Records of system_sms_code +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[system_sms_code] ON +GO + +SET IDENTITY_INSERT [dbo].[system_sms_code] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for system_sms_log +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[system_sms_log]') AND type IN ('U')) + DROP TABLE [dbo].[system_sms_log] +GO + +CREATE TABLE [dbo].[system_sms_log] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [channel_id] bigint NOT NULL, + [channel_code] nvarchar(63) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [template_id] bigint NOT NULL, + [template_code] nvarchar(63) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [template_type] tinyint NOT NULL, + [template_content] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [template_params] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [api_template_id] nvarchar(63) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [mobile] nvarchar(11) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [user_id] bigint NULL, + [user_type] tinyint NULL, + [send_status] tinyint NOT NULL, + [send_time] datetime2(7) NULL, + [send_code] int NULL, + [send_msg] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [api_send_code] nvarchar(63) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [api_send_msg] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [api_request_id] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [api_serial_no] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [receive_status] tinyint NOT NULL, + [receive_time] datetime2(7) NULL, + [api_receive_code] nvarchar(63) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [api_receive_msg] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL +) +GO + +ALTER TABLE [dbo].[system_sms_log] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'编号', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_log', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'短信渠道编号', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_log', +'COLUMN', N'channel_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'短信渠道编码', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_log', +'COLUMN', N'channel_code' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'模板编号', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_log', +'COLUMN', N'template_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'模板编码', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_log', +'COLUMN', N'template_code' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'短信类型', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_log', +'COLUMN', N'template_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'短信内容', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_log', +'COLUMN', N'template_content' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'短信参数', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_log', +'COLUMN', N'template_params' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'短信 API 的模板编号', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_log', +'COLUMN', N'api_template_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'手机号', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_log', +'COLUMN', N'mobile' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户编号', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_log', +'COLUMN', N'user_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户类型', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_log', +'COLUMN', N'user_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'发送状态', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_log', +'COLUMN', N'send_status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'发送时间', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_log', +'COLUMN', N'send_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'发送结果的编码', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_log', +'COLUMN', N'send_code' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'发送结果的提示', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_log', +'COLUMN', N'send_msg' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'短信 API 发送结果的编码', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_log', +'COLUMN', N'api_send_code' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'短信 API 发送失败的提示', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_log', +'COLUMN', N'api_send_msg' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'短信 API 发送返回的唯一请求 ID', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_log', +'COLUMN', N'api_request_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'短信 API 发送返回的序号', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_log', +'COLUMN', N'api_serial_no' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'接收状态', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_log', +'COLUMN', N'receive_status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'接收时间', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_log', +'COLUMN', N'receive_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'API 接收结果的编码', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_log', +'COLUMN', N'api_receive_code' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'API 接收结果的说明', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_log', +'COLUMN', N'api_receive_msg' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_log', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_log', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_log', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_log', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_log', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'短信日志', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_log' +GO + + +-- ---------------------------- +-- Records of system_sms_log +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[system_sms_log] ON +GO + +SET IDENTITY_INSERT [dbo].[system_sms_log] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for system_sms_template +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[system_sms_template]') AND type IN ('U')) + DROP TABLE [dbo].[system_sms_template] +GO + +CREATE TABLE [dbo].[system_sms_template] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [type] tinyint NOT NULL, + [status] tinyint NOT NULL, + [code] nvarchar(63) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [name] nvarchar(63) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [content] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [params] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [remark] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [api_template_id] nvarchar(63) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [channel_id] bigint NOT NULL, + [channel_code] nvarchar(63) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL +) +GO + +ALTER TABLE [dbo].[system_sms_template] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'编号', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_template', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'短信签名', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_template', +'COLUMN', N'type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'开启状态', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_template', +'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'模板编码', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_template', +'COLUMN', N'code' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'模板名称', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_template', +'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'模板内容', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_template', +'COLUMN', N'content' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'参数数组', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_template', +'COLUMN', N'params' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'备注', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_template', +'COLUMN', N'remark' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'短信 API 的模板编号', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_template', +'COLUMN', N'api_template_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'短信渠道编号', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_template', +'COLUMN', N'channel_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'短信渠道编码', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_template', +'COLUMN', N'channel_code' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_template', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_template', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_template', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_template', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_template', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'短信模板', +'SCHEMA', N'dbo', +'TABLE', N'system_sms_template' +GO + + +-- ---------------------------- +-- Records of system_sms_template +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[system_sms_template] ON +GO + +INSERT INTO [dbo].[system_sms_template] ([id], [type], [status], [code], [name], [content], [params], [remark], [api_template_id], [channel_id], [channel_code], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'2', N'1', N'0', N'test_01', N'测试验证码短信', N'正在进行登录操作{operation},您的验证码是{code}', N'["operation","code"]', NULL, N'4383920', N'1', N'YUN_PIAN', N'', N'2021-03-31 10:49:38.0000000', N'1', N'2021-04-10 01:22:00.0000000', N'0') +GO + +INSERT INTO [dbo].[system_sms_template] ([id], [type], [status], [code], [name], [content], [params], [remark], [api_template_id], [channel_id], [channel_code], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'3', N'1', N'0', N'test_02', N'公告通知', N'您的验证码{code},该验证码5分钟内有效,请勿泄漏于他人!', N'["code"]', NULL, N'SMS_207945135', N'2', N'ALIYUN', N'', N'2021-03-31 11:56:30.0000000', N'1', N'2021-04-10 01:22:02.0000000', N'0') +GO + +INSERT INTO [dbo].[system_sms_template] ([id], [type], [status], [code], [name], [content], [params], [remark], [api_template_id], [channel_id], [channel_code], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'6', N'3', N'0', N'test-01', N'测试模板', N'哈哈哈 {name}', N'["name"]', N'f哈哈哈', N'4383920', N'1', N'YUN_PIAN', N'1', N'2021-04-10 01:07:21.0000000', N'1', N'2021-04-10 01:22:05.0000000', N'0') +GO + +INSERT INTO [dbo].[system_sms_template] ([id], [type], [status], [code], [name], [content], [params], [remark], [api_template_id], [channel_id], [channel_code], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'7', N'3', N'0', N'test-04', N'测试下', N'老鸡{name},牛逼{code}', N'["name","code"]', NULL, N'suibian', N'4', N'DEBUG_DING_TALK', N'1', N'2021-04-13 00:29:53.0000000', N'1', N'2021-04-14 00:30:38.0000000', N'0') +GO + +INSERT INTO [dbo].[system_sms_template] ([id], [type], [status], [code], [name], [content], [params], [remark], [api_template_id], [channel_id], [channel_code], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'8', N'1', N'0', N'user-sms-login', N'前台用户短信登录', N'您的验证码是{code}', N'["code"]', NULL, N'4372216', N'1', N'YUN_PIAN', N'1', N'2021-10-11 08:10:00.0000000', N'1', N'2021-10-11 08:10:00.0000000', N'0') +GO + +INSERT INTO [dbo].[system_sms_template] ([id], [type], [status], [code], [name], [content], [params], [remark], [api_template_id], [channel_id], [channel_code], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'9', N'2', N'0', N'bpm_task_assigned', N'【工作流】任务被分配', N'您收到了一条新的待办任务:{processInstanceName}-{taskName},申请人:{startUserNickname},处理链接:{detailUrl}', N'["processInstanceName","taskName","startUserNickname","detailUrl"]', NULL, N'suibian', N'4', N'DEBUG_DING_TALK', N'1', N'2022-01-21 22:31:19.0000000', N'1', N'2022-01-22 00:03:36.0000000', N'0') +GO + +INSERT INTO [dbo].[system_sms_template] ([id], [type], [status], [code], [name], [content], [params], [remark], [api_template_id], [channel_id], [channel_code], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'10', N'2', N'0', N'bpm_process_instance_reject', N'【工作流】流程被不通过', N'您的流程被审批不通过:{processInstanceName},原因:{reason},查看链接:{detailUrl}', N'["processInstanceName","reason","detailUrl"]', NULL, N'suibian', N'4', N'DEBUG_DING_TALK', N'1', N'2022-01-22 00:03:31.0000000', N'1', N'2022-05-01 12:33:14.0000000', N'0') +GO + +INSERT INTO [dbo].[system_sms_template] ([id], [type], [status], [code], [name], [content], [params], [remark], [api_template_id], [channel_id], [channel_code], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'11', N'2', N'0', N'bpm_process_instance_approve', N'【工作流】流程被通过', N'您的流程被审批通过:{processInstanceName},查看链接:{detailUrl}', N'["processInstanceName","detailUrl"]', NULL, N'suibian', N'4', N'DEBUG_DING_TALK', N'1', N'2022-01-22 00:04:31.0000000', N'1', N'2022-03-27 20:32:21.0000000', N'0') +GO + +INSERT INTO [dbo].[system_sms_template] ([id], [type], [status], [code], [name], [content], [params], [remark], [api_template_id], [channel_id], [channel_code], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'12', N'2', N'0', N'demo', N'演示模板', N'我就是测试一下下', N'[]', NULL, N'biubiubiu', N'6', N'DEBUG_DING_TALK', N'1', N'2022-04-10 23:22:49.0000000', N'1', N'2022-04-10 23:22:49.0000000', N'0') +GO + +INSERT INTO [dbo].[system_sms_template] ([id], [type], [status], [code], [name], [content], [params], [remark], [api_template_id], [channel_id], [channel_code], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'13', N'1', N'0', N'admin-sms-login', N'后台用户短信登录', N'您的验证码是{code}', N'["code"]', N'', N'4372216', N'1', N'YUN_PIAN', N'1', N'2021-10-11 08:10:00.0000000', N'1', N'2021-10-11 08:10:00.0000000', N'0') +GO + +SET IDENTITY_INSERT [dbo].[system_sms_template] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for system_social_user +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[system_social_user]') AND type IN ('U')) + DROP TABLE [dbo].[system_social_user] +GO + +CREATE TABLE [dbo].[system_social_user] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [type] tinyint NOT NULL, + [openid] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [token] nvarchar(256) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [raw_token_info] nvarchar(1024) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [nickname] nvarchar(32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [avatar] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [raw_user_info] nvarchar(1024) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [code] nvarchar(256) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [state] nvarchar(256) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [tenant_id] bigint NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL +) +GO + +ALTER TABLE [dbo].[system_social_user] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'主键(自增策略)', +'SCHEMA', N'dbo', +'TABLE', N'system_social_user', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'社交平台的类型', +'SCHEMA', N'dbo', +'TABLE', N'system_social_user', +'COLUMN', N'type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'社交 openid', +'SCHEMA', N'dbo', +'TABLE', N'system_social_user', +'COLUMN', N'openid' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'社交 token', +'SCHEMA', N'dbo', +'TABLE', N'system_social_user', +'COLUMN', N'token' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'原始 Token 数据,一般是 JSON 格式', +'SCHEMA', N'dbo', +'TABLE', N'system_social_user', +'COLUMN', N'raw_token_info' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户昵称', +'SCHEMA', N'dbo', +'TABLE', N'system_social_user', +'COLUMN', N'nickname' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户头像', +'SCHEMA', N'dbo', +'TABLE', N'system_social_user', +'COLUMN', N'avatar' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'原始用户数据,一般是 JSON 格式', +'SCHEMA', N'dbo', +'TABLE', N'system_social_user', +'COLUMN', N'raw_user_info' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'最后一次的认证 code', +'SCHEMA', N'dbo', +'TABLE', N'system_social_user', +'COLUMN', N'code' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'最后一次的认证 state', +'SCHEMA', N'dbo', +'TABLE', N'system_social_user', +'COLUMN', N'state' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'system_social_user', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'system_social_user', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'system_social_user', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'system_social_user', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户编号', +'SCHEMA', N'dbo', +'TABLE', N'system_social_user', +'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'system_social_user', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'社交用户表', +'SCHEMA', N'dbo', +'TABLE', N'system_social_user' +GO + + +-- ---------------------------- +-- Records of system_social_user +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[system_social_user] ON +GO + +SET IDENTITY_INSERT [dbo].[system_social_user] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for system_social_user_bind +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[system_social_user_bind]') AND type IN ('U')) + DROP TABLE [dbo].[system_social_user_bind] +GO + +CREATE TABLE [dbo].[system_social_user_bind] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [user_id] bigint NOT NULL, + [user_type] tinyint NOT NULL, + [social_type] tinyint NOT NULL, + [social_user_id] bigint NOT NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [tenant_id] bigint NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL +) +GO + +ALTER TABLE [dbo].[system_social_user_bind] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'主键(自增策略)', +'SCHEMA', N'dbo', +'TABLE', N'system_social_user_bind', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户编号', +'SCHEMA', N'dbo', +'TABLE', N'system_social_user_bind', +'COLUMN', N'user_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户类型', +'SCHEMA', N'dbo', +'TABLE', N'system_social_user_bind', +'COLUMN', N'user_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'社交平台的类型', +'SCHEMA', N'dbo', +'TABLE', N'system_social_user_bind', +'COLUMN', N'social_type' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'社交用户的编号', +'SCHEMA', N'dbo', +'TABLE', N'system_social_user_bind', +'COLUMN', N'social_user_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'system_social_user_bind', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'system_social_user_bind', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'system_social_user_bind', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'system_social_user_bind', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户编号', +'SCHEMA', N'dbo', +'TABLE', N'system_social_user_bind', +'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'system_social_user_bind', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'社交绑定表', +'SCHEMA', N'dbo', +'TABLE', N'system_social_user_bind' +GO + + +-- ---------------------------- +-- Records of system_social_user_bind +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[system_social_user_bind] ON +GO + +SET IDENTITY_INSERT [dbo].[system_social_user_bind] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for system_tenant +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[system_tenant]') AND type IN ('U')) + DROP TABLE [dbo].[system_tenant] +GO + +CREATE TABLE [dbo].[system_tenant] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [name] nvarchar(30) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [contact_user_id] bigint NULL, + [contact_name] nvarchar(30) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [contact_mobile] nvarchar(500) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [status] tinyint NOT NULL, + [domain] nvarchar(256) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [package_id] bigint NOT NULL, + [expire_time] datetime2(7) NOT NULL, + [account_count] int NOT NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL +) +GO + +ALTER TABLE [dbo].[system_tenant] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户编号', +'SCHEMA', N'dbo', +'TABLE', N'system_tenant', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户名', +'SCHEMA', N'dbo', +'TABLE', N'system_tenant', +'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'联系人的用户编号', +'SCHEMA', N'dbo', +'TABLE', N'system_tenant', +'COLUMN', N'contact_user_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'联系人', +'SCHEMA', N'dbo', +'TABLE', N'system_tenant', +'COLUMN', N'contact_name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'联系手机', +'SCHEMA', N'dbo', +'TABLE', N'system_tenant', +'COLUMN', N'contact_mobile' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户状态(0正常 1停用)', +'SCHEMA', N'dbo', +'TABLE', N'system_tenant', +'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'绑定域名', +'SCHEMA', N'dbo', +'TABLE', N'system_tenant', +'COLUMN', N'domain' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户套餐编号', +'SCHEMA', N'dbo', +'TABLE', N'system_tenant', +'COLUMN', N'package_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'过期时间', +'SCHEMA', N'dbo', +'TABLE', N'system_tenant', +'COLUMN', N'expire_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'账号数量', +'SCHEMA', N'dbo', +'TABLE', N'system_tenant', +'COLUMN', N'account_count' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'system_tenant', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'system_tenant', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'system_tenant', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'system_tenant', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'system_tenant', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户表', +'SCHEMA', N'dbo', +'TABLE', N'system_tenant' +GO + + +-- ---------------------------- +-- Records of system_tenant +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[system_tenant] ON +GO + +INSERT INTO [dbo].[system_tenant] ([id], [name], [contact_user_id], [contact_name], [contact_mobile], [status], [domain], [package_id], [expire_time], [account_count], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'1', N'闻荫源码', NULL, N'芋艿', N'17321315478', N'0', N'https://www.iocoder.cn', N'0', N'2099-02-19 17:14:16.0000000', N'9999', N'1', N'2021-01-05 17:03:47.0000000', N'1', N'2022-02-23 12:15:11.0000000', N'0') +GO + +INSERT INTO [dbo].[system_tenant] ([id], [name], [contact_user_id], [contact_name], [contact_mobile], [status], [domain], [package_id], [expire_time], [account_count], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'121', N'小租户', N'110', N'小王2', N'15601691300', N'0', N'http://www.iocoder.cn', N'111', N'2024-03-11 00:00:00.0000000', N'20', N'1', N'2022-02-22 00:56:14.0000000', N'1', N'2022-03-19 18:37:20.0000000', N'0') +GO + +INSERT INTO [dbo].[system_tenant] ([id], [name], [contact_user_id], [contact_name], [contact_mobile], [status], [domain], [package_id], [expire_time], [account_count], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'122', N'测试租户', N'113', N'闻荫', N'15601691300', N'0', N'https://www.iocoder.cn', N'111', N'2022-04-30 00:00:00.0000000', N'50', N'1', N'2022-03-07 21:37:58.0000000', N'1', N'2022-03-07 21:37:58.0000000', N'0') +GO + +SET IDENTITY_INSERT [dbo].[system_tenant] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for system_tenant_package +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[system_tenant_package]') AND type IN ('U')) + DROP TABLE [dbo].[system_tenant_package] +GO + +CREATE TABLE [dbo].[system_tenant_package] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [name] nvarchar(30) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [status] tinyint NOT NULL, + [remark] nvarchar(256) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [menu_ids] nvarchar(2048) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL +) +GO + +ALTER TABLE [dbo].[system_tenant_package] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'套餐编号', +'SCHEMA', N'dbo', +'TABLE', N'system_tenant_package', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'套餐名', +'SCHEMA', N'dbo', +'TABLE', N'system_tenant_package', +'COLUMN', N'name' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户状态(0正常 1停用)', +'SCHEMA', N'dbo', +'TABLE', N'system_tenant_package', +'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'备注', +'SCHEMA', N'dbo', +'TABLE', N'system_tenant_package', +'COLUMN', N'remark' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'关联的菜单编号', +'SCHEMA', N'dbo', +'TABLE', N'system_tenant_package', +'COLUMN', N'menu_ids' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'system_tenant_package', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'system_tenant_package', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'system_tenant_package', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'system_tenant_package', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'system_tenant_package', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户套餐表', +'SCHEMA', N'dbo', +'TABLE', N'system_tenant_package' +GO + + +-- ---------------------------- +-- Records of system_tenant_package +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[system_tenant_package] ON +GO + +INSERT INTO [dbo].[system_tenant_package] ([id], [name], [status], [remark], [menu_ids], [creator], [create_time], [updater], [update_time], [deleted]) VALUES (N'111', N'普通套餐', N'0', N'小功能', N'[1024,1025,1,102,103,104,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023]', N'1', N'2022-02-22 00:54:00.0000000', N'1', N'2022-03-19 18:39:13.0000000', N'0') +GO + +SET IDENTITY_INSERT [dbo].[system_tenant_package] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for system_user_post +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[system_user_post]') AND type IN ('U')) + DROP TABLE [dbo].[system_user_post] +GO + +CREATE TABLE [dbo].[system_user_post] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [user_id] bigint NOT NULL, + [post_id] bigint NOT NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL, + [tenant_id] bigint DEFAULT 0 NOT NULL +) +GO + +ALTER TABLE [dbo].[system_user_post] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'ID 主键', +'SCHEMA', N'dbo', +'TABLE', N'system_user_post', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户ID', +'SCHEMA', N'dbo', +'TABLE', N'system_user_post', +'COLUMN', N'user_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'岗位ID', +'SCHEMA', N'dbo', +'TABLE', N'system_user_post', +'COLUMN', N'post_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'system_user_post', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'system_user_post', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'system_user_post', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'system_user_post', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'system_user_post', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户编号', +'SCHEMA', N'dbo', +'TABLE', N'system_user_post', +'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户岗位表', +'SCHEMA', N'dbo', +'TABLE', N'system_user_post' +GO + + +-- ---------------------------- +-- Records of system_user_post +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[system_user_post] ON +GO + +INSERT INTO [dbo].[system_user_post] ([id], [user_id], [post_id], [creator], [create_time], [updater], [update_time], [deleted], [tenant_id]) VALUES (N'112', N'1', N'1', N'admin', N'2022-05-02 07:25:24.0000000', N'admin', N'2022-05-02 07:25:24.0000000', N'0', N'1') +GO + +INSERT INTO [dbo].[system_user_post] ([id], [user_id], [post_id], [creator], [create_time], [updater], [update_time], [deleted], [tenant_id]) VALUES (N'113', N'100', N'1', N'admin', N'2022-05-02 07:25:24.0000000', N'admin', N'2022-05-02 07:25:24.0000000', N'0', N'1') +GO + +INSERT INTO [dbo].[system_user_post] ([id], [user_id], [post_id], [creator], [create_time], [updater], [update_time], [deleted], [tenant_id]) VALUES (N'114', N'114', N'3', N'admin', N'2022-05-02 07:25:24.0000000', N'admin', N'2022-05-02 07:25:24.0000000', N'0', N'1') +GO + +SET IDENTITY_INSERT [dbo].[system_user_post] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for system_user_role +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[system_user_role]') AND type IN ('U')) + DROP TABLE [dbo].[system_user_role] +GO + +CREATE TABLE [dbo].[system_user_role] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [user_id] bigint NOT NULL, + [role_id] bigint NOT NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NULL, + [tenant_id] bigint NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL +) +GO + +ALTER TABLE [dbo].[system_user_role] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'自增编号', +'SCHEMA', N'dbo', +'TABLE', N'system_user_role', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户ID', +'SCHEMA', N'dbo', +'TABLE', N'system_user_role', +'COLUMN', N'user_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'角色ID', +'SCHEMA', N'dbo', +'TABLE', N'system_user_role', +'COLUMN', N'role_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'system_user_role', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'system_user_role', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'system_user_role', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'system_user_role', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户编号', +'SCHEMA', N'dbo', +'TABLE', N'system_user_role', +'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'system_user_role', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户和角色关联表', +'SCHEMA', N'dbo', +'TABLE', N'system_user_role' +GO + + +-- ---------------------------- +-- Records of system_user_role +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[system_user_role] ON +GO + +INSERT INTO [dbo].[system_user_role] ([id], [user_id], [role_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'1', N'1', N'1', N'', N'2022-01-11 13:19:45.0000000', N'', N'2022-01-11 13:19:45.0000000', N'1', N'0') +GO + +INSERT INTO [dbo].[system_user_role] ([id], [user_id], [role_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'2', N'2', N'2', N'', N'2022-01-11 13:19:45.0000000', N'', N'2022-01-11 13:19:45.0000000', N'1', N'0') +GO + +INSERT INTO [dbo].[system_user_role] ([id], [user_id], [role_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'4', N'100', N'101', N'', N'2022-01-11 13:19:45.0000000', N'', N'2022-01-11 13:19:45.0000000', N'1', N'0') +GO + +INSERT INTO [dbo].[system_user_role] ([id], [user_id], [role_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'5', N'100', N'1', N'', N'2022-01-11 13:19:45.0000000', N'', N'2022-01-11 13:19:45.0000000', N'1', N'0') +GO + +INSERT INTO [dbo].[system_user_role] ([id], [user_id], [role_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'6', N'100', N'2', N'', N'2022-01-11 13:19:45.0000000', N'', N'2022-01-11 13:19:45.0000000', N'1', N'0') +GO + +INSERT INTO [dbo].[system_user_role] ([id], [user_id], [role_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'7', N'104', N'101', N'', N'2022-01-11 13:19:45.0000000', N'', N'2022-01-11 13:19:45.0000000', N'1', N'0') +GO + +INSERT INTO [dbo].[system_user_role] ([id], [user_id], [role_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'10', N'103', N'1', N'1', N'2022-01-11 13:19:45.0000000', N'1', N'2022-01-11 13:19:45.0000000', N'1', N'0') +GO + +INSERT INTO [dbo].[system_user_role] ([id], [user_id], [role_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'11', N'107', N'106', N'1', N'2022-02-20 22:59:33.0000000', N'1', N'2022-02-20 22:59:33.0000000', N'118', N'0') +GO + +INSERT INTO [dbo].[system_user_role] ([id], [user_id], [role_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'12', N'108', N'107', N'1', N'2022-02-20 23:00:50.0000000', N'1', N'2022-02-20 23:00:50.0000000', N'119', N'0') +GO + +INSERT INTO [dbo].[system_user_role] ([id], [user_id], [role_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'13', N'109', N'108', N'1', N'2022-02-20 23:11:50.0000000', N'1', N'2022-02-20 23:11:50.0000000', N'120', N'0') +GO + +INSERT INTO [dbo].[system_user_role] ([id], [user_id], [role_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'14', N'110', N'109', N'1', N'2022-02-22 00:56:14.0000000', N'1', N'2022-02-22 00:56:14.0000000', N'121', N'0') +GO + +INSERT INTO [dbo].[system_user_role] ([id], [user_id], [role_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'15', N'111', N'110', N'110', N'2022-02-23 13:14:38.0000000', N'110', N'2022-02-23 13:14:38.0000000', N'121', N'0') +GO + +INSERT INTO [dbo].[system_user_role] ([id], [user_id], [role_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'16', N'113', N'111', N'1', N'2022-03-07 21:37:58.0000000', N'1', N'2022-03-07 21:37:58.0000000', N'122', N'0') +GO + +INSERT INTO [dbo].[system_user_role] ([id], [user_id], [role_id], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'17', N'114', N'101', N'1', N'2022-03-19 21:51:13.0000000', N'1', N'2022-03-19 21:51:13.0000000', N'1', N'0') +GO + +SET IDENTITY_INSERT [dbo].[system_user_role] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Table structure for system_users +-- ---------------------------- +IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[system_users]') AND type IN ('U')) + DROP TABLE [dbo].[system_users] +GO + +CREATE TABLE [dbo].[system_users] ( + [id] bigint IDENTITY(1,1) NOT NULL, + [username] nvarchar(30) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [password] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [nickname] nvarchar(30) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, + [remark] nvarchar(500) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [dept_id] bigint NULL, + [post_ids] nvarchar(255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [email] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [mobile] nvarchar(11) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [sex] tinyint NULL, + [avatar] nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [status] tinyint NOT NULL, + [login_ip] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [login_date] datetime2(7) NULL, + [creator] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [create_time] datetime2(7) NOT NULL, + [updater] nvarchar(64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, + [update_time] datetime2(7) NOT NULL, + [tenant_id] bigint NOT NULL, + [deleted] bit DEFAULT 0 NOT NULL +) +GO + +ALTER TABLE [dbo].[system_users] SET (LOCK_ESCALATION = TABLE) +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户ID', +'SCHEMA', N'dbo', +'TABLE', N'system_users', +'COLUMN', N'id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户账号', +'SCHEMA', N'dbo', +'TABLE', N'system_users', +'COLUMN', N'username' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'密码', +'SCHEMA', N'dbo', +'TABLE', N'system_users', +'COLUMN', N'password' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户昵称', +'SCHEMA', N'dbo', +'TABLE', N'system_users', +'COLUMN', N'nickname' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'备注', +'SCHEMA', N'dbo', +'TABLE', N'system_users', +'COLUMN', N'remark' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'部门ID', +'SCHEMA', N'dbo', +'TABLE', N'system_users', +'COLUMN', N'dept_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'岗位编号数组', +'SCHEMA', N'dbo', +'TABLE', N'system_users', +'COLUMN', N'post_ids' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户邮箱', +'SCHEMA', N'dbo', +'TABLE', N'system_users', +'COLUMN', N'email' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'手机号码', +'SCHEMA', N'dbo', +'TABLE', N'system_users', +'COLUMN', N'mobile' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户性别', +'SCHEMA', N'dbo', +'TABLE', N'system_users', +'COLUMN', N'sex' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'头像地址', +'SCHEMA', N'dbo', +'TABLE', N'system_users', +'COLUMN', N'avatar' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'帐号状态(0正常 1停用)', +'SCHEMA', N'dbo', +'TABLE', N'system_users', +'COLUMN', N'status' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'最后登录IP', +'SCHEMA', N'dbo', +'TABLE', N'system_users', +'COLUMN', N'login_ip' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'最后登录时间', +'SCHEMA', N'dbo', +'TABLE', N'system_users', +'COLUMN', N'login_date' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建者', +'SCHEMA', N'dbo', +'TABLE', N'system_users', +'COLUMN', N'creator' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'创建时间', +'SCHEMA', N'dbo', +'TABLE', N'system_users', +'COLUMN', N'create_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新者', +'SCHEMA', N'dbo', +'TABLE', N'system_users', +'COLUMN', N'updater' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'更新时间', +'SCHEMA', N'dbo', +'TABLE', N'system_users', +'COLUMN', N'update_time' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'租户编号', +'SCHEMA', N'dbo', +'TABLE', N'system_users', +'COLUMN', N'tenant_id' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'是否删除', +'SCHEMA', N'dbo', +'TABLE', N'system_users', +'COLUMN', N'deleted' +GO + +EXEC sp_addextendedproperty +'MS_Description', N'用户信息表', +'SCHEMA', N'dbo', +'TABLE', N'system_users' +GO + + +-- ---------------------------- +-- Records of system_users +-- ---------------------------- +BEGIN TRANSACTION +GO + +SET IDENTITY_INSERT [dbo].[system_users] ON +GO + +INSERT INTO [dbo].[system_users] ([id], [username], [password], [nickname], [remark], [dept_id], [post_ids], [email], [mobile], [sex], [avatar], [status], [login_ip], [login_date], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'1', N'admin', N'$2a$10$0acJOIk2D25/oC87nyclE..0lzeu9DtQ/n3geP4fkun/zIVRhHJIO', N'闻荫源码', N'管理员', N'103', N'[1]', N'aoteman@126.com', N'15612345678', N'1', N'http://test.win.iocoder.cn/48934f2f-92d4-4250-b917-d10d2b262c6a', N'0', N'127.0.0.1', N'2022-05-26 00:51:15.3820000', N'admin', N'2021-01-05 17:03:47.0000000', NULL, N'2022-05-26 00:51:15.3870000', N'1', N'0') +GO + +INSERT INTO [dbo].[system_users] ([id], [username], [password], [nickname], [remark], [dept_id], [post_ids], [email], [mobile], [sex], [avatar], [status], [login_ip], [login_date], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'100', N'win', N'$2a$10$11U48RhyJ5pSBYWSn12AD./ld671.ycSzJHbyrtpeoMeYiw31eo8a', N'闻荫', N'不要吓我', N'104', N'[1]', N'win@iocoder.cn', N'15601691300', N'1', N'', N'1', N'127.0.0.1', N'2022-05-03 16:49:24.6860000', N'', N'2021-01-07 09:07:17.0000000', NULL, N'2022-05-03 16:49:24.6860000', N'1', N'0') +GO + +INSERT INTO [dbo].[system_users] ([id], [username], [password], [nickname], [remark], [dept_id], [post_ids], [email], [mobile], [sex], [avatar], [status], [login_ip], [login_date], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'103', N'yuanma', N'$2a$10$wWoPT7sqriM2O1YXRL.je.GiL538OR6ZTN8aQZr9JAGdnpCH2tpYe', N'源码', NULL, N'106', NULL, N'yuanma@iocoder.cn', N'15601701300', N'0', N'', N'0', N'127.0.0.1', N'2022-01-18 00:33:40.0000000', N'', N'2021-01-13 23:50:35.0000000', NULL, N'2022-01-18 00:33:40.0000000', N'1', N'0') +GO + +INSERT INTO [dbo].[system_users] ([id], [username], [password], [nickname], [remark], [dept_id], [post_ids], [email], [mobile], [sex], [avatar], [status], [login_ip], [login_date], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'104', N'test', N'$2a$10$e5RpuDCC0GYSt0Hvd2.CjujIXwgGct4SnXi6dVGxdgFsnqgEryk5a', N'测试号', NULL, N'107', N'[]', N'111@qq.com', N'15601691200', N'1', N'', N'0', N'127.0.0.1', N'2022-03-19 21:46:19.0000000', N'', N'2021-01-21 02:13:53.0000000', NULL, N'2022-03-19 21:46:19.0000000', N'1', N'0') +GO + +INSERT INTO [dbo].[system_users] ([id], [username], [password], [nickname], [remark], [dept_id], [post_ids], [email], [mobile], [sex], [avatar], [status], [login_ip], [login_date], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'107', N'admin107', N'$2a$10$dYOOBKMO93v/.ReCqzyFg.o67Tqk.bbc2bhrpyBGkIw9aypCtr2pm', N'芋艿', NULL, NULL, NULL, N'', N'15601691300', N'0', N'', N'0', N'', NULL, N'1', N'2022-02-20 22:59:33.0000000', N'1', N'2022-02-27 08:26:51.0000000', N'118', N'0') +GO + +INSERT INTO [dbo].[system_users] ([id], [username], [password], [nickname], [remark], [dept_id], [post_ids], [email], [mobile], [sex], [avatar], [status], [login_ip], [login_date], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'108', N'admin108', N'$2a$10$y6mfvKoNYL1GXWak8nYwVOH.kCWqjactkzdoIDgiKl93WN3Ejg.Lu', N'芋艿', NULL, NULL, NULL, N'', N'15601691300', N'0', N'', N'0', N'', NULL, N'1', N'2022-02-20 23:00:50.0000000', N'1', N'2022-02-27 08:26:53.0000000', N'119', N'0') +GO + +INSERT INTO [dbo].[system_users] ([id], [username], [password], [nickname], [remark], [dept_id], [post_ids], [email], [mobile], [sex], [avatar], [status], [login_ip], [login_date], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'109', N'admin109', N'$2a$10$JAqvH0tEc0I7dfDVBI7zyuB4E3j.uH6daIjV53.vUS6PknFkDJkuK', N'芋艿', NULL, NULL, NULL, N'', N'15601691300', N'0', N'', N'0', N'', NULL, N'1', N'2022-02-20 23:11:50.0000000', N'1', N'2022-02-27 08:26:56.0000000', N'120', N'0') +GO + +INSERT INTO [dbo].[system_users] ([id], [username], [password], [nickname], [remark], [dept_id], [post_ids], [email], [mobile], [sex], [avatar], [status], [login_ip], [login_date], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'110', N'admin110', N'$2a$10$qYxoXs0ogPHgYllyEneYde9xcCW5hZgukrxeXZ9lmLhKse8TK6IwW', N'小王', NULL, NULL, NULL, N'', N'15601691300', N'0', N'', N'0', N'127.0.0.1', N'2022-02-23 19:36:28.0000000', N'1', N'2022-02-22 00:56:14.0000000', NULL, N'2022-02-27 08:26:59.0000000', N'121', N'0') +GO + +INSERT INTO [dbo].[system_users] ([id], [username], [password], [nickname], [remark], [dept_id], [post_ids], [email], [mobile], [sex], [avatar], [status], [login_ip], [login_date], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'111', N'test', N'$2a$10$mExveopHUx9Q4QiLtAzhDeH3n4/QlNLzEsM4AqgxKrU.ciUZDXZCy', N'测试用户', NULL, NULL, N'[]', N'', N'', N'0', N'', N'0', N'', NULL, N'110', N'2022-02-23 13:14:33.0000000', N'110', N'2022-02-23 13:14:33.0000000', N'121', N'0') +GO + +INSERT INTO [dbo].[system_users] ([id], [username], [password], [nickname], [remark], [dept_id], [post_ids], [email], [mobile], [sex], [avatar], [status], [login_ip], [login_date], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'112', N'newobject', N'$2a$10$jh5MsR.ud/gKe3mVeUp5t.nEXGDSmHyv5OYjWQwHO8wlGmMSI9Twy', N'新对象', NULL, NULL, N'[]', N'', N'', N'0', N'', N'0', N'', NULL, N'1', N'2022-02-23 19:08:03.0000000', N'1', N'2022-02-23 19:08:03.0000000', N'1', N'0') +GO + +INSERT INTO [dbo].[system_users] ([id], [username], [password], [nickname], [remark], [dept_id], [post_ids], [email], [mobile], [sex], [avatar], [status], [login_ip], [login_date], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'113', N'aoteman', N'$2a$10$0acJOIk2D25/oC87nyclE..0lzeu9DtQ/n3geP4fkun/zIVRhHJIO', N'闻荫', NULL, NULL, NULL, N'', N'15601691300', N'0', N'', N'0', N'127.0.0.1', N'2022-03-19 18:38:51.0000000', N'1', N'2022-03-07 21:37:58.0000000', NULL, N'2022-03-19 18:38:51.0000000', N'122', N'0') +GO + +INSERT INTO [dbo].[system_users] ([id], [username], [password], [nickname], [remark], [dept_id], [post_ids], [email], [mobile], [sex], [avatar], [status], [login_ip], [login_date], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'114', N'hrmgr', N'$2a$10$TR4eybBioGRhBmDBWkqWLO6NIh3mzYa8KBKDDB5woiGYFVlRAi.fu', N'hr 小姐姐', NULL, NULL, N'[3]', N'', N'', N'0', N'', N'0', N'127.0.0.1', N'2022-03-19 22:15:43.0000000', N'1', N'2022-03-19 21:50:58.0000000', NULL, N'2022-03-19 22:15:43.0000000', N'1', N'0') +GO + +INSERT INTO [dbo].[system_users] ([id], [username], [password], [nickname], [remark], [dept_id], [post_ids], [email], [mobile], [sex], [avatar], [status], [login_ip], [login_date], [creator], [create_time], [updater], [update_time], [tenant_id], [deleted]) VALUES (N'115', N'aotemane', N'$2a$10$/WCwGHu1eq0wOVDd/u8HweJ0gJCHyLS6T7ndCqI8UXZAQom1etk2e', N'1', N'11', N'100', N'[]', N'', N'', N'0', N'', N'0', N'', NULL, N'1', N'2022-04-30 02:55:43.0000000', N'1', N'2022-04-30 02:55:43.0000000', N'1', N'0') +GO + +SET IDENTITY_INSERT [dbo].[system_users] OFF +GO + +COMMIT +GO + + +-- ---------------------------- +-- Primary Key structure for table QRTZ_CALENDARS +-- ---------------------------- +ALTER TABLE [dbo].[QRTZ_CALENDARS] ADD CONSTRAINT [PK_QRTZ_CALENDARS] PRIMARY KEY CLUSTERED ([SCHED_NAME], [CALENDAR_NAME]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Indexes structure for table QRTZ_CRON_TRIGGERS +-- ---------------------------- +CREATE NONCLUSTERED INDEX [IX_QRTZ_CRON_TRIGGERS_QRTZ_TRIGGERS] +ON [dbo].[QRTZ_CRON_TRIGGERS] ( + [SCHED_NAME] ASC, + [TRIGGER_NAME] ASC, + [TRIGGER_GROUP] ASC +) +GO + + +-- ---------------------------- +-- Primary Key structure for table QRTZ_CRON_TRIGGERS +-- ---------------------------- +ALTER TABLE [dbo].[QRTZ_CRON_TRIGGERS] ADD CONSTRAINT [PK_QRTZ_CRON_TRIGGERS] PRIMARY KEY CLUSTERED ([SCHED_NAME], [TRIGGER_NAME], [TRIGGER_GROUP]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Primary Key structure for table QRTZ_FIRED_TRIGGERS +-- ---------------------------- +ALTER TABLE [dbo].[QRTZ_FIRED_TRIGGERS] ADD CONSTRAINT [PK_QRTZ_FIRED_TRIGGERS] PRIMARY KEY CLUSTERED ([SCHED_NAME], [ENTRY_ID]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Primary Key structure for table QRTZ_JOB_DETAILS +-- ---------------------------- +ALTER TABLE [dbo].[QRTZ_JOB_DETAILS] ADD CONSTRAINT [PK_QRTZ_JOB_DETAILS] PRIMARY KEY CLUSTERED ([SCHED_NAME], [JOB_NAME], [JOB_GROUP]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Primary Key structure for table QRTZ_LOCKS +-- ---------------------------- +ALTER TABLE [dbo].[QRTZ_LOCKS] ADD CONSTRAINT [PK_QRTZ_LOCKS] PRIMARY KEY CLUSTERED ([SCHED_NAME], [LOCK_NAME]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Primary Key structure for table QRTZ_PAUSED_TRIGGER_GRPS +-- ---------------------------- +ALTER TABLE [dbo].[QRTZ_PAUSED_TRIGGER_GRPS] ADD CONSTRAINT [PK_QRTZ_PAUSED_TRIGGER_GRPS] PRIMARY KEY CLUSTERED ([SCHED_NAME], [TRIGGER_GROUP]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Primary Key structure for table QRTZ_SCHEDULER_STATE +-- ---------------------------- +ALTER TABLE [dbo].[QRTZ_SCHEDULER_STATE] ADD CONSTRAINT [PK_QRTZ_SCHEDULER_STATE] PRIMARY KEY CLUSTERED ([SCHED_NAME], [INSTANCE_NAME]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Indexes structure for table QRTZ_SIMPLE_TRIGGERS +-- ---------------------------- +CREATE NONCLUSTERED INDEX [IX_QRTZ_SIMPLE_TRIGGERS_QRTZ_TRIGGERS] +ON [dbo].[QRTZ_SIMPLE_TRIGGERS] ( + [SCHED_NAME] ASC, + [TRIGGER_NAME] ASC, + [TRIGGER_GROUP] ASC +) +GO + + +-- ---------------------------- +-- Primary Key structure for table QRTZ_SIMPLE_TRIGGERS +-- ---------------------------- +ALTER TABLE [dbo].[QRTZ_SIMPLE_TRIGGERS] ADD CONSTRAINT [PK_QRTZ_SIMPLE_TRIGGERS] PRIMARY KEY CLUSTERED ([SCHED_NAME], [TRIGGER_NAME], [TRIGGER_GROUP]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Indexes structure for table QRTZ_SIMPROP_TRIGGERS +-- ---------------------------- +CREATE NONCLUSTERED INDEX [IX_QRTZ_SIMPROP_TRIGGERS_QRTZ_TRIGGERS] +ON [dbo].[QRTZ_SIMPROP_TRIGGERS] ( + [SCHED_NAME] ASC, + [TRIGGER_NAME] ASC, + [TRIGGER_GROUP] ASC +) +GO + + +-- ---------------------------- +-- Primary Key structure for table QRTZ_SIMPROP_TRIGGERS +-- ---------------------------- +ALTER TABLE [dbo].[QRTZ_SIMPROP_TRIGGERS] ADD CONSTRAINT [PK_QRTZ_SIMPROP_TRIGGERS] PRIMARY KEY CLUSTERED ([SCHED_NAME], [TRIGGER_NAME], [TRIGGER_GROUP]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Indexes structure for table QRTZ_TRIGGERS +-- ---------------------------- +CREATE NONCLUSTERED INDEX [IX_QRTZ_TRIGGERS_QRTZ_JOB_DETAILS] +ON [dbo].[QRTZ_TRIGGERS] ( + [SCHED_NAME] ASC, + [TRIGGER_NAME] ASC, + [TRIGGER_GROUP] ASC +) +GO + + +-- ---------------------------- +-- Primary Key structure for table QRTZ_TRIGGERS +-- ---------------------------- +ALTER TABLE [dbo].[QRTZ_TRIGGERS] ADD CONSTRAINT [PK_QRTZ_TRIGGERS] PRIMARY KEY CLUSTERED ([SCHED_NAME], [TRIGGER_NAME], [TRIGGER_GROUP]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for bpm_form +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[bpm_form]', RESEED, 1) +GO + + +-- ---------------------------- +-- Primary Key structure for table bpm_form +-- ---------------------------- +ALTER TABLE [dbo].[bpm_form] ADD CONSTRAINT [PK__bpm_form__3213E83F86C2B27F] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for bpm_oa_leave +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[bpm_oa_leave]', RESEED, 1) +GO + + +-- ---------------------------- +-- Primary Key structure for table bpm_oa_leave +-- ---------------------------- +ALTER TABLE [dbo].[bpm_oa_leave] ADD CONSTRAINT [PK__bpm_oa_l__3213E83F3569F596] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for bpm_process_definition_ext +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[bpm_process_definition_ext]', RESEED, 1) +GO + + +-- ---------------------------- +-- Primary Key structure for table bpm_process_definition_ext +-- ---------------------------- +ALTER TABLE [dbo].[bpm_process_definition_ext] ADD CONSTRAINT [PK__bpm_proc__3213E83F0A8AB015] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for bpm_process_instance_ext +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[bpm_process_instance_ext]', RESEED, 1) +GO + + +-- ---------------------------- +-- Primary Key structure for table bpm_process_instance_ext +-- ---------------------------- +ALTER TABLE [dbo].[bpm_process_instance_ext] ADD CONSTRAINT [PK__bpm_proc__3213E83FFD88328F] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for bpm_task_assign_rule +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[bpm_task_assign_rule]', RESEED, 2) +GO + + +-- ---------------------------- +-- Primary Key structure for table bpm_task_assign_rule +-- ---------------------------- +ALTER TABLE [dbo].[bpm_task_assign_rule] ADD CONSTRAINT [PK__bpm_task__3213E83F474371C5] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for bpm_task_ext +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[bpm_task_ext]', RESEED, 1) +GO + + +-- ---------------------------- +-- Primary Key structure for table bpm_task_ext +-- ---------------------------- +ALTER TABLE [dbo].[bpm_task_ext] ADD CONSTRAINT [PK__bpm_task__3213E83FD8AFE1F9] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for bpm_user_group +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[bpm_user_group]', RESEED, 1) +GO + + +-- ---------------------------- +-- Primary Key structure for table bpm_user_group +-- ---------------------------- +ALTER TABLE [dbo].[bpm_user_group] ADD CONSTRAINT [PK__bpm_user__3213E83F25E4725B] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for infra_api_access_log +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[infra_api_access_log]', RESEED, 40615) +GO + + +-- ---------------------------- +-- Primary Key structure for table infra_api_access_log +-- ---------------------------- +ALTER TABLE [dbo].[infra_api_access_log] ADD CONSTRAINT [PK__infra_ap__3213E83F04F27A05] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for infra_api_error_log +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[infra_api_error_log]', RESEED, 2021) +GO + + +-- ---------------------------- +-- Primary Key structure for table infra_api_error_log +-- ---------------------------- +ALTER TABLE [dbo].[infra_api_error_log] ADD CONSTRAINT [PK__infra_ap__3213E83FCA2446D4] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for infra_codegen_column +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[infra_codegen_column]', RESEED, 1) +GO + + +-- ---------------------------- +-- Primary Key structure for table infra_codegen_column +-- ---------------------------- +ALTER TABLE [dbo].[infra_codegen_column] ADD CONSTRAINT [PK__infra_co__3213E83FA9EC5005] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for infra_codegen_table +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[infra_codegen_table]', RESEED, 1) +GO + + +-- ---------------------------- +-- Primary Key structure for table infra_codegen_table +-- ---------------------------- +ALTER TABLE [dbo].[infra_codegen_table] ADD CONSTRAINT [PK__infra_co__3213E83F555031D0] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Primary Key structure for table infra_config +-- ---------------------------- +ALTER TABLE [dbo].[infra_config] ADD CONSTRAINT [PK__infra_co__3213E83FF4C71E85] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for infra_data_source_config +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[infra_data_source_config]', RESEED, 9) +GO + + +-- ---------------------------- +-- Primary Key structure for table infra_data_source_config +-- ---------------------------- +ALTER TABLE [dbo].[infra_data_source_config] ADD CONSTRAINT [PK__infra_da__3213E83F02D21AEB] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for infra_file +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[infra_file]', RESEED, 1) +GO + + +-- ---------------------------- +-- Auto increment value for infra_file_config +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[infra_file_config]', RESEED, 11) +GO + + +-- ---------------------------- +-- Primary Key structure for table infra_file_config +-- ---------------------------- +ALTER TABLE [dbo].[infra_file_config] ADD CONSTRAINT [PK__infra_fi__3213E83F8A7903EA] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for infra_file_content +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[infra_file_content]', RESEED, 1) +GO + + +-- ---------------------------- +-- Primary Key structure for table infra_file_content +-- ---------------------------- +ALTER TABLE [dbo].[infra_file_content] ADD CONSTRAINT [PK__infra_fi__3213E83F033E6045] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for infra_job +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[infra_job]', RESEED, 16) +GO + + +-- ---------------------------- +-- Primary Key structure for table infra_job +-- ---------------------------- +ALTER TABLE [dbo].[infra_job] ADD CONSTRAINT [PK__infra_jo__3213E83F3C7DE10C] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for infra_job_log +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[infra_job_log]', RESEED, 16) +GO + + +-- ---------------------------- +-- Primary Key structure for table infra_job_log +-- ---------------------------- +ALTER TABLE [dbo].[infra_job_log] ADD CONSTRAINT [PK__infra_jo__3213E83F4CA8F353] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for infra_test_demo +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[infra_test_demo]', RESEED, 1) +GO + + +-- ---------------------------- +-- Auto increment value for member_user +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[member_user]', RESEED, 1) +GO + + +-- ---------------------------- +-- Primary Key structure for table member_user +-- ---------------------------- +ALTER TABLE [dbo].[member_user] ADD CONSTRAINT [PK__member_u__3213E83F0A9AEC0B] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for pay_app +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[pay_app]', RESEED, 6) +GO + + +-- ---------------------------- +-- Primary Key structure for table pay_app +-- ---------------------------- +ALTER TABLE [dbo].[pay_app] ADD CONSTRAINT [PK__pay_app__3213E83FB26E0A6B] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for pay_channel +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[pay_channel]', RESEED, 17) +GO + + +-- ---------------------------- +-- Primary Key structure for table pay_channel +-- ---------------------------- +ALTER TABLE [dbo].[pay_channel] ADD CONSTRAINT [PK__pay_chan__3213E83F2556A7FC] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for pay_merchant +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[pay_merchant]', RESEED, 1) +GO + + +-- ---------------------------- +-- Primary Key structure for table pay_merchant +-- ---------------------------- +ALTER TABLE [dbo].[pay_merchant] ADD CONSTRAINT [PK__pay_merc__3213E83F010D02B8] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for pay_notify_log +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[pay_notify_log]', RESEED, 1) +GO + + +-- ---------------------------- +-- Primary Key structure for table pay_notify_log +-- ---------------------------- +ALTER TABLE [dbo].[pay_notify_log] ADD CONSTRAINT [PK__pay_noti__3213E83F5F4B3447] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for pay_notify_task +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[pay_notify_task]', RESEED, 1) +GO + + +-- ---------------------------- +-- Primary Key structure for table pay_notify_task +-- ---------------------------- +ALTER TABLE [dbo].[pay_notify_task] ADD CONSTRAINT [PK__pay_noti__3213E83FB9215103] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for pay_order +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[pay_order]', RESEED, 124) +GO + + +-- ---------------------------- +-- Primary Key structure for table pay_order +-- ---------------------------- +ALTER TABLE [dbo].[pay_order] ADD CONSTRAINT [PK__pay_orde__3213E83F34C95271] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for pay_order_extension +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[pay_order_extension]', RESEED, 1) +GO + + +-- ---------------------------- +-- Primary Key structure for table pay_order_extension +-- ---------------------------- +ALTER TABLE [dbo].[pay_order_extension] ADD CONSTRAINT [PK__pay_orde__3213E83F5ACB776F] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for pay_refund +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[pay_refund]', RESEED, 1) +GO + + +-- ---------------------------- +-- Primary Key structure for table pay_refund +-- ---------------------------- +ALTER TABLE [dbo].[pay_refund] ADD CONSTRAINT [PK__pay_refu__3213E83FBE1B54AC] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for system_dept +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[system_dept]', RESEED, 111) +GO + + +-- ---------------------------- +-- Primary Key structure for table system_dept +-- ---------------------------- +ALTER TABLE [dbo].[system_dept] ADD CONSTRAINT [PK__system_d__3213E83FFA72847C] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for system_dict_data +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[system_dict_data]', RESEED, 1160) +GO + + +-- ---------------------------- +-- Primary Key structure for table system_dict_data +-- ---------------------------- +ALTER TABLE [dbo].[system_dict_data] ADD CONSTRAINT [PK__system_d__3213E83F20407597] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for system_dict_type +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[system_dict_type]', RESEED, 147) +GO + + +-- ---------------------------- +-- Primary Key structure for table system_dict_type +-- ---------------------------- +ALTER TABLE [dbo].[system_dict_type] ADD CONSTRAINT [PK__system_d__3213E83F7C36B1FD] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for system_error_code +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[system_error_code]', RESEED, 15466) +GO + + +-- ---------------------------- +-- Primary Key structure for table system_error_code +-- ---------------------------- +ALTER TABLE [dbo].[system_error_code] ADD CONSTRAINT [PK__system_e__3213E83F68B8DFD0] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for system_login_log +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[system_login_log]', RESEED, 24) +GO + + +-- ---------------------------- +-- Primary Key structure for table system_login_log +-- ---------------------------- +ALTER TABLE [dbo].[system_login_log] ADD CONSTRAINT [PK__system_l__3213E83F717953E9] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for system_menu +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[system_menu]', RESEED, 1267) +GO + + +-- ---------------------------- +-- Primary Key structure for table system_menu +-- ---------------------------- +ALTER TABLE [dbo].[system_menu] ADD CONSTRAINT [PK__system_m__3213E83F14175801] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for system_notice +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[system_notice]', RESEED, 4) +GO + + +-- ---------------------------- +-- Primary Key structure for table system_notice +-- ---------------------------- +ALTER TABLE [dbo].[system_notice] ADD CONSTRAINT [PK__system_n__3213E83FA158BA8D] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for system_oauth2_access_token +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[system_oauth2_access_token]', RESEED, 5) +GO + + +-- ---------------------------- +-- Auto increment value for system_oauth2_approve +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[system_oauth2_approve]', RESEED, 2) +GO + + +-- ---------------------------- +-- Primary Key structure for table system_oauth2_approve +-- ---------------------------- +ALTER TABLE [dbo].[system_oauth2_approve] ADD CONSTRAINT [PK__system_o__3213E83F7CC08ED6] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for system_oauth2_client +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[system_oauth2_client]', RESEED, 1) +GO + + +-- ---------------------------- +-- Auto increment value for system_oauth2_code +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[system_oauth2_code]', RESEED, 4) +GO + + +-- ---------------------------- +-- Primary Key structure for table system_oauth2_code +-- ---------------------------- +ALTER TABLE [dbo].[system_oauth2_code] ADD CONSTRAINT [PK__system_o__3213E83F38C13543] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for system_oauth2_refresh_token +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[system_oauth2_refresh_token]', RESEED, 3) +GO + + +-- ---------------------------- +-- Primary Key structure for table system_oauth2_refresh_token +-- ---------------------------- +ALTER TABLE [dbo].[system_oauth2_refresh_token] ADD CONSTRAINT [PK__system_o__3213E83FCFB541CC] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for system_operate_log +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[system_operate_log]', RESEED, 19) +GO + + +-- ---------------------------- +-- Primary Key structure for table system_operate_log +-- ---------------------------- +ALTER TABLE [dbo].[system_operate_log] ADD CONSTRAINT [PK__system_o__3213E83F85EC81FD] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for system_post +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[system_post]', RESEED, 4) +GO + + +-- ---------------------------- +-- Primary Key structure for table system_post +-- ---------------------------- +ALTER TABLE [dbo].[system_post] ADD CONSTRAINT [PK__system_p__3213E83FBC098F34] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for system_role +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[system_role]', RESEED, 111) +GO + + +-- ---------------------------- +-- Primary Key structure for table system_role +-- ---------------------------- +ALTER TABLE [dbo].[system_role] ADD CONSTRAINT [PK__system_r__3213E83F209B43F2] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for system_role_menu +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[system_role_menu]', RESEED, 191) +GO + + +-- ---------------------------- +-- Primary Key structure for table system_role_menu +-- ---------------------------- +ALTER TABLE [dbo].[system_role_menu] ADD CONSTRAINT [PK__system_r__3213E83F6F1E4A9B] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for system_sensitive_word +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[system_sensitive_word]', RESEED, 4) +GO + + +-- ---------------------------- +-- Primary Key structure for table system_sensitive_word +-- ---------------------------- +ALTER TABLE [dbo].[system_sensitive_word] ADD CONSTRAINT [PK__system_s__3213E83FFFD8E555] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for system_sms_channel +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[system_sms_channel]', RESEED, 6) +GO + + +-- ---------------------------- +-- Primary Key structure for table system_sms_channel +-- ---------------------------- +ALTER TABLE [dbo].[system_sms_channel] ADD CONSTRAINT [PK__system_s__3213E83FA96B966E] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for system_sms_code +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[system_sms_code]', RESEED, 470) +GO + + +-- ---------------------------- +-- Primary Key structure for table system_sms_code +-- ---------------------------- +ALTER TABLE [dbo].[system_sms_code] ADD CONSTRAINT [PK__system_s__3213E83F825CBCB9] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for system_sms_log +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[system_sms_log]', RESEED, 6) +GO + + +-- ---------------------------- +-- Primary Key structure for table system_sms_log +-- ---------------------------- +ALTER TABLE [dbo].[system_sms_log] ADD CONSTRAINT [PK__system_s__3213E83F5F1968A9] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for system_sms_template +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[system_sms_template]', RESEED, 13) +GO + + +-- ---------------------------- +-- Primary Key structure for table system_sms_template +-- ---------------------------- +ALTER TABLE [dbo].[system_sms_template] ADD CONSTRAINT [PK__system_s__3213E83F5C91CA37] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for system_social_user +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[system_social_user]', RESEED, 1) +GO + + +-- ---------------------------- +-- Primary Key structure for table system_social_user +-- ---------------------------- +ALTER TABLE [dbo].[system_social_user] ADD CONSTRAINT [PK__system_s__3213E83F6EF3863C] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for system_social_user_bind +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[system_social_user_bind]', RESEED, 1) +GO + + +-- ---------------------------- +-- Primary Key structure for table system_social_user_bind +-- ---------------------------- +ALTER TABLE [dbo].[system_social_user_bind] ADD CONSTRAINT [PK__system_s__3213E83F21F44049] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for system_tenant +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[system_tenant]', RESEED, 122) +GO + + +-- ---------------------------- +-- Primary Key structure for table system_tenant +-- ---------------------------- +ALTER TABLE [dbo].[system_tenant] ADD CONSTRAINT [PK__system_t__3213E83FAF444092] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for system_tenant_package +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[system_tenant_package]', RESEED, 111) +GO + + +-- ---------------------------- +-- Primary Key structure for table system_tenant_package +-- ---------------------------- +ALTER TABLE [dbo].[system_tenant_package] ADD CONSTRAINT [PK__system_t__3213E83FA2213DB5] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for system_user_post +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[system_user_post]', RESEED, 115) +GO + + +-- ---------------------------- +-- Primary Key structure for table system_user_post +-- ---------------------------- +ALTER TABLE [dbo].[system_user_post] ADD CONSTRAINT [PK__system_u__3213E83F56DD4107] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for system_user_role +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[system_user_role]', RESEED, 17) +GO + + +-- ---------------------------- +-- Primary Key structure for table system_user_role +-- ---------------------------- +ALTER TABLE [dbo].[system_user_role] ADD CONSTRAINT [PK__system_u__3213E83F3593F652] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Auto increment value for system_users +-- ---------------------------- +DBCC CHECKIDENT ('[dbo].[system_users]', RESEED, 115) +GO + + +-- ---------------------------- +-- Primary Key structure for table system_users +-- ---------------------------- +ALTER TABLE [dbo].[system_users] ADD CONSTRAINT [PK__system_u__3213E83F7CF2516E] PRIMARY KEY CLUSTERED ([id]) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) +ON [PRIMARY] +GO + + +-- ---------------------------- +-- Foreign Keys structure for table QRTZ_BLOB_TRIGGERS +-- ---------------------------- +ALTER TABLE [dbo].[QRTZ_BLOB_TRIGGERS] ADD CONSTRAINT [FK_QRTZ_BLOB_TRIGGERS_QRTZ_TRIGGERS] FOREIGN KEY ([SCHED_NAME], [TRIGGER_NAME], [TRIGGER_GROUP]) REFERENCES [dbo].[QRTZ_TRIGGERS] ([SCHED_NAME], [TRIGGER_NAME], [TRIGGER_GROUP]) ON DELETE CASCADE ON UPDATE NO ACTION +GO + + +-- ---------------------------- +-- Foreign Keys structure for table QRTZ_CRON_TRIGGERS +-- ---------------------------- +ALTER TABLE [dbo].[QRTZ_CRON_TRIGGERS] ADD CONSTRAINT [FK_QRTZ_CRON_TRIGGERS_QRTZ_TRIGGERS] FOREIGN KEY ([SCHED_NAME], [TRIGGER_NAME], [TRIGGER_GROUP]) REFERENCES [dbo].[QRTZ_TRIGGERS] ([SCHED_NAME], [TRIGGER_NAME], [TRIGGER_GROUP]) ON DELETE CASCADE ON UPDATE NO ACTION +GO + + +-- ---------------------------- +-- Foreign Keys structure for table QRTZ_SIMPLE_TRIGGERS +-- ---------------------------- +ALTER TABLE [dbo].[QRTZ_SIMPLE_TRIGGERS] ADD CONSTRAINT [FK_QRTZ_SIMPLE_TRIGGERS_QRTZ_TRIGGERS] FOREIGN KEY ([SCHED_NAME], [TRIGGER_NAME], [TRIGGER_GROUP]) REFERENCES [dbo].[QRTZ_TRIGGERS] ([SCHED_NAME], [TRIGGER_NAME], [TRIGGER_GROUP]) ON DELETE CASCADE ON UPDATE NO ACTION +GO + + +-- ---------------------------- +-- Foreign Keys structure for table QRTZ_SIMPROP_TRIGGERS +-- ---------------------------- +ALTER TABLE [dbo].[QRTZ_SIMPROP_TRIGGERS] ADD CONSTRAINT [FK_QRTZ_SIMPROP_TRIGGERS_QRTZ_TRIGGERS] FOREIGN KEY ([SCHED_NAME], [TRIGGER_NAME], [TRIGGER_GROUP]) REFERENCES [dbo].[QRTZ_TRIGGERS] ([SCHED_NAME], [TRIGGER_NAME], [TRIGGER_GROUP]) ON DELETE CASCADE ON UPDATE NO ACTION +GO + + +-- ---------------------------- +-- Foreign Keys structure for table QRTZ_TRIGGERS +-- ---------------------------- +ALTER TABLE [dbo].[QRTZ_TRIGGERS] ADD CONSTRAINT [FK_QRTZ_TRIGGERS_QRTZ_JOB_DETAILS] FOREIGN KEY ([SCHED_NAME], [JOB_NAME], [JOB_GROUP]) REFERENCES [dbo].[QRTZ_JOB_DETAILS] ([SCHED_NAME], [JOB_NAME], [JOB_GROUP]) ON DELETE NO ACTION ON UPDATE NO ACTION +GO + diff --git a/win-dependencies/pom.xml b/win-dependencies/pom.xml new file mode 100644 index 0000000..b252bd6 --- /dev/null +++ b/win-dependencies/pom.xml @@ -0,0 +1,673 @@ + + + 4.0.0 + + com.win + win-dependencies + ${revision} + pom + + ${project.artifactId} + 基础 bom 文件,管理整个项目的依赖版本 + https://github.com/YunaiV/ruoyi-vue-pro + + + 3.0.0 + 1.5.0 + + 2.7.15 + + 1.7.0 + 4.3.0 + 2.5 + + 1.2.19 + 3.5.3.2 + 3.5.3.2 + 3.3.2 + 1.4.6 + 5.1.1 + 3.18.0 + 8.1.2.141 + + 2.2.3 + 1.7.1 + + 8.12.0 + 2.7.10 + 0.33.0 + + 7.2.11.RELEASE + 1.0.7 + 4.11.0 + + 6.8.0 + + 1.0.7 + 1.15.4 + 1.18.28 + 1.5.5.Final + 5.8.21 + 3.3.2 + 2.3 + 1.0.5 + 1.2.83 + 32.0.1-jre + 5.1.0 + 2.14.2 + 3.9.0 + 0.1.55 + 2.7.0 + 2.7.0 + + 3.0.0 + 4.10.0 + 2.11.0 + 8.5.5 + 4.6.3 + 2.2.1 + 3.1.758 + 1.6.1 + 2.12.2 + 2.3.3 + 2.1.1 + + + + + + + org.springframework.boot + spring-boot-dependencies + ${spring.boot.version} + pom + import + + + + + com.win + win-spring-boot-starter-banner + ${revision} + + + com.win + win-spring-boot-starter-biz-operatelog + ${revision} + + + com.win + win-spring-boot-starter-biz-trade + ${revision} + + + com.win + win-spring-boot-starter-biz-dict + ${revision} + + + com.win + win-spring-boot-starter-biz-sms + ${revision} + + + com.win + win-spring-boot-starter-biz-pay + ${revision} + + + com.win + win-spring-boot-starter-biz-tenant + ${revision} + + + com.win + win-spring-boot-starter-biz-data-permission + ${revision} + + + com.win + win-spring-boot-starter-biz-error-code + ${revision} + + + com.win + win-spring-boot-starter-biz-ip + ${revision} + + + com.win + win-spring-boot-starter-captcha + ${revision} + + + com.win + win-spring-boot-starter-desensitize + ${revision} + + + + + + org.springframework.boot + spring-boot-configuration-processor + ${spring.boot.version} + + + + + com.win + win-spring-boot-starter-web + ${revision} + + + + com.win + win-spring-boot-starter-security + ${revision} + + + + com.github.xiaoymin + knife4j-openapi3-spring-boot-starter + ${knife4j.version} + + + org.springdoc + springdoc-openapi-ui + ${springdoc.version} + + + + + com.win + win-spring-boot-starter-mybatis + ${revision} + + + + com.alibaba + druid-spring-boot-starter + ${druid.version} + + + com.baomidou + mybatis-plus-boot-starter + ${mybatis-plus.version} + + + com.baomidou + mybatis-plus-generator + ${mybatis-plus-generator.version} + + + com.baomidou + dynamic-datasource-spring-boot-starter + ${dynamic-datasource.version} + + + org.apache.shardingsphere + shardingsphere-jdbc-core-spring-boot-starter + ${shardingsphere.version} + + + com.github.yulichang + mybatis-plus-join-boot-starter + ${mybatis-plus-join.version} + + + + com.win + win-spring-boot-starter-redis + ${revision} + + + + org.redisson + redisson-spring-boot-starter + ${redisson.version} + + + org.springframework.boot + spring-boot-starter-actuator + + + + + + com.dameng + DmJdbcDriver18 + ${dm8.jdbc.version} + + + + + com.win + win-spring-boot-starter-job + ${revision} + + + + + com.win + win-spring-boot-starter-mq + ${revision} + + + + + com.win + win-spring-boot-starter-protection + ${revision} + + + + com.baomidou + lock4j-redisson-spring-boot-starter + ${lock4j.version} + + + redisson-spring-boot-starter + org.redisson + + + + + + io.github.resilience4j + resilience4j-ratelimiter + ${resilience4j.version} + + + io.github.resilience4j + resilience4j-spring-boot2 + ${resilience4j.version} + + + + + com.win + win-spring-boot-starter-monitor + ${revision} + + + + org.apache.skywalking + apm-toolkit-trace + ${skywalking.version} + + + org.apache.skywalking + apm-toolkit-logback-1.x + ${skywalking.version} + + + org.apache.skywalking + apm-toolkit-opentracing + ${skywalking.version} + + + + + + + + + + + + + io.opentracing + opentracing-api + ${opentracing.version} + + + io.opentracing + opentracing-util + ${opentracing.version} + + + io.opentracing + opentracing-noop + ${opentracing.version} + + + + de.codecentric + spring-boot-admin-starter-server + ${spring-boot-admin.version} + + + de.codecentric + spring-boot-admin-server-cloud + + + + + de.codecentric + spring-boot-admin-starter-client + ${spring-boot-admin.version} + + + + + com.win + win-spring-boot-starter-test + ${revision} + test + + + + org.mockito + mockito-inline + ${mockito-inline.version} + + + + org.springframework.boot + spring-boot-starter-test + ${spring.boot.version} + + + asm + org.ow2.asm + + + org.mockito + mockito-core + + + + + + com.github.fppt + jedis-mock + ${jedis-mock.version} + + + + uk.co.jemos.podam + podam + ${podam.version} + + + + + com.win + win-spring-boot-starter-flowable + ${revision} + + + org.flowable + flowable-spring-boot-starter-process + ${flowable.version} + + + org.flowable + flowable-spring-boot-starter-actuator + ${flowable.version} + + + + + + com.win + win-common + ${revision} + + + + com.win + win-spring-boot-starter-excel + ${revision} + + + + org.projectlombok + lombok + ${lombok.version} + + + + org.mapstruct + mapstruct + ${mapstruct.version} + + + org.mapstruct + mapstruct-jdk8 + ${mapstruct.version} + + + org.mapstruct + mapstruct-processor + ${mapstruct.version} + + + + cn.hutool + hutool-all + ${hutool.version} + + + + com.alibaba + easyexcel + ${easyexcel.verion} + + + commons-io + commons-io + ${commons-io.version} + + + org.apache.tika + tika-core + ${tika-core.version} + + + + org.apache.velocity + velocity-engine-core + ${velocity.version} + + + + com.alibaba + fastjson + ${fastjson.version} + + + + cn.smallbun.screw + screw-core + ${screw.version} + + + org.freemarker + freemarker + + + com.alibaba + fastjson + + + + + + com.google.guava + guava + ${guava.version} + + + + com.google.inject + guice + ${guice.version} + + + + com.alibaba + transmittable-thread-local + ${transmittable-thread-local.version} + + + + commons-net + commons-net + ${commons-net.version} + + + + com.jcraft + jsch + ${jsch.version} + + + + com.xingyuv + spring-boot-starter-captcha-plus + ${captcha-plus.version} + + + + org.lionsoul + ip2region + ${ip2region.version} + + + + org.jsoup + jsoup + ${jsoup.version} + + + + + pro.fessional + kaptcha + ${kaptcha.version} + + + javax.servlet + servlet-api + + + + + + + com.squareup.okio + okio + ${okio.version} + + + com.squareup.okhttp3 + okhttp + ${okhttp3.version} + + + com.win + win-spring-boot-starter-file + ${revision} + + + io.minio + minio + ${minio.version} + + + + + com.aliyun + aliyun-java-sdk-core + ${aliyun-java-sdk-core.version} + + + opentracing-api + io.opentracing + + + opentracing-util + io.opentracing + + + + + com.aliyun + aliyun-java-sdk-dysmsapi + ${aliyun-java-sdk-dysmsapi.version} + + + com.tencentcloudapi + tencentcloud-sdk-java-sms + ${tencentcloud-sdk-java.version} + + + + + + org.jeecgframework.jimureport + jimureport-spring-boot-starter + ${jimureport.version} + + + com.alibaba + druid + + + + + xerces + xercesImpl + ${xercesImpl.version} + + + + org.springframework.boot + spring-boot-starter-websocket + ${spring.boot.version} + + + + org.ssssssss + magic-api-spring-boot-starter + ${magic-api.version} + + + + + + + + + org.codehaus.mojo + flatten-maven-plugin + ${flatten-maven-plugin.version} + + resolveCiFriendliesOnly + true + + + + + flatten + + flatten + process-resources + + + + clean + + flatten.clean + clean + + + + + + + diff --git a/win-framework/pom.xml b/win-framework/pom.xml new file mode 100644 index 0000000..a16ba8f --- /dev/null +++ b/win-framework/pom.xml @@ -0,0 +1,51 @@ + + + 4.0.0 + + win + com.win + ${revision} + + pom + + win-common + win-spring-boot-starter-banner + win-spring-boot-starter-mybatis + win-spring-boot-starter-redis + win-spring-boot-starter-web + win-spring-boot-starter-security + win-spring-boot-starter-file + win-spring-boot-starter-monitor + win-spring-boot-starter-protection + win-spring-boot-starter-job + win-spring-boot-starter-mq + win-spring-boot-starter-excel + win-spring-boot-starter-test + win-spring-boot-starter-biz-operatelog + win-spring-boot-starter-biz-dict + win-spring-boot-starter-biz-sms + win-spring-boot-starter-biz-tenant + win-spring-boot-starter-biz-data-permission + win-spring-boot-starter-biz-error-code + win-spring-boot-starter-biz-ip + win-spring-boot-starter-flowable + win-spring-boot-starter-captcha + win-spring-boot-starter-websocket + win-spring-boot-starter-desensitize + + + win-framework + + 该包是技术组件,每个子包,代表一个组件。每个组件包括两部分: + 1. core 包:是该组件的核心封装 + 2. config 包:是该组件基于 Spring 的配置 + 技术组件,也分成两类: + 1. 框架组件:和我们熟悉的 MyBatis、Redis 等等的拓展 + 2. 业务组件:和业务相关的组件的封装,例如说数据字典、操作日志等等。 + 如果是业务组件,Maven 名字会包含 biz + + https://github.com/YunaiV/ruoyi-vue-pro + + diff --git a/win-framework/win-common/pom.xml b/win-framework/win-common/pom.xml new file mode 100644 index 0000000..b8ce9a7 --- /dev/null +++ b/win-framework/win-common/pom.xml @@ -0,0 +1,144 @@ + + + + com.win + win-framework + ${revision} + + 4.0.0 + win-common + jar + + ${project.artifactId} + 定义基础 pojo 类、枚举、工具类等等 + https://github.com/YunaiV/ruoyi-vue-pro + + + + + org.springframework + spring-core + provided + + + org.springframework + spring-expression + provided + + + org.springframework + spring-aop + provided + + + org.aspectj + aspectjweaver + provided + + + + + org.springframework.boot + spring-boot-configuration-processor + true + + + + + org.springframework + spring-web + provided + + + + jakarta.servlet + jakarta.servlet-api + provided + + + + org.springdoc + springdoc-openapi-ui + provided + + + + + org.apache.skywalking + apm-toolkit-trace + + + + + org.projectlombok + lombok + + + + org.mapstruct + mapstruct + + + org.mapstruct + mapstruct-jdk8 + + + org.mapstruct + mapstruct-processor + + + + com.google.guava + guava + provided + + + + com.fasterxml.jackson.core + jackson-databind + provided + + + com.fasterxml.jackson.core + jackson-core + provided + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + provided + + + + org.slf4j + slf4j-api + provided + + + + jakarta.validation + jakarta.validation-api + provided + + + + cn.hutool + hutool-all + + + + com.alibaba + transmittable-thread-local + + + + + org.springframework.boot + spring-boot-starter-test + test + + + + diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/core/IntArrayValuable.java b/win-framework/win-common/src/main/java/com/win/framework/common/core/IntArrayValuable.java new file mode 100644 index 0000000..32577ca --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/core/IntArrayValuable.java @@ -0,0 +1,15 @@ +package com.win.framework.common.core; + +/** + * 可生成 Int 数组的接口 + * + * @author 闻荫源码 + */ +public interface IntArrayValuable { + + /** + * @return int 数组 + */ + int[] array(); + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/core/KeyValue.java b/win-framework/win-common/src/main/java/com/win/framework/common/core/KeyValue.java new file mode 100644 index 0000000..5ce1115 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/core/KeyValue.java @@ -0,0 +1,20 @@ +package com.win.framework.common.core; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * Key Value 的键值对 + * + * @author 闻荫源码 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class KeyValue { + + private K key; + private V value; + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/enums/CommonStatusEnum.java b/win-framework/win-common/src/main/java/com/win/framework/common/enums/CommonStatusEnum.java new file mode 100644 index 0000000..66e79b3 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/enums/CommonStatusEnum.java @@ -0,0 +1,56 @@ +package com.win.framework.common.enums; + +import com.win.framework.common.core.IntArrayValuable; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; +import java.util.stream.Stream; + +/** + * 通用状态枚举 + * + * @author 闻荫源码 + */ +@Getter +@AllArgsConstructor +public enum CommonStatusEnum implements IntArrayValuable { + + ENABLE(0, "开启"), + DISABLE(1, "关闭"); + + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CommonStatusEnum::getStatus).toArray(); + + /** + * 状态值 + */ + private final Integer status; + /** + * 状态名 + */ + private final String name; + + @Override + public int[] array() { + return ARRAYS; + } + + public static CommonStatusEnum convert(Integer value) { + return Stream.of(values()) + .filter(bean -> bean.status.equals(value)) + .findAny() + .orElse(DISABLE); + } + + public static CommonStatusEnum convert(String description) { + return Stream.of(values()) + .filter(bean -> bean.name.equals(description)) + .findAny() + .orElse(DISABLE); + } + + public static String[] getStatusNameArray() { + return Stream.of(values()).map(CommonStatusEnum::getName).toArray(String[]::new); + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/enums/DocumentEnum.java b/win-framework/win-common/src/main/java/com/win/framework/common/enums/DocumentEnum.java new file mode 100644 index 0000000..7ece04d --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/enums/DocumentEnum.java @@ -0,0 +1,21 @@ +package com.win.framework.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 文档地址 + * + * @author 闻荫源码 + */ +@Getter +@AllArgsConstructor +public enum DocumentEnum { + + REDIS_INSTALL("https://gitee.com/zhijiantianya/ruoyi-vue-pro/issues/I4VCSJ", "Redis 安装文档"), + TENANT("https://doc.iocoder.cn", "SaaS 多租户文档"); + + private final String url; + private final String memo; + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/enums/WebFilterOrderEnum.java b/win-framework/win-common/src/main/java/com/win/framework/common/enums/WebFilterOrderEnum.java new file mode 100644 index 0000000..52d43ea --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/enums/WebFilterOrderEnum.java @@ -0,0 +1,34 @@ +package com.win.framework.common.enums; + +/** + * Web 过滤器顺序的枚举类,保证过滤器按照符合我们的预期 + * + * 考虑到每个 starter 都需要用到该工具类,所以放到 common 模块下的 enums 包下 + * + * @author 闻荫源码 + */ +public interface WebFilterOrderEnum { + + int CORS_FILTER = Integer.MIN_VALUE; + + int TRACE_FILTER = CORS_FILTER + 1; + + int REQUEST_BODY_CACHE_FILTER = Integer.MIN_VALUE + 500; + + // OrderedRequestContextFilter 默认为 -105,用于国际化上下文等等 + + int TENANT_CONTEXT_FILTER = - 104; // 需要保证在 ApiAccessLogFilter 前面 + + int API_ACCESS_LOG_FILTER = -103; // 需要保证在 RequestBodyCacheFilter 后面 + + int XSS_FILTER = -102; // 需要保证在 RequestBodyCacheFilter 后面 + + // Spring Security Filter 默认为 -100,可见 org.springframework.boot.autoconfigure.security.SecurityProperties 配置属性类 + + int TENANT_SECURITY_FILTER = -99; // 需要保证在 Spring Security 过滤器后面 + + int FLOWABLE_FILTER = -98; // 需要保证在 Spring Security 过滤后面 + + int DEMO_FILTER = Integer.MAX_VALUE; + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/exception/ErrorCode.java b/win-framework/win-common/src/main/java/com/win/framework/common/exception/ErrorCode.java new file mode 100644 index 0000000..f14fe99 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/exception/ErrorCode.java @@ -0,0 +1,32 @@ +package com.win.framework.common.exception; + +import com.win.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.win.framework.common.exception.enums.ServiceErrorCodeRange; +import lombok.Data; + +/** + * 错误码对象 + * + * 全局错误码,占用 [0, 999], 参见 {@link GlobalErrorCodeConstants} + * 业务异常错误码,占用 [1 000 000 000, +∞),参见 {@link ServiceErrorCodeRange} + * + * TODO 错误码设计成对象的原因,为未来的 i18 国际化做准备 + */ +@Data +public class ErrorCode { + + /** + * 错误码 + */ + private final Integer code; + /** + * 错误提示 + */ + private final String msg; + + public ErrorCode(Integer code, String message) { + this.code = code; + this.msg = message; + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/exception/ServerException.java b/win-framework/win-common/src/main/java/com/win/framework/common/exception/ServerException.java new file mode 100644 index 0000000..de580c3 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/exception/ServerException.java @@ -0,0 +1,60 @@ +package com.win.framework.common.exception; + +import com.win.framework.common.exception.enums.GlobalErrorCodeConstants; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 服务器异常 Exception + */ +@Data +@EqualsAndHashCode(callSuper = true) +public final class ServerException extends RuntimeException { + + /** + * 全局错误码 + * + * @see GlobalErrorCodeConstants + */ + private Integer code; + /** + * 错误提示 + */ + private String message; + + /** + * 空构造方法,避免反序列化问题 + */ + public ServerException() { + } + + public ServerException(ErrorCode errorCode) { + this.code = errorCode.getCode(); + this.message = errorCode.getMsg(); + } + + public ServerException(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return code; + } + + public ServerException setCode(Integer code) { + this.code = code; + return this; + } + + @Override + public String getMessage() { + return message; + } + + public ServerException setMessage(String message) { + this.message = message; + return this; + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/exception/ServiceException.java b/win-framework/win-common/src/main/java/com/win/framework/common/exception/ServiceException.java new file mode 100644 index 0000000..4455451 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/exception/ServiceException.java @@ -0,0 +1,60 @@ +package com.win.framework.common.exception; + +import com.win.framework.common.exception.enums.ServiceErrorCodeRange; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 业务逻辑异常 Exception + */ +@Data +@EqualsAndHashCode(callSuper = true) +public final class ServiceException extends RuntimeException { + + /** + * 业务错误码 + * + * @see ServiceErrorCodeRange + */ + private Integer code; + /** + * 错误提示 + */ + private String message; + + /** + * 空构造方法,避免反序列化问题 + */ + public ServiceException() { + } + + public ServiceException(ErrorCode errorCode) { + this.code = errorCode.getCode(); + this.message = errorCode.getMsg(); + } + + public ServiceException(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return code; + } + + public ServiceException setCode(Integer code) { + this.code = code; + return this; + } + + @Override + public String getMessage() { + return message; + } + + public ServiceException setMessage(String message) { + this.message = message; + return this; + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/exception/enums/GlobalErrorCodeConstants.java b/win-framework/win-common/src/main/java/com/win/framework/common/exception/enums/GlobalErrorCodeConstants.java new file mode 100644 index 0000000..b83510b --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/exception/enums/GlobalErrorCodeConstants.java @@ -0,0 +1,40 @@ +package com.win.framework.common.exception.enums; + +import com.win.framework.common.exception.ErrorCode; + +/** + * 全局错误码枚举 + * 0-999 系统异常编码保留 + * + * 一般情况下,使用 HTTP 响应状态码 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status + * 虽然说,HTTP 响应状态码作为业务使用表达能力偏弱,但是使用在系统层面还是非常不错的 + * 比较特殊的是,因为之前一直使用 0 作为成功,就不使用 200 啦。 + * + * @author 闻荫源码 + */ +public interface GlobalErrorCodeConstants { + + ErrorCode SUCCESS = new ErrorCode(0, "成功"); + + // ========== 客户端错误段 ========== + + ErrorCode BAD_REQUEST = new ErrorCode(400, "请求参数不正确"); + ErrorCode UNAUTHORIZED = new ErrorCode(401, "账号未登录"); + ErrorCode FORBIDDEN = new ErrorCode(403, "没有该操作权限"); + ErrorCode NOT_FOUND = new ErrorCode(404, "请求未找到"); + ErrorCode METHOD_NOT_ALLOWED = new ErrorCode(405, "请求方法不正确"); + ErrorCode LOCKED = new ErrorCode(423, "请求失败,请稍后重试"); // 并发请求,不允许 + ErrorCode TOO_MANY_REQUESTS = new ErrorCode(429, "请求过于频繁,请稍后重试"); + + // ========== 服务端错误段 ========== + + ErrorCode INTERNAL_SERVER_ERROR = new ErrorCode(500, "系统异常"); + ErrorCode NOT_IMPLEMENTED = new ErrorCode(501, "功能未实现/未开启"); + + // ========== 自定义错误段 ========== + ErrorCode REPEATED_REQUESTS = new ErrorCode(900, "重复请求,请稍后重试"); // 重复请求 + ErrorCode DEMO_DENY = new ErrorCode(901, "演示模式,禁止写操作"); + + ErrorCode UNKNOWN = new ErrorCode(999, "未知错误"); + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/exception/enums/ServiceErrorCodeRange.java b/win-framework/win-common/src/main/java/com/win/framework/common/exception/enums/ServiceErrorCodeRange.java new file mode 100644 index 0000000..b6bf7dd --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/exception/enums/ServiceErrorCodeRange.java @@ -0,0 +1,43 @@ +package com.win.framework.common.exception.enums; + +/** + * 业务异常的错误码区间,解决:解决各模块错误码定义,避免重复,在此只声明不做实际使用 + * + * 一共 10 位,分成四段 + * + * 第一段,1 位,类型 + * 1 - 业务级别异常 + * x - 预留 + * 第二段,3 位,系统类型 + * 001 - 用户系统 + * 002 - 商品系统 + * 003 - 订单系统 + * 004 - 支付系统 + * 005 - 优惠劵系统 + * ... - ... + * 第三段,3 位,模块 + * 不限制规则。 + * 一般建议,每个系统里面,可能有多个模块,可以再去做分段。以用户系统为例子: + * 001 - OAuth2 模块 + * 002 - User 模块 + * 003 - MobileCode 模块 + * 第四段,3 位,错误码 + * 不限制规则。 + * 一般建议,每个模块自增。 + * + * @author 闻荫源码 + */ +public class ServiceErrorCodeRange { + + // 模块 infra 错误码区间 [1-001-000-000 ~ 1-002-000-000) + // 模块 system 错误码区间 [1-002-000-000 ~ 1-003-000-000) + // 模块 report 错误码区间 [1-003-000-000 ~ 1-004-000-000) + // 模块 member 错误码区间 [1-004-000-000 ~ 1-005-000-000) + // 模块 mp 错误码区间 [1-006-000-000 ~ 1-007-000-000) + // 模块 pay 错误码区间 [1-007-000-000 ~ 1-008-000-000) + // 模块 product 错误码区间 [1-008-000-000 ~ 1-009-000-000) + // 模块 bpm 错误码区间 [1-009-000-000 ~ 1-010-000-000) + // 模块 trade 错误码区间 [1-011-000-000 ~ 1-012-000-000) + // 模块 promotion 错误码区间 [1-013-000-000 ~ 1-014-000-000) + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/exception/util/ServiceExceptionUtil.java b/win-framework/win-common/src/main/java/com/win/framework/common/exception/util/ServiceExceptionUtil.java new file mode 100644 index 0000000..e16f654 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/exception/util/ServiceExceptionUtil.java @@ -0,0 +1,128 @@ +package com.win.framework.common.exception.util; + +import com.win.framework.common.exception.ErrorCode; +import com.win.framework.common.exception.ServiceException; +import com.win.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.google.common.annotations.VisibleForTesting; +import com.win.framework.common.util.i18n.MessageUtil; +import lombok.extern.slf4j.Slf4j; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +/** + * {@link ServiceException} 工具类 + * + * 目的在于,格式化异常信息提示。 + * 考虑到 String.format 在参数不正确时会报错,因此使用 {} 作为占位符,并使用 {@link #doFormat(int, String, Object...)} 方法来格式化 + * + * 因为 {@link #MESSAGES} 里面默认是没有异常信息提示的模板的,所以需要使用方自己初始化进去。目前想到的有几种方式: + * + * 1. 异常提示信息,写在枚举类中,例如说,cn.iocoder.oceans.user.api.constants.ErrorCodeEnum 类 + ServiceExceptionConfiguration + * 2. 异常提示信息,写在 .properties 等等配置文件 + * 3. 异常提示信息,写在 Apollo 等等配置中心中,从而实现可动态刷新 + * 4. 异常提示信息,存储在 db 等等数据库中,从而实现可动态刷新 + */ +@Slf4j +public class ServiceExceptionUtil { + + /** + * 错误码提示模板 + */ + private static final ConcurrentMap MESSAGES = new ConcurrentHashMap<>(); + + public static void putAll(Map messages) { + ServiceExceptionUtil.MESSAGES.putAll(messages); + } + + public static void put(Integer code, String message) { + ServiceExceptionUtil.MESSAGES.put(code, message); + } + + public static void delete(Integer code, String message) { + ServiceExceptionUtil.MESSAGES.remove(code, message); + } + + // ========== 和 ServiceException 的集成 ========== + + public static ServiceException exception(ErrorCode errorCode) { + String messagePattern = MESSAGES.getOrDefault(errorCode.getCode(), errorCode.getMsg()); + return exception0(errorCode.getCode(), messagePattern); + } + + public static ServiceException exception(ErrorCode errorCode, Object... params) { + String messagePattern = MESSAGES.getOrDefault(errorCode.getCode(), errorCode.getMsg()); + return exception0(errorCode.getCode(), messagePattern, params); + } + + /** + * 创建指定编号的 ServiceException 的异常 + * + * @param code 编号 + * @return 异常 + */ + public static ServiceException exception(Integer code) { + return exception0(code, MESSAGES.get(code)); + } + + /** + * 创建指定编号的 ServiceException 的异常 + * + * @param code 编号 + * @param params 消息提示的占位符对应的参数 + * @return 异常 + */ + public static ServiceException exception(Integer code, Object... params) { + return exception0(code, MESSAGES.get(code), params); + } + + public static ServiceException exception0(Integer code, String messagePattern, Object... params) { + String message = doFormat(code, MessageUtil.message(messagePattern), params); + return new ServiceException(code, message); + } + + public static ServiceException invalidParamException(String messagePattern, Object... params) { + return exception0(GlobalErrorCodeConstants.BAD_REQUEST.getCode(), messagePattern, params); + } + + // ========== 格式化方法 ========== + + /** + * 将错误编号对应的消息使用 params 进行格式化。 + * + * @param code 错误编号 + * @param messagePattern 消息模版 + * @param params 参数 + * @return 格式化后的提示 + */ + @VisibleForTesting + public static String doFormat(int code, String messagePattern, Object... params) { + StringBuilder sbuf = new StringBuilder(messagePattern.length() + 50); + int i = 0; + int j; + int l; + for (l = 0; l < params.length; l++) { + j = messagePattern.indexOf("{}", i); + if (j == -1) { + log.error("[doFormat][参数过多:错误码({})|错误内容({})|参数({})", code, messagePattern, params); + if (i == 0) { + return messagePattern; + } else { + sbuf.append(messagePattern.substring(i)); + return sbuf.toString(); + } + } else { + sbuf.append(messagePattern, i, j); + sbuf.append(params[l]); + i = j + 2; + } + } + if (messagePattern.indexOf("{}", i) != -1) { + log.error("[doFormat][参数过少:错误码({})|错误内容({})|参数({})", code, messagePattern, params); + } + sbuf.append(messagePattern.substring(i)); + return sbuf.toString(); + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/pojo/CommonResult.java b/win-framework/win-common/src/main/java/com/win/framework/common/pojo/CommonResult.java new file mode 100644 index 0000000..81716f9 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/pojo/CommonResult.java @@ -0,0 +1,112 @@ +package com.win.framework.common.pojo; + +import com.win.framework.common.exception.ErrorCode; +import com.win.framework.common.exception.ServiceException; +import com.win.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; +import org.springframework.util.Assert; + +import java.io.Serializable; +import java.util.Objects; + +/** + * 通用返回 + * + * @param 数据泛型 + */ +@Data +public class CommonResult implements Serializable { + + /** + * 错误码 + * + * @see ErrorCode#getCode() + */ + private Integer code; + /** + * 返回数据 + */ + private T data; + /** + * 错误提示,用户可阅读 + * + * @see ErrorCode#getMsg() () + */ + private String msg; + + /** + * 将传入的 result 对象,转换成另外一个泛型结果的对象 + * + * 因为 A 方法返回的 CommonResult 对象,不满足调用其的 B 方法的返回,所以需要进行转换。 + * + * @param result 传入的 result 对象 + * @param 返回的泛型 + * @return 新的 CommonResult 对象 + */ + public static CommonResult error(CommonResult result) { + return error(result.getCode(), result.getMsg()); + } + + public static CommonResult error(Integer code, String message) { + Assert.isTrue(!GlobalErrorCodeConstants.SUCCESS.getCode().equals(code), "code 必须是错误的!"); + CommonResult result = new CommonResult<>(); + result.code = code; + result.msg = message; + return result; + } + + public static CommonResult error(ErrorCode errorCode) { + return error(errorCode.getCode(), errorCode.getMsg()); + } + + public static CommonResult success(T data) { + CommonResult result = new CommonResult<>(); + result.code = GlobalErrorCodeConstants.SUCCESS.getCode(); + result.data = data; + result.msg = ""; + return result; + } + + public static boolean isSuccess(Integer code) { + return Objects.equals(code, GlobalErrorCodeConstants.SUCCESS.getCode()); + } + + @JsonIgnore // 避免 jackson 序列化 + public boolean isSuccess() { + return isSuccess(code); + } + + @JsonIgnore // 避免 jackson 序列化 + public boolean isError() { + return !isSuccess(); + } + + // ========= 和 Exception 异常体系集成 ========= + + /** + * 判断是否有异常。如果有,则抛出 {@link ServiceException} 异常 + */ + public void checkError() throws ServiceException { + if (isSuccess()) { + return; + } + // 业务异常 + throw new ServiceException(code, msg); + } + + /** + * 判断是否有异常。如果有,则抛出 {@link ServiceException} 异常 + * 如果没有,则返回 {@link #data} 数据 + */ + @JsonIgnore // 避免 jackson 序列化 + public T getCheckedData() { + checkError(); + return data; + } + + public static CommonResult error(ServiceException serviceException) { + return error(serviceException.getCode(), serviceException.getMessage()); + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/pojo/CustomConditions.java b/win-framework/win-common/src/main/java/com/win/framework/common/pojo/CustomConditions.java new file mode 100644 index 0000000..1f86d9a --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/pojo/CustomConditions.java @@ -0,0 +1,32 @@ +package com.win.framework.common.pojo; + +import lombok.Data; + +import java.util.List; + +@Data +public class CustomConditions extends PageParam { + + /** + * 自定义条件 + */ + private List filters; + + @Data + public static class Condition { + + /** + * 类型,==,!=,>,<,>=,<=,like,in,notIn,betweeen,isNull,isNotNull + */ + private String action; + /** + * 字段 + */ + private String column; + /** + * 值 + */ + private String value; + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/pojo/PageParam.java b/win-framework/win-common/src/main/java/com/win/framework/common/pojo/PageParam.java new file mode 100644 index 0000000..a340b46 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/pojo/PageParam.java @@ -0,0 +1,64 @@ +package com.win.framework.common.pojo; + +import com.google.common.base.CaseFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.Min; +import javax.validation.constraints.Max; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +@Schema(description="分页参数") +@Data +public class PageParam implements Serializable { + + private static final Integer PAGE_NO = 1; + private static final Integer PAGE_SIZE = 10; + + @Schema(description = "页码,从 1 开始", requiredMode = Schema.RequiredMode.REQUIRED,example = "1") + @NotNull(message = "页码不能为空") + @Min(value = 1, message = "页码最小值为 1") + private Integer pageNo = PAGE_NO; + + @Schema(description = "每页条数,最大值为 100", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") + @NotNull(message = "每页条数不能为空") + @Min(value = 1, message = "每页条数最小值为 1") + @Max(value = 100, message = "每页条数最大值为 100") + private Integer pageSize = PAGE_SIZE; + + /** + * 顺序 - 升序 + */ + public static final String ORDER_ASC = "ASC"; + + /** + * 顺序 - 降序 + */ + public static final String ORDER_DESC = "DESC"; + + /** + * 字段 + */ + @Schema(description = "排序属性", requiredMode = Schema.RequiredMode.REQUIRED, example = "userName") + private String sort; + + /** + * 顺序 + */ + @Schema(description = "排序类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "DESC") + private String by; + + public void setSort(String sort) { + if(sort != null) { + this.sort = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, sort); + } + } + + public void setBy(String by) { + if(by != null) { + this.by = by.toUpperCase(); + } + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/pojo/PageResult.java b/win-framework/win-common/src/main/java/com/win/framework/common/pojo/PageResult.java new file mode 100644 index 0000000..d9dee04 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/pojo/PageResult.java @@ -0,0 +1,41 @@ +package com.win.framework.common.pojo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +@Schema(description = "分页结果") +@Data +public final class PageResult implements Serializable { + + @Schema(description = "数据", requiredMode = Schema.RequiredMode.REQUIRED) + private List list; + + @Schema(description = "总量", requiredMode = Schema.RequiredMode.REQUIRED) + private Long total; + + public PageResult() { + } + + public PageResult(List list, Long total) { + this.list = list; + this.total = total; + } + + public PageResult(Long total) { + this.list = new ArrayList<>(); + this.total = total; + } + + public static PageResult empty() { + return new PageResult<>(0L); + } + + public static PageResult empty(Long total) { + return new PageResult<>(total); + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/util/cache/CacheUtils.java b/win-framework/win-common/src/main/java/com/win/framework/common/util/cache/CacheUtils.java new file mode 100644 index 0000000..c931042 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/util/cache/CacheUtils.java @@ -0,0 +1,25 @@ +package com.win.framework.common.util.cache; + +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; + +import java.time.Duration; +import java.util.concurrent.Executors; + +/** + * Cache 工具类 + * + * @author 闻荫源码 + */ +public class CacheUtils { + + public static LoadingCache buildAsyncReloadingCache(Duration duration, CacheLoader loader) { + return CacheBuilder.newBuilder() + // 只阻塞当前数据加载线程,其他线程返回旧值 + .refreshAfterWrite(duration) + // 通过 asyncReloading 实现全异步加载,包括 refreshAfterWrite 被阻塞的加载线程 + .build(CacheLoader.asyncReloading(loader, Executors.newCachedThreadPool())); // TODO 芋艿:可能要思考下,未来要不要做成可配置 + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/util/collection/ArrayUtils.java b/win-framework/win-common/src/main/java/com/win/framework/common/util/collection/ArrayUtils.java new file mode 100644 index 0000000..b6de0f9 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/util/collection/ArrayUtils.java @@ -0,0 +1,58 @@ +package com.win.framework.common.util.collection; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.collection.IterUtil; +import cn.hutool.core.util.ArrayUtil; + +import java.util.Collection; +import java.util.function.Consumer; +import java.util.function.Function; + +import static com.win.framework.common.util.collection.CollectionUtils.convertList; + +/** + * Array 工具类 + * + * @author 闻荫源码 + */ +public class ArrayUtils { + + /** + * 将 object 和 newElements 合并成一个数组 + * + * @param object 对象 + * @param newElements 数组 + * @param 泛型 + * @return 结果数组 + */ + @SafeVarargs + public static Consumer[] append(Consumer object, Consumer... newElements) { + if (object == null) { + return newElements; + } + Consumer[] result = ArrayUtil.newArray(Consumer.class, 1 + newElements.length); + result[0] = object; + System.arraycopy(newElements, 0, result, 1, newElements.length); + return result; + } + + public static V[] toArray(Collection from, Function mapper) { + return toArray(convertList(from, mapper)); + } + + @SuppressWarnings("unchecked") + public static T[] toArray(Collection from) { + if (CollectionUtil.isEmpty(from)) { + return (T[]) (new Object[0]); + } + return ArrayUtil.toArray(from, (Class) IterUtil.getElementType(from.iterator())); + } + + public static T get(T[] array, int index) { + if (null == array || index >= array.length) { + return null; + } + return array[index]; + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/util/collection/CollectionUtils.java b/win-framework/win-common/src/main/java/com/win/framework/common/util/collection/CollectionUtils.java new file mode 100644 index 0000000..6eef35f --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/util/collection/CollectionUtils.java @@ -0,0 +1,247 @@ +package com.win.framework.common.util.collection; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import com.google.common.collect.ImmutableMap; + +import java.util.*; +import java.util.function.*; +import java.util.stream.Collectors; + +import static java.util.Arrays.asList; + +/** + * Collection 工具类 + * + * @author 闻荫源码 + */ +public class CollectionUtils { + + public static boolean containsAny(Object source, Object... targets) { + return asList(targets).contains(source); + } + + public static boolean isAnyEmpty(Collection... collections) { + return Arrays.stream(collections).anyMatch(CollectionUtil::isEmpty); + } + + public static boolean anyMatch(Collection from, Predicate predicate) { + return from.stream().anyMatch(predicate); + } + + public static List filterList(Collection from, Predicate predicate) { + if (CollUtil.isEmpty(from)) { + return new ArrayList<>(); + } + return from.stream().filter(predicate).collect(Collectors.toList()); + } + + public static List distinct(Collection from, Function keyMapper) { + if (CollUtil.isEmpty(from)) { + return new ArrayList<>(); + } + return distinct(from, keyMapper, (t1, t2) -> t1); + } + + public static List distinct(Collection from, Function keyMapper, BinaryOperator cover) { + if (CollUtil.isEmpty(from)) { + return new ArrayList<>(); + } + return new ArrayList<>(convertMap(from, keyMapper, Function.identity(), cover).values()); + } + + public static List convertList(Collection from, Function func) { + if (CollUtil.isEmpty(from)) { + return new ArrayList<>(); + } + return from.stream().map(func).filter(Objects::nonNull).collect(Collectors.toList()); + } + + public static List convertList(Collection from, Function func, Predicate filter) { + if (CollUtil.isEmpty(from)) { + return new ArrayList<>(); + } + return from.stream().filter(filter).map(func).filter(Objects::nonNull).collect(Collectors.toList()); + } + + public static Set convertSet(Collection from, Function func) { + if (CollUtil.isEmpty(from)) { + return new HashSet<>(); + } + return from.stream().map(func).filter(Objects::nonNull).collect(Collectors.toSet()); + } + + public static Set convertSet(Collection from, Function func, Predicate filter) { + if (CollUtil.isEmpty(from)) { + return new HashSet<>(); + } + return from.stream().filter(filter).map(func).filter(Objects::nonNull).collect(Collectors.toSet()); + } + + public static Map convertMap(Collection from, Function keyFunc) { + if (CollUtil.isEmpty(from)) { + return new HashMap<>(); + } + return convertMap(from, keyFunc, Function.identity()); + } + + public static Map convertMap(Collection from, Function keyFunc, Supplier> supplier) { + if (CollUtil.isEmpty(from)) { + return supplier.get(); + } + return convertMap(from, keyFunc, Function.identity(), supplier); + } + + public static Map convertMap(Collection from, Function keyFunc, Function valueFunc) { + if (CollUtil.isEmpty(from)) { + return new HashMap<>(); + } + return convertMap(from, keyFunc, valueFunc, (v1, v2) -> v1); + } + + public static Map convertMap(Collection from, Function keyFunc, Function valueFunc, BinaryOperator mergeFunction) { + if (CollUtil.isEmpty(from)) { + return new HashMap<>(); + } + return convertMap(from, keyFunc, valueFunc, mergeFunction, HashMap::new); + } + + public static Map convertMap(Collection from, Function keyFunc, Function valueFunc, Supplier> supplier) { + if (CollUtil.isEmpty(from)) { + return supplier.get(); + } + return convertMap(from, keyFunc, valueFunc, (v1, v2) -> v1, supplier); + } + + public static Map convertMap(Collection from, Function keyFunc, Function valueFunc, BinaryOperator mergeFunction, Supplier> supplier) { + if (CollUtil.isEmpty(from)) { + return new HashMap<>(); + } + return from.stream().collect(Collectors.toMap(keyFunc, valueFunc, mergeFunction, supplier)); + } + + public static Map> convertMultiMap(Collection from, Function keyFunc) { + if (CollUtil.isEmpty(from)) { + return new HashMap<>(); + } + return from.stream().collect(Collectors.groupingBy(keyFunc, Collectors.mapping(t -> t, Collectors.toList()))); + } + + public static Map> convertMultiMap(Collection from, Function keyFunc, Function valueFunc) { + if (CollUtil.isEmpty(from)) { + return new HashMap<>(); + } + return from.stream() + .collect(Collectors.groupingBy(keyFunc, Collectors.mapping(valueFunc, Collectors.toList()))); + } + + // 暂时没想好名字,先以 2 结尾噶 + public static Map> convertMultiMap2(Collection from, Function keyFunc, Function valueFunc) { + if (CollUtil.isEmpty(from)) { + return new HashMap<>(); + } + return from.stream().collect(Collectors.groupingBy(keyFunc, Collectors.mapping(valueFunc, Collectors.toSet()))); + } + + public static Map convertImmutableMap(Collection from, Function keyFunc) { + if (CollUtil.isEmpty(from)) { + return Collections.emptyMap(); + } + ImmutableMap.Builder builder = ImmutableMap.builder(); + from.forEach(item -> builder.put(keyFunc.apply(item), item)); + return builder.build(); + } + + /** + * 对比老、新两个列表,找出新增、修改、删除的数据 + * + * @param oldList 老列表 + * @param newList 新列表 + * @param sameFunc 对比函数,返回 true 表示相同,返回 false 表示不同 + * 注意,same 是通过每个元素的“标识”,判断它们是不是同一个数据 + * @return [新增列表、修改列表、删除列表] + */ + public static List> diffList(Collection oldList, Collection newList, + BiFunction sameFunc) { + List createList = new LinkedList<>(newList); // 默认都认为是新增的,后续会进行移除 + List updateList = new ArrayList<>(); + List deleteList = new ArrayList<>(); + + // 通过以 oldList 为主遍历,找出 updateList 和 deleteList + for (T oldObj : oldList) { + // 1. 寻找是否有匹配的 + T foundObj = null; + for (Iterator iterator = createList.iterator(); iterator.hasNext(); ) { + T newObj = iterator.next(); + // 1.1 不匹配,则直接跳过 + if (!sameFunc.apply(oldObj, newObj)) { + continue; + } + // 1.2 匹配,则移除,并结束寻找 + iterator.remove(); + foundObj = newObj; + break; + } + // 2. 匹配添加到 updateList;不匹配则添加到 deleteList 中 + if (foundObj != null) { + updateList.add(foundObj); + } else { + deleteList.add(oldObj); + } + } + return asList(createList, updateList, deleteList); + } + + public static boolean containsAny(Collection source, Collection candidates) { + return org.springframework.util.CollectionUtils.containsAny(source, candidates); + } + + public static T getFirst(List from) { + return !CollectionUtil.isEmpty(from) ? from.get(0) : null; + } + + public static T findFirst(List from, Predicate predicate) { + if (CollUtil.isEmpty(from)) { + return null; + } + return from.stream().filter(predicate).findFirst().orElse(null); + } + + public static > V getMaxValue(Collection from, Function valueFunc) { + if (CollUtil.isEmpty(from)) { + return null; + } + assert from.size() > 0; // 断言,避免告警 + T t = from.stream().max(Comparator.comparing(valueFunc)).get(); + return valueFunc.apply(t); + } + + public static > V getMinValue(List from, Function valueFunc) { + if (CollUtil.isEmpty(from)) { + return null; + } + assert from.size() > 0; // 断言,避免告警 + T t = from.stream().min(Comparator.comparing(valueFunc)).get(); + return valueFunc.apply(t); + } + + public static > V getSumValue(List from, Function valueFunc, BinaryOperator accumulator) { + if (CollUtil.isEmpty(from)) { + return null; + } + assert from.size() > 0; // 断言,避免告警 + return from.stream().map(valueFunc).reduce(accumulator).get(); + } + + public static void addIfNotNull(Collection coll, T item) { + if (item == null) { + return; + } + coll.add(item); + } + + public static Collection singleton(T deptId) { + return deptId == null ? Collections.emptyList() : Collections.singleton(deptId); + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/util/collection/MapUtils.java b/win-framework/win-common/src/main/java/com/win/framework/common/util/collection/MapUtils.java new file mode 100644 index 0000000..a3f21f6 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/util/collection/MapUtils.java @@ -0,0 +1,66 @@ +package com.win.framework.common.util.collection; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import com.win.framework.common.core.KeyValue; +import com.google.common.collect.Maps; +import com.google.common.collect.Multimap; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; + +/** + * Map 工具类 + * + * @author 闻荫源码 + */ +public class MapUtils { + + /** + * 从哈希表表中,获得 keys 对应的所有 value 数组 + * + * @param multimap 哈希表 + * @param keys keys + * @return value 数组 + */ + public static List getList(Multimap multimap, Collection keys) { + List result = new ArrayList<>(); + keys.forEach(k -> { + Collection values = multimap.get(k); + if (CollectionUtil.isEmpty(values)) { + return; + } + result.addAll(values); + }); + return result; + } + + /** + * 从哈希表查找到 key 对应的 value,然后进一步处理 + * 注意,如果查找到的 value 为 null 时,不进行处理 + * + * @param map 哈希表 + * @param key key + * @param consumer 进一步处理的逻辑 + */ + public static void findAndThen(Map map, K key, Consumer consumer) { + if (CollUtil.isEmpty(map)) { + return; + } + V value = map.get(key); + if (value == null) { + return; + } + consumer.accept(value); + } + + public static Map convertMap(List> keyValues) { + Map map = Maps.newLinkedHashMapWithExpectedSize(keyValues.size()); + keyValues.forEach(keyValue -> map.put(keyValue.getKey(), keyValue.getValue())); + return map; + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/util/collection/SetUtils.java b/win-framework/win-common/src/main/java/com/win/framework/common/util/collection/SetUtils.java new file mode 100644 index 0000000..442d9fe --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/util/collection/SetUtils.java @@ -0,0 +1,19 @@ +package com.win.framework.common.util.collection; + +import cn.hutool.core.collection.CollUtil; + +import java.util.Set; + +/** + * Set 工具类 + * + * @author 闻荫源码 + */ +public class SetUtils { + + @SafeVarargs + public static Set asSet(T... objs) { + return CollUtil.newHashSet(objs); + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/util/date/DateUtils.java b/win-framework/win-common/src/main/java/com/win/framework/common/util/date/DateUtils.java new file mode 100644 index 0000000..cdc1d1e --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/util/date/DateUtils.java @@ -0,0 +1,180 @@ +package com.win.framework.common.util.date; + +import cn.hutool.core.date.LocalDateTimeUtil; + +import java.time.*; +import java.util.Calendar; +import java.util.Date; + +/** + * 时间工具类 + * + * @author 闻荫源码 + */ +public class DateUtils { + + /** + * 时区 - 默认 + */ + public static final String TIME_ZONE_DEFAULT = "GMT+8"; + + /** + * 秒转换成毫秒 + */ + public static final long SECOND_MILLIS = 1000; + + public static final String FORMAT_YEAR_MONTH_DAY = "yyyy-MM-dd"; + + public static final String FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND = "yyyy-MM-dd HH:mm:ss"; + + public static final String FORMAT_HOUR_MINUTE_SECOND = "HH:mm:ss"; + + /** + * 将 LocalDateTime 转换成 Date + * + * @param date LocalDateTime + * @return LocalDateTime + */ + public static Date of(LocalDateTime date) { + if (date == null) { + return null; + } + // 将此日期时间与时区相结合以创建 ZonedDateTime + ZonedDateTime zonedDateTime = date.atZone(ZoneId.systemDefault()); + // 本地时间线 LocalDateTime 到即时时间线 Instant 时间戳 + Instant instant = zonedDateTime.toInstant(); + // UTC时间(世界协调时间,UTC + 00:00)转北京(北京,UTC + 8:00)时间 + return Date.from(instant); + } + + /** + * 将 Date 转换成 LocalDateTime + * + * @param date Date + * @return LocalDateTime + */ + public static LocalDateTime of(Date date) { + if (date == null) { + return null; + } + // 转为时间戳 + Instant instant = date.toInstant(); + // UTC时间(世界协调时间,UTC + 00:00)转北京(北京,UTC + 8:00)时间 + return LocalDateTime.ofInstant(instant, ZoneId.systemDefault()); + } + + public static Date addTime(Duration duration) { + return new Date(System.currentTimeMillis() + duration.toMillis()); + } + + public static boolean isExpired(Date time) { + return System.currentTimeMillis() > time.getTime(); + } + + public static boolean isExpired(LocalDateTime time) { + LocalDateTime now = LocalDateTime.now(); + return now.isAfter(time); + } + + public static long diff(Date endTime, Date startTime) { + return endTime.getTime() - startTime.getTime(); + } + + /** + * 创建指定时间 + * + * @param year 年 + * @param mouth 月 + * @param day 日 + * @return 指定时间 + */ + public static Date buildTime(int year, int mouth, int day) { + return buildTime(year, mouth, day, 0, 0, 0); + } + + /** + * 创建指定时间 + * + * @param year 年 + * @param mouth 月 + * @param day 日 + * @param hour 小时 + * @param minute 分钟 + * @param second 秒 + * @return 指定时间 + */ + public static Date buildTime(int year, int mouth, int day, + int hour, int minute, int second) { + Calendar calendar = Calendar.getInstance(); + calendar.set(Calendar.YEAR, year); + calendar.set(Calendar.MONTH, mouth - 1); + calendar.set(Calendar.DAY_OF_MONTH, day); + calendar.set(Calendar.HOUR_OF_DAY, hour); + calendar.set(Calendar.MINUTE, minute); + calendar.set(Calendar.SECOND, second); + calendar.set(Calendar.MILLISECOND, 0); // 一般情况下,都是 0 毫秒 + return calendar.getTime(); + } + + public static Date max(Date a, Date b) { + if (a == null) { + return b; + } + if (b == null) { + return a; + } + return a.compareTo(b) > 0 ? a : b; + } + + public static LocalDateTime max(LocalDateTime a, LocalDateTime b) { + if (a == null) { + return b; + } + if (b == null) { + return a; + } + return a.isAfter(b) ? a : b; + } + + /** + * 计算当期时间相差的日期 + * + * @param field 日历字段.
eg:Calendar.MONTH,Calendar.DAY_OF_MONTH,
Calendar.HOUR_OF_DAY等. + * @param amount 相差的数值 + * @return 计算后的日志 + */ + public static Date addDate(int field, int amount) { + return addDate(null, field, amount); + } + + /** + * 计算当期时间相差的日期 + * + * @param date 设置时间 + * @param field 日历字段 例如说,{@link Calendar#DAY_OF_MONTH} 等 + * @param amount 相差的数值 + * @return 计算后的日志 + */ + public static Date addDate(Date date, int field, int amount) { + if (amount == 0) { + return date; + } + Calendar c = Calendar.getInstance(); + if (date != null) { + c.setTime(date); + } + c.add(field, amount); + return c.getTime(); + } + + /** + * 是否今天 + * + * @param date 日期 + * @return 是否 + */ + public static boolean isToday(LocalDateTime date) { + return LocalDateTimeUtil.isSameDay(date, LocalDateTime.now()); + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/util/date/LocalDateTimeUtils.java b/win-framework/win-common/src/main/java/com/win/framework/common/util/date/LocalDateTimeUtils.java new file mode 100644 index 0000000..89a90f5 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/util/date/LocalDateTimeUtils.java @@ -0,0 +1,80 @@ +package com.win.framework.common.util.date; + +import cn.hutool.core.date.LocalDateTimeUtil; + +import java.time.Duration; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; + +/** + * 时间工具类,用于 {@link java.time.LocalDateTime} + * + * @author 闻荫源码 + */ +public class LocalDateTimeUtils { + + /** + * 空的 LocalDateTime 对象,主要用于 DB 唯一索引的默认值 + */ + public static LocalDateTime EMPTY = buildTime(1970, 1, 1); + + public static LocalDateTime addTime(Duration duration) { + return LocalDateTime.now().plus(duration); + } + + public static boolean beforeNow(LocalDateTime date) { + return date.isBefore(LocalDateTime.now()); + } + + public static boolean afterNow(LocalDateTime date) { + return date.isAfter(LocalDateTime.now()); + } + + /** + * 创建指定时间 + * + * @param year 年 + * @param mouth 月 + * @param day 日 + * @return 指定时间 + */ + public static LocalDateTime buildTime(int year, int mouth, int day) { + return LocalDateTime.of(year, mouth, day, 0, 0, 0); + } + + public static LocalDateTime[] buildBetweenTime(int year1, int mouth1, int day1, + int year2, int mouth2, int day2) { + return new LocalDateTime[]{buildTime(year1, mouth1, day1), buildTime(year2, mouth2, day2)}; + } + + /** + * 判断当前时间是否在该时间范围内 + * + * @param startTime 开始时间 + * @param endTime 结束时间 + * @return 是否 + */ + public static boolean isBetween(LocalDateTime startTime, LocalDateTime endTime) { + if (startTime == null || endTime == null) { + return false; + } + return LocalDateTimeUtil.isIn(LocalDateTime.now(), startTime, endTime); + } + + /** + * 判断时间段是否重叠 + * + * @param startTime1 开始 time1 + * @param endTime1 结束 time1 + * @param startTime2 开始 time2 + * @param endTime2 结束 time2 + * @return 重叠:true 不重叠:false + */ + public static boolean isOverlap(LocalTime startTime1, LocalTime endTime1, LocalTime startTime2, LocalTime endTime2) { + LocalDate nowDate = LocalDate.now(); + return LocalDateTimeUtil.isOverlap(LocalDateTime.of(nowDate, startTime1), LocalDateTime.of(nowDate, endTime1), + LocalDateTime.of(nowDate, startTime2), LocalDateTime.of(nowDate, endTime2)); + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/util/http/HttpUtils.java b/win-framework/win-common/src/main/java/com/win/framework/common/util/http/HttpUtils.java new file mode 100644 index 0000000..ab7e5a8 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/util/http/HttpUtils.java @@ -0,0 +1,126 @@ +package com.win.framework.common.util.http; + +import cn.hutool.core.codec.Base64; +import cn.hutool.core.map.TableMap; +import cn.hutool.core.net.url.UrlBuilder; +import cn.hutool.core.util.ReflectUtil; +import cn.hutool.core.util.StrUtil; +import org.springframework.util.StringUtils; +import org.springframework.web.util.UriComponents; +import org.springframework.web.util.UriComponentsBuilder; + +import javax.servlet.http.HttpServletRequest; +import java.net.URI; +import java.nio.charset.Charset; +import java.util.Map; + +/** + * HTTP 工具类 + * + * @author 闻荫源码 + */ +public class HttpUtils { + + @SuppressWarnings("unchecked") + public static String replaceUrlQuery(String url, String key, String value) { + UrlBuilder builder = UrlBuilder.of(url, Charset.defaultCharset()); + // 先移除 + TableMap query = (TableMap) + ReflectUtil.getFieldValue(builder.getQuery(), "query"); + query.remove(key); + // 后添加 + builder.addQuery(key, value); + return builder.build(); + } + + private String append(String base, Map query, boolean fragment) { + return append(base, query, null, fragment); + } + + /** + * 拼接 URL + * + * copy from Spring Security OAuth2 的 AuthorizationEndpoint 类的 append 方法 + * + * @param base 基础 URL + * @param query 查询参数 + * @param keys query 的 key,对应的原本的 key 的映射。例如说 query 里有个 key 是 xx,实际它的 key 是 extra_xx,则通过 keys 里添加这个映射 + * @param fragment URL 的 fragment,即拼接到 # 中 + * @return 拼接后的 URL + */ + public static String append(String base, Map query, Map keys, boolean fragment) { + UriComponentsBuilder template = UriComponentsBuilder.newInstance(); + UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(base); + URI redirectUri; + try { + // assume it's encoded to start with (if it came in over the wire) + redirectUri = builder.build(true).toUri(); + } catch (Exception e) { + // ... but allow client registrations to contain hard-coded non-encoded values + redirectUri = builder.build().toUri(); + builder = UriComponentsBuilder.fromUri(redirectUri); + } + template.scheme(redirectUri.getScheme()).port(redirectUri.getPort()).host(redirectUri.getHost()) + .userInfo(redirectUri.getUserInfo()).path(redirectUri.getPath()); + + if (fragment) { + StringBuilder values = new StringBuilder(); + if (redirectUri.getFragment() != null) { + String append = redirectUri.getFragment(); + values.append(append); + } + for (String key : query.keySet()) { + if (values.length() > 0) { + values.append("&"); + } + String name = key; + if (keys != null && keys.containsKey(key)) { + name = keys.get(key); + } + values.append(name).append("={").append(key).append("}"); + } + if (values.length() > 0) { + template.fragment(values.toString()); + } + UriComponents encoded = template.build().expand(query).encode(); + builder.fragment(encoded.getFragment()); + } else { + for (String key : query.keySet()) { + String name = key; + if (keys != null && keys.containsKey(key)) { + name = keys.get(key); + } + template.queryParam(name, "{" + key + "}"); + } + template.fragment(redirectUri.getFragment()); + UriComponents encoded = template.build().expand(query).encode(); + builder.query(encoded.getQuery()); + } + return builder.build().toUriString(); + } + + public static String[] obtainBasicAuthorization(HttpServletRequest request) { + String clientId; + String clientSecret; + // 先从 Header 中获取 + String authorization = request.getHeader("Authorization"); + authorization = StrUtil.subAfter(authorization, "Basic ", true); + if (StringUtils.hasText(authorization)) { + authorization = Base64.decodeStr(authorization); + clientId = StrUtil.subBefore(authorization, ":", false); + clientSecret = StrUtil.subAfter(authorization, ":", false); + // 再从 Param 中获取 + } else { + clientId = request.getParameter("client_id"); + clientSecret = request.getParameter("client_secret"); + } + + // 如果两者非空,则返回 + if (StrUtil.isNotEmpty(clientId) && StrUtil.isNotEmpty(clientSecret)) { + return new String[]{clientId, clientSecret}; + } + return null; + } + + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/util/i18n/MessageUtil.java b/win-framework/win-common/src/main/java/com/win/framework/common/util/i18n/MessageUtil.java new file mode 100644 index 0000000..c0684c5 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/util/i18n/MessageUtil.java @@ -0,0 +1,26 @@ +package com.win.framework.common.util.i18n; + +import cn.hutool.extra.spring.SpringUtil; +import org.springframework.context.MessageSource; +import org.springframework.context.NoSuchMessageException; +import org.springframework.context.i18n.LocaleContextHolder; + +public class MessageUtil { + + /** + * 根据消息键和参数 获取消息 委托给spring messageSource,获取不到则返回code + * + * @param code 消息键 + * @param args 参数 + * @return 获取国际化翻译值 + */ + public static String message(String code, Object... args) { + MessageSource messageSource = SpringUtil.getBean(MessageSource.class); + try { + return messageSource.getMessage(code, args, LocaleContextHolder.getLocale()); + } catch (NoSuchMessageException ignored) { + return code; + } + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/util/io/FileUtils.java b/win-framework/win-common/src/main/java/com/win/framework/common/util/io/FileUtils.java new file mode 100644 index 0000000..62cc32d --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/util/io/FileUtils.java @@ -0,0 +1,84 @@ +package com.win.framework.common.util.io; + +import cn.hutool.core.io.FileTypeUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.file.FileNameUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.digest.DigestUtil; +import lombok.SneakyThrows; + +import java.io.ByteArrayInputStream; +import java.io.File; + +/** + * 文件工具类 + * + * @author 闻荫源码 + */ +public class FileUtils { + + /** + * 创建临时文件 + * 该文件会在 JVM 退出时,进行删除 + * + * @param data 文件内容 + * @return 文件 + */ + @SneakyThrows + public static File createTempFile(String data) { + File file = createTempFile(); + // 写入内容 + FileUtil.writeUtf8String(data, file); + return file; + } + + /** + * 创建临时文件 + * 该文件会在 JVM 退出时,进行删除 + * + * @param data 文件内容 + * @return 文件 + */ + @SneakyThrows + public static File createTempFile(byte[] data) { + File file = createTempFile(); + // 写入内容 + FileUtil.writeBytes(data, file); + return file; + } + + /** + * 创建临时文件,无内容 + * 该文件会在 JVM 退出时,进行删除 + * + * @return 文件 + */ + @SneakyThrows + public static File createTempFile() { + // 创建文件,通过 UUID 保证唯一 + File file = File.createTempFile(IdUtil.simpleUUID(), null); + // 标记 JVM 退出时,自动删除 + file.deleteOnExit(); + return file; + } + + /** + * 生成文件路径 + * + * @param content 文件内容 + * @param originalName 原始文件名 + * @return path,唯一不可重复 + */ + public static String generatePath(byte[] content, String originalName) { + String sha256Hex = DigestUtil.sha256Hex(content); + // 情况一:如果存在 name,则优先使用 name 的后缀 + if (StrUtil.isNotBlank(originalName)) { + String extName = FileNameUtil.extName(originalName); + return StrUtil.isBlank(extName) ? sha256Hex : sha256Hex + "." + extName; + } + // 情况二:基于 content 计算 + return sha256Hex + '.' + FileTypeUtil.getType(new ByteArrayInputStream(content)); + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/util/io/IoUtils.java b/win-framework/win-common/src/main/java/com/win/framework/common/util/io/IoUtils.java new file mode 100644 index 0000000..1f913a7 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/util/io/IoUtils.java @@ -0,0 +1,28 @@ +package com.win.framework.common.util.io; + +import cn.hutool.core.io.IORuntimeException; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.StrUtil; + +import java.io.InputStream; + +/** + * IO 工具类,用于 {@link cn.hutool.core.io.IoUtil} 缺失的方法 + * + * @author 闻荫源码 + */ +public class IoUtils { + + /** + * 从流中读取 UTF8 编码的内容 + * + * @param in 输入流 + * @param isClose 是否关闭 + * @return 内容 + * @throws IORuntimeException IO 异常 + */ + public static String readUtf8(InputStream in, boolean isClose) throws IORuntimeException { + return StrUtil.utf8Str(IoUtil.read(in, isClose)); + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/util/json/JsonUtils.java b/win-framework/win-common/src/main/java/com/win/framework/common/util/json/JsonUtils.java new file mode 100644 index 0000000..80cfbd8 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/util/json/JsonUtils.java @@ -0,0 +1,157 @@ +package com.win.framework.common.util.json; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; + +import java.io.IOException; +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.List; + +/** + * JSON 工具类 + * + * @author 闻荫源码 + */ +@Slf4j +public class JsonUtils { + + private static ObjectMapper objectMapper = new ObjectMapper(); + + static { + objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); + objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + objectMapper.registerModules(new JavaTimeModule()); // 解决 LocalDateTime 的序列化 + } + + /** + * 初始化 objectMapper 属性 + *

+ * 通过这样的方式,使用 Spring 创建的 ObjectMapper Bean + * + * @param objectMapper ObjectMapper 对象 + */ + public static void init(ObjectMapper objectMapper) { + JsonUtils.objectMapper = objectMapper; + } + + @SneakyThrows + public static String toJsonString(Object object) { + return objectMapper.writeValueAsString(object); + } + + @SneakyThrows + public static byte[] toJsonByte(Object object) { + return objectMapper.writeValueAsBytes(object); + } + + @SneakyThrows + public static String toJsonPrettyString(Object object) { + return objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(object); + } + + public static T parseObject(String text, Class clazz) { + if (StrUtil.isEmpty(text)) { + return null; + } + try { + return objectMapper.readValue(text, clazz); + } catch (IOException e) { + log.error("json parse err,json:{}", text, e); + throw new RuntimeException(e); + } + } + + public static T parseObject(String text, Type type) { + if (StrUtil.isEmpty(text)) { + return null; + } + try { + return objectMapper.readValue(text, objectMapper.getTypeFactory().constructType(type)); + } catch (IOException e) { + log.error("json parse err,json:{}", text, e); + throw new RuntimeException(e); + } + } + + /** + * 将字符串解析成指定类型的对象 + * 使用 {@link #parseObject(String, Class)} 时,在@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS) 的场景下, + * 如果 text 没有 class 属性,则会报错。此时,使用这个方法,可以解决。 + * + * @param text 字符串 + * @param clazz 类型 + * @return 对象 + */ + public static T parseObject2(String text, Class clazz) { + if (StrUtil.isEmpty(text)) { + return null; + } + return JSONUtil.toBean(text, clazz); + } + + public static T parseObject(byte[] bytes, Class clazz) { + if (ArrayUtil.isEmpty(bytes)) { + return null; + } + try { + return objectMapper.readValue(bytes, clazz); + } catch (IOException e) { + log.error("json parse err,json:{}", bytes, e); + throw new RuntimeException(e); + } + } + + public static T parseObject(String text, TypeReference typeReference) { + try { + return objectMapper.readValue(text, typeReference); + } catch (IOException e) { + log.error("json parse err,json:{}", text, e); + throw new RuntimeException(e); + } + } + + public static List parseArray(String text, Class clazz) { + if (StrUtil.isEmpty(text)) { + return new ArrayList<>(); + } + try { + return objectMapper.readValue(text, objectMapper.getTypeFactory().constructCollectionType(List.class, clazz)); + } catch (IOException e) { + log.error("json parse err,json:{}", text, e); + throw new RuntimeException(e); + } + } + + public static JsonNode parseTree(String text) { + try { + return objectMapper.readTree(text); + } catch (IOException e) { + log.error("json parse err,json:{}", text, e); + throw new RuntimeException(e); + } + } + + public static JsonNode parseTree(byte[] text) { + try { + return objectMapper.readTree(text); + } catch (IOException e) { + log.error("json parse err,json:{}", text, e); + throw new RuntimeException(e); + } + } + + public static boolean isJson(String text) { + return JSONUtil.isTypeJSON(text); + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/util/monitor/TracerUtils.java b/win-framework/win-common/src/main/java/com/win/framework/common/util/monitor/TracerUtils.java new file mode 100644 index 0000000..d386c4b --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/util/monitor/TracerUtils.java @@ -0,0 +1,30 @@ +package com.win.framework.common.util.monitor; + +import org.apache.skywalking.apm.toolkit.trace.TraceContext; + +/** + * 链路追踪工具类 + * + * 考虑到每个 starter 都需要用到该工具类,所以放到 common 模块下的 util 包下 + * + * @author 闻荫源码 + */ +public class TracerUtils { + + /** + * 私有化构造方法 + */ + private TracerUtils() { + } + + /** + * 获得链路追踪编号,直接返回 SkyWalking 的 TraceId。 + * 如果不存在的话为空字符串!!! + * + * @return 链路追踪编号 + */ + public static String getTraceId() { + return TraceContext.traceId(); + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/util/number/MoneyUtils.java b/win-framework/win-common/src/main/java/com/win/framework/common/util/number/MoneyUtils.java new file mode 100644 index 0000000..5ad168a --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/util/number/MoneyUtils.java @@ -0,0 +1,50 @@ +package com.win.framework.common.util.number; + +import cn.hutool.core.util.NumberUtil; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +/** + * 金额工具类 + * + * @author 闻荫源码 + */ +public class MoneyUtils { + + /** + * 计算百分比金额,四舍五入 + * + * @param price 金额 + * @param rate 百分比,例如说 56.77% 则传入 56.77 + * @return 百分比金额 + */ + public static Integer calculateRatePrice(Integer price, Double rate) { + return calculateRatePrice(price, rate, 0, RoundingMode.HALF_UP).intValue(); + } + + /** + * 计算百分比金额,向下传入 + * + * @param price 金额 + * @param rate 百分比,例如说 56.77% 则传入 56.77 + * @return 百分比金额 + */ + public static Integer calculateRatePriceFloor(Integer price, Double rate) { + return calculateRatePrice(price, rate, 0, RoundingMode.FLOOR).intValue(); + } + + /** + * 计算百分比金额 + * + * @param price 金额 + * @param rate 百分比,例如说 56.77% 则传入 56.77 + * @param scale 保留小数位数 + * @param roundingMode 舍入模式 + */ + public static BigDecimal calculateRatePrice(Number price, Number rate, int scale, RoundingMode roundingMode) { + return NumberUtil.toBigDecimal(price).multiply(NumberUtil.toBigDecimal(rate)) // 乘以 + .divide(BigDecimal.valueOf(100), scale, roundingMode); // 除以 100 + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/util/number/NumberUtils.java b/win-framework/win-common/src/main/java/com/win/framework/common/util/number/NumberUtils.java new file mode 100644 index 0000000..efb9d46 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/util/number/NumberUtils.java @@ -0,0 +1,16 @@ +package com.win.framework.common.util.number; + +import cn.hutool.core.util.StrUtil; + +/** + * 数字的工具类,补全 {@link cn.hutool.core.util.NumberUtil} 的功能 + * + * @author 闻荫源码 + */ +public class NumberUtils { + + public static Long parseLong(String str) { + return StrUtil.isNotEmpty(str) ? Long.valueOf(str) : null; + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/util/object/ObjectUtils.java b/win-framework/win-common/src/main/java/com/win/framework/common/util/object/ObjectUtils.java new file mode 100644 index 0000000..a6273a0 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/util/object/ObjectUtils.java @@ -0,0 +1,63 @@ +package com.win.framework.common.util.object; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.ReflectUtil; + +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.function.Consumer; + +/** + * Object 工具类 + * + * @author 闻荫源码 + */ +public class ObjectUtils { + + /** + * 复制对象,并忽略 Id 编号 + * + * @param object 被复制对象 + * @param consumer 消费者,可以二次编辑被复制对象 + * @return 复制后的对象 + */ + public static T cloneIgnoreId(T object, Consumer consumer) { + T result = ObjectUtil.clone(object); + // 忽略 id 编号 + Field field = ReflectUtil.getField(object.getClass(), "id"); + if (field != null) { + ReflectUtil.setFieldValue(result, field, null); + } + // 二次编辑 + if (result != null) { + consumer.accept(result); + } + return result; + } + + public static > T max(T obj1, T obj2) { + if (obj1 == null) { + return obj2; + } + if (obj2 == null) { + return obj1; + } + return obj1.compareTo(obj2) > 0 ? obj1 : obj2; + } + + @SafeVarargs + public static T defaultIfNull(T... array) { + for (T item : array) { + if (item != null) { + return item; + } + } + return null; + } + + @SafeVarargs + public static boolean equalsAny(T obj, T... array) { + return Arrays.asList(array).contains(obj); + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/util/object/PageUtils.java b/win-framework/win-common/src/main/java/com/win/framework/common/util/object/PageUtils.java new file mode 100644 index 0000000..bca138c --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/util/object/PageUtils.java @@ -0,0 +1,16 @@ +package com.win.framework.common.util.object; + +import com.win.framework.common.pojo.PageParam; + +/** + * {@link com.win.framework.common.pojo.PageParam} 工具类 + * + * @author 闻荫源码 + */ +public class PageUtils { + + public static int getStart(PageParam pageParam) { + return (pageParam.getPageNo() - 1) * pageParam.getPageSize(); + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/util/servlet/ServletUtils.java b/win-framework/win-common/src/main/java/com/win/framework/common/util/servlet/ServletUtils.java new file mode 100644 index 0000000..ee66f3e --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/util/servlet/ServletUtils.java @@ -0,0 +1,110 @@ +package com.win.framework.common.util.servlet; + +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.servlet.ServletUtil; +import com.win.framework.common.util.json.JsonUtils; +import org.springframework.http.MediaType; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.ServletRequest; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.net.URLEncoder; +import java.util.Map; + +/** + * 客户端工具类 + * + * @author 闻荫源码 + */ +public class ServletUtils { + + /** + * 返回 JSON 字符串 + * + * @param response 响应 + * @param object 对象,会序列化成 JSON 字符串 + */ + @SuppressWarnings("deprecation") // 必须使用 APPLICATION_JSON_UTF8_VALUE,否则会乱码 + public static void writeJSON(HttpServletResponse response, Object object) { + String content = JsonUtils.toJsonString(object); + ServletUtil.write(response, content, MediaType.APPLICATION_JSON_UTF8_VALUE); + } + + /** + * 返回附件 + * + * @param response 响应 + * @param filename 文件名 + * @param content 附件内容 + */ + public static void writeAttachment(HttpServletResponse response, String filename, byte[] content) throws IOException { + // 设置 header 和 contentType + response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8")); + response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); + // 输出附件 + IoUtil.write(response.getOutputStream(), false, content); + } + + /** + * @param request 请求 + * @return ua + */ + public static String getUserAgent(HttpServletRequest request) { + String ua = request.getHeader("User-Agent"); + return ua != null ? ua : ""; + } + + /** + * 获得请求 + * + * @return HttpServletRequest + */ + public static HttpServletRequest getRequest() { + RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); + if (!(requestAttributes instanceof ServletRequestAttributes)) { + return null; + } + return ((ServletRequestAttributes) requestAttributes).getRequest(); + } + + public static String getUserAgent() { + HttpServletRequest request = getRequest(); + if (request == null) { + return null; + } + return getUserAgent(request); + } + + public static String getClientIP() { + HttpServletRequest request = getRequest(); + if (request == null) { + return null; + } + return ServletUtil.getClientIP(request); + } + + public static boolean isJsonRequest(ServletRequest request) { + return StrUtil.startWithIgnoreCase(request.getContentType(), MediaType.APPLICATION_JSON_VALUE); + } + + public static String getBody(HttpServletRequest request) { + return ServletUtil.getBody(request); + } + + public static byte[] getBodyBytes(HttpServletRequest request) { + return ServletUtil.getBodyBytes(request); + } + + public static String getClientIP(HttpServletRequest request) { + return ServletUtil.getClientIP(request); + } + + public static Map getParamMap(HttpServletRequest request) { + return ServletUtil.getParamMap(request); + } +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/util/spring/SpringAopUtils.java b/win-framework/win-common/src/main/java/com/win/framework/common/util/spring/SpringAopUtils.java new file mode 100644 index 0000000..bae8965 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/util/spring/SpringAopUtils.java @@ -0,0 +1,46 @@ +package com.win.framework.common.util.spring; + +import cn.hutool.core.bean.BeanUtil; +import org.springframework.aop.framework.AdvisedSupport; +import org.springframework.aop.framework.AopProxy; +import org.springframework.aop.support.AopUtils; + +/** + * Spring AOP 工具类 + * + * 参考波克尔 http://www.bubuko.com/infodetail-3471885.html 实现 + */ +public class SpringAopUtils { + + /** + * 获取代理的目标对象 + * + * @param proxy 代理对象 + * @return 目标对象 + */ + public static Object getTarget(Object proxy) throws Exception { + // 不是代理对象 + if (!AopUtils.isAopProxy(proxy)) { + return proxy; + } + // Jdk 代理 + if (AopUtils.isJdkDynamicProxy(proxy)) { + return getJdkDynamicProxyTargetObject(proxy); + } + // Cglib 代理 + return getCglibProxyTargetObject(proxy); + } + + private static Object getCglibProxyTargetObject(Object proxy) throws Exception { + Object dynamicAdvisedInterceptor = BeanUtil.getFieldValue(proxy, "CGLIB$CALLBACK_0"); + AdvisedSupport advisedSupport = (AdvisedSupport) BeanUtil.getFieldValue(dynamicAdvisedInterceptor, "advised"); + return advisedSupport.getTargetSource().getTarget(); + } + + private static Object getJdkDynamicProxyTargetObject(Object proxy) throws Exception { + AopProxy aopProxy = (AopProxy) BeanUtil.getFieldValue(proxy, "h"); + AdvisedSupport advisedSupport = (AdvisedSupport) BeanUtil.getFieldValue(aopProxy, "advised"); + return advisedSupport.getTargetSource().getTarget(); + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/util/spring/SpringExpressionUtils.java b/win-framework/win-common/src/main/java/com/win/framework/common/util/spring/SpringExpressionUtils.java new file mode 100644 index 0000000..65f9985 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/util/spring/SpringExpressionUtils.java @@ -0,0 +1,133 @@ +package com.win.framework.common.util.spring; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.ArrayUtil; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.core.DefaultParameterNameDiscoverer; +import org.springframework.core.ParameterNameDiscoverer; +import org.springframework.expression.EvaluationContext; +import org.springframework.expression.ExpressionParser; +import org.springframework.expression.spel.standard.SpelExpressionParser; +import org.springframework.expression.spel.support.StandardEvaluationContext; + +import java.lang.reflect.Method; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +/** + * Spring EL 表达式的工具类 + * + * @author mashu + */ +public class SpringExpressionUtils { + + /** + * spel表达式解析器 + */ + private static final ExpressionParser EXPRESSION_PARSER = new SpelExpressionParser(); + /** + * 参数名发现器 + */ + private static final ParameterNameDiscoverer PARAMETER_NAME_DISCOVERER = new DefaultParameterNameDiscoverer(); + + private SpringExpressionUtils() { + } + + /** + * 从切面中,单个解析 EL 表达式的结果 + * + * @param joinPoint 切面点 + * @param expressionString EL 表达式数组 + * @return 执行界面 + */ + public static Object parseExpression(ProceedingJoinPoint joinPoint, String expressionString) { + Map result = parseExpressions(joinPoint, Collections.singletonList(expressionString)); + return result.get(expressionString); + } + + /** + * 从切面中,批量解析 EL 表达式的结果 + * + * @param joinPoint 切面点 + * @param expressionStrings EL 表达式数组 + * @return 结果,key 为表达式,value 为对应值 + */ + public static Map parseExpressions(ProceedingJoinPoint joinPoint, List expressionStrings) { + // 如果为空,则不进行解析 + if (CollUtil.isEmpty(expressionStrings)) { + return MapUtil.newHashMap(); + } + + // 第一步,构建解析的上下文 EvaluationContext + // 通过 joinPoint 获取被注解方法 + MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature(); + Method method = methodSignature.getMethod(); + // 使用 spring 的 ParameterNameDiscoverer 获取方法形参名数组 + String[] paramNames = PARAMETER_NAME_DISCOVERER.getParameterNames(method); + // Spring 的表达式上下文对象 + EvaluationContext context = new StandardEvaluationContext(); + // 给上下文赋值 + if (ArrayUtil.isNotEmpty(paramNames)) { + Object[] args = joinPoint.getArgs(); + for (int i = 0; i < paramNames.length; i++) { + context.setVariable(paramNames[i], args[i]); + } + } + + // 第二步,逐个参数解析 + Map result = MapUtil.newHashMap(expressionStrings.size(), true); + expressionStrings.forEach(key -> { + Object value = EXPRESSION_PARSER.parseExpression(key).getValue(context); + result.put(key, value); + }); + return result; + } + + /** + * JoinPoint 切面 批量解析 EL 表达式,转换 jspl参数 + * + * @param joinPoint 切面点 + * @param info 返回值 + * @param expressionStrings EL 表达式数组 + * @return Map 结果 + * @author 陈賝 + * @since 2023/6/18 11:20 + */ + // TODO @chenchen: 这个方法,和 parseExpressions 比较接近,是不是可以合并下; + public static Map parseExpression(JoinPoint joinPoint, Object info, List expressionStrings) { + // 如果为空,则不进行解析 + if (CollUtil.isEmpty(expressionStrings)) { + return MapUtil.newHashMap(); + } + + // 第一步,构建解析的上下文 EvaluationContext + // 通过 joinPoint 获取被注解方法 + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + Method method = signature.getMethod(); + // 使用 spring 的 ParameterNameDiscoverer 获取方法形参名数组 + String[] parameterNames = PARAMETER_NAME_DISCOVERER.getParameterNames(method); + // Spring 的表达式上下文对象 + EvaluationContext context = new StandardEvaluationContext(); + if (ArrayUtil.isNotEmpty(parameterNames)) { + //获取方法参数值 + Object[] args = joinPoint.getArgs(); + for (int i = 0; i < args.length; i++) { + // 替换 SP EL 里的变量值为实际值, 比如 #user --> user对象 + context.setVariable(parameterNames[i], args[i]); + } + context.setVariable("info", info); + } + // 第二步,逐个参数解析 + Map result = MapUtil.newHashMap(expressionStrings.size(), true); + expressionStrings.forEach(key -> { + Object value = EXPRESSION_PARSER.parseExpression(key).getValue(context); + result.put(key, value); + }); + return result; + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/util/string/StrUtils.java b/win-framework/win-common/src/main/java/com/win/framework/common/util/string/StrUtils.java new file mode 100644 index 0000000..4d52303 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/util/string/StrUtils.java @@ -0,0 +1,53 @@ +package com.win.framework.common.util.string; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; + +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 字符串工具类 + * + * @author 闻荫源码 + */ +public class StrUtils { + + public static String maxLength(CharSequence str, int maxLength) { + return StrUtil.maxLength(str, maxLength - 3); // -3 的原因,是该方法会补充 ... 恰好 + } + + /** + * 给定字符串是否以任何一个字符串开始 + * 给定字符串和数组为空都返回 false + * + * @param str 给定字符串 + * @param prefixes 需要检测的开始字符串 + * @since 3.0.6 + */ + public static boolean startWithAny(String str, Collection prefixes) { + if (StrUtil.isEmpty(str) || ArrayUtil.isEmpty(prefixes)) { + return false; + } + + for (CharSequence suffix : prefixes) { + if (StrUtil.startWith(str, suffix, false)) { + return true; + } + } + return false; + } + + public static List splitToLong(String value, CharSequence separator) { + long[] longs = StrUtil.splitToLong(value, separator); + return Arrays.stream(longs).boxed().collect(Collectors.toList()); + } + + public static List splitToInteger(String value, CharSequence separator) { + int[] integers = StrUtil.splitToInt(value, separator); + return Arrays.stream(integers).boxed().collect(Collectors.toList()); + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/util/validation/ValidationUtils.java b/win-framework/win-common/src/main/java/com/win/framework/common/util/validation/ValidationUtils.java new file mode 100644 index 0000000..660d536 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/util/validation/ValidationUtils.java @@ -0,0 +1,55 @@ +package com.win.framework.common.util.validation; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Assert; +import org.springframework.util.StringUtils; + +import javax.validation.ConstraintViolation; +import javax.validation.ConstraintViolationException; +import javax.validation.Validation; +import javax.validation.Validator; +import java.util.Set; +import java.util.regex.Pattern; + +/** + * 校验工具类 + * + * @author 闻荫源码 + */ +public class ValidationUtils { + + private static final Pattern PATTERN_MOBILE = Pattern.compile("^(?:(?:\\+|00)86)?1(?:(?:3[\\d])|(?:4[0,1,4-9])|(?:5[0-3,5-9])|(?:6[2,5-7])|(?:7[0-8])|(?:8[\\d])|(?:9[0-3,5-9]))\\d{8}$"); + + private static final Pattern PATTERN_URL = Pattern.compile("^(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]"); + + private static final Pattern PATTERN_XML_NCNAME = Pattern.compile("[a-zA-Z_][\\-_.0-9_a-zA-Z$]*"); + + public static boolean isMobile(String mobile) { + return StringUtils.hasText(mobile) + && PATTERN_MOBILE.matcher(mobile).matches(); + } + + public static boolean isURL(String url) { + return StringUtils.hasText(url) + && PATTERN_URL.matcher(url).matches(); + } + + public static boolean isXmlNCName(String str) { + return StringUtils.hasText(str) + && PATTERN_XML_NCNAME.matcher(str).matches(); + } + + public static void validate(Object object, Class... groups) { + Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); + Assert.notNull(validator); + validate(validator, object, groups); + } + + public static void validate(Validator validator, Object object, Class... groups) { + Set> constraintViolations = validator.validate(object, groups); + if (CollUtil.isNotEmpty(constraintViolations)) { + throw new ConstraintViolationException(constraintViolations); + } + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/validation/InEnum.java b/win-framework/win-common/src/main/java/com/win/framework/common/validation/InEnum.java new file mode 100644 index 0000000..7dbae18 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/validation/InEnum.java @@ -0,0 +1,35 @@ +package com.win.framework.common.validation; + +import com.win.framework.common.core.IntArrayValuable; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.*; + +@Target({ + ElementType.METHOD, + ElementType.FIELD, + ElementType.ANNOTATION_TYPE, + ElementType.CONSTRUCTOR, + ElementType.PARAMETER, + ElementType.TYPE_USE +}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Constraint( + validatedBy = {InEnumValidator.class, InEnumCollectionValidator.class} +) +public @interface InEnum { + + /** + * @return 实现 EnumValuable 接口的 + */ + Class value(); + + String message() default "必须在指定范围 {value}"; + + Class[] groups() default {}; + + Class[] payload() default {}; + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/validation/InEnumCollectionValidator.java b/win-framework/win-common/src/main/java/com/win/framework/common/validation/InEnumCollectionValidator.java new file mode 100644 index 0000000..f375b50 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/validation/InEnumCollectionValidator.java @@ -0,0 +1,42 @@ +package com.win.framework.common.validation; + +import cn.hutool.core.collection.CollUtil; +import com.win.framework.common.core.IntArrayValuable; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +public class InEnumCollectionValidator implements ConstraintValidator> { + + private List values; + + @Override + public void initialize(InEnum annotation) { + IntArrayValuable[] values = annotation.value().getEnumConstants(); + if (values.length == 0) { + this.values = Collections.emptyList(); + } else { + this.values = Arrays.stream(values[0].array()).boxed().collect(Collectors.toList()); + } + } + + @Override + public boolean isValid(Collection list, ConstraintValidatorContext context) { + // 校验通过 + if (CollUtil.containsAll(values, list)) { + return true; + } + // 校验不通过,自定义提示语句(因为,注解上的 value 是枚举类,无法获得枚举类的实际值) + context.disableDefaultConstraintViolation(); // 禁用默认的 message 的值 + context.buildConstraintViolationWithTemplate(context.getDefaultConstraintMessageTemplate() + .replaceAll("\\{value}", CollUtil.join(list, ","))).addConstraintViolation(); // 重新添加错误提示语句 + return false; + } + +} + diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/validation/InEnumValidator.java b/win-framework/win-common/src/main/java/com/win/framework/common/validation/InEnumValidator.java new file mode 100644 index 0000000..1652aa9 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/validation/InEnumValidator.java @@ -0,0 +1,44 @@ +package com.win.framework.common.validation; + +import com.win.framework.common.core.IntArrayValuable; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +public class InEnumValidator implements ConstraintValidator { + + private List values; + + @Override + public void initialize(InEnum annotation) { + IntArrayValuable[] values = annotation.value().getEnumConstants(); + if (values.length == 0) { + this.values = Collections.emptyList(); + } else { + this.values = Arrays.stream(values[0].array()).boxed().collect(Collectors.toList()); + } + } + + @Override + public boolean isValid(Integer value, ConstraintValidatorContext context) { + // 为空时,默认不校验,即认为通过 + if (value == null) { + return true; + } + // 校验通过 + if (values.contains(value)) { + return true; + } + // 校验不通过,自定义提示语句(因为,注解上的 value 是枚举类,无法获得枚举类的实际值) + context.disableDefaultConstraintViolation(); // 禁用默认的 message 的值 + context.buildConstraintViolationWithTemplate(context.getDefaultConstraintMessageTemplate() + .replaceAll("\\{value}", values.toString())).addConstraintViolation(); // 重新添加错误提示语句 + return false; + } + +} + diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/validation/Mobile.java b/win-framework/win-common/src/main/java/com/win/framework/common/validation/Mobile.java new file mode 100644 index 0000000..6620f3a --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/validation/Mobile.java @@ -0,0 +1,28 @@ +package com.win.framework.common.validation; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.*; + +@Target({ + ElementType.METHOD, + ElementType.FIELD, + ElementType.ANNOTATION_TYPE, + ElementType.CONSTRUCTOR, + ElementType.PARAMETER, + ElementType.TYPE_USE +}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Constraint( + validatedBy = MobileValidator.class +) +public @interface Mobile { + + String message() default "手机号格式不正确"; + + Class[] groups() default {}; + + Class[] payload() default {}; + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/validation/MobileValidator.java b/win-framework/win-common/src/main/java/com/win/framework/common/validation/MobileValidator.java new file mode 100644 index 0000000..7a77fb1 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/validation/MobileValidator.java @@ -0,0 +1,25 @@ +package com.win.framework.common.validation; + +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.util.validation.ValidationUtils; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; + +public class MobileValidator implements ConstraintValidator { + + @Override + public void initialize(Mobile annotation) { + } + + @Override + public boolean isValid(String value, ConstraintValidatorContext context) { + // 如果手机号为空,默认不校验,即校验通过 + if (StrUtil.isEmpty(value)) { + return true; + } + // 校验手机 + return ValidationUtils.isMobile(value); + } + +} diff --git a/win-framework/win-common/src/main/java/com/win/framework/common/validation/package-info.java b/win-framework/win-common/src/main/java/com/win/framework/common/validation/package-info.java new file mode 100644 index 0000000..488269f --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/validation/package-info.java @@ -0,0 +1,4 @@ +/** + * 使用 Hibernate Validator 实现参数校验 + */ +package com.win.framework.common.validation; diff --git a/win-framework/win-spring-boot-starter-banner/pom.xml b/win-framework/win-spring-boot-starter-banner/pom.xml new file mode 100644 index 0000000..5ed3894 --- /dev/null +++ b/win-framework/win-spring-boot-starter-banner/pom.xml @@ -0,0 +1,30 @@ + + + + win-framework + com.win + ${revision} + + 4.0.0 + win-spring-boot-starter-banner + jar + + ${project.artifactId} + Banner 用于在 console 控制台,打印开发文档、接口文档等 + https://github.com/YunaiV/ruoyi-vue-pro + + + + com.win + win-common + + + + org.springframework.boot + spring-boot-starter + + + + diff --git a/win-framework/win-spring-boot-starter-banner/src/main/java/com/win/framework/banner/config/WinBannerAutoConfiguration.java b/win-framework/win-spring-boot-starter-banner/src/main/java/com/win/framework/banner/config/WinBannerAutoConfiguration.java new file mode 100644 index 0000000..ec56945 --- /dev/null +++ b/win-framework/win-spring-boot-starter-banner/src/main/java/com/win/framework/banner/config/WinBannerAutoConfiguration.java @@ -0,0 +1,20 @@ +package com.win.framework.banner.config; + +import com.win.framework.banner.core.BannerApplicationRunner; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.context.annotation.Bean; + +/** + * Banner 的自动配置类 + * + * @author 闻荫源码 + */ +@AutoConfiguration +public class WinBannerAutoConfiguration { + + @Bean + public BannerApplicationRunner bannerApplicationRunner() { + return new BannerApplicationRunner(); + } + +} diff --git a/win-framework/win-spring-boot-starter-banner/src/main/java/com/win/framework/banner/core/BannerApplicationRunner.java b/win-framework/win-spring-boot-starter-banner/src/main/java/com/win/framework/banner/core/BannerApplicationRunner.java new file mode 100644 index 0000000..b3fa6ad --- /dev/null +++ b/win-framework/win-spring-boot-starter-banner/src/main/java/com/win/framework/banner/core/BannerApplicationRunner.java @@ -0,0 +1,41 @@ +package com.win.framework.banner.core; + +import cn.hutool.core.thread.ThreadUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.util.ClassUtils; + +import java.util.concurrent.TimeUnit; + +/** + * 项目启动成功后,提供文档相关的地址 + * + * @author 闻荫源码 + */ +@Slf4j +public class BannerApplicationRunner implements ApplicationRunner { + + @Override + public void run(ApplicationArguments args) { + ThreadUtil.execute(() -> { + ThreadUtil.sleep(1, TimeUnit.SECONDS); // 延迟 1 秒,保证输出到结尾 + log.info("\n----------------------------------------------------------\n\t" + + "闻荫项目启动成功!" + + "\n----------------------------------------------------------"); + // 数据报表 + if (isNotPresent("com.win.module.report.framework.security.config.SecurityConfiguration")) { + System.out.println("[报表模块 win-module-report - 已禁用]"); + } + // 工作流 + if (isNotPresent("com.win.framework.flowable.config.WinFlowableConfiguration")) { + System.out.println("[工作流模块 win-module-bpm - 已禁用]"); + } + }); + } + + private static boolean isNotPresent(String className) { + return !ClassUtils.isPresent(className, ClassUtils.getDefaultClassLoader()); + } + +} diff --git a/win-framework/win-spring-boot-starter-banner/src/main/java/com/win/framework/banner/package-info.java b/win-framework/win-spring-boot-starter-banner/src/main/java/com/win/framework/banner/package-info.java new file mode 100644 index 0000000..7c3dc7a --- /dev/null +++ b/win-framework/win-spring-boot-starter-banner/src/main/java/com/win/framework/banner/package-info.java @@ -0,0 +1,6 @@ +/** + * Banner 用于在 console 控制台,打印开发文档、接口文档等 + * + * @author 闻荫源码 + */ +package com.win.framework.banner; diff --git a/win-framework/win-spring-boot-starter-banner/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/win-framework/win-spring-boot-starter-banner/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..610b8f7 --- /dev/null +++ b/win-framework/win-spring-boot-starter-banner/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +com.win.framework.banner.config.WinBannerAutoConfiguration \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-banner/src/main/resources/banner.txt b/win-framework/win-spring-boot-starter-banner/src/main/resources/banner.txt new file mode 100644 index 0000000..a44b2f4 --- /dev/null +++ b/win-framework/win-spring-boot-starter-banner/src/main/resources/banner.txt @@ -0,0 +1,17 @@ +闻荫源码 http://www.iocoder.cn +Application Version: ${win.info.version} +Spring Boot Version: ${spring-boot.version} + +.__ __. ______ .______ __ __ _______ +| \ | | / __ \ | _ \ | | | | / _____| +| \| | | | | | | |_) | | | | | | | __ +| . ` | | | | | | _ < | | | | | | |_ | +| |\ | | `--' | | |_) | | `--' | | |__| | +|__| \__| \______/ |______/ \______/ \______| + +███╗ ██╗ ██████╗ ██████╗ ██╗ ██╗ ██████╗ +████╗ ██║██╔═══██╗ ██╔══██╗██║ ██║██╔════╝ +██╔██╗ ██║██║ ██║ ██████╔╝██║ ██║██║ ███╗ +██║╚██╗██║██║ ██║ ██╔══██╗██║ ██║██║ ██║ +██║ ╚████║╚██████╔╝ ██████╔╝╚██████╔╝╚██████╔╝ +╚═╝ ╚═══╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚═════╝ diff --git a/win-framework/win-spring-boot-starter-biz-data-permission/pom.xml b/win-framework/win-spring-boot-starter-biz-data-permission/pom.xml new file mode 100644 index 0000000..dd4d127 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-data-permission/pom.xml @@ -0,0 +1,52 @@ + + + + com.win + win-framework + ${revision} + + 4.0.0 + win-spring-boot-starter-biz-data-permission + jar + + ${project.artifactId} + 数据权限 + https://github.com/YunaiV/ruoyi-vue-pro + + + + com.win + win-common + + + + + com.win + win-spring-boot-starter-security + true + + + + + com.win + win-spring-boot-starter-mybatis + + + + + com.win + win-module-system-api + ${revision} + + + + + com.win + win-spring-boot-starter-test + test + + + + diff --git a/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/config/WinDataPermissionAutoConfiguration.java b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/config/WinDataPermissionAutoConfiguration.java new file mode 100644 index 0000000..e4cec6d --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/config/WinDataPermissionAutoConfiguration.java @@ -0,0 +1,44 @@ +package com.win.framework.datapermission.config; + +import com.win.framework.datapermission.core.aop.DataPermissionAnnotationAdvisor; +import com.win.framework.datapermission.core.db.DataPermissionDatabaseInterceptor; +import com.win.framework.datapermission.core.rule.DataPermissionRule; +import com.win.framework.datapermission.core.rule.DataPermissionRuleFactory; +import com.win.framework.datapermission.core.rule.DataPermissionRuleFactoryImpl; +import com.win.framework.mybatis.core.util.MyBatisUtils; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.context.annotation.Bean; + +import java.util.List; + +/** + * 数据权限的自动配置类 + * + * @author 闻荫源码 + */ +@AutoConfiguration +public class WinDataPermissionAutoConfiguration { + + @Bean + public DataPermissionRuleFactory dataPermissionRuleFactory(List rules) { + return new DataPermissionRuleFactoryImpl(rules); + } + + @Bean + public DataPermissionDatabaseInterceptor dataPermissionDatabaseInterceptor(MybatisPlusInterceptor interceptor, + DataPermissionRuleFactory ruleFactory) { + // 创建 DataPermissionDatabaseInterceptor 拦截器 + DataPermissionDatabaseInterceptor inner = new DataPermissionDatabaseInterceptor(ruleFactory); + // 添加到 interceptor 中 + // 需要加在首个,主要是为了在分页插件前面。这个是 MyBatis Plus 的规定 + MyBatisUtils.addInterceptor(interceptor, inner, 0); + return inner; + } + + @Bean + public DataPermissionAnnotationAdvisor dataPermissionAnnotationAdvisor() { + return new DataPermissionAnnotationAdvisor(); + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/config/WinDeptDataPermissionAutoConfiguration.java b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/config/WinDeptDataPermissionAutoConfiguration.java new file mode 100644 index 0000000..8cfbb71 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/config/WinDeptDataPermissionAutoConfiguration.java @@ -0,0 +1,34 @@ +package com.win.framework.datapermission.config; + +import com.win.framework.datapermission.core.rule.dept.DeptDataPermissionRule; +import com.win.framework.datapermission.core.rule.dept.DeptDataPermissionRuleCustomizer; +import com.win.framework.security.core.LoginUser; +import com.win.module.system.api.permission.PermissionApi; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.context.annotation.Bean; + +import java.util.List; + +/** + * 基于部门的数据权限 AutoConfiguration + * + * @author 闻荫源码 + */ +@AutoConfiguration +@ConditionalOnClass(LoginUser.class) +@ConditionalOnBean(value = {PermissionApi.class, DeptDataPermissionRuleCustomizer.class}) +public class WinDeptDataPermissionAutoConfiguration { + + @Bean + public DeptDataPermissionRule deptDataPermissionRule(PermissionApi permissionApi, + List customizers) { + // 创建 DeptDataPermissionRule 对象 + DeptDataPermissionRule rule = new DeptDataPermissionRule(permissionApi); + // 补全表配置 + customizers.forEach(customizer -> customizer.customize(rule)); + return rule; + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/annotation/DataPermission.java b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/annotation/DataPermission.java new file mode 100644 index 0000000..0560695 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/annotation/DataPermission.java @@ -0,0 +1,35 @@ +package com.win.framework.datapermission.core.annotation; + +import com.win.framework.datapermission.core.rule.DataPermissionRule; + +import java.lang.annotation.*; + +/** + * 数据权限注解 + * 可声明在类或者方法上,标识使用的数据权限规则 + * + * @author 闻荫源码 + */ +@Target({ElementType.TYPE, ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface DataPermission { + + /** + * 当前类或方法是否开启数据权限 + * 即使不添加 @DataPermission 注解,默认是开启状态 + * 可通过设置 enable 为 false 禁用 + */ + boolean enable() default true; + + /** + * 生效的数据权限规则数组,优先级高于 {@link #excludeRules()} + */ + Class[] includeRules() default {}; + + /** + * 排除的数据权限规则数组,优先级最低 + */ + Class[] excludeRules() default {}; + +} diff --git a/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/aop/DataPermissionAnnotationAdvisor.java b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/aop/DataPermissionAnnotationAdvisor.java new file mode 100644 index 0000000..2caeb1f --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/aop/DataPermissionAnnotationAdvisor.java @@ -0,0 +1,36 @@ +package com.win.framework.datapermission.core.aop; + +import com.win.framework.datapermission.core.annotation.DataPermission; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import org.aopalliance.aop.Advice; +import org.springframework.aop.Pointcut; +import org.springframework.aop.support.AbstractPointcutAdvisor; +import org.springframework.aop.support.ComposablePointcut; +import org.springframework.aop.support.annotation.AnnotationMatchingPointcut; + +/** + * {@link com.win.framework.datapermission.core.annotation.DataPermission} 注解的 Advisor 实现类 + * + * @author 闻荫源码 + */ +@Getter +@EqualsAndHashCode(callSuper = true) +public class DataPermissionAnnotationAdvisor extends AbstractPointcutAdvisor { + + private final Advice advice; + + private final Pointcut pointcut; + + public DataPermissionAnnotationAdvisor() { + this.advice = new DataPermissionAnnotationInterceptor(); + this.pointcut = this.buildPointcut(); + } + + protected Pointcut buildPointcut() { + Pointcut classPointcut = new AnnotationMatchingPointcut(DataPermission.class, true); + Pointcut methodPointcut = new AnnotationMatchingPointcut(null, DataPermission.class, true); + return new ComposablePointcut(classPointcut).union(methodPointcut); + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/aop/DataPermissionAnnotationInterceptor.java b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/aop/DataPermissionAnnotationInterceptor.java new file mode 100644 index 0000000..b02e2a5 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/aop/DataPermissionAnnotationInterceptor.java @@ -0,0 +1,72 @@ +package com.win.framework.datapermission.core.aop; + +import com.win.framework.datapermission.core.annotation.DataPermission; +import lombok.Getter; +import org.aopalliance.intercept.MethodInterceptor; +import org.aopalliance.intercept.MethodInvocation; +import org.springframework.core.MethodClassKey; +import org.springframework.core.annotation.AnnotationUtils; + +import java.lang.reflect.Method; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * {@link DataPermission} 注解的拦截器 + * 1. 在执行方法前,将 @DataPermission 注解入栈 + * 2. 在执行方法后,将 @DataPermission 注解出栈 + * + * @author 闻荫源码 + */ +@DataPermission // 该注解,用于 {@link DATA_PERMISSION_NULL} 的空对象 +public class DataPermissionAnnotationInterceptor implements MethodInterceptor { + + /** + * DataPermission 空对象,用于方法无 {@link DataPermission} 注解时,使用 DATA_PERMISSION_NULL 进行占位 + */ + static final DataPermission DATA_PERMISSION_NULL = DataPermissionAnnotationInterceptor.class.getAnnotation(DataPermission.class); + + @Getter + private final Map dataPermissionCache = new ConcurrentHashMap<>(); + + @Override + public Object invoke(MethodInvocation methodInvocation) throws Throwable { + // 入栈 + DataPermission dataPermission = this.findAnnotation(methodInvocation); + if (dataPermission != null) { + DataPermissionContextHolder.add(dataPermission); + } + try { + // 执行逻辑 + return methodInvocation.proceed(); + } finally { + // 出栈 + if (dataPermission != null) { + DataPermissionContextHolder.remove(); + } + } + } + + private DataPermission findAnnotation(MethodInvocation methodInvocation) { + // 1. 从缓存中获取 + Method method = methodInvocation.getMethod(); + Object targetObject = methodInvocation.getThis(); + Class clazz = targetObject != null ? targetObject.getClass() : method.getDeclaringClass(); + MethodClassKey methodClassKey = new MethodClassKey(method, clazz); + DataPermission dataPermission = dataPermissionCache.get(methodClassKey); + if (dataPermission != null) { + return dataPermission != DATA_PERMISSION_NULL ? dataPermission : null; + } + + // 2.1 从方法中获取 + dataPermission = AnnotationUtils.findAnnotation(method, DataPermission.class); + // 2.2 从类上获取 + if (dataPermission == null) { + dataPermission = AnnotationUtils.findAnnotation(clazz, DataPermission.class); + } + // 2.3 添加到缓存中 + dataPermissionCache.put(methodClassKey, dataPermission != null ? dataPermission : DATA_PERMISSION_NULL); + return dataPermission; + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/aop/DataPermissionContextHolder.java b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/aop/DataPermissionContextHolder.java new file mode 100644 index 0000000..2aeff98 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/aop/DataPermissionContextHolder.java @@ -0,0 +1,72 @@ +package com.win.framework.datapermission.core.aop; + +import com.win.framework.datapermission.core.annotation.DataPermission; +import com.alibaba.ttl.TransmittableThreadLocal; + +import java.util.LinkedList; +import java.util.List; + +/** + * {@link DataPermission} 注解的 Context 上下文 + * + * @author 闻荫源码 + */ +public class DataPermissionContextHolder { + + /** + * 使用 List 的原因,可能存在方法的嵌套调用 + */ + private static final ThreadLocal> DATA_PERMISSIONS = + TransmittableThreadLocal.withInitial(LinkedList::new); + + /** + * 获得当前的 DataPermission 注解 + * + * @return DataPermission 注解 + */ + public static DataPermission get() { + return DATA_PERMISSIONS.get().peekLast(); + } + + /** + * 入栈 DataPermission 注解 + * + * @param dataPermission DataPermission 注解 + */ + public static void add(DataPermission dataPermission) { + DATA_PERMISSIONS.get().addLast(dataPermission); + } + + /** + * 出栈 DataPermission 注解 + * + * @return DataPermission 注解 + */ + public static DataPermission remove() { + DataPermission dataPermission = DATA_PERMISSIONS.get().removeLast(); + // 无元素时,清空 ThreadLocal + if (DATA_PERMISSIONS.get().isEmpty()) { + DATA_PERMISSIONS.remove(); + } + return dataPermission; + } + + /** + * 获得所有 DataPermission + * + * @return DataPermission 队列 + */ + public static List getAll() { + return DATA_PERMISSIONS.get(); + } + + /** + * 清空上下文 + * + * 目前仅仅用于单测 + */ + public static void clear() { + DATA_PERMISSIONS.remove(); + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/db/DataPermissionDatabaseInterceptor.java b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/db/DataPermissionDatabaseInterceptor.java new file mode 100644 index 0000000..19fd914 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/db/DataPermissionDatabaseInterceptor.java @@ -0,0 +1,641 @@ +package com.win.framework.datapermission.core.db; + +import cn.hutool.core.collection.CollUtil; +import com.win.framework.common.util.collection.SetUtils; +import com.win.framework.datapermission.core.rule.DataPermissionRule; +import com.win.framework.datapermission.core.rule.DataPermissionRuleFactory; +import com.win.framework.mybatis.core.util.MyBatisUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.PluginUtils; +import com.baomidou.mybatisplus.extension.parser.JsqlParserSupport; +import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import net.sf.jsqlparser.expression.*; +import net.sf.jsqlparser.expression.operators.conditional.AndExpression; +import net.sf.jsqlparser.expression.operators.conditional.OrExpression; +import net.sf.jsqlparser.expression.operators.relational.ExistsExpression; +import net.sf.jsqlparser.expression.operators.relational.ExpressionList; +import net.sf.jsqlparser.expression.operators.relational.InExpression; +import net.sf.jsqlparser.schema.Table; +import net.sf.jsqlparser.statement.delete.Delete; +import net.sf.jsqlparser.statement.select.*; +import net.sf.jsqlparser.statement.update.Update; +import org.apache.ibatis.executor.Executor; +import org.apache.ibatis.executor.statement.StatementHandler; +import org.apache.ibatis.mapping.BoundSql; +import org.apache.ibatis.mapping.MappedStatement; +import org.apache.ibatis.mapping.SqlCommandType; +import org.apache.ibatis.session.ResultHandler; +import org.apache.ibatis.session.RowBounds; + +import java.sql.Connection; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 数据权限拦截器,通过 {@link DataPermissionRule} 数据权限规则,重写 SQL 的方式来实现 + * 主要的 SQL 重写方法,可见 {@link #builderExpression(Expression, List)} 方法 + * + * 整体的代码实现上,参考 {@link com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor} 实现。 + * 所以每次 MyBatis Plus 升级时,需要 Review 下其具体的实现是否有变更! + * + * @author 闻荫源码 + */ +@RequiredArgsConstructor +public class DataPermissionDatabaseInterceptor extends JsqlParserSupport implements InnerInterceptor { + + private final DataPermissionRuleFactory ruleFactory; + + @Getter + private final MappedStatementCache mappedStatementCache = new MappedStatementCache(); + + @Override // SELECT 场景 + public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) { + // 获得 Mapper 对应的数据权限的规则 + List rules = ruleFactory.getDataPermissionRule(ms.getId()); + if (mappedStatementCache.noRewritable(ms, rules)) { // 如果无需重写,则跳过 + return; + } + + PluginUtils.MPBoundSql mpBs = PluginUtils.mpBoundSql(boundSql); + try { + // 初始化上下文 + ContextHolder.init(rules); + // 处理 SQL + mpBs.sql(parserSingle(mpBs.sql(), null)); + } finally { + // 添加是否需要重写的缓存 + addMappedStatementCache(ms); + // 清空上下文 + ContextHolder.clear(); + } + } + + @Override // 只处理 UPDATE / DELETE 场景,不处理 INSERT 场景(因为 INSERT 不需要数据权限) + public void beforePrepare(StatementHandler sh, Connection connection, Integer transactionTimeout) { + PluginUtils.MPStatementHandler mpSh = PluginUtils.mpStatementHandler(sh); + MappedStatement ms = mpSh.mappedStatement(); + SqlCommandType sct = ms.getSqlCommandType(); + if (sct == SqlCommandType.UPDATE || sct == SqlCommandType.DELETE) { + // 获得 Mapper 对应的数据权限的规则 + List rules = ruleFactory.getDataPermissionRule(ms.getId()); + if (mappedStatementCache.noRewritable(ms, rules)) { // 如果无需重写,则跳过 + return; + } + + PluginUtils.MPBoundSql mpBs = mpSh.mPBoundSql(); + try { + // 初始化上下文 + ContextHolder.init(rules); + // 处理 SQL + mpBs.sql(parserMulti(mpBs.sql(), null)); + } finally { + // 添加是否需要重写的缓存 + addMappedStatementCache(ms); + // 清空上下文 + ContextHolder.clear(); + } + } + } + + @Override + protected void processSelect(Select select, int index, String sql, Object obj) { + processSelectBody(select.getSelectBody()); + List withItemsList = select.getWithItemsList(); + if (!CollectionUtils.isEmpty(withItemsList)) { + withItemsList.forEach(this::processSelectBody); + } + } + + /** + * update 语句处理 + */ + @Override + protected void processUpdate(Update update, int index, String sql, Object obj) { + final Table table = update.getTable(); + update.setWhere(this.builderExpression(update.getWhere(), table)); + } + + /** + * delete 语句处理 + */ + @Override + protected void processDelete(Delete delete, int index, String sql, Object obj) { + delete.setWhere(this.builderExpression(delete.getWhere(), delete.getTable())); + } + + // ========== 和 TenantLineInnerInterceptor 一致的逻辑 ========== + + protected void processSelectBody(SelectBody selectBody) { + if (selectBody == null) { + return; + } + if (selectBody instanceof PlainSelect) { + processPlainSelect((PlainSelect) selectBody); + } else if (selectBody instanceof WithItem) { + WithItem withItem = (WithItem) selectBody; + processSelectBody(withItem.getSubSelect().getSelectBody()); + } else { + SetOperationList operationList = (SetOperationList) selectBody; + List selectBodyList = operationList.getSelects(); + if (CollectionUtils.isNotEmpty(selectBodyList)) { + selectBodyList.forEach(this::processSelectBody); + } + } + } + + /** + * 处理 PlainSelect + */ + protected void processPlainSelect(PlainSelect plainSelect) { + //#3087 github + List selectItems = plainSelect.getSelectItems(); + if (CollectionUtils.isNotEmpty(selectItems)) { + selectItems.forEach(this::processSelectItem); + } + + // 处理 where 中的子查询 + Expression where = plainSelect.getWhere(); + processWhereSubSelect(where); + + // 处理 fromItem + FromItem fromItem = plainSelect.getFromItem(); + List list = processFromItem(fromItem); + List
mainTables = new ArrayList<>(list); + + // 处理 join + List joins = plainSelect.getJoins(); + if (CollectionUtils.isNotEmpty(joins)) { + mainTables = processJoins(mainTables, joins); + } + + // 当有 mainTable 时,进行 where 条件追加 + if (CollectionUtils.isNotEmpty(mainTables)) { + plainSelect.setWhere(builderExpression(where, mainTables)); + } + } + + private List
processFromItem(FromItem fromItem) { + // 处理括号括起来的表达式 + while (fromItem instanceof ParenthesisFromItem) { + fromItem = ((ParenthesisFromItem) fromItem).getFromItem(); + } + + List
mainTables = new ArrayList<>(); + // 无 join 时的处理逻辑 + if (fromItem instanceof Table) { + Table fromTable = (Table) fromItem; + mainTables.add(fromTable); + } else if (fromItem instanceof SubJoin) { + // SubJoin 类型则还需要添加上 where 条件 + List
tables = processSubJoin((SubJoin) fromItem); + mainTables.addAll(tables); + } else { + // 处理下 fromItem + processOtherFromItem(fromItem); + } + return mainTables; + } + + /** + * 处理where条件内的子查询 + *

+ * 支持如下: + * 1. in + * 2. = + * 3. > + * 4. < + * 5. >= + * 6. <= + * 7. <> + * 8. EXISTS + * 9. NOT EXISTS + *

+ * 前提条件: + * 1. 子查询必须放在小括号中 + * 2. 子查询一般放在比较操作符的右边 + * + * @param where where 条件 + */ + protected void processWhereSubSelect(Expression where) { + if (where == null) { + return; + } + if (where instanceof FromItem) { + processOtherFromItem((FromItem) where); + return; + } + if (where.toString().indexOf("SELECT") > 0) { + // 有子查询 + if (where instanceof BinaryExpression) { + // 比较符号 , and , or , 等等 + BinaryExpression expression = (BinaryExpression) where; + processWhereSubSelect(expression.getLeftExpression()); + processWhereSubSelect(expression.getRightExpression()); + } else if (where instanceof InExpression) { + // in + InExpression expression = (InExpression) where; + Expression inExpression = expression.getRightExpression(); + if (inExpression instanceof SubSelect) { + processSelectBody(((SubSelect) inExpression).getSelectBody()); + } + } else if (where instanceof ExistsExpression) { + // exists + ExistsExpression expression = (ExistsExpression) where; + processWhereSubSelect(expression.getRightExpression()); + } else if (where instanceof NotExpression) { + // not exists + NotExpression expression = (NotExpression) where; + processWhereSubSelect(expression.getExpression()); + } else if (where instanceof Parenthesis) { + Parenthesis expression = (Parenthesis) where; + processWhereSubSelect(expression.getExpression()); + } + } + } + + protected void processSelectItem(SelectItem selectItem) { + if (selectItem instanceof SelectExpressionItem) { + SelectExpressionItem selectExpressionItem = (SelectExpressionItem) selectItem; + if (selectExpressionItem.getExpression() instanceof SubSelect) { + processSelectBody(((SubSelect) selectExpressionItem.getExpression()).getSelectBody()); + } else if (selectExpressionItem.getExpression() instanceof Function) { + processFunction((Function) selectExpressionItem.getExpression()); + } + } + } + + /** + * 处理函数 + *

支持: 1. select fun(args..) 2. select fun1(fun2(args..),args..)

+ *

fixed gitee pulls/141

+ * + * @param function + */ + protected void processFunction(Function function) { + ExpressionList parameters = function.getParameters(); + if (parameters != null) { + parameters.getExpressions().forEach(expression -> { + if (expression instanceof SubSelect) { + processSelectBody(((SubSelect) expression).getSelectBody()); + } else if (expression instanceof Function) { + processFunction((Function) expression); + } + }); + } + } + + /** + * 处理子查询等 + */ + protected void processOtherFromItem(FromItem fromItem) { + // 去除括号 + while (fromItem instanceof ParenthesisFromItem) { + fromItem = ((ParenthesisFromItem) fromItem).getFromItem(); + } + + if (fromItem instanceof SubSelect) { + SubSelect subSelect = (SubSelect) fromItem; + if (subSelect.getSelectBody() != null) { + processSelectBody(subSelect.getSelectBody()); + } + } else if (fromItem instanceof ValuesList) { + logger.debug("Perform a subQuery, if you do not give us feedback"); + } else if (fromItem instanceof LateralSubSelect) { + LateralSubSelect lateralSubSelect = (LateralSubSelect) fromItem; + if (lateralSubSelect.getSubSelect() != null) { + SubSelect subSelect = lateralSubSelect.getSubSelect(); + if (subSelect.getSelectBody() != null) { + processSelectBody(subSelect.getSelectBody()); + } + } + } + } + + /** + * 处理 sub join + * + * @param subJoin subJoin + * @return Table subJoin 中的主表 + */ + private List
processSubJoin(SubJoin subJoin) { + List
mainTables = new ArrayList<>(); + if (subJoin.getJoinList() != null) { + List
list = processFromItem(subJoin.getLeft()); + mainTables.addAll(list); + mainTables = processJoins(mainTables, subJoin.getJoinList()); + } + return mainTables; + } + + /** + * 处理 joins + * + * @param mainTables 可以为 null + * @param joins join 集合 + * @return List
右连接查询的 Table 列表 + */ + private List
processJoins(List
mainTables, List joins) { + // join 表达式中最终的主表 + Table mainTable = null; + // 当前 join 的左表 + Table leftTable = null; + + if (mainTables == null) { + mainTables = new ArrayList<>(); + } else if (mainTables.size() == 1) { + mainTable = mainTables.get(0); + leftTable = mainTable; + } + + //对于 on 表达式写在最后的 join,需要记录下前面多个 on 的表名 + Deque> onTableDeque = new LinkedList<>(); + for (Join join : joins) { + // 处理 on 表达式 + FromItem joinItem = join.getRightItem(); + + // 获取当前 join 的表,subJoint 可以看作是一张表 + List
joinTables = null; + if (joinItem instanceof Table) { + joinTables = new ArrayList<>(); + joinTables.add((Table) joinItem); + } else if (joinItem instanceof SubJoin) { + joinTables = processSubJoin((SubJoin) joinItem); + } + + if (joinTables != null) { + + // 如果是隐式内连接 + if (join.isSimple()) { + mainTables.addAll(joinTables); + continue; + } + + // 当前表是否忽略 + Table joinTable = joinTables.get(0); + + List
onTables = null; + // 如果不要忽略,且是右连接,则记录下当前表 + if (join.isRight()) { + mainTable = joinTable; + if (leftTable != null) { + onTables = Collections.singletonList(leftTable); + } + } else if (join.isLeft()) { + onTables = Collections.singletonList(joinTable); + } else if (join.isInner()) { + if (mainTable == null) { + onTables = Collections.singletonList(joinTable); + } else { + onTables = Arrays.asList(mainTable, joinTable); + } + mainTable = null; + } + + mainTables = new ArrayList<>(); + if (mainTable != null) { + mainTables.add(mainTable); + } + + // 获取 join 尾缀的 on 表达式列表 + Collection originOnExpressions = join.getOnExpressions(); + // 正常 join on 表达式只有一个,立刻处理 + if (originOnExpressions.size() == 1 && onTables != null) { + List onExpressions = new LinkedList<>(); + onExpressions.add(builderExpression(originOnExpressions.iterator().next(), onTables)); + join.setOnExpressions(onExpressions); + leftTable = joinTable; + continue; + } + // 表名压栈,忽略的表压入 null,以便后续不处理 + onTableDeque.push(onTables); + // 尾缀多个 on 表达式的时候统一处理 + if (originOnExpressions.size() > 1) { + Collection onExpressions = new LinkedList<>(); + for (Expression originOnExpression : originOnExpressions) { + List
currentTableList = onTableDeque.poll(); + if (CollectionUtils.isEmpty(currentTableList)) { + onExpressions.add(originOnExpression); + } else { + onExpressions.add(builderExpression(originOnExpression, currentTableList)); + } + } + join.setOnExpressions(onExpressions); + } + leftTable = joinTable; + } else { + processOtherFromItem(joinItem); + leftTable = null; + } + } + + return mainTables; + } + + // ========== 和 TenantLineInnerInterceptor 存在差异的逻辑:关键,实现权限条件的拼接 ========== + + /** + * 处理条件 + * + * @param currentExpression 当前 where 条件 + * @param table 单个表 + */ + protected Expression builderExpression(Expression currentExpression, Table table) { + return this.builderExpression(currentExpression, Collections.singletonList(table)); + } + + /** + * 处理条件 + * + * @param currentExpression 当前 where 条件 + * @param tables 多个表 + */ + protected Expression builderExpression(Expression currentExpression, List
tables) { + // 没有表需要处理直接返回 + if (CollectionUtils.isEmpty(tables)) { + return currentExpression; + } + + // 第一步,获得 Table 对应的数据权限条件 + Expression dataPermissionExpression = null; + for (Table table : tables) { + // 构建每个表的权限 Expression 条件 + Expression expression = buildDataPermissionExpression(table); + if (expression == null) { + continue; + } + // 合并到 dataPermissionExpression 中 + dataPermissionExpression = dataPermissionExpression == null ? expression + : new AndExpression(dataPermissionExpression, expression); + } + + // 第二步,合并多个 Expression 条件 + if (dataPermissionExpression == null) { + return currentExpression; + } + if (currentExpression == null) { + return dataPermissionExpression; + } + // ① 如果表达式为 Or,则需要 (currentExpression) AND dataPermissionExpression + if (currentExpression instanceof OrExpression) { + return new AndExpression(new Parenthesis(currentExpression), dataPermissionExpression); + } + // ② 如果表达式为 And,则直接返回 where AND dataPermissionExpression + return new AndExpression(currentExpression, dataPermissionExpression); + } + + /** + * 构建指定表的数据权限的 Expression 过滤条件 + * + * @param table 表 + * @return Expression 过滤条件 + */ + private Expression buildDataPermissionExpression(Table table) { + // 生成条件 + Expression allExpression = null; + for (DataPermissionRule rule : ContextHolder.getRules()) { + // 判断表名是否匹配 + if (!rule.getTableNames().contains(table.getName())) { + continue; + } + // 如果有匹配的规则,说明可重写。 + // 为什么不是有 allExpression 非空才重写呢?在生成 column = value 过滤条件时,会因为 value 不存在,导致未重写。 + // 这样导致第一次无 value,被标记成无需重写;但是第二次有 value,此时会需要重写。 + ContextHolder.setRewrite(true); + + // 单条规则的条件 + String tableName = MyBatisUtils.getTableName(table); + Expression oneExpress = rule.getExpression(tableName, table.getAlias()); + if (oneExpress == null){ + continue; + } + // 拼接到 allExpression 中 + allExpression = allExpression == null ? oneExpress + : new AndExpression(allExpression, oneExpress); + } + + return allExpression; + } + + /** + * 判断 SQL 是否重写。如果没有重写,则添加到 {@link MappedStatementCache} 中 + * + * @param ms MappedStatement + */ + private void addMappedStatementCache(MappedStatement ms) { + if (ContextHolder.getRewrite()) { + return; + } + // 无重写,进行添加 + mappedStatementCache.addNoRewritable(ms, ContextHolder.getRules()); + } + + /** + * SQL 解析上下文,方便透传 {@link DataPermissionRule} 规则 + * + * @author 闻荫源码 + */ + static final class ContextHolder { + + /** + * 该 {@link MappedStatement} 对应的规则 + */ + private static final ThreadLocal> RULES = ThreadLocal.withInitial(Collections::emptyList); + /** + * SQL 是否进行重写 + */ + private static final ThreadLocal REWRITE = ThreadLocal.withInitial(() -> Boolean.FALSE); + + public static void init(List rules) { + RULES.set(rules); + REWRITE.set(false); + } + + public static void clear() { + RULES.remove(); + REWRITE.remove(); + } + + public static boolean getRewrite() { + return REWRITE.get(); + } + + public static void setRewrite(boolean rewrite) { + REWRITE.set(rewrite); + } + + public static List getRules() { + return RULES.get(); + } + + } + + /** + * {@link MappedStatement} 缓存 + * 目前主要用于,记录 {@link DataPermissionRule} 是否对指定 {@link MappedStatement} 无效 + * 如果无效,则可以避免 SQL 的解析,加快速度 + * + * @author 闻荫源码 + */ + static final class MappedStatementCache { + + /** + * 指定数据权限规则,对指定 MappedStatement 无需重写(不生效)的缓存 + * + * value:{@link MappedStatement#getId()} 编号 + */ + @Getter + private final Map, Set> noRewritableMappedStatements = new ConcurrentHashMap<>(); + + /** + * 判断是否无需重写 + * ps:虽然有点中文式英语,但是容易读懂即可 + * + * @param ms MappedStatement + * @param rules 数据权限规则数组 + * @return 是否无需重写 + */ + public boolean noRewritable(MappedStatement ms, List rules) { + // 如果规则为空,说明无需重写 + if (CollUtil.isEmpty(rules)) { + return true; + } + // 任一规则不在 noRewritableMap 中,则说明可能需要重写 + for (DataPermissionRule rule : rules) { + Set mappedStatementIds = noRewritableMappedStatements.get(rule.getClass()); + if (!CollUtil.contains(mappedStatementIds, ms.getId())) { + return false; + } + } + return true; + } + + /** + * 添加无需重写的 MappedStatement + * + * @param ms MappedStatement + * @param rules 数据权限规则数组 + */ + public void addNoRewritable(MappedStatement ms, List rules) { + for (DataPermissionRule rule : rules) { + Set mappedStatementIds = noRewritableMappedStatements.get(rule.getClass()); + if (CollUtil.isNotEmpty(mappedStatementIds)) { + mappedStatementIds.add(ms.getId()); + } else { + noRewritableMappedStatements.put(rule.getClass(), SetUtils.asSet(ms.getId())); + } + } + } + + /** + * 清空缓存 + * 目前主要提供给单元测试 + */ + public void clear() { + noRewritableMappedStatements.clear(); + } + + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/rule/DataPermissionRule.java b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/rule/DataPermissionRule.java new file mode 100644 index 0000000..258e3de --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/rule/DataPermissionRule.java @@ -0,0 +1,36 @@ +package com.win.framework.datapermission.core.rule; + +import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; +import net.sf.jsqlparser.expression.Alias; +import net.sf.jsqlparser.expression.Expression; + +import java.util.Set; + +/** + * 数据权限规则接口 + * 通过实现接口,自定义数据规则。例如说, + * + * @author 闻荫源码 + */ +public interface DataPermissionRule { + + /** + * 返回需要生效的表名数组 + * 为什么需要该方法?Data Permission 数组基于 SQL 重写,通过 Where 返回只有权限的数据 + * + * 如果需要基于实体名获得表名,可调用 {@link TableInfoHelper#getTableInfo(Class)} 获得 + * + * @return 表名数组 + */ + Set getTableNames(); + + /** + * 根据表名和别名,生成对应的 WHERE / OR 过滤条件 + * + * @param tableName 表名 + * @param tableAlias 别名,可能为空 + * @return 过滤条件 Expression 表达式 + */ + Expression getExpression(String tableName, Alias tableAlias); + +} diff --git a/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/rule/DataPermissionRuleFactory.java b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/rule/DataPermissionRuleFactory.java new file mode 100644 index 0000000..0211cd9 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/rule/DataPermissionRuleFactory.java @@ -0,0 +1,28 @@ +package com.win.framework.datapermission.core.rule; + +import java.util.List; + +/** + * {@link DataPermissionRule} 工厂接口 + * 作为 {@link DataPermissionRule} 的容器,提供管理能力 + * + * @author 闻荫源码 + */ +public interface DataPermissionRuleFactory { + + /** + * 获得所有数据权限规则数组 + * + * @return 数据权限规则数组 + */ + List getDataPermissionRules(); + + /** + * 获得指定 Mapper 的数据权限规则数组 + * + * @param mappedStatementId 指定 Mapper 的编号 + * @return 数据权限规则数组 + */ + List getDataPermissionRule(String mappedStatementId); + +} diff --git a/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/rule/DataPermissionRuleFactoryImpl.java b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/rule/DataPermissionRuleFactoryImpl.java new file mode 100644 index 0000000..8c48aeb --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/rule/DataPermissionRuleFactoryImpl.java @@ -0,0 +1,62 @@ +package com.win.framework.datapermission.core.rule; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ArrayUtil; +import com.win.framework.datapermission.core.annotation.DataPermission; +import com.win.framework.datapermission.core.aop.DataPermissionContextHolder; +import lombok.RequiredArgsConstructor; + +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 默认的 DataPermissionRuleFactoryImpl 实现类 + * 支持通过 {@link DataPermissionContextHolder} 过滤数据权限 + * + * @author 闻荫源码 + */ +@RequiredArgsConstructor +public class DataPermissionRuleFactoryImpl implements DataPermissionRuleFactory { + + /** + * 数据权限规则数组 + */ + private final List rules; + + @Override + public List getDataPermissionRules() { + return rules; + } + + @Override // mappedStatementId 参数,暂时没有用。以后,可以基于 mappedStatementId + DataPermission 进行缓存 + public List getDataPermissionRule(String mappedStatementId) { + // 1. 无数据权限 + if (CollUtil.isEmpty(rules)) { + return Collections.emptyList(); + } + // 2. 未配置,则默认开启 + DataPermission dataPermission = DataPermissionContextHolder.get(); + if (dataPermission == null) { + return rules; + } + // 3. 已配置,但禁用 + if (!dataPermission.enable()) { + return Collections.emptyList(); + } + + // 4. 已配置,只选择部分规则 + if (ArrayUtil.isNotEmpty(dataPermission.includeRules())) { + return rules.stream().filter(rule -> ArrayUtil.contains(dataPermission.includeRules(), rule.getClass())) + .collect(Collectors.toList()); // 一般规则不会太多,所以不采用 HashSet 查询 + } + // 5. 已配置,只排除部分规则 + if (ArrayUtil.isNotEmpty(dataPermission.excludeRules())) { + return rules.stream().filter(rule -> !ArrayUtil.contains(dataPermission.excludeRules(), rule.getClass())) + .collect(Collectors.toList()); // 一般规则不会太多,所以不采用 HashSet 查询 + } + // 6. 已配置,全部规则 + return rules; + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/rule/dept/DeptDataPermissionRule.java b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/rule/dept/DeptDataPermissionRule.java new file mode 100644 index 0000000..d4d7014 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/rule/dept/DeptDataPermissionRule.java @@ -0,0 +1,199 @@ +package com.win.framework.datapermission.core.rule.dept; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; +import com.win.framework.common.util.collection.CollectionUtils; +import com.win.framework.common.util.json.JsonUtils; +import com.win.framework.datapermission.core.rule.DataPermissionRule; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.framework.mybatis.core.util.MyBatisUtils; +import com.win.framework.security.core.LoginUser; +import com.win.framework.security.core.util.SecurityFrameworkUtils; +import com.win.module.system.api.permission.PermissionApi; +import com.win.module.system.api.permission.dto.DeptDataPermissionRespDTO; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import net.sf.jsqlparser.expression.*; +import net.sf.jsqlparser.expression.operators.conditional.OrExpression; +import net.sf.jsqlparser.expression.operators.relational.EqualsTo; +import net.sf.jsqlparser.expression.operators.relational.ExpressionList; +import net.sf.jsqlparser.expression.operators.relational.InExpression; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +/** + * 基于部门的 {@link DataPermissionRule} 数据权限规则实现 + * + * 注意,使用 DeptDataPermissionRule 时,需要保证表中有 dept_id 部门编号的字段,可自定义。 + * + * 实际业务场景下,会存在一个经典的问题?当用户修改部门时,冗余的 dept_id 是否需要修改? + * 1. 一般情况下,dept_id 不进行修改,则会导致用户看不到之前的数据。【win-server 采用该方案】 + * 2. 部分情况下,希望该用户还是能看到之前的数据,则有两种方式解决:【需要你改造该 DeptDataPermissionRule 的实现代码】 + * 1)编写洗数据的脚本,将 dept_id 修改成新部门的编号;【建议】 + * 最终过滤条件是 WHERE dept_id = ? + * 2)洗数据的话,可能涉及的数据量较大,也可以采用 user_id 进行过滤的方式,此时需要获取到 dept_id 对应的所有 user_id 用户编号; + * 最终过滤条件是 WHERE user_id IN (?, ?, ? ...) + * 3)想要保证原 dept_id 和 user_id 都可以看的到,此时使用 dept_id 和 user_id 一起过滤; + * 最终过滤条件是 WHERE dept_id = ? OR user_id IN (?, ?, ? ...) + * + * @author 闻荫源码 + */ +@AllArgsConstructor +@Slf4j +public class DeptDataPermissionRule implements DataPermissionRule { + + /** + * LoginUser 的 Context 缓存 Key + */ + protected static final String CONTEXT_KEY = DeptDataPermissionRule.class.getSimpleName(); + + private static final String DEPT_COLUMN_NAME = "dept_id"; + private static final String USER_COLUMN_NAME = "user_id"; + + static final Expression EXPRESSION_NULL = new NullValue(); + + private final PermissionApi permissionApi; + + /** + * 基于部门的表字段配置 + * 一般情况下,每个表的部门编号字段是 dept_id,通过该配置自定义。 + * + * key:表名 + * value:字段名 + */ + private final Map deptColumns = new HashMap<>(); + /** + * 基于用户的表字段配置 + * 一般情况下,每个表的部门编号字段是 dept_id,通过该配置自定义。 + * + * key:表名 + * value:字段名 + */ + private final Map userColumns = new HashMap<>(); + /** + * 所有表名,是 {@link #deptColumns} 和 {@link #userColumns} 的合集 + */ + private final Set TABLE_NAMES = new HashSet<>(); + + @Override + public Set getTableNames() { + return TABLE_NAMES; + } + + @Override + public Expression getExpression(String tableName, Alias tableAlias) { + // 只有有登陆用户的情况下,才进行数据权限的处理 + LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); + if (loginUser == null) { + return null; + } + + // 获得数据权限 + DeptDataPermissionRespDTO deptDataPermission = loginUser.getContext(CONTEXT_KEY, DeptDataPermissionRespDTO.class); + // 从上下文中拿不到,则调用逻辑进行获取 + if (deptDataPermission == null) { + deptDataPermission = permissionApi.getDeptDataPermission(loginUser.getId()); + if (deptDataPermission == null) { + log.error("[getExpression][LoginUser({}) 获取数据权限为 null]", JsonUtils.toJsonString(loginUser)); + throw new NullPointerException(String.format("LoginUser(%d) Table(%s/%s) 未返回数据权限", + loginUser.getId(), tableName, tableAlias.getName())); + } + // 添加到上下文中,避免重复计算 + loginUser.setContext(CONTEXT_KEY, deptDataPermission); + } + + // 情况一,如果是 ALL 可查看全部,则无需拼接条件 + if (deptDataPermission.getAll()) { + return null; + } + + // 情况二,即不能查看部门,又不能查看自己,则说明 100% 无权限 + if (CollUtil.isEmpty(deptDataPermission.getDeptIds()) + && Boolean.FALSE.equals(deptDataPermission.getSelf())) { + return new EqualsTo(null, null); // WHERE null = null,可以保证返回的数据为空 + } + + // 情况三,拼接 Dept 和 User 的条件,最后组合 + Expression deptExpression = buildDeptExpression(tableName,tableAlias, deptDataPermission.getDeptIds()); + Expression userExpression = buildUserExpression(tableName, tableAlias, deptDataPermission.getSelf(), loginUser.getId()); + if (deptExpression == null && userExpression == null) { + // TODO 芋艿:获得不到条件的时候,暂时不抛出异常,而是不返回数据 + log.warn("[getExpression][LoginUser({}) Table({}/{}) DeptDataPermission({}) 构建的条件为空]", + JsonUtils.toJsonString(loginUser), tableName, tableAlias, JsonUtils.toJsonString(deptDataPermission)); +// throw new NullPointerException(String.format("LoginUser(%d) Table(%s/%s) 构建的条件为空", +// loginUser.getId(), tableName, tableAlias.getName())); + return EXPRESSION_NULL; + } + if (deptExpression == null) { + return userExpression; + } + if (userExpression == null) { + return deptExpression; + } + // 目前,如果有指定部门 + 可查看自己,采用 OR 条件。即,WHERE (dept_id IN ? OR user_id = ?) + return new Parenthesis(new OrExpression(deptExpression, userExpression)); + } + + private Expression buildDeptExpression(String tableName, Alias tableAlias, Set deptIds) { + // 如果不存在配置,则无需作为条件 + String columnName = deptColumns.get(tableName); + if (StrUtil.isEmpty(columnName)) { + return null; + } + // 如果为空,则无条件 + if (CollUtil.isEmpty(deptIds)) { + return null; + } + // 拼接条件 + return new InExpression(MyBatisUtils.buildColumn(tableName, tableAlias, columnName), + new ExpressionList(CollectionUtils.convertList(deptIds, LongValue::new))); + } + + private Expression buildUserExpression(String tableName, Alias tableAlias, Boolean self, Long userId) { + // 如果不查看自己,则无需作为条件 + if (Boolean.FALSE.equals(self)) { + return null; + } + String columnName = userColumns.get(tableName); + if (StrUtil.isEmpty(columnName)) { + return null; + } + // 拼接条件 + return new EqualsTo(MyBatisUtils.buildColumn(tableName, tableAlias, columnName), new LongValue(userId)); + } + + // ==================== 添加配置 ==================== + + public void addDeptColumn(Class entityClass) { + addDeptColumn(entityClass, DEPT_COLUMN_NAME); + } + + public void addDeptColumn(Class entityClass, String columnName) { + String tableName = TableInfoHelper.getTableInfo(entityClass).getTableName(); + addDeptColumn(tableName, columnName); + } + + public void addDeptColumn(String tableName, String columnName) { + deptColumns.put(tableName, columnName); + TABLE_NAMES.add(tableName); + } + + public void addUserColumn(Class entityClass) { + addUserColumn(entityClass, USER_COLUMN_NAME); + } + + public void addUserColumn(Class entityClass, String columnName) { + String tableName = TableInfoHelper.getTableInfo(entityClass).getTableName(); + addUserColumn(tableName, columnName); + } + + public void addUserColumn(String tableName, String columnName) { + userColumns.put(tableName, columnName); + TABLE_NAMES.add(tableName); + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/rule/dept/DeptDataPermissionRuleCustomizer.java b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/rule/dept/DeptDataPermissionRuleCustomizer.java new file mode 100644 index 0000000..300ec34 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/rule/dept/DeptDataPermissionRuleCustomizer.java @@ -0,0 +1,20 @@ +package com.win.framework.datapermission.core.rule.dept; + +/** + * {@link DeptDataPermissionRule} 的自定义配置接口 + * + * @author 闻荫源码 + */ +@FunctionalInterface +public interface DeptDataPermissionRuleCustomizer { + + /** + * 自定义该权限规则 + * 1. 调用 {@link DeptDataPermissionRule#addDeptColumn(Class, String)} 方法,配置基于 dept_id 的过滤规则 + * 2. 调用 {@link DeptDataPermissionRule#addUserColumn(Class, String)} 方法,配置基于 user_id 的过滤规则 + * + * @param rule 权限规则 + */ + void customize(DeptDataPermissionRule rule); + +} diff --git a/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/rule/dept/package-info.java b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/rule/dept/package-info.java new file mode 100644 index 0000000..aeef564 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/rule/dept/package-info.java @@ -0,0 +1,6 @@ +/** + * 基于部门的数据权限规则 + * + * @author 闻荫源码 + */ +package com.win.framework.datapermission.core.rule.dept; diff --git a/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/util/DataPermissionUtils.java b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/util/DataPermissionUtils.java new file mode 100644 index 0000000..84790aa --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/util/DataPermissionUtils.java @@ -0,0 +1,43 @@ +package com.win.framework.datapermission.core.util; + +import com.win.framework.datapermission.core.annotation.DataPermission; +import com.win.framework.datapermission.core.aop.DataPermissionContextHolder; +import lombok.SneakyThrows; + +/** + * 数据权限 Util + * + * @author 闻荫源码 + */ +public class DataPermissionUtils { + + private static DataPermission DATA_PERMISSION_DISABLE; + + @DataPermission(enable = false) + @SneakyThrows + private static DataPermission getDisableDataPermissionDisable() { + if (DATA_PERMISSION_DISABLE == null) { + DATA_PERMISSION_DISABLE = DataPermissionUtils.class + .getDeclaredMethod("getDisableDataPermissionDisable") + .getAnnotation(DataPermission.class); + } + return DATA_PERMISSION_DISABLE; + } + + /** + * 忽略数据权限,执行对应的逻辑 + * + * @param runnable 逻辑 + */ + public static void executeIgnore(Runnable runnable) { + DataPermission dataPermission = getDisableDataPermissionDisable(); + DataPermissionContextHolder.add(dataPermission); + try { + // 执行 runnable + runnable.run(); + } finally { + DataPermissionContextHolder.remove(); + } + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/package-info.java b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/package-info.java new file mode 100644 index 0000000..241e474 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/package-info.java @@ -0,0 +1,4 @@ +/** + * 基于 JSqlParser 解析 SQL,增加数据权限的 WHERE 条件 + */ +package com.win.framework.datapermission; diff --git a/win-framework/win-spring-boot-starter-biz-data-permission/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..39e2b2e --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1,2 @@ +com.win.framework.datapermission.config.WinDataPermissionAutoConfiguration +com.win.framework.datapermission.config.WinDeptDataPermissionAutoConfiguration \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-biz-dict/pom.xml b/win-framework/win-spring-boot-starter-biz-dict/pom.xml new file mode 100644 index 0000000..e6f0fae --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-dict/pom.xml @@ -0,0 +1,50 @@ + + + + com.win + win-framework + ${revision} + + 4.0.0 + win-spring-boot-starter-biz-dict + jar + + ${project.artifactId} + 字典类型、数据 + https://github.com/YunaiV/ruoyi-vue-pro + + + + com.win + win-common + + + + + org.springframework.boot + spring-boot-starter + + + + + com.win + win-module-system-api + ${revision} + + + + + com.google.guava + guava + + + + + com.win + win-spring-boot-starter-test + test + + + diff --git a/win-framework/win-spring-boot-starter-biz-dict/src/main/java/com/win/framework/dict/config/WinDictAutoConfiguration.java b/win-framework/win-spring-boot-starter-biz-dict/src/main/java/com/win/framework/dict/config/WinDictAutoConfiguration.java new file mode 100644 index 0000000..f8cebf2 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-dict/src/main/java/com/win/framework/dict/config/WinDictAutoConfiguration.java @@ -0,0 +1,18 @@ +package com.win.framework.dict.config; + +import com.win.framework.dict.core.util.DictFrameworkUtils; +import com.win.module.system.api.dict.DictDataApi; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.context.annotation.Bean; + +@AutoConfiguration +public class WinDictAutoConfiguration { + + @Bean + @SuppressWarnings("InstantiationOfUtilityClass") + public DictFrameworkUtils dictUtils(DictDataApi dictDataApi) { + DictFrameworkUtils.init(dictDataApi); + return new DictFrameworkUtils(); + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-dict/src/main/java/com/win/framework/dict/core/package-info.java b/win-framework/win-spring-boot-starter-biz-dict/src/main/java/com/win/framework/dict/core/package-info.java new file mode 100644 index 0000000..a6ce04d --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-dict/src/main/java/com/win/framework/dict/core/package-info.java @@ -0,0 +1,4 @@ +/** + * 占位 + */ +package com.win.framework.dict.core; diff --git a/win-framework/win-spring-boot-starter-biz-dict/src/main/java/com/win/framework/dict/core/util/DictFrameworkUtils.java b/win-framework/win-spring-boot-starter-biz-dict/src/main/java/com/win/framework/dict/core/util/DictFrameworkUtils.java new file mode 100644 index 0000000..df74669 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-dict/src/main/java/com/win/framework/dict/core/util/DictFrameworkUtils.java @@ -0,0 +1,94 @@ +package com.win.framework.dict.core.util; + +import cn.hutool.core.util.ObjectUtil; +import com.win.framework.common.core.KeyValue; +import com.win.framework.common.util.cache.CacheUtils; +import com.win.module.system.api.dict.DictDataApi; +import com.win.module.system.api.dict.dto.DictDataRespDTO; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; + +import java.time.Duration; + +/** + * 字典工具类 + * + * @author 闻荫源码 + */ +@Slf4j +public class DictFrameworkUtils { + + private static DictDataApi dictDataApi; + + private static final DictDataRespDTO DICT_DATA_NULL = new DictDataRespDTO(); + + /** + * 针对 {@link #getDictDataLabel(String, String)} 的缓存 + */ + private static final LoadingCache, DictDataRespDTO> GET_DICT_DATA_CACHE = CacheUtils.buildAsyncReloadingCache( + Duration.ofMinutes(1L), // 过期时间 1 分钟 + new CacheLoader, DictDataRespDTO>() { + + @Override + public DictDataRespDTO load(KeyValue key) { + return ObjectUtil.defaultIfNull(dictDataApi.getDictData(key.getKey(), key.getValue()), DICT_DATA_NULL); + } + + }); + + /** + * 针对 {@link #parseDictDataValue(String, String)} 的缓存 + */ + private static final LoadingCache, DictDataRespDTO> PARSE_DICT_DATA_CACHE = CacheUtils.buildAsyncReloadingCache( + Duration.ofMinutes(1L), // 过期时间 1 分钟 + new CacheLoader, DictDataRespDTO>() { + + @Override + public DictDataRespDTO load(KeyValue key) { + return ObjectUtil.defaultIfNull(dictDataApi.parseDictData(key.getKey(), key.getValue()), DICT_DATA_NULL); + } + + }); + + /** + * 针对 {@link #parseDictDataValue(String, String)} 的缓存 + */ + private static final LoadingCache, String[]> DICT_TYPE_DICT_DATA_CACHE = CacheUtils.buildAsyncReloadingCache( + Duration.ofMinutes(1L), // 过期时间 1 分钟 + new CacheLoader, String[]>() { + + @Override + public String[] load(KeyValue key) { + return ObjectUtil.defaultIfNull(dictDataApi.getDictDataByType(key.getKey()), new String[0]); + } + + }); + + public static void init(DictDataApi dictDataApi) { + DictFrameworkUtils.dictDataApi = dictDataApi; + log.info("[init][初始化 DictFrameworkUtils 成功]"); + } + + @SneakyThrows + public static String getDictDataLabel(String dictType, Integer value) { + return GET_DICT_DATA_CACHE.get(new KeyValue<>(dictType, String.valueOf(value))).getLabel(); + } + + @SneakyThrows + public static String getDictDataLabel(String dictType, String value) { + return GET_DICT_DATA_CACHE.get(new KeyValue<>(dictType, value)).getLabel(); + } + + @SneakyThrows + public static String parseDictDataValue(String dictType, String label) { + return PARSE_DICT_DATA_CACHE.get(new KeyValue<>(dictType, label)).getValue(); + } + + @SneakyThrows + public static String[] dictTypeDictDataValue(String dictType) { + return DICT_TYPE_DICT_DATA_CACHE.get(new KeyValue<>(dictType, null)); + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-dict/src/main/java/com/win/framework/dict/package-info.java b/win-framework/win-spring-boot-starter-biz-dict/src/main/java/com/win/framework/dict/package-info.java new file mode 100644 index 0000000..3ab4db9 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-dict/src/main/java/com/win/framework/dict/package-info.java @@ -0,0 +1,6 @@ +/** + * 字典数据模块,提供 {@link com.win.framework.dict.core.util.DictFrameworkUtils} 工具类 + * + * 通过将字典缓存在内存中,保证性能 + */ +package com.win.framework.dict; diff --git a/win-framework/win-spring-boot-starter-biz-dict/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/win-framework/win-spring-boot-starter-biz-dict/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..050af88 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-dict/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +com.win.framework.dict.config.WinDictAutoConfiguration \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-biz-error-code/pom.xml b/win-framework/win-spring-boot-starter-biz-error-code/pom.xml new file mode 100644 index 0000000..c89dc19 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-error-code/pom.xml @@ -0,0 +1,49 @@ + + + + com.win + win-framework + ${revision} + + 4.0.0 + win-spring-boot-starter-biz-error-code + jar + + ${project.artifactId} + + 错误码 ErrorCode 的自动配置功能,提供如下功能: + 1. 远程读取:项目启动时,从 system-server 服务,读取数据库中的 ErrorCode 错误码,实现错误码的提水可配置; + 2. 自动更新:管理员在管理后台修数据库中的 ErrorCode 错误码时,项目自动从 system-server 服务加载最新的 ErrorCode 错误码; + 3. 自动写入:项目启动时,将项目本地的错误码写到 system-server 服务中,方便管理员在管理后台编辑; + + https://github.com/YunaiV/ruoyi-vue-pro + + + + com.win + win-common + + + + + org.springframework.boot + spring-boot-starter + + + + + com.win + win-module-system-api + ${revision} + + + + jakarta.validation + jakarta.validation-api + provided + + + + diff --git a/win-framework/win-spring-boot-starter-biz-error-code/src/main/java/com/win/framework/errorcode/config/ErrorCodeProperties.java b/win-framework/win-spring-boot-starter-biz-error-code/src/main/java/com/win/framework/errorcode/config/ErrorCodeProperties.java new file mode 100644 index 0000000..112c1b2 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-error-code/src/main/java/com/win/framework/errorcode/config/ErrorCodeProperties.java @@ -0,0 +1,30 @@ +package com.win.framework.errorcode.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.validation.annotation.Validated; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * 错误码的配置属性类 + * + * @author dlyan + */ +@ConfigurationProperties("win.error-code") +@Data +@Validated +public class ErrorCodeProperties { + + /** + * 是否开启 + */ + private Boolean enable = true; + /** + * 错误码枚举类 + */ + @NotNull(message = "错误码枚举类不能为空") + private List constantsClassList; + +} diff --git a/win-framework/win-spring-boot-starter-biz-error-code/src/main/java/com/win/framework/errorcode/config/WinErrorCodeConfiguration.java b/win-framework/win-spring-boot-starter-biz-error-code/src/main/java/com/win/framework/errorcode/config/WinErrorCodeConfiguration.java new file mode 100644 index 0000000..5b88fc3 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-error-code/src/main/java/com/win/framework/errorcode/config/WinErrorCodeConfiguration.java @@ -0,0 +1,39 @@ +package com.win.framework.errorcode.config; + +import com.win.framework.errorcode.core.generator.ErrorCodeAutoGenerator; +import com.win.framework.errorcode.core.generator.ErrorCodeAutoGeneratorImpl; +import com.win.framework.errorcode.core.loader.ErrorCodeLoader; +import com.win.framework.errorcode.core.loader.ErrorCodeLoaderImpl; +import com.win.module.system.api.errorcode.ErrorCodeApi; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.scheduling.annotation.EnableScheduling; + +/** + * 错误码配置类 + * + * @author 闻荫源码 + */ +@AutoConfiguration +@ConditionalOnProperty(prefix = "win.error-code", value = "enable", matchIfMissing = true) // 允许使用 win.error-code.enable=false 禁用访问日志 +@EnableConfigurationProperties(ErrorCodeProperties.class) +@EnableScheduling // 开启调度任务的功能,因为 ErrorCodeRemoteLoader 通过定时刷新错误码 +public class WinErrorCodeConfiguration { + + @Bean + public ErrorCodeAutoGenerator errorCodeAutoGenerator(@Value("${spring.application.name}") String applicationName, + ErrorCodeProperties errorCodeProperties, + ErrorCodeApi errorCodeApi) { + return new ErrorCodeAutoGeneratorImpl(applicationName, errorCodeProperties.getConstantsClassList(), errorCodeApi); + } + + @Bean + public ErrorCodeLoader errorCodeLoader(@Value("${spring.application.name}") String applicationName, + ErrorCodeApi errorCodeApi) { + return new ErrorCodeLoaderImpl(applicationName, errorCodeApi); + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-error-code/src/main/java/com/win/framework/errorcode/core/generator/ErrorCodeAutoGenerator.java b/win-framework/win-spring-boot-starter-biz-error-code/src/main/java/com/win/framework/errorcode/core/generator/ErrorCodeAutoGenerator.java new file mode 100644 index 0000000..9ef8783 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-error-code/src/main/java/com/win/framework/errorcode/core/generator/ErrorCodeAutoGenerator.java @@ -0,0 +1,15 @@ +package com.win.framework.errorcode.core.generator; + +/** + * 错误码的自动生成器 + * + * @author dylan + */ +public interface ErrorCodeAutoGenerator { + + /** + * 将配置类到错误码写入数据库 + */ + void execute(); + +} diff --git a/win-framework/win-spring-boot-starter-biz-error-code/src/main/java/com/win/framework/errorcode/core/generator/ErrorCodeAutoGeneratorImpl.java b/win-framework/win-spring-boot-starter-biz-error-code/src/main/java/com/win/framework/errorcode/core/generator/ErrorCodeAutoGeneratorImpl.java new file mode 100644 index 0000000..0eb1f0d --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-error-code/src/main/java/com/win/framework/errorcode/core/generator/ErrorCodeAutoGeneratorImpl.java @@ -0,0 +1,104 @@ +package com.win.framework.errorcode.core.generator; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.exceptions.ExceptionUtil; +import cn.hutool.core.util.ClassUtil; +import cn.hutool.core.util.ReflectUtil; +import com.win.framework.common.exception.ErrorCode; +import com.win.module.system.api.errorcode.ErrorCodeApi; +import com.win.module.system.api.errorcode.dto.ErrorCodeAutoGenerateReqDTO; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.event.EventListener; +import org.springframework.scheduling.annotation.Async; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * ErrorCodeAutoGenerator 的实现类 + * 目的是,扫描指定的 {@link #constantsClassList} 类,写入到 system 服务中 + * + * @author dylan + */ +@RequiredArgsConstructor +@Slf4j +public class ErrorCodeAutoGeneratorImpl implements ErrorCodeAutoGenerator { + + /** + * 应用分组 + */ + private final String applicationName; + /** + * 错误码枚举类 + */ + private final List constantsClassList; + /** + * 错误码 Api + */ + private final ErrorCodeApi errorCodeApi; + + @Override + @EventListener(ApplicationReadyEvent.class) + @Async // 异步,保证项目的启动过程,毕竟非关键流程 + public void execute() { + // 第一步,解析错误码 + List autoGenerateDTOs = parseErrorCode(); + log.info("[execute][解析到错误码数量为 ({}) 个]", autoGenerateDTOs.size()); + + // 第二步,写入到 system 服务 + errorCodeApi.autoGenerateErrorCodeList(autoGenerateDTOs); + log.info("[execute][写入到 system 组件完成]"); + } + + /** + * 解析 constantsClassList 变量,转换成错误码数组 + * + * @return 错误码数组 + */ + private List parseErrorCode() { + // 校验 errorCodeConstantsClass 参数 + if (CollUtil.isEmpty(constantsClassList)) { + log.info("[execute][未配置 win.error-code.constants-class-list 配置项,不进行自动写入到 system 服务中]"); + return new ArrayList<>(); + } + + // 解析错误码 + List autoGenerateDTOs = new ArrayList<>(); + constantsClassList.forEach(constantsClass -> { + try { + // 解析错误码枚举类 + Class errorCodeConstantsClazz = ClassUtil.loadClass(constantsClass); + // 解析错误码 + autoGenerateDTOs.addAll(parseErrorCode(errorCodeConstantsClazz)); + } catch (Exception ex) { + log.warn("[parseErrorCode][constantsClass({}) 加载失败({})]", constantsClass, + ExceptionUtil.getRootCauseMessage(ex)); + } + }); + return autoGenerateDTOs; + } + + /** + * 解析错误码类,获得错误码数组 + * + * @return 错误码数组 + */ + private List parseErrorCode(Class constantsClass) { + List autoGenerateDTOs = new ArrayList<>(); + Arrays.stream(constantsClass.getFields()).forEach(field -> { + if (field.getType() != ErrorCode.class) { + return; + } + // 转换成 ErrorCodeAutoGenerateReqDTO 对象 + ErrorCode errorCode = (ErrorCode) ReflectUtil.getFieldValue(constantsClass, field); + autoGenerateDTOs.add(new ErrorCodeAutoGenerateReqDTO().setApplicationName(applicationName) + .setCode(errorCode.getCode()).setMessage(errorCode.getMsg())); + }); + return autoGenerateDTOs; + } + +} + diff --git a/win-framework/win-spring-boot-starter-biz-error-code/src/main/java/com/win/framework/errorcode/core/loader/ErrorCodeLoader.java b/win-framework/win-spring-boot-starter-biz-error-code/src/main/java/com/win/framework/errorcode/core/loader/ErrorCodeLoader.java new file mode 100644 index 0000000..f38ca1c --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-error-code/src/main/java/com/win/framework/errorcode/core/loader/ErrorCodeLoader.java @@ -0,0 +1,24 @@ +package com.win.framework.errorcode.core.loader; + +import com.win.framework.common.exception.util.ServiceExceptionUtil; + +/** + * 错误码加载器 + * + * 注意,错误码最终加载到 {@link ServiceExceptionUtil} 的 MESSAGES 变量中! + * + * @author dlyan + */ +public interface ErrorCodeLoader { + + /** + * 添加错误码 + * + * @param code 错误码的编号 + * @param msg 错误码的提示 + */ + default void putErrorCode(Integer code, String msg) { + ServiceExceptionUtil.put(code, msg); + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-error-code/src/main/java/com/win/framework/errorcode/core/loader/ErrorCodeLoaderImpl.java b/win-framework/win-spring-boot-starter-biz-error-code/src/main/java/com/win/framework/errorcode/core/loader/ErrorCodeLoaderImpl.java new file mode 100644 index 0000000..f76ce05 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-error-code/src/main/java/com/win/framework/errorcode/core/loader/ErrorCodeLoaderImpl.java @@ -0,0 +1,73 @@ +package com.win.framework.errorcode.core.loader; + +import cn.hutool.core.collection.CollUtil; +import com.win.framework.common.util.date.DateUtils; +import com.win.module.system.api.errorcode.ErrorCodeApi; +import com.win.module.system.api.errorcode.dto.ErrorCodeRespDTO; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.event.EventListener; +import org.springframework.scheduling.annotation.Scheduled; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * ErrorCodeLoader 的实现类,从 infra 的数据库中,加载错误码。 + * + * 考虑到错误码会刷新,所以按照 {@link #REFRESH_ERROR_CODE_PERIOD} 频率,增量加载错误码。 + * + * @author dlyan + */ +@RequiredArgsConstructor +@Slf4j +public class ErrorCodeLoaderImpl implements ErrorCodeLoader { + + /** + * 刷新错误码的频率,单位:毫秒 + */ + private static final int REFRESH_ERROR_CODE_PERIOD = 60 * 1000; + + /** + * 应用分组 + */ + private final String applicationName; + /** + * 错误码 Api + */ + private final ErrorCodeApi errorCodeApi; + + /** + * 缓存错误码的最大更新时间,用于后续的增量轮询,判断是否有更新 + */ + private LocalDateTime maxUpdateTime; + + @EventListener(ApplicationReadyEvent.class) + public void loadErrorCodes() { + this.loadErrorCodes0(); + } + + @Scheduled(fixedDelay = REFRESH_ERROR_CODE_PERIOD, initialDelay = REFRESH_ERROR_CODE_PERIOD) + public void refreshErrorCodes() { + this.loadErrorCodes0(); + } + + private void loadErrorCodes0() { + // 加载错误码 + List errorCodeRespDTOs = errorCodeApi.getErrorCodeList(applicationName, maxUpdateTime); + if (CollUtil.isEmpty(errorCodeRespDTOs)) { + return; + } + log.info("[loadErrorCodes0][加载到 ({}) 个错误码]", errorCodeRespDTOs.size()); + + // 刷新错误码的缓存 + errorCodeRespDTOs.forEach(errorCodeRespDTO -> { + // 写入到错误码的缓存 + putErrorCode(errorCodeRespDTO.getCode(), errorCodeRespDTO.getMessage()); + // 记录下更新时间,方便增量更新 + maxUpdateTime = DateUtils.max(maxUpdateTime, errorCodeRespDTO.getUpdateTime()); + }); + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-error-code/src/main/java/com/win/framework/errorcode/package-info.java b/win-framework/win-spring-boot-starter-biz-error-code/src/main/java/com/win/framework/errorcode/package-info.java new file mode 100644 index 0000000..3af3679 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-error-code/src/main/java/com/win/framework/errorcode/package-info.java @@ -0,0 +1,10 @@ +/** + * 错误码 ErrorCode 的自动配置功能,提供如下功能: + * + * 1. 远程读取:项目启动时,从 system-service 服务,读取数据库中的 ErrorCode 错误码,实现错误码的提水可配置; + * 2. 自动更新:管理员在管理后台修数据库中的 ErrorCode 错误码时,项目自动从 system-service 服务加载最新的 ErrorCode 错误码; + * 3. 自动写入:项目启动时,将项目本地的错误码写到 system-server 服务中,方便管理员在管理后台编辑; + * + * @author 闻荫源码 + */ +package com.win.framework.errorcode; diff --git a/win-framework/win-spring-boot-starter-biz-error-code/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/win-framework/win-spring-boot-starter-biz-error-code/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..c128d47 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-error-code/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +com.win.framework.errorcode.config.WinErrorCodeConfiguration \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-biz-ip/pom.xml b/win-framework/win-spring-boot-starter-biz-ip/pom.xml new file mode 100644 index 0000000..0993b25 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-ip/pom.xml @@ -0,0 +1,54 @@ + + + + win-framework + com.win + ${revision} + + 4.0.0 + win-spring-boot-starter-biz-ip + jar + + ${project.artifactId} + IP 拓展,支持如下功能: + 1. IP 功能:查询 IP 对应的城市信息 + 基于 https://gitee.com/lionsoul/ip2region 实现 + 2. 城市功能:查询城市编码对应的城市信息 + 基于 https://github.com/modood/Administrative-divisions-of-China 实现 + + https://github.com/YunaiV/ruoyi-vue-pro + + + + com.win + win-common + + + + + org.lionsoul + ip2region + + + + org.projectlombok + lombok + + + + org.slf4j + slf4j-api + provided + + + + + com.win + win-spring-boot-starter-test + test + + + + diff --git a/win-framework/win-spring-boot-starter-biz-ip/src/main/java/com/win/framework/ip/core/Area.java b/win-framework/win-spring-boot-starter-biz-ip/src/main/java/com/win/framework/ip/core/Area.java new file mode 100644 index 0000000..505c014 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-ip/src/main/java/com/win/framework/ip/core/Area.java @@ -0,0 +1,55 @@ +package com.win.framework.ip.core; + +import com.win.framework.ip.core.enums.AreaTypeEnum; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * 区域节点,包括国家、省份、城市、地区等信息 + * + * 数据可见 resources/area.csv 文件 + * + * @author 闻荫源码 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Area { + + /** + * 编号 - 全球,即根目录 + */ + public static final Integer ID_GLOBAL = 0; + /** + * 编号 - 中国 + */ + public static final Integer ID_CHINA = 1; + + /** + * 编号 + */ + private Integer id; + /** + * 名字 + */ + private String name; + /** + * 类型 + * + * 枚举 {@link AreaTypeEnum} + */ + private Integer type; + + /** + * 父节点 + */ + private Area parent; + /** + * 子节点 + */ + private List children; + +} diff --git a/win-framework/win-spring-boot-starter-biz-ip/src/main/java/com/win/framework/ip/core/enums/AreaTypeEnum.java b/win-framework/win-spring-boot-starter-biz-ip/src/main/java/com/win/framework/ip/core/enums/AreaTypeEnum.java new file mode 100644 index 0000000..dd2df2b --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-ip/src/main/java/com/win/framework/ip/core/enums/AreaTypeEnum.java @@ -0,0 +1,39 @@ +package com.win.framework.ip.core.enums; + +import com.win.framework.common.core.IntArrayValuable; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 区域类型枚举 + * + * @author 闻荫源码 + */ +@AllArgsConstructor +@Getter +public enum AreaTypeEnum implements IntArrayValuable { + + COUNTRY(1, "国家"), + PROVINCE(2, "省份"), + CITY(3, "城市"), + DISTRICT(4, "地区"), // 县、镇、区等 + ; + + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(AreaTypeEnum::getType).toArray(); + + /** + * 类型 + */ + private final Integer type; + /** + * 名字 + */ + private final String name; + + @Override + public int[] array() { + return ARRAYS; + } +} diff --git a/win-framework/win-spring-boot-starter-biz-ip/src/main/java/com/win/framework/ip/core/utils/AreaUtils.java b/win-framework/win-spring-boot-starter-biz-ip/src/main/java/com/win/framework/ip/core/utils/AreaUtils.java new file mode 100644 index 0000000..14926a8 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-ip/src/main/java/com/win/framework/ip/core/utils/AreaUtils.java @@ -0,0 +1,119 @@ +package com.win.framework.ip.core.utils; + +import cn.hutool.core.io.resource.ResourceUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.text.csv.CsvRow; +import cn.hutool.core.text.csv.CsvUtil; +import com.win.framework.common.util.object.ObjectUtils; +import com.win.framework.ip.core.Area; +import com.win.framework.ip.core.enums.AreaTypeEnum; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 区域工具类 + * + * @author 闻荫源码 + */ +@Slf4j +public class AreaUtils { + + /** + * 初始化 SEARCHER + */ + @SuppressWarnings("InstantiationOfUtilityClass") + private final static AreaUtils INSTANCE = new AreaUtils(); + + /** + * Area 内存缓存,提升访问速度 + */ + private static Map areas; + + private AreaUtils() { + long now = System.currentTimeMillis(); + areas = new HashMap<>(); + areas.put(Area.ID_GLOBAL, new Area(Area.ID_GLOBAL, "全球", 0, + null, new ArrayList<>())); + // 从 csv 中加载数据 + List rows = CsvUtil.getReader().read(ResourceUtil.getUtf8Reader("area.csv")).getRows(); + rows.remove(0); // 删除 header + for (CsvRow row : rows) { + // 创建 Area 对象 + Area area = new Area(Integer.valueOf(row.get(0)), row.get(1), Integer.valueOf(row.get(2)), + null, new ArrayList<>()); + // 添加到 areas 中 + areas.put(area.getId(), area); + } + + // 构建父子关系:因为 Area 中没有 parentId 字段,所以需要重复读取 + for (CsvRow row : rows) { + Area area = areas.get(Integer.valueOf(row.get(0))); // 自己 + Area parent = areas.get(Integer.valueOf(row.get(3))); // 父 + Assert.isTrue(area != parent, "{}:父子节点相同", area.getName()); + area.setParent(parent); + parent.getChildren().add(area); + } + log.info("启动加载 AreaUtils 成功,耗时 ({}) 毫秒", System.currentTimeMillis() - now); + } + + /** + * 获得指定编号对应的区域 + * + * @param id 区域编号 + * @return 区域 + */ + public static Area getArea(Integer id) { + return areas.get(id); + } + + /** + * 格式化区域 + * + * @param id 区域编号 + * @return 格式化后的区域 + */ + public static String format(Integer id) { + return format(id, " "); + } + + /** + * 格式化区域 + * + * 例如说: + * 1. id = “静安区”时:上海 上海市 静安区 + * 2. id = “上海市”时:上海 上海市 + * 3. id = “上海”时:上海 + * 4. id = “美国”时:美国 + * 当区域在中国时,默认不显示中国 + * + * @param id 区域编号 + * @param separator 分隔符 + * @return 格式化后的区域 + */ + public static String format(Integer id, String separator) { + // 获得区域 + Area area = areas.get(id); + if (area == null) { + return null; + } + + // 格式化 + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < AreaTypeEnum.values().length; i++) { // 避免死循环 + sb.insert(0, area.getName()); + // “递归”父节点 + area = area.getParent(); + if (area == null + || ObjectUtils.equalsAny(area.getId(), Area.ID_GLOBAL, Area.ID_CHINA)) { // 跳过父节点为中国的情况 + break; + } + sb.insert(0, separator); + } + return sb.toString(); + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-ip/src/main/java/com/win/framework/ip/core/utils/IPUtils.java b/win-framework/win-spring-boot-starter-biz-ip/src/main/java/com/win/framework/ip/core/utils/IPUtils.java new file mode 100644 index 0000000..2bef970 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-ip/src/main/java/com/win/framework/ip/core/utils/IPUtils.java @@ -0,0 +1,87 @@ +package com.win.framework.ip.core.utils; + +import cn.hutool.core.io.resource.ResourceUtil; +import com.win.framework.ip.core.Area; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.lionsoul.ip2region.xdb.Searcher; + +import java.io.IOException; + +/** + * IP 工具类 + * + * IP 数据源来自 ip2region.xdb 精简版,基于 项目 + * + * @author wanglhup + */ +@Slf4j +public class IPUtils { + + /** + * 初始化 SEARCHER + */ + @SuppressWarnings("InstantiationOfUtilityClass") + private final static IPUtils INSTANCE = new IPUtils(); + + /** + * IP 查询器,启动加载到内存中 + */ + private static Searcher SEARCHER; + + /** + * 私有化构造 + */ + private IPUtils() { + try { + long now = System.currentTimeMillis(); + byte[] bytes = ResourceUtil.readBytes("ip2region.xdb"); + SEARCHER = Searcher.newWithBuffer(bytes); + log.info("启动加载 IPUtils 成功,耗时 ({}) 毫秒", System.currentTimeMillis() - now); + } catch (IOException e) { + log.error("启动加载 IPUtils 失败", e); + } + } + + /** + * 查询 IP 对应的地区编号 + * + * @param ip IP 地址,格式为 127.0.0.1 + * @return 地区id + */ + @SneakyThrows + public static Integer getAreaId(String ip) { + return Integer.parseInt(SEARCHER.search(ip.trim())); + } + + /** + * 查询 IP 对应的地区编号 + * + * @param ip IP 地址的时间戳,格式参考{@link Searcher#checkIP(String)} 的返回 + * @return 地区编号 + */ + @SneakyThrows + public static Integer getAreaId(long ip) { + return Integer.parseInt(SEARCHER.search(ip)); + } + + /** + * 查询 IP 对应的地区 + * + * @param ip IP 地址,格式为 127.0.0.1 + * @return 地区 + */ + public static Area getArea(String ip) { + return AreaUtils.getArea(getAreaId(ip)); + } + + /** + * 查询 IP 对应的地区 + * + * @param ip IP 地址的时间戳,格式参考{@link Searcher#checkIP(String)} 的返回 + * @return 地区 + */ + public static Area getArea(long ip) { + return AreaUtils.getArea(getAreaId(ip)); + } +} diff --git a/win-framework/win-spring-boot-starter-biz-ip/src/main/java/com/win/framework/ip/package-info.java b/win-framework/win-spring-boot-starter-biz-ip/src/main/java/com/win/framework/ip/package-info.java new file mode 100644 index 0000000..d155e79 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-ip/src/main/java/com/win/framework/ip/package-info.java @@ -0,0 +1,11 @@ +/** + * IP 拓展,支持如下功能: + * + * 1. IP 功能:查询 IP 对应的城市信息 + * 基于 https://gitee.com/lionsoul/ip2region 实现 + * 2. 城市功能:查询城市编码对应的城市信息 + * 基于 https://github.com/modood/Administrative-divisions-of-China 实现 + * + * @author 闻荫源码 + */ +package com.win.framework.ip; diff --git a/win-framework/win-spring-boot-starter-biz-ip/src/main/resources/area.csv b/win-framework/win-spring-boot-starter-biz-ip/src/main/resources/area.csv new file mode 100644 index 0000000..27e753c --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-ip/src/main/resources/area.csv @@ -0,0 +1,3608 @@ +id,name,type,parentId +1,中国,1,0 +2,蒙古,1,0 +3,朝鲜,1,0 +4,韩国,1,0 +5,日本,1,0 +6,菲律宾,1,0 +7,越南,1,0 +8,老挝,1,0 +9,柬埔寨,1,0 +10,缅甸,1,0 +11,泰国,1,0 +12,马来西亚,1,0 +13,文莱,1,0 +14,新加坡,1,0 +15,印度尼西亚,1,0 +16,东帝汶,1,0 +17,尼泊尔,1,0 +18,不丹,1,0 +19,孟加拉国,1,0 +20,印度,1,0 +21,巴基斯坦,1,0 +22,斯里兰卡,1,0 +23,马尔代夫,1,0 +24,哈萨克斯坦,1,0 +25,吉尔吉斯斯坦,1,0 +26,塔吉克斯坦,1,0 +27,乌兹别克斯坦,1,0 +28,土库曼斯坦,1,0 +29,阿富汗,1,0 +30,伊拉克,1,0 +31,伊朗,1,0 +32,叙利亚,1,0 +33,约旦,1,0 +34,黎巴嫩,1,0 +35,以色列,1,0 +36,巴勒斯坦,1,0 +37,沙特阿拉伯,1,0 +38,巴林,1,0 +39,卡塔尔,1,0 +40,科威特,1,0 +41,阿拉伯联合酋长国,1,0 +42,阿曼,1,0 +43,也门,1,0 +44,格鲁吉亚,1,0 +45,亚美尼亚,1,0 +46,阿塞拜疆,1,0 +47,土耳其,1,0 +48,塞浦路斯,1,0 +49,芬兰,1,0 +50,瑞典,1,0 +51,挪威,1,0 +52,冰岛,1,0 +53,丹麦,1,0 +54,爱沙尼亚,1,0 +55,拉脱维亚,1,0 +56,立陶宛,1,0 +57,白俄罗斯,1,0 +58,俄罗斯,1,0 +59,乌克兰,1,0 +60,摩尔多瓦,1,0 +61,波兰,1,0 +62,捷克,1,0 +63,斯洛伐克,1,0 +64,匈牙利,1,0 +65,德国,1,0 +66,奥地利,1,0 +67,瑞士,1,0 +68,列支敦士登,1,0 +69,英国,1,0 +70,爱尔兰,1,0 +71,荷兰,1,0 +72,比利时,1,0 +73,卢森堡,1,0 +74,法国,1,0 +75,摩纳哥,1,0 +76,罗马尼亚,1,0 +77,保加利亚,1,0 +78,塞尔维亚,1,0 +79,马其顿,1,0 +80,阿尔巴尼亚,1,0 +81,希腊,1,0 +82,斯洛文尼亚,1,0 +83,克罗地亚,1,0 +84,波斯尼亚和墨塞哥维那,1,0 +85,意大利,1,0 +86,梵蒂冈,1,0 +87,圣马力诺,1,0 +88,马耳他,1,0 +89,西班牙,1,0 +90,葡萄牙,1,0 +91,安道尔共和国,1,0 +92,埃及,1,0 +93,利比亚,1,0 +94,苏丹,1,0 +95,突尼斯,1,0 +96,阿尔及利亚,1,0 +97,摩洛哥,1,0 +98,亚速尔群岛,1,0 +99,马德拉群岛,1,0 +100,埃塞俄比亚,1,0 +101,厄立特里亚,1,0 +102,索马里,1,0 +103,吉布提,1,0 +104,肯尼亚,1,0 +105,坦桑尼亚,1,0 +106,乌干达,1,0 +107,卢旺达,1,0 +108,布隆迪,1,0 +109,塞舌尔,1,0 +110,圣多美及普林西比,1,0 +111,塞内加尔,1,0 +112,冈比亚,1,0 +113,马里,1,0 +114,布基纳法索,1,0 +115,几内亚,1,0 +116,几内亚比绍,1,0 +117,佛得角,1,0 +118,塞拉利昂,1,0 +119,利比里亚,1,0 +120,科特迪瓦,1,0 +121,加纳,1,0 +122,多哥,1,0 +123,贝宁,1,0 +124,尼日尔,1,0 +125,加那利群岛,1,0 +126,赞比亚,1,0 +127,安哥拉,1,0 +128,津巴布韦,1,0 +129,马拉维,1,0 +130,莫桑比克,1,0 +131,博茨瓦纳,1,0 +132,纳米比亚,1,0 +133,南非,1,0 +134,斯威士兰,1,0 +135,莱索托,1,0 +136,马达加斯加,1,0 +137,科摩罗,1,0 +138,毛里求斯,1,0 +139,留尼旺,1,0 +140,圣赫勒拿,1,0 +141,澳大利亚,1,0 +142,新西兰,1,0 +143,巴布亚新几内亚,1,0 +144,所罗门群岛,1,0 +145,瓦努阿图共和国,1,0 +146,密克罗尼西亚,1,0 +147,马绍尔群岛,1,0 +148,帕劳,1,0 +149,瑙鲁,1,0 +150,基里巴斯,1,0 +151,图瓦卢,1,0 +152,萨摩亚,1,0 +153,斐济,1,0 +154,汤加,1,0 +155,库克群岛,1,0 +156,关岛,1,0 +157,新喀里多尼亚,1,0 +158,法属波利尼西亚,1,0 +159,皮特凯恩岛,1,0 +160,瓦利斯与富图纳,1,0 +161,纽埃,1,0 +162,托克劳,1,0 +163,美属萨摩亚,1,0 +164,北马里亚纳,1,0 +165,加拿大,1,0 +166,美国,1,0 +167,墨西哥,1,0 +168,格陵兰,1,0 +169,危地马拉,1,0 +170,伯利兹,1,0 +171,萨尔瓦多,1,0 +172,洪都拉斯,1,0 +173,尼加拉瓜,1,0 +174,哥斯达黎加,1,0 +175,巴拿马,1,0 +176,巴哈马,1,0 +177,古巴,1,0 +178,牙买加,1,0 +179,海地,1,0 +180,多米尼加共和国,1,0 +181,安提瓜和巴布达,1,0 +182,圣基茨和尼维斯,1,0 +183,多米尼克,1,0 +184,圣卢西亚,1,0 +185,圣文森特和格林纳丁斯,1,0 +186,格林纳达,1,0 +187,巴巴多斯,1,0 +188,特立尼达和多巴哥,1,0 +189,波多黎各,1,0 +190,英属维尔京群岛,1,0 +191,美属维尔京群岛,1,0 +192,安圭拉,1,0 +193,蒙特塞拉特岛,1,0 +194,瓜德罗普,1,0 +195,马提尼克,1,0 +196,荷属安的列斯,1,0 +197,阿鲁巴,1,0 +198,特克斯和凯科斯群岛,1,0 +199,开曼群岛,1,0 +200,百慕大,1,0 +201,哥伦比亚,1,0 +202,委内瑞拉,1,0 +203,圭亚那,1,0 +204,法属圭亚那,1,0 +205,苏里南,1,0 +206,厄瓜多尔,1,0 +207,秘鲁,1,0 +208,玻利维亚,1,0 +209,巴西,1,0 +210,智利,1,0 +211,阿根廷,1,0 +212,乌拉圭,1,0 +213,巴拉圭,1,0 +214,波黑,1,0 +215,直布罗陀,1,0 +216,新喀里多尼亚群岛,1,0 +217,瓦利斯和富图纳群岛,1,0 +218,泽西岛,1,0 +219,黑山,1,0 +220,英属马恩岛,1,0 +221,尼日利亚,1,0 +222,喀麦隆,1,0 +223,加蓬,1,0 +224,乍得,1,0 +225,刚果共和国,1,0 +226,中非共和国,1,0 +227,南苏丹,1,0 +228,赤道几内亚,1,0 +229,毛里塔尼亚,1,0 +230,刚果民主共和国,1,0 +231,留尼汪岛,1,0 +232,格陵兰岛,1,0 +233,法罗群岛,1,0 +234,根西岛,1,0 +235,百慕大群岛,1,0 +236,圣皮埃尔和密克隆群岛,1,0 +237,法属圣马丁,1,0 +238,奥兰群岛,1,0 +239,北马里亚纳群岛,1,0 +240,库拉索,1,0 +241,博内尔岛,1,0 +242,圣马丁岛,1,0 +243,圣巴泰勒米岛,1,0 +244,福克兰群岛,1,0 +245,圣多美和普林西比,1,0 +246,英属印度洋领地,1,0 +247,东萨摩亚,1,0 +248,诺福克岛,1,0 +110000,北京,2,1 +120000,天津,2,1 +130000,河北省,2,1 +140000,山西省,2,1 +150000,内蒙古自治区,2,1 +210000,辽宁省,2,1 +220000,吉林省,2,1 +230000,黑龙江省,2,1 +310000,上海,2,1 +320000,江苏省,2,1 +330000,浙江省,2,1 +340000,安徽省,2,1 +350000,福建省,2,1 +360000,江西省,2,1 +370000,山东省,2,1 +410000,河南省,2,1 +420000,湖北省,2,1 +430000,湖南省,2,1 +440000,广东省,2,1 +450000,广西壮族自治区,2,1 +460000,海南省,2,1 +500000,重庆,2,1 +510000,四川省,2,1 +520000,贵州省,2,1 +530000,云南省,2,1 +540000,西藏自治区,2,1 +610000,陕西省,2,1 +620000,甘肃省,2,1 +630000,青海省,2,1 +640000,宁夏回族自治区,2,1 +650000,新疆维吾尔自治区,2,1 +110100,北京市,3,110000 +120100,天津市,3,120000 +130100,石家庄市,3,130000 +130200,唐山市,3,130000 +130300,秦皇岛市,3,130000 +130400,邯郸市,3,130000 +130500,邢台市,3,130000 +130600,保定市,3,130000 +130700,张家口市,3,130000 +130800,承德市,3,130000 +130900,沧州市,3,130000 +131000,廊坊市,3,130000 +131100,衡水市,3,130000 +140100,太原市,3,140000 +140200,大同市,3,140000 +140300,阳泉市,3,140000 +140400,长治市,3,140000 +140500,晋城市,3,140000 +140600,朔州市,3,140000 +140700,晋中市,3,140000 +140800,运城市,3,140000 +140900,忻州市,3,140000 +141000,临汾市,3,140000 +141100,吕梁市,3,140000 +150100,呼和浩特市,3,150000 +150200,包头市,3,150000 +150300,乌海市,3,150000 +150400,赤峰市,3,150000 +150500,通辽市,3,150000 +150600,鄂尔多斯市,3,150000 +150700,呼伦贝尔市,3,150000 +150800,巴彦淖尔市,3,150000 +150900,乌兰察布市,3,150000 +152200,兴安盟,3,150000 +152500,锡林郭勒盟,3,150000 +152900,阿拉善盟,3,150000 +210100,沈阳市,3,210000 +210200,大连市,3,210000 +210300,鞍山市,3,210000 +210400,抚顺市,3,210000 +210500,本溪市,3,210000 +210600,丹东市,3,210000 +210700,锦州市,3,210000 +210800,营口市,3,210000 +210900,阜新市,3,210000 +211000,辽阳市,3,210000 +211100,盘锦市,3,210000 +211200,铁岭市,3,210000 +211300,朝阳市,3,210000 +211400,葫芦岛市,3,210000 +220100,长春市,3,220000 +220200,吉林市,3,220000 +220300,四平市,3,220000 +220400,辽源市,3,220000 +220500,通化市,3,220000 +220600,白山市,3,220000 +220700,松原市,3,220000 +220800,白城市,3,220000 +222400,延边朝鲜族自治州,3,220000 +230100,哈尔滨市,3,230000 +230200,齐齐哈尔市,3,230000 +230300,鸡西市,3,230000 +230400,鹤岗市,3,230000 +230500,双鸭山市,3,230000 +230600,大庆市,3,230000 +230700,伊春市,3,230000 +230800,佳木斯市,3,230000 +230900,七台河市,3,230000 +231000,牡丹江市,3,230000 +231100,黑河市,3,230000 +231200,绥化市,3,230000 +232700,大兴安岭地区,3,230000 +310100,上海市,3,310000 +320100,南京市,3,320000 +320200,无锡市,3,320000 +320300,徐州市,3,320000 +320400,常州市,3,320000 +320500,苏州市,3,320000 +320600,南通市,3,320000 +320700,连云港市,3,320000 +320800,淮安市,3,320000 +320900,盐城市,3,320000 +321000,扬州市,3,320000 +321100,镇江市,3,320000 +321200,泰州市,3,320000 +321300,宿迁市,3,320000 +330100,杭州市,3,330000 +330200,宁波市,3,330000 +330300,温州市,3,330000 +330400,嘉兴市,3,330000 +330500,湖州市,3,330000 +330600,绍兴市,3,330000 +330700,金华市,3,330000 +330800,衢州市,3,330000 +330900,舟山市,3,330000 +331000,台州市,3,330000 +331100,丽水市,3,330000 +340100,合肥市,3,340000 +340200,芜湖市,3,340000 +340300,蚌埠市,3,340000 +340400,淮南市,3,340000 +340500,马鞍山市,3,340000 +340600,淮北市,3,340000 +340700,铜陵市,3,340000 +340800,安庆市,3,340000 +341000,黄山市,3,340000 +341100,滁州市,3,340000 +341200,阜阳市,3,340000 +341300,宿州市,3,340000 +341500,六安市,3,340000 +341600,亳州市,3,340000 +341700,池州市,3,340000 +341800,宣城市,3,340000 +350100,福州市,3,350000 +350200,厦门市,3,350000 +350300,莆田市,3,350000 +350400,三明市,3,350000 +350500,泉州市,3,350000 +350600,漳州市,3,350000 +350700,南平市,3,350000 +350800,龙岩市,3,350000 +350900,宁德市,3,350000 +360100,南昌市,3,360000 +360200,景德镇市,3,360000 +360300,萍乡市,3,360000 +360400,九江市,3,360000 +360500,新余市,3,360000 +360600,鹰潭市,3,360000 +360700,赣州市,3,360000 +360800,吉安市,3,360000 +360900,宜春市,3,360000 +361000,抚州市,3,360000 +361100,上饶市,3,360000 +370100,济南市,3,370000 +370200,青岛市,3,370000 +370300,淄博市,3,370000 +370400,枣庄市,3,370000 +370500,东营市,3,370000 +370600,烟台市,3,370000 +370700,潍坊市,3,370000 +370800,济宁市,3,370000 +370900,泰安市,3,370000 +371000,威海市,3,370000 +371100,日照市,3,370000 +371300,临沂市,3,370000 +371400,德州市,3,370000 +371500,聊城市,3,370000 +371600,滨州市,3,370000 +371700,菏泽市,3,370000 +410100,郑州市,3,410000 +410200,开封市,3,410000 +410300,洛阳市,3,410000 +410400,平顶山市,3,410000 +410500,安阳市,3,410000 +410600,鹤壁市,3,410000 +410700,新乡市,3,410000 +410800,焦作市,3,410000 +410900,濮阳市,3,410000 +411000,许昌市,3,410000 +411100,漯河市,3,410000 +411200,三门峡市,3,410000 +411300,南阳市,3,410000 +411400,商丘市,3,410000 +411500,信阳市,3,410000 +411600,周口市,3,410000 +411700,驻马店市,3,410000 +419000,省直辖县级行政区划,3,410000 +420100,武汉市,3,420000 +420200,黄石市,3,420000 +420300,十堰市,3,420000 +420500,宜昌市,3,420000 +420600,襄阳市,3,420000 +420700,鄂州市,3,420000 +420800,荆门市,3,420000 +420900,孝感市,3,420000 +421000,荆州市,3,420000 +421100,黄冈市,3,420000 +421200,咸宁市,3,420000 +421300,随州市,3,420000 +422800,恩施土家族苗族自治州,3,420000 +429000,省直辖县级行政区划,3,420000 +430100,长沙市,3,430000 +430200,株洲市,3,430000 +430300,湘潭市,3,430000 +430400,衡阳市,3,430000 +430500,邵阳市,3,430000 +430600,岳阳市,3,430000 +430700,常德市,3,430000 +430800,张家界市,3,430000 +430900,益阳市,3,430000 +431000,郴州市,3,430000 +431100,永州市,3,430000 +431200,怀化市,3,430000 +431300,娄底市,3,430000 +433100,湘西土家族苗族自治州,3,430000 +440100,广州市,3,440000 +440200,韶关市,3,440000 +440300,深圳市,3,440000 +440400,珠海市,3,440000 +440500,汕头市,3,440000 +440600,佛山市,3,440000 +440700,江门市,3,440000 +440800,湛江市,3,440000 +440900,茂名市,3,440000 +441200,肇庆市,3,440000 +441300,惠州市,3,440000 +441400,梅州市,3,440000 +441500,汕尾市,3,440000 +441600,河源市,3,440000 +441700,阳江市,3,440000 +441800,清远市,3,440000 +441900,东莞市,3,440000 +442000,中山市,3,440000 +445100,潮州市,3,440000 +445200,揭阳市,3,440000 +445300,云浮市,3,440000 +450100,南宁市,3,450000 +450200,柳州市,3,450000 +450300,桂林市,3,450000 +450400,梧州市,3,450000 +450500,北海市,3,450000 +450600,防城港市,3,450000 +450700,钦州市,3,450000 +450800,贵港市,3,450000 +450900,玉林市,3,450000 +451000,百色市,3,450000 +451100,贺州市,3,450000 +451200,河池市,3,450000 +451300,来宾市,3,450000 +451400,崇左市,3,450000 +460100,海口市,3,460000 +460200,三亚市,3,460000 +460300,三沙市,3,460000 +460400,儋州市,3,460000 +469000,省直辖县级行政区划,3,460000 +500100,重庆市,3,500000 +510100,成都市,3,510000 +510300,自贡市,3,510000 +510400,攀枝花市,3,510000 +510500,泸州市,3,510000 +510600,德阳市,3,510000 +510700,绵阳市,3,510000 +510800,广元市,3,510000 +510900,遂宁市,3,510000 +511000,内江市,3,510000 +511100,乐山市,3,510000 +511300,南充市,3,510000 +511400,眉山市,3,510000 +511500,宜宾市,3,510000 +511600,广安市,3,510000 +511700,达州市,3,510000 +511800,雅安市,3,510000 +511900,巴中市,3,510000 +512000,资阳市,3,510000 +513200,阿坝藏族羌族自治州,3,510000 +513300,甘孜藏族自治州,3,510000 +513400,凉山彝族自治州,3,510000 +520100,贵阳市,3,520000 +520200,六盘水市,3,520000 +520300,遵义市,3,520000 +520400,安顺市,3,520000 +520500,毕节市,3,520000 +520600,铜仁市,3,520000 +522300,黔西南布依族苗族自治州,3,520000 +522600,黔东南苗族侗族自治州,3,520000 +522700,黔南布依族苗族自治州,3,520000 +530100,昆明市,3,530000 +530300,曲靖市,3,530000 +530400,玉溪市,3,530000 +530500,保山市,3,530000 +530600,昭通市,3,530000 +530700,丽江市,3,530000 +530800,普洱市,3,530000 +530900,临沧市,3,530000 +532300,楚雄彝族自治州,3,530000 +532500,红河哈尼族彝族自治州,3,530000 +532600,文山壮族苗族自治州,3,530000 +532800,西双版纳傣族自治州,3,530000 +532900,大理白族自治州,3,530000 +533100,德宏傣族景颇族自治州,3,530000 +533300,怒江傈僳族自治州,3,530000 +533400,迪庆藏族自治州,3,530000 +540100,拉萨市,3,540000 +540200,日喀则市,3,540000 +540300,昌都市,3,540000 +540400,林芝市,3,540000 +540500,山南市,3,540000 +540600,那曲市,3,540000 +542500,阿里地区,3,540000 +610100,西安市,3,610000 +610200,铜川市,3,610000 +610300,宝鸡市,3,610000 +610400,咸阳市,3,610000 +610500,渭南市,3,610000 +610600,延安市,3,610000 +610700,汉中市,3,610000 +610800,榆林市,3,610000 +610900,安康市,3,610000 +611000,商洛市,3,610000 +620100,兰州市,3,620000 +620200,嘉峪关市,3,620000 +620300,金昌市,3,620000 +620400,白银市,3,620000 +620500,天水市,3,620000 +620600,武威市,3,620000 +620700,张掖市,3,620000 +620800,平凉市,3,620000 +620900,酒泉市,3,620000 +621000,庆阳市,3,620000 +621100,定西市,3,620000 +621200,陇南市,3,620000 +622900,临夏回族自治州,3,620000 +623000,甘南藏族自治州,3,620000 +630100,西宁市,3,630000 +630200,海东市,3,630000 +632200,海北藏族自治州,3,630000 +632300,黄南藏族自治州,3,630000 +632500,海南藏族自治州,3,630000 +632600,果洛藏族自治州,3,630000 +632700,玉树藏族自治州,3,630000 +632800,海西蒙古族藏族自治州,3,630000 +640100,银川市,3,640000 +640200,石嘴山市,3,640000 +640300,吴忠市,3,640000 +640400,固原市,3,640000 +640500,中卫市,3,640000 +650100,乌鲁木齐市,3,650000 +650200,克拉玛依市,3,650000 +650400,吐鲁番市,3,650000 +650500,哈密市,3,650000 +652300,昌吉回族自治州,3,650000 +652700,博尔塔拉蒙古自治州,3,650000 +652800,巴音郭楞蒙古自治州,3,650000 +652900,阿克苏地区,3,650000 +653000,克孜勒苏柯尔克孜自治州,3,650000 +653100,喀什地区,3,650000 +653200,和田地区,3,650000 +654000,伊犁哈萨克自治州,3,650000 +654200,塔城地区,3,650000 +654300,阿勒泰地区,3,650000 +659000,自治区直辖县级行政区划,3,650000 +110101,东城区,4,110100 +110102,西城区,4,110100 +110105,朝阳区,4,110100 +110106,丰台区,4,110100 +110107,石景山区,4,110100 +110108,海淀区,4,110100 +110109,门头沟区,4,110100 +110111,房山区,4,110100 +110112,通州区,4,110100 +110113,顺义区,4,110100 +110114,昌平区,4,110100 +110115,大兴区,4,110100 +110116,怀柔区,4,110100 +110117,平谷区,4,110100 +110118,密云区,4,110100 +110119,延庆区,4,110100 +120101,和平区,4,120100 +120102,河东区,4,120100 +120103,河西区,4,120100 +120104,南开区,4,120100 +120105,河北区,4,120100 +120106,红桥区,4,120100 +120110,东丽区,4,120100 +120111,西青区,4,120100 +120112,津南区,4,120100 +120113,北辰区,4,120100 +120114,武清区,4,120100 +120115,宝坻区,4,120100 +120116,滨海新区,4,120100 +120117,宁河区,4,120100 +120118,静海区,4,120100 +120119,蓟州区,4,120100 +130102,长安区,4,130100 +130104,桥西区,4,130100 +130105,新华区,4,130100 +130107,井陉矿区,4,130100 +130108,裕华区,4,130100 +130109,藁城区,4,130100 +130110,鹿泉区,4,130100 +130111,栾城区,4,130100 +130121,井陉县,4,130100 +130123,正定县,4,130100 +130125,行唐县,4,130100 +130126,灵寿县,4,130100 +130127,高邑县,4,130100 +130128,深泽县,4,130100 +130129,赞皇县,4,130100 +130130,无极县,4,130100 +130131,平山县,4,130100 +130132,元氏县,4,130100 +130133,赵县,4,130100 +130171,石家庄高新技术产业开发区,4,130100 +130172,石家庄循环化工园区,4,130100 +130181,辛集市,4,130100 +130183,晋州市,4,130100 +130184,新乐市,4,130100 +130202,路南区,4,130200 +130203,路北区,4,130200 +130204,古冶区,4,130200 +130205,开平区,4,130200 +130207,丰南区,4,130200 +130208,丰润区,4,130200 +130209,曹妃甸区,4,130200 +130224,滦南县,4,130200 +130225,乐亭县,4,130200 +130227,迁西县,4,130200 +130229,玉田县,4,130200 +130271,河北唐山芦台经济开发区,4,130200 +130272,唐山市汉沽管理区,4,130200 +130273,唐山高新技术产业开发区,4,130200 +130274,河北唐山海港经济开发区,4,130200 +130281,遵化市,4,130200 +130283,迁安市,4,130200 +130284,滦州市,4,130200 +130302,海港区,4,130300 +130303,山海关区,4,130300 +130304,北戴河区,4,130300 +130306,抚宁区,4,130300 +130321,青龙满族自治县,4,130300 +130322,昌黎县,4,130300 +130324,卢龙县,4,130300 +130371,秦皇岛市经济技术开发区,4,130300 +130372,北戴河新区,4,130300 +130402,邯山区,4,130400 +130403,丛台区,4,130400 +130404,复兴区,4,130400 +130406,峰峰矿区,4,130400 +130407,肥乡区,4,130400 +130408,永年区,4,130400 +130423,临漳县,4,130400 +130424,成安县,4,130400 +130425,大名县,4,130400 +130426,涉县,4,130400 +130427,磁县,4,130400 +130430,邱县,4,130400 +130431,鸡泽县,4,130400 +130432,广平县,4,130400 +130433,馆陶县,4,130400 +130434,魏县,4,130400 +130435,曲周县,4,130400 +130471,邯郸经济技术开发区,4,130400 +130473,邯郸冀南新区,4,130400 +130481,武安市,4,130400 +130502,襄都区,4,130500 +130503,信都区,4,130500 +130505,任泽区,4,130500 +130506,南和区,4,130500 +130522,临城县,4,130500 +130523,内丘县,4,130500 +130524,柏乡县,4,130500 +130525,隆尧县,4,130500 +130528,宁晋县,4,130500 +130529,巨鹿县,4,130500 +130530,新河县,4,130500 +130531,广宗县,4,130500 +130532,平乡县,4,130500 +130533,威县,4,130500 +130534,清河县,4,130500 +130535,临西县,4,130500 +130571,河北邢台经济开发区,4,130500 +130581,南宫市,4,130500 +130582,沙河市,4,130500 +130602,竞秀区,4,130600 +130606,莲池区,4,130600 +130607,满城区,4,130600 +130608,清苑区,4,130600 +130609,徐水区,4,130600 +130623,涞水县,4,130600 +130624,阜平县,4,130600 +130626,定兴县,4,130600 +130627,唐县,4,130600 +130628,高阳县,4,130600 +130629,容城县,4,130600 +130630,涞源县,4,130600 +130631,望都县,4,130600 +130632,安新县,4,130600 +130633,易县,4,130600 +130634,曲阳县,4,130600 +130635,蠡县,4,130600 +130636,顺平县,4,130600 +130637,博野县,4,130600 +130638,雄县,4,130600 +130671,保定高新技术产业开发区,4,130600 +130672,保定白沟新城,4,130600 +130681,涿州市,4,130600 +130682,定州市,4,130600 +130683,安国市,4,130600 +130684,高碑店市,4,130600 +130702,桥东区,4,130700 +130703,桥西区,4,130700 +130705,宣化区,4,130700 +130706,下花园区,4,130700 +130708,万全区,4,130700 +130709,崇礼区,4,130700 +130722,张北县,4,130700 +130723,康保县,4,130700 +130724,沽源县,4,130700 +130725,尚义县,4,130700 +130726,蔚县,4,130700 +130727,阳原县,4,130700 +130728,怀安县,4,130700 +130730,怀来县,4,130700 +130731,涿鹿县,4,130700 +130732,赤城县,4,130700 +130771,张家口经济开发区,4,130700 +130772,张家口市察北管理区,4,130700 +130773,张家口市塞北管理区,4,130700 +130802,双桥区,4,130800 +130803,双滦区,4,130800 +130804,鹰手营子矿区,4,130800 +130821,承德县,4,130800 +130822,兴隆县,4,130800 +130824,滦平县,4,130800 +130825,隆化县,4,130800 +130826,丰宁满族自治县,4,130800 +130827,宽城满族自治县,4,130800 +130828,围场满族蒙古族自治县,4,130800 +130871,承德高新技术产业开发区,4,130800 +130881,平泉市,4,130800 +130902,新华区,4,130900 +130903,运河区,4,130900 +130921,沧县,4,130900 +130922,青县,4,130900 +130923,东光县,4,130900 +130924,海兴县,4,130900 +130925,盐山县,4,130900 +130926,肃宁县,4,130900 +130927,南皮县,4,130900 +130928,吴桥县,4,130900 +130929,献县,4,130900 +130930,孟村回族自治县,4,130900 +130971,河北沧州经济开发区,4,130900 +130972,沧州高新技术产业开发区,4,130900 +130973,沧州渤海新区,4,130900 +130981,泊头市,4,130900 +130982,任丘市,4,130900 +130983,黄骅市,4,130900 +130984,河间市,4,130900 +131002,安次区,4,131000 +131003,广阳区,4,131000 +131022,固安县,4,131000 +131023,永清县,4,131000 +131024,香河县,4,131000 +131025,大城县,4,131000 +131026,文安县,4,131000 +131028,大厂回族自治县,4,131000 +131071,廊坊经济技术开发区,4,131000 +131081,霸州市,4,131000 +131082,三河市,4,131000 +131102,桃城区,4,131100 +131103,冀州区,4,131100 +131121,枣强县,4,131100 +131122,武邑县,4,131100 +131123,武强县,4,131100 +131124,饶阳县,4,131100 +131125,安平县,4,131100 +131126,故城县,4,131100 +131127,景县,4,131100 +131128,阜城县,4,131100 +131171,河北衡水高新技术产业开发区,4,131100 +131172,衡水滨湖新区,4,131100 +131182,深州市,4,131100 +140105,小店区,4,140100 +140106,迎泽区,4,140100 +140107,杏花岭区,4,140100 +140108,尖草坪区,4,140100 +140109,万柏林区,4,140100 +140110,晋源区,4,140100 +140121,清徐县,4,140100 +140122,阳曲县,4,140100 +140123,娄烦县,4,140100 +140171,山西转型综合改革示范区,4,140100 +140181,古交市,4,140100 +140212,新荣区,4,140200 +140213,平城区,4,140200 +140214,云冈区,4,140200 +140215,云州区,4,140200 +140221,阳高县,4,140200 +140222,天镇县,4,140200 +140223,广灵县,4,140200 +140224,灵丘县,4,140200 +140225,浑源县,4,140200 +140226,左云县,4,140200 +140271,山西大同经济开发区,4,140200 +140302,城区,4,140300 +140303,矿区,4,140300 +140311,郊区,4,140300 +140321,平定县,4,140300 +140322,盂县,4,140300 +140403,潞州区,4,140400 +140404,上党区,4,140400 +140405,屯留区,4,140400 +140406,潞城区,4,140400 +140423,襄垣县,4,140400 +140425,平顺县,4,140400 +140426,黎城县,4,140400 +140427,壶关县,4,140400 +140428,长子县,4,140400 +140429,武乡县,4,140400 +140430,沁县,4,140400 +140431,沁源县,4,140400 +140471,山西长治高新技术产业园区,4,140400 +140502,城区,4,140500 +140521,沁水县,4,140500 +140522,阳城县,4,140500 +140524,陵川县,4,140500 +140525,泽州县,4,140500 +140581,高平市,4,140500 +140602,朔城区,4,140600 +140603,平鲁区,4,140600 +140621,山阴县,4,140600 +140622,应县,4,140600 +140623,右玉县,4,140600 +140671,山西朔州经济开发区,4,140600 +140681,怀仁市,4,140600 +140702,榆次区,4,140700 +140703,太谷区,4,140700 +140721,榆社县,4,140700 +140722,左权县,4,140700 +140723,和顺县,4,140700 +140724,昔阳县,4,140700 +140725,寿阳县,4,140700 +140727,祁县,4,140700 +140728,平遥县,4,140700 +140729,灵石县,4,140700 +140781,介休市,4,140700 +140802,盐湖区,4,140800 +140821,临猗县,4,140800 +140822,万荣县,4,140800 +140823,闻喜县,4,140800 +140824,稷山县,4,140800 +140825,新绛县,4,140800 +140826,绛县,4,140800 +140827,垣曲县,4,140800 +140828,夏县,4,140800 +140829,平陆县,4,140800 +140830,芮城县,4,140800 +140881,永济市,4,140800 +140882,河津市,4,140800 +140902,忻府区,4,140900 +140921,定襄县,4,140900 +140922,五台县,4,140900 +140923,代县,4,140900 +140924,繁峙县,4,140900 +140925,宁武县,4,140900 +140926,静乐县,4,140900 +140927,神池县,4,140900 +140928,五寨县,4,140900 +140929,岢岚县,4,140900 +140930,河曲县,4,140900 +140931,保德县,4,140900 +140932,偏关县,4,140900 +140971,五台山风景名胜区,4,140900 +140981,原平市,4,140900 +141002,尧都区,4,141000 +141021,曲沃县,4,141000 +141022,翼城县,4,141000 +141023,襄汾县,4,141000 +141024,洪洞县,4,141000 +141025,古县,4,141000 +141026,安泽县,4,141000 +141027,浮山县,4,141000 +141028,吉县,4,141000 +141029,乡宁县,4,141000 +141030,大宁县,4,141000 +141031,隰县,4,141000 +141032,永和县,4,141000 +141033,蒲县,4,141000 +141034,汾西县,4,141000 +141081,侯马市,4,141000 +141082,霍州市,4,141000 +141102,离石区,4,141100 +141121,文水县,4,141100 +141122,交城县,4,141100 +141123,兴县,4,141100 +141124,临县,4,141100 +141125,柳林县,4,141100 +141126,石楼县,4,141100 +141127,岚县,4,141100 +141128,方山县,4,141100 +141129,中阳县,4,141100 +141130,交口县,4,141100 +141181,孝义市,4,141100 +141182,汾阳市,4,141100 +150102,新城区,4,150100 +150103,回民区,4,150100 +150104,玉泉区,4,150100 +150105,赛罕区,4,150100 +150121,土默特左旗,4,150100 +150122,托克托县,4,150100 +150123,和林格尔县,4,150100 +150124,清水河县,4,150100 +150125,武川县,4,150100 +150172,呼和浩特经济技术开发区,4,150100 +150202,东河区,4,150200 +150203,昆都仑区,4,150200 +150204,青山区,4,150200 +150205,石拐区,4,150200 +150206,白云鄂博矿区,4,150200 +150207,九原区,4,150200 +150221,土默特右旗,4,150200 +150222,固阳县,4,150200 +150223,达尔罕茂明安联合旗,4,150200 +150271,包头稀土高新技术产业开发区,4,150200 +150302,海勃湾区,4,150300 +150303,海南区,4,150300 +150304,乌达区,4,150300 +150402,红山区,4,150400 +150403,元宝山区,4,150400 +150404,松山区,4,150400 +150421,阿鲁科尔沁旗,4,150400 +150422,巴林左旗,4,150400 +150423,巴林右旗,4,150400 +150424,林西县,4,150400 +150425,克什克腾旗,4,150400 +150426,翁牛特旗,4,150400 +150428,喀喇沁旗,4,150400 +150429,宁城县,4,150400 +150430,敖汉旗,4,150400 +150502,科尔沁区,4,150500 +150521,科尔沁左翼中旗,4,150500 +150522,科尔沁左翼后旗,4,150500 +150523,开鲁县,4,150500 +150524,库伦旗,4,150500 +150525,奈曼旗,4,150500 +150526,扎鲁特旗,4,150500 +150571,通辽经济技术开发区,4,150500 +150581,霍林郭勒市,4,150500 +150602,东胜区,4,150600 +150603,康巴什区,4,150600 +150621,达拉特旗,4,150600 +150622,准格尔旗,4,150600 +150623,鄂托克前旗,4,150600 +150624,鄂托克旗,4,150600 +150625,杭锦旗,4,150600 +150626,乌审旗,4,150600 +150627,伊金霍洛旗,4,150600 +150702,海拉尔区,4,150700 +150703,扎赉诺尔区,4,150700 +150721,阿荣旗,4,150700 +150722,莫力达瓦达斡尔族自治旗,4,150700 +150723,鄂伦春自治旗,4,150700 +150724,鄂温克族自治旗,4,150700 +150725,陈巴尔虎旗,4,150700 +150726,新巴尔虎左旗,4,150700 +150727,新巴尔虎右旗,4,150700 +150781,满洲里市,4,150700 +150782,牙克石市,4,150700 +150783,扎兰屯市,4,150700 +150784,额尔古纳市,4,150700 +150785,根河市,4,150700 +150802,临河区,4,150800 +150821,五原县,4,150800 +150822,磴口县,4,150800 +150823,乌拉特前旗,4,150800 +150824,乌拉特中旗,4,150800 +150825,乌拉特后旗,4,150800 +150826,杭锦后旗,4,150800 +150902,集宁区,4,150900 +150921,卓资县,4,150900 +150922,化德县,4,150900 +150923,商都县,4,150900 +150924,兴和县,4,150900 +150925,凉城县,4,150900 +150926,察哈尔右翼前旗,4,150900 +150927,察哈尔右翼中旗,4,150900 +150928,察哈尔右翼后旗,4,150900 +150929,四子王旗,4,150900 +150981,丰镇市,4,150900 +152201,乌兰浩特市,4,152200 +152202,阿尔山市,4,152200 +152221,科尔沁右翼前旗,4,152200 +152222,科尔沁右翼中旗,4,152200 +152223,扎赉特旗,4,152200 +152224,突泉县,4,152200 +152501,二连浩特市,4,152500 +152502,锡林浩特市,4,152500 +152522,阿巴嘎旗,4,152500 +152523,苏尼特左旗,4,152500 +152524,苏尼特右旗,4,152500 +152525,东乌珠穆沁旗,4,152500 +152526,西乌珠穆沁旗,4,152500 +152527,太仆寺旗,4,152500 +152528,镶黄旗,4,152500 +152529,正镶白旗,4,152500 +152530,正蓝旗,4,152500 +152531,多伦县,4,152500 +152571,乌拉盖管委会,4,152500 +152921,阿拉善左旗,4,152900 +152922,阿拉善右旗,4,152900 +152923,额济纳旗,4,152900 +152971,内蒙古阿拉善高新技术产业开发区,4,152900 +210102,和平区,4,210100 +210103,沈河区,4,210100 +210104,大东区,4,210100 +210105,皇姑区,4,210100 +210106,铁西区,4,210100 +210111,苏家屯区,4,210100 +210112,浑南区,4,210100 +210113,沈北新区,4,210100 +210114,于洪区,4,210100 +210115,辽中区,4,210100 +210123,康平县,4,210100 +210124,法库县,4,210100 +210181,新民市,4,210100 +210202,中山区,4,210200 +210203,西岗区,4,210200 +210204,沙河口区,4,210200 +210211,甘井子区,4,210200 +210212,旅顺口区,4,210200 +210213,金州区,4,210200 +210214,普兰店区,4,210200 +210224,长海县,4,210200 +210281,瓦房店市,4,210200 +210283,庄河市,4,210200 +210302,铁东区,4,210300 +210303,铁西区,4,210300 +210304,立山区,4,210300 +210311,千山区,4,210300 +210321,台安县,4,210300 +210323,岫岩满族自治县,4,210300 +210381,海城市,4,210300 +210402,新抚区,4,210400 +210403,东洲区,4,210400 +210404,望花区,4,210400 +210411,顺城区,4,210400 +210421,抚顺县,4,210400 +210422,新宾满族自治县,4,210400 +210423,清原满族自治县,4,210400 +210502,平山区,4,210500 +210503,溪湖区,4,210500 +210504,明山区,4,210500 +210505,南芬区,4,210500 +210521,本溪满族自治县,4,210500 +210522,桓仁满族自治县,4,210500 +210602,元宝区,4,210600 +210603,振兴区,4,210600 +210604,振安区,4,210600 +210624,宽甸满族自治县,4,210600 +210681,东港市,4,210600 +210682,凤城市,4,210600 +210702,古塔区,4,210700 +210703,凌河区,4,210700 +210711,太和区,4,210700 +210726,黑山县,4,210700 +210727,义县,4,210700 +210781,凌海市,4,210700 +210782,北镇市,4,210700 +210802,站前区,4,210800 +210803,西市区,4,210800 +210804,鲅鱼圈区,4,210800 +210811,老边区,4,210800 +210881,盖州市,4,210800 +210882,大石桥市,4,210800 +210902,海州区,4,210900 +210903,新邱区,4,210900 +210904,太平区,4,210900 +210905,清河门区,4,210900 +210911,细河区,4,210900 +210921,阜新蒙古族自治县,4,210900 +210922,彰武县,4,210900 +211002,白塔区,4,211000 +211003,文圣区,4,211000 +211004,宏伟区,4,211000 +211005,弓长岭区,4,211000 +211011,太子河区,4,211000 +211021,辽阳县,4,211000 +211081,灯塔市,4,211000 +211102,双台子区,4,211100 +211103,兴隆台区,4,211100 +211104,大洼区,4,211100 +211122,盘山县,4,211100 +211202,银州区,4,211200 +211204,清河区,4,211200 +211221,铁岭县,4,211200 +211223,西丰县,4,211200 +211224,昌图县,4,211200 +211281,调兵山市,4,211200 +211282,开原市,4,211200 +211302,双塔区,4,211300 +211303,龙城区,4,211300 +211321,朝阳县,4,211300 +211322,建平县,4,211300 +211324,喀喇沁左翼蒙古族自治县,4,211300 +211381,北票市,4,211300 +211382,凌源市,4,211300 +211402,连山区,4,211400 +211403,龙港区,4,211400 +211404,南票区,4,211400 +211421,绥中县,4,211400 +211422,建昌县,4,211400 +211481,兴城市,4,211400 +220102,南关区,4,220100 +220103,宽城区,4,220100 +220104,朝阳区,4,220100 +220105,二道区,4,220100 +220106,绿园区,4,220100 +220112,双阳区,4,220100 +220113,九台区,4,220100 +220122,农安县,4,220100 +220171,长春经济技术开发区,4,220100 +220172,长春净月高新技术产业开发区,4,220100 +220173,长春高新技术产业开发区,4,220100 +220174,长春汽车经济技术开发区,4,220100 +220182,榆树市,4,220100 +220183,德惠市,4,220100 +220184,公主岭市,4,220100 +220202,昌邑区,4,220200 +220203,龙潭区,4,220200 +220204,船营区,4,220200 +220211,丰满区,4,220200 +220221,永吉县,4,220200 +220271,吉林经济开发区,4,220200 +220272,吉林高新技术产业开发区,4,220200 +220273,吉林中国新加坡食品区,4,220200 +220281,蛟河市,4,220200 +220282,桦甸市,4,220200 +220283,舒兰市,4,220200 +220284,磐石市,4,220200 +220302,铁西区,4,220300 +220303,铁东区,4,220300 +220322,梨树县,4,220300 +220323,伊通满族自治县,4,220300 +220382,双辽市,4,220300 +220402,龙山区,4,220400 +220403,西安区,4,220400 +220421,东丰县,4,220400 +220422,东辽县,4,220400 +220502,东昌区,4,220500 +220503,二道江区,4,220500 +220521,通化县,4,220500 +220523,辉南县,4,220500 +220524,柳河县,4,220500 +220581,梅河口市,4,220500 +220582,集安市,4,220500 +220602,浑江区,4,220600 +220605,江源区,4,220600 +220621,抚松县,4,220600 +220622,靖宇县,4,220600 +220623,长白朝鲜族自治县,4,220600 +220681,临江市,4,220600 +220702,宁江区,4,220700 +220721,前郭尔罗斯蒙古族自治县,4,220700 +220722,长岭县,4,220700 +220723,乾安县,4,220700 +220771,吉林松原经济开发区,4,220700 +220781,扶余市,4,220700 +220802,洮北区,4,220800 +220821,镇赉县,4,220800 +220822,通榆县,4,220800 +220871,吉林白城经济开发区,4,220800 +220881,洮南市,4,220800 +220882,大安市,4,220800 +222401,延吉市,4,222400 +222402,图们市,4,222400 +222403,敦化市,4,222400 +222404,珲春市,4,222400 +222405,龙井市,4,222400 +222406,和龙市,4,222400 +222424,汪清县,4,222400 +222426,安图县,4,222400 +230102,道里区,4,230100 +230103,南岗区,4,230100 +230104,道外区,4,230100 +230108,平房区,4,230100 +230109,松北区,4,230100 +230110,香坊区,4,230100 +230111,呼兰区,4,230100 +230112,阿城区,4,230100 +230113,双城区,4,230100 +230123,依兰县,4,230100 +230124,方正县,4,230100 +230125,宾县,4,230100 +230126,巴彦县,4,230100 +230127,木兰县,4,230100 +230128,通河县,4,230100 +230129,延寿县,4,230100 +230183,尚志市,4,230100 +230184,五常市,4,230100 +230202,龙沙区,4,230200 +230203,建华区,4,230200 +230204,铁锋区,4,230200 +230205,昂昂溪区,4,230200 +230206,富拉尔基区,4,230200 +230207,碾子山区,4,230200 +230208,梅里斯达斡尔族区,4,230200 +230221,龙江县,4,230200 +230223,依安县,4,230200 +230224,泰来县,4,230200 +230225,甘南县,4,230200 +230227,富裕县,4,230200 +230229,克山县,4,230200 +230230,克东县,4,230200 +230231,拜泉县,4,230200 +230281,讷河市,4,230200 +230302,鸡冠区,4,230300 +230303,恒山区,4,230300 +230304,滴道区,4,230300 +230305,梨树区,4,230300 +230306,城子河区,4,230300 +230307,麻山区,4,230300 +230321,鸡东县,4,230300 +230381,虎林市,4,230300 +230382,密山市,4,230300 +230402,向阳区,4,230400 +230403,工农区,4,230400 +230404,南山区,4,230400 +230405,兴安区,4,230400 +230406,东山区,4,230400 +230407,兴山区,4,230400 +230421,萝北县,4,230400 +230422,绥滨县,4,230400 +230502,尖山区,4,230500 +230503,岭东区,4,230500 +230505,四方台区,4,230500 +230506,宝山区,4,230500 +230521,集贤县,4,230500 +230522,友谊县,4,230500 +230523,宝清县,4,230500 +230524,饶河县,4,230500 +230602,萨尔图区,4,230600 +230603,龙凤区,4,230600 +230604,让胡路区,4,230600 +230605,红岗区,4,230600 +230606,大同区,4,230600 +230621,肇州县,4,230600 +230622,肇源县,4,230600 +230623,林甸县,4,230600 +230624,杜尔伯特蒙古族自治县,4,230600 +230671,大庆高新技术产业开发区,4,230600 +230717,伊美区,4,230700 +230718,乌翠区,4,230700 +230719,友好区,4,230700 +230722,嘉荫县,4,230700 +230723,汤旺县,4,230700 +230724,丰林县,4,230700 +230725,大箐山县,4,230700 +230726,南岔县,4,230700 +230751,金林区,4,230700 +230781,铁力市,4,230700 +230803,向阳区,4,230800 +230804,前进区,4,230800 +230805,东风区,4,230800 +230811,郊区,4,230800 +230822,桦南县,4,230800 +230826,桦川县,4,230800 +230828,汤原县,4,230800 +230881,同江市,4,230800 +230882,富锦市,4,230800 +230883,抚远市,4,230800 +230902,新兴区,4,230900 +230903,桃山区,4,230900 +230904,茄子河区,4,230900 +230921,勃利县,4,230900 +231002,东安区,4,231000 +231003,阳明区,4,231000 +231004,爱民区,4,231000 +231005,西安区,4,231000 +231025,林口县,4,231000 +231071,牡丹江经济技术开发区,4,231000 +231081,绥芬河市,4,231000 +231083,海林市,4,231000 +231084,宁安市,4,231000 +231085,穆棱市,4,231000 +231086,东宁市,4,231000 +231102,爱辉区,4,231100 +231123,逊克县,4,231100 +231124,孙吴县,4,231100 +231181,北安市,4,231100 +231182,五大连池市,4,231100 +231183,嫩江市,4,231100 +231202,北林区,4,231200 +231221,望奎县,4,231200 +231222,兰西县,4,231200 +231223,青冈县,4,231200 +231224,庆安县,4,231200 +231225,明水县,4,231200 +231226,绥棱县,4,231200 +231281,安达市,4,231200 +231282,肇东市,4,231200 +231283,海伦市,4,231200 +232701,漠河市,4,232700 +232721,呼玛县,4,232700 +232722,塔河县,4,232700 +232761,加格达奇区,4,232700 +232762,松岭区,4,232700 +232763,新林区,4,232700 +232764,呼中区,4,232700 +310101,黄浦区,4,310100 +310104,徐汇区,4,310100 +310105,长宁区,4,310100 +310106,静安区,4,310100 +310107,普陀区,4,310100 +310109,虹口区,4,310100 +310110,杨浦区,4,310100 +310112,闵行区,4,310100 +310113,宝山区,4,310100 +310114,嘉定区,4,310100 +310115,浦东新区,4,310100 +310116,金山区,4,310100 +310117,松江区,4,310100 +310118,青浦区,4,310100 +310120,奉贤区,4,310100 +310151,崇明区,4,310100 +320102,玄武区,4,320100 +320104,秦淮区,4,320100 +320105,建邺区,4,320100 +320106,鼓楼区,4,320100 +320111,浦口区,4,320100 +320113,栖霞区,4,320100 +320114,雨花台区,4,320100 +320115,江宁区,4,320100 +320116,六合区,4,320100 +320117,溧水区,4,320100 +320118,高淳区,4,320100 +320205,锡山区,4,320200 +320206,惠山区,4,320200 +320211,滨湖区,4,320200 +320213,梁溪区,4,320200 +320214,新吴区,4,320200 +320281,江阴市,4,320200 +320282,宜兴市,4,320200 +320302,鼓楼区,4,320300 +320303,云龙区,4,320300 +320305,贾汪区,4,320300 +320311,泉山区,4,320300 +320312,铜山区,4,320300 +320321,丰县,4,320300 +320322,沛县,4,320300 +320324,睢宁县,4,320300 +320371,徐州经济技术开发区,4,320300 +320381,新沂市,4,320300 +320382,邳州市,4,320300 +320402,天宁区,4,320400 +320404,钟楼区,4,320400 +320411,新北区,4,320400 +320412,武进区,4,320400 +320413,金坛区,4,320400 +320481,溧阳市,4,320400 +320505,虎丘区,4,320500 +320506,吴中区,4,320500 +320507,相城区,4,320500 +320508,姑苏区,4,320500 +320509,吴江区,4,320500 +320571,苏州工业园区,4,320500 +320581,常熟市,4,320500 +320582,张家港市,4,320500 +320583,昆山市,4,320500 +320585,太仓市,4,320500 +320612,通州区,4,320600 +320613,崇川区,4,320600 +320614,海门区,4,320600 +320623,如东县,4,320600 +320671,南通经济技术开发区,4,320600 +320681,启东市,4,320600 +320682,如皋市,4,320600 +320685,海安市,4,320600 +320703,连云区,4,320700 +320706,海州区,4,320700 +320707,赣榆区,4,320700 +320722,东海县,4,320700 +320723,灌云县,4,320700 +320724,灌南县,4,320700 +320771,连云港经济技术开发区,4,320700 +320772,连云港高新技术产业开发区,4,320700 +320803,淮安区,4,320800 +320804,淮阴区,4,320800 +320812,清江浦区,4,320800 +320813,洪泽区,4,320800 +320826,涟水县,4,320800 +320830,盱眙县,4,320800 +320831,金湖县,4,320800 +320871,淮安经济技术开发区,4,320800 +320902,亭湖区,4,320900 +320903,盐都区,4,320900 +320904,大丰区,4,320900 +320921,响水县,4,320900 +320922,滨海县,4,320900 +320923,阜宁县,4,320900 +320924,射阳县,4,320900 +320925,建湖县,4,320900 +320971,盐城经济技术开发区,4,320900 +320981,东台市,4,320900 +321002,广陵区,4,321000 +321003,邗江区,4,321000 +321012,江都区,4,321000 +321023,宝应县,4,321000 +321071,扬州经济技术开发区,4,321000 +321081,仪征市,4,321000 +321084,高邮市,4,321000 +321102,京口区,4,321100 +321111,润州区,4,321100 +321112,丹徒区,4,321100 +321171,镇江新区,4,321100 +321181,丹阳市,4,321100 +321182,扬中市,4,321100 +321183,句容市,4,321100 +321202,海陵区,4,321200 +321203,高港区,4,321200 +321204,姜堰区,4,321200 +321271,泰州医药高新技术产业开发区,4,321200 +321281,兴化市,4,321200 +321282,靖江市,4,321200 +321283,泰兴市,4,321200 +321302,宿城区,4,321300 +321311,宿豫区,4,321300 +321322,沭阳县,4,321300 +321323,泗阳县,4,321300 +321324,泗洪县,4,321300 +321371,宿迁经济技术开发区,4,321300 +330102,上城区,4,330100 +330105,拱墅区,4,330100 +330106,西湖区,4,330100 +330108,滨江区,4,330100 +330109,萧山区,4,330100 +330110,余杭区,4,330100 +330111,富阳区,4,330100 +330112,临安区,4,330100 +330113,临平区,4,330100 +330114,钱塘区,4,330100 +330122,桐庐县,4,330100 +330127,淳安县,4,330100 +330182,建德市,4,330100 +330203,海曙区,4,330200 +330205,江北区,4,330200 +330206,北仑区,4,330200 +330211,镇海区,4,330200 +330212,鄞州区,4,330200 +330213,奉化区,4,330200 +330225,象山县,4,330200 +330226,宁海县,4,330200 +330281,余姚市,4,330200 +330282,慈溪市,4,330200 +330302,鹿城区,4,330300 +330303,龙湾区,4,330300 +330304,瓯海区,4,330300 +330305,洞头区,4,330300 +330324,永嘉县,4,330300 +330326,平阳县,4,330300 +330327,苍南县,4,330300 +330328,文成县,4,330300 +330329,泰顺县,4,330300 +330371,温州经济技术开发区,4,330300 +330381,瑞安市,4,330300 +330382,乐清市,4,330300 +330383,龙港市,4,330300 +330402,南湖区,4,330400 +330411,秀洲区,4,330400 +330421,嘉善县,4,330400 +330424,海盐县,4,330400 +330481,海宁市,4,330400 +330482,平湖市,4,330400 +330483,桐乡市,4,330400 +330502,吴兴区,4,330500 +330503,南浔区,4,330500 +330521,德清县,4,330500 +330522,长兴县,4,330500 +330523,安吉县,4,330500 +330602,越城区,4,330600 +330603,柯桥区,4,330600 +330604,上虞区,4,330600 +330624,新昌县,4,330600 +330681,诸暨市,4,330600 +330683,嵊州市,4,330600 +330702,婺城区,4,330700 +330703,金东区,4,330700 +330723,武义县,4,330700 +330726,浦江县,4,330700 +330727,磐安县,4,330700 +330781,兰溪市,4,330700 +330782,义乌市,4,330700 +330783,东阳市,4,330700 +330784,永康市,4,330700 +330802,柯城区,4,330800 +330803,衢江区,4,330800 +330822,常山县,4,330800 +330824,开化县,4,330800 +330825,龙游县,4,330800 +330881,江山市,4,330800 +330902,定海区,4,330900 +330903,普陀区,4,330900 +330921,岱山县,4,330900 +330922,嵊泗县,4,330900 +331002,椒江区,4,331000 +331003,黄岩区,4,331000 +331004,路桥区,4,331000 +331022,三门县,4,331000 +331023,天台县,4,331000 +331024,仙居县,4,331000 +331081,温岭市,4,331000 +331082,临海市,4,331000 +331083,玉环市,4,331000 +331102,莲都区,4,331100 +331121,青田县,4,331100 +331122,缙云县,4,331100 +331123,遂昌县,4,331100 +331124,松阳县,4,331100 +331125,云和县,4,331100 +331126,庆元县,4,331100 +331127,景宁畲族自治县,4,331100 +331181,龙泉市,4,331100 +340102,瑶海区,4,340100 +340103,庐阳区,4,340100 +340104,蜀山区,4,340100 +340111,包河区,4,340100 +340121,长丰县,4,340100 +340122,肥东县,4,340100 +340123,肥西县,4,340100 +340124,庐江县,4,340100 +340171,合肥高新技术产业开发区,4,340100 +340172,合肥经济技术开发区,4,340100 +340173,合肥新站高新技术产业开发区,4,340100 +340181,巢湖市,4,340100 +340202,镜湖区,4,340200 +340207,鸠江区,4,340200 +340209,弋江区,4,340200 +340210,湾沚区,4,340200 +340212,繁昌区,4,340200 +340223,南陵县,4,340200 +340271,芜湖经济技术开发区,4,340200 +340272,安徽芜湖三山经济开发区,4,340200 +340281,无为市,4,340200 +340302,龙子湖区,4,340300 +340303,蚌山区,4,340300 +340304,禹会区,4,340300 +340311,淮上区,4,340300 +340321,怀远县,4,340300 +340322,五河县,4,340300 +340323,固镇县,4,340300 +340371,蚌埠市高新技术开发区,4,340300 +340372,蚌埠市经济开发区,4,340300 +340402,大通区,4,340400 +340403,田家庵区,4,340400 +340404,谢家集区,4,340400 +340405,八公山区,4,340400 +340406,潘集区,4,340400 +340421,凤台县,4,340400 +340422,寿县,4,340400 +340503,花山区,4,340500 +340504,雨山区,4,340500 +340506,博望区,4,340500 +340521,当涂县,4,340500 +340522,含山县,4,340500 +340523,和县,4,340500 +340602,杜集区,4,340600 +340603,相山区,4,340600 +340604,烈山区,4,340600 +340621,濉溪县,4,340600 +340705,铜官区,4,340700 +340706,义安区,4,340700 +340711,郊区,4,340700 +340722,枞阳县,4,340700 +340802,迎江区,4,340800 +340803,大观区,4,340800 +340811,宜秀区,4,340800 +340822,怀宁县,4,340800 +340825,太湖县,4,340800 +340826,宿松县,4,340800 +340827,望江县,4,340800 +340828,岳西县,4,340800 +340871,安徽安庆经济开发区,4,340800 +340881,桐城市,4,340800 +340882,潜山市,4,340800 +341002,屯溪区,4,341000 +341003,黄山区,4,341000 +341004,徽州区,4,341000 +341021,歙县,4,341000 +341022,休宁县,4,341000 +341023,黟县,4,341000 +341024,祁门县,4,341000 +341102,琅琊区,4,341100 +341103,南谯区,4,341100 +341122,来安县,4,341100 +341124,全椒县,4,341100 +341125,定远县,4,341100 +341126,凤阳县,4,341100 +341171,中新苏滁高新技术产业开发区,4,341100 +341172,滁州经济技术开发区,4,341100 +341181,天长市,4,341100 +341182,明光市,4,341100 +341202,颍州区,4,341200 +341203,颍东区,4,341200 +341204,颍泉区,4,341200 +341221,临泉县,4,341200 +341222,太和县,4,341200 +341225,阜南县,4,341200 +341226,颍上县,4,341200 +341271,阜阳合肥现代产业园区,4,341200 +341272,阜阳经济技术开发区,4,341200 +341282,界首市,4,341200 +341302,埇桥区,4,341300 +341321,砀山县,4,341300 +341322,萧县,4,341300 +341323,灵璧县,4,341300 +341324,泗县,4,341300 +341371,宿州马鞍山现代产业园区,4,341300 +341372,宿州经济技术开发区,4,341300 +341502,金安区,4,341500 +341503,裕安区,4,341500 +341504,叶集区,4,341500 +341522,霍邱县,4,341500 +341523,舒城县,4,341500 +341524,金寨县,4,341500 +341525,霍山县,4,341500 +341602,谯城区,4,341600 +341621,涡阳县,4,341600 +341622,蒙城县,4,341600 +341623,利辛县,4,341600 +341702,贵池区,4,341700 +341721,东至县,4,341700 +341722,石台县,4,341700 +341723,青阳县,4,341700 +341802,宣州区,4,341800 +341821,郎溪县,4,341800 +341823,泾县,4,341800 +341824,绩溪县,4,341800 +341825,旌德县,4,341800 +341871,宣城市经济开发区,4,341800 +341881,宁国市,4,341800 +341882,广德市,4,341800 +350102,鼓楼区,4,350100 +350103,台江区,4,350100 +350104,仓山区,4,350100 +350105,马尾区,4,350100 +350111,晋安区,4,350100 +350112,长乐区,4,350100 +350121,闽侯县,4,350100 +350122,连江县,4,350100 +350123,罗源县,4,350100 +350124,闽清县,4,350100 +350125,永泰县,4,350100 +350128,平潭县,4,350100 +350181,福清市,4,350100 +350203,思明区,4,350200 +350205,海沧区,4,350200 +350206,湖里区,4,350200 +350211,集美区,4,350200 +350212,同安区,4,350200 +350213,翔安区,4,350200 +350302,城厢区,4,350300 +350303,涵江区,4,350300 +350304,荔城区,4,350300 +350305,秀屿区,4,350300 +350322,仙游县,4,350300 +350404,三元区,4,350400 +350405,沙县区,4,350400 +350421,明溪县,4,350400 +350423,清流县,4,350400 +350424,宁化县,4,350400 +350425,大田县,4,350400 +350426,尤溪县,4,350400 +350428,将乐县,4,350400 +350429,泰宁县,4,350400 +350430,建宁县,4,350400 +350481,永安市,4,350400 +350502,鲤城区,4,350500 +350503,丰泽区,4,350500 +350504,洛江区,4,350500 +350505,泉港区,4,350500 +350521,惠安县,4,350500 +350524,安溪县,4,350500 +350525,永春县,4,350500 +350526,德化县,4,350500 +350527,金门县,4,350500 +350581,石狮市,4,350500 +350582,晋江市,4,350500 +350583,南安市,4,350500 +350602,芗城区,4,350600 +350603,龙文区,4,350600 +350604,龙海区,4,350600 +350605,长泰区,4,350600 +350622,云霄县,4,350600 +350623,漳浦县,4,350600 +350624,诏安县,4,350600 +350626,东山县,4,350600 +350627,南靖县,4,350600 +350628,平和县,4,350600 +350629,华安县,4,350600 +350702,延平区,4,350700 +350703,建阳区,4,350700 +350721,顺昌县,4,350700 +350722,浦城县,4,350700 +350723,光泽县,4,350700 +350724,松溪县,4,350700 +350725,政和县,4,350700 +350781,邵武市,4,350700 +350782,武夷山市,4,350700 +350783,建瓯市,4,350700 +350802,新罗区,4,350800 +350803,永定区,4,350800 +350821,长汀县,4,350800 +350823,上杭县,4,350800 +350824,武平县,4,350800 +350825,连城县,4,350800 +350881,漳平市,4,350800 +350902,蕉城区,4,350900 +350921,霞浦县,4,350900 +350922,古田县,4,350900 +350923,屏南县,4,350900 +350924,寿宁县,4,350900 +350925,周宁县,4,350900 +350926,柘荣县,4,350900 +350981,福安市,4,350900 +350982,福鼎市,4,350900 +360102,东湖区,4,360100 +360103,西湖区,4,360100 +360104,青云谱区,4,360100 +360111,青山湖区,4,360100 +360112,新建区,4,360100 +360113,红谷滩区,4,360100 +360121,南昌县,4,360100 +360123,安义县,4,360100 +360124,进贤县,4,360100 +360202,昌江区,4,360200 +360203,珠山区,4,360200 +360222,浮梁县,4,360200 +360281,乐平市,4,360200 +360302,安源区,4,360300 +360313,湘东区,4,360300 +360321,莲花县,4,360300 +360322,上栗县,4,360300 +360323,芦溪县,4,360300 +360402,濂溪区,4,360400 +360403,浔阳区,4,360400 +360404,柴桑区,4,360400 +360423,武宁县,4,360400 +360424,修水县,4,360400 +360425,永修县,4,360400 +360426,德安县,4,360400 +360428,都昌县,4,360400 +360429,湖口县,4,360400 +360430,彭泽县,4,360400 +360481,瑞昌市,4,360400 +360482,共青城市,4,360400 +360483,庐山市,4,360400 +360502,渝水区,4,360500 +360521,分宜县,4,360500 +360602,月湖区,4,360600 +360603,余江区,4,360600 +360681,贵溪市,4,360600 +360702,章贡区,4,360700 +360703,南康区,4,360700 +360704,赣县区,4,360700 +360722,信丰县,4,360700 +360723,大余县,4,360700 +360724,上犹县,4,360700 +360725,崇义县,4,360700 +360726,安远县,4,360700 +360728,定南县,4,360700 +360729,全南县,4,360700 +360730,宁都县,4,360700 +360731,于都县,4,360700 +360732,兴国县,4,360700 +360733,会昌县,4,360700 +360734,寻乌县,4,360700 +360735,石城县,4,360700 +360781,瑞金市,4,360700 +360783,龙南市,4,360700 +360802,吉州区,4,360800 +360803,青原区,4,360800 +360821,吉安县,4,360800 +360822,吉水县,4,360800 +360823,峡江县,4,360800 +360824,新干县,4,360800 +360825,永丰县,4,360800 +360826,泰和县,4,360800 +360827,遂川县,4,360800 +360828,万安县,4,360800 +360829,安福县,4,360800 +360830,永新县,4,360800 +360881,井冈山市,4,360800 +360902,袁州区,4,360900 +360921,奉新县,4,360900 +360922,万载县,4,360900 +360923,上高县,4,360900 +360924,宜丰县,4,360900 +360925,靖安县,4,360900 +360926,铜鼓县,4,360900 +360981,丰城市,4,360900 +360982,樟树市,4,360900 +360983,高安市,4,360900 +361002,临川区,4,361000 +361003,东乡区,4,361000 +361021,南城县,4,361000 +361022,黎川县,4,361000 +361023,南丰县,4,361000 +361024,崇仁县,4,361000 +361025,乐安县,4,361000 +361026,宜黄县,4,361000 +361027,金溪县,4,361000 +361028,资溪县,4,361000 +361030,广昌县,4,361000 +361102,信州区,4,361100 +361103,广丰区,4,361100 +361104,广信区,4,361100 +361123,玉山县,4,361100 +361124,铅山县,4,361100 +361125,横峰县,4,361100 +361126,弋阳县,4,361100 +361127,余干县,4,361100 +361128,鄱阳县,4,361100 +361129,万年县,4,361100 +361130,婺源县,4,361100 +361181,德兴市,4,361100 +370102,历下区,4,370100 +370103,市中区,4,370100 +370104,槐荫区,4,370100 +370105,天桥区,4,370100 +370112,历城区,4,370100 +370113,长清区,4,370100 +370114,章丘区,4,370100 +370115,济阳区,4,370100 +370116,莱芜区,4,370100 +370117,钢城区,4,370100 +370124,平阴县,4,370100 +370126,商河县,4,370100 +370171,济南高新技术产业开发区,4,370100 +370202,市南区,4,370200 +370203,市北区,4,370200 +370211,黄岛区,4,370200 +370212,崂山区,4,370200 +370213,李沧区,4,370200 +370214,城阳区,4,370200 +370215,即墨区,4,370200 +370271,青岛高新技术产业开发区,4,370200 +370281,胶州市,4,370200 +370283,平度市,4,370200 +370285,莱西市,4,370200 +370302,淄川区,4,370300 +370303,张店区,4,370300 +370304,博山区,4,370300 +370305,临淄区,4,370300 +370306,周村区,4,370300 +370321,桓台县,4,370300 +370322,高青县,4,370300 +370323,沂源县,4,370300 +370402,市中区,4,370400 +370403,薛城区,4,370400 +370404,峄城区,4,370400 +370405,台儿庄区,4,370400 +370406,山亭区,4,370400 +370481,滕州市,4,370400 +370502,东营区,4,370500 +370503,河口区,4,370500 +370505,垦利区,4,370500 +370522,利津县,4,370500 +370523,广饶县,4,370500 +370571,东营经济技术开发区,4,370500 +370572,东营港经济开发区,4,370500 +370602,芝罘区,4,370600 +370611,福山区,4,370600 +370612,牟平区,4,370600 +370613,莱山区,4,370600 +370614,蓬莱区,4,370600 +370671,烟台高新技术产业开发区,4,370600 +370672,烟台经济技术开发区,4,370600 +370681,龙口市,4,370600 +370682,莱阳市,4,370600 +370683,莱州市,4,370600 +370685,招远市,4,370600 +370686,栖霞市,4,370600 +370687,海阳市,4,370600 +370702,潍城区,4,370700 +370703,寒亭区,4,370700 +370704,坊子区,4,370700 +370705,奎文区,4,370700 +370724,临朐县,4,370700 +370725,昌乐县,4,370700 +370772,潍坊滨海经济技术开发区,4,370700 +370781,青州市,4,370700 +370782,诸城市,4,370700 +370783,寿光市,4,370700 +370784,安丘市,4,370700 +370785,高密市,4,370700 +370786,昌邑市,4,370700 +370811,任城区,4,370800 +370812,兖州区,4,370800 +370826,微山县,4,370800 +370827,鱼台县,4,370800 +370828,金乡县,4,370800 +370829,嘉祥县,4,370800 +370830,汶上县,4,370800 +370831,泗水县,4,370800 +370832,梁山县,4,370800 +370871,济宁高新技术产业开发区,4,370800 +370881,曲阜市,4,370800 +370883,邹城市,4,370800 +370902,泰山区,4,370900 +370911,岱岳区,4,370900 +370921,宁阳县,4,370900 +370923,东平县,4,370900 +370982,新泰市,4,370900 +370983,肥城市,4,370900 +371002,环翠区,4,371000 +371003,文登区,4,371000 +371071,威海火炬高技术产业开发区,4,371000 +371072,威海经济技术开发区,4,371000 +371073,威海临港经济技术开发区,4,371000 +371082,荣成市,4,371000 +371083,乳山市,4,371000 +371102,东港区,4,371100 +371103,岚山区,4,371100 +371121,五莲县,4,371100 +371122,莒县,4,371100 +371171,日照经济技术开发区,4,371100 +371302,兰山区,4,371300 +371311,罗庄区,4,371300 +371312,河东区,4,371300 +371321,沂南县,4,371300 +371322,郯城县,4,371300 +371323,沂水县,4,371300 +371324,兰陵县,4,371300 +371325,费县,4,371300 +371326,平邑县,4,371300 +371327,莒南县,4,371300 +371328,蒙阴县,4,371300 +371329,临沭县,4,371300 +371371,临沂高新技术产业开发区,4,371300 +371402,德城区,4,371400 +371403,陵城区,4,371400 +371422,宁津县,4,371400 +371423,庆云县,4,371400 +371424,临邑县,4,371400 +371425,齐河县,4,371400 +371426,平原县,4,371400 +371427,夏津县,4,371400 +371428,武城县,4,371400 +371471,德州经济技术开发区,4,371400 +371472,德州运河经济开发区,4,371400 +371481,乐陵市,4,371400 +371482,禹城市,4,371400 +371502,东昌府区,4,371500 +371503,茌平区,4,371500 +371521,阳谷县,4,371500 +371522,莘县,4,371500 +371524,东阿县,4,371500 +371525,冠县,4,371500 +371526,高唐县,4,371500 +371581,临清市,4,371500 +371602,滨城区,4,371600 +371603,沾化区,4,371600 +371621,惠民县,4,371600 +371622,阳信县,4,371600 +371623,无棣县,4,371600 +371625,博兴县,4,371600 +371681,邹平市,4,371600 +371702,牡丹区,4,371700 +371703,定陶区,4,371700 +371721,曹县,4,371700 +371722,单县,4,371700 +371723,成武县,4,371700 +371724,巨野县,4,371700 +371725,郓城县,4,371700 +371726,鄄城县,4,371700 +371728,东明县,4,371700 +371771,菏泽经济技术开发区,4,371700 +371772,菏泽高新技术开发区,4,371700 +410102,中原区,4,410100 +410103,二七区,4,410100 +410104,管城回族区,4,410100 +410105,金水区,4,410100 +410106,上街区,4,410100 +410108,惠济区,4,410100 +410122,中牟县,4,410100 +410171,郑州经济技术开发区,4,410100 +410172,郑州高新技术产业开发区,4,410100 +410173,郑州航空港经济综合实验区,4,410100 +410181,巩义市,4,410100 +410182,荥阳市,4,410100 +410183,新密市,4,410100 +410184,新郑市,4,410100 +410185,登封市,4,410100 +410202,龙亭区,4,410200 +410203,顺河回族区,4,410200 +410204,鼓楼区,4,410200 +410205,禹王台区,4,410200 +410212,祥符区,4,410200 +410221,杞县,4,410200 +410222,通许县,4,410200 +410223,尉氏县,4,410200 +410225,兰考县,4,410200 +410302,老城区,4,410300 +410303,西工区,4,410300 +410304,瀍河回族区,4,410300 +410305,涧西区,4,410300 +410307,偃师区,4,410300 +410308,孟津区,4,410300 +410311,洛龙区,4,410300 +410323,新安县,4,410300 +410324,栾川县,4,410300 +410325,嵩县,4,410300 +410326,汝阳县,4,410300 +410327,宜阳县,4,410300 +410328,洛宁县,4,410300 +410329,伊川县,4,410300 +410371,洛阳高新技术产业开发区,4,410300 +410402,新华区,4,410400 +410403,卫东区,4,410400 +410404,石龙区,4,410400 +410411,湛河区,4,410400 +410421,宝丰县,4,410400 +410422,叶县,4,410400 +410423,鲁山县,4,410400 +410425,郏县,4,410400 +410471,平顶山高新技术产业开发区,4,410400 +410472,平顶山市城乡一体化示范区,4,410400 +410481,舞钢市,4,410400 +410482,汝州市,4,410400 +410502,文峰区,4,410500 +410503,北关区,4,410500 +410505,殷都区,4,410500 +410506,龙安区,4,410500 +410522,安阳县,4,410500 +410523,汤阴县,4,410500 +410526,滑县,4,410500 +410527,内黄县,4,410500 +410571,安阳高新技术产业开发区,4,410500 +410581,林州市,4,410500 +410602,鹤山区,4,410600 +410603,山城区,4,410600 +410611,淇滨区,4,410600 +410621,浚县,4,410600 +410622,淇县,4,410600 +410671,鹤壁经济技术开发区,4,410600 +410702,红旗区,4,410700 +410703,卫滨区,4,410700 +410704,凤泉区,4,410700 +410711,牧野区,4,410700 +410721,新乡县,4,410700 +410724,获嘉县,4,410700 +410725,原阳县,4,410700 +410726,延津县,4,410700 +410727,封丘县,4,410700 +410771,新乡高新技术产业开发区,4,410700 +410772,新乡经济技术开发区,4,410700 +410773,新乡市平原城乡一体化示范区,4,410700 +410781,卫辉市,4,410700 +410782,辉县市,4,410700 +410783,长垣市,4,410700 +410802,解放区,4,410800 +410803,中站区,4,410800 +410804,马村区,4,410800 +410811,山阳区,4,410800 +410821,修武县,4,410800 +410822,博爱县,4,410800 +410823,武陟县,4,410800 +410825,温县,4,410800 +410871,焦作城乡一体化示范区,4,410800 +410882,沁阳市,4,410800 +410883,孟州市,4,410800 +410902,华龙区,4,410900 +410922,清丰县,4,410900 +410923,南乐县,4,410900 +410926,范县,4,410900 +410927,台前县,4,410900 +410928,濮阳县,4,410900 +410971,河南濮阳工业园区,4,410900 +410972,濮阳经济技术开发区,4,410900 +411002,魏都区,4,411000 +411003,建安区,4,411000 +411024,鄢陵县,4,411000 +411025,襄城县,4,411000 +411071,许昌经济技术开发区,4,411000 +411081,禹州市,4,411000 +411082,长葛市,4,411000 +411102,源汇区,4,411100 +411103,郾城区,4,411100 +411104,召陵区,4,411100 +411121,舞阳县,4,411100 +411122,临颍县,4,411100 +411171,漯河经济技术开发区,4,411100 +411202,湖滨区,4,411200 +411203,陕州区,4,411200 +411221,渑池县,4,411200 +411224,卢氏县,4,411200 +411271,河南三门峡经济开发区,4,411200 +411281,义马市,4,411200 +411282,灵宝市,4,411200 +411302,宛城区,4,411300 +411303,卧龙区,4,411300 +411321,南召县,4,411300 +411322,方城县,4,411300 +411323,西峡县,4,411300 +411324,镇平县,4,411300 +411325,内乡县,4,411300 +411326,淅川县,4,411300 +411327,社旗县,4,411300 +411328,唐河县,4,411300 +411329,新野县,4,411300 +411330,桐柏县,4,411300 +411371,南阳高新技术产业开发区,4,411300 +411372,南阳市城乡一体化示范区,4,411300 +411381,邓州市,4,411300 +411402,梁园区,4,411400 +411403,睢阳区,4,411400 +411421,民权县,4,411400 +411422,睢县,4,411400 +411423,宁陵县,4,411400 +411424,柘城县,4,411400 +411425,虞城县,4,411400 +411426,夏邑县,4,411400 +411471,豫东综合物流产业聚集区,4,411400 +411472,河南商丘经济开发区,4,411400 +411481,永城市,4,411400 +411502,浉河区,4,411500 +411503,平桥区,4,411500 +411521,罗山县,4,411500 +411522,光山县,4,411500 +411523,新县,4,411500 +411524,商城县,4,411500 +411525,固始县,4,411500 +411526,潢川县,4,411500 +411527,淮滨县,4,411500 +411528,息县,4,411500 +411571,信阳高新技术产业开发区,4,411500 +411602,川汇区,4,411600 +411603,淮阳区,4,411600 +411621,扶沟县,4,411600 +411622,西华县,4,411600 +411623,商水县,4,411600 +411624,沈丘县,4,411600 +411625,郸城县,4,411600 +411627,太康县,4,411600 +411628,鹿邑县,4,411600 +411671,河南周口经济开发区,4,411600 +411681,项城市,4,411600 +411702,驿城区,4,411700 +411721,西平县,4,411700 +411722,上蔡县,4,411700 +411723,平舆县,4,411700 +411724,正阳县,4,411700 +411725,确山县,4,411700 +411726,泌阳县,4,411700 +411727,汝南县,4,411700 +411728,遂平县,4,411700 +411729,新蔡县,4,411700 +411771,河南驻马店经济开发区,4,411700 +419001,济源市,4,419000 +420102,江岸区,4,420100 +420103,江汉区,4,420100 +420104,硚口区,4,420100 +420105,汉阳区,4,420100 +420106,武昌区,4,420100 +420107,青山区,4,420100 +420111,洪山区,4,420100 +420112,东西湖区,4,420100 +420113,汉南区,4,420100 +420114,蔡甸区,4,420100 +420115,江夏区,4,420100 +420116,黄陂区,4,420100 +420117,新洲区,4,420100 +420202,黄石港区,4,420200 +420203,西塞山区,4,420200 +420204,下陆区,4,420200 +420205,铁山区,4,420200 +420222,阳新县,4,420200 +420281,大冶市,4,420200 +420302,茅箭区,4,420300 +420303,张湾区,4,420300 +420304,郧阳区,4,420300 +420322,郧西县,4,420300 +420323,竹山县,4,420300 +420324,竹溪县,4,420300 +420325,房县,4,420300 +420381,丹江口市,4,420300 +420502,西陵区,4,420500 +420503,伍家岗区,4,420500 +420504,点军区,4,420500 +420505,猇亭区,4,420500 +420506,夷陵区,4,420500 +420525,远安县,4,420500 +420526,兴山县,4,420500 +420527,秭归县,4,420500 +420528,长阳土家族自治县,4,420500 +420529,五峰土家族自治县,4,420500 +420581,宜都市,4,420500 +420582,当阳市,4,420500 +420583,枝江市,4,420500 +420602,襄城区,4,420600 +420606,樊城区,4,420600 +420607,襄州区,4,420600 +420624,南漳县,4,420600 +420625,谷城县,4,420600 +420626,保康县,4,420600 +420682,老河口市,4,420600 +420683,枣阳市,4,420600 +420684,宜城市,4,420600 +420702,梁子湖区,4,420700 +420703,华容区,4,420700 +420704,鄂城区,4,420700 +420802,东宝区,4,420800 +420804,掇刀区,4,420800 +420822,沙洋县,4,420800 +420881,钟祥市,4,420800 +420882,京山市,4,420800 +420902,孝南区,4,420900 +420921,孝昌县,4,420900 +420922,大悟县,4,420900 +420923,云梦县,4,420900 +420981,应城市,4,420900 +420982,安陆市,4,420900 +420984,汉川市,4,420900 +421002,沙市区,4,421000 +421003,荆州区,4,421000 +421022,公安县,4,421000 +421024,江陵县,4,421000 +421071,荆州经济技术开发区,4,421000 +421081,石首市,4,421000 +421083,洪湖市,4,421000 +421087,松滋市,4,421000 +421088,监利市,4,421000 +421102,黄州区,4,421100 +421121,团风县,4,421100 +421122,红安县,4,421100 +421123,罗田县,4,421100 +421124,英山县,4,421100 +421125,浠水县,4,421100 +421126,蕲春县,4,421100 +421127,黄梅县,4,421100 +421171,龙感湖管理区,4,421100 +421181,麻城市,4,421100 +421182,武穴市,4,421100 +421202,咸安区,4,421200 +421221,嘉鱼县,4,421200 +421222,通城县,4,421200 +421223,崇阳县,4,421200 +421224,通山县,4,421200 +421281,赤壁市,4,421200 +421303,曾都区,4,421300 +421321,随县,4,421300 +421381,广水市,4,421300 +422801,恩施市,4,422800 +422802,利川市,4,422800 +422822,建始县,4,422800 +422823,巴东县,4,422800 +422825,宣恩县,4,422800 +422826,咸丰县,4,422800 +422827,来凤县,4,422800 +422828,鹤峰县,4,422800 +429004,仙桃市,4,429000 +429005,潜江市,4,429000 +429006,天门市,4,429000 +429021,神农架林区,4,429000 +430102,芙蓉区,4,430100 +430103,天心区,4,430100 +430104,岳麓区,4,430100 +430105,开福区,4,430100 +430111,雨花区,4,430100 +430112,望城区,4,430100 +430121,长沙县,4,430100 +430181,浏阳市,4,430100 +430182,宁乡市,4,430100 +430202,荷塘区,4,430200 +430203,芦淞区,4,430200 +430204,石峰区,4,430200 +430211,天元区,4,430200 +430212,渌口区,4,430200 +430223,攸县,4,430200 +430224,茶陵县,4,430200 +430225,炎陵县,4,430200 +430271,云龙示范区,4,430200 +430281,醴陵市,4,430200 +430302,雨湖区,4,430300 +430304,岳塘区,4,430300 +430321,湘潭县,4,430300 +430371,湖南湘潭高新技术产业园区,4,430300 +430372,湘潭昭山示范区,4,430300 +430373,湘潭九华示范区,4,430300 +430381,湘乡市,4,430300 +430382,韶山市,4,430300 +430405,珠晖区,4,430400 +430406,雁峰区,4,430400 +430407,石鼓区,4,430400 +430408,蒸湘区,4,430400 +430412,南岳区,4,430400 +430421,衡阳县,4,430400 +430422,衡南县,4,430400 +430423,衡山县,4,430400 +430424,衡东县,4,430400 +430426,祁东县,4,430400 +430471,衡阳综合保税区,4,430400 +430472,湖南衡阳高新技术产业园区,4,430400 +430473,湖南衡阳松木经济开发区,4,430400 +430481,耒阳市,4,430400 +430482,常宁市,4,430400 +430502,双清区,4,430500 +430503,大祥区,4,430500 +430511,北塔区,4,430500 +430522,新邵县,4,430500 +430523,邵阳县,4,430500 +430524,隆回县,4,430500 +430525,洞口县,4,430500 +430527,绥宁县,4,430500 +430528,新宁县,4,430500 +430529,城步苗族自治县,4,430500 +430581,武冈市,4,430500 +430582,邵东市,4,430500 +430602,岳阳楼区,4,430600 +430603,云溪区,4,430600 +430611,君山区,4,430600 +430621,岳阳县,4,430600 +430623,华容县,4,430600 +430624,湘阴县,4,430600 +430626,平江县,4,430600 +430671,岳阳市屈原管理区,4,430600 +430681,汨罗市,4,430600 +430682,临湘市,4,430600 +430702,武陵区,4,430700 +430703,鼎城区,4,430700 +430721,安乡县,4,430700 +430722,汉寿县,4,430700 +430723,澧县,4,430700 +430724,临澧县,4,430700 +430725,桃源县,4,430700 +430726,石门县,4,430700 +430771,常德市西洞庭管理区,4,430700 +430781,津市市,4,430700 +430802,永定区,4,430800 +430811,武陵源区,4,430800 +430821,慈利县,4,430800 +430822,桑植县,4,430800 +430902,资阳区,4,430900 +430903,赫山区,4,430900 +430921,南县,4,430900 +430922,桃江县,4,430900 +430923,安化县,4,430900 +430971,益阳市大通湖管理区,4,430900 +430972,湖南益阳高新技术产业园区,4,430900 +430981,沅江市,4,430900 +431002,北湖区,4,431000 +431003,苏仙区,4,431000 +431021,桂阳县,4,431000 +431022,宜章县,4,431000 +431023,永兴县,4,431000 +431024,嘉禾县,4,431000 +431025,临武县,4,431000 +431026,汝城县,4,431000 +431027,桂东县,4,431000 +431028,安仁县,4,431000 +431081,资兴市,4,431000 +431102,零陵区,4,431100 +431103,冷水滩区,4,431100 +431122,东安县,4,431100 +431123,双牌县,4,431100 +431124,道县,4,431100 +431125,江永县,4,431100 +431126,宁远县,4,431100 +431127,蓝山县,4,431100 +431128,新田县,4,431100 +431129,江华瑶族自治县,4,431100 +431171,永州经济技术开发区,4,431100 +431173,永州市回龙圩管理区,4,431100 +431181,祁阳市,4,431100 +431202,鹤城区,4,431200 +431221,中方县,4,431200 +431222,沅陵县,4,431200 +431223,辰溪县,4,431200 +431224,溆浦县,4,431200 +431225,会同县,4,431200 +431226,麻阳苗族自治县,4,431200 +431227,新晃侗族自治县,4,431200 +431228,芷江侗族自治县,4,431200 +431229,靖州苗族侗族自治县,4,431200 +431230,通道侗族自治县,4,431200 +431271,怀化市洪江管理区,4,431200 +431281,洪江市,4,431200 +431302,娄星区,4,431300 +431321,双峰县,4,431300 +431322,新化县,4,431300 +431381,冷水江市,4,431300 +431382,涟源市,4,431300 +433101,吉首市,4,433100 +433122,泸溪县,4,433100 +433123,凤凰县,4,433100 +433124,花垣县,4,433100 +433125,保靖县,4,433100 +433126,古丈县,4,433100 +433127,永顺县,4,433100 +433130,龙山县,4,433100 +440103,荔湾区,4,440100 +440104,越秀区,4,440100 +440105,海珠区,4,440100 +440106,天河区,4,440100 +440111,白云区,4,440100 +440112,黄埔区,4,440100 +440113,番禺区,4,440100 +440114,花都区,4,440100 +440115,南沙区,4,440100 +440117,从化区,4,440100 +440118,增城区,4,440100 +440203,武江区,4,440200 +440204,浈江区,4,440200 +440205,曲江区,4,440200 +440222,始兴县,4,440200 +440224,仁化县,4,440200 +440229,翁源县,4,440200 +440232,乳源瑶族自治县,4,440200 +440233,新丰县,4,440200 +440281,乐昌市,4,440200 +440282,南雄市,4,440200 +440303,罗湖区,4,440300 +440304,福田区,4,440300 +440305,南山区,4,440300 +440306,宝安区,4,440300 +440307,龙岗区,4,440300 +440308,盐田区,4,440300 +440309,龙华区,4,440300 +440310,坪山区,4,440300 +440311,光明区,4,440300 +440402,香洲区,4,440400 +440403,斗门区,4,440400 +440404,金湾区,4,440400 +440507,龙湖区,4,440500 +440511,金平区,4,440500 +440512,濠江区,4,440500 +440513,潮阳区,4,440500 +440514,潮南区,4,440500 +440515,澄海区,4,440500 +440523,南澳县,4,440500 +440604,禅城区,4,440600 +440605,南海区,4,440600 +440606,顺德区,4,440600 +440607,三水区,4,440600 +440608,高明区,4,440600 +440703,蓬江区,4,440700 +440704,江海区,4,440700 +440705,新会区,4,440700 +440781,台山市,4,440700 +440783,开平市,4,440700 +440784,鹤山市,4,440700 +440785,恩平市,4,440700 +440802,赤坎区,4,440800 +440803,霞山区,4,440800 +440804,坡头区,4,440800 +440811,麻章区,4,440800 +440823,遂溪县,4,440800 +440825,徐闻县,4,440800 +440881,廉江市,4,440800 +440882,雷州市,4,440800 +440883,吴川市,4,440800 +440902,茂南区,4,440900 +440904,电白区,4,440900 +440981,高州市,4,440900 +440982,化州市,4,440900 +440983,信宜市,4,440900 +441202,端州区,4,441200 +441203,鼎湖区,4,441200 +441204,高要区,4,441200 +441223,广宁县,4,441200 +441224,怀集县,4,441200 +441225,封开县,4,441200 +441226,德庆县,4,441200 +441284,四会市,4,441200 +441302,惠城区,4,441300 +441303,惠阳区,4,441300 +441322,博罗县,4,441300 +441323,惠东县,4,441300 +441324,龙门县,4,441300 +441402,梅江区,4,441400 +441403,梅县区,4,441400 +441422,大埔县,4,441400 +441423,丰顺县,4,441400 +441424,五华县,4,441400 +441426,平远县,4,441400 +441427,蕉岭县,4,441400 +441481,兴宁市,4,441400 +441502,城区,4,441500 +441521,海丰县,4,441500 +441523,陆河县,4,441500 +441581,陆丰市,4,441500 +441602,源城区,4,441600 +441621,紫金县,4,441600 +441622,龙川县,4,441600 +441623,连平县,4,441600 +441624,和平县,4,441600 +441625,东源县,4,441600 +441702,江城区,4,441700 +441704,阳东区,4,441700 +441721,阳西县,4,441700 +441781,阳春市,4,441700 +441802,清城区,4,441800 +441803,清新区,4,441800 +441821,佛冈县,4,441800 +441823,阳山县,4,441800 +441825,连山壮族瑶族自治县,4,441800 +441826,连南瑶族自治县,4,441800 +441881,英德市,4,441800 +441882,连州市,4,441800 +445102,湘桥区,4,445100 +445103,潮安区,4,445100 +445122,饶平县,4,445100 +445202,榕城区,4,445200 +445203,揭东区,4,445200 +445222,揭西县,4,445200 +445224,惠来县,4,445200 +445281,普宁市,4,445200 +445302,云城区,4,445300 +445303,云安区,4,445300 +445321,新兴县,4,445300 +445322,郁南县,4,445300 +445381,罗定市,4,445300 +450102,兴宁区,4,450100 +450103,青秀区,4,450100 +450105,江南区,4,450100 +450107,西乡塘区,4,450100 +450108,良庆区,4,450100 +450109,邕宁区,4,450100 +450110,武鸣区,4,450100 +450123,隆安县,4,450100 +450124,马山县,4,450100 +450125,上林县,4,450100 +450126,宾阳县,4,450100 +450181,横州市,4,450100 +450202,城中区,4,450200 +450203,鱼峰区,4,450200 +450204,柳南区,4,450200 +450205,柳北区,4,450200 +450206,柳江区,4,450200 +450222,柳城县,4,450200 +450223,鹿寨县,4,450200 +450224,融安县,4,450200 +450225,融水苗族自治县,4,450200 +450226,三江侗族自治县,4,450200 +450302,秀峰区,4,450300 +450303,叠彩区,4,450300 +450304,象山区,4,450300 +450305,七星区,4,450300 +450311,雁山区,4,450300 +450312,临桂区,4,450300 +450321,阳朔县,4,450300 +450323,灵川县,4,450300 +450324,全州县,4,450300 +450325,兴安县,4,450300 +450326,永福县,4,450300 +450327,灌阳县,4,450300 +450328,龙胜各族自治县,4,450300 +450329,资源县,4,450300 +450330,平乐县,4,450300 +450332,恭城瑶族自治县,4,450300 +450381,荔浦市,4,450300 +450403,万秀区,4,450400 +450405,长洲区,4,450400 +450406,龙圩区,4,450400 +450421,苍梧县,4,450400 +450422,藤县,4,450400 +450423,蒙山县,4,450400 +450481,岑溪市,4,450400 +450502,海城区,4,450500 +450503,银海区,4,450500 +450512,铁山港区,4,450500 +450521,合浦县,4,450500 +450602,港口区,4,450600 +450603,防城区,4,450600 +450621,上思县,4,450600 +450681,东兴市,4,450600 +450702,钦南区,4,450700 +450703,钦北区,4,450700 +450721,灵山县,4,450700 +450722,浦北县,4,450700 +450802,港北区,4,450800 +450803,港南区,4,450800 +450804,覃塘区,4,450800 +450821,平南县,4,450800 +450881,桂平市,4,450800 +450902,玉州区,4,450900 +450903,福绵区,4,450900 +450921,容县,4,450900 +450922,陆川县,4,450900 +450923,博白县,4,450900 +450924,兴业县,4,450900 +450981,北流市,4,450900 +451002,右江区,4,451000 +451003,田阳区,4,451000 +451022,田东县,4,451000 +451024,德保县,4,451000 +451026,那坡县,4,451000 +451027,凌云县,4,451000 +451028,乐业县,4,451000 +451029,田林县,4,451000 +451030,西林县,4,451000 +451031,隆林各族自治县,4,451000 +451081,靖西市,4,451000 +451082,平果市,4,451000 +451102,八步区,4,451100 +451103,平桂区,4,451100 +451121,昭平县,4,451100 +451122,钟山县,4,451100 +451123,富川瑶族自治县,4,451100 +451202,金城江区,4,451200 +451203,宜州区,4,451200 +451221,南丹县,4,451200 +451222,天峨县,4,451200 +451223,凤山县,4,451200 +451224,东兰县,4,451200 +451225,罗城仫佬族自治县,4,451200 +451226,环江毛南族自治县,4,451200 +451227,巴马瑶族自治县,4,451200 +451228,都安瑶族自治县,4,451200 +451229,大化瑶族自治县,4,451200 +451302,兴宾区,4,451300 +451321,忻城县,4,451300 +451322,象州县,4,451300 +451323,武宣县,4,451300 +451324,金秀瑶族自治县,4,451300 +451381,合山市,4,451300 +451402,江州区,4,451400 +451421,扶绥县,4,451400 +451422,宁明县,4,451400 +451423,龙州县,4,451400 +451424,大新县,4,451400 +451425,天等县,4,451400 +451481,凭祥市,4,451400 +460105,秀英区,4,460100 +460106,龙华区,4,460100 +460107,琼山区,4,460100 +460108,美兰区,4,460100 +460202,海棠区,4,460200 +460203,吉阳区,4,460200 +460204,天涯区,4,460200 +460205,崖州区,4,460200 +460321,西沙群岛,4,460300 +460322,南沙群岛,4,460300 +460323,中沙群岛的岛礁及其海域,4,460300 +469001,五指山市,4,469000 +469002,琼海市,4,469000 +469005,文昌市,4,469000 +469006,万宁市,4,469000 +469007,东方市,4,469000 +469021,定安县,4,469000 +469022,屯昌县,4,469000 +469023,澄迈县,4,469000 +469024,临高县,4,469000 +469025,白沙黎族自治县,4,469000 +469026,昌江黎族自治县,4,469000 +469027,乐东黎族自治县,4,469000 +469028,陵水黎族自治县,4,469000 +469029,保亭黎族苗族自治县,4,469000 +469030,琼中黎族苗族自治县,4,469000 +500101,万州区,4,500100 +500102,涪陵区,4,500100 +500103,渝中区,4,500100 +500104,大渡口区,4,500100 +500105,江北区,4,500100 +500106,沙坪坝区,4,500100 +500107,九龙坡区,4,500100 +500108,南岸区,4,500100 +500109,北碚区,4,500100 +500110,綦江区,4,500100 +500111,大足区,4,500100 +500112,渝北区,4,500100 +500113,巴南区,4,500100 +500114,黔江区,4,500100 +500115,长寿区,4,500100 +500116,江津区,4,500100 +500117,合川区,4,500100 +500118,永川区,4,500100 +500119,南川区,4,500100 +500120,璧山区,4,500100 +500151,铜梁区,4,500100 +500152,潼南区,4,500100 +500153,荣昌区,4,500100 +500154,开州区,4,500100 +500155,梁平区,4,500100 +500156,武隆区,4,500100 +500229,城口县,4,500100 +500230,丰都县,4,500100 +500231,垫江县,4,500100 +500233,忠县,4,500100 +500235,云阳县,4,500100 +500236,奉节县,4,500100 +500237,巫山县,4,500100 +500238,巫溪县,4,500100 +500240,石柱土家族自治县,4,500100 +500241,秀山土家族苗族自治县,4,500100 +500242,酉阳土家族苗族自治县,4,500100 +500243,彭水苗族土家族自治县,4,500100 +510104,锦江区,4,510100 +510105,青羊区,4,510100 +510106,金牛区,4,510100 +510107,武侯区,4,510100 +510108,成华区,4,510100 +510112,龙泉驿区,4,510100 +510113,青白江区,4,510100 +510114,新都区,4,510100 +510115,温江区,4,510100 +510116,双流区,4,510100 +510117,郫都区,4,510100 +510118,新津区,4,510100 +510121,金堂县,4,510100 +510129,大邑县,4,510100 +510131,蒲江县,4,510100 +510181,都江堰市,4,510100 +510182,彭州市,4,510100 +510183,邛崃市,4,510100 +510184,崇州市,4,510100 +510185,简阳市,4,510100 +510302,自流井区,4,510300 +510303,贡井区,4,510300 +510304,大安区,4,510300 +510311,沿滩区,4,510300 +510321,荣县,4,510300 +510322,富顺县,4,510300 +510402,东区,4,510400 +510403,西区,4,510400 +510411,仁和区,4,510400 +510421,米易县,4,510400 +510422,盐边县,4,510400 +510502,江阳区,4,510500 +510503,纳溪区,4,510500 +510504,龙马潭区,4,510500 +510521,泸县,4,510500 +510522,合江县,4,510500 +510524,叙永县,4,510500 +510525,古蔺县,4,510500 +510603,旌阳区,4,510600 +510604,罗江区,4,510600 +510623,中江县,4,510600 +510681,广汉市,4,510600 +510682,什邡市,4,510600 +510683,绵竹市,4,510600 +510703,涪城区,4,510700 +510704,游仙区,4,510700 +510705,安州区,4,510700 +510722,三台县,4,510700 +510723,盐亭县,4,510700 +510725,梓潼县,4,510700 +510726,北川羌族自治县,4,510700 +510727,平武县,4,510700 +510781,江油市,4,510700 +510802,利州区,4,510800 +510811,昭化区,4,510800 +510812,朝天区,4,510800 +510821,旺苍县,4,510800 +510822,青川县,4,510800 +510823,剑阁县,4,510800 +510824,苍溪县,4,510800 +510903,船山区,4,510900 +510904,安居区,4,510900 +510921,蓬溪县,4,510900 +510923,大英县,4,510900 +510981,射洪市,4,510900 +511002,市中区,4,511000 +511011,东兴区,4,511000 +511024,威远县,4,511000 +511025,资中县,4,511000 +511071,内江经济开发区,4,511000 +511083,隆昌市,4,511000 +511102,市中区,4,511100 +511111,沙湾区,4,511100 +511112,五通桥区,4,511100 +511113,金口河区,4,511100 +511123,犍为县,4,511100 +511124,井研县,4,511100 +511126,夹江县,4,511100 +511129,沐川县,4,511100 +511132,峨边彝族自治县,4,511100 +511133,马边彝族自治县,4,511100 +511181,峨眉山市,4,511100 +511302,顺庆区,4,511300 +511303,高坪区,4,511300 +511304,嘉陵区,4,511300 +511321,南部县,4,511300 +511322,营山县,4,511300 +511323,蓬安县,4,511300 +511324,仪陇县,4,511300 +511325,西充县,4,511300 +511381,阆中市,4,511300 +511402,东坡区,4,511400 +511403,彭山区,4,511400 +511421,仁寿县,4,511400 +511423,洪雅县,4,511400 +511424,丹棱县,4,511400 +511425,青神县,4,511400 +511502,翠屏区,4,511500 +511503,南溪区,4,511500 +511504,叙州区,4,511500 +511523,江安县,4,511500 +511524,长宁县,4,511500 +511525,高县,4,511500 +511526,珙县,4,511500 +511527,筠连县,4,511500 +511528,兴文县,4,511500 +511529,屏山县,4,511500 +511602,广安区,4,511600 +511603,前锋区,4,511600 +511621,岳池县,4,511600 +511622,武胜县,4,511600 +511623,邻水县,4,511600 +511681,华蓥市,4,511600 +511702,通川区,4,511700 +511703,达川区,4,511700 +511722,宣汉县,4,511700 +511723,开江县,4,511700 +511724,大竹县,4,511700 +511725,渠县,4,511700 +511771,达州经济开发区,4,511700 +511781,万源市,4,511700 +511802,雨城区,4,511800 +511803,名山区,4,511800 +511822,荥经县,4,511800 +511823,汉源县,4,511800 +511824,石棉县,4,511800 +511825,天全县,4,511800 +511826,芦山县,4,511800 +511827,宝兴县,4,511800 +511902,巴州区,4,511900 +511903,恩阳区,4,511900 +511921,通江县,4,511900 +511922,南江县,4,511900 +511923,平昌县,4,511900 +511971,巴中经济开发区,4,511900 +512002,雁江区,4,512000 +512021,安岳县,4,512000 +512022,乐至县,4,512000 +513201,马尔康市,4,513200 +513221,汶川县,4,513200 +513222,理县,4,513200 +513223,茂县,4,513200 +513224,松潘县,4,513200 +513225,九寨沟县,4,513200 +513226,金川县,4,513200 +513227,小金县,4,513200 +513228,黑水县,4,513200 +513230,壤塘县,4,513200 +513231,阿坝县,4,513200 +513232,若尔盖县,4,513200 +513233,红原县,4,513200 +513301,康定市,4,513300 +513322,泸定县,4,513300 +513323,丹巴县,4,513300 +513324,九龙县,4,513300 +513325,雅江县,4,513300 +513326,道孚县,4,513300 +513327,炉霍县,4,513300 +513328,甘孜县,4,513300 +513329,新龙县,4,513300 +513330,德格县,4,513300 +513331,白玉县,4,513300 +513332,石渠县,4,513300 +513333,色达县,4,513300 +513334,理塘县,4,513300 +513335,巴塘县,4,513300 +513336,乡城县,4,513300 +513337,稻城县,4,513300 +513338,得荣县,4,513300 +513401,西昌市,4,513400 +513402,会理市,4,513400 +513422,木里藏族自治县,4,513400 +513423,盐源县,4,513400 +513424,德昌县,4,513400 +513426,会东县,4,513400 +513427,宁南县,4,513400 +513428,普格县,4,513400 +513429,布拖县,4,513400 +513430,金阳县,4,513400 +513431,昭觉县,4,513400 +513432,喜德县,4,513400 +513433,冕宁县,4,513400 +513434,越西县,4,513400 +513435,甘洛县,4,513400 +513436,美姑县,4,513400 +513437,雷波县,4,513400 +520102,南明区,4,520100 +520103,云岩区,4,520100 +520111,花溪区,4,520100 +520112,乌当区,4,520100 +520113,白云区,4,520100 +520115,观山湖区,4,520100 +520121,开阳县,4,520100 +520122,息烽县,4,520100 +520123,修文县,4,520100 +520181,清镇市,4,520100 +520201,钟山区,4,520200 +520203,六枝特区,4,520200 +520204,水城区,4,520200 +520281,盘州市,4,520200 +520302,红花岗区,4,520300 +520303,汇川区,4,520300 +520304,播州区,4,520300 +520322,桐梓县,4,520300 +520323,绥阳县,4,520300 +520324,正安县,4,520300 +520325,道真仡佬族苗族自治县,4,520300 +520326,务川仡佬族苗族自治县,4,520300 +520327,凤冈县,4,520300 +520328,湄潭县,4,520300 +520329,余庆县,4,520300 +520330,习水县,4,520300 +520381,赤水市,4,520300 +520382,仁怀市,4,520300 +520402,西秀区,4,520400 +520403,平坝区,4,520400 +520422,普定县,4,520400 +520423,镇宁布依族苗族自治县,4,520400 +520424,关岭布依族苗族自治县,4,520400 +520425,紫云苗族布依族自治县,4,520400 +520502,七星关区,4,520500 +520521,大方县,4,520500 +520523,金沙县,4,520500 +520524,织金县,4,520500 +520525,纳雍县,4,520500 +520526,威宁彝族回族苗族自治县,4,520500 +520527,赫章县,4,520500 +520581,黔西市,4,520500 +520602,碧江区,4,520600 +520603,万山区,4,520600 +520621,江口县,4,520600 +520622,玉屏侗族自治县,4,520600 +520623,石阡县,4,520600 +520624,思南县,4,520600 +520625,印江土家族苗族自治县,4,520600 +520626,德江县,4,520600 +520627,沿河土家族自治县,4,520600 +520628,松桃苗族自治县,4,520600 +522301,兴义市,4,522300 +522302,兴仁市,4,522300 +522323,普安县,4,522300 +522324,晴隆县,4,522300 +522325,贞丰县,4,522300 +522326,望谟县,4,522300 +522327,册亨县,4,522300 +522328,安龙县,4,522300 +522601,凯里市,4,522600 +522622,黄平县,4,522600 +522623,施秉县,4,522600 +522624,三穗县,4,522600 +522625,镇远县,4,522600 +522626,岑巩县,4,522600 +522627,天柱县,4,522600 +522628,锦屏县,4,522600 +522629,剑河县,4,522600 +522630,台江县,4,522600 +522631,黎平县,4,522600 +522632,榕江县,4,522600 +522633,从江县,4,522600 +522634,雷山县,4,522600 +522635,麻江县,4,522600 +522636,丹寨县,4,522600 +522701,都匀市,4,522700 +522702,福泉市,4,522700 +522722,荔波县,4,522700 +522723,贵定县,4,522700 +522725,瓮安县,4,522700 +522726,独山县,4,522700 +522727,平塘县,4,522700 +522728,罗甸县,4,522700 +522729,长顺县,4,522700 +522730,龙里县,4,522700 +522731,惠水县,4,522700 +522732,三都水族自治县,4,522700 +530102,五华区,4,530100 +530103,盘龙区,4,530100 +530111,官渡区,4,530100 +530112,西山区,4,530100 +530113,东川区,4,530100 +530114,呈贡区,4,530100 +530115,晋宁区,4,530100 +530124,富民县,4,530100 +530125,宜良县,4,530100 +530126,石林彝族自治县,4,530100 +530127,嵩明县,4,530100 +530128,禄劝彝族苗族自治县,4,530100 +530129,寻甸回族彝族自治县,4,530100 +530181,安宁市,4,530100 +530302,麒麟区,4,530300 +530303,沾益区,4,530300 +530304,马龙区,4,530300 +530322,陆良县,4,530300 +530323,师宗县,4,530300 +530324,罗平县,4,530300 +530325,富源县,4,530300 +530326,会泽县,4,530300 +530381,宣威市,4,530300 +530402,红塔区,4,530400 +530403,江川区,4,530400 +530423,通海县,4,530400 +530424,华宁县,4,530400 +530425,易门县,4,530400 +530426,峨山彝族自治县,4,530400 +530427,新平彝族傣族自治县,4,530400 +530428,元江哈尼族彝族傣族自治县,4,530400 +530481,澄江市,4,530400 +530502,隆阳区,4,530500 +530521,施甸县,4,530500 +530523,龙陵县,4,530500 +530524,昌宁县,4,530500 +530581,腾冲市,4,530500 +530602,昭阳区,4,530600 +530621,鲁甸县,4,530600 +530622,巧家县,4,530600 +530623,盐津县,4,530600 +530624,大关县,4,530600 +530625,永善县,4,530600 +530626,绥江县,4,530600 +530627,镇雄县,4,530600 +530628,彝良县,4,530600 +530629,威信县,4,530600 +530681,水富市,4,530600 +530702,古城区,4,530700 +530721,玉龙纳西族自治县,4,530700 +530722,永胜县,4,530700 +530723,华坪县,4,530700 +530724,宁蒗彝族自治县,4,530700 +530802,思茅区,4,530800 +530821,宁洱哈尼族彝族自治县,4,530800 +530822,墨江哈尼族自治县,4,530800 +530823,景东彝族自治县,4,530800 +530824,景谷傣族彝族自治县,4,530800 +530825,镇沅彝族哈尼族拉祜族自治县,4,530800 +530826,江城哈尼族彝族自治县,4,530800 +530827,孟连傣族拉祜族佤族自治县,4,530800 +530828,澜沧拉祜族自治县,4,530800 +530829,西盟佤族自治县,4,530800 +530902,临翔区,4,530900 +530921,凤庆县,4,530900 +530922,云县,4,530900 +530923,永德县,4,530900 +530924,镇康县,4,530900 +530925,双江拉祜族佤族布朗族傣族自治县,4,530900 +530926,耿马傣族佤族自治县,4,530900 +530927,沧源佤族自治县,4,530900 +532301,楚雄市,4,532300 +532302,禄丰市,4,532300 +532322,双柏县,4,532300 +532323,牟定县,4,532300 +532324,南华县,4,532300 +532325,姚安县,4,532300 +532326,大姚县,4,532300 +532327,永仁县,4,532300 +532328,元谋县,4,532300 +532329,武定县,4,532300 +532501,个旧市,4,532500 +532502,开远市,4,532500 +532503,蒙自市,4,532500 +532504,弥勒市,4,532500 +532523,屏边苗族自治县,4,532500 +532524,建水县,4,532500 +532525,石屏县,4,532500 +532527,泸西县,4,532500 +532528,元阳县,4,532500 +532529,红河县,4,532500 +532530,金平苗族瑶族傣族自治县,4,532500 +532531,绿春县,4,532500 +532532,河口瑶族自治县,4,532500 +532601,文山市,4,532600 +532622,砚山县,4,532600 +532623,西畴县,4,532600 +532624,麻栗坡县,4,532600 +532625,马关县,4,532600 +532626,丘北县,4,532600 +532627,广南县,4,532600 +532628,富宁县,4,532600 +532801,景洪市,4,532800 +532822,勐海县,4,532800 +532823,勐腊县,4,532800 +532901,大理市,4,532900 +532922,漾濞彝族自治县,4,532900 +532923,祥云县,4,532900 +532924,宾川县,4,532900 +532925,弥渡县,4,532900 +532926,南涧彝族自治县,4,532900 +532927,巍山彝族回族自治县,4,532900 +532928,永平县,4,532900 +532929,云龙县,4,532900 +532930,洱源县,4,532900 +532931,剑川县,4,532900 +532932,鹤庆县,4,532900 +533102,瑞丽市,4,533100 +533103,芒市,4,533100 +533122,梁河县,4,533100 +533123,盈江县,4,533100 +533124,陇川县,4,533100 +533301,泸水市,4,533300 +533323,福贡县,4,533300 +533324,贡山独龙族怒族自治县,4,533300 +533325,兰坪白族普米族自治县,4,533300 +533401,香格里拉市,4,533400 +533422,德钦县,4,533400 +533423,维西傈僳族自治县,4,533400 +540102,城关区,4,540100 +540103,堆龙德庆区,4,540100 +540104,达孜区,4,540100 +540121,林周县,4,540100 +540122,当雄县,4,540100 +540123,尼木县,4,540100 +540124,曲水县,4,540100 +540127,墨竹工卡县,4,540100 +540171,格尔木藏青工业园区,4,540100 +540172,拉萨经济技术开发区,4,540100 +540173,西藏文化旅游创意园区,4,540100 +540174,达孜工业园区,4,540100 +540202,桑珠孜区,4,540200 +540221,南木林县,4,540200 +540222,江孜县,4,540200 +540223,定日县,4,540200 +540224,萨迦县,4,540200 +540225,拉孜县,4,540200 +540226,昂仁县,4,540200 +540227,谢通门县,4,540200 +540228,白朗县,4,540200 +540229,仁布县,4,540200 +540230,康马县,4,540200 +540231,定结县,4,540200 +540232,仲巴县,4,540200 +540233,亚东县,4,540200 +540234,吉隆县,4,540200 +540235,聂拉木县,4,540200 +540236,萨嘎县,4,540200 +540237,岗巴县,4,540200 +540302,卡若区,4,540300 +540321,江达县,4,540300 +540322,贡觉县,4,540300 +540323,类乌齐县,4,540300 +540324,丁青县,4,540300 +540325,察雅县,4,540300 +540326,八宿县,4,540300 +540327,左贡县,4,540300 +540328,芒康县,4,540300 +540329,洛隆县,4,540300 +540330,边坝县,4,540300 +540402,巴宜区,4,540400 +540421,工布江达县,4,540400 +540422,米林县,4,540400 +540423,墨脱县,4,540400 +540424,波密县,4,540400 +540425,察隅县,4,540400 +540426,朗县,4,540400 +540502,乃东区,4,540500 +540521,扎囊县,4,540500 +540522,贡嘎县,4,540500 +540523,桑日县,4,540500 +540524,琼结县,4,540500 +540525,曲松县,4,540500 +540526,措美县,4,540500 +540527,洛扎县,4,540500 +540528,加查县,4,540500 +540529,隆子县,4,540500 +540530,错那县,4,540500 +540531,浪卡子县,4,540500 +540602,色尼区,4,540600 +540621,嘉黎县,4,540600 +540622,比如县,4,540600 +540623,聂荣县,4,540600 +540624,安多县,4,540600 +540625,申扎县,4,540600 +540626,索县,4,540600 +540627,班戈县,4,540600 +540628,巴青县,4,540600 +540629,尼玛县,4,540600 +540630,双湖县,4,540600 +542521,普兰县,4,542500 +542522,札达县,4,542500 +542523,噶尔县,4,542500 +542524,日土县,4,542500 +542525,革吉县,4,542500 +542526,改则县,4,542500 +542527,措勤县,4,542500 +610102,新城区,4,610100 +610103,碑林区,4,610100 +610104,莲湖区,4,610100 +610111,灞桥区,4,610100 +610112,未央区,4,610100 +610113,雁塔区,4,610100 +610114,阎良区,4,610100 +610115,临潼区,4,610100 +610116,长安区,4,610100 +610117,高陵区,4,610100 +610118,鄠邑区,4,610100 +610122,蓝田县,4,610100 +610124,周至县,4,610100 +610202,王益区,4,610200 +610203,印台区,4,610200 +610204,耀州区,4,610200 +610222,宜君县,4,610200 +610302,渭滨区,4,610300 +610303,金台区,4,610300 +610304,陈仓区,4,610300 +610305,凤翔区,4,610300 +610323,岐山县,4,610300 +610324,扶风县,4,610300 +610326,眉县,4,610300 +610327,陇县,4,610300 +610328,千阳县,4,610300 +610329,麟游县,4,610300 +610330,凤县,4,610300 +610331,太白县,4,610300 +610402,秦都区,4,610400 +610403,杨陵区,4,610400 +610404,渭城区,4,610400 +610422,三原县,4,610400 +610423,泾阳县,4,610400 +610424,乾县,4,610400 +610425,礼泉县,4,610400 +610426,永寿县,4,610400 +610428,长武县,4,610400 +610429,旬邑县,4,610400 +610430,淳化县,4,610400 +610431,武功县,4,610400 +610481,兴平市,4,610400 +610482,彬州市,4,610400 +610502,临渭区,4,610500 +610503,华州区,4,610500 +610522,潼关县,4,610500 +610523,大荔县,4,610500 +610524,合阳县,4,610500 +610525,澄城县,4,610500 +610526,蒲城县,4,610500 +610527,白水县,4,610500 +610528,富平县,4,610500 +610581,韩城市,4,610500 +610582,华阴市,4,610500 +610602,宝塔区,4,610600 +610603,安塞区,4,610600 +610621,延长县,4,610600 +610622,延川县,4,610600 +610625,志丹县,4,610600 +610626,吴起县,4,610600 +610627,甘泉县,4,610600 +610628,富县,4,610600 +610629,洛川县,4,610600 +610630,宜川县,4,610600 +610631,黄龙县,4,610600 +610632,黄陵县,4,610600 +610681,子长市,4,610600 +610702,汉台区,4,610700 +610703,南郑区,4,610700 +610722,城固县,4,610700 +610723,洋县,4,610700 +610724,西乡县,4,610700 +610725,勉县,4,610700 +610726,宁强县,4,610700 +610727,略阳县,4,610700 +610728,镇巴县,4,610700 +610729,留坝县,4,610700 +610730,佛坪县,4,610700 +610802,榆阳区,4,610800 +610803,横山区,4,610800 +610822,府谷县,4,610800 +610824,靖边县,4,610800 +610825,定边县,4,610800 +610826,绥德县,4,610800 +610827,米脂县,4,610800 +610828,佳县,4,610800 +610829,吴堡县,4,610800 +610830,清涧县,4,610800 +610831,子洲县,4,610800 +610881,神木市,4,610800 +610902,汉滨区,4,610900 +610921,汉阴县,4,610900 +610922,石泉县,4,610900 +610923,宁陕县,4,610900 +610924,紫阳县,4,610900 +610925,岚皋县,4,610900 +610926,平利县,4,610900 +610927,镇坪县,4,610900 +610929,白河县,4,610900 +610981,旬阳市,4,610900 +611002,商州区,4,611000 +611021,洛南县,4,611000 +611022,丹凤县,4,611000 +611023,商南县,4,611000 +611024,山阳县,4,611000 +611025,镇安县,4,611000 +611026,柞水县,4,611000 +620102,城关区,4,620100 +620103,七里河区,4,620100 +620104,西固区,4,620100 +620105,安宁区,4,620100 +620111,红古区,4,620100 +620121,永登县,4,620100 +620122,皋兰县,4,620100 +620123,榆中县,4,620100 +620171,兰州新区,4,620100 +620201,嘉峪关市,4,620200 +620302,金川区,4,620300 +620321,永昌县,4,620300 +620402,白银区,4,620400 +620403,平川区,4,620400 +620421,靖远县,4,620400 +620422,会宁县,4,620400 +620423,景泰县,4,620400 +620502,秦州区,4,620500 +620503,麦积区,4,620500 +620521,清水县,4,620500 +620522,秦安县,4,620500 +620523,甘谷县,4,620500 +620524,武山县,4,620500 +620525,张家川回族自治县,4,620500 +620602,凉州区,4,620600 +620621,民勤县,4,620600 +620622,古浪县,4,620600 +620623,天祝藏族自治县,4,620600 +620702,甘州区,4,620700 +620721,肃南裕固族自治县,4,620700 +620722,民乐县,4,620700 +620723,临泽县,4,620700 +620724,高台县,4,620700 +620725,山丹县,4,620700 +620802,崆峒区,4,620800 +620821,泾川县,4,620800 +620822,灵台县,4,620800 +620823,崇信县,4,620800 +620825,庄浪县,4,620800 +620826,静宁县,4,620800 +620881,华亭市,4,620800 +620902,肃州区,4,620900 +620921,金塔县,4,620900 +620922,瓜州县,4,620900 +620923,肃北蒙古族自治县,4,620900 +620924,阿克塞哈萨克族自治县,4,620900 +620981,玉门市,4,620900 +620982,敦煌市,4,620900 +621002,西峰区,4,621000 +621021,庆城县,4,621000 +621022,环县,4,621000 +621023,华池县,4,621000 +621024,合水县,4,621000 +621025,正宁县,4,621000 +621026,宁县,4,621000 +621027,镇原县,4,621000 +621102,安定区,4,621100 +621121,通渭县,4,621100 +621122,陇西县,4,621100 +621123,渭源县,4,621100 +621124,临洮县,4,621100 +621125,漳县,4,621100 +621126,岷县,4,621100 +621202,武都区,4,621200 +621221,成县,4,621200 +621222,文县,4,621200 +621223,宕昌县,4,621200 +621224,康县,4,621200 +621225,西和县,4,621200 +621226,礼县,4,621200 +621227,徽县,4,621200 +621228,两当县,4,621200 +622901,临夏市,4,622900 +622921,临夏县,4,622900 +622922,康乐县,4,622900 +622923,永靖县,4,622900 +622924,广河县,4,622900 +622925,和政县,4,622900 +622926,东乡族自治县,4,622900 +622927,积石山保安族东乡族撒拉族自治县,4,622900 +623001,合作市,4,623000 +623021,临潭县,4,623000 +623022,卓尼县,4,623000 +623023,舟曲县,4,623000 +623024,迭部县,4,623000 +623025,玛曲县,4,623000 +623026,碌曲县,4,623000 +623027,夏河县,4,623000 +630102,城东区,4,630100 +630103,城中区,4,630100 +630104,城西区,4,630100 +630105,城北区,4,630100 +630106,湟中区,4,630100 +630121,大通回族土族自治县,4,630100 +630123,湟源县,4,630100 +630202,乐都区,4,630200 +630203,平安区,4,630200 +630222,民和回族土族自治县,4,630200 +630223,互助土族自治县,4,630200 +630224,化隆回族自治县,4,630200 +630225,循化撒拉族自治县,4,630200 +632221,门源回族自治县,4,632200 +632222,祁连县,4,632200 +632223,海晏县,4,632200 +632224,刚察县,4,632200 +632301,同仁市,4,632300 +632322,尖扎县,4,632300 +632323,泽库县,4,632300 +632324,河南蒙古族自治县,4,632300 +632521,共和县,4,632500 +632522,同德县,4,632500 +632523,贵德县,4,632500 +632524,兴海县,4,632500 +632525,贵南县,4,632500 +632621,玛沁县,4,632600 +632622,班玛县,4,632600 +632623,甘德县,4,632600 +632624,达日县,4,632600 +632625,久治县,4,632600 +632626,玛多县,4,632600 +632701,玉树市,4,632700 +632722,杂多县,4,632700 +632723,称多县,4,632700 +632724,治多县,4,632700 +632725,囊谦县,4,632700 +632726,曲麻莱县,4,632700 +632801,格尔木市,4,632800 +632802,德令哈市,4,632800 +632803,茫崖市,4,632800 +632821,乌兰县,4,632800 +632822,都兰县,4,632800 +632823,天峻县,4,632800 +632857,大柴旦行政委员会,4,632800 +640104,兴庆区,4,640100 +640105,西夏区,4,640100 +640106,金凤区,4,640100 +640121,永宁县,4,640100 +640122,贺兰县,4,640100 +640181,灵武市,4,640100 +640202,大武口区,4,640200 +640205,惠农区,4,640200 +640221,平罗县,4,640200 +640302,利通区,4,640300 +640303,红寺堡区,4,640300 +640323,盐池县,4,640300 +640324,同心县,4,640300 +640381,青铜峡市,4,640300 +640402,原州区,4,640400 +640422,西吉县,4,640400 +640423,隆德县,4,640400 +640424,泾源县,4,640400 +640425,彭阳县,4,640400 +640502,沙坡头区,4,640500 +640521,中宁县,4,640500 +640522,海原县,4,640500 +650102,天山区,4,650100 +650103,沙依巴克区,4,650100 +650104,新市区,4,650100 +650105,水磨沟区,4,650100 +650106,头屯河区,4,650100 +650107,达坂城区,4,650100 +650109,米东区,4,650100 +650121,乌鲁木齐县,4,650100 +650202,独山子区,4,650200 +650203,克拉玛依区,4,650200 +650204,白碱滩区,4,650200 +650205,乌尔禾区,4,650200 +650402,高昌区,4,650400 +650421,鄯善县,4,650400 +650422,托克逊县,4,650400 +650502,伊州区,4,650500 +650521,巴里坤哈萨克自治县,4,650500 +650522,伊吾县,4,650500 +652301,昌吉市,4,652300 +652302,阜康市,4,652300 +652323,呼图壁县,4,652300 +652324,玛纳斯县,4,652300 +652325,奇台县,4,652300 +652327,吉木萨尔县,4,652300 +652328,木垒哈萨克自治县,4,652300 +652701,博乐市,4,652700 +652702,阿拉山口市,4,652700 +652722,精河县,4,652700 +652723,温泉县,4,652700 +652801,库尔勒市,4,652800 +652822,轮台县,4,652800 +652823,尉犁县,4,652800 +652824,若羌县,4,652800 +652825,且末县,4,652800 +652826,焉耆回族自治县,4,652800 +652827,和静县,4,652800 +652828,和硕县,4,652800 +652829,博湖县,4,652800 +652871,库尔勒经济技术开发区,4,652800 +652901,阿克苏市,4,652900 +652902,库车市,4,652900 +652922,温宿县,4,652900 +652924,沙雅县,4,652900 +652925,新和县,4,652900 +652926,拜城县,4,652900 +652927,乌什县,4,652900 +652928,阿瓦提县,4,652900 +652929,柯坪县,4,652900 +653001,阿图什市,4,653000 +653022,阿克陶县,4,653000 +653023,阿合奇县,4,653000 +653024,乌恰县,4,653000 +653101,喀什市,4,653100 +653121,疏附县,4,653100 +653122,疏勒县,4,653100 +653123,英吉沙县,4,653100 +653124,泽普县,4,653100 +653125,莎车县,4,653100 +653126,叶城县,4,653100 +653127,麦盖提县,4,653100 +653128,岳普湖县,4,653100 +653129,伽师县,4,653100 +653130,巴楚县,4,653100 +653131,塔什库尔干塔吉克自治县,4,653100 +653201,和田市,4,653200 +653221,和田县,4,653200 +653222,墨玉县,4,653200 +653223,皮山县,4,653200 +653224,洛浦县,4,653200 +653225,策勒县,4,653200 +653226,于田县,4,653200 +653227,民丰县,4,653200 +654002,伊宁市,4,654000 +654003,奎屯市,4,654000 +654004,霍尔果斯市,4,654000 +654021,伊宁县,4,654000 +654022,察布查尔锡伯自治县,4,654000 +654023,霍城县,4,654000 +654024,巩留县,4,654000 +654025,新源县,4,654000 +654026,昭苏县,4,654000 +654027,特克斯县,4,654000 +654028,尼勒克县,4,654000 +654201,塔城市,4,654200 +654202,乌苏市,4,654200 +654203,沙湾市,4,654200 +654221,额敏县,4,654200 +654224,托里县,4,654200 +654225,裕民县,4,654200 +654226,和布克赛尔蒙古自治县,4,654200 +654301,阿勒泰市,4,654300 +654321,布尔津县,4,654300 +654322,富蕴县,4,654300 +654323,福海县,4,654300 +654324,哈巴河县,4,654300 +654325,青河县,4,654300 +654326,吉木乃县,4,654300 +659001,石河子市,4,659000 +659002,阿拉尔市,4,659000 +659003,图木舒克市,4,659000 +659004,五家渠市,4,659000 +659005,北屯市,4,659000 +659006,铁门关市,4,659000 +659007,双河市,4,659000 +659008,可克达拉市,4,659000 +659009,昆玉市,4,659000 +659010,胡杨河市,4,659000 +659011,新星市,4,659000 diff --git a/win-framework/win-spring-boot-starter-biz-ip/src/main/resources/ip2region.xdb b/win-framework/win-spring-boot-starter-biz-ip/src/main/resources/ip2region.xdb new file mode 100644 index 0000000..2552273 Binary files /dev/null and b/win-framework/win-spring-boot-starter-biz-ip/src/main/resources/ip2region.xdb differ diff --git a/win-framework/win-spring-boot-starter-biz-operatelog/pom.xml b/win-framework/win-spring-boot-starter-biz-operatelog/pom.xml new file mode 100644 index 0000000..e8d23ee --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-operatelog/pom.xml @@ -0,0 +1,51 @@ + + + + com.win + win-framework + ${revision} + + 4.0.0 + win-spring-boot-starter-biz-operatelog + jar + + ${project.artifactId} + 操作日志 + https://github.com/YunaiV/ruoyi-vue-pro + + + + com.win + win-common + + + + + org.springframework.boot + spring-boot-starter-aop + + + + + com.win + win-spring-boot-starter-web + provided + + + + + com.win + win-module-system-api + ${revision} + + + + + com.google.guava + guava + + + + diff --git a/win-framework/win-spring-boot-starter-biz-operatelog/src/main/java/com/win/framework/operatelog/config/WinOperateLogAutoConfiguration.java b/win-framework/win-spring-boot-starter-biz-operatelog/src/main/java/com/win/framework/operatelog/config/WinOperateLogAutoConfiguration.java new file mode 100644 index 0000000..38d496d --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-operatelog/src/main/java/com/win/framework/operatelog/config/WinOperateLogAutoConfiguration.java @@ -0,0 +1,23 @@ +package com.win.framework.operatelog.config; + +import com.win.framework.operatelog.core.aop.OperateLogAspect; +import com.win.framework.operatelog.core.service.OperateLogFrameworkService; +import com.win.framework.operatelog.core.service.OperateLogFrameworkServiceImpl; +import com.win.module.system.api.logger.OperateLogApi; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.context.annotation.Bean; + +@AutoConfiguration +public class WinOperateLogAutoConfiguration { + + @Bean + public OperateLogAspect operateLogAspect() { + return new OperateLogAspect(); + } + + @Bean + public OperateLogFrameworkService operateLogFrameworkService(OperateLogApi operateLogApi) { + return new OperateLogFrameworkServiceImpl(operateLogApi); + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-operatelog/src/main/java/com/win/framework/operatelog/core/annotations/OperateLog.java b/win-framework/win-spring-boot-starter-biz-operatelog/src/main/java/com/win/framework/operatelog/core/annotations/OperateLog.java new file mode 100644 index 0000000..de92478 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-operatelog/src/main/java/com/win/framework/operatelog/core/annotations/OperateLog.java @@ -0,0 +1,57 @@ +package com.win.framework.operatelog.core.annotations; + +import com.win.framework.operatelog.core.enums.OperateTypeEnum; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 操作日志注解 + * + * @author 闻荫源码 + */ +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface OperateLog { + + // ========== 模块字段 ========== + + /** + * 操作模块 + * + * 为空时,会尝试读取 {@link Tag#name()} 属性 + */ + String module() default ""; + /** + * 操作名 + * + * 为空时,会尝试读取 {@link Operation#summary()} 属性 + */ + String name() default ""; + /** + * 操作分类 + * + * 实际并不是数组,因为枚举不能设置 null 作为默认值 + */ + OperateTypeEnum[] type() default {}; + + // ========== 开关字段 ========== + + /** + * 是否记录操作日志 + */ + boolean enable() default true; + /** + * 是否记录方法参数 + */ + boolean logArgs() default true; + /** + * 是否记录方法结果的数据 + */ + boolean logResultData() default true; + +} diff --git a/win-framework/win-spring-boot-starter-biz-operatelog/src/main/java/com/win/framework/operatelog/core/aop/OperateLogAspect.java b/win-framework/win-spring-boot-starter-biz-operatelog/src/main/java/com/win/framework/operatelog/core/aop/OperateLogAspect.java new file mode 100644 index 0000000..bd859f0 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-operatelog/src/main/java/com/win/framework/operatelog/core/aop/OperateLogAspect.java @@ -0,0 +1,367 @@ +package com.win.framework.operatelog.core.aop; + +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.core.exceptions.ExceptionUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.util.json.JsonUtils; +import com.win.framework.common.util.monitor.TracerUtils; +import com.win.framework.common.util.servlet.ServletUtils; +import com.win.framework.operatelog.core.enums.OperateTypeEnum; +import com.win.framework.operatelog.core.service.OperateLog; +import com.win.framework.operatelog.core.service.OperateLogFrameworkService; +import com.win.framework.web.core.util.WebFrameworkUtils; +import com.google.common.collect.Maps; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.core.annotation.AnnotationUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.lang.annotation.Annotation; +import java.lang.reflect.Array; +import java.time.LocalDateTime; +import java.util.*; +import java.util.function.Predicate; +import java.util.stream.IntStream; + +import static com.win.framework.common.exception.enums.GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR; +import static com.win.framework.common.exception.enums.GlobalErrorCodeConstants.SUCCESS; + +/** + * 拦截使用 @OperateLog 注解,如果满足条件,则生成操作日志。 + * 满足如下任一条件,则会进行记录: + * 1. 使用 @ApiOperation + 非 @GetMapping + * 2. 使用 @OperateLog 注解 + *

+ * 但是,如果声明 @OperateLog 注解时,将 enable 属性设置为 false 时,强制不记录。 + * + * @author 闻荫源码 + */ +@Aspect +@Slf4j +public class OperateLogAspect { + + /** + * 用于记录操作内容的上下文 + * + * @see OperateLog#getContent() + */ + private static final ThreadLocal CONTENT = new ThreadLocal<>(); + /** + * 用于记录拓展字段的上下文 + * + * @see OperateLog#getExts() + */ + private static final ThreadLocal> EXTS = new ThreadLocal<>(); + + @Resource + private OperateLogFrameworkService operateLogFrameworkService; + + @Around("@annotation(operation)") + public Object around(ProceedingJoinPoint joinPoint, Operation operation) throws Throwable { + // 可能也添加了 @ApiOperation 注解 + com.win.framework.operatelog.core.annotations.OperateLog operateLog = getMethodAnnotation(joinPoint, + com.win.framework.operatelog.core.annotations.OperateLog.class); + return around0(joinPoint, operateLog, operation); + } + + @Around("!@annotation(io.swagger.v3.oas.annotations.Operation) && @annotation(operateLog)") + // 兼容处理,只添加 @OperateLog 注解的情况 + public Object around(ProceedingJoinPoint joinPoint, + com.win.framework.operatelog.core.annotations.OperateLog operateLog) throws Throwable { + return around0(joinPoint, operateLog, null); + } + + private Object around0(ProceedingJoinPoint joinPoint, + com.win.framework.operatelog.core.annotations.OperateLog operateLog, + Operation operation) throws Throwable { + // 记录开始时间 + LocalDateTime startTime = LocalDateTime.now(); + try { + // 执行原有方法 + Object result = joinPoint.proceed(); + // 记录正常执行时的操作日志 + this.log(joinPoint, operateLog, operation, startTime, result, null); + return result; + } catch (Throwable exception) { + this.log(joinPoint, operateLog, operation, startTime, null, exception); + throw exception; + } finally { + clearThreadLocal(); + } + } + + public static void setContent(String content) { + CONTENT.set(content); + } + + public static void addExt(String key, Object value) { + if (EXTS.get() == null) { + EXTS.set(new HashMap<>()); + } + EXTS.get().put(key, value); + } + + private static void clearThreadLocal() { + CONTENT.remove(); + EXTS.remove(); + } + + private void log(ProceedingJoinPoint joinPoint, + com.win.framework.operatelog.core.annotations.OperateLog operateLog, + Operation operation, + LocalDateTime startTime, Object result, Throwable exception) { + try { + // 判断不记录的情况 + if (!isLogEnable(joinPoint, operateLog)) { + return; + } + // 真正记录操作日志 + this.log0(joinPoint, operateLog, operation, startTime, result, exception); + } catch (Throwable ex) { + log.error("[log][记录操作日志时,发生异常,其中参数是 joinPoint({}) operateLog({}) apiOperation({}) result({}) exception({}) ]", + joinPoint, operateLog, operation, result, exception, ex); + } + } + + private void log0(ProceedingJoinPoint joinPoint, + com.win.framework.operatelog.core.annotations.OperateLog operateLog, + Operation operation, + LocalDateTime startTime, Object result, Throwable exception) { + OperateLog operateLogObj = new OperateLog(); + // 补全通用字段 + operateLogObj.setTraceId(TracerUtils.getTraceId()); + operateLogObj.setStartTime(startTime); + // 补充用户信息 + fillUserFields(operateLogObj); + // 补全模块信息 + fillModuleFields(operateLogObj, joinPoint, operateLog, operation); + // 补全请求信息 + fillRequestFields(operateLogObj); + // 补全方法信息 + fillMethodFields(operateLogObj, joinPoint, operateLog, startTime, result, exception); + + // 异步记录日志 + operateLogFrameworkService.createOperateLog(operateLogObj); + } + + private static void fillUserFields(OperateLog operateLogObj) { + operateLogObj.setUserId(WebFrameworkUtils.getLoginUserId()); + } + + private static void fillModuleFields(OperateLog operateLogObj, + ProceedingJoinPoint joinPoint, + com.win.framework.operatelog.core.annotations.OperateLog operateLog, + Operation operation) { + // module 属性 + if (operateLog != null) { + operateLogObj.setModule(operateLog.module()); + } + if (StrUtil.isEmpty(operateLogObj.getModule())) { + Tag tag = getClassAnnotation(joinPoint, Tag.class); + if (tag != null) { + // 优先读取 @Tag 的 name 属性 + if (StrUtil.isNotEmpty(tag.name())) { + operateLogObj.setModule(tag.name()); + } + // 没有的话,读取 @API 的 description 属性 + if (StrUtil.isEmpty(operateLogObj.getModule()) && ArrayUtil.isNotEmpty(tag.description())) { + operateLogObj.setModule(tag.description()); + } + } + } + // name 属性 + if (operateLog != null) { + operateLogObj.setName(operateLog.name()); + } + if (StrUtil.isEmpty(operateLogObj.getName()) && operation != null) { + operateLogObj.setName(operation.summary()); + } + // type 属性 + if (operateLog != null && ArrayUtil.isNotEmpty(operateLog.type())) { + operateLogObj.setType(operateLog.type()[0].getType()); + } + if (operateLogObj.getType() == null) { + RequestMethod requestMethod = obtainFirstMatchRequestMethod(obtainRequestMethod(joinPoint)); + OperateTypeEnum operateLogType = convertOperateLogType(requestMethod); + operateLogObj.setType(operateLogType != null ? operateLogType.getType() : null); + } + // content 和 exts 属性 + operateLogObj.setContent(CONTENT.get()); + operateLogObj.setExts(EXTS.get()); + } + + private static void fillRequestFields(OperateLog operateLogObj) { + // 获得 Request 对象 + HttpServletRequest request = ServletUtils.getRequest(); + if (request == null) { + return; + } + // 补全请求信息 + operateLogObj.setRequestMethod(request.getMethod()); + operateLogObj.setRequestUrl(request.getRequestURI()); + operateLogObj.setUserIp(ServletUtils.getClientIP(request)); + operateLogObj.setUserAgent(ServletUtils.getUserAgent(request)); + } + + private static void fillMethodFields(OperateLog operateLogObj, + ProceedingJoinPoint joinPoint, + com.win.framework.operatelog.core.annotations.OperateLog operateLog, + LocalDateTime startTime, Object result, Throwable exception) { + MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature(); + operateLogObj.setJavaMethod(methodSignature.toString()); + if (operateLog == null || operateLog.logArgs()) { + operateLogObj.setJavaMethodArgs(obtainMethodArgs(joinPoint)); + } + if (operateLog == null || operateLog.logResultData()) { + operateLogObj.setResultData(obtainResultData(result)); + } + operateLogObj.setDuration((int) (LocalDateTimeUtil.between(startTime, LocalDateTime.now()).toMillis())); + // (正常)处理 resultCode 和 resultMsg 字段 + if (result instanceof CommonResult) { + CommonResult commonResult = (CommonResult) result; + operateLogObj.setResultCode(commonResult.getCode()); + operateLogObj.setResultMsg(commonResult.getMsg()); + } else { + operateLogObj.setResultCode(SUCCESS.getCode()); + } + // (异常)处理 resultCode 和 resultMsg 字段 + if (exception != null) { + operateLogObj.setResultCode(INTERNAL_SERVER_ERROR.getCode()); + operateLogObj.setResultMsg(ExceptionUtil.getRootCauseMessage(exception)); + } + } + + private static boolean isLogEnable(ProceedingJoinPoint joinPoint, + com.win.framework.operatelog.core.annotations.OperateLog operateLog) { + // 有 @OperateLog 注解的情况下 + if (operateLog != null) { + return operateLog.enable(); + } + // 没有 @ApiOperation 注解的情况下,只记录 POST、PUT、DELETE 的情况 + return obtainFirstLogRequestMethod(obtainRequestMethod(joinPoint)) != null; + } + + private static RequestMethod obtainFirstLogRequestMethod(RequestMethod[] requestMethods) { + if (ArrayUtil.isEmpty(requestMethods)) { + return null; + } + return Arrays.stream(requestMethods).filter(requestMethod -> + requestMethod == RequestMethod.POST + || requestMethod == RequestMethod.PUT + || requestMethod == RequestMethod.DELETE) + .findFirst().orElse(null); + } + + private static RequestMethod obtainFirstMatchRequestMethod(RequestMethod[] requestMethods) { + if (ArrayUtil.isEmpty(requestMethods)) { + return null; + } + // 优先,匹配最优的 POST、PUT、DELETE + RequestMethod result = obtainFirstLogRequestMethod(requestMethods); + if (result != null) { + return result; + } + // 然后,匹配次优的 GET + result = Arrays.stream(requestMethods).filter(requestMethod -> requestMethod == RequestMethod.GET) + .findFirst().orElse(null); + if (result != null) { + return result; + } + // 兜底,获得第一个 + return requestMethods[0]; + } + + private static OperateTypeEnum convertOperateLogType(RequestMethod requestMethod) { + if (requestMethod == null) { + return null; + } + switch (requestMethod) { + case GET: + return OperateTypeEnum.GET; + case POST: + return OperateTypeEnum.CREATE; + case PUT: + return OperateTypeEnum.UPDATE; + case DELETE: + return OperateTypeEnum.DELETE; + default: + return OperateTypeEnum.OTHER; + } + } + + private static RequestMethod[] obtainRequestMethod(ProceedingJoinPoint joinPoint) { + RequestMapping requestMapping = AnnotationUtils.getAnnotation( // 使用 Spring 的工具类,可以处理 @RequestMapping 别名注解 + ((MethodSignature) joinPoint.getSignature()).getMethod(), RequestMapping.class); + return requestMapping != null ? requestMapping.method() : new RequestMethod[]{}; + } + + @SuppressWarnings("SameParameterValue") + private static T getMethodAnnotation(ProceedingJoinPoint joinPoint, Class annotationClass) { + return ((MethodSignature) joinPoint.getSignature()).getMethod().getAnnotation(annotationClass); + } + + @SuppressWarnings("SameParameterValue") + private static T getClassAnnotation(ProceedingJoinPoint joinPoint, Class annotationClass) { + return ((MethodSignature) joinPoint.getSignature()).getMethod().getDeclaringClass().getAnnotation(annotationClass); + } + + private static String obtainMethodArgs(ProceedingJoinPoint joinPoint) { + // TODO 提升:参数脱敏和忽略 + MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature(); + String[] argNames = methodSignature.getParameterNames(); + Object[] argValues = joinPoint.getArgs(); + // 拼接参数 + Map args = Maps.newHashMapWithExpectedSize(argValues.length); + for (int i = 0; i < argNames.length; i++) { + String argName = argNames[i]; + Object argValue = argValues[i]; + // 被忽略时,标记为 ignore 字符串,避免和 null 混在一起 + args.put(argName, !isIgnoreArgs(argValue) ? argValue : "[ignore]"); + } + return JsonUtils.toJsonString(args); + } + + private static String obtainResultData(Object result) { + // TODO 提升:结果脱敏和忽略 + if (result instanceof CommonResult) { + result = ((CommonResult) result).getData(); + } + return JsonUtils.toJsonString(result); + } + + private static boolean isIgnoreArgs(Object object) { + Class clazz = object.getClass(); + // 处理数组的情况 + if (clazz.isArray()) { + return IntStream.range(0, Array.getLength(object)) + .anyMatch(index -> isIgnoreArgs(Array.get(object, index))); + } + // 递归,处理数组、Collection、Map 的情况 + if (Collection.class.isAssignableFrom(clazz)) { + return ((Collection) object).stream() + .anyMatch((Predicate) OperateLogAspect::isIgnoreArgs); + } + if (Map.class.isAssignableFrom(clazz)) { + return isIgnoreArgs(((Map) object).values()); + } + // obj + return object instanceof MultipartFile + || object instanceof HttpServletRequest + || object instanceof HttpServletResponse + || object instanceof BindingResult; + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-operatelog/src/main/java/com/win/framework/operatelog/core/enums/OperateTypeEnum.java b/win-framework/win-spring-boot-starter-biz-operatelog/src/main/java/com/win/framework/operatelog/core/enums/OperateTypeEnum.java new file mode 100644 index 0000000..7e7a715 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-operatelog/src/main/java/com/win/framework/operatelog/core/enums/OperateTypeEnum.java @@ -0,0 +1,55 @@ +package com.win.framework.operatelog.core.enums; + +import com.win.framework.operatelog.core.annotations.OperateLog; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 操作日志的操作类型 + * + * @author ruoyi + */ +@Getter +@AllArgsConstructor +public enum OperateTypeEnum { + + /** + * 查询 + * + * 绝大多数情况下,不会记录查询动作,因为过于大量显得没有意义。 + * 在有需要的时候,通过声明 {@link OperateLog} 注解来记录 + */ + GET(1), + /** + * 新增 + */ + CREATE(2), + /** + * 修改 + */ + UPDATE(3), + /** + * 删除 + */ + DELETE(4), + /** + * 导出 + */ + EXPORT(5), + /** + * 导入 + */ + IMPORT(6), + /** + * 其它 + * + * 在无法归类时,可以选择使用其它。因为还有操作名可以进一步标识 + */ + OTHER(0); + + /** + * 类型 + */ + private final Integer type; + +} diff --git a/win-framework/win-spring-boot-starter-biz-operatelog/src/main/java/com/win/framework/operatelog/core/package-info.java b/win-framework/win-spring-boot-starter-biz-operatelog/src/main/java/com/win/framework/operatelog/core/package-info.java new file mode 100644 index 0000000..5c2f331 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-operatelog/src/main/java/com/win/framework/operatelog/core/package-info.java @@ -0,0 +1 @@ +package com.win.framework.operatelog.core; diff --git a/win-framework/win-spring-boot-starter-biz-operatelog/src/main/java/com/win/framework/operatelog/core/service/OperateLog.java b/win-framework/win-spring-boot-starter-biz-operatelog/src/main/java/com/win/framework/operatelog/core/service/OperateLog.java new file mode 100644 index 0000000..fefce22 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-operatelog/src/main/java/com/win/framework/operatelog/core/service/OperateLog.java @@ -0,0 +1,106 @@ +package com.win.framework.operatelog.core.service; + +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.Map; + +/** + * 操作日志 + * + * @author 闻荫源码 + */ +@Data +public class OperateLog { + + /** + * 链路追踪编号 + */ + private String traceId; + + /** + * 用户编号 + */ + private Long userId; + + /** + * 操作模块 + */ + private String module; + + /** + * 操作名 + */ + private String name; + + /** + * 操作分类 + */ + private Integer type; + + /** + * 操作明细 + */ + private String content; + + /** + * 拓展字段 + */ + private Map exts; + + /** + * 请求方法名 + */ + private String requestMethod; + + /** + * 请求地址 + */ + private String requestUrl; + + /** + * 用户 IP + */ + private String userIp; + + /** + * 浏览器 UserAgent + */ + private String userAgent; + + /** + * Java 方法名 + */ + private String javaMethod; + + /** + * Java 方法的参数 + */ + private String javaMethodArgs; + + /** + * 开始时间 + */ + private LocalDateTime startTime; + + /** + * 执行时长,单位:毫秒 + */ + private Integer duration; + + /** + * 结果码 + */ + private Integer resultCode; + + /** + * 结果提示 + */ + private String resultMsg; + + /** + * 结果数据 + */ + private String resultData; + +} diff --git a/win-framework/win-spring-boot-starter-biz-operatelog/src/main/java/com/win/framework/operatelog/core/service/OperateLogFrameworkService.java b/win-framework/win-spring-boot-starter-biz-operatelog/src/main/java/com/win/framework/operatelog/core/service/OperateLogFrameworkService.java new file mode 100644 index 0000000..f6f1631 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-operatelog/src/main/java/com/win/framework/operatelog/core/service/OperateLogFrameworkService.java @@ -0,0 +1,17 @@ +package com.win.framework.operatelog.core.service; + +/** + * 操作日志 Framework Service 接口 + * + * @author 闻荫源码 + */ +public interface OperateLogFrameworkService { + + /** + * 记录操作日志 + * + * @param operateLog 操作日志请求 + */ + void createOperateLog(OperateLog operateLog); + +} diff --git a/win-framework/win-spring-boot-starter-biz-operatelog/src/main/java/com/win/framework/operatelog/core/service/OperateLogFrameworkServiceImpl.java b/win-framework/win-spring-boot-starter-biz-operatelog/src/main/java/com/win/framework/operatelog/core/service/OperateLogFrameworkServiceImpl.java new file mode 100644 index 0000000..bd52331 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-operatelog/src/main/java/com/win/framework/operatelog/core/service/OperateLogFrameworkServiceImpl.java @@ -0,0 +1,28 @@ +package com.win.framework.operatelog.core.service; + +import cn.hutool.core.bean.BeanUtil; +import com.win.module.system.api.logger.OperateLogApi; +import com.win.module.system.api.logger.dto.OperateLogCreateReqDTO; +import lombok.RequiredArgsConstructor; +import org.springframework.scheduling.annotation.Async; + +/** + * 操作日志 Framework Service 实现类 + * + * 基于 {@link OperateLogApi} 实现,记录操作日志 + * + * @author 闻荫源码 + */ +@RequiredArgsConstructor +public class OperateLogFrameworkServiceImpl implements OperateLogFrameworkService { + + private final OperateLogApi operateLogApi; + + @Override + @Async + public void createOperateLog(OperateLog operateLog) { + OperateLogCreateReqDTO reqDTO = BeanUtil.copyProperties(operateLog, OperateLogCreateReqDTO.class); + operateLogApi.createOperateLog(reqDTO); + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-operatelog/src/main/java/com/win/framework/operatelog/core/util/OperateLogUtils.java b/win-framework/win-spring-boot-starter-biz-operatelog/src/main/java/com/win/framework/operatelog/core/util/OperateLogUtils.java new file mode 100644 index 0000000..3042ad1 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-operatelog/src/main/java/com/win/framework/operatelog/core/util/OperateLogUtils.java @@ -0,0 +1,21 @@ +package com.win.framework.operatelog.core.util; + +import com.win.framework.operatelog.core.aop.OperateLogAspect; + +/** + * 操作日志工具类 + * 目前主要的作用,是提供给业务代码,记录操作明细和拓展字段 + * + * @author 闻荫源码 + */ +public class OperateLogUtils { + + public static void setContent(String content) { + OperateLogAspect.setContent(content); + } + + public static void addExt(String key, Object value) { + OperateLogAspect.addExt(key, value); + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-operatelog/src/main/java/com/win/framework/operatelog/package-info.java b/win-framework/win-spring-boot-starter-biz-operatelog/src/main/java/com/win/framework/operatelog/package-info.java new file mode 100644 index 0000000..83db0ea --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-operatelog/src/main/java/com/win/framework/operatelog/package-info.java @@ -0,0 +1,6 @@ +/** + * 用户操作日志:记录用户的操作,用于对用户的操作的审计与追溯,永久保存。 + * + * @author 闻荫源码 + */ +package com.win.framework.operatelog; diff --git a/win-framework/win-spring-boot-starter-biz-operatelog/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/win-framework/win-spring-boot-starter-biz-operatelog/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..a79ddf3 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-operatelog/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +com.win.framework.operatelog.config.WinOperateLogAutoConfiguration \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-biz-sms/pom.xml b/win-framework/win-spring-boot-starter-biz-sms/pom.xml new file mode 100644 index 0000000..58b00e5 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-sms/pom.xml @@ -0,0 +1,82 @@ + + + + com.win + win-framework + ${revision} + + 4.0.0 + win-spring-boot-starter-biz-sms + jar + + ${project.artifactId} + 短信拓展,支持阿里云、腾讯云 + https://github.com/YunaiV/ruoyi-vue-pro + + + + com.win + win-common + + + + + org.springframework.boot + spring-boot-starter + + + + + io.opentracing + opentracing-util + + + + + com.win + win-spring-boot-starter-test + test + + + + + com.google.guava + guava + true + + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.core + jackson-core + + + + jakarta.validation + jakarta.validation-api + + + + + + + com.aliyun + aliyun-java-sdk-core + + + com.aliyun + aliyun-java-sdk-dysmsapi + + + com.tencentcloudapi + tencentcloud-sdk-java-sms + + + + + diff --git a/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/config/WinSmsAutoConfiguration.java b/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/config/WinSmsAutoConfiguration.java new file mode 100644 index 0000000..eb14597 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/config/WinSmsAutoConfiguration.java @@ -0,0 +1,21 @@ +package com.win.framework.sms.config; + +import com.win.framework.sms.core.client.SmsClientFactory; +import com.win.framework.sms.core.client.impl.SmsClientFactoryImpl; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.context.annotation.Bean; + +/** + * 短信配置类 + * + * @author 闻荫源码 + */ +@AutoConfiguration +public class WinSmsAutoConfiguration { + + @Bean + public SmsClientFactory smsClientFactory() { + return new SmsClientFactoryImpl(); + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/SmsClient.java b/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/SmsClient.java new file mode 100644 index 0000000..01fa733 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/SmsClient.java @@ -0,0 +1,54 @@ +package com.win.framework.sms.core.client; + +import com.win.framework.common.core.KeyValue; +import com.win.framework.sms.core.client.dto.SmsReceiveRespDTO; +import com.win.framework.sms.core.client.dto.SmsSendRespDTO; +import com.win.framework.sms.core.client.dto.SmsTemplateRespDTO; + +import java.util.List; + +/** + * 短信客户端,用于对接各短信平台的 SDK,实现短信发送等功能 + * + * @author zzf + * @since 2021/1/25 14:14 + */ +public interface SmsClient { + + /** + * 获得渠道编号 + * + * @return 渠道编号 + */ + Long getId(); + + /** + * 发送消息 + * + * @param logId 日志编号 + * @param mobile 手机号 + * @param apiTemplateId 短信 API 的模板编号 + * @param templateParams 短信模板参数。通过 List 数组,保证参数的顺序 + * @return 短信发送结果 + */ + SmsCommonResult sendSms(Long logId, String mobile, String apiTemplateId, + List> templateParams); + + /** + * 解析接收短信的接收结果 + * + * @param text 结果 + * @return 结果内容 + * @throws Throwable 当解析 text 发生异常时,则会抛出异常 + */ + List parseSmsReceiveStatus(String text) throws Throwable; + + /** + * 查询指定的短信模板 + * + * @param apiTemplateId 短信 API 的模板编号 + * @return 短信模板 + */ + SmsCommonResult getSmsTemplate(String apiTemplateId); + +} diff --git a/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/SmsClientFactory.java b/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/SmsClientFactory.java new file mode 100644 index 0000000..62b5279 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/SmsClientFactory.java @@ -0,0 +1,36 @@ +package com.win.framework.sms.core.client; + +import com.win.framework.sms.core.property.SmsChannelProperties; + +/** + * 短信客户端的工厂接口 + * + * @author zzf + * @since 2021/1/28 14:01 + */ +public interface SmsClientFactory { + + /** + * 获得短信 Client + * + * @param channelId 渠道编号 + * @return 短信 Client + */ + SmsClient getSmsClient(Long channelId); + + /** + * 获得短信 Client + * + * @param channelCode 渠道编码 + * @return 短信 Client + */ + SmsClient getSmsClient(String channelCode); + + /** + * 创建短信 Client + * + * @param properties 配置对象 + */ + void createOrUpdateSmsClient(SmsChannelProperties properties); + +} diff --git a/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/SmsCodeMapping.java b/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/SmsCodeMapping.java new file mode 100644 index 0000000..670e91f --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/SmsCodeMapping.java @@ -0,0 +1,17 @@ +package com.win.framework.sms.core.client; + +import com.win.framework.common.exception.ErrorCode; +import com.win.framework.sms.core.enums.SmsFrameworkErrorCodeConstants; + +import java.util.function.Function; + +/** + * 将 API 的错误码,转换为通用的错误码 + * + * @see SmsCommonResult + * @see SmsFrameworkErrorCodeConstants + * + * @author 闻荫源码 + */ +public interface SmsCodeMapping extends Function { +} diff --git a/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/SmsCommonResult.java b/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/SmsCommonResult.java new file mode 100644 index 0000000..43319d3 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/SmsCommonResult.java @@ -0,0 +1,68 @@ +package com.win.framework.sms.core.client; + +import cn.hutool.core.exceptions.ExceptionUtil; +import cn.hutool.core.lang.Assert; +import com.win.framework.common.exception.ErrorCode; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.sms.core.enums.SmsFrameworkErrorCodeConstants; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +/** + * 短信的 CommonResult 拓展类 + * + * 考虑到不同的平台,返回的 code 和 msg 是不同的,所以统一额外返回 {@link #apiCode} 和 {@link #apiMsg} 字段 + * + * 另外,一些短信平台(例如说阿里云、腾讯云)会返回一个请求编号,用于排查请求失败的问题,我们设置到 {@link #apiRequestId} 字段 + * + * @author 闻荫源码 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SmsCommonResult extends CommonResult { + + /** + * API 返回错误码 + * + * 由于第三方的错误码可能是字符串,所以使用 String 类型 + */ + private String apiCode; + /** + * API 返回提示 + */ + private String apiMsg; + + /** + * API 请求编号 + */ + private String apiRequestId; + + private SmsCommonResult() { + } + + public static SmsCommonResult build(String apiCode, String apiMsg, String apiRequestId, + T data, SmsCodeMapping codeMapping) { + Assert.notNull(codeMapping, "参数 codeMapping 不能为空"); + SmsCommonResult result = new SmsCommonResult().setApiCode(apiCode).setApiMsg(apiMsg).setApiRequestId(apiRequestId); + result.setData(data); + // 翻译错误码 + if (codeMapping != null) { + ErrorCode errorCode = codeMapping.apply(apiCode); + if (errorCode == null) { + errorCode = SmsFrameworkErrorCodeConstants.SMS_UNKNOWN; + } + result.setCode(errorCode.getCode()).setMsg(errorCode.getMsg()); + } + return result; + } + + public static SmsCommonResult error(Throwable ex) { + SmsCommonResult result = new SmsCommonResult<>(); + result.setCode(SmsFrameworkErrorCodeConstants.EXCEPTION.getCode()); + result.setMsg(ExceptionUtil.getRootCauseMessage(ex)); + return result; + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/dto/SmsReceiveRespDTO.java b/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/dto/SmsReceiveRespDTO.java new file mode 100644 index 0000000..b7185d0 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/dto/SmsReceiveRespDTO.java @@ -0,0 +1,48 @@ +package com.win.framework.sms.core.client.dto; + +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 消息接收 Response DTO + * + * @author 闻荫源码 + */ +@Data +public class SmsReceiveRespDTO { + + /** + * 是否接收成功 + */ + private Boolean success; + /** + * API 接收结果的编码 + */ + private String errorCode; + /** + * API 接收结果的说明 + */ + private String errorMsg; + + /** + * 手机号 + */ + private String mobile; + /** + * 用户接收时间 + */ + private LocalDateTime receiveTime; + + /** + * 短信 API 发送返回的序号 + */ + private String serialNo; + /** + * 短信日志编号 + * + * 对应 SysSmsLogDO 的编号 + */ + private Long logId; + +} diff --git a/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/dto/SmsSendRespDTO.java b/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/dto/SmsSendRespDTO.java new file mode 100644 index 0000000..3a95ce3 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/dto/SmsSendRespDTO.java @@ -0,0 +1,18 @@ +package com.win.framework.sms.core.client.dto; + +import lombok.Data; + +/** + * 短信发送 Response DTO + * + * @author 闻荫源码 + */ +@Data +public class SmsSendRespDTO { + + /** + * 短信 API 发送返回的序号 + */ + private String serialNo; + +} diff --git a/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/dto/SmsTemplateRespDTO.java b/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/dto/SmsTemplateRespDTO.java new file mode 100644 index 0000000..d43f476 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/dto/SmsTemplateRespDTO.java @@ -0,0 +1,33 @@ +package com.win.framework.sms.core.client.dto; + +import com.win.framework.sms.core.enums.SmsTemplateAuditStatusEnum; +import lombok.Data; + +/** + * 短信模板 Response DTO + * + * @author 闻荫源码 + */ +@Data +public class SmsTemplateRespDTO { + + /** + * 模板编号 + */ + private String id; + /** + * 短信内容 + */ + private String content; + /** + * 审核状态 + * + * 枚举 {@link SmsTemplateAuditStatusEnum} + */ + private Integer auditStatus; + /** + * 审核未通过的理由 + */ + private String auditReason; + +} diff --git a/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/impl/AbstractSmsClient.java b/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/impl/AbstractSmsClient.java new file mode 100644 index 0000000..03467ce --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/impl/AbstractSmsClient.java @@ -0,0 +1,127 @@ +package com.win.framework.sms.core.client.impl; + +import com.win.framework.common.core.KeyValue; +import com.win.framework.sms.core.client.SmsClient; +import com.win.framework.sms.core.client.SmsCodeMapping; +import com.win.framework.sms.core.client.SmsCommonResult; +import com.win.framework.sms.core.client.dto.SmsReceiveRespDTO; +import com.win.framework.sms.core.client.dto.SmsSendRespDTO; +import com.win.framework.sms.core.client.dto.SmsTemplateRespDTO; +import com.win.framework.sms.core.property.SmsChannelProperties; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * 短信客户端的抽象类,提供模板方法,减少子类的冗余代码 + * + * @author zzf + * @since 2021/2/1 9:28 + */ +@Slf4j +public abstract class AbstractSmsClient implements SmsClient { + + /** + * 短信渠道配置 + */ + protected volatile SmsChannelProperties properties; + /** + * 错误码枚举类 + */ + protected final SmsCodeMapping codeMapping; + + public AbstractSmsClient(SmsChannelProperties properties, SmsCodeMapping codeMapping) { + this.properties = prepareProperties(properties); + this.codeMapping = codeMapping; + } + + /** + * 初始化 + */ + public final void init() { + doInit(); + log.debug("[init][配置({}) 初始化完成]", properties); + } + + /** + * 自定义初始化 + */ + protected abstract void doInit(); + + public final void refresh(SmsChannelProperties properties) { + // 判断是否更新 + if (properties.equals(this.properties)) { + return; + } + log.info("[refresh][配置({})发生变化,重新初始化]", properties); + this.properties = prepareProperties(properties); + // 初始化 + this.init(); + } + + /** + * 在赋值给{@link this#properties}前,子类可根据需要预处理短信渠道配置 + * + * @param properties 数据库中存储的短信渠道配置 + * @return 满足子类实现的短信渠道配置 + */ + protected SmsChannelProperties prepareProperties(SmsChannelProperties properties) { + return properties; + } + + @Override + public Long getId() { + return properties.getId(); + } + + @Override + public final SmsCommonResult sendSms(Long logId, String mobile, + String apiTemplateId, List> templateParams) { + // 执行短信发送 + SmsCommonResult result; + try { + result = doSendSms(logId, mobile, apiTemplateId, templateParams); + } catch (Throwable ex) { + // 打印异常日志 + log.error("[sendSms][发送短信异常,sendLogId({}) mobile({}) apiTemplateId({}) templateParams({})]", + logId, mobile, apiTemplateId, templateParams, ex); + // 封装返回 + return SmsCommonResult.error(ex); + } + return result; + } + + protected abstract SmsCommonResult doSendSms(Long sendLogId, String mobile, + String apiTemplateId, List> templateParams) + throws Throwable; + + @Override + public List parseSmsReceiveStatus(String text) throws Throwable { + try { + return doParseSmsReceiveStatus(text); + } catch (Throwable ex) { + log.error("[parseSmsReceiveStatus][text({}) 解析发生异常]", text, ex); + throw ex; + } + } + + protected abstract List doParseSmsReceiveStatus(String text) throws Throwable; + + @Override + public SmsCommonResult getSmsTemplate(String apiTemplateId) { + // 执行短信发送 + SmsCommonResult result; + try { + result = doGetSmsTemplate(apiTemplateId); + } catch (Throwable ex) { + // 打印异常日志 + log.error("[getSmsTemplate][获得短信模板({}) 发生异常]", apiTemplateId, ex); + // 封装返回 + return SmsCommonResult.error(ex); + } + return result; + } + + protected abstract SmsCommonResult doGetSmsTemplate(String apiTemplateId) throws Throwable; + +} diff --git a/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/impl/SmsClientFactoryImpl.java b/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/impl/SmsClientFactoryImpl.java new file mode 100644 index 0000000..07b44d9 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/impl/SmsClientFactoryImpl.java @@ -0,0 +1,90 @@ +package com.win.framework.sms.core.client.impl; + +import com.win.framework.sms.core.client.SmsClient; +import com.win.framework.sms.core.client.SmsClientFactory; +import com.win.framework.sms.core.client.impl.aliyun.AliyunSmsClient; +import com.win.framework.sms.core.client.impl.debug.DebugDingTalkSmsClient; +import com.win.framework.sms.core.client.impl.tencent.TencentSmsClient; +import com.win.framework.sms.core.enums.SmsChannelEnum; +import com.win.framework.sms.core.property.SmsChannelProperties; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.Assert; +import org.springframework.validation.annotation.Validated; + +import java.util.Arrays; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +/** + * 短信客户端工厂接口 + * + * @author zzf + */ +@Validated +@Slf4j +public class SmsClientFactoryImpl implements SmsClientFactory { + + /** + * 短信客户端 Map + * key:渠道编号,使用 {@link SmsChannelProperties#getId()} + */ + private final ConcurrentMap channelIdClients = new ConcurrentHashMap<>(); + + /** + * 短信客户端 Map + * key:渠道编码,使用 {@link SmsChannelProperties#getCode()} ()} + * + * 注意,一些场景下,需要获得某个渠道类型的客户端,所以需要使用它。 + * 例如说,解析短信接收结果,是相对通用的,不需要使用某个渠道编号的 {@link #channelIdClients} + */ + private final ConcurrentMap channelCodeClients = new ConcurrentHashMap<>(); + + public SmsClientFactoryImpl() { + // 初始化 channelCodeClients 集合 + Arrays.stream(SmsChannelEnum.values()).forEach(channel -> { + // 创建一个空的 SmsChannelProperties 对象 + SmsChannelProperties properties = new SmsChannelProperties().setCode(channel.getCode()) + .setApiKey("default default").setApiSecret("default"); + // 创建 Sms 客户端 + AbstractSmsClient smsClient = createSmsClient(properties); + channelCodeClients.put(channel.getCode(), smsClient); + }); + } + + @Override + public SmsClient getSmsClient(Long channelId) { + return channelIdClients.get(channelId); + } + + @Override + public SmsClient getSmsClient(String channelCode) { + return channelCodeClients.get(channelCode); + } + + @Override + public void createOrUpdateSmsClient(SmsChannelProperties properties) { + AbstractSmsClient client = channelIdClients.get(properties.getId()); + if (client == null) { + client = this.createSmsClient(properties); + client.init(); + channelIdClients.put(client.getId(), client); + } else { + client.refresh(properties); + } + } + + private AbstractSmsClient createSmsClient(SmsChannelProperties properties) { + SmsChannelEnum channelEnum = SmsChannelEnum.getByCode(properties.getCode()); + Assert.notNull(channelEnum, String.format("渠道类型(%s) 为空", channelEnum)); + // 创建客户端 + switch (channelEnum) { + case ALIYUN: return new AliyunSmsClient(properties); + case DEBUG_DING_TALK: return new DebugDingTalkSmsClient(properties); + case TENCENT: return new TencentSmsClient(properties); + } + // 创建失败,错误日志 + 抛出异常 + log.error("[createSmsClient][配置({}) 找不到合适的客户端实现]", properties); + throw new IllegalArgumentException(String.format("配置(%s) 找不到合适的客户端实现", properties)); + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/impl/aliyun/AliyunSmsClient.java b/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/impl/aliyun/AliyunSmsClient.java new file mode 100644 index 0000000..4dd5fa6 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/impl/aliyun/AliyunSmsClient.java @@ -0,0 +1,212 @@ +package com.win.framework.sms.core.client.impl.aliyun; + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ReflectUtil; +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.core.KeyValue; +import com.win.framework.sms.core.client.SmsCommonResult; +import com.win.framework.sms.core.client.dto.SmsReceiveRespDTO; +import com.win.framework.sms.core.client.dto.SmsSendRespDTO; +import com.win.framework.sms.core.client.dto.SmsTemplateRespDTO; +import com.win.framework.sms.core.client.impl.AbstractSmsClient; +import com.win.framework.sms.core.enums.SmsTemplateAuditStatusEnum; +import com.win.framework.sms.core.property.SmsChannelProperties; +import com.win.framework.common.util.collection.MapUtils; +import com.win.framework.common.util.json.JsonUtils; +import com.aliyuncs.AcsRequest; +import com.aliyuncs.AcsResponse; +import com.aliyuncs.DefaultAcsClient; +import com.aliyuncs.IAcsClient; +import com.aliyuncs.dysmsapi.model.v20170525.QuerySmsTemplateRequest; +import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest; +import com.aliyuncs.exceptions.ClientException; +import com.aliyuncs.profile.DefaultProfile; +import com.aliyuncs.profile.IClientProfile; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.common.annotations.VisibleForTesting; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Collectors; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; +import static com.win.framework.common.util.date.DateUtils.TIME_ZONE_DEFAULT; + +/** + * 阿里短信客户端的实现类 + * + * @author zzf + * @since 2021/1/25 14:17 + */ +@Slf4j +public class AliyunSmsClient extends AbstractSmsClient { + + /** + * REGION, 使用杭州 + */ + private static final String ENDPOINT = "cn-hangzhou"; + + /** + * 阿里云客户端 + */ + private volatile IAcsClient client; + + public AliyunSmsClient(SmsChannelProperties properties) { + super(properties, new AliyunSmsCodeMapping()); + Assert.notEmpty(properties.getApiKey(), "apiKey 不能为空"); + Assert.notEmpty(properties.getApiSecret(), "apiSecret 不能为空"); + } + + @Override + protected void doInit() { + IClientProfile profile = DefaultProfile.getProfile(ENDPOINT, properties.getApiKey(), properties.getApiSecret()); + client = new DefaultAcsClient(profile); + } + + @Override + protected SmsCommonResult doSendSms(Long sendLogId, String mobile, + String apiTemplateId, List> templateParams) { + // 构建参数 + SendSmsRequest request = new SendSmsRequest(); + request.setPhoneNumbers(mobile); + request.setSignName(properties.getSignature()); + request.setTemplateCode(apiTemplateId); + request.setTemplateParam(JsonUtils.toJsonString(MapUtils.convertMap(templateParams))); + request.setOutId(String.valueOf(sendLogId)); + // 执行请求 + return invoke(request, response -> new SmsSendRespDTO().setSerialNo(response.getBizId())); + } + + @Override + protected List doParseSmsReceiveStatus(String text) throws Throwable { + List statuses = JsonUtils.parseArray(text, SmsReceiveStatus.class); + return statuses.stream().map(status -> { + SmsReceiveRespDTO resp = new SmsReceiveRespDTO(); + resp.setSuccess(status.getSuccess()); + resp.setErrorCode(status.getErrCode()).setErrorMsg(status.getErrMsg()); + resp.setMobile(status.getPhoneNumber()).setReceiveTime(status.getReportTime()); + resp.setSerialNo(status.getBizId()).setLogId(Long.valueOf(status.getOutId())); + return resp; + }).collect(Collectors.toList()); + } + + @Override + protected SmsCommonResult doGetSmsTemplate(String apiTemplateId) { + // 构建参数 + QuerySmsTemplateRequest request = new QuerySmsTemplateRequest(); + request.setTemplateCode(apiTemplateId); + // 执行请求 + return invoke(request, response -> { + SmsTemplateRespDTO data = new SmsTemplateRespDTO(); + data.setId(response.getTemplateCode()).setContent(response.getTemplateContent()); + data.setAuditStatus(convertSmsTemplateAuditStatus(response.getTemplateStatus())).setAuditReason(response.getReason()); + return data; + }); + } + + @VisibleForTesting + Integer convertSmsTemplateAuditStatus(Integer templateStatus) { + switch (templateStatus) { + case 0: return SmsTemplateAuditStatusEnum.CHECKING.getStatus(); + case 1: return SmsTemplateAuditStatusEnum.SUCCESS.getStatus(); + case 2: return SmsTemplateAuditStatusEnum.FAIL.getStatus(); + default: throw new IllegalArgumentException(String.format("未知审核状态(%d)", templateStatus)); + } + } + + @VisibleForTesting + SmsCommonResult invoke(AcsRequest request, Function responseConsumer) { + try { + // 执行发送. 由于阿里云 sms 短信没有统一的 Response,但是有统一的 code、message、requestId 属性,所以只好反射 + T sendResult = client.getAcsResponse(request); + String code = (String) ReflectUtil.getFieldValue(sendResult, "code"); + String message = (String) ReflectUtil.getFieldValue(sendResult, "message"); + String requestId = (String) ReflectUtil.getFieldValue(sendResult, "requestId"); + // 解析结果 + R data = null; + if (Objects.equals(code, "OK")) { // 请求成功的情况下 + data = responseConsumer.apply(sendResult); + } + // 拼接结果 + return SmsCommonResult.build(code, message, requestId, data, codeMapping); + } catch (ClientException ex) { + return SmsCommonResult.build(ex.getErrCode(), formatResultMsg(ex), ex.getRequestId(), null, codeMapping); + } + } + + private static String formatResultMsg(ClientException ex) { + if (StrUtil.isEmpty(ex.getErrorDescription())) { + return ex.getErrMsg(); + } + return ex.getErrMsg() + " => " + ex.getErrorDescription(); + } + + /** + * 短信接收状态 + * + * 参见 https://help.aliyun.com/document_detail/101867.html 文档 + * + * @author 闻荫源码 + */ + @Data + public static class SmsReceiveStatus { + + /** + * 手机号 + */ + @JsonProperty("phone_number") + private String phoneNumber; + /** + * 发送时间 + */ + @JsonProperty("send_time") + @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, timezone = TIME_ZONE_DEFAULT) + private LocalDateTime sendTime; + /** + * 状态报告时间 + */ + @JsonProperty("report_time") + @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, timezone = TIME_ZONE_DEFAULT) + private LocalDateTime reportTime; + /** + * 是否接收成功 + */ + private Boolean success; + /** + * 状态报告说明 + */ + @JsonProperty("err_msg") + private String errMsg; + /** + * 状态报告编码 + */ + @JsonProperty("err_code") + private String errCode; + /** + * 发送序列号 + */ + @JsonProperty("biz_id") + private String bizId; + /** + * 用户序列号 + * + * 这里我们传递的是 SysSmsLogDO 的日志编号 + */ + @JsonProperty("out_id") + private String outId; + /** + * 短信长度,例如说 1、2、3 + * + * 140 字节算一条短信,短信长度超过 140 字节时会拆分成多条短信发送 + */ + @JsonProperty("sms_size") + private Integer smsSize; + + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/impl/aliyun/AliyunSmsCodeMapping.java b/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/impl/aliyun/AliyunSmsCodeMapping.java new file mode 100644 index 0000000..1c85243 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/impl/aliyun/AliyunSmsCodeMapping.java @@ -0,0 +1,42 @@ +package com.win.framework.sms.core.client.impl.aliyun; + +import com.win.framework.common.exception.ErrorCode; +import com.win.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.win.framework.sms.core.client.SmsCodeMapping; +import com.win.framework.sms.core.enums.SmsFrameworkErrorCodeConstants; + +/** + * 阿里云的 SmsCodeMapping 实现类 + * + * 参见 https://help.aliyun.com/document_detail/101346.htm 文档 + * + * @author 闻荫源码 + */ +public class AliyunSmsCodeMapping implements SmsCodeMapping { + + @Override + public ErrorCode apply(String apiCode) { + switch (apiCode) { + case "OK": return GlobalErrorCodeConstants.SUCCESS; + case "isv.ACCOUNT_NOT_EXISTS": + case "isv.ACCOUNT_ABNORMAL": + case "MissingAccessKeyId": return SmsFrameworkErrorCodeConstants.SMS_ACCOUNT_INVALID; + case "isp.RAM_PERMISSION_DENY": return SmsFrameworkErrorCodeConstants.SMS_PERMISSION_DENY; + case "isv.INVALID_JSON_PARAM": + case "isv.INVALID_PARAMETERS": return SmsFrameworkErrorCodeConstants.SMS_API_PARAM_ERROR; + case "isv.BUSINESS_LIMIT_CONTROL": return SmsFrameworkErrorCodeConstants.SMS_SEND_BUSINESS_LIMIT_CONTROL; + case "isv.DAY_LIMIT_CONTROL": return SmsFrameworkErrorCodeConstants.SMS_SEND_DAY_LIMIT_CONTROL; + case "isv.SMS_CONTENT_ILLEGAL": return SmsFrameworkErrorCodeConstants.SMS_SEND_CONTENT_INVALID; + case "isv.SMS_TEMPLATE_ILLEGAL": return SmsFrameworkErrorCodeConstants.SMS_TEMPLATE_INVALID; + case "isv.SMS_SIGNATURE_ILLEGAL": + case "isv.SIGN_NAME_ILLEGAL": + case "isv.SMS_SIGN_ILLEGAL": return SmsFrameworkErrorCodeConstants.SMS_SIGN_INVALID; + case "isv.AMOUNT_NOT_ENOUGH": + case "isv.OUT_OF_SERVICE": return SmsFrameworkErrorCodeConstants.SMS_ACCOUNT_MONEY_NOT_ENOUGH; + case "isv.MOBILE_NUMBER_ILLEGAL": return SmsFrameworkErrorCodeConstants.SMS_MOBILE_INVALID; + case "isv.TEMPLATE_MISSING_PARAMETERS": return SmsFrameworkErrorCodeConstants.SMS_TEMPLATE_PARAM_ERROR; + default: return SmsFrameworkErrorCodeConstants.SMS_UNKNOWN; + } + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/impl/debug/DebugDingTalkCodeMapping.java b/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/impl/debug/DebugDingTalkCodeMapping.java new file mode 100644 index 0000000..874c8bd --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/impl/debug/DebugDingTalkCodeMapping.java @@ -0,0 +1,22 @@ +package com.win.framework.sms.core.client.impl.debug; + +import com.win.framework.common.exception.ErrorCode; +import com.win.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.win.framework.sms.core.client.SmsCodeMapping; +import com.win.framework.sms.core.enums.SmsFrameworkErrorCodeConstants; + +import java.util.Objects; + +/** + * 钉钉的 SmsCodeMapping 实现类 + * + * @author 闻荫源码 + */ +public class DebugDingTalkCodeMapping implements SmsCodeMapping { + + @Override + public ErrorCode apply(String apiCode) { + return Objects.equals(apiCode, "0") ? GlobalErrorCodeConstants.SUCCESS : SmsFrameworkErrorCodeConstants.SMS_UNKNOWN; + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/impl/debug/DebugDingTalkSmsClient.java b/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/impl/debug/DebugDingTalkSmsClient.java new file mode 100644 index 0000000..6a3d949 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/impl/debug/DebugDingTalkSmsClient.java @@ -0,0 +1,96 @@ +package com.win.framework.sms.core.client.impl.debug; + +import cn.hutool.core.codec.Base64; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.digest.DigestUtil; +import cn.hutool.crypto.digest.HmacAlgorithm; +import cn.hutool.http.HttpUtil; +import com.win.framework.common.core.KeyValue; +import com.win.framework.sms.core.client.SmsCommonResult; +import com.win.framework.sms.core.client.dto.SmsReceiveRespDTO; +import com.win.framework.sms.core.client.dto.SmsSendRespDTO; +import com.win.framework.sms.core.client.dto.SmsTemplateRespDTO; +import com.win.framework.sms.core.client.impl.AbstractSmsClient; +import com.win.framework.sms.core.enums.SmsTemplateAuditStatusEnum; +import com.win.framework.sms.core.property.SmsChannelProperties; +import com.win.framework.common.util.collection.MapUtils; +import com.win.framework.common.util.json.JsonUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 基于钉钉 WebHook 实现的调试的短信客户端实现类 + * + * 考虑到省钱,我们使用钉钉 WebHook 模拟发送短信,方便调试。 + * + * @author 闻荫源码 + */ +public class DebugDingTalkSmsClient extends AbstractSmsClient { + + public DebugDingTalkSmsClient(SmsChannelProperties properties) { + super(properties, new DebugDingTalkCodeMapping()); + Assert.notEmpty(properties.getApiKey(), "apiKey 不能为空"); + Assert.notEmpty(properties.getApiSecret(), "apiSecret 不能为空"); + } + + @Override + protected void doInit() { + } + + @Override + protected SmsCommonResult doSendSms(Long sendLogId, String mobile, + String apiTemplateId, List> templateParams) throws Throwable { + // 构建请求 + String url = buildUrl("robot/send"); + Map params = new HashMap<>(); + params.put("msgtype", "text"); + String content = String.format("【模拟短信】\n手机号:%s\n短信日志编号:%d\n模板参数:%s", + mobile, sendLogId, MapUtils.convertMap(templateParams)); + params.put("text", MapUtil.builder().put("content", content).build()); + // 执行请求 + String responseText = HttpUtil.post(url, JsonUtils.toJsonString(params)); + // 解析结果 + Map responseObj = JsonUtils.parseObject(responseText, Map.class); + return SmsCommonResult.build(MapUtil.getStr(responseObj, "errcode"), MapUtil.getStr(responseObj, "errorMsg"), + null, new SmsSendRespDTO().setSerialNo(StrUtil.uuid()), codeMapping); + } + + /** + * 构建请求地址 + * + * 参见 https://developers.dingtalk.com/document/app/custom-robot-access/title-nfv-794-g71 文档 + * + * @param path 请求路径 + * @return 请求地址 + */ + @SuppressWarnings("SameParameterValue") + private String buildUrl(String path) { + // 生成 timestamp + long timestamp = System.currentTimeMillis(); + // 生成 sign + String secret = properties.getApiSecret(); + String stringToSign = timestamp + "\n" + secret; + byte[] signData = DigestUtil.hmac(HmacAlgorithm.HmacSHA256, StrUtil.bytes(secret)).digest(stringToSign); + String sign = Base64.encode(signData); + // 构建最终 URL + return String.format("https://oapi.dingtalk.com/%s?access_token=%s×tamp=%d&sign=%s", + path, properties.getApiKey(), timestamp, sign); + } + + @Override + protected List doParseSmsReceiveStatus(String text) throws Throwable { + throw new UnsupportedOperationException("模拟短信客户端,暂时无需解析回调"); + } + + @Override + protected SmsCommonResult doGetSmsTemplate(String apiTemplateId) { + SmsTemplateRespDTO data = new SmsTemplateRespDTO().setId(apiTemplateId).setContent("") + .setAuditStatus(SmsTemplateAuditStatusEnum.SUCCESS.getStatus()).setAuditReason(""); + return SmsCommonResult.build("0", "success", null, data, codeMapping); + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/impl/tencent/TencentSmsChannelProperties.java b/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/impl/tencent/TencentSmsChannelProperties.java new file mode 100644 index 0000000..8c92c67 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/impl/tencent/TencentSmsChannelProperties.java @@ -0,0 +1,41 @@ +package com.win.framework.sms.core.client.impl.tencent; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.lang.Assert; +import com.win.framework.sms.core.property.SmsChannelProperties; +import lombok.Data; + +/** + * 腾讯云短信配置实现类 + * 腾讯云发送短信时,需要额外的参数 sdkAppId, + * + * @author shiwp + */ +@Data +public class TencentSmsChannelProperties extends SmsChannelProperties { + + /** + * 应用 id + */ + private String sdkAppId; + + /** + * 考虑到不破坏原有的 apiKey + apiSecret 的结构, + * 所以腾讯云短信存储时,将 secretId 拼接到 apiKey 字段中,格式为 "secretId sdkAppId"。 + * 因此在使用时,需要将 secretId 和 sdkAppId 解析出来,分别存储到对应字段中。 + */ + public static TencentSmsChannelProperties build(SmsChannelProperties properties) { + if (properties instanceof TencentSmsChannelProperties) { + return (TencentSmsChannelProperties) properties; + } + TencentSmsChannelProperties result = BeanUtil.toBean(properties, TencentSmsChannelProperties.class); + String combineKey = properties.getApiKey(); + Assert.notEmpty(combineKey, "apiKey 不能为空"); + String[] keys = combineKey.trim().split(" "); + Assert.isTrue(keys.length == 2, "腾讯云短信 apiKey 配置格式错误,请配置 为[secretId sdkAppId]"); + Assert.notBlank(keys[0], "腾讯云短信 secretId 不能为空"); + Assert.notBlank(keys[1], "腾讯云短信 sdkAppId 不能为空"); + result.setSdkAppId(keys[1]).setApiKey(keys[0]); + return result; + } +} diff --git a/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/impl/tencent/TencentSmsClient.java b/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/impl/tencent/TencentSmsClient.java new file mode 100644 index 0000000..40391de --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/impl/tencent/TencentSmsClient.java @@ -0,0 +1,302 @@ +package com.win.framework.sms.core.client.impl.tencent; + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.core.KeyValue; +import com.win.framework.common.util.collection.ArrayUtils; +import com.win.framework.common.util.collection.CollectionUtils; +import com.win.framework.common.util.json.JsonUtils; +import com.win.framework.sms.core.client.SmsCommonResult; +import com.win.framework.sms.core.client.dto.SmsReceiveRespDTO; +import com.win.framework.sms.core.client.dto.SmsSendRespDTO; +import com.win.framework.sms.core.client.dto.SmsTemplateRespDTO; +import com.win.framework.sms.core.client.impl.AbstractSmsClient; +import com.win.framework.sms.core.enums.SmsTemplateAuditStatusEnum; +import com.win.framework.sms.core.property.SmsChannelProperties; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.common.annotations.VisibleForTesting; +import com.tencentcloudapi.common.Credential; +import com.tencentcloudapi.common.exception.TencentCloudSDKException; +import com.tencentcloudapi.sms.v20210111.SmsClient; +import com.tencentcloudapi.sms.v20210111.models.*; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.function.Function; +import java.util.function.Supplier; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; +import static com.win.framework.common.util.date.DateUtils.TIME_ZONE_DEFAULT; + +/** + * 腾讯云短信功能实现 + *

+ * 参见 https://cloud.tencent.com/document/product/382/52077 + * + * @author shiwp + */ +public class TencentSmsClient extends AbstractSmsClient { + + /** + * 调用成功 code + */ + public static final String API_SUCCESS_CODE = "Ok"; + + /** + * REGION,使用南京 + */ + private static final String ENDPOINT = "ap-nanjing"; + + /** + * 是否国际/港澳台短信: + * 0:表示国内短信。 + * 1:表示国际/港澳台短信。 + */ + private static final long INTERNATIONAL = 0L; + + private SmsClient client; + + public TencentSmsClient(SmsChannelProperties properties) { + super(properties, new TencentSmsCodeMapping()); + Assert.notEmpty(properties.getApiSecret(), "apiSecret 不能为空"); + } + + @Override + protected void doInit() { + // 实例化一个认证对象,入参需要传入腾讯云账户密钥对 secretId,secretKey + Credential credential = new Credential(properties.getApiKey(), properties.getApiSecret()); + client = new SmsClient(credential, ENDPOINT); + } + + @Override + protected SmsCommonResult doSendSms(Long sendLogId, + String mobile, + String apiTemplateId, + List> templateParams) throws Throwable { + return invoke(() -> buildSendSmsRequest(sendLogId, mobile, apiTemplateId, templateParams), + this::doSendSms0, + response -> { + SendStatus sendStatus = response.getSendStatusSet()[0]; + return SmsCommonResult.build(sendStatus.getCode(), sendStatus.getMessage(), response.getRequestId(), + new SmsSendRespDTO().setSerialNo(sendStatus.getSerialNo()), codeMapping); + }); + } + + + /** + * 腾讯云发放短信的时候,需要额外的参数 sdkAppId。 + * 考虑到不破坏原有的 apiKey + apiSecret 的结构,所以将 secretId 拼接到 apiKey 字段中,格式为 "secretId sdkAppId"。 + * 因此,这边需要使用 TencentSmsChannelProperties 做拆分,重新封装到 properties 内。 + * + * @param properties 数据库中存储的短信渠道配置 + * @return TencentSmsChannelProperties + */ + @Override + protected SmsChannelProperties prepareProperties(SmsChannelProperties properties) { + return TencentSmsChannelProperties.build(properties); + } + + /** + * 调用腾讯云 SDK 发送短信 + * + * @param request 发送短信请求 + * @return 发送短信响应 + * @throws TencentCloudSDKException SDK 用来封装发送短信失败 + */ + private SendSmsResponse doSendSms0(SendSmsRequest request) throws TencentCloudSDKException { + return client.SendSms(request); + } + + /** + * 封装腾讯云发送短信请求 + * + * @param sendLogId 日志编号 + * @param mobile 手机号 + * @param apiTemplateId 短信 API 的模板编号 + * @param templateParams 短信模板参数。通过 List 数组,保证参数的顺序 + * @return 腾讯云发送短信请求 + */ + private SendSmsRequest buildSendSmsRequest(Long sendLogId, + String mobile, + String apiTemplateId, + List> templateParams) { + SendSmsRequest request = new SendSmsRequest(); + request.setSmsSdkAppId(((TencentSmsChannelProperties) properties).getSdkAppId()); + request.setPhoneNumberSet(new String[]{mobile}); + request.setSignName(properties.getSignature()); + request.setTemplateId(apiTemplateId); + request.setTemplateParamSet(ArrayUtils.toArray(templateParams, e -> String.valueOf(e.getValue()))); + request.setSessionContext(JsonUtils.toJsonString(new SessionContext().setLogId(sendLogId))); + return request; + } + + @Override + protected List doParseSmsReceiveStatus(String text) throws Throwable { + List callback = JsonUtils.parseArray(text, SmsReceiveStatus.class); + return CollectionUtils.convertList(callback, status -> { + SmsReceiveRespDTO data = new SmsReceiveRespDTO(); + data.setErrorCode(status.getErrCode()).setErrorMsg(status.getDescription()); + data.setReceiveTime(status.getReceiveTime()).setSuccess(SmsReceiveStatus.SUCCESS_CODE.equalsIgnoreCase(status.getStatus())); + data.setMobile(status.getMobile()).setSerialNo(status.getSerialNo()); + SessionContext context; + Long logId; + Assert.notNull(context = status.getSessionContext(), "回执信息中未解析出 context,请联系腾讯云小助手"); + Assert.notNull(logId = context.getLogId(), "回执信息中未解析出 logId,请联系腾讯云小助手"); + data.setLogId(logId); + return data; + }); + } + + @Override + protected SmsCommonResult doGetSmsTemplate(String apiTemplateId) throws Throwable { + return invoke(() -> this.buildSmsTemplateStatusRequest(apiTemplateId), + this::doGetSmsTemplate0, + response -> { + SmsTemplateRespDTO data = convertTemplateStatusDTO(response.getDescribeTemplateStatusSet()[0]); + return SmsCommonResult.build(API_SUCCESS_CODE, null, response.getRequestId(), data, codeMapping); + }); + } + + @VisibleForTesting + SmsTemplateRespDTO convertTemplateStatusDTO(DescribeTemplateListStatus templateStatus) { + if (templateStatus == null) { + return null; + } + SmsTemplateAuditStatusEnum auditStatus; + Assert.notNull(templateStatus.getStatusCode(), + StrUtil.format("短信模版审核状态为 null,模版 id{}", templateStatus.getTemplateId())); + switch (templateStatus.getStatusCode().intValue()) { + case -1: + auditStatus = SmsTemplateAuditStatusEnum.FAIL; + break; + case 0: + auditStatus = SmsTemplateAuditStatusEnum.SUCCESS; + break; + case 1: + auditStatus = SmsTemplateAuditStatusEnum.CHECKING; + break; + default: + throw new IllegalStateException(StrUtil.format("不能解析短信模版审核状态{},模版 id{}", + templateStatus.getStatusCode(), templateStatus.getTemplateId())); + } + SmsTemplateRespDTO data = new SmsTemplateRespDTO(); + data.setId(String.valueOf(templateStatus.getTemplateId())).setContent(templateStatus.getTemplateContent()); + data.setAuditStatus(auditStatus.getStatus()).setAuditReason(templateStatus.getReviewReply()); + return data; + } + + /** + * 封装查询模版审核状态请求 + * @param apiTemplateId api 的模版 id + * @return 查询模版审核状态请求 + */ + private DescribeSmsTemplateListRequest buildSmsTemplateStatusRequest(String apiTemplateId) { + DescribeSmsTemplateListRequest request = new DescribeSmsTemplateListRequest(); + request.setTemplateIdSet(new Long[]{Long.parseLong(apiTemplateId)}); + // 地区 0:表示国内短信。1:表示国际/港澳台短信。 + request.setInternational(INTERNATIONAL); + return request; + } + + /** + * 调用腾讯云 SDK 查询短信模版状态 + * + * @param request 查询短信模版状态请求 + * @return 查询短信模版状态响应 + * @throws TencentCloudSDKException SDK 用来封装查询短信模版状态失败 + */ + private DescribeSmsTemplateListResponse doGetSmsTemplate0(DescribeSmsTemplateListRequest request) throws TencentCloudSDKException { + return client.DescribeSmsTemplateList(request); + } + + SmsCommonResult invoke(Supplier requestSupplier, + SdkFunction responseSupplier, + Function> resultGen) { + // 构建请求body + Q request = requestSupplier.get(); + P response; + // 调用腾讯云发送短信 + try { + response = responseSupplier.apply(request); + } catch (TencentCloudSDKException e) { + // 调用异常,封装结果 + return SmsCommonResult.build(e.getErrorCode(), e.getMessage(), e.getRequestId(), null, codeMapping); + } + return resultGen.apply(response); + } + + @Data + private static class SmsReceiveStatus { + + /** + * 短信接受成功 code + */ + public static final String SUCCESS_CODE = "SUCCESS"; + + /** + * 用户实际接收到短信的时间 + */ + @JsonProperty("user_receive_time") + @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, timezone = TIME_ZONE_DEFAULT) + private LocalDateTime receiveTime; + + /** + * 国家(或地区)码 + */ + @JsonProperty("nationcode") + private String nationCode; + + /** + * 手机号码 + */ + private String mobile; + + /** + * 实际是否收到短信接收状态,SUCCESS(成功)、FAIL(失败) + */ + @JsonProperty("report_status") + private String status; + + /** + * 用户接收短信状态码错误信息 + */ + @JsonProperty("errmsg") + private String errCode; + + /** + * 用户接收短信状态描述 + */ + @JsonProperty("description") + private String description; + + /** + * 本次发送标识 ID(与发送接口返回的SerialNo对应) + */ + @JsonProperty("sid") + private String serialNo; + + /** + * 用户的 session 内容(与发送接口的请求参数SessionContext一致) + */ + @JsonProperty("ext") + private SessionContext sessionContext; + + } + + @VisibleForTesting + @Data + static class SessionContext { + + /** + * 发送短信记录id + */ + private Long logId; + } + + private interface SdkFunction { + R apply(T t) throws TencentCloudSDKException; + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/impl/tencent/TencentSmsCodeMapping.java b/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/impl/tencent/TencentSmsCodeMapping.java new file mode 100644 index 0000000..780538f --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/impl/tencent/TencentSmsCodeMapping.java @@ -0,0 +1,50 @@ +package com.win.framework.sms.core.client.impl.tencent; + +import com.win.framework.common.exception.ErrorCode; +import com.win.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.win.framework.sms.core.client.SmsCodeMapping; +import com.win.framework.sms.core.enums.SmsFrameworkErrorCodeConstants; + +import static com.win.framework.sms.core.enums.SmsFrameworkErrorCodeConstants.*; + +/** + * 腾讯云的 SmsCodeMapping 实现类 + * + * 参见 https://cloud.tencent.com/document/api/382/52075#.E5.85.AC.E5.85.B1.E9.94.99.E8.AF.AF.E7.A0.81 + * + * @author : shiwp + */ +public class TencentSmsCodeMapping implements SmsCodeMapping { + + @Override + public ErrorCode apply(String apiCode) { + switch (apiCode) { + case TencentSmsClient.API_SUCCESS_CODE: return GlobalErrorCodeConstants.SUCCESS; + case "FailedOperation.ContainSensitiveWord": return SMS_SEND_CONTENT_INVALID; + case "FailedOperation.JsonParseFail": + case "MissingParameter.EmptyPhoneNumberSet": + case "LimitExceeded.PhoneNumberCountLimit": + case "FailedOperation.FailResolvePacket": return GlobalErrorCodeConstants.BAD_REQUEST; + case "FailedOperation.InsufficientBalanceInSmsPackage": return SMS_ACCOUNT_MONEY_NOT_ENOUGH; + case "FailedOperation.MarketingSendTimeConstraint": return SMS_SEND_MARKET_LIMIT_CONTROL; + case "FailedOperation.PhoneNumberInBlacklist": return SMS_MOBILE_BLACK; + case "FailedOperation.SignatureIncorrectOrUnapproved": return SMS_SIGN_INVALID; + case "FailedOperation.MissingTemplateToModify": + case "FailedOperation.TemplateIncorrectOrUnapproved": return SMS_TEMPLATE_INVALID; + case "InvalidParameterValue.IncorrectPhoneNumber": return SMS_MOBILE_INVALID; + case "InvalidParameterValue.SdkAppIdNotExist": return SMS_APP_ID_INVALID; + case "InvalidParameterValue.TemplateParameterLengthLimit": + case "InvalidParameterValue.TemplateParameterFormatError": return SMS_TEMPLATE_PARAM_ERROR; + case "LimitExceeded.PhoneNumberDailyLimit": return SMS_SEND_DAY_LIMIT_CONTROL; + case "LimitExceeded.PhoneNumberThirtySecondLimit": + case "LimitExceeded.PhoneNumberOneHourLimit": return SMS_SEND_BUSINESS_LIMIT_CONTROL; + case "UnauthorizedOperation.RequestPermissionDeny": + case "FailedOperation.ForbidAddMarketingTemplates": + case "FailedOperation.NotEnterpriseCertification": + case "UnauthorizedOperation.IndividualUserMarketingSmsPermissionDeny": return SMS_PERMISSION_DENY; + case "UnauthorizedOperation.RequestIpNotInWhitelist": return SMS_IP_DENY; + case "AuthFailure.SecretIdNotFound": return SMS_ACCOUNT_INVALID; + } + return SmsFrameworkErrorCodeConstants.SMS_UNKNOWN; + } +} \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/enums/SmsChannelEnum.java b/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/enums/SmsChannelEnum.java new file mode 100644 index 0000000..28a2564 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/enums/SmsChannelEnum.java @@ -0,0 +1,36 @@ +package com.win.framework.sms.core.enums; + +import cn.hutool.core.util.ArrayUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 短信渠道枚举 + * + * @author zzf + * @since 2021/1/25 10:56 + */ +@Getter +@AllArgsConstructor +public enum SmsChannelEnum { + + DEBUG_DING_TALK("DEBUG_DING_TALK", "调试(钉钉)"), + ALIYUN("ALIYUN", "阿里云"), + TENCENT("TENCENT", "腾讯云"), +// HUA_WEI("HUA_WEI", "华为云"), + ; + + /** + * 编码 + */ + private final String code; + /** + * 名字 + */ + private final String name; + + public static SmsChannelEnum getByCode(String code) { + return ArrayUtil.firstMatch(o -> o.getCode().equals(code), values()); + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/enums/SmsFrameworkErrorCodeConstants.java b/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/enums/SmsFrameworkErrorCodeConstants.java new file mode 100644 index 0000000..995862f --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/enums/SmsFrameworkErrorCodeConstants.java @@ -0,0 +1,50 @@ +package com.win.framework.sms.core.enums; + +import com.win.framework.common.exception.ErrorCode; + +/** + * 短信框架的错误码枚举 + * + * 短信框架,使用 2-001-000-000 段 + * + * @author 闻荫源码 + */ +public interface SmsFrameworkErrorCodeConstants { + + ErrorCode SMS_UNKNOWN = new ErrorCode(2001000000, "未知错误,需要解析"); + + // ========== 权限 / 限流等相关 2001000100 ========== + + ErrorCode SMS_PERMISSION_DENY = new ErrorCode(2001000100, "没有发送短信的权限"); + ErrorCode SMS_IP_DENY = new ErrorCode(2001000100, "IP 不允许发送短信"); + + // 阿里云:将短信发送频率限制在正常的业务限流范围内。默认短信验证码:使用同一签名,对同一个手机号验证码,支持 1 条 / 分钟,5 条 / 小时,累计 10 条 / 天。 + ErrorCode SMS_SEND_BUSINESS_LIMIT_CONTROL = new ErrorCode(2001000102, "指定手机的发送限流"); + // 阿里云:已经达到您在控制台设置的短信日发送量限额值。在国内消息设置 > 安全设置,修改发送总量阈值。 + ErrorCode SMS_SEND_DAY_LIMIT_CONTROL = new ErrorCode(2001000103, "每天的发送限流"); + + ErrorCode SMS_SEND_CONTENT_INVALID = new ErrorCode(2001000104, "短信内容有敏感词"); + + // 腾讯云:为避免骚扰用户,营销短信只允许在8点到22点发送。 + ErrorCode SMS_SEND_MARKET_LIMIT_CONTROL = new ErrorCode(2001000105, "营销短信发送时间限制"); + + // ========== 模板相关 2001000200 ========== + ErrorCode SMS_TEMPLATE_INVALID = new ErrorCode(2001000200, "短信模板不合法"); // 包括短信模板不存在 + ErrorCode SMS_TEMPLATE_PARAM_ERROR = new ErrorCode(2001000201, "模板参数不正确"); + + // ========== 签名相关 2001000300 ========== + ErrorCode SMS_SIGN_INVALID = new ErrorCode(2001000300, "短信签名不可用"); + + // ========== 账户相关 2001000400 ========== + ErrorCode SMS_ACCOUNT_MONEY_NOT_ENOUGH = new ErrorCode(2001000400, "账户余额不足"); + ErrorCode SMS_ACCOUNT_INVALID = new ErrorCode(2001000401, "apiKey 不存在"); + + // ========== 其它相关 2001000900 开头 ========== + ErrorCode SMS_API_PARAM_ERROR = new ErrorCode(2001000900, "请求参数缺失"); + ErrorCode SMS_MOBILE_INVALID = new ErrorCode(2001000901, "手机格式不正确"); + ErrorCode SMS_MOBILE_BLACK = new ErrorCode(2001000902, "手机号在黑名单中"); + ErrorCode SMS_APP_ID_INVALID = new ErrorCode(2001000903, "SdkAppId不合法"); + + ErrorCode EXCEPTION = new ErrorCode(2001000999, "调用异常"); + +} diff --git a/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/enums/SmsTemplateAuditStatusEnum.java b/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/enums/SmsTemplateAuditStatusEnum.java new file mode 100644 index 0000000..8497121 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/enums/SmsTemplateAuditStatusEnum.java @@ -0,0 +1,21 @@ +package com.win.framework.sms.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 短信模板的审核状态枚举 + * + * @author 闻荫源码 + */ +@AllArgsConstructor +@Getter +public enum SmsTemplateAuditStatusEnum { + + CHECKING(1), + SUCCESS(2), + FAIL(3); + + private final Integer status; + +} diff --git a/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/property/SmsChannelProperties.java b/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/property/SmsChannelProperties.java new file mode 100644 index 0000000..0d16629 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/property/SmsChannelProperties.java @@ -0,0 +1,52 @@ +package com.win.framework.sms.core.property; + +import com.win.framework.sms.core.enums.SmsChannelEnum; +import lombok.Data; +import org.springframework.validation.annotation.Validated; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +/** + * 短信渠道配置类 + * + * @author zzf + * @since 2021/1/25 17:01 + */ +@Data +@Validated +public class SmsChannelProperties { + + /** + * 渠道编号 + */ + @NotNull(message = "短信渠道 ID 不能为空") + private Long id; + /** + * 短信签名 + */ + @NotEmpty(message = "短信签名不能为空") + private String signature; + /** + * 渠道编码 + * + * 枚举 {@link SmsChannelEnum} + */ + @NotEmpty(message = "渠道编码不能为空") + private String code; + /** + * 短信 API 的账号 + */ + @NotEmpty(message = "短信 API 的账号不能为空") + private String apiKey; + /** + * 短信 API 的密钥 + */ + @NotEmpty(message = "短信 API 的密钥不能为空") + private String apiSecret; + /** + * 短信发送回调 URL + */ + private String callbackUrl; + +} diff --git a/win-framework/win-spring-boot-starter-biz-sms/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/win-framework/win-spring-boot-starter-biz-sms/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..e1661ff --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-sms/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +com.win.framework.sms.config.WinSmsAutoConfiguration \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-biz-tenant/pom.xml b/win-framework/win-spring-boot-starter-biz-tenant/pom.xml new file mode 100644 index 0000000..00b6344 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-tenant/pom.xml @@ -0,0 +1,67 @@ + + + + com.win + win-framework + ${revision} + + 4.0.0 + win-spring-boot-starter-biz-tenant + jar + + ${project.artifactId} + 多租户 + https://github.com/YunaiV/ruoyi-vue-pro + + + + com.win + win-common + + + + + com.win + win-spring-boot-starter-security + + + + + com.win + win-spring-boot-starter-mybatis + + + + com.win + win-spring-boot-starter-redis + + + + + com.win + win-spring-boot-starter-job + + + + + com.win + win-spring-boot-starter-mq + + + + + com.win + win-spring-boot-starter-test + test + + + + + com.google.guava + guava + + + + diff --git a/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/config/TenantProperties.java b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/config/TenantProperties.java new file mode 100644 index 0000000..04b2139 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/config/TenantProperties.java @@ -0,0 +1,42 @@ +package com.win.framework.tenant.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +import java.util.Collections; +import java.util.Set; + +/** + * 多租户配置 + * + * @author 闻荫源码 + */ +@ConfigurationProperties(prefix = "win.tenant") +@Data +public class TenantProperties { + + /** + * 租户是否开启 + */ + private static final Boolean ENABLE_DEFAULT = true; + + /** + * 是否开启 + */ + private Boolean enable = ENABLE_DEFAULT; + + /** + * 需要忽略多租户的请求 + * + * 默认情况下,每个请求需要带上 tenant-id 的请求头。但是,部分请求是无需带上的,例如说短信回调、支付回调等 Open API! + */ + private Set ignoreUrls = Collections.emptySet(); + + /** + * 需要忽略多租户的表 + * + * 即默认所有表都开启多租户的功能,所以记得添加对应的 tenant_id 字段哟 + */ + private Set ignoreTables = Collections.emptySet(); + +} diff --git a/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/config/WinTenantAutoConfiguration.java b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/config/WinTenantAutoConfiguration.java new file mode 100644 index 0000000..1f94625 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/config/WinTenantAutoConfiguration.java @@ -0,0 +1,117 @@ +package com.win.framework.tenant.config; + +import com.win.framework.common.enums.WebFilterOrderEnum; +import com.win.framework.mybatis.core.util.MyBatisUtils; +import com.win.framework.redis.config.WinCacheProperties; +import com.win.framework.tenant.core.aop.TenantIgnoreAspect; +import com.win.framework.tenant.core.db.TenantDatabaseInterceptor; +import com.win.framework.tenant.core.job.TenantJobAspect; +import com.win.framework.tenant.core.mq.TenantRedisMessageInterceptor; +import com.win.framework.tenant.core.redis.TenantRedisCacheManager; +import com.win.framework.tenant.core.security.TenantSecurityWebFilter; +import com.win.framework.tenant.core.service.TenantFrameworkService; +import com.win.framework.tenant.core.service.TenantFrameworkServiceImpl; +import com.win.framework.tenant.core.web.TenantContextWebFilter; +import com.win.framework.web.config.WebProperties; +import com.win.framework.web.core.handler.GlobalExceptionHandler; +import com.win.module.system.api.tenant.TenantApi; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Primary; +import org.springframework.data.redis.cache.BatchStrategies; +import org.springframework.data.redis.cache.RedisCacheConfiguration; +import org.springframework.data.redis.cache.RedisCacheManager; +import org.springframework.data.redis.cache.RedisCacheWriter; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; + +import java.util.Objects; + +@AutoConfiguration +@ConditionalOnProperty(prefix = "win.tenant", value = "enable", matchIfMissing = true) // 允许使用 win.tenant.enable=false 禁用多租户 +@EnableConfigurationProperties(TenantProperties.class) +public class WinTenantAutoConfiguration { + + @Bean + public TenantFrameworkService tenantFrameworkService(TenantApi tenantApi) { + return new TenantFrameworkServiceImpl(tenantApi); + } + + // ========== AOP ========== + + @Bean + public TenantIgnoreAspect tenantIgnoreAspect() { + return new TenantIgnoreAspect(); + } + + // ========== DB ========== + + @Bean + public TenantLineInnerInterceptor tenantLineInnerInterceptor(TenantProperties properties, + MybatisPlusInterceptor interceptor) { + TenantLineInnerInterceptor inner = new TenantLineInnerInterceptor(new TenantDatabaseInterceptor(properties)); + // 添加到 interceptor 中 + // 需要加在首个,主要是为了在分页插件前面。这个是 MyBatis Plus 的规定 + MyBatisUtils.addInterceptor(interceptor, inner, 0); + return inner; + } + + // ========== WEB ========== + + @Bean + public FilterRegistrationBean tenantContextWebFilter() { + FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); + registrationBean.setFilter(new TenantContextWebFilter()); + registrationBean.setOrder(WebFilterOrderEnum.TENANT_CONTEXT_FILTER); + return registrationBean; + } + + // ========== Security ========== + + @Bean + public FilterRegistrationBean tenantSecurityWebFilter(TenantProperties tenantProperties, + WebProperties webProperties, + GlobalExceptionHandler globalExceptionHandler, + TenantFrameworkService tenantFrameworkService) { + FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); + registrationBean.setFilter(new TenantSecurityWebFilter(tenantProperties, webProperties, + globalExceptionHandler, tenantFrameworkService)); + registrationBean.setOrder(WebFilterOrderEnum.TENANT_SECURITY_FILTER); + return registrationBean; + } + + // ========== MQ ========== + + @Bean + public TenantRedisMessageInterceptor tenantRedisMessageInterceptor() { + return new TenantRedisMessageInterceptor(); + } + + // ========== Job ========== + + @Bean + public TenantJobAspect tenantJobAspect(TenantFrameworkService tenantFrameworkService) { + return new TenantJobAspect(tenantFrameworkService); + } + + // ========== Redis ========== + + @Bean + @Primary // 引入租户时,tenantRedisCacheManager 为主 Bean + public RedisCacheManager tenantRedisCacheManager(RedisTemplate redisTemplate, + RedisCacheConfiguration redisCacheConfiguration, + WinCacheProperties winCacheProperties) { + // 创建 RedisCacheWriter 对象 + RedisConnectionFactory connectionFactory = Objects.requireNonNull(redisTemplate.getConnectionFactory()); + RedisCacheWriter cacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(connectionFactory, + BatchStrategies.scan(winCacheProperties.getRedisScanBatchSize())); + // 创建 TenantRedisCacheManager 对象 + return new TenantRedisCacheManager(cacheWriter, redisCacheConfiguration); + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/aop/TenantIgnore.java b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/aop/TenantIgnore.java new file mode 100644 index 0000000..b8f8a0d --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/aop/TenantIgnore.java @@ -0,0 +1,18 @@ +package com.win.framework.tenant.core.aop; + +import java.lang.annotation.*; + +/** + * 忽略租户,标记指定方法不进行租户的自动过滤 + * + * 注意,只有 DB 的场景会过滤,其它场景暂时不过滤: + * 1、Redis 场景:因为是基于 Key 实现多租户的能力,所以忽略没有意义,不像 DB 是一个 column 实现的 + * 2、MQ 场景:有点难以抉择,目前可以通过 Consumer 手动在消费的方法上,添加 @TenantIgnore 进行忽略 + * + * @author 闻荫源码 + */ +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Inherited +public @interface TenantIgnore { +} diff --git a/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/aop/TenantIgnoreAspect.java b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/aop/TenantIgnoreAspect.java new file mode 100644 index 0000000..abda362 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/aop/TenantIgnoreAspect.java @@ -0,0 +1,35 @@ +package com.win.framework.tenant.core.aop; + +import com.win.framework.tenant.core.context.TenantContextHolder; +import com.win.framework.tenant.core.util.TenantUtils; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; + +/** + * 忽略多租户的 Aspect,基于 {@link TenantIgnore} 注解实现,用于一些全局的逻辑。 + * 例如说,一个定时任务,读取所有数据,进行处理。 + * 又例如说,读取所有数据,进行缓存。 + * + * 整体逻辑的实现,和 {@link TenantUtils#executeIgnore(Runnable)} 需要保持一致 + * + * @author 闻荫源码 + */ +@Aspect +@Slf4j +public class TenantIgnoreAspect { + + @Around("@annotation(tenantIgnore)") + public Object around(ProceedingJoinPoint joinPoint, TenantIgnore tenantIgnore) throws Throwable { + Boolean oldIgnore = TenantContextHolder.isIgnore(); + try { + TenantContextHolder.setIgnore(true); + // 执行逻辑 + return joinPoint.proceed(); + } finally { + TenantContextHolder.setIgnore(oldIgnore); + } + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/context/TenantContextHolder.java b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/context/TenantContextHolder.java new file mode 100644 index 0000000..9814f8a --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/context/TenantContextHolder.java @@ -0,0 +1,68 @@ +package com.win.framework.tenant.core.context; + +import com.win.framework.common.enums.DocumentEnum; +import com.alibaba.ttl.TransmittableThreadLocal; + +/** + * 多租户上下文 Holder + * + * @author 闻荫源码 + */ +public class TenantContextHolder { + + /** + * 当前租户编号 + */ + private static final ThreadLocal TENANT_ID = new TransmittableThreadLocal<>(); + + /** + * 是否忽略租户 + */ + private static final ThreadLocal IGNORE = new TransmittableThreadLocal<>(); + + /** + * 获得租户编号。 + * + * @return 租户编号 + */ + public static Long getTenantId() { + return TENANT_ID.get(); + } + + /** + * 获得租户编号。如果不存在,则抛出 NullPointerException 异常 + * + * @return 租户编号 + */ + public static Long getRequiredTenantId() { + Long tenantId = getTenantId(); + if (tenantId == null) { + throw new NullPointerException("TenantContextHolder 不存在租户编号!可参考文档:" + + DocumentEnum.TENANT.getUrl()); + } + return tenantId; + } + + public static void setTenantId(Long tenantId) { + TENANT_ID.set(tenantId); + } + + public static void setIgnore(Boolean ignore) { + IGNORE.set(ignore); + } + + /** + * 当前是否忽略租户 + * + * @return 是否忽略 + */ + public static boolean isIgnore() { + return Boolean.TRUE.equals(IGNORE.get()); + } + + public static void clear() { + TENANT_ID.remove(); + IGNORE.remove(); + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/db/TenantBaseDO.java b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/db/TenantBaseDO.java new file mode 100644 index 0000000..5968e3d --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/db/TenantBaseDO.java @@ -0,0 +1,21 @@ +package com.win.framework.tenant.core.db; + +import com.win.framework.mybatis.core.dataobject.BaseDO; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 拓展多租户的 BaseDO 基类 + * + * @author 闻荫源码 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public abstract class TenantBaseDO extends BaseDO { + + /** + * 多租户编号 + */ + private Long tenantId; + +} diff --git a/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/db/TenantDatabaseInterceptor.java b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/db/TenantDatabaseInterceptor.java new file mode 100644 index 0000000..e893ae2 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/db/TenantDatabaseInterceptor.java @@ -0,0 +1,43 @@ +package com.win.framework.tenant.core.db; + +import cn.hutool.core.collection.CollUtil; +import com.win.framework.tenant.config.TenantProperties; +import com.win.framework.tenant.core.context.TenantContextHolder; +import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler; +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.expression.LongValue; + +import java.util.HashSet; +import java.util.Set; + +/** + * 基于 MyBatis Plus 多租户的功能,实现 DB 层面的多租户的功能 + * + * @author 闻荫源码 + */ +public class TenantDatabaseInterceptor implements TenantLineHandler { + + private final Set ignoreTables = new HashSet<>(); + + public TenantDatabaseInterceptor(TenantProperties properties) { + // 不同 DB 下,大小写的习惯不同,所以需要都添加进去 + properties.getIgnoreTables().forEach(table -> { + ignoreTables.add(table.toLowerCase()); + ignoreTables.add(table.toUpperCase()); + }); + // 在 OracleKeyGenerator 中,生成主键时,会查询这个表,查询这个表后,会自动拼接 TENANT_ID 导致报错 + ignoreTables.add("DUAL"); + } + + @Override + public Expression getTenantId() { + return new LongValue(TenantContextHolder.getRequiredTenantId()); + } + + @Override + public boolean ignoreTable(String tableName) { + return TenantContextHolder.isIgnore() // 情况一,全局忽略多租户 + || CollUtil.contains(ignoreTables, tableName); // 情况二,忽略多租户的表 + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/job/TenantJob.java b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/job/TenantJob.java new file mode 100644 index 0000000..15c129a --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/job/TenantJob.java @@ -0,0 +1,14 @@ +package com.win.framework.tenant.core.job; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 多租户 Job 注解 + */ +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface TenantJob { +} diff --git a/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/job/TenantJobAspect.java b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/job/TenantJobAspect.java new file mode 100644 index 0000000..17ce4f1 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/job/TenantJobAspect.java @@ -0,0 +1,56 @@ +package com.win.framework.tenant.core.job; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.exceptions.ExceptionUtil; +import com.win.framework.common.util.json.JsonUtils; +import com.win.framework.tenant.core.service.TenantFrameworkService; +import com.win.framework.tenant.core.util.TenantUtils; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 多租户 JobHandler AOP + * 任务执行时,会按照租户逐个执行 Job 的逻辑 + * + * 注意,需要保证 JobHandler 的幂等性。因为 Job 因为某个租户执行失败重试时,之前执行成功的租户也会再次执行。 + * + * @author 闻荫源码 + */ +@Aspect +@RequiredArgsConstructor +@Slf4j +public class TenantJobAspect { + + private final TenantFrameworkService tenantFrameworkService; + + @Around("@annotation(tenantJob)") + public String around(ProceedingJoinPoint joinPoint, TenantJob tenantJob) { + // 获得租户列表 + List tenantIds = tenantFrameworkService.getTenantIds(); + if (CollUtil.isEmpty(tenantIds)) { + return null; + } + + // 逐个租户,执行 Job + Map results = new ConcurrentHashMap<>(); + tenantIds.parallelStream().forEach(tenantId -> { + // TODO 芋艿:先通过 parallel 实现并行;1)多个租户,是一条执行日志;2)异常的情况 + TenantUtils.execute(tenantId, () -> { + try { + joinPoint.proceed(); + } catch (Throwable e) { + results.put(tenantId, ExceptionUtil.getRootCauseMessage(e)); + } + }); + }); + return JsonUtils.toJsonString(results); + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/mq/TenantRedisMessageInterceptor.java b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/mq/TenantRedisMessageInterceptor.java new file mode 100644 index 0000000..561030e --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/mq/TenantRedisMessageInterceptor.java @@ -0,0 +1,42 @@ +package com.win.framework.tenant.core.mq; + +import cn.hutool.core.util.StrUtil; +import com.win.framework.mq.core.interceptor.RedisMessageInterceptor; +import com.win.framework.mq.core.message.AbstractRedisMessage; +import com.win.framework.tenant.core.context.TenantContextHolder; + +import static com.win.framework.web.core.util.WebFrameworkUtils.HEADER_TENANT_ID; + +/** + * 多租户 {@link AbstractRedisMessage} 拦截器 + * + * 1. Producer 发送消息时,将 {@link TenantContextHolder} 租户编号,添加到消息的 Header 中 + * 2. Consumer 消费消息时,将消息的 Header 的租户编号,添加到 {@link TenantContextHolder} 中 + * + * @author 闻荫源码 + */ +public class TenantRedisMessageInterceptor implements RedisMessageInterceptor { + + @Override + public void sendMessageBefore(AbstractRedisMessage message) { + Long tenantId = TenantContextHolder.getTenantId(); + if (tenantId != null) { + message.addHeader(HEADER_TENANT_ID, tenantId.toString()); + } + } + + @Override + public void consumeMessageBefore(AbstractRedisMessage message) { + String tenantIdStr = message.getHeader(HEADER_TENANT_ID); + if (StrUtil.isNotEmpty(tenantIdStr)) { + TenantContextHolder.setTenantId(Long.valueOf(tenantIdStr)); + } + } + + @Override + public void consumeMessageAfter(AbstractRedisMessage message) { + // 注意,Consumer 是一个逻辑的入口,所以不考虑原本上下文就存在租户编号的情况 + TenantContextHolder.clear(); + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/redis/TenantRedisCacheManager.java b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/redis/TenantRedisCacheManager.java new file mode 100644 index 0000000..5aa2645 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/redis/TenantRedisCacheManager.java @@ -0,0 +1,38 @@ +package com.win.framework.tenant.core.redis; + +import com.win.framework.redis.core.TimeoutRedisCacheManager; +import com.win.framework.tenant.core.context.TenantContextHolder; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.Cache; +import org.springframework.data.redis.cache.RedisCacheConfiguration; +import org.springframework.data.redis.cache.RedisCacheManager; +import org.springframework.data.redis.cache.RedisCacheWriter; + +/** + * 多租户的 {@link RedisCacheManager} 实现类 + * + * 操作指定 name 的 {@link Cache} 时,自动拼接租户后缀,格式为 name + ":" + tenantId + 后缀 + * + * @author airhead + */ +@Slf4j +public class TenantRedisCacheManager extends TimeoutRedisCacheManager { + + public TenantRedisCacheManager(RedisCacheWriter cacheWriter, + RedisCacheConfiguration defaultCacheConfiguration) { + super(cacheWriter, defaultCacheConfiguration); + } + + @Override + public Cache getCache(String name) { + // 如果开启多租户,则 name 拼接租户后缀 + if (!TenantContextHolder.isIgnore() + && TenantContextHolder.getTenantId() != null) { + name = name + ":" + TenantContextHolder.getTenantId(); + } + + // 继续基于父方法 + return super.getCache(name); + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/security/TenantSecurityWebFilter.java b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/security/TenantSecurityWebFilter.java new file mode 100644 index 0000000..6469a1c --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/security/TenantSecurityWebFilter.java @@ -0,0 +1,117 @@ +package com.win.framework.tenant.core.security; + +import cn.hutool.core.collection.CollUtil; +import com.win.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.util.servlet.ServletUtils; +import com.win.framework.security.core.LoginUser; +import com.win.framework.security.core.util.SecurityFrameworkUtils; +import com.win.framework.tenant.config.TenantProperties; +import com.win.framework.tenant.core.context.TenantContextHolder; +import com.win.framework.tenant.core.service.TenantFrameworkService; +import com.win.framework.web.config.WebProperties; +import com.win.framework.web.core.filter.ApiRequestFilter; +import com.win.framework.web.core.handler.GlobalExceptionHandler; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.AntPathMatcher; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.Objects; + +/** + * 多租户 Security Web 过滤器 + * 1. 如果是登陆的用户,校验是否有权限访问该租户,避免越权问题。 + * 2. 如果请求未带租户的编号,检查是否是忽略的 URL,否则也不允许访问。 + * 3. 校验租户是合法,例如说被禁用、到期 + * + * @author 闻荫源码 + */ +@Slf4j +public class TenantSecurityWebFilter extends ApiRequestFilter { + + private final TenantProperties tenantProperties; + + private final AntPathMatcher pathMatcher; + + private final GlobalExceptionHandler globalExceptionHandler; + private final TenantFrameworkService tenantFrameworkService; + + public TenantSecurityWebFilter(TenantProperties tenantProperties, + WebProperties webProperties, + GlobalExceptionHandler globalExceptionHandler, + TenantFrameworkService tenantFrameworkService) { + super(webProperties); + this.tenantProperties = tenantProperties; + this.pathMatcher = new AntPathMatcher(); + this.globalExceptionHandler = globalExceptionHandler; + this.tenantFrameworkService = tenantFrameworkService; + } + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) + throws ServletException, IOException { + Long tenantId = TenantContextHolder.getTenantId(); + // 1. 登陆的用户,校验是否有权限访问该租户,避免越权问题。 + LoginUser user = SecurityFrameworkUtils.getLoginUser(); + if (user != null) { + // 如果获取不到租户编号,则尝试使用登陆用户的租户编号 + if (tenantId == null) { + tenantId = user.getTenantId(); + TenantContextHolder.setTenantId(tenantId); + // 如果传递了租户编号,则进行比对租户编号,避免越权问题 + } else if (!Objects.equals(user.getTenantId(), TenantContextHolder.getTenantId())) { + log.error("[doFilterInternal][租户({}) User({}/{}) 越权访问租户({}) URL({})]", + user.getTenantId(), user.getId(), + TenantContextHolder.getTenantId(), request.getRequestURI(), request.getMethod()); + ServletUtils.writeJSON(response, CommonResult.error(GlobalErrorCodeConstants.FORBIDDEN.getCode(), + "您无权访问该租户的数据")); + return; + } + } + + // 如果非允许忽略租户的 URL,则校验租户是否合法 + if (!isIgnoreUrl(request)) { + // 2. 如果请求未带租户的编号,不允许访问。 + if (tenantId == null) { + log.error("[doFilterInternal][URL({}/{}) 未传递租户编号]", request.getRequestURI(), request.getMethod()); + ServletUtils.writeJSON(response, CommonResult.error(GlobalErrorCodeConstants.BAD_REQUEST.getCode(), + "请求的租户标识未传递,请进行排查")); + return; + } + // 3. 校验租户是合法,例如说被禁用、到期 + try { + tenantFrameworkService.validTenant(tenantId); + } catch (Throwable ex) { + CommonResult result = globalExceptionHandler.allExceptionHandler(request, ex); + ServletUtils.writeJSON(response, result); + return; + } + } else { // 如果是允许忽略租户的 URL,若未传递租户编号,则默认忽略租户编号,避免报错 + if (tenantId == null) { + TenantContextHolder.setIgnore(true); + } + } + + // 继续过滤 + chain.doFilter(request, response); + } + + private boolean isIgnoreUrl(HttpServletRequest request) { + // 快速匹配,保证性能 + if (CollUtil.contains(tenantProperties.getIgnoreUrls(), request.getRequestURI())) { + return true; + } + // 逐个 Ant 路径匹配 + for (String url : tenantProperties.getIgnoreUrls()) { + if (pathMatcher.match(url, request.getRequestURI())) { + return true; + } + } + return false; + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/service/TenantFrameworkService.java b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/service/TenantFrameworkService.java new file mode 100644 index 0000000..df605ef --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/service/TenantFrameworkService.java @@ -0,0 +1,26 @@ +package com.win.framework.tenant.core.service; + +import java.util.List; + +/** + * Tenant 框架 Service 接口,定义获取租户信息 + * + * @author 闻荫源码 + */ +public interface TenantFrameworkService { + + /** + * 获得所有租户 + * + * @return 租户编号数组 + */ + List getTenantIds(); + + /** + * 校验租户是否合法 + * + * @param id 租户编号 + */ + void validTenant(Long id); + +} diff --git a/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/service/TenantFrameworkServiceImpl.java b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/service/TenantFrameworkServiceImpl.java new file mode 100644 index 0000000..f8d9131 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/service/TenantFrameworkServiceImpl.java @@ -0,0 +1,73 @@ +package com.win.framework.tenant.core.service; + +import com.win.framework.common.exception.ServiceException; +import com.win.framework.common.util.cache.CacheUtils; +import com.win.module.system.api.tenant.TenantApi; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; + +import java.time.Duration; +import java.util.List; + +/** + * Tenant 框架 Service 实现类 + * + * @author 闻荫源码 + */ +@RequiredArgsConstructor +public class TenantFrameworkServiceImpl implements TenantFrameworkService { + + private static final ServiceException SERVICE_EXCEPTION_NULL = new ServiceException(); + + private final TenantApi tenantApi; + + /** + * 针对 {@link #getTenantIds()} 的缓存 + */ + private final LoadingCache> getTenantIdsCache = CacheUtils.buildAsyncReloadingCache( + Duration.ofMinutes(1L), // 过期时间 1 分钟 + new CacheLoader>() { + + @Override + public List load(Object key) { + return tenantApi.getTenantIdList(); + } + + }); + + /** + * 针对 {@link #validTenant(Long)} 的缓存 + */ + private final LoadingCache validTenantCache = CacheUtils.buildAsyncReloadingCache( + Duration.ofMinutes(1L), // 过期时间 1 分钟 + new CacheLoader() { + + @Override + public ServiceException load(Long id) { + try { + tenantApi.validateTenant(id); + return SERVICE_EXCEPTION_NULL; + } catch (ServiceException ex) { + return ex; + } + } + + }); + + @Override + @SneakyThrows + public List getTenantIds() { + return getTenantIdsCache.get(Boolean.TRUE); + } + + @Override + public void validTenant(Long id) { + ServiceException serviceException = validTenantCache.getUnchecked(id); + if (serviceException != SERVICE_EXCEPTION_NULL) { + throw serviceException; + } + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/util/TenantUtils.java b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/util/TenantUtils.java new file mode 100644 index 0000000..232781a --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/util/TenantUtils.java @@ -0,0 +1,93 @@ +package com.win.framework.tenant.core.util; + +import com.win.framework.tenant.core.context.TenantContextHolder; + +import java.util.Map; +import java.util.concurrent.Callable; + +import static com.win.framework.web.core.util.WebFrameworkUtils.HEADER_TENANT_ID; + +/** + * 多租户 Util + * + * @author 闻荫源码 + */ +public class TenantUtils { + + /** + * 使用指定租户,执行对应的逻辑 + * + * 注意,如果当前是忽略租户的情况下,会被强制设置成不忽略租户 + * 当然,执行完成后,还是会恢复回去 + * + * @param tenantId 租户编号 + * @param runnable 逻辑 + */ + public static void execute(Long tenantId, Runnable runnable) { + Long oldTenantId = TenantContextHolder.getTenantId(); + Boolean oldIgnore = TenantContextHolder.isIgnore(); + try { + TenantContextHolder.setTenantId(tenantId); + TenantContextHolder.setIgnore(false); + // 执行逻辑 + runnable.run(); + } finally { + TenantContextHolder.setTenantId(oldTenantId); + TenantContextHolder.setIgnore(oldIgnore); + } + } + + /** + * 使用指定租户,执行对应的逻辑 + * + * 注意,如果当前是忽略租户的情况下,会被强制设置成不忽略租户 + * 当然,执行完成后,还是会恢复回去 + * + * @param tenantId 租户编号 + * @param callable 逻辑 + */ + public static V execute(Long tenantId, Callable callable) { + Long oldTenantId = TenantContextHolder.getTenantId(); + Boolean oldIgnore = TenantContextHolder.isIgnore(); + try { + TenantContextHolder.setTenantId(tenantId); + TenantContextHolder.setIgnore(false); + // 执行逻辑 + return callable.call(); + } catch (Exception e) { + throw new RuntimeException(e); + } finally { + TenantContextHolder.setTenantId(oldTenantId); + TenantContextHolder.setIgnore(oldIgnore); + } + } + + /** + * 忽略租户,执行对应的逻辑 + * + * @param runnable 逻辑 + */ + public static void executeIgnore(Runnable runnable) { + Boolean oldIgnore = TenantContextHolder.isIgnore(); + try { + TenantContextHolder.setIgnore(true); + // 执行逻辑 + runnable.run(); + } finally { + TenantContextHolder.setIgnore(oldIgnore); + } + } + + /** + * 将多租户编号,添加到 header 中 + * + * @param headers HTTP 请求 headers + * @param tenantId 租户编号 + */ + public static void addTenantHeader(Map headers, Long tenantId) { + if (tenantId != null) { + headers.put(HEADER_TENANT_ID, tenantId.toString()); + } + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/web/TenantContextWebFilter.java b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/web/TenantContextWebFilter.java new file mode 100644 index 0000000..a2d7b4c --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/web/TenantContextWebFilter.java @@ -0,0 +1,37 @@ +package com.win.framework.tenant.core.web; + +import com.win.framework.tenant.core.context.TenantContextHolder; +import com.win.framework.web.core.util.WebFrameworkUtils; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * 多租户 Context Web 过滤器 + * 将请求 Header 中的 tenant-id 解析出来,添加到 {@link TenantContextHolder} 中,这样后续的 DB 等操作,可以获得到租户编号。 + * + * @author 闻荫源码 + */ +public class TenantContextWebFilter extends OncePerRequestFilter { + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) + throws ServletException, IOException { + // 设置 + Long tenantId = WebFrameworkUtils.getTenantId(request); + if (tenantId != null) { + TenantContextHolder.setTenantId(tenantId); + } + try { + chain.doFilter(request, response); + } finally { + // 清理 + TenantContextHolder.clear(); + } + } + +} diff --git a/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/package-info.java b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/package-info.java new file mode 100644 index 0000000..366df6c --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/package-info.java @@ -0,0 +1,17 @@ +/** + * 多租户,支持如下层面: + * 1. DB:基于 MyBatis Plus 多租户的功能实现。 + * 2. Redis:通过在 Redis Key 上拼接租户编号的方式,进行隔离。 + * 3. Web:请求 HTTP API 时,解析 Header 的 tenant-id 租户编号,添加到租户上下文。 + * 4. Security:校验当前登陆的用户,是否越权访问其它租户的数据。 + * 5. Job:在 JobHandler 执行任务时,会按照每个租户,都独立并行执行一次。 + * 6. MQ:在 Producer 发送消息时,Header 带上 tenant-id 租户编号;在 Consumer 消费消息时,将 Header 的 tenant-id 租户编号,添加到租户上下文。 + * 7. Async:异步需要保证 ThreadLocal 的传递性,通过使用阿里开源的 TransmittableThreadLocal 实现。相关的改造点,可见: + * 1)Spring Async: + * {@link com.win.framework.quartz.config.WinAsyncAutoConfiguration#threadPoolTaskExecutorBeanPostProcessor()} + * 2)Spring Security: + * TransmittableThreadLocalSecurityContextHolderStrategy + * 和 WinSecurityAutoConfiguration#securityContextHolderMethodInvokingFactoryBean() 方法 + * + */ +package com.win.framework.tenant; diff --git a/win-framework/win-spring-boot-starter-biz-tenant/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/win-framework/win-spring-boot-starter-biz-tenant/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..6be41ca --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-tenant/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +com.win.framework.tenant.config.WinTenantAutoConfiguration \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-captcha/pom.xml b/win-framework/win-spring-boot-starter-captcha/pom.xml new file mode 100644 index 0000000..1deabd5 --- /dev/null +++ b/win-framework/win-spring-boot-starter-captcha/pom.xml @@ -0,0 +1,40 @@ + + + + com.win + win-framework + ${revision} + + 4.0.0 + win-spring-boot-starter-captcha + jar + + ${project.artifactId} + 验证码拓展 + 1. 基于 aj-captcha 实现滑块验证码,文档:https://ajcaptcha.beliefteam.cn/captcha-doc/ + + + + + + pro.fessional + kaptcha + + + + + org.springframework.boot + spring-boot-starter + + + + + com.win + win-spring-boot-starter-redis + + + + + diff --git a/win-framework/win-spring-boot-starter-captcha/src/main/java/com/win/framework/captcha/config/CaptchaProperties.java b/win-framework/win-spring-boot-starter-captcha/src/main/java/com/win/framework/captcha/config/CaptchaProperties.java new file mode 100644 index 0000000..d8f3ed4 --- /dev/null +++ b/win-framework/win-spring-boot-starter-captcha/src/main/java/com/win/framework/captcha/config/CaptchaProperties.java @@ -0,0 +1,24 @@ +package com.win.framework.captcha.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +@ConfigurationProperties(prefix = "win.captcha") +@Data +public class CaptchaProperties { + + /** + * 验证码的开关 + */ + private Boolean enable; + + /** + * 验证码类型 math 数组计算 char 字符验证 + */ + private String captchaType; + + /** + * 验证码有效期 + */ + private Integer captchaExpiration; +} diff --git a/win-framework/win-spring-boot-starter-captcha/src/main/java/com/win/framework/captcha/config/KaptchaTextCreator.java b/win-framework/win-spring-boot-starter-captcha/src/main/java/com/win/framework/captcha/config/KaptchaTextCreator.java new file mode 100644 index 0000000..38c424b --- /dev/null +++ b/win-framework/win-spring-boot-starter-captcha/src/main/java/com/win/framework/captcha/config/KaptchaTextCreator.java @@ -0,0 +1,56 @@ +package com.win.framework.captcha.config; + +import com.google.code.kaptcha.text.impl.DefaultTextCreator; + +import java.util.Random; + +/** + * 验证码文本生成器 + * + * @author win + */ +public class KaptchaTextCreator extends DefaultTextCreator { + private static final String[] CNUMBERS = "0,1,2,3,4,5,6,7,8,9,10".split(","); + + @Override + public String getText() { + Integer result = 0; + Random random = new Random(); + int x = random.nextInt(10); + int y = random.nextInt(10); + StringBuilder suChinese = new StringBuilder(); + int randomoperands = random.nextInt(3); + if (randomoperands == 0) { + result = x * y; + suChinese.append(CNUMBERS[x]); + suChinese.append("*"); + suChinese.append(CNUMBERS[y]); + } else if (randomoperands == 1) { + if ((x != 0) && y % x == 0) { + result = y / x; + suChinese.append(CNUMBERS[y]); + suChinese.append("/"); + suChinese.append(CNUMBERS[x]); + } else { + result = x + y; + suChinese.append(CNUMBERS[x]); + suChinese.append("+"); + suChinese.append(CNUMBERS[y]); + } + } else { + if (x >= y) { + result = x - y; + suChinese.append(CNUMBERS[x]); + suChinese.append("-"); + suChinese.append(CNUMBERS[y]); + } else { + result = y - x; + suChinese.append(CNUMBERS[y]); + suChinese.append("-"); + suChinese.append(CNUMBERS[x]); + } + } + suChinese.append("=?@" + result); + return suChinese.toString(); + } +} \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-captcha/src/main/java/com/win/framework/captcha/config/WinCaptchaConfiguration.java b/win-framework/win-spring-boot-starter-captcha/src/main/java/com/win/framework/captcha/config/WinCaptchaConfiguration.java new file mode 100644 index 0000000..4312195 --- /dev/null +++ b/win-framework/win-spring-boot-starter-captcha/src/main/java/com/win/framework/captcha/config/WinCaptchaConfiguration.java @@ -0,0 +1,77 @@ +package com.win.framework.captcha.config; + +import com.google.code.kaptcha.impl.DefaultKaptcha; +import com.google.code.kaptcha.util.Config; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.context.annotation.Bean; + +import java.util.Properties; + +import static com.google.code.kaptcha.Constants.*; + +@AutoConfiguration +public class WinCaptchaConfiguration { + @Bean(name = "captchaProducer") + public DefaultKaptcha getKaptchaBean() { + DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); + Properties properties = new Properties(); + // 是否有边框 默认为true 我们可以自己设置yes,no + properties.setProperty(KAPTCHA_BORDER, "yes"); + // 验证码文本字符颜色 默认为Color.BLACK + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "black"); + // 验证码图片宽度 默认为200 + properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160"); + // 验证码图片高度 默认为50 + properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60"); + // 验证码文本字符大小 默认为40 + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "38"); + // KAPTCHA_SESSION_KEY + properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCode"); + // 验证码文本字符长度 默认为5 + properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "4"); + // 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize) + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier"); + // 图片样式 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpy + properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy"); + Config config = new Config(properties); + defaultKaptcha.setConfig(config); + return defaultKaptcha; + } + + @Bean(name = "captchaProducerMath") + public DefaultKaptcha getKaptchaBeanMath() { + DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); + Properties properties = new Properties(); + // 是否有边框 默认为true 我们可以自己设置yes,no + properties.setProperty(KAPTCHA_BORDER, "yes"); + // 边框颜色 默认为Color.BLACK + properties.setProperty(KAPTCHA_BORDER_COLOR, "105,179,90"); + // 验证码文本字符颜色 默认为Color.BLACK + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "blue"); + // 验证码图片宽度 默认为200 + properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160"); + // 验证码图片高度 默认为50 + properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60"); + // 验证码文本字符大小 默认为40 + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "35"); + // KAPTCHA_SESSION_KEY + properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCodeMath"); + // 验证码文本生成器 + properties.setProperty(KAPTCHA_TEXTPRODUCER_IMPL, "com.win.framework.captcha.config.KaptchaTextCreator"); + // 验证码文本字符间距 默认为2 + properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_SPACE, "3"); + // 验证码文本字符长度 默认为5 + properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "6"); + // 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize) + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier"); + // 验证码噪点颜色 默认为Color.BLACK + properties.setProperty(KAPTCHA_NOISE_COLOR, "white"); + // 干扰实现类 + properties.setProperty(KAPTCHA_NOISE_IMPL, "com.google.code.kaptcha.impl.NoNoise"); + // 图片样式 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpy + properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy"); + Config config = new Config(properties); + defaultKaptcha.setConfig(config); + return defaultKaptcha; + } +} diff --git a/win-framework/win-spring-boot-starter-captcha/src/main/java/com/win/framework/captcha/enums/CaptchaRedisKeyConstants.java b/win-framework/win-spring-boot-starter-captcha/src/main/java/com/win/framework/captcha/enums/CaptchaRedisKeyConstants.java new file mode 100644 index 0000000..507c5e6 --- /dev/null +++ b/win-framework/win-spring-boot-starter-captcha/src/main/java/com/win/framework/captcha/enums/CaptchaRedisKeyConstants.java @@ -0,0 +1,15 @@ +package com.win.framework.captcha.enums; + +/** + * 验证码 Redis Key 枚举类 + * + * @author 闻荫源码 + */ +public interface CaptchaRedisKeyConstants { + + /** + * 验证码 redis key + */ + String CAPTCHA_CODE_KEY = "captcha_codes:"; + +} diff --git a/win-framework/win-spring-boot-starter-captcha/src/main/java/com/win/framework/captcha/package-info.java b/win-framework/win-spring-boot-starter-captcha/src/main/java/com/win/framework/captcha/package-info.java new file mode 100644 index 0000000..00e29af --- /dev/null +++ b/win-framework/win-spring-boot-starter-captcha/src/main/java/com/win/framework/captcha/package-info.java @@ -0,0 +1,7 @@ +/** + * 验证码拓展 + * 1. 基于 aj-captcha 实现滑块验证码,文档:https://ajcaptcha.beliefteam.cn/captcha-doc/ + * + * @author 星语 + */ +package com.win.framework.captcha; diff --git a/win-framework/win-spring-boot-starter-captcha/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/win-framework/win-spring-boot-starter-captcha/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..36daddc --- /dev/null +++ b/win-framework/win-spring-boot-starter-captcha/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1,2 @@ +com.win.framework.captcha.config.CaptchaProperties +com.win.framework.captcha.config.WinCaptchaConfiguration \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-desensitize/pom.xml b/win-framework/win-spring-boot-starter-desensitize/pom.xml new file mode 100644 index 0000000..a97ab7d --- /dev/null +++ b/win-framework/win-spring-boot-starter-desensitize/pom.xml @@ -0,0 +1,38 @@ + + + 4.0.0 + + com.win + win-framework + ${revision} + + + win-spring-boot-starter-desensitize + 脱敏组件:支持 JSON 返回数据时,将邮箱、手机等字段进行脱敏 + + + + com.win + win-common + + + + + com.fasterxml.jackson.core + jackson-annotations + + + com.fasterxml.jackson.core + jackson-databind + + + + + com.win + win-spring-boot-starter-test + test + + + diff --git a/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/base/annotation/DesensitizeBy.java b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/base/annotation/DesensitizeBy.java new file mode 100644 index 0000000..f70f9c4 --- /dev/null +++ b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/base/annotation/DesensitizeBy.java @@ -0,0 +1,32 @@ +package com.win.framework.desensitize.core.base.annotation; + +import com.win.framework.desensitize.core.base.handler.DesensitizationHandler; +import com.win.framework.desensitize.core.base.serializer.StringDesensitizeSerializer; +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 顶级脱敏注解,自定义注解需要使用此注解 + * + * @author gaibu + */ +@Documented +@Target(ElementType.ANNOTATION_TYPE) +@Retention(RetentionPolicy.RUNTIME) +@JacksonAnnotationsInside // 此注解是其他所有 jackson 注解的元注解,打上了此注解的注解表明是 jackson 注解的一部分 +@JsonSerialize(using = StringDesensitizeSerializer.class) // 指定序列化器 +public @interface DesensitizeBy { + + /** + * 脱敏处理器 + */ + @SuppressWarnings("rawtypes") + Class handler(); + +} diff --git a/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/base/handler/DesensitizationHandler.java b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/base/handler/DesensitizationHandler.java new file mode 100644 index 0000000..2aaa1c1 --- /dev/null +++ b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/base/handler/DesensitizationHandler.java @@ -0,0 +1,21 @@ +package com.win.framework.desensitize.core.base.handler; + +import java.lang.annotation.Annotation; + +/** + * 脱敏处理器接口 + * + * @author gaibu + */ +public interface DesensitizationHandler { + + /** + * 脱敏 + * + * @param origin 原始字符串 + * @param annotation 注解信息 + * @return 脱敏后的字符串 + */ + String desensitize(String origin, T annotation); + +} diff --git a/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/base/serializer/StringDesensitizeSerializer.java b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/base/serializer/StringDesensitizeSerializer.java new file mode 100644 index 0000000..2050129 --- /dev/null +++ b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/base/serializer/StringDesensitizeSerializer.java @@ -0,0 +1,92 @@ +package com.win.framework.desensitize.core.base.serializer; + +import cn.hutool.core.annotation.AnnotationUtil; +import cn.hutool.core.lang.Singleton; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ReflectUtil; +import cn.hutool.core.util.StrUtil; +import com.win.framework.desensitize.core.base.annotation.DesensitizeBy; +import com.win.framework.desensitize.core.base.handler.DesensitizationHandler; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.BeanProperty; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.ContextualSerializer; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; +import lombok.Getter; +import lombok.Setter; + +import java.io.IOException; +import java.lang.annotation.Annotation; +import java.lang.reflect.Field; + +/** + * 脱敏序列化器 + * + * 实现 JSON 返回数据时,使用 {@link DesensitizationHandler} 对声明脱敏注解的字段,进行脱敏处理。 + * + * @author gaibu + */ +@SuppressWarnings("rawtypes") +public class StringDesensitizeSerializer extends StdSerializer implements ContextualSerializer { + + @Getter + @Setter + private DesensitizationHandler desensitizationHandler; + + protected StringDesensitizeSerializer() { + super(String.class); + } + + @Override + public JsonSerializer createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty) { + DesensitizeBy annotation = beanProperty.getAnnotation(DesensitizeBy.class); + if (annotation == null) { + return this; + } + // 创建一个 StringDesensitizeSerializer 对象,使用 DesensitizeBy 对应的处理器 + StringDesensitizeSerializer serializer = new StringDesensitizeSerializer(); + serializer.setDesensitizationHandler(Singleton.get(annotation.handler())); + return serializer; + } + + @Override + @SuppressWarnings("unchecked") + public void serialize(String value, JsonGenerator gen, SerializerProvider serializerProvider) throws IOException { + if (StrUtil.isBlank(value)) { + gen.writeNull(); + return; + } + // 获取序列化字段 + Field field = getField(gen); + + // 自定义处理器 + DesensitizeBy[] annotations = AnnotationUtil.getCombinationAnnotations(field, DesensitizeBy.class); + if (ArrayUtil.isEmpty(annotations)) { + gen.writeString(value); + return; + } + for (Annotation annotation : field.getAnnotations()) { + if (AnnotationUtil.hasAnnotation(annotation.annotationType(), DesensitizeBy.class)) { + value = this.desensitizationHandler.desensitize(value, annotation); + gen.writeString(value); + return; + } + } + gen.writeString(value); + } + + /** + * 获取字段 + * + * @param generator JsonGenerator + * @return 字段 + */ + private Field getField(JsonGenerator generator) { + String currentName = generator.getOutputContext().getCurrentName(); + Object currentValue = generator.getCurrentValue(); + Class currentValueClass = currentValue.getClass(); + return ReflectUtil.getField(currentValueClass, currentName); + } + +} diff --git a/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/package-info.java b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/package-info.java new file mode 100644 index 0000000..90d858b --- /dev/null +++ b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/package-info.java @@ -0,0 +1,4 @@ +/** + * 脱敏组件:支持 JSON 返回数据时,将邮箱、手机等字段进行脱敏 + */ +package com.win.framework.desensitize.core; diff --git a/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/regex/annotation/EmailDesensitize.java b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/regex/annotation/EmailDesensitize.java new file mode 100644 index 0000000..f3e9c02 --- /dev/null +++ b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/regex/annotation/EmailDesensitize.java @@ -0,0 +1,36 @@ +package com.win.framework.desensitize.core.regex.annotation; + +import com.win.framework.desensitize.core.base.annotation.DesensitizeBy; +import com.win.framework.desensitize.core.regex.handler.EmailDesensitizationHandler; +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 邮箱脱敏注解 + * + * @author gaibu + */ +@Documented +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +@JacksonAnnotationsInside +@DesensitizeBy(handler = EmailDesensitizationHandler.class) +public @interface EmailDesensitize { + + /** + * 匹配的正则表达式 + */ + String regex() default "(^.)[^@]*(@.*$)"; + + /** + * 替换规则,邮箱; + * + * 比如:example@gmail.com 脱敏之后为 e****@gmail.com + */ + String replacer() default "$1****$2"; +} diff --git a/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/regex/annotation/RegexDesensitize.java b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/regex/annotation/RegexDesensitize.java new file mode 100644 index 0000000..166fdd1 --- /dev/null +++ b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/regex/annotation/RegexDesensitize.java @@ -0,0 +1,38 @@ +package com.win.framework.desensitize.core.regex.annotation; + +import com.win.framework.desensitize.core.base.annotation.DesensitizeBy; +import com.win.framework.desensitize.core.regex.handler.DefaultRegexDesensitizationHandler; +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 正则脱敏注解 + * + * @author gaibu + */ +@Documented +@Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE}) +@Retention(RetentionPolicy.RUNTIME) +@JacksonAnnotationsInside +@DesensitizeBy(handler = DefaultRegexDesensitizationHandler.class) +public @interface RegexDesensitize { + + /** + * 匹配的正则表达式(默认匹配所有) + */ + String regex() default "^[\\s\\S]*$"; + + /** + * 替换规则,会将匹配到的字符串全部替换成 replacer + * + * 例如:regex=123; replacer=****** + * 原始字符串 123456789 + * 脱敏后字符串 ******456789 + */ + String replacer() default "******"; +} diff --git a/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/regex/handler/AbstractRegexDesensitizationHandler.java b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/regex/handler/AbstractRegexDesensitizationHandler.java new file mode 100644 index 0000000..0b64e30 --- /dev/null +++ b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/regex/handler/AbstractRegexDesensitizationHandler.java @@ -0,0 +1,38 @@ +package com.win.framework.desensitize.core.regex.handler; + +import com.win.framework.desensitize.core.base.handler.DesensitizationHandler; + +import java.lang.annotation.Annotation; + +/** + * 正则表达式脱敏处理器抽象类,已实现通用的方法 + * + * @author gaibu + */ +public abstract class AbstractRegexDesensitizationHandler + implements DesensitizationHandler { + + @Override + public String desensitize(String origin, T annotation) { + String regex = getRegex(annotation); + String replacer = getReplacer(annotation); + return origin.replaceAll(regex, replacer); + } + + /** + * 获取注解上的 regex 参数 + * + * @param annotation 注解信息 + * @return 正则表达式 + */ + abstract String getRegex(T annotation); + + /** + * 获取注解上的 replacer 参数 + * + * @param annotation 注解信息 + * @return 待替换的字符串 + */ + abstract String getReplacer(T annotation); + +} diff --git a/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/regex/handler/DefaultRegexDesensitizationHandler.java b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/regex/handler/DefaultRegexDesensitizationHandler.java new file mode 100644 index 0000000..98a9ec0 --- /dev/null +++ b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/regex/handler/DefaultRegexDesensitizationHandler.java @@ -0,0 +1,21 @@ +package com.win.framework.desensitize.core.regex.handler; + +import com.win.framework.desensitize.core.regex.annotation.RegexDesensitize; + +/** + * {@link RegexDesensitize} 的正则脱敏处理器 + * + * @author gaibu + */ +public class DefaultRegexDesensitizationHandler extends AbstractRegexDesensitizationHandler { + + @Override + String getRegex(RegexDesensitize annotation) { + return annotation.regex(); + } + + @Override + String getReplacer(RegexDesensitize annotation) { + return annotation.replacer(); + } +} diff --git a/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/regex/handler/EmailDesensitizationHandler.java b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/regex/handler/EmailDesensitizationHandler.java new file mode 100644 index 0000000..3872264 --- /dev/null +++ b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/regex/handler/EmailDesensitizationHandler.java @@ -0,0 +1,22 @@ +package com.win.framework.desensitize.core.regex.handler; + +import com.win.framework.desensitize.core.regex.annotation.EmailDesensitize; + +/** + * {@link EmailDesensitize} 的脱敏处理器 + * + * @author gaibu + */ +public class EmailDesensitizationHandler extends AbstractRegexDesensitizationHandler { + + @Override + String getRegex(EmailDesensitize annotation) { + return annotation.regex(); + } + + @Override + String getReplacer(EmailDesensitize annotation) { + return annotation.replacer(); + } + +} diff --git a/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/annotation/BankCardDesensitize.java b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/annotation/BankCardDesensitize.java new file mode 100644 index 0000000..b49ed70 --- /dev/null +++ b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/annotation/BankCardDesensitize.java @@ -0,0 +1,40 @@ +package com.win.framework.desensitize.core.slider.annotation; + +import com.win.framework.desensitize.core.base.annotation.DesensitizeBy; +import com.win.framework.desensitize.core.slider.handler.BankCardDesensitization; +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 银行卡号 + * + * @author gaibu + */ +@Documented +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +@JacksonAnnotationsInside +@DesensitizeBy(handler = BankCardDesensitization.class) +public @interface BankCardDesensitize { + + /** + * 前缀保留长度 + */ + int prefixKeep() default 6; + + /** + * 后缀保留长度 + */ + int suffixKeep() default 2; + + /** + * 替换规则,银行卡号; 比如:9988002866797031 脱敏之后为 998800********31 + */ + String replacer() default "*"; + +} diff --git a/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/annotation/CarLicenseDesensitize.java b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/annotation/CarLicenseDesensitize.java new file mode 100644 index 0000000..3fc7049 --- /dev/null +++ b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/annotation/CarLicenseDesensitize.java @@ -0,0 +1,40 @@ +package com.win.framework.desensitize.core.slider.annotation; + +import com.win.framework.desensitize.core.base.annotation.DesensitizeBy; +import com.win.framework.desensitize.core.slider.handler.CarLicenseDesensitization; +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 车牌号 + * + * @author gaibu + */ +@Documented +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +@JacksonAnnotationsInside +@DesensitizeBy(handler = CarLicenseDesensitization.class) +public @interface CarLicenseDesensitize { + + /** + * 前缀保留长度 + */ + int prefixKeep() default 3; + + /** + * 后缀保留长度 + */ + int suffixKeep() default 1; + + /** + * 替换规则,车牌号;比如:粤A66666 脱敏之后为粤A6***6 + */ + String replacer() default "*"; + +} diff --git a/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/annotation/ChineseNameDesensitize.java b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/annotation/ChineseNameDesensitize.java new file mode 100644 index 0000000..d5065c3 --- /dev/null +++ b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/annotation/ChineseNameDesensitize.java @@ -0,0 +1,40 @@ +package com.win.framework.desensitize.core.slider.annotation; + +import com.win.framework.desensitize.core.base.annotation.DesensitizeBy; +import com.win.framework.desensitize.core.slider.handler.ChineseNameDesensitization; +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 中文名 + * + * @author gaibu + */ +@Documented +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +@JacksonAnnotationsInside +@DesensitizeBy(handler = ChineseNameDesensitization.class) +public @interface ChineseNameDesensitize { + + /** + * 前缀保留长度 + */ + int prefixKeep() default 1; + + /** + * 后缀保留长度 + */ + int suffixKeep() default 0; + + /** + * 替换规则,中文名;比如:刘子豪脱敏之后为刘** + */ + String replacer() default "*"; + +} diff --git a/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/annotation/FixedPhoneDesensitize.java b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/annotation/FixedPhoneDesensitize.java new file mode 100644 index 0000000..ac0e78f --- /dev/null +++ b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/annotation/FixedPhoneDesensitize.java @@ -0,0 +1,40 @@ +package com.win.framework.desensitize.core.slider.annotation; + +import com.win.framework.desensitize.core.base.annotation.DesensitizeBy; +import com.win.framework.desensitize.core.slider.handler.FixedPhoneDesensitization; +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 固定电话 + * + * @author gaibu + */ +@Documented +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +@JacksonAnnotationsInside +@DesensitizeBy(handler = FixedPhoneDesensitization.class) +public @interface FixedPhoneDesensitize { + + /** + * 前缀保留长度 + */ + int prefixKeep() default 4; + + /** + * 后缀保留长度 + */ + int suffixKeep() default 2; + + /** + * 替换规则,固定电话;比如:01086551122 脱敏之后为 0108*****22 + */ + String replacer() default "*"; + +} diff --git a/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/annotation/IdCardDesensitize.java b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/annotation/IdCardDesensitize.java new file mode 100644 index 0000000..b2ff3a0 --- /dev/null +++ b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/annotation/IdCardDesensitize.java @@ -0,0 +1,40 @@ +package com.win.framework.desensitize.core.slider.annotation; + +import com.win.framework.desensitize.core.base.annotation.DesensitizeBy; +import com.win.framework.desensitize.core.slider.handler.IdCardDesensitization; +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 身份证 + * + * @author gaibu + */ +@Documented +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +@JacksonAnnotationsInside +@DesensitizeBy(handler = IdCardDesensitization.class) +public @interface IdCardDesensitize { + + /** + * 前缀保留长度 + */ + int prefixKeep() default 6; + + /** + * 后缀保留长度 + */ + int suffixKeep() default 2; + + /** + * 替换规则,身份证号码;比如:530321199204074611 脱敏之后为 530321**********11 + */ + String replacer() default "*"; + +} diff --git a/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/annotation/MobileDesensitize.java b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/annotation/MobileDesensitize.java new file mode 100644 index 0000000..c83fb26 --- /dev/null +++ b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/annotation/MobileDesensitize.java @@ -0,0 +1,40 @@ +package com.win.framework.desensitize.core.slider.annotation; + +import com.win.framework.desensitize.core.base.annotation.DesensitizeBy; +import com.win.framework.desensitize.core.slider.handler.MobileDesensitization; +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 手机号 + * + * @author gaibu + */ +@Documented +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +@JacksonAnnotationsInside +@DesensitizeBy(handler = MobileDesensitization.class) +public @interface MobileDesensitize { + + /** + * 前缀保留长度 + */ + int prefixKeep() default 3; + + /** + * 后缀保留长度 + */ + int suffixKeep() default 4; + + /** + * 替换规则,手机号;比如:13248765917 脱敏之后为 132****5917 + */ + String replacer() default "*"; + +} diff --git a/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/annotation/PasswordDesensitize.java b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/annotation/PasswordDesensitize.java new file mode 100644 index 0000000..878e1db --- /dev/null +++ b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/annotation/PasswordDesensitize.java @@ -0,0 +1,42 @@ +package com.win.framework.desensitize.core.slider.annotation; + +import com.win.framework.desensitize.core.base.annotation.DesensitizeBy; +import com.win.framework.desensitize.core.slider.handler.PasswordDesensitization; +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 密码 + * + * @author gaibu + */ +@Documented +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +@JacksonAnnotationsInside +@DesensitizeBy(handler = PasswordDesensitization.class) +public @interface PasswordDesensitize { + + /** + * 前缀保留长度 + */ + int prefixKeep() default 0; + + /** + * 后缀保留长度 + */ + int suffixKeep() default 0; + + /** + * 替换规则,密码; + * + * 比如:123456 脱敏之后为 ****** + */ + String replacer() default "*"; + +} diff --git a/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/annotation/SliderDesensitize.java b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/annotation/SliderDesensitize.java new file mode 100644 index 0000000..fe1c0e4 --- /dev/null +++ b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/annotation/SliderDesensitize.java @@ -0,0 +1,43 @@ +package com.win.framework.desensitize.core.slider.annotation; + +import com.win.framework.desensitize.core.base.annotation.DesensitizeBy; +import com.win.framework.desensitize.core.slider.handler.DefaultDesensitizationHandler; +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 滑动脱敏注解 + * + * @author gaibu + */ +@Documented +@Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE}) +@Retention(RetentionPolicy.RUNTIME) +@JacksonAnnotationsInside +@DesensitizeBy(handler = DefaultDesensitizationHandler.class) +public @interface SliderDesensitize { + + /** + * 后缀保留长度 + */ + int suffixKeep() default 0; + + /** + * 替换规则,会将前缀后缀保留后,全部替换成 replacer + * + * 例如:prefixKeep = 1; suffixKeep = 2; replacer = "*"; + * 原始字符串 123456 + * 脱敏后 1***56 + */ + String replacer() default "*"; + + /** + * 前缀保留长度 + */ + int prefixKeep() default 0; +} diff --git a/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/handler/AbstractSliderDesensitizationHandler.java b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/handler/AbstractSliderDesensitizationHandler.java new file mode 100644 index 0000000..e7a0a5c --- /dev/null +++ b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/handler/AbstractSliderDesensitizationHandler.java @@ -0,0 +1,78 @@ +package com.win.framework.desensitize.core.slider.handler; + +import com.win.framework.desensitize.core.base.handler.DesensitizationHandler; + +import java.lang.annotation.Annotation; + +/** + * 滑动脱敏处理器抽象类,已实现通用的方法 + * + * @author gaibu + */ +public abstract class AbstractSliderDesensitizationHandler + implements DesensitizationHandler { + + @Override + public String desensitize(String origin, T annotation) { + int prefixKeep = getPrefixKeep(annotation); + int suffixKeep = getSuffixKeep(annotation); + String replacer = getReplacer(annotation); + int length = origin.length(); + + // 情况一:原始字符串长度小于等于保留长度,则原始字符串全部替换 + if (prefixKeep >= length || suffixKeep >= length) { + return buildReplacerByLength(replacer, length); + } + + // 情况二:原始字符串长度小于等于前后缀保留字符串长度,则原始字符串全部替换 + if ((prefixKeep + suffixKeep) >= length) { + return buildReplacerByLength(replacer, length); + } + + // 情况三:原始字符串长度大于前后缀保留字符串长度,则替换中间字符串 + int interval = length - prefixKeep - suffixKeep; + return origin.substring(0, prefixKeep) + + buildReplacerByLength(replacer, interval) + + origin.substring(prefixKeep + interval); + } + + /** + * 根据长度循环构建替换符 + * + * @param replacer 替换符 + * @param length 长度 + * @return 构建后的替换符 + */ + private String buildReplacerByLength(String replacer, int length) { + StringBuilder builder = new StringBuilder(); + for (int i = 0; i < length; i++) { + builder.append(replacer); + } + return builder.toString(); + } + + /** + * 前缀保留长度 + * + * @param annotation 注解信息 + * @return 前缀保留长度 + */ + abstract Integer getPrefixKeep(T annotation); + + /** + * 后缀保留长度 + * + * @param annotation 注解信息 + * @return 后缀保留长度 + */ + abstract Integer getSuffixKeep(T annotation); + + /** + * 替换符 + * + * @param annotation 注解信息 + * @return 替换符 + */ + abstract String getReplacer(T annotation); + +} diff --git a/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/handler/BankCardDesensitization.java b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/handler/BankCardDesensitization.java new file mode 100644 index 0000000..169cf42 --- /dev/null +++ b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/handler/BankCardDesensitization.java @@ -0,0 +1,27 @@ +package com.win.framework.desensitize.core.slider.handler; + +import com.win.framework.desensitize.core.slider.annotation.BankCardDesensitize; + +/** + * {@link BankCardDesensitize} 的脱敏处理器 + * + * @author gaibu + */ +public class BankCardDesensitization extends AbstractSliderDesensitizationHandler { + + @Override + Integer getPrefixKeep(BankCardDesensitize annotation) { + return annotation.prefixKeep(); + } + + @Override + Integer getSuffixKeep(BankCardDesensitize annotation) { + return annotation.suffixKeep(); + } + + @Override + String getReplacer(BankCardDesensitize annotation) { + return annotation.replacer(); + } + +} diff --git a/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/handler/CarLicenseDesensitization.java b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/handler/CarLicenseDesensitization.java new file mode 100644 index 0000000..06446eb --- /dev/null +++ b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/handler/CarLicenseDesensitization.java @@ -0,0 +1,25 @@ +package com.win.framework.desensitize.core.slider.handler; + +import com.win.framework.desensitize.core.slider.annotation.CarLicenseDesensitize; + +/** + * {@link CarLicenseDesensitize} 的脱敏处理器 + * + * @author gaibu + */ +public class CarLicenseDesensitization extends AbstractSliderDesensitizationHandler { + @Override + Integer getPrefixKeep(CarLicenseDesensitize annotation) { + return annotation.prefixKeep(); + } + + @Override + Integer getSuffixKeep(CarLicenseDesensitize annotation) { + return annotation.suffixKeep(); + } + + @Override + String getReplacer(CarLicenseDesensitize annotation) { + return annotation.replacer(); + } +} diff --git a/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/handler/ChineseNameDesensitization.java b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/handler/ChineseNameDesensitization.java new file mode 100644 index 0000000..04eb5a4 --- /dev/null +++ b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/handler/ChineseNameDesensitization.java @@ -0,0 +1,27 @@ +package com.win.framework.desensitize.core.slider.handler; + +import com.win.framework.desensitize.core.slider.annotation.ChineseNameDesensitize; + +/** + * {@link ChineseNameDesensitize} 的脱敏处理器 + * + * @author gaibu + */ +public class ChineseNameDesensitization extends AbstractSliderDesensitizationHandler { + + @Override + Integer getPrefixKeep(ChineseNameDesensitize annotation) { + return annotation.prefixKeep(); + } + + @Override + Integer getSuffixKeep(ChineseNameDesensitize annotation) { + return annotation.suffixKeep(); + } + + @Override + String getReplacer(ChineseNameDesensitize annotation) { + return annotation.replacer(); + } + +} diff --git a/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/handler/DefaultDesensitizationHandler.java b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/handler/DefaultDesensitizationHandler.java new file mode 100644 index 0000000..c17a491 --- /dev/null +++ b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/handler/DefaultDesensitizationHandler.java @@ -0,0 +1,25 @@ +package com.win.framework.desensitize.core.slider.handler; + +import com.win.framework.desensitize.core.slider.annotation.SliderDesensitize; + +/** + * {@link SliderDesensitize} 的脱敏处理器 + * + * @author gaibu + */ +public class DefaultDesensitizationHandler extends AbstractSliderDesensitizationHandler { + @Override + Integer getPrefixKeep(SliderDesensitize annotation) { + return annotation.prefixKeep(); + } + + @Override + Integer getSuffixKeep(SliderDesensitize annotation) { + return annotation.suffixKeep(); + } + + @Override + String getReplacer(SliderDesensitize annotation) { + return annotation.replacer(); + } +} diff --git a/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/handler/FixedPhoneDesensitization.java b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/handler/FixedPhoneDesensitization.java new file mode 100644 index 0000000..09d47f0 --- /dev/null +++ b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/handler/FixedPhoneDesensitization.java @@ -0,0 +1,25 @@ +package com.win.framework.desensitize.core.slider.handler; + +import com.win.framework.desensitize.core.slider.annotation.FixedPhoneDesensitize; + +/** + * {@link FixedPhoneDesensitize} 的脱敏处理器 + * + * @author gaibu + */ +public class FixedPhoneDesensitization extends AbstractSliderDesensitizationHandler { + @Override + Integer getPrefixKeep(FixedPhoneDesensitize annotation) { + return annotation.prefixKeep(); + } + + @Override + Integer getSuffixKeep(FixedPhoneDesensitize annotation) { + return annotation.suffixKeep(); + } + + @Override + String getReplacer(FixedPhoneDesensitize annotation) { + return annotation.replacer(); + } +} diff --git a/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/handler/IdCardDesensitization.java b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/handler/IdCardDesensitization.java new file mode 100644 index 0000000..1d0a767 --- /dev/null +++ b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/handler/IdCardDesensitization.java @@ -0,0 +1,25 @@ +package com.win.framework.desensitize.core.slider.handler; + +import com.win.framework.desensitize.core.slider.annotation.IdCardDesensitize; + +/** + * {@link IdCardDesensitize} 的脱敏处理器 + * + * @author gaibu + */ +public class IdCardDesensitization extends AbstractSliderDesensitizationHandler { + @Override + Integer getPrefixKeep(IdCardDesensitize annotation) { + return annotation.prefixKeep(); + } + + @Override + Integer getSuffixKeep(IdCardDesensitize annotation) { + return annotation.suffixKeep(); + } + + @Override + String getReplacer(IdCardDesensitize annotation) { + return annotation.replacer(); + } +} diff --git a/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/handler/MobileDesensitization.java b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/handler/MobileDesensitization.java new file mode 100644 index 0000000..a26b169 --- /dev/null +++ b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/handler/MobileDesensitization.java @@ -0,0 +1,26 @@ +package com.win.framework.desensitize.core.slider.handler; + +import com.win.framework.desensitize.core.slider.annotation.MobileDesensitize; + +/** + * {@link MobileDesensitize} 的脱敏处理器 + * + * @author gaibu + */ +public class MobileDesensitization extends AbstractSliderDesensitizationHandler { + + @Override + Integer getPrefixKeep(MobileDesensitize annotation) { + return annotation.prefixKeep(); + } + + @Override + Integer getSuffixKeep(MobileDesensitize annotation) { + return annotation.suffixKeep(); + } + + @Override + String getReplacer(MobileDesensitize annotation) { + return annotation.replacer(); + } +} diff --git a/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/handler/PasswordDesensitization.java b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/handler/PasswordDesensitization.java new file mode 100644 index 0000000..7e5a9b2 --- /dev/null +++ b/win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/handler/PasswordDesensitization.java @@ -0,0 +1,25 @@ +package com.win.framework.desensitize.core.slider.handler; + +import com.win.framework.desensitize.core.slider.annotation.PasswordDesensitize; + +/** + * {@link PasswordDesensitize} 的码脱敏处理器 + * + * @author gaibu + */ +public class PasswordDesensitization extends AbstractSliderDesensitizationHandler { + @Override + Integer getPrefixKeep(PasswordDesensitize annotation) { + return annotation.prefixKeep(); + } + + @Override + Integer getSuffixKeep(PasswordDesensitize annotation) { + return annotation.suffixKeep(); + } + + @Override + String getReplacer(PasswordDesensitize annotation) { + return annotation.replacer(); + } +} diff --git a/win-framework/win-spring-boot-starter-excel/pom.xml b/win-framework/win-spring-boot-starter-excel/pom.xml new file mode 100644 index 0000000..2ae8c65 --- /dev/null +++ b/win-framework/win-spring-boot-starter-excel/pom.xml @@ -0,0 +1,55 @@ + + + + win-framework + com.win + ${revision} + + 4.0.0 + win-spring-boot-starter-excel + jar + + ${project.artifactId} + Excel 拓展 + https://github.com/YunaiV/ruoyi-vue-pro + + + + com.win + win-common + + + + + com.win + win-spring-boot-starter-biz-dict + true + + + + + org.springframework + spring-web + provided + + + + jakarta.servlet + jakarta.servlet-api + provided + + + + + com.alibaba + easyexcel + + + com.win + win-spring-boot-starter-web + + + + diff --git a/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/annotations/DictFormat.java b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/annotations/DictFormat.java new file mode 100644 index 0000000..2df7177 --- /dev/null +++ b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/annotations/DictFormat.java @@ -0,0 +1,22 @@ +package com.win.framework.excel.core.annotations; + +import java.lang.annotation.*; + +/** + * 字典格式化 + * + * 实现将字典数据的值,格式化成字典数据的标签 + */ +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +@Inherited +public @interface DictFormat { + + /** + * 例如说,SysDictTypeConstants、InfDictTypeConstants + * + * @return 字典类型 + */ + String value(); + +} diff --git a/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/annotations/OnlyOne.java b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/annotations/OnlyOne.java new file mode 100644 index 0000000..f4a2777 --- /dev/null +++ b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/annotations/OnlyOne.java @@ -0,0 +1,15 @@ +package com.win.framework.excel.core.annotations; + +import java.lang.annotation.*; + +/** + * 字典格式化 + * + * 实现将字典数据的值,格式化成字典数据的标签 + */ +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +@Inherited +public @interface OnlyOne { + +} diff --git a/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/annotations/SubObject.java b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/annotations/SubObject.java new file mode 100644 index 0000000..bcb94f0 --- /dev/null +++ b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/annotations/SubObject.java @@ -0,0 +1,15 @@ +package com.win.framework.excel.core.annotations; + +import java.lang.annotation.*; + +/** + * 字典格式化 + * + * 实现将字典数据的值,格式化成字典数据的标签 + */ +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +@Inherited +public @interface SubObject { + +} diff --git a/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/convert/CommonStatusConverter.java b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/convert/CommonStatusConverter.java new file mode 100644 index 0000000..e284593 --- /dev/null +++ b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/convert/CommonStatusConverter.java @@ -0,0 +1,34 @@ +package com.win.framework.excel.core.convert; + +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.converters.ReadConverterContext; +import com.alibaba.excel.converters.WriteConverterContext; +import com.alibaba.excel.enums.CellDataTypeEnum; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.win.framework.common.enums.CommonStatusEnum; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class CommonStatusConverter implements Converter { + + @Override + public Class supportJavaTypeKey() { + throw new UnsupportedOperationException("暂不支持,也不需要"); + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + throw new UnsupportedOperationException("暂不支持,也不需要"); + } + + @Override + public Integer convertToJavaData(ReadConverterContext context) { + return CommonStatusEnum.convert(context.getReadCellData().getStringValue()).getStatus(); + } + + @Override + public WriteCellData convertToExcelData(WriteConverterContext context) { + return new WriteCellData<>(CommonStatusEnum.convert(Integer.parseInt(String.valueOf(context.getValue()))).getName()); + } + +} diff --git a/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/convert/DictConvert.java b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/convert/DictConvert.java new file mode 100644 index 0000000..00369f4 --- /dev/null +++ b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/convert/DictConvert.java @@ -0,0 +1,72 @@ +package com.win.framework.excel.core.convert; + +import cn.hutool.core.convert.Convert; +import com.win.framework.dict.core.util.DictFrameworkUtils; +import com.win.framework.excel.core.annotations.DictFormat; +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.enums.CellDataTypeEnum; +import com.alibaba.excel.metadata.GlobalConfiguration; +import com.alibaba.excel.metadata.data.ReadCellData; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.metadata.property.ExcelContentProperty; +import lombok.extern.slf4j.Slf4j; + +/** + * Excel 数据字典转换器 + * + * @author 闻荫源码 + */ +@Slf4j +public class DictConvert implements Converter { + + @Override + public Class supportJavaTypeKey() { + throw new UnsupportedOperationException("暂不支持,也不需要"); + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + throw new UnsupportedOperationException("暂不支持,也不需要"); + } + + @Override + public Object convertToJavaData(ReadCellData readCellData, ExcelContentProperty contentProperty, + GlobalConfiguration globalConfiguration) { + // 使用字典解析 + String type = getType(contentProperty); + String label = readCellData.getStringValue(); + String value = DictFrameworkUtils.parseDictDataValue(type, label); + if (value == null) { + log.error("[convertToJavaData][type({}) 解析不掉 label({})]", type, label); + return null; + } + // 将 String 的 value 转换成对应的属性 + Class fieldClazz = contentProperty.getField().getType(); + return Convert.convert(fieldClazz, value); + } + + @Override + public WriteCellData convertToExcelData(Object object, ExcelContentProperty contentProperty, + GlobalConfiguration globalConfiguration) { + // 空时,返回空 + if (object == null) { + return new WriteCellData<>(""); + } + + // 使用字典格式化 + String type = getType(contentProperty); + String value = String.valueOf(object); + String label = DictFrameworkUtils.getDictDataLabel(type, value); + if (label == null) { + log.error("[convertToExcelData][type({}) 转换不了 label({})]", type, value); + return new WriteCellData<>(""); + } + // 生成 Excel 小表格 + return new WriteCellData<>(label); + } + + private static String getType(ExcelContentProperty contentProperty) { + return contentProperty.getField().getAnnotation(DictFormat.class).value(); + } + +} diff --git a/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/convert/JsonConvert.java b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/convert/JsonConvert.java new file mode 100644 index 0000000..399e3cb --- /dev/null +++ b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/convert/JsonConvert.java @@ -0,0 +1,34 @@ +package com.win.framework.excel.core.convert; + +import com.win.framework.common.util.json.JsonUtils; +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.enums.CellDataTypeEnum; +import com.alibaba.excel.metadata.GlobalConfiguration; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.metadata.property.ExcelContentProperty; + +/** + * Excel Json 转换器 + * + * @author 闻荫源码 + */ +public class JsonConvert implements Converter { + + @Override + public Class supportJavaTypeKey() { + throw new UnsupportedOperationException("暂不支持,也不需要"); + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + throw new UnsupportedOperationException("暂不支持,也不需要"); + } + + @Override + public WriteCellData convertToExcelData(Object value, ExcelContentProperty contentProperty, + GlobalConfiguration globalConfiguration) { + // 生成 Excel 小表格 + return new WriteCellData<>(JsonUtils.toJsonString(value)); + } + +} diff --git a/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/convert/MoneyConvert.java b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/convert/MoneyConvert.java new file mode 100644 index 0000000..57fbe10 --- /dev/null +++ b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/convert/MoneyConvert.java @@ -0,0 +1,39 @@ +package com.win.framework.excel.core.convert; + +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.enums.CellDataTypeEnum; +import com.alibaba.excel.metadata.GlobalConfiguration; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.metadata.property.ExcelContentProperty; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +/** + * 金额转换器 + * + * 金额单位:分 + * + * @author 闻荫源码 + */ +public class MoneyConvert implements Converter { + + @Override + public Class supportJavaTypeKey() { + throw new UnsupportedOperationException("暂不支持,也不需要"); + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + throw new UnsupportedOperationException("暂不支持,也不需要"); + } + + @Override + public WriteCellData convertToExcelData(Integer value, ExcelContentProperty contentProperty, + GlobalConfiguration globalConfiguration) { + BigDecimal result = BigDecimal.valueOf(value) + .divide(new BigDecimal(100), 2, RoundingMode.HALF_UP); + return new WriteCellData<>(result.toString()); + } + +} diff --git a/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/handler/CustomSheetWriteHandler.java b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/handler/CustomSheetWriteHandler.java new file mode 100644 index 0000000..c021282 --- /dev/null +++ b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/handler/CustomSheetWriteHandler.java @@ -0,0 +1,52 @@ +package com.win.framework.excel.core.handler; +import com.alibaba.excel.write.handler.SheetWriteHandler; +import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; +import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder; +import org.apache.poi.ss.usermodel.DataValidation; +import org.apache.poi.ss.usermodel.DataValidationConstraint; +import org.apache.poi.ss.usermodel.DataValidationHelper; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.util.CellRangeAddressList; + +import java.util.Map; + +/** + * @author liuchen + */ +public class CustomSheetWriteHandler implements SheetWriteHandler { + + private Map mapDropDown; + + public CustomSheetWriteHandler(Map mapDropDown) { + this.mapDropDown = mapDropDown; + } + + @Override + public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) { + + } + + @Override + public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) { + //获取工作簿 + Sheet sheet = writeSheetHolder.getSheet(); + ///开始设置下拉框 + DataValidationHelper helper = sheet.getDataValidationHelper(); + //设置下拉框 + for (Map.Entry entry : mapDropDown.entrySet()) { + /*起始行、终止行、起始列、终止列 起始行为1即表示表头不设置**/ + //这里设置65535可能又问题,因为这个是excel的最大行数,如果数据量超过这个数,就会报错 + CellRangeAddressList addressList = new CellRangeAddressList(1, 65535, entry.getKey(), entry.getKey()); + /*设置下拉框数据**/ + DataValidationConstraint constraint = helper.createExplicitListConstraint(entry.getValue()); + DataValidation dataValidation = helper.createValidation(constraint, addressList); + //阻止输入非下拉选项的值 + dataValidation.setErrorStyle(DataValidation.ErrorStyle.STOP); + dataValidation.setShowErrorBox(true); + dataValidation.setSuppressDropDownArrow(true); + dataValidation.createErrorBox("提示", "输入值与单元格定义格式不一致"); + dataValidation.createPromptBox("填写说明", "填写内容只能为下拉数据集中的类型"); + sheet.addValidationData(dataValidation); + } + } +} \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/util/ConvertUtil.java b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/util/ConvertUtil.java new file mode 100644 index 0000000..2509c6d --- /dev/null +++ b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/util/ConvertUtil.java @@ -0,0 +1,191 @@ +package com.win.framework.excel.core.util; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.ReflectUtil; +import com.google.common.base.Objects; +import com.win.framework.common.exception.ServiceException; +import com.win.framework.excel.core.annotations.OnlyOne; +import com.win.framework.excel.core.annotations.SubObject; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.ParameterizedType; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +@Data +@Slf4j +public class ConvertUtil { + + /** + * excel数据 + */ + private List dataList; + + /** + * 判断重复的属性方法 + */ + private String methodName; + + /** + * 子类 + */ + private String subObjectMethodName; + + /** + * 主表class + */ + private Class mainClass; + + /** + * 子表class + */ + private String subClassName; + + /** + * 构造函数 + */ + public ConvertUtil(Class mainClass) { + dataList = new ArrayList<>(); + this.mainClass = mainClass; + } + + public ConvertUtil invoke(List dataList) { + if(this.methodName == null) { + String methodName = this.getOnlyOneAnnotation(); + if(methodName == null) { + throw new ServiceException().setMessage("未发现OnlyOne注解属性"); + } + this.methodName = methodName; + } + if(this.subObjectMethodName == null) { + String subObjectMethodName = this.getSubObjectAnnotation(); + if(subObjectMethodName == null) { + throw new ServiceException().setMessage("未发现SubObject注解属性"); + } + this.subObjectMethodName = subObjectMethodName; + } + for(Object object : dataList) { + this.buildEntity(object); + } + return this; + } + + /** + * 判断数据是否存在 + */ + private T checkDataIsExist(Object object) { + for(T obj : dataList) { + T methodValue1 = ReflectUtil.invoke(obj, "get" + this.methodName); + Object methodValue2 = ReflectUtil.invoke(object, "get" + this.methodName); + if(methodValue1.equals(methodValue2)) { + return obj; + } + } + return null; + } + + /** + * 添加数据 + * @param vo + */ + @SuppressWarnings("unchecked") + private void buildEntity(Object vo) { + T mainObject = this.checkDataIsExist(vo); + Object subObject; + try {//创建子数据对象 + subObject = Class.forName(this.subClassName).newInstance(); + } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { + throw new RuntimeException(e); + } + BeanUtil.copyProperties(vo, subObject); + if(mainObject == null) {//list中不存在主数据 + try {//创建主数据对象 + mainObject = (T) Class.forName(this.mainClass.getName()).newInstance(); + } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { + throw new RuntimeException(e); + } + BeanUtil.copyProperties(vo, mainObject); + Method setMethod = null; + List subClassList = new ArrayList<>(); + subClassList.add(subObject); + try { + setMethod = this.mainClass.getMethod("set" + this.subObjectMethodName, List.class); + setMethod.invoke(mainObject, subClassList); + } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { + throw new RuntimeException(e); + } + dataList.add(mainObject); + } else {//list中存在主数据,只添加子数据 + Method getMethod = ReflectUtil.getMethod(this.mainClass, "get" + this.subObjectMethodName); + List subClassList = ReflectUtil.invoke(mainObject, getMethod); + subClassList.add(subObject); + Method setMethod = ReflectUtil.getMethod(this.mainClass, "set" + this.subObjectMethodName); + ReflectUtil.invoke(mainObject, setMethod, subClassList); + } + } + + private String getOnlyOneAnnotation() { + Field[] fields = this.getAllFields(this.mainClass); + for (Field field : fields) { + // 只判断该字段拥有非空注解 + if (field.isAnnotationPresent(OnlyOne.class)) { + //获取属性的名字 + String attributeName = field.getName(); + //将属性名字的首字母大写 + return Character.toUpperCase(attributeName.charAt(0)) + attributeName.substring(1); + } + } + return null; + } + + private String getSubObjectAnnotation() { + Field[] fields = this.getAllFields(this.mainClass); + for (Field field : fields) { + // 只判断该字段拥有非空注解 + if (field.isAnnotationPresent(SubObject.class)) { + Class fieldType = field.getType(); + if (Collection.class.isAssignableFrom(fieldType)) { + java.lang.reflect.Type[] actualType = ((ParameterizedType) field.getGenericType()).getActualTypeArguments(); + if (actualType.length != 1 || actualType[0] == null || actualType[0].toString().length() < 5 || !Objects.equal(actualType[0].toString().substring(0, 5).toLowerCase(), "class")){ + // 非class类型的不处理 + throw new ServiceException().setMessage("SubObject非泛型"); + } + this.subClassName = actualType[0].getTypeName(); + } else { + throw new ServiceException().setMessage("SubObject注解属性必须是Collection实现类"); + } + //获取属性的名字 + String attributeName = field.getName(); + //将属性名字的首字母大写 + return Character.toUpperCase(attributeName.charAt(0)) + attributeName.substring(1); + } + } + return null; + } + /** + *

获取自己及继承自父类的所有字段,包括私有字段和受保护字段,可以使用反射 API 中的 getDeclaredFields() 方法来递归获取父类的字段。

+ * + * @param clazz clazz + * @return {@link Field[] } + * @see Class + * @see Field[] + */ + private Field[] getAllFields(Class clazz) { + Field[] fields = clazz.getDeclaredFields(); + Class parent = clazz.getSuperclass(); + if (parent != null) { + Field[] parentFields = getAllFields(parent); + Field[] allFields = new Field[fields.length + parentFields.length]; + System.arraycopy(fields, 0, allFields, 0, fields.length); + System.arraycopy(parentFields, 0, allFields, fields.length, parentFields.length); + fields = allFields; + } + return fields; + } + +} diff --git a/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/util/ExcelUtils.java b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/util/ExcelUtils.java new file mode 100644 index 0000000..8d8dc73 --- /dev/null +++ b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/util/ExcelUtils.java @@ -0,0 +1,158 @@ +package com.win.framework.excel.core.util; + +import cn.hutool.extra.spring.SpringUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.event.AnalysisEventListener; +import com.alibaba.excel.write.metadata.style.WriteCellStyle; +import com.alibaba.excel.write.metadata.style.WriteFont; +import com.alibaba.excel.write.style.HorizontalCellStyleStrategy; +import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; +import com.win.framework.excel.core.handler.CustomSheetWriteHandler; +import com.win.framework.web.config.WebProperties; +import com.win.framework.web.constant.Constant; +import org.apache.poi.ss.usermodel.BorderStyle; +import org.apache.poi.ss.usermodel.HorizontalAlignment; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.ss.usermodel.VerticalAlignment; +import org.springframework.util.ResourceUtils; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.net.URLEncoder; +import java.time.LocalDateTime; +import java.time.ZoneOffset; +import java.util.List; +import java.util.Map; + +/** + * Excel 工具类 + * + * @author 闻荫源码 + */ +public class ExcelUtils { + + /** + * 将列表以 Excel 响应给前端 + * + * @param response 响应 + * @param filename 文件名 + * @param sheetName Excel sheet 名 + * @param head Excel head 头 + * @param data 数据列表哦 + * @param 泛型,保证 head 和 data 类型的一致性 + * @throws IOException 写入失败的情况 + */ + public static void write(HttpServletResponse response, String filename, String sheetName, Class head, List data) throws IOException { + // 输出 Excel + EasyExcel.write(response.getOutputStream(), head) + .autoCloseStream(false) // 不要自动关闭,交给 Servlet 自己处理 + .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 基于 column 长度,自动适配。最大 255 宽度 + .sheet(sheetName).doWrite(data); + // 设置 header 和 contentType。写在最后的原因是,避免报错时,响应 contentType 已经被修改了 + response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8")); + response.setContentType("application/vnd.ms-excel;charset=UTF-8"); + } + + /** + * 将列表以 Excel 响应给前端 + * + * @param response 响应 + * @param filename 文件名 + * @param sheetName Excel sheet 名 + * @param head Excel head 头 + * @param data 数据列表哦 + * @param mapDropDown 下拉数据 + * @param 泛型,保证 head 和 data 类型的一致性 + * @throws IOException 写入失败的情况 + */ + public static void write(HttpServletResponse response, String filename, String sheetName, Class head, List data, Map mapDropDown) throws IOException { + // 输出 Excel + EasyExcel.write(response.getOutputStream(), head) + .autoCloseStream(false) // 不要自动关闭,交给 Servlet 自己处理 + .registerWriteHandler(new CustomSheetWriteHandler(mapDropDown)) + .registerWriteHandler(getStyleStrategy()) // 设置excel样式 + .sheet(sheetName).doWrite(data); + // 设置 header 和 contentType。写在最后的原因是,避免报错时,响应 contentType 已经被修改了 + response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8")); + response.setContentType("application/vnd.ms-excel;charset=UTF-8"); + } + + public static List read(MultipartFile file, Class head) throws IOException { + return EasyExcel.read(file.getInputStream(), head, null) + .autoCloseStream(false) // 不要自动关闭,交给 Servlet 自己处理 + .doReadAllSync(); + } + + public static List read(MultipartFile file, Class head, AnalysisEventListener listener) throws IOException { + return EasyExcel.read(file.getInputStream(), head, listener) + .autoCloseStream(false) // 不要自动关闭,交给 Servlet 自己处理 + .doReadAllSync(); + } + + /** + * 写入本地文件 + * @param fileName + * @param sheetName + * @param dataList + * @return + * @throws FileNotFoundException + */ + public static String writeLocalFile(String fileName, String sheetName, List dataList) throws FileNotFoundException { + WebProperties webProperties = SpringUtil.getBean(WebProperties.class); + File file = ResourceUtils.getFile( webProperties.getProfile() + "/" + fileName); + EasyExcel.write(file).sheet(sheetName).doWrite(dataList); + return Constant.RESOURCE_PREFIX + fileName; + } + + /** + * 设置excel样式 + * + * @return + */ + public static HorizontalCellStyleStrategy getStyleStrategy() { + // 头的策略 样式调整 + WriteCellStyle headWriteCellStyle = new WriteCellStyle(); + // 头背景 浅绿 + headWriteCellStyle.setFillForegroundColor(IndexedColors.LIGHT_GREEN.getIndex()); + WriteFont headWriteFont = new WriteFont(); + // 头字号 + headWriteFont.setFontHeightInPoints((short) 14); + // 字体样式 + headWriteFont.setFontName("宋体"); + headWriteCellStyle.setWriteFont(headWriteFont); + // 自动换行 + headWriteCellStyle.setWrapped(true); + // 设置细边框 + headWriteCellStyle.setBorderBottom(BorderStyle.THIN); + headWriteCellStyle.setBorderLeft(BorderStyle.THIN); + headWriteCellStyle.setBorderRight(BorderStyle.THIN); + headWriteCellStyle.setBorderTop(BorderStyle.THIN); + // 设置边框颜色 25灰度 + headWriteCellStyle.setBottomBorderColor(IndexedColors.GREY_25_PERCENT.getIndex()); + headWriteCellStyle.setTopBorderColor(IndexedColors.GREY_25_PERCENT.getIndex()); + headWriteCellStyle.setLeftBorderColor(IndexedColors.GREY_25_PERCENT.getIndex()); + headWriteCellStyle.setRightBorderColor(IndexedColors.GREY_25_PERCENT.getIndex()); + // 水平对齐方式 + headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER); + // 垂直对齐方式 + headWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER); + // 内容的策略 宋体 + WriteCellStyle contentStyle = new WriteCellStyle(); + // 设置垂直居中 + contentStyle.setVerticalAlignment(VerticalAlignment.CENTER); + // 设置 水平居中 + contentStyle.setHorizontalAlignment(HorizontalAlignment.CENTER); + WriteFont contentWriteFont = new WriteFont(); + // 内容字号 + contentWriteFont.setFontHeightInPoints((short) 12); + // 字体样式 + contentWriteFont.setFontName("宋体"); + contentStyle.setWriteFont(contentWriteFont); + // 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现 + return new HorizontalCellStyleStrategy(headWriteCellStyle, contentStyle); + } + +} diff --git a/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/package-info.java b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/package-info.java new file mode 100644 index 0000000..bdd8936 --- /dev/null +++ b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/package-info.java @@ -0,0 +1,4 @@ +/** + * 基于 EasyExcel 实现 Excel 相关的操作 + */ +package com.win.framework.excel; diff --git a/win-framework/win-spring-boot-starter-file/pom.xml b/win-framework/win-spring-boot-starter-file/pom.xml new file mode 100644 index 0000000..0772fdb --- /dev/null +++ b/win-framework/win-spring-boot-starter-file/pom.xml @@ -0,0 +1,83 @@ + + + + com.win + win-framework + ${revision} + + 4.0.0 + win-spring-boot-starter-file + + ${project.artifactId} + 文件客户端,支持多种存储器 + 1. file:本地磁盘 + 2. ftp:FTP 服务器 + 2. sftp:SFTP 服务器 + 4. db:数据库 + 5. s3:支持 S3 协议的云存储服务,例如说 MinIO、阿里云、华为云、腾讯云、七牛云等等 + + https://github.com/YunaiV/ruoyi-vue-pro + + + + com.win + win-common + + + + + org.springframework.boot + spring-boot-starter + + + + + org.springframework.boot + spring-boot-starter-validation + + + + org.slf4j + slf4j-api + + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.core + jackson-core + + + + commons-net + commons-net + + + com.jcraft + jsch + + + + org.apache.tika + tika-core + + + + + io.minio + minio + + + + + com.win + win-spring-boot-starter-test + test + + + + diff --git a/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/config/WinFileAutoConfiguration.java b/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/config/WinFileAutoConfiguration.java new file mode 100644 index 0000000..301bda3 --- /dev/null +++ b/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/config/WinFileAutoConfiguration.java @@ -0,0 +1,21 @@ +package com.win.framework.file.config; + +import com.win.framework.file.core.client.FileClientFactory; +import com.win.framework.file.core.client.FileClientFactoryImpl; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.context.annotation.Bean; + +/** + * 文件配置类 + * + * @author 闻荫源码 + */ +@AutoConfiguration +public class WinFileAutoConfiguration { + + @Bean + public FileClientFactory fileClientFactory() { + return new FileClientFactoryImpl(); + } + +} diff --git a/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/AbstractFileClient.java b/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/AbstractFileClient.java new file mode 100644 index 0000000..4cc0ffb --- /dev/null +++ b/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/AbstractFileClient.java @@ -0,0 +1,69 @@ +package com.win.framework.file.core.client; + +import cn.hutool.core.util.StrUtil; +import lombok.extern.slf4j.Slf4j; + +/** + * 文件客户端的抽象类,提供模板方法,减少子类的冗余代码 + * + * @author 闻荫源码 + */ +@Slf4j +public abstract class AbstractFileClient implements FileClient { + + /** + * 配置编号 + */ + private final Long id; + /** + * 文件配置 + */ + protected Config config; + + public AbstractFileClient(Long id, Config config) { + this.id = id; + this.config = config; + } + + /** + * 初始化 + */ + public final void init() { + doInit(); + log.debug("[init][配置({}) 初始化完成]", config); + } + + /** + * 自定义初始化 + */ + protected abstract void doInit(); + + public final void refresh(Config config) { + // 判断是否更新 + if (config.equals(this.config)) { + return; + } + log.info("[refresh][配置({})发生变化,重新初始化]", config); + this.config = config; + // 初始化 + this.init(); + } + + @Override + public Long getId() { + return id; + } + + /** + * 格式化文件的 URL 访问地址 + * 使用场景:local、ftp、db,通过 FileController 的 getFile 来获取文件内容 + * + * @param domain 自定义域名 + * @param path 文件路径 + * @return URL 访问地址 + */ + protected String formatFileUrl(String domain, String path) { + return StrUtil.format("{}/admin-api/infra/file/{}/get/{}", domain, getId(), path); + } + +} diff --git a/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/FileClient.java b/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/FileClient.java new file mode 100644 index 0000000..6c3c8eb --- /dev/null +++ b/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/FileClient.java @@ -0,0 +1,43 @@ +package com.win.framework.file.core.client; + +/** + * 文件客户端 + * + * @author 闻荫源码 + */ +public interface FileClient { + + /** + * 获得客户端编号 + * + * @return 客户端编号 + */ + Long getId(); + + /** + * 上传文件 + * + * @param content 文件流 + * @param path 相对路径 + * @return 完整路径,即 HTTP 访问地址 + * @throws Exception 上传文件时,抛出 Exception 异常 + */ + String upload(byte[] content, String path, String type) throws Exception; + + /** + * 删除文件 + * + * @param path 相对路径 + * @throws Exception 删除文件时,抛出 Exception 异常 + */ + void delete(String path) throws Exception; + + /** + * 获得文件的内容 + * + * @param path 相对路径 + * @return 文件的内容 + */ + byte[] getContent(String path) throws Exception; + +} diff --git a/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/FileClientConfig.java b/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/FileClientConfig.java new file mode 100644 index 0000000..17b22d6 --- /dev/null +++ b/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/FileClientConfig.java @@ -0,0 +1,16 @@ +package com.win.framework.file.core.client; + +import com.fasterxml.jackson.annotation.JsonTypeInfo; + +/** + * 文件客户端的配置 + * 不同实现的客户端,需要不同的配置,通过子类来定义 + * + * @author 闻荫源码 + */ +@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS) +// @JsonTypeInfo 注解的作用,Jackson 多态 +// 1. 序列化到时数据库时,增加 @class 属性。 +// 2. 反序列化到内存对象时,通过 @class 属性,可以创建出正确的类型 +public interface FileClientConfig { +} diff --git a/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/FileClientFactory.java b/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/FileClientFactory.java new file mode 100644 index 0000000..334d616 --- /dev/null +++ b/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/FileClientFactory.java @@ -0,0 +1,22 @@ +package com.win.framework.file.core.client; + +public interface FileClientFactory { + + /** + * 获得文件客户端 + * + * @param configId 配置编号 + * @return 文件客户端 + */ + FileClient getFileClient(Long configId); + + /** + * 创建文件客户端 + * + * @param configId 配置编号 + * @param storage 存储器的枚举 {@link com.win.framework.file.core.enums.FileStorageEnum} + * @param config 文件配置 + */ + void createOrUpdateFileClient(Long configId, Integer storage, Config config); + +} diff --git a/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/FileClientFactoryImpl.java b/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/FileClientFactoryImpl.java new file mode 100644 index 0000000..2f72096 --- /dev/null +++ b/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/FileClientFactoryImpl.java @@ -0,0 +1,56 @@ +package com.win.framework.file.core.client; + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ReflectUtil; +import com.win.framework.file.core.enums.FileStorageEnum; +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +/** + * 文件客户端的工厂实现类 + * + * @author 闻荫源码 + */ +@Slf4j +public class FileClientFactoryImpl implements FileClientFactory { + + /** + * 文件客户端 Map + * key:配置编号 + */ + private final ConcurrentMap> clients = new ConcurrentHashMap<>(); + + @Override + public FileClient getFileClient(Long configId) { + AbstractFileClient client = clients.get(configId); + if (client == null) { + log.error("[getFileClient][配置编号({}) 找不到客户端]", configId); + } + return client; + } + + @Override + @SuppressWarnings("unchecked") + public void createOrUpdateFileClient(Long configId, Integer storage, Config config) { + AbstractFileClient client = (AbstractFileClient) clients.get(configId); + if (client == null) { + client = this.createFileClient(configId, storage, config); + client.init(); + clients.put(client.getId(), client); + } else { + client.refresh(config); + } + } + + @SuppressWarnings("unchecked") + private AbstractFileClient createFileClient( + Long configId, Integer storage, Config config) { + FileStorageEnum storageEnum = FileStorageEnum.getByStorage(storage); + Assert.notNull(storageEnum, String.format("文件配置(%s) 为空", storageEnum)); + // 创建客户端 + return (AbstractFileClient) ReflectUtil.newInstance(storageEnum.getClientClass(), configId, config); + } + +} diff --git a/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/db/DBFileClient.java b/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/db/DBFileClient.java new file mode 100644 index 0000000..973b002 --- /dev/null +++ b/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/db/DBFileClient.java @@ -0,0 +1,48 @@ +package com.win.framework.file.core.client.db; + +import cn.hutool.extra.spring.SpringUtil; +import com.win.framework.file.core.client.AbstractFileClient; + +/** + * 基于 DB 存储的文件客户端的配置类 + * + * @author 闻荫源码 + */ +public class DBFileClient extends AbstractFileClient { + + private DBFileContentFrameworkDAO dao; + + public DBFileClient(Long id, DBFileClientConfig config) { + super(id, config); + } + + @Override + protected void doInit() { + } + + @Override + public String upload(byte[] content, String path, String type) { + getDao().insert(getId(), path, content); + // 拼接返回路径 + return super.formatFileUrl(config.getDomain(), path); + } + + @Override + public void delete(String path) { + getDao().delete(getId(), path); + } + + @Override + public byte[] getContent(String path) { + return getDao().selectContent(getId(), path); + } + + private DBFileContentFrameworkDAO getDao() { + // 延迟获取,因为 SpringUtil 初始化太慢 + if (dao == null) { + dao = SpringUtil.getBean(DBFileContentFrameworkDAO.class); + } + return dao; + } + +} diff --git a/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/db/DBFileClientConfig.java b/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/db/DBFileClientConfig.java new file mode 100644 index 0000000..aad1f00 --- /dev/null +++ b/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/db/DBFileClientConfig.java @@ -0,0 +1,24 @@ +package com.win.framework.file.core.client.db; + +import com.win.framework.file.core.client.FileClientConfig; +import lombok.Data; +import org.hibernate.validator.constraints.URL; + +import javax.validation.constraints.NotEmpty; + +/** + * 基于 DB 存储的文件客户端的配置类 + * + * @author 闻荫源码 + */ +@Data +public class DBFileClientConfig implements FileClientConfig { + + /** + * 自定义域名 + */ + @NotEmpty(message = "domain 不能为空") + @URL(message = "domain 必须是 URL 格式") + private String domain; + +} diff --git a/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/db/DBFileContentFrameworkDAO.java b/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/db/DBFileContentFrameworkDAO.java new file mode 100644 index 0000000..e024ac5 --- /dev/null +++ b/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/db/DBFileContentFrameworkDAO.java @@ -0,0 +1,36 @@ +package com.win.framework.file.core.client.db; + +/** + * 文件内容 Framework DAO 接口 + * + * @author 闻荫源码 + */ +public interface DBFileContentFrameworkDAO { + + /** + * 插入文件内容 + * + * @param configId 配置编号 + * @param path 路径 + * @param content 内容 + */ + void insert(Long configId, String path, byte[] content); + + /** + * 删除文件内容 + * + * @param configId 配置编号 + * @param path 路径 + */ + void delete(Long configId, String path); + + /** + * 获得文件内容 + * + * @param configId 配置编号 + * @param path 路径 + * @return 内容 + */ + byte[] selectContent(Long configId, String path); + +} diff --git a/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/ftp/FtpFileClient.java b/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/ftp/FtpFileClient.java new file mode 100644 index 0000000..dc9b8ca --- /dev/null +++ b/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/ftp/FtpFileClient.java @@ -0,0 +1,77 @@ +package com.win.framework.file.core.client.ftp; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.CharsetUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.ftp.Ftp; +import cn.hutool.extra.ftp.FtpException; +import cn.hutool.extra.ftp.FtpMode; +import com.win.framework.file.core.client.AbstractFileClient; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; + +/** + * Ftp 文件客户端 + * + * @author 闻荫源码 + */ +public class FtpFileClient extends AbstractFileClient { + + private Ftp ftp; + + public FtpFileClient(Long id, FtpFileClientConfig config) { + super(id, config); + } + + @Override + protected void doInit() { + // 把配置的 \ 替换成 /, 如果路径配置 \a\test, 替换成 /a/test, 替换方法已经处理 null 情况 + config.setBasePath(StrUtil.replace(config.getBasePath(), StrUtil.BACKSLASH, StrUtil.SLASH)); + // ftp的路径是 / 结尾 + if (!config.getBasePath().endsWith(StrUtil.SLASH)) { + config.setBasePath(config.getBasePath() + StrUtil.SLASH); + } + // 初始化 Ftp 对象 + this.ftp = new Ftp(config.getHost(), config.getPort(), config.getUsername(), config.getPassword(), + CharsetUtil.CHARSET_UTF_8, null, null, FtpMode.valueOf(config.getMode())); + } + + @Override + public String upload(byte[] content, String path, String type) { + // 执行写入 + String filePath = getFilePath(path); + String fileName = FileUtil.getName(filePath); + String dir = StrUtil.removeSuffix(filePath, fileName); + ftp.reconnectIfTimeout(); + boolean success = ftp.upload(dir, fileName, new ByteArrayInputStream(content)); + if (!success) { + throw new FtpException(StrUtil.format("上传文件到目标目录 ({}) 失败", filePath)); + } + // 拼接返回路径 + return super.formatFileUrl(config.getDomain(), path); + } + + @Override + public void delete(String path) { + String filePath = getFilePath(path); + ftp.reconnectIfTimeout(); + ftp.delFile(filePath); + } + + @Override + public byte[] getContent(String path) { + String filePath = getFilePath(path); + String fileName = FileUtil.getName(filePath); + String dir = StrUtil.removeSuffix(filePath, fileName); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + ftp.reconnectIfTimeout(); + ftp.download(dir, fileName, out); + return out.toByteArray(); + } + + private String getFilePath(String path) { + return config.getBasePath() + path; + } + +} \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/ftp/FtpFileClientConfig.java b/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/ftp/FtpFileClientConfig.java new file mode 100644 index 0000000..0626468 --- /dev/null +++ b/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/ftp/FtpFileClientConfig.java @@ -0,0 +1,59 @@ +package com.win.framework.file.core.client.ftp; + +import com.win.framework.file.core.client.FileClientConfig; +import lombok.Data; +import org.hibernate.validator.constraints.URL; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +/** + * Ftp 文件客户端的配置类 + * + * @author 闻荫源码 + */ +@Data +public class FtpFileClientConfig implements FileClientConfig { + + /** + * 基础路径 + */ + @NotEmpty(message = "基础路径不能为空") + private String basePath; + + /** + * 自定义域名 + */ + @NotEmpty(message = "domain 不能为空") + @URL(message = "domain 必须是 URL 格式") + private String domain; + + /** + * 主机地址 + */ + @NotEmpty(message = "host 不能为空") + private String host; + /** + * 主机端口 + */ + @NotNull(message = "port 不能为空") + private Integer port; + /** + * 用户名 + */ + @NotEmpty(message = "用户名不能为空") + private String username; + /** + * 密码 + */ + @NotEmpty(message = "密码不能为空") + private String password; + /** + * 连接模式 + * + * 使用 {@link cn.hutool.extra.ftp.FtpMode} 对应的字符串 + */ + @NotEmpty(message = "连接模式不能为空") + private String mode; + +} diff --git a/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/local/LocalFileClient.java b/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/local/LocalFileClient.java new file mode 100644 index 0000000..6484f09 --- /dev/null +++ b/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/local/LocalFileClient.java @@ -0,0 +1,52 @@ +package com.win.framework.file.core.client.local; + +import cn.hutool.core.io.FileUtil; +import com.win.framework.file.core.client.AbstractFileClient; + +import java.io.File; + +/** + * 本地文件客户端 + * + * @author 闻荫源码 + */ +public class LocalFileClient extends AbstractFileClient { + + public LocalFileClient(Long id, LocalFileClientConfig config) { + super(id, config); + } + + @Override + protected void doInit() { + // 补全风格。例如说 Linux 是 /,Windows 是 \ + if (!config.getBasePath().endsWith(File.separator)) { + config.setBasePath(config.getBasePath() + File.separator); + } + } + + @Override + public String upload(byte[] content, String path, String type) { + // 执行写入 + String filePath = getFilePath(path); + FileUtil.writeBytes(content, filePath); + // 拼接返回路径 + return super.formatFileUrl(config.getDomain(), path); + } + + @Override + public void delete(String path) { + String filePath = getFilePath(path); + FileUtil.del(filePath); + } + + @Override + public byte[] getContent(String path) { + String filePath = getFilePath(path); + return FileUtil.readBytes(filePath); + } + + private String getFilePath(String path) { + return config.getBasePath() + path; + } + +} diff --git a/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/local/LocalFileClientConfig.java b/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/local/LocalFileClientConfig.java new file mode 100644 index 0000000..c0dbbe8 --- /dev/null +++ b/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/local/LocalFileClientConfig.java @@ -0,0 +1,30 @@ +package com.win.framework.file.core.client.local; + +import com.win.framework.file.core.client.FileClientConfig; +import lombok.Data; +import org.hibernate.validator.constraints.URL; + +import javax.validation.constraints.NotEmpty; + +/** + * 本地文件客户端的配置类 + * + * @author 闻荫源码 + */ +@Data +public class LocalFileClientConfig implements FileClientConfig { + + /** + * 基础路径 + */ + @NotEmpty(message = "基础路径不能为空") + private String basePath; + + /** + * 自定义域名 + */ + @NotEmpty(message = "domain 不能为空") + @URL(message = "domain 必须是 URL 格式") + private String domain; + +} diff --git a/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/s3/S3FileClient.java b/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/s3/S3FileClient.java new file mode 100644 index 0000000..7300fe6 --- /dev/null +++ b/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/s3/S3FileClient.java @@ -0,0 +1,120 @@ +package com.win.framework.file.core.client.s3; + +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpUtil; +import com.win.framework.file.core.client.AbstractFileClient; +import io.minio.*; + +import java.io.ByteArrayInputStream; + +import static com.win.framework.file.core.client.s3.S3FileClientConfig.ENDPOINT_ALIYUN; +import static com.win.framework.file.core.client.s3.S3FileClientConfig.ENDPOINT_TENCENT; + +/** + * 基于 S3 协议的文件客户端,实现 MinIO、阿里云、腾讯云、七牛云、华为云等云服务 + *

+ * S3 协议的客户端,采用亚马逊提供的 software.amazon.awssdk.s3 库 + * + * @author 闻荫源码 + */ +public class S3FileClient extends AbstractFileClient { + + private MinioClient client; + + public S3FileClient(Long id, S3FileClientConfig config) { + super(id, config); + } + + @Override + protected void doInit() { + // 补全 domain + if (StrUtil.isEmpty(config.getDomain())) { + config.setDomain(buildDomain()); + } + // 初始化客户端 + client = MinioClient.builder() + .endpoint(buildEndpointURL()) // Endpoint URL + .region(buildRegion()) // Region + .credentials(config.getAccessKey(), config.getAccessSecret()) // 认证密钥 + .build(); + } + + /** + * 基于 endpoint 构建调用云服务的 URL 地址 + * + * @return URI 地址 + */ + private String buildEndpointURL() { + // 如果已经是 http 或者 https,则不进行拼接.主要适配 MinIO + if (HttpUtil.isHttp(config.getEndpoint()) || HttpUtil.isHttps(config.getEndpoint())) { + return config.getEndpoint(); + } + return StrUtil.format("https://{}", config.getEndpoint()); + } + + /** + * 基于 bucket + endpoint 构建访问的 Domain 地址 + * + * @return Domain 地址 + */ + private String buildDomain() { + // 如果已经是 http 或者 https,则不进行拼接.主要适配 MinIO + if (HttpUtil.isHttp(config.getEndpoint()) || HttpUtil.isHttps(config.getEndpoint())) { + return StrUtil.format("{}/{}", config.getEndpoint(), config.getBucket()); + } + // 阿里云、腾讯云、华为云都适合。七牛云比较特殊,必须有自定义域名 + return StrUtil.format("https://{}.{}", config.getBucket(), config.getEndpoint()); + } + + /** + * 基于 bucket 构建 region 地区 + * + * @return region 地区 + */ + private String buildRegion() { + // 阿里云必须有 region,否则会报错 + if (config.getEndpoint().contains(ENDPOINT_ALIYUN)) { + return StrUtil.subBefore(config.getEndpoint(), '.', false) + .replaceAll("-internal", "")// 去除内网 Endpoint 的后缀 + .replaceAll("https://", ""); + } + // 腾讯云必须有 region,否则会报错 + if (config.getEndpoint().contains(ENDPOINT_TENCENT)) { + return StrUtil.subAfter(config.getEndpoint(), ".cos.", false) + .replaceAll("." + ENDPOINT_TENCENT, ""); // 去除 Endpoint + } + return null; + } + + @Override + public String upload(byte[] content, String path, String type) throws Exception { + // 执行上传 + client.putObject(PutObjectArgs.builder() + .bucket(config.getBucket()) // bucket 必须传递 + .contentType(type) + .object(path) // 相对路径作为 key + .stream(new ByteArrayInputStream(content), content.length, -1) // 文件内容 + .build()); + // 拼接返回路径 + return config.getDomain() + "/" + path; + } + + @Override + public void delete(String path) throws Exception { + client.removeObject(RemoveObjectArgs.builder() + .bucket(config.getBucket()) // bucket 必须传递 + .object(path) // 相对路径作为 key + .build()); + } + + @Override + public byte[] getContent(String path) throws Exception { + GetObjectResponse response = client.getObject(GetObjectArgs.builder() + .bucket(config.getBucket()) // bucket 必须传递 + .object(path) // 相对路径作为 key + .build()); + return IoUtil.readBytes(response); + } + +} diff --git a/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/s3/S3FileClientConfig.java b/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/s3/S3FileClientConfig.java new file mode 100644 index 0000000..ce94af4 --- /dev/null +++ b/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/s3/S3FileClientConfig.java @@ -0,0 +1,77 @@ +package com.win.framework.file.core.client.s3; + +import cn.hutool.core.util.StrUtil; +import com.win.framework.file.core.client.FileClientConfig; +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; +import org.hibernate.validator.constraints.URL; + +import javax.validation.constraints.AssertTrue; +import javax.validation.constraints.NotNull; + +/** + * S3 文件客户端的配置类 + * + * @author 闻荫源码 + */ +@Data +public class S3FileClientConfig implements FileClientConfig { + + public static final String ENDPOINT_QINIU = "qiniucs.com"; + public static final String ENDPOINT_ALIYUN = "aliyuncs.com"; + public static final String ENDPOINT_TENCENT = "myqcloud.com"; + + /** + * 节点地址 + * 1. MinIO:https://www.iocoder.cn/Spring-Boot/MinIO 。例如说,http://127.0.0.1:9000 + * 2. 阿里云:https://help.aliyun.com/document_detail/31837.html + * 3. 腾讯云:https://cloud.tencent.com/document/product/436/6224 + * 4. 七牛云:https://developer.qiniu.com/kodo/4088/s3-access-domainname + * 5. 华为云:https://developer.huaweicloud.com/endpoint?OBS + */ + @NotNull(message = "endpoint 不能为空") + private String endpoint; + /** + * 自定义域名 + * 1. MinIO:通过 Nginx 配置 + * 2. 阿里云:https://help.aliyun.com/document_detail/31836.html + * 3. 腾讯云:https://cloud.tencent.com/document/product/436/11142 + * 4. 七牛云:https://developer.qiniu.com/kodo/8556/set-the-custom-source-domain-name + * 5. 华为云:https://support.huaweicloud.com/usermanual-obs/obs_03_0032.html + */ + @URL(message = "domain 必须是 URL 格式") + private String domain; + /** + * 存储 Bucket + */ + @NotNull(message = "bucket 不能为空") + private String bucket; + + /** + * 访问 Key + * 1. MinIO:https://www.iocoder.cn/Spring-Boot/MinIO + * 2. 阿里云:https://ram.console.aliyun.com/manage/ak + * 3. 腾讯云:https://console.cloud.tencent.com/cam/capi + * 4. 七牛云:https://portal.qiniu.com/user/key + * 5. 华为云:https://support.huaweicloud.com/qs-obs/obs_qs_0005.html + */ + @NotNull(message = "accessKey 不能为空") + private String accessKey; + /** + * 访问 Secret + */ + @NotNull(message = "accessSecret 不能为空") + private String accessSecret; + + @SuppressWarnings("RedundantIfStatement") + @AssertTrue(message = "domain 不能为空") + @JsonIgnore + public boolean isDomainValid() { + // 如果是七牛,必须带有 domain + if (StrUtil.contains(endpoint, ENDPOINT_QINIU) && StrUtil.isEmpty(domain)) { + return false; + } + return true; + } + +} diff --git a/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/sftp/SftpFileClient.java b/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/sftp/SftpFileClient.java new file mode 100644 index 0000000..e48e2b7 --- /dev/null +++ b/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/sftp/SftpFileClient.java @@ -0,0 +1,61 @@ +package com.win.framework.file.core.client.sftp; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.extra.ssh.Sftp; +import com.win.framework.common.util.io.FileUtils; +import com.win.framework.file.core.client.AbstractFileClient; + +import java.io.File; + +/** + * Sftp 文件客户端 + * + * @author 闻荫源码 + */ +public class SftpFileClient extends AbstractFileClient { + + private Sftp sftp; + + public SftpFileClient(Long id, SftpFileClientConfig config) { + super(id, config); + } + + @Override + protected void doInit() { + // 补全风格。例如说 Linux 是 /,Windows 是 \ + if (!config.getBasePath().endsWith(File.separator)) { + config.setBasePath(config.getBasePath() + File.separator); + } + // 初始化 Ftp 对象 + this.sftp = new Sftp(config.getHost(), config.getPort(), config.getUsername(), config.getPassword()); + } + + @Override + public String upload(byte[] content, String path, String type) { + // 执行写入 + String filePath = getFilePath(path); + File file = FileUtils.createTempFile(content); + sftp.upload(filePath, file); + // 拼接返回路径 + return super.formatFileUrl(config.getDomain(), path); + } + + @Override + public void delete(String path) { + String filePath = getFilePath(path); + sftp.delFile(filePath); + } + + @Override + public byte[] getContent(String path) { + String filePath = getFilePath(path); + File destFile = FileUtils.createTempFile(); + sftp.download(filePath, destFile); + return FileUtil.readBytes(destFile); + } + + private String getFilePath(String path) { + return config.getBasePath() + path; + } + +} diff --git a/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/sftp/SftpFileClientConfig.java b/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/sftp/SftpFileClientConfig.java new file mode 100644 index 0000000..fc3b679 --- /dev/null +++ b/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/sftp/SftpFileClientConfig.java @@ -0,0 +1,52 @@ +package com.win.framework.file.core.client.sftp; + +import com.win.framework.file.core.client.FileClientConfig; +import lombok.Data; +import org.hibernate.validator.constraints.URL; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +/** + * Sftp 文件客户端的配置类 + * + * @author 闻荫源码 + */ +@Data +public class SftpFileClientConfig implements FileClientConfig { + + /** + * 基础路径 + */ + @NotEmpty(message = "基础路径不能为空") + private String basePath; + + /** + * 自定义域名 + */ + @NotEmpty(message = "domain 不能为空") + @URL(message = "domain 必须是 URL 格式") + private String domain; + + /** + * 主机地址 + */ + @NotEmpty(message = "host 不能为空") + private String host; + /** + * 主机端口 + */ + @NotNull(message = "port 不能为空") + private Integer port; + /** + * 用户名 + */ + @NotEmpty(message = "用户名不能为空") + private String username; + /** + * 密码 + */ + @NotEmpty(message = "密码不能为空") + private String password; + +} diff --git a/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/enums/FileStorageEnum.java b/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/enums/FileStorageEnum.java new file mode 100644 index 0000000..bbf2645 --- /dev/null +++ b/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/enums/FileStorageEnum.java @@ -0,0 +1,55 @@ +package com.win.framework.file.core.enums; + +import cn.hutool.core.util.ArrayUtil; +import com.win.framework.file.core.client.FileClient; +import com.win.framework.file.core.client.FileClientConfig; +import com.win.framework.file.core.client.db.DBFileClient; +import com.win.framework.file.core.client.db.DBFileClientConfig; +import com.win.framework.file.core.client.ftp.FtpFileClient; +import com.win.framework.file.core.client.ftp.FtpFileClientConfig; +import com.win.framework.file.core.client.local.LocalFileClient; +import com.win.framework.file.core.client.local.LocalFileClientConfig; +import com.win.framework.file.core.client.s3.S3FileClient; +import com.win.framework.file.core.client.s3.S3FileClientConfig; +import com.win.framework.file.core.client.sftp.SftpFileClient; +import com.win.framework.file.core.client.sftp.SftpFileClientConfig; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 文件存储器枚举 + * + * @author 闻荫源码 + */ +@AllArgsConstructor +@Getter +public enum FileStorageEnum { + + DB(1, DBFileClientConfig.class, DBFileClient.class), + + LOCAL(10, LocalFileClientConfig.class, LocalFileClient.class), + FTP(11, FtpFileClientConfig.class, FtpFileClient.class), + SFTP(12, SftpFileClientConfig.class, SftpFileClient.class), + + S3(20, S3FileClientConfig.class, S3FileClient.class), + ; + + /** + * 存储器 + */ + private final Integer storage; + + /** + * 配置类 + */ + private final Class configClass; + /** + * 客户端类 + */ + private final Class clientClass; + + public static FileStorageEnum getByStorage(Integer storage) { + return ArrayUtil.firstMatch(o -> o.getStorage().equals(storage), values()); + } + +} diff --git a/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/utils/FileTypeUtils.java b/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/utils/FileTypeUtils.java new file mode 100644 index 0000000..61806e1 --- /dev/null +++ b/win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/utils/FileTypeUtils.java @@ -0,0 +1,48 @@ +package com.win.framework.file.core.utils; + +import com.alibaba.ttl.TransmittableThreadLocal; +import lombok.SneakyThrows; +import org.apache.tika.Tika; + +/** + * 文件类型 Utils + * + * @author 闻荫源码 + */ +public class FileTypeUtils { + + private static final ThreadLocal TIKA = TransmittableThreadLocal.withInitial(Tika::new); + + /** + * 获得文件的 mineType,对于doc,jar等文件会有误差 + * + * @param data 文件内容 + * @return mineType 无法识别时会返回“application/octet-stream” + */ + @SneakyThrows + public static String getMineType(byte[] data) { + return TIKA.get().detect(data); + } + + /** + * 已知文件名,获取文件类型,在某些情况下比通过字节数组准确,例如使用jar文件时,通过名字更为准确 + * + * @param name 文件名 + * @return mineType 无法识别时会返回“application/octet-stream” + */ + public static String getMineType(String name) { + return TIKA.get().detect(name); + } + + /** + * 在拥有文件和数据的情况下,最好使用此方法,最为准确 + * + * @param data 文件内容 + * @param name 文件名 + * @return mineType 无法识别时会返回“application/octet-stream” + */ + public static String getMineType(byte[] data, String name) { + return TIKA.get().detect(data, name); + } + +} diff --git a/win-framework/win-spring-boot-starter-file/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/win-framework/win-spring-boot-starter-file/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..588645a --- /dev/null +++ b/win-framework/win-spring-boot-starter-file/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +com.win.framework.file.config.WinFileAutoConfiguration \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-file/src/test/resources/file/erweima.jpg b/win-framework/win-spring-boot-starter-file/src/test/resources/file/erweima.jpg new file mode 100644 index 0000000..1447283 Binary files /dev/null and b/win-framework/win-spring-boot-starter-file/src/test/resources/file/erweima.jpg differ diff --git a/win-framework/win-spring-boot-starter-flowable/pom.xml b/win-framework/win-spring-boot-starter-flowable/pom.xml new file mode 100644 index 0000000..085e034 --- /dev/null +++ b/win-framework/win-spring-boot-starter-flowable/pom.xml @@ -0,0 +1,37 @@ + + + + win-framework + com.win + ${revision} + + 4.0.0 + + win-spring-boot-starter-flowable + + + + com.win + win-common + + + + + com.win + win-spring-boot-starter-security + + + + + org.flowable + flowable-spring-boot-starter-process + + + org.flowable + flowable-spring-boot-starter-actuator + + + + diff --git a/win-framework/win-spring-boot-starter-flowable/src/main/java/com/win/framework/flowable/config/WinFlowableConfiguration.java b/win-framework/win-spring-boot-starter-flowable/src/main/java/com/win/framework/flowable/config/WinFlowableConfiguration.java new file mode 100644 index 0000000..3b5020c --- /dev/null +++ b/win-framework/win-spring-boot-starter-flowable/src/main/java/com/win/framework/flowable/config/WinFlowableConfiguration.java @@ -0,0 +1,43 @@ +package com.win.framework.flowable.config; + +import com.win.framework.common.enums.WebFilterOrderEnum; +import com.win.framework.flowable.core.web.FlowableWebFilter; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.core.task.AsyncListenableTaskExecutor; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +@AutoConfiguration +public class WinFlowableConfiguration { + + /** + * 参考 {@link org.flowable.spring.boot.FlowableJobConfiguration} 类,创建对应的 AsyncListenableTaskExecutor Bean + * + * 如果不创建,会导致项目启动时,Flowable 报错的问题 + */ + @Bean + public AsyncListenableTaskExecutor taskExecutor() { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(8); + executor.setMaxPoolSize(8); + executor.setQueueCapacity(100); + executor.setThreadNamePrefix("flowable-task-Executor-"); + executor.setAwaitTerminationSeconds(30); + executor.setWaitForTasksToCompleteOnShutdown(true); + executor.setAllowCoreThreadTimeOut(true); + executor.initialize(); + return executor; + } + + /** + * 配置 flowable Web 过滤器 + */ + @Bean + public FilterRegistrationBean flowableWebFilter() { + FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); + registrationBean.setFilter(new FlowableWebFilter()); + registrationBean.setOrder(WebFilterOrderEnum.FLOWABLE_FILTER); + return registrationBean; + } +} diff --git a/win-framework/win-spring-boot-starter-flowable/src/main/java/com/win/framework/flowable/core/package-info.java b/win-framework/win-spring-boot-starter-flowable/src/main/java/com/win/framework/flowable/core/package-info.java new file mode 100644 index 0000000..8be848f --- /dev/null +++ b/win-framework/win-spring-boot-starter-flowable/src/main/java/com/win/framework/flowable/core/package-info.java @@ -0,0 +1 @@ +package com.win.framework.flowable.core; diff --git a/win-framework/win-spring-boot-starter-flowable/src/main/java/com/win/framework/flowable/core/util/FlowableUtils.java b/win-framework/win-spring-boot-starter-flowable/src/main/java/com/win/framework/flowable/core/util/FlowableUtils.java new file mode 100644 index 0000000..796df97 --- /dev/null +++ b/win-framework/win-spring-boot-starter-flowable/src/main/java/com/win/framework/flowable/core/util/FlowableUtils.java @@ -0,0 +1,82 @@ +package com.win.framework.flowable.core.util; + +import org.flowable.bpmn.converter.BpmnXMLConverter; +import org.flowable.bpmn.model.BpmnModel; +import org.flowable.bpmn.model.FlowElement; +import org.flowable.common.engine.impl.identity.Authentication; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * Flowable 相关的工具方法 + * + * @author 闻荫源码 + */ +public class FlowableUtils { + + // ========== User 相关的工具方法 ========== + + public static void setAuthenticatedUserId(Long userId) { + Authentication.setAuthenticatedUserId(String.valueOf(userId)); + } + + public static void clearAuthenticatedUserId() { + Authentication.setAuthenticatedUserId(null); + } + + // ========== BPMN 相关的工具方法 ========== + + /** + * 获得 BPMN 流程中,指定的元素们 + * + * @param model + * @param clazz 指定元素。例如说,{@link org.flowable.bpmn.model.UserTask}、{@link org.flowable.bpmn.model.Gateway} 等等 + * @return 元素们 + */ + public static List getBpmnModelElements(BpmnModel model, Class clazz) { + List result = new ArrayList<>(); + model.getProcesses().forEach(process -> { + process.getFlowElements().forEach(flowElement -> { + if (flowElement.getClass().isAssignableFrom(clazz)) { + result.add((T) flowElement); + } + }); + }); + return result; + } + + /** + * 比较 两个bpmnModel 是否相同 + * @param oldModel 老的bpmn model + * @param newModel 新的bpmn model + */ + public static boolean equals(BpmnModel oldModel, BpmnModel newModel) { + // 由于 BpmnModel 未提供 equals 方法,所以只能转成字节数组,进行比较 + return Arrays.equals(getBpmnBytes(oldModel), getBpmnBytes(newModel)); + } + + /** + * 把 bpmnModel 转换成 byte[] + * @param model bpmnModel + */ + public static byte[] getBpmnBytes(BpmnModel model) { + if (model == null) { + return new byte[0]; + } + BpmnXMLConverter converter = new BpmnXMLConverter(); + return converter.convertToXML(model); + } + + // ========== Execution 相关的工具方法 ========== + + public static String formatCollectionVariable(String activityId) { + return activityId + "_assignees"; + } + + public static String formatCollectionElementVariable(String activityId) { + return activityId + "_assignee"; + } + +} diff --git a/win-framework/win-spring-boot-starter-flowable/src/main/java/com/win/framework/flowable/core/web/FlowableWebFilter.java b/win-framework/win-spring-boot-starter-flowable/src/main/java/com/win/framework/flowable/core/web/FlowableWebFilter.java new file mode 100644 index 0000000..96e5cd5 --- /dev/null +++ b/win-framework/win-spring-boot-starter-flowable/src/main/java/com/win/framework/flowable/core/web/FlowableWebFilter.java @@ -0,0 +1,35 @@ +package com.win.framework.flowable.core.web; + +import com.win.framework.flowable.core.util.FlowableUtils; +import com.win.framework.security.core.util.SecurityFrameworkUtils; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +/** + * flowable Web 过滤器,将 userId 设置到 {@link org.flowable.common.engine.impl.identity.Authentication} 中 + * + * @author jason + */ +public class FlowableWebFilter extends OncePerRequestFilter { + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) + throws ServletException, IOException { + try { + // 设置工作流的用户 + Long userId = SecurityFrameworkUtils.getLoginUserId(); + if (userId != null) { + FlowableUtils.setAuthenticatedUserId(userId); + } + // 过滤 + chain.doFilter(request, response); + } finally { + // 清理 + FlowableUtils.clearAuthenticatedUserId(); + } + } +} diff --git a/win-framework/win-spring-boot-starter-flowable/src/main/java/com/win/framework/flowable/package-info.java b/win-framework/win-spring-boot-starter-flowable/src/main/java/com/win/framework/flowable/package-info.java new file mode 100644 index 0000000..45a823f --- /dev/null +++ b/win-framework/win-spring-boot-starter-flowable/src/main/java/com/win/framework/flowable/package-info.java @@ -0,0 +1 @@ +package com.win.framework.flowable; diff --git a/win-framework/win-spring-boot-starter-flowable/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/win-framework/win-spring-boot-starter-flowable/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..2d59fa9 --- /dev/null +++ b/win-framework/win-spring-boot-starter-flowable/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +com.win.framework.flowable.config.WinFlowableConfiguration \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-job/pom.xml b/win-framework/win-spring-boot-starter-job/pom.xml new file mode 100644 index 0000000..8d5e8eb --- /dev/null +++ b/win-framework/win-spring-boot-starter-job/pom.xml @@ -0,0 +1,41 @@ + + + + com.win + win-framework + ${revision} + + 4.0.0 + win-spring-boot-starter-job + jar + + ${project.artifactId} + 任务拓展 + 1. 定时任务,基于 Quartz 拓展 + 2. 异步任务,基于 Spring Async 拓展 + + https://github.com/YunaiV/ruoyi-vue-pro + + + + com.win + win-common + + + + + org.springframework.boot + spring-boot-starter-quartz + + + + + jakarta.validation + jakarta.validation-api + + + + + diff --git a/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/config/WinAsyncAutoConfiguration.java b/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/config/WinAsyncAutoConfiguration.java new file mode 100644 index 0000000..1257100 --- /dev/null +++ b/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/config/WinAsyncAutoConfiguration.java @@ -0,0 +1,36 @@ +package com.win.framework.quartz.config; + +import com.alibaba.ttl.TtlRunnable; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +/** + * 异步任务 Configuration + */ +@AutoConfiguration +@EnableAsync +public class WinAsyncAutoConfiguration { + + @Bean + public BeanPostProcessor threadPoolTaskExecutorBeanPostProcessor() { + return new BeanPostProcessor() { + + @Override + public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { + if (!(bean instanceof ThreadPoolTaskExecutor)) { + return bean; + } + // 修改提交的任务,接入 TransmittableThreadLocal + ThreadPoolTaskExecutor executor = (ThreadPoolTaskExecutor) bean; + executor.setTaskDecorator(TtlRunnable::get); + return executor; + } + + }; + } + +} diff --git a/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/config/WinQuartzAutoConfiguration.java b/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/config/WinQuartzAutoConfiguration.java new file mode 100644 index 0000000..9e703e1 --- /dev/null +++ b/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/config/WinQuartzAutoConfiguration.java @@ -0,0 +1,29 @@ +package com.win.framework.quartz.config; + +import com.win.framework.quartz.core.scheduler.SchedulerManager; +import lombok.extern.slf4j.Slf4j; +import org.quartz.Scheduler; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.scheduling.annotation.EnableScheduling; + +import java.util.Optional; + +/** + * 定时任务 Configuration + */ +@AutoConfiguration +@EnableScheduling // 开启 Spring 自带的定时任务 +@Slf4j +public class WinQuartzAutoConfiguration { + + @Bean + public SchedulerManager schedulerManager(Optional scheduler) { + if (!scheduler.isPresent()) { + log.info("[定时任务 - 已禁用][参考 https://doc.iocoder.cn/job/ 开启]"); + return new SchedulerManager(null); + } + return new SchedulerManager(scheduler.get()); + } + +} diff --git a/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/core/enums/JobDataKeyEnum.java b/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/core/enums/JobDataKeyEnum.java new file mode 100644 index 0000000..6dbe9a5 --- /dev/null +++ b/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/core/enums/JobDataKeyEnum.java @@ -0,0 +1,14 @@ +package com.win.framework.quartz.core.enums; + +/** + * Quartz Job Data 的 key 枚举 + */ +public enum JobDataKeyEnum { + + JOB_ID, + JOB_HANDLER_NAME, + JOB_HANDLER_PARAM, + JOB_RETRY_COUNT, // 最大重试次数 + JOB_RETRY_INTERVAL, // 每次重试间隔 + +} diff --git a/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/core/handler/JobHandler.java b/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/core/handler/JobHandler.java new file mode 100644 index 0000000..c403596 --- /dev/null +++ b/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/core/handler/JobHandler.java @@ -0,0 +1,19 @@ +package com.win.framework.quartz.core.handler; + +/** + * 任务处理器 + * + * @author 闻荫源码 + */ +public interface JobHandler { + + /** + * 执行任务 + * + * @param param 参数 + * @return 结果 + * @throws Exception 异常 + */ + String execute(String param) throws Exception; + +} diff --git a/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/core/handler/JobHandlerInvoker.java b/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/core/handler/JobHandlerInvoker.java new file mode 100644 index 0000000..ce6106c --- /dev/null +++ b/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/core/handler/JobHandlerInvoker.java @@ -0,0 +1,114 @@ +package com.win.framework.quartz.core.handler; + +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.thread.ThreadUtil; +import com.win.framework.quartz.core.enums.JobDataKeyEnum; +import com.win.framework.quartz.core.service.JobLogFrameworkService; +import lombok.extern.slf4j.Slf4j; +import org.quartz.DisallowConcurrentExecution; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.quartz.PersistJobDataAfterExecution; +import org.springframework.context.ApplicationContext; +import org.springframework.scheduling.quartz.QuartzJobBean; + +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; + +import static cn.hutool.core.exceptions.ExceptionUtil.getRootCauseMessage; + +/** + * 基础 Job 调用者,负责调用 {@link JobHandler#execute(String)} 执行任务 + * + * @author 闻荫源码 + */ +@DisallowConcurrentExecution +@PersistJobDataAfterExecution +@Slf4j +public class JobHandlerInvoker extends QuartzJobBean { + + @Resource + private ApplicationContext applicationContext; + + @Resource + private JobLogFrameworkService jobLogFrameworkService; + + @Override + protected void executeInternal(JobExecutionContext executionContext) throws JobExecutionException { + // 第一步,获得 Job 数据 + Long jobId = executionContext.getMergedJobDataMap().getLong(JobDataKeyEnum.JOB_ID.name()); + String jobHandlerName = executionContext.getMergedJobDataMap().getString(JobDataKeyEnum.JOB_HANDLER_NAME.name()); + String jobHandlerParam = executionContext.getMergedJobDataMap().getString(JobDataKeyEnum.JOB_HANDLER_PARAM.name()); + int refireCount = executionContext.getRefireCount(); + int retryCount = (Integer) executionContext.getMergedJobDataMap().getOrDefault(JobDataKeyEnum.JOB_RETRY_COUNT.name(), 0); + int retryInterval = (Integer) executionContext.getMergedJobDataMap().getOrDefault(JobDataKeyEnum.JOB_RETRY_INTERVAL.name(), 0); + + // 第二步,执行任务 + Long jobLogId = null; + LocalDateTime startTime = LocalDateTime.now(); + String data = null; + Throwable exception = null; + try { + // 记录 Job 日志(初始) + jobLogId = jobLogFrameworkService.createJobLog(jobId, startTime, jobHandlerName, jobHandlerParam, refireCount + 1); + // 执行任务 + data = this.executeInternal(jobHandlerName, jobHandlerParam); + } catch (Throwable ex) { + exception = ex; + } + + // 第三步,记录执行日志 + this.updateJobLogResultAsync(jobLogId, startTime, data, exception, executionContext); + + // 第四步,处理有异常的情况 + handleException(exception, refireCount, retryCount, retryInterval); + } + + private String executeInternal(String jobHandlerName, String jobHandlerParam) throws Exception { + // 获得 JobHandler 对象 + JobHandler jobHandler = applicationContext.getBean(jobHandlerName, JobHandler.class); + Assert.notNull(jobHandler, "JobHandler 不会为空"); + // 执行任务 + return jobHandler.execute(jobHandlerParam); + } + + private void updateJobLogResultAsync(Long jobLogId, LocalDateTime startTime, String data, Throwable exception, + JobExecutionContext executionContext) { + LocalDateTime endTime = LocalDateTime.now(); + // 处理是否成功 + boolean success = exception == null; + if (!success) { + data = getRootCauseMessage(exception); + } + // 更新日志 + try { + jobLogFrameworkService.updateJobLogResultAsync(jobLogId, endTime, (int) LocalDateTimeUtil.between(startTime, endTime).toMillis(), success, data); + } catch (Exception ex) { + log.error("[executeInternal][Job({}) logId({}) 记录执行日志失败({}/{})]", + executionContext.getJobDetail().getKey(), jobLogId, success, data); + } + } + + private void handleException(Throwable exception, + int refireCount, int retryCount, int retryInterval) throws JobExecutionException { + // 如果有异常,则进行重试 + if (exception == null) { + return; + } + // 情况一:如果到达重试上限,则直接抛出异常即可 + if (refireCount >= retryCount) { + throw new JobExecutionException(exception); + } + + // 情况二:如果未到达重试上限,则 sleep 一定间隔时间,然后重试 + // 这里使用 sleep 来实现,主要还是希望实现比较简单。因为,同一时间,不会存在大量失败的 Job。 + if (retryInterval > 0) { + ThreadUtil.sleep(retryInterval); + } + // 第二个参数,refireImmediately = true,表示立即重试 + throw new JobExecutionException(exception, true); + } + +} diff --git a/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/core/scheduler/SchedulerManager.java b/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/core/scheduler/SchedulerManager.java new file mode 100644 index 0000000..cf2841b --- /dev/null +++ b/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/core/scheduler/SchedulerManager.java @@ -0,0 +1,146 @@ +package com.win.framework.quartz.core.scheduler; + +import com.win.framework.quartz.core.enums.JobDataKeyEnum; +import com.win.framework.quartz.core.handler.JobHandlerInvoker; +import org.quartz.*; + +import static com.win.framework.common.exception.enums.GlobalErrorCodeConstants.NOT_IMPLEMENTED; +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception0; + +/** + * {@link org.quartz.Scheduler} 的管理器,负责创建任务 + * + * 考虑到实现的简洁性,我们使用 jobHandlerName 作为唯一标识,即: + * 1. Job 的 {@link JobDetail#getKey()} + * 2. Trigger 的 {@link Trigger#getKey()} + * + * 另外,jobHandlerName 对应到 Spring Bean 的名字,直接调用 + * + * @author 闻荫源码 + */ +public class SchedulerManager { + + private final Scheduler scheduler; + + public SchedulerManager(Scheduler scheduler) { + this.scheduler = scheduler; + } + + /** + * 添加 Job 到 Quartz 中 + * + * @param jobId 任务编号 + * @param jobHandlerName 任务处理器的名字 + * @param jobHandlerParam 任务处理器的参数 + * @param cronExpression CRON 表达式 + * @param retryCount 重试次数 + * @param retryInterval 重试间隔 + * @throws SchedulerException 添加异常 + */ + public void addJob(Long jobId, String jobHandlerName, String jobHandlerParam, String cronExpression, + Integer retryCount, Integer retryInterval) + throws SchedulerException { + validateScheduler(); + // 创建 JobDetail 对象 + JobDetail jobDetail = JobBuilder.newJob(JobHandlerInvoker.class) + .usingJobData(JobDataKeyEnum.JOB_ID.name(), jobId) + .usingJobData(JobDataKeyEnum.JOB_HANDLER_NAME.name(), jobHandlerName) + .withIdentity(jobHandlerName).build(); + // 创建 Trigger 对象 + Trigger trigger = this.buildTrigger(jobHandlerName, jobHandlerParam, cronExpression, retryCount, retryInterval); + // 新增调度 + scheduler.scheduleJob(jobDetail, trigger); + } + + /** + * 更新 Job 到 Quartz + * + * @param jobHandlerName 任务处理器的名字 + * @param jobHandlerParam 任务处理器的参数 + * @param cronExpression CRON 表达式 + * @param retryCount 重试次数 + * @param retryInterval 重试间隔 + * @throws SchedulerException 更新异常 + */ + public void updateJob(String jobHandlerName, String jobHandlerParam, String cronExpression, + Integer retryCount, Integer retryInterval) + throws SchedulerException { + validateScheduler(); + // 创建新 Trigger 对象 + Trigger newTrigger = this.buildTrigger(jobHandlerName, jobHandlerParam, cronExpression, retryCount, retryInterval); + // 修改调度 + scheduler.rescheduleJob(new TriggerKey(jobHandlerName), newTrigger); + } + + /** + * 删除 Quartz 中的 Job + * + * @param jobHandlerName 任务处理器的名字 + * @throws SchedulerException 删除异常 + */ + public void deleteJob(String jobHandlerName) throws SchedulerException { + validateScheduler(); + scheduler.deleteJob(new JobKey(jobHandlerName)); + } + + /** + * 暂停 Quartz 中的 Job + * + * @param jobHandlerName 任务处理器的名字 + * @throws SchedulerException 暂停异常 + */ + public void pauseJob(String jobHandlerName) throws SchedulerException { + validateScheduler(); + scheduler.pauseJob(new JobKey(jobHandlerName)); + } + + /** + * 启动 Quartz 中的 Job + * + * @param jobHandlerName 任务处理器的名字 + * @throws SchedulerException 启动异常 + */ + public void resumeJob(String jobHandlerName) throws SchedulerException { + validateScheduler(); + scheduler.resumeJob(new JobKey(jobHandlerName)); + scheduler.resumeTrigger(new TriggerKey(jobHandlerName)); + } + + /** + * 立即触发一次 Quartz 中的 Job + * + * @param jobId 任务编号 + * @param jobHandlerName 任务处理器的名字 + * @param jobHandlerParam 任务处理器的参数 + * @throws SchedulerException 触发异常 + */ + public void triggerJob(Long jobId, String jobHandlerName, String jobHandlerParam) + throws SchedulerException { + validateScheduler(); + // 触发任务 + JobDataMap data = new JobDataMap(); // 无需重试,所以不设置 retryCount 和 retryInterval + data.put(JobDataKeyEnum.JOB_ID.name(), jobId); + data.put(JobDataKeyEnum.JOB_HANDLER_NAME.name(), jobHandlerName); + data.put(JobDataKeyEnum.JOB_HANDLER_PARAM.name(), jobHandlerParam); + scheduler.triggerJob(new JobKey(jobHandlerName), data); + } + + private Trigger buildTrigger(String jobHandlerName, String jobHandlerParam, String cronExpression, + Integer retryCount, Integer retryInterval) { + return TriggerBuilder.newTrigger() + .withIdentity(jobHandlerName) + .withSchedule(CronScheduleBuilder.cronSchedule(cronExpression)) + .usingJobData(JobDataKeyEnum.JOB_HANDLER_PARAM.name(), jobHandlerParam) + .usingJobData(JobDataKeyEnum.JOB_RETRY_COUNT.name(), retryCount) + .usingJobData(JobDataKeyEnum.JOB_RETRY_INTERVAL.name(), retryInterval) + .build(); + } + + private void validateScheduler() { + if (scheduler == null) { + throw exception0(NOT_IMPLEMENTED.getCode(), + "[定时任务 - 已禁用][参考 https://doc.iocoder.cn/job/ 开启]"); + } + } + +} diff --git a/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/core/service/JobLogFrameworkService.java b/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/core/service/JobLogFrameworkService.java new file mode 100644 index 0000000..dacb657 --- /dev/null +++ b/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/core/service/JobLogFrameworkService.java @@ -0,0 +1,44 @@ +package com.win.framework.quartz.core.service; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +/** + * Job 日志 Framework Service 接口 + * + * @author 闻荫源码 + */ +public interface JobLogFrameworkService { + + /** + * 创建 Job 日志 + * + * @param jobId 任务编号 + * @param beginTime 开始时间 + * @param jobHandlerName Job 处理器的名字 + * @param jobHandlerParam Job 处理器的参数 + * @param executeIndex 第几次执行 + * @return Job 日志的编号 + */ + Long createJobLog(@NotNull(message = "任务编号不能为空") Long jobId, + @NotNull(message = "开始时间") LocalDateTime beginTime, + @NotEmpty(message = "Job 处理器的名字不能为空") String jobHandlerName, + String jobHandlerParam, + @NotNull(message = "第几次执行不能为空") Integer executeIndex); + + /** + * 更新 Job 日志的执行结果 + * + * @param logId 日志编号 + * @param endTime 结束时间。因为是异步,避免记录时间不准去 + * @param duration 运行时长,单位:毫秒 + * @param success 是否成功 + * @param result 成功数据 + */ + void updateJobLogResultAsync(@NotNull(message = "日志编号不能为空") Long logId, + @NotNull(message = "结束时间不能为空") LocalDateTime endTime, + @NotNull(message = "运行时长不能为空") Integer duration, + boolean success, String result); + +} diff --git a/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/core/util/CronUtils.java b/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/core/util/CronUtils.java new file mode 100644 index 0000000..337c460 --- /dev/null +++ b/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/core/util/CronUtils.java @@ -0,0 +1,56 @@ +package com.win.framework.quartz.core.util; + +import cn.hutool.core.date.LocalDateTimeUtil; +import org.quartz.CronExpression; + +import java.text.ParseException; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * Quartz Cron 表达式的工具类 + * + * @author 闻荫源码 + */ +public class CronUtils { + + /** + * 校验 CRON 表达式是否有效 + * + * @param cronExpression CRON 表达式 + * @return 是否有效 + */ + public static boolean isValid(String cronExpression) { + return CronExpression.isValidExpression(cronExpression); + } + + /** + * 基于 CRON 表达式,获得下 n 个满足执行的时间 + * + * @param cronExpression CRON 表达式 + * @param n 数量 + * @return 满足条件的执行时间 + */ + public static List getNextTimes(String cronExpression, int n) { + // 获得 CronExpression 对象 + CronExpression cron; + try { + cron = new CronExpression(cronExpression); + } catch (ParseException e) { + throw new IllegalArgumentException(e.getMessage()); + } + // 从当前开始计算,n 个满足条件的 + Date now = new Date(); + List nextTimes = new ArrayList<>(n); + for (int i = 0; i < n; i++) { + Date nextTime = cron.getNextValidTimeAfter(now); + nextTimes.add(LocalDateTimeUtil.of(nextTime)); + // 切换现在,为下一个触发时间; + now = nextTime; + } + return nextTimes; + } + +} diff --git a/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/package-info.java b/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/package-info.java new file mode 100644 index 0000000..c404d50 --- /dev/null +++ b/win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/package-info.java @@ -0,0 +1,7 @@ +/** + * 1. 定时任务,采用 Quartz 实现进程内的任务执行。 + * 考虑到高可用,使用 Quartz 自带的 MySQL 集群方案。 + * + * 2. 异步任务,采用 Spring Async 异步执行。 + */ +package com.win.framework.quartz; diff --git a/win-framework/win-spring-boot-starter-job/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/win-framework/win-spring-boot-starter-job/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..419bbd5 --- /dev/null +++ b/win-framework/win-spring-boot-starter-job/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1,2 @@ +com.win.framework.quartz.config.WinQuartzAutoConfiguration +com.win.framework.quartz.config.WinAsyncAutoConfiguration \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-monitor/pom.xml b/win-framework/win-spring-boot-starter-monitor/pom.xml new file mode 100644 index 0000000..f3a4600 --- /dev/null +++ b/win-framework/win-spring-boot-starter-monitor/pom.xml @@ -0,0 +1,73 @@ + + + + com.win + win-framework + ${revision} + + 4.0.0 + win-spring-boot-starter-monitor + jar + + ${project.artifactId} + 服务监控,提供链路追踪、日志服务、指标收集等等功能 + https://github.com/YunaiV/ruoyi-vue-pro + + + + com.win + win-common + + + + + org.springframework.boot + spring-boot-starter-aop + + + + + org.springframework + spring-web + provided + + + + jakarta.servlet + jakarta.servlet-api + provided + + + + + io.opentracing + opentracing-util + + + org.apache.skywalking + apm-toolkit-trace + + + org.apache.skywalking + apm-toolkit-logback-1.x + + + org.apache.skywalking + apm-toolkit-opentracing + + + + + io.micrometer + micrometer-registry-prometheus + + + + de.codecentric + spring-boot-admin-starter-client + + + + diff --git a/win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/config/TracerProperties.java b/win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/config/TracerProperties.java new file mode 100644 index 0000000..785bc88 --- /dev/null +++ b/win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/config/TracerProperties.java @@ -0,0 +1,14 @@ +package com.win.framework.tracer.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * BizTracer配置类 + * + * @author 麻薯 + */ +@ConfigurationProperties("win.tracer") +@Data +public class TracerProperties { +} diff --git a/win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/config/WinMetricsAutoConfiguration.java b/win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/config/WinMetricsAutoConfiguration.java new file mode 100644 index 0000000..4e336f5 --- /dev/null +++ b/win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/config/WinMetricsAutoConfiguration.java @@ -0,0 +1,27 @@ +package com.win.framework.tracer.config; + +import io.micrometer.core.instrument.MeterRegistry; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.actuate.autoconfigure.metrics.MeterRegistryCustomizer; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; + +/** + * Metrics 配置类 + * + * @author 闻荫源码 + */ +@AutoConfiguration +@ConditionalOnClass({MeterRegistryCustomizer.class}) +@ConditionalOnProperty(prefix = "win.metrics", value = "enable", matchIfMissing = true) // 允许使用 win.metrics.enable=false 禁用 Metrics +public class WinMetricsAutoConfiguration { + + @Bean + public MeterRegistryCustomizer metricsCommonTags( + @Value("${spring.application.name}") String applicationName) { + return registry -> registry.config().commonTags("application", applicationName); + } + +} diff --git a/win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/config/WinTracerAutoConfiguration.java b/win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/config/WinTracerAutoConfiguration.java new file mode 100644 index 0000000..643fbb8 --- /dev/null +++ b/win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/config/WinTracerAutoConfiguration.java @@ -0,0 +1,55 @@ +package com.win.framework.tracer.config; + +import com.win.framework.common.enums.WebFilterOrderEnum; +import com.win.framework.tracer.core.aop.BizTraceAspect; +import com.win.framework.tracer.core.filter.TraceFilter; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; + +/** + * Tracer 配置类 + * + * @author mashu + */ +@AutoConfiguration +@ConditionalOnClass({BizTraceAspect.class}) +@EnableConfigurationProperties(TracerProperties.class) +@ConditionalOnProperty(prefix = "win.tracer", value = "enable", matchIfMissing = true) +public class WinTracerAutoConfiguration { + + // TODO @芋艿:重要。目前 opentracing 版本存在冲突,要么保证 skywalking,要么保证阿里云短信 sdk +// @Bean +// public TracerProperties bizTracerProperties() { +// return new TracerProperties(); +// } +// +// @Bean +// public BizTraceAspect bizTracingAop() { +// return new BizTraceAspect(tracer()); +// } +// +// @Bean +// public Tracer tracer() { +// // 创建 SkywalkingTracer 对象 +// SkywalkingTracer tracer = new SkywalkingTracer(); +// // 设置为 GlobalTracer 的追踪器 +// GlobalTracer.register(tracer); +// return tracer; +// } + + /** + * 创建 TraceFilter 过滤器,响应 header 设置 traceId + */ + @Bean + public FilterRegistrationBean traceFilter() { + FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); + registrationBean.setFilter(new TraceFilter()); + registrationBean.setOrder(WebFilterOrderEnum.TRACE_FILTER); + return registrationBean; + } + +} diff --git a/win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/core/annotation/BizTrace.java b/win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/core/annotation/BizTrace.java new file mode 100644 index 0000000..0d72635 --- /dev/null +++ b/win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/core/annotation/BizTrace.java @@ -0,0 +1,42 @@ +package com.win.framework.tracer.core.annotation; + +import java.lang.annotation.*; + +/** + * 打印业务编号 / 业务类型注解 + * + * 使用时,需要设置 SkyWalking OAP Server 的 application.yaml 配置文件,修改 SW_SEARCHABLE_TAG_KEYS 配置项, + * 增加 biz.type 和 biz.id 两值,然后重启 SkyWalking OAP Server 服务器。 + * + * @author 麻薯 + */ +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Inherited +public @interface BizTrace { + + /** + * 业务编号 tag 名 + */ + String ID_TAG = "biz.id"; + /** + * 业务类型 tag 名 + */ + String TYPE_TAG = "biz.type"; + + /** + * @return 操作名 + */ + String operationName() default ""; + + /** + * @return 业务编号 + */ + String id(); + + /** + * @return 业务类型 + */ + String type(); + +} diff --git a/win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/core/aop/BizTraceAspect.java b/win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/core/aop/BizTraceAspect.java new file mode 100644 index 0000000..de6f1fa --- /dev/null +++ b/win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/core/aop/BizTraceAspect.java @@ -0,0 +1,77 @@ +package com.win.framework.tracer.core.aop; + +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; +import com.win.framework.tracer.core.annotation.BizTrace; +import com.win.framework.common.util.spring.SpringExpressionUtils; +import com.win.framework.tracer.core.util.TracerFrameworkUtils; +import io.opentracing.Span; +import io.opentracing.Tracer; +import io.opentracing.tag.Tags; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; + +import java.util.Map; + +import static java.util.Arrays.asList; + +/** + * {@link BizTrace} 切面,记录业务链路 + * + * @author mashu + */ +@Aspect +@AllArgsConstructor +@Slf4j +public class BizTraceAspect { + + private static final String BIZ_OPERATION_NAME_PREFIX = "Biz/"; + + private final Tracer tracer; + + @Around(value = "@annotation(trace)") + public Object around(ProceedingJoinPoint joinPoint, BizTrace trace) throws Throwable { + // 创建 span + String operationName = getOperationName(joinPoint, trace); + Span span = tracer.buildSpan(operationName) + .withTag(Tags.COMPONENT.getKey(), "biz") + .start(); + try { + // 执行原有方法 + return joinPoint.proceed(); + } catch (Throwable throwable) { + TracerFrameworkUtils.onError(throwable, span); + throw throwable; + } finally { + // 设置 Span 的 biz 属性 + setBizTag(span, joinPoint, trace); + // 完成 Span + span.finish(); + } + } + + private String getOperationName(ProceedingJoinPoint joinPoint, BizTrace trace) { + // 自定义操作名 + if (StrUtil.isNotEmpty(trace.operationName())) { + return BIZ_OPERATION_NAME_PREFIX + trace.operationName(); + } + // 默认操作名,使用方法名 + return BIZ_OPERATION_NAME_PREFIX + + joinPoint.getSignature().getDeclaringType().getSimpleName() + + "/" + joinPoint.getSignature().getName(); + } + + private void setBizTag(Span span, ProceedingJoinPoint joinPoint, BizTrace trace) { + try { + Map result = SpringExpressionUtils.parseExpressions(joinPoint, asList(trace.type(), trace.id())); + span.setTag(BizTrace.TYPE_TAG, MapUtil.getStr(result, trace.type())); + span.setTag(BizTrace.ID_TAG, MapUtil.getStr(result, trace.id())); + } catch (Exception ex) { + log.error("[setBizTag][解析 bizType 与 bizId 发生异常]", ex); + } + } + +} diff --git a/win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/core/filter/TraceFilter.java b/win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/core/filter/TraceFilter.java new file mode 100644 index 0000000..7030061 --- /dev/null +++ b/win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/core/filter/TraceFilter.java @@ -0,0 +1,33 @@ +package com.win.framework.tracer.core.filter; + +import com.win.framework.common.util.monitor.TracerUtils; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * Trace 过滤器,打印 traceId 到 header 中返回 + * + * @author 闻荫源码 + */ +public class TraceFilter extends OncePerRequestFilter { + + /** + * Header 名 - 链路追踪编号 + */ + private static final String HEADER_NAME_TRACE_ID = "trace-id"; + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) + throws IOException, ServletException { + // 设置响应 traceId + response.addHeader(HEADER_NAME_TRACE_ID, TracerUtils.getTraceId()); + // 继续过滤 + chain.doFilter(request, response); + } + +} diff --git a/win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/core/util/TracerFrameworkUtils.java b/win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/core/util/TracerFrameworkUtils.java new file mode 100644 index 0000000..391b546 --- /dev/null +++ b/win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/core/util/TracerFrameworkUtils.java @@ -0,0 +1,46 @@ +package com.win.framework.tracer.core.util; + +import io.opentracing.Span; +import io.opentracing.tag.Tags; + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.HashMap; +import java.util.Map; + +/** + * 链路追踪 Util + * + * @author 闻荫源码 + */ +public class TracerFrameworkUtils { + + /** + * 将异常记录到 Span 中,参考自 com.aliyuncs.utils.TraceUtils + * + * @param throwable 异常 + * @param span Span + */ + public static void onError(Throwable throwable, Span span) { + Tags.ERROR.set(span, Boolean.TRUE); + if (throwable != null) { + span.log(errorLogs(throwable)); + } + } + + private static Map errorLogs(Throwable throwable) { + Map errorLogs = new HashMap(10); + errorLogs.put("event", Tags.ERROR.getKey()); + errorLogs.put("error.object", throwable); + errorLogs.put("error.kind", throwable.getClass().getName()); + String message = throwable.getCause() != null ? throwable.getCause().getMessage() : throwable.getMessage(); + if (message != null) { + errorLogs.put("message", message); + } + StringWriter sw = new StringWriter(); + throwable.printStackTrace(new PrintWriter(sw)); + errorLogs.put("stack", sw.toString()); + return errorLogs; + } + +} diff --git a/win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/package-info.java b/win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/package-info.java new file mode 100644 index 0000000..7479d09 --- /dev/null +++ b/win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/package-info.java @@ -0,0 +1,6 @@ +/** + * 使用 SkyWalking 组件,作为链路追踪、日志中心。 + * + * @author 闻荫源码 + */ +package com.win.framework.tracer; diff --git a/win-framework/win-spring-boot-starter-monitor/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/win-framework/win-spring-boot-starter-monitor/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..c312986 --- /dev/null +++ b/win-framework/win-spring-boot-starter-monitor/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1,2 @@ +com.win.framework.tracer.config.WinTracerAutoConfiguration +com.win.framework.tracer.config.WinMetricsAutoConfiguration \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-mq/pom.xml b/win-framework/win-spring-boot-starter-mq/pom.xml new file mode 100644 index 0000000..5a5ac8f --- /dev/null +++ b/win-framework/win-spring-boot-starter-mq/pom.xml @@ -0,0 +1,26 @@ + + + + com.win + win-framework + ${revision} + + 4.0.0 + win-spring-boot-starter-mq + jar + + ${project.artifactId} + 消息队列,基于 Redis Pub/Sub 实现广播消费,基于 Stream 实现集群消费 + https://github.com/YunaiV/ruoyi-vue-pro + + + + + com.win + win-spring-boot-starter-redis + + + + diff --git a/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/config/WinMQAutoConfiguration.java b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/config/WinMQAutoConfiguration.java new file mode 100644 index 0000000..c43a92b --- /dev/null +++ b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/config/WinMQAutoConfiguration.java @@ -0,0 +1,170 @@ +package com.win.framework.mq.config; + +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.system.SystemUtil; +import com.win.framework.common.enums.DocumentEnum; +import com.win.framework.mq.core.RedisMQTemplate; +import com.win.framework.mq.core.interceptor.RedisMessageInterceptor; +import com.win.framework.mq.core.pubsub.AbstractChannelMessageListener; +import com.win.framework.mq.core.stream.AbstractStreamMessageListener; +import com.win.framework.mq.job.RedisPendingMessageResendJob; +import com.win.framework.redis.config.WinRedisAutoConfiguration; +import lombok.extern.slf4j.Slf4j; +import org.redisson.api.RedissonClient; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; +import org.springframework.data.redis.connection.RedisServerCommands; +import org.springframework.data.redis.connection.stream.Consumer; +import org.springframework.data.redis.connection.stream.ObjectRecord; +import org.springframework.data.redis.connection.stream.ReadOffset; +import org.springframework.data.redis.connection.stream.StreamOffset; +import org.springframework.data.redis.core.RedisCallback; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.data.redis.listener.ChannelTopic; +import org.springframework.data.redis.listener.RedisMessageListenerContainer; +import org.springframework.data.redis.stream.DefaultStreamMessageListenerContainerX; +import org.springframework.data.redis.stream.StreamMessageListenerContainer; +import org.springframework.scheduling.annotation.EnableScheduling; + +import java.util.List; +import java.util.Properties; + +/** + * 消息队列配置类 + * + * @author 闻荫源码 + */ +@Slf4j +@EnableScheduling // 启用定时任务,用于 RedisPendingMessageResendJob 重发消息 +@AutoConfiguration(after = WinRedisAutoConfiguration.class) +public class WinMQAutoConfiguration { + + @Bean + public RedisMQTemplate redisMQTemplate(StringRedisTemplate redisTemplate, + List interceptors) { + RedisMQTemplate redisMQTemplate = new RedisMQTemplate(redisTemplate); + // 添加拦截器 + interceptors.forEach(redisMQTemplate::addInterceptor); + return redisMQTemplate; + } + + // ========== 消费者相关 ========== + + /** + * 创建 Redis Pub/Sub 广播消费的容器 + */ + @Bean(initMethod = "start", destroyMethod = "stop") + @ConditionalOnBean(AbstractChannelMessageListener.class) // 只有 AbstractChannelMessageListener 存在的时候,才需要注册 Redis pubsub 监听 + @ConditionalOnProperty(prefix = "win.mq.redis.pubsub", value = "enable", matchIfMissing = true) // 允许使用 win.mq.redis.pubsub.enable=false 禁用多租户 + public RedisMessageListenerContainer redisMessageListenerContainer( + RedisMQTemplate redisMQTemplate, List> listeners) { + // 创建 RedisMessageListenerContainer 对象 + RedisMessageListenerContainer container = new RedisMessageListenerContainer(); + // 设置 RedisConnection 工厂。 + container.setConnectionFactory(redisMQTemplate.getRedisTemplate().getRequiredConnectionFactory()); + // 添加监听器 + listeners.forEach(listener -> { + listener.setRedisMQTemplate(redisMQTemplate); + container.addMessageListener(listener, new ChannelTopic(listener.getChannel())); + log.info("[redisMessageListenerContainer][注册 Channel({}) 对应的监听器({})]", + listener.getChannel(), listener.getClass().getName()); + }); + return container; + } + + /** + * 创建 Redis Stream 重新消费的任务 + */ + @Bean + @ConditionalOnBean(AbstractStreamMessageListener.class) // 只有 AbstractStreamMessageListener 存在的时候,才需要注册 Redis pubsub 监听 + @ConditionalOnProperty(prefix = "win.mq.redis.stream", value = "enable", matchIfMissing = true) // 允许使用 win.mq.redis.stream.enable=false 禁用多租户 + public RedisPendingMessageResendJob redisPendingMessageResendJob(List> listeners, + RedisMQTemplate redisTemplate, + @Value("${spring.application.name}") String groupName, + RedissonClient redissonClient) { + return new RedisPendingMessageResendJob(listeners, redisTemplate, groupName, redissonClient); + } + + /** + * 创建 Redis Stream 集群消费的容器 + *

+ * Redis Stream 的 xreadgroup 命令:https://www.geek-book.com/src/docs/redis/redis/redis.io/commands/xreadgroup.html + */ + @Bean(initMethod = "start", destroyMethod = "stop") + @ConditionalOnBean(AbstractStreamMessageListener.class) // 只有 AbstractStreamMessageListener 存在的时候,才需要注册 Redis pubsub 监听 + @ConditionalOnProperty(prefix = "win.mq.redis.stream", value = "enable", matchIfMissing = true) // 允许使用 win.mq.redis.stream.enable=false 禁用多租户 + public StreamMessageListenerContainer> redisStreamMessageListenerContainer( + RedisMQTemplate redisMQTemplate, List> listeners) { + RedisTemplate redisTemplate = redisMQTemplate.getRedisTemplate(); + checkRedisVersion(redisTemplate); + // 第一步,创建 StreamMessageListenerContainer 容器 + // 创建 options 配置 + StreamMessageListenerContainer.StreamMessageListenerContainerOptions> containerOptions = + StreamMessageListenerContainer.StreamMessageListenerContainerOptions.builder() + .batchSize(10) // 一次性最多拉取多少条消息 + .targetType(String.class) // 目标类型。统一使用 String,通过自己封装的 AbstractStreamMessageListener 去反序列化 + .build(); + // 创建 container 对象 + StreamMessageListenerContainer> container = +// StreamMessageListenerContainer.create(redisTemplate.getRequiredConnectionFactory(), containerOptions); + DefaultStreamMessageListenerContainerX.create(redisMQTemplate.getRedisTemplate().getRequiredConnectionFactory(), containerOptions); + + // 第二步,注册监听器,消费对应的 Stream 主题 + String consumerName = buildConsumerName(); + listeners.parallelStream().forEach(listener -> { + log.info("[redisStreamMessageListenerContainer][开始注册 StreamKey({}) 对应的监听器({})]", + listener.getStreamKey(), listener.getClass().getName()); + // 创建 listener 对应的消费者分组 + try { + redisTemplate.opsForStream().createGroup(listener.getStreamKey(), listener.getGroup()); + } catch (Exception ignore) { + } + // 设置 listener 对应的 redisTemplate + listener.setRedisMQTemplate(redisMQTemplate); + // 创建 Consumer 对象 + Consumer consumer = Consumer.from(listener.getGroup(), consumerName); + // 设置 Consumer 消费进度,以最小消费进度为准 + StreamOffset streamOffset = StreamOffset.create(listener.getStreamKey(), ReadOffset.lastConsumed()); + // 设置 Consumer 监听 + StreamMessageListenerContainer.StreamReadRequestBuilder builder = StreamMessageListenerContainer.StreamReadRequest + .builder(streamOffset).consumer(consumer) + .autoAcknowledge(false) // 不自动 ack + .cancelOnError(throwable -> false); // 默认配置,发生异常就取消消费,显然不符合预期;因此,我们设置为 false + container.register(builder.build(), listener); + log.info("[redisStreamMessageListenerContainer][完成注册 StreamKey({}) 对应的监听器({})]", + listener.getStreamKey(), listener.getClass().getName()); + }); + return container; + } + + /** + * 构建消费者名字,使用本地 IP + 进程编号的方式。 + * 参考自 RocketMQ clientId 的实现 + * + * @return 消费者名字 + */ + private static String buildConsumerName() { + return String.format("%s@%d", SystemUtil.getHostInfo().getAddress(), SystemUtil.getCurrentPID()); + } + + /** + * 校验 Redis 版本号,是否满足最低的版本号要求! + */ + private static void checkRedisVersion(RedisTemplate redisTemplate) { + // 获得 Redis 版本 + Properties info = redisTemplate.execute((RedisCallback) RedisServerCommands::info); + String version = MapUtil.getStr(info, "redis_version"); + // 校验最低版本必须大于等于 5.0.0 + int majorVersion = Integer.parseInt(StrUtil.subBefore(version, '.', false)); + if (majorVersion < 5) { + throw new IllegalStateException(StrUtil.format("您当前的 Redis 版本为 {},小于最低要求的 5.0.0 版本!" + + "请参考 {} 文档进行安装。", version, DocumentEnum.REDIS_INSTALL.getUrl())); + } + } + +} diff --git a/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/core/RedisMQTemplate.java b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/core/RedisMQTemplate.java new file mode 100644 index 0000000..104d977 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/core/RedisMQTemplate.java @@ -0,0 +1,87 @@ +package com.win.framework.mq.core; + +import com.win.framework.common.util.json.JsonUtils; +import com.win.framework.mq.core.interceptor.RedisMessageInterceptor; +import com.win.framework.mq.core.message.AbstractRedisMessage; +import com.win.framework.mq.core.pubsub.AbstractChannelMessage; +import com.win.framework.mq.core.stream.AbstractStreamMessage; +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.springframework.data.redis.connection.stream.RecordId; +import org.springframework.data.redis.connection.stream.StreamRecords; +import org.springframework.data.redis.core.RedisTemplate; + +import java.util.ArrayList; +import java.util.List; + +/** + * Redis MQ 操作模板类 + * + * @author 闻荫源码 + */ +@AllArgsConstructor +public class RedisMQTemplate { + + @Getter + private final RedisTemplate redisTemplate; + /** + * 拦截器数组 + */ + @Getter + private final List interceptors = new ArrayList<>(); + + /** + * 发送 Redis 消息,基于 Redis pub/sub 实现 + * + * @param message 消息 + */ + public void send(T message) { + try { + sendMessageBefore(message); + // 发送消息 + redisTemplate.convertAndSend(message.getChannel(), JsonUtils.toJsonString(message)); + } finally { + sendMessageAfter(message); + } + } + + /** + * 发送 Redis 消息,基于 Redis Stream 实现 + * + * @param message 消息 + * @return 消息记录的编号对象 + */ + public RecordId send(T message) { + try { + sendMessageBefore(message); + // 发送消息 + return redisTemplate.opsForStream().add(StreamRecords.newRecord() + .ofObject(JsonUtils.toJsonString(message)) // 设置内容 + .withStreamKey(message.getStreamKey())); // 设置 stream key + } finally { + sendMessageAfter(message); + } + } + + /** + * 添加拦截器 + * + * @param interceptor 拦截器 + */ + public void addInterceptor(RedisMessageInterceptor interceptor) { + interceptors.add(interceptor); + } + + private void sendMessageBefore(AbstractRedisMessage message) { + // 正序 + interceptors.forEach(interceptor -> interceptor.sendMessageBefore(message)); + } + + private void sendMessageAfter(AbstractRedisMessage message) { + // 倒序 + for (int i = interceptors.size() - 1; i >= 0; i--) { + interceptors.get(i).sendMessageAfter(message); + } + } + +} diff --git a/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/core/interceptor/RedisMessageInterceptor.java b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/core/interceptor/RedisMessageInterceptor.java new file mode 100644 index 0000000..7e37782 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/core/interceptor/RedisMessageInterceptor.java @@ -0,0 +1,26 @@ +package com.win.framework.mq.core.interceptor; + +import com.win.framework.mq.core.message.AbstractRedisMessage; + +/** + * {@link AbstractRedisMessage} 消息拦截器 + * 通过拦截器,作为插件机制,实现拓展。 + * 例如说,多租户场景下的 MQ 消息处理 + * + * @author 闻荫源码 + */ +public interface RedisMessageInterceptor { + + default void sendMessageBefore(AbstractRedisMessage message) { + } + + default void sendMessageAfter(AbstractRedisMessage message) { + } + + default void consumeMessageBefore(AbstractRedisMessage message) { + } + + default void consumeMessageAfter(AbstractRedisMessage message) { + } + +} diff --git a/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/core/message/AbstractRedisMessage.java b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/core/message/AbstractRedisMessage.java new file mode 100644 index 0000000..87a6d20 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/core/message/AbstractRedisMessage.java @@ -0,0 +1,29 @@ +package com.win.framework.mq.core.message; + +import lombok.Data; + +import java.util.HashMap; +import java.util.Map; + +/** + * Redis 消息抽象基类 + * + * @author 闻荫源码 + */ +@Data +public abstract class AbstractRedisMessage { + + /** + * 头 + */ + private Map headers = new HashMap<>(); + + public String getHeader(String key) { + return headers.get(key); + } + + public void addHeader(String key, String value) { + headers.put(key, value); + } + +} diff --git a/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/core/pubsub/AbstractChannelMessage.java b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/core/pubsub/AbstractChannelMessage.java new file mode 100644 index 0000000..54e3531 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/core/pubsub/AbstractChannelMessage.java @@ -0,0 +1,21 @@ +package com.win.framework.mq.core.pubsub; + +import com.win.framework.mq.core.message.AbstractRedisMessage; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * Redis Channel Message 抽象类 + * + * @author 闻荫源码 + */ +public abstract class AbstractChannelMessage extends AbstractRedisMessage { + + /** + * 获得 Redis Channel + * + * @return Channel + */ + @JsonIgnore // 避免序列化。原因是,Redis 发布 Channel 消息的时候,已经会指定。 + public abstract String getChannel(); + +} diff --git a/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/core/pubsub/AbstractChannelMessageListener.java b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/core/pubsub/AbstractChannelMessageListener.java new file mode 100644 index 0000000..73934a8 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/core/pubsub/AbstractChannelMessageListener.java @@ -0,0 +1,103 @@ +package com.win.framework.mq.core.pubsub; + +import cn.hutool.core.util.TypeUtil; +import com.win.framework.common.util.json.JsonUtils; +import com.win.framework.mq.core.RedisMQTemplate; +import com.win.framework.mq.core.interceptor.RedisMessageInterceptor; +import com.win.framework.mq.core.message.AbstractRedisMessage; +import lombok.Setter; +import lombok.SneakyThrows; +import org.springframework.data.redis.connection.Message; +import org.springframework.data.redis.connection.MessageListener; + +import java.lang.reflect.Type; +import java.util.List; + +/** + * Redis Pub/Sub 监听器抽象类,用于实现广播消费 + * + * @param 消息类型。一定要填写噢,不然会报错 + * + * @author 闻荫源码 + */ +public abstract class AbstractChannelMessageListener implements MessageListener { + + /** + * 消息类型 + */ + private final Class messageType; + /** + * Redis Channel + */ + private final String channel; + /** + * RedisMQTemplate + */ + @Setter + private RedisMQTemplate redisMQTemplate; + + @SneakyThrows + protected AbstractChannelMessageListener() { + this.messageType = getMessageClass(); + this.channel = messageType.getDeclaredConstructor().newInstance().getChannel(); + } + + /** + * 获得 Sub 订阅的 Redis Channel 通道 + * + * @return channel + */ + public final String getChannel() { + return channel; + } + + @Override + public final void onMessage(Message message, byte[] bytes) { + T messageObj = JsonUtils.parseObject(message.getBody(), messageType); + try { + consumeMessageBefore(messageObj); + // 消费消息 + this.onMessage(messageObj); + } finally { + consumeMessageAfter(messageObj); + } + } + + /** + * 处理消息 + * + * @param message 消息 + */ + public abstract void onMessage(T message); + + /** + * 通过解析类上的泛型,获得消息类型 + * + * @return 消息类型 + */ + @SuppressWarnings("unchecked") + private Class getMessageClass() { + Type type = TypeUtil.getTypeArgument(getClass(), 0); + if (type == null) { + throw new IllegalStateException(String.format("类型(%s) 需要设置消息类型", getClass().getName())); + } + return (Class) type; + } + + private void consumeMessageBefore(AbstractRedisMessage message) { + assert redisMQTemplate != null; + List interceptors = redisMQTemplate.getInterceptors(); + // 正序 + interceptors.forEach(interceptor -> interceptor.consumeMessageBefore(message)); + } + + private void consumeMessageAfter(AbstractRedisMessage message) { + assert redisMQTemplate != null; + List interceptors = redisMQTemplate.getInterceptors(); + // 倒序 + for (int i = interceptors.size() - 1; i >= 0; i--) { + interceptors.get(i).consumeMessageAfter(message); + } + } + +} diff --git a/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/core/stream/AbstractStreamMessage.java b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/core/stream/AbstractStreamMessage.java new file mode 100644 index 0000000..1a9f0a5 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/core/stream/AbstractStreamMessage.java @@ -0,0 +1,21 @@ +package com.win.framework.mq.core.stream; + +import com.win.framework.mq.core.message.AbstractRedisMessage; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * Redis Stream Message 抽象类 + * + * @author 闻荫源码 + */ +public abstract class AbstractStreamMessage extends AbstractRedisMessage { + + /** + * 获得 Redis Stream Key + * + * @return Channel + */ + @JsonIgnore // 避免序列化 + public abstract String getStreamKey(); + +} diff --git a/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/core/stream/AbstractStreamMessageListener.java b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/core/stream/AbstractStreamMessageListener.java new file mode 100644 index 0000000..12a2110 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/core/stream/AbstractStreamMessageListener.java @@ -0,0 +1,115 @@ +package com.win.framework.mq.core.stream; + +import cn.hutool.core.util.TypeUtil; +import com.win.framework.common.util.json.JsonUtils; +import com.win.framework.mq.core.RedisMQTemplate; +import com.win.framework.mq.core.interceptor.RedisMessageInterceptor; +import com.win.framework.mq.core.message.AbstractRedisMessage; +import lombok.Getter; +import lombok.Setter; +import lombok.SneakyThrows; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.connection.stream.ObjectRecord; +import org.springframework.data.redis.stream.StreamListener; + +import java.lang.reflect.Type; +import java.util.List; + +/** + * Redis Stream 监听器抽象类,用于实现集群消费 + * + * @param 消息类型。一定要填写噢,不然会报错 + * + * @author 闻荫源码 + */ +public abstract class AbstractStreamMessageListener + implements StreamListener> { + + /** + * 消息类型 + */ + private final Class messageType; + /** + * Redis Channel + */ + @Getter + private final String streamKey; + + /** + * Redis 消费者分组,默认使用 spring.application.name 名字 + */ + @Value("${spring.application.name}") + @Getter + private String group; + /** + * RedisMQTemplate + */ + @Setter + private RedisMQTemplate redisMQTemplate; + + @SneakyThrows + protected AbstractStreamMessageListener() { + this.messageType = getMessageClass(); + this.streamKey = messageType.getDeclaredConstructor().newInstance().getStreamKey(); + } + + @Override + public void onMessage(ObjectRecord message) { + // 消费消息 + T messageObj = JsonUtils.parseObject(message.getValue(), messageType); + try { + consumeMessageBefore(messageObj); + // 消费消息 + this.onMessage(messageObj); + // ack 消息消费完成 + redisMQTemplate.getRedisTemplate().opsForStream().acknowledge(group, message); + // 删除消费后的数据 + // redisMQTemplate.getRedisTemplate().opsForStream().delete(message); + // TODO 芋艿:需要额外考虑以下几个点: + // 1. 处理异常的情况 + // 2. 发送日志;以及事务的结合 + // 3. 消费日志;以及通用的幂等性 + // 4. 消费失败的重试,https://zhuanlan.zhihu.com/p/60501638 + } finally { + consumeMessageAfter(messageObj); + } + } + + /** + * 处理消息 + * + * @param message 消息 + */ + public abstract void onMessage(T message); + + /** + * 通过解析类上的泛型,获得消息类型 + * + * @return 消息类型 + */ + @SuppressWarnings("unchecked") + private Class getMessageClass() { + Type type = TypeUtil.getTypeArgument(getClass(), 0); + if (type == null) { + throw new IllegalStateException(String.format("类型(%s) 需要设置消息类型", getClass().getName())); + } + return (Class) type; + } + + private void consumeMessageBefore(AbstractRedisMessage message) { + assert redisMQTemplate != null; + List interceptors = redisMQTemplate.getInterceptors(); + // 正序 + interceptors.forEach(interceptor -> interceptor.consumeMessageBefore(message)); + } + + private void consumeMessageAfter(AbstractRedisMessage message) { + assert redisMQTemplate != null; + List interceptors = redisMQTemplate.getInterceptors(); + // 倒序 + for (int i = interceptors.size() - 1; i >= 0; i--) { + interceptors.get(i).consumeMessageAfter(message); + } + } + +} diff --git a/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/job/RedisPendingMessageResendJob.java b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/job/RedisPendingMessageResendJob.java new file mode 100644 index 0000000..83b68d4 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/job/RedisPendingMessageResendJob.java @@ -0,0 +1,100 @@ +package com.win.framework.mq.job; + +import cn.hutool.core.collection.CollUtil; +import com.win.framework.mq.core.RedisMQTemplate; +import com.win.framework.mq.core.stream.AbstractStreamMessageListener; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; +import org.springframework.data.domain.Range; +import org.springframework.data.redis.connection.stream.*; +import org.springframework.data.redis.core.StreamOperations; +import org.springframework.scheduling.annotation.Scheduled; + +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * 这个任务用于处理,crash 之后的消费者未消费完的消息 + */ +@Slf4j +@AllArgsConstructor +public class RedisPendingMessageResendJob { + + private static final String LOCK_KEY = "redis:pending:msg:lock"; + + /** + * 消息超时时间,默认 5 分钟 + * + * 1. 超时的消息才会被重新投递 + * 2. 由于定时任务 1 分钟一次,消息超时后不会被立即重投,极端情况下消息5分钟过期后,再等 1 分钟才会被扫瞄到 + */ + private static final int EXPIRE_TIME = 5 * 60; + + private final List> listeners; + private final RedisMQTemplate redisTemplate; + private final String groupName; + private final RedissonClient redissonClient; + + /** + * 一分钟执行一次,这里选择每分钟的35秒执行,是为了避免整点任务过多的问题 + */ + @Scheduled(cron = "35 * * * * ?") + public void messageResend() { + RLock lock = redissonClient.getLock(LOCK_KEY); + // 尝试加锁 + if (lock.tryLock()) { + try { + execute(); + } catch (Exception ex) { + log.error("[messageResend][执行异常]", ex); + } finally { + lock.unlock(); + } + } + } + + /** + * 执行清理逻辑 + * + * @see 讨论 + */ + private void execute() { + StreamOperations ops = redisTemplate.getRedisTemplate().opsForStream(); + listeners.forEach(listener -> { + PendingMessagesSummary pendingMessagesSummary = Objects.requireNonNull(ops.pending(listener.getStreamKey(), groupName)); + // 每个消费者的 pending 队列消息数量 + Map pendingMessagesPerConsumer = pendingMessagesSummary.getPendingMessagesPerConsumer(); + pendingMessagesPerConsumer.forEach((consumerName, pendingMessageCount) -> { + log.info("[processPendingMessage][消费者({}) 消息数量({})]", consumerName, pendingMessageCount); + // 每个消费者的 pending消息的详情信息 + PendingMessages pendingMessages = ops.pending(listener.getStreamKey(), Consumer.from(groupName, consumerName), Range.unbounded(), pendingMessageCount); + if (pendingMessages.isEmpty()) { + return; + } + pendingMessages.forEach(pendingMessage -> { + // 获取消息上一次传递到 consumer 的时间, + long lastDelivery = pendingMessage.getElapsedTimeSinceLastDelivery().getSeconds(); + if (lastDelivery < EXPIRE_TIME){ + return; + } + // 获取指定 id 的消息体 + List> records = ops.range(listener.getStreamKey(), + Range.of(Range.Bound.inclusive(pendingMessage.getIdAsString()), Range.Bound.inclusive(pendingMessage.getIdAsString()))); + if (CollUtil.isEmpty(records)) { + return; + } + // 重新投递消息 + redisTemplate.getRedisTemplate().opsForStream().add(StreamRecords.newRecord() + .ofObject(records.get(0).getValue()) // 设置内容 + .withStreamKey(listener.getStreamKey())); + // ack 消息消费完成 + redisTemplate.getRedisTemplate().opsForStream().acknowledge(groupName, records.get(0)); + log.info("[processPendingMessage][消息({})重新投递成功]", records.get(0).getId()); + }); + }); + }); + } +} diff --git a/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/package-info.java b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/package-info.java new file mode 100644 index 0000000..18c46fd --- /dev/null +++ b/win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/package-info.java @@ -0,0 +1,6 @@ +/** + * 消息队列,基于 Redis 提供: + * 1. 基于 Pub/Sub 实现广播消费 + * 2. 基于 Stream 实现集群消费 + */ +package com.win.framework.mq; diff --git a/win-framework/win-spring-boot-starter-mq/src/main/java/org/springframework/data/redis/stream/DefaultStreamMessageListenerContainerX.java b/win-framework/win-spring-boot-starter-mq/src/main/java/org/springframework/data/redis/stream/DefaultStreamMessageListenerContainerX.java new file mode 100644 index 0000000..abf7425 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mq/src/main/java/org/springframework/data/redis/stream/DefaultStreamMessageListenerContainerX.java @@ -0,0 +1,62 @@ +package org.springframework.data.redis.stream; + +import cn.hutool.core.util.ReflectUtil; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.connection.stream.ByteRecord; +import org.springframework.data.redis.connection.stream.ReadOffset; +import org.springframework.data.redis.connection.stream.Record; +import org.springframework.util.Assert; + +import java.util.Collections; +import java.util.List; +import java.util.function.Function; + +/** + * 拓展 DefaultStreamMessageListenerContainer 实现,解决 Spring Data Redis + Redisson 结合使用时,Redisson 在 Stream 获得不到数据时,返回 null 而不是空 List,导致 NPE 异常。 + * 对应 issue:https://github.com/spring-projects/spring-data-redis/issues/2147 和 https://github.com/redisson/redisson/issues/4006 + * 目前看下来 Spring Data Redis 不肯加 null 判断,Redisson 暂时也没改返回 null 到空 List 的打算,所以暂时只能自己改,哽咽! + * + * @author 闻荫源码 + */ +public class DefaultStreamMessageListenerContainerX> extends DefaultStreamMessageListenerContainer { + + /** + * 参考 {@link StreamMessageListenerContainer#create(RedisConnectionFactory, StreamMessageListenerContainerOptions)} 的实现 + */ + public static > StreamMessageListenerContainer create(RedisConnectionFactory connectionFactory, StreamMessageListenerContainer.StreamMessageListenerContainerOptions options) { + Assert.notNull(connectionFactory, "RedisConnectionFactory must not be null!"); + Assert.notNull(options, "StreamMessageListenerContainerOptions must not be null!"); + return new DefaultStreamMessageListenerContainerX<>(connectionFactory, options); + } + + public DefaultStreamMessageListenerContainerX(RedisConnectionFactory connectionFactory, StreamMessageListenerContainerOptions containerOptions) { + super(connectionFactory, containerOptions); + } + + /** + * 参考 {@link DefaultStreamMessageListenerContainer#register(StreamReadRequest, StreamListener)} 的实现 + */ + @Override + public Subscription register(StreamReadRequest streamRequest, StreamListener listener) { + return this.doRegisterX(getReadTaskX(streamRequest, listener)); + } + + @SuppressWarnings("unchecked") + private StreamPollTask getReadTaskX(StreamReadRequest streamRequest, StreamListener listener) { + StreamPollTask task = ReflectUtil.invoke(this, "getReadTask", streamRequest, listener); + // 修改 readFunction 方法 + Function> readFunction = (Function>) ReflectUtil.getFieldValue(task, "readFunction"); + ReflectUtil.setFieldValue(task, "readFunction", (Function>) readOffset -> { + List records = readFunction.apply(readOffset); + //【重点】保证 records 不是空,避免 NPE 的问题!!! + return records != null ? records : Collections.emptyList(); + }); + return task; + } + + private Subscription doRegisterX(Task task) { + return ReflectUtil.invoke(this, "doRegister", task); + } + +} + diff --git a/win-framework/win-spring-boot-starter-mq/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/win-framework/win-spring-boot-starter-mq/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..f2d4467 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mq/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +com.win.framework.mq.config.WinMQAutoConfiguration \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-mybatis/pom.xml b/win-framework/win-spring-boot-starter-mybatis/pom.xml new file mode 100644 index 0000000..0089292 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/pom.xml @@ -0,0 +1,78 @@ + + + + com.win + win-framework + ${revision} + + 4.0.0 + win-spring-boot-starter-mybatis + jar + + ${project.artifactId} + 数据库连接池、多数据源、事务、MyBatis 拓展 + https://github.com/YunaiV/ruoyi-vue-pro + + + + com.win + win-common + + + + + com.win + win-spring-boot-starter-web + provided + + + + + com.mysql + mysql-connector-j + + + com.oracle.database.jdbc + ojdbc8 + + + org.postgresql + postgresql + + + com.microsoft.sqlserver + mssql-jdbc + + + com.dameng + DmJdbcDriver18 + + + com.alibaba + druid-spring-boot-starter + + + com.baomidou + mybatis-plus-boot-starter + + + com.baomidou + dynamic-datasource-spring-boot-starter + + + org.apache.shardingsphere + shardingsphere-jdbc-core-spring-boot-starter + + + com.github.yulichang + mybatis-plus-join-boot-starter + + + org.apache.shardingsphere + shardingsphere-jdbc-core-spring-boot-starter + + + + diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/config/WinDataSourceAutoConfiguration.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/config/WinDataSourceAutoConfiguration.java new file mode 100644 index 0000000..68dfe41 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/config/WinDataSourceAutoConfiguration.java @@ -0,0 +1,114 @@ +package com.win.framework.datasource.config; + +import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties; +import com.baomidou.dynamic.datasource.DynamicRoutingDataSource; +import com.baomidou.dynamic.datasource.provider.AbstractDataSourceProvider; +import com.baomidou.dynamic.datasource.provider.DynamicDataSourceProvider; +import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceAutoConfiguration; +import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.win.framework.datasource.core.enums.DataSourceEnum; +import com.win.framework.datasource.core.filter.DruidAdRemoveFilter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringBootConfiguration; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.AutoConfigureBefore; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Lazy; +import org.springframework.context.annotation.Primary; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +import javax.sql.DataSource; +import java.util.HashMap; +import java.util.Map; + +/** + * 数据库配置类 + * + * @author 闻荫源码 + */ +@AutoConfiguration +@EnableTransactionManagement(proxyTargetClass = true) // 启动事务管理 +@EnableConfigurationProperties({DruidStatProperties.class}) +@AutoConfigureBefore({DynamicDataSourceAutoConfiguration.class, SpringBootConfiguration.class}) +public class WinDataSourceAutoConfiguration { + + /** + * 动态数据源配置项 + * 这里会根据yml文件的配置自动加载配置,将多个数据源信息放到datasourceMap中 + */ + @Autowired + private DynamicDataSourceProperties properties; + + /** + * 使用shardingSphereDataSource 自动装载的 DataSource + * 5.1.1版本自动装载的shardingSphereDataSource beanName="shardingSphereDataSource" + * 要加@Lazy + */ + @Lazy + @Autowired + private DataSource shardingSphereDataSource; + @Autowired + private MybatisPlusInterceptor mybatisPlusInterceptor; + + /** + * 创建动态数据源,只创建sharding + * @return + */ + @Bean + public DynamicDataSourceProvider dynamicDataSourceProvider() { + //Map datasourceMap = properties.getDatasource(); + return new AbstractDataSourceProvider() { + @Override + public Map loadDataSources() { + //Map dataSourceMap = createDataSourceMap(datasourceMap); + Map dataSourceMap = new HashMap<>(); + // 将 shardingjdbc 管理的数据源也交给动态数据源管理 + dataSourceMap.put(DataSourceEnum.SHARDING, shardingSphereDataSource); + return dataSourceMap; + } + }; + } + + /** + * 将动态数据源设置为首选的 + * 当spring存在多个数据源时, 自动注入的是首选的对象 + * 设置为主要的数据源之后,就可以支持shardingjdbc原生的配置方式了 + * + * @return + */ + @Primary + @Bean + public DataSource dataSource(DynamicDataSourceProvider dynamicDataSourceProvider) { + DynamicRoutingDataSource dataSource = new DynamicRoutingDataSource(); + dataSource.setPrimary(DataSourceEnum.SHARDING);//设sharding为主库 + dataSource.setStrict(properties.getStrict()); + dataSource.setStrategy(properties.getStrategy()); + dataSource.setProvider(dynamicDataSourceProvider); + dataSource.setP6spy(properties.getP6spy()); + dataSource.setSeata(properties.getSeata()); + return dataSource; + } + + /** + * 创建 DruidAdRemoveFilter 过滤器,过滤 common.js 的广告 + */ + @Bean + @ConditionalOnProperty(name = "spring.datasource.druid.web-stat-filter.enabled", havingValue = "true") + public FilterRegistrationBean druidAdRemoveFilterFilter(DruidStatProperties properties) { + // 获取 druid web 监控页面的参数 + DruidStatProperties.StatViewServlet config = properties.getStatViewServlet(); + // 提取 common.js 的配置路径 + String pattern = config.getUrlPattern() != null ? config.getUrlPattern() : "/druid/*"; + String commonJsPattern = pattern.replaceAll("\\*", "js/common.js"); + // 创建 DruidAdRemoveFilter Bean + FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); + registrationBean.setFilter(new DruidAdRemoveFilter()); + registrationBean.addUrlPatterns(commonJsPattern); + return registrationBean; + } + +} diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/core/enums/DataSourceEnum.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/core/enums/DataSourceEnum.java new file mode 100644 index 0000000..135ee4c --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/core/enums/DataSourceEnum.java @@ -0,0 +1,22 @@ +package com.win.framework.datasource.core.enums; + +/** + * 对应于多数据源中不同数据源配置 + * + * 通过在方法上,使用 {@link com.baomidou.dynamic.datasource.annotation.DS} 注解,设置使用的数据源。 + * + * 对应官方文档为 http://dynamic-datasource.com/guide/customize/Annotation.html + */ +public interface DataSourceEnum { + + /** + * 主库,推荐使用 {@link com.baomidou.dynamic.datasource.annotation.Master} 注解 + */ + String SHARDING = "sharding"; + + /** + * 主库,推荐使用 {@link com.baomidou.dynamic.datasource.annotation.Master} 注解 + */ + String MASTER = "master"; + +} diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/core/filter/DruidAdRemoveFilter.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/core/filter/DruidAdRemoveFilter.java new file mode 100644 index 0000000..f808e27 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/core/filter/DruidAdRemoveFilter.java @@ -0,0 +1,38 @@ +package com.win.framework.datasource.core.filter; + +import com.alibaba.druid.util.Utils; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * Druid 底部广告过滤器 + * + * @author 闻荫源码 + */ +public class DruidAdRemoveFilter extends OncePerRequestFilter { + + /** + * common.js 的路径 + */ + private static final String COMMON_JS_ILE_PATH = "support/http/resources/js/common.js"; + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) + throws ServletException, IOException { + chain.doFilter(request, response); + // 重置缓冲区,响应头不会被重置 + response.resetBuffer(); + // 获取 common.js + String text = Utils.readFromResource(COMMON_JS_ILE_PATH); + // 正则替换 banner, 除去底部的广告信息 + text = text.replaceAll("
", ""); + text = text.replaceAll("powered.*?shrek.wang", ""); + response.getWriter().write(text); + } + +} diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/enums/ShardingTableCacheEnum.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/enums/ShardingTableCacheEnum.java new file mode 100644 index 0000000..2e5aae1 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/enums/ShardingTableCacheEnum.java @@ -0,0 +1,62 @@ +package com.win.framework.datasource.enums; + +import java.util.*; + +/** + *

@Title ShardingTableCacheEnum + *

@Description 分片表缓存枚举 + * + * @author liuchen + * @date 2022/12/23 20:17 + */ +public enum ShardingTableCacheEnum { + + /** + * 动态记录表 + */ + TRENDS("infra_trends", new HashSet<>()); + + /** + * 逻辑表名 + */ + private final String logicTableName; + /** + * 实际表名 + */ + private final Set resultTableNamesCache; + + private static Map valueMap = new HashMap<>(); + + static { + Arrays.stream(ShardingTableCacheEnum.values()).forEach(o -> valueMap.put(o.logicTableName, o)); + } + + ShardingTableCacheEnum(String logicTableName, Set resultTableNamesCache) { + this.logicTableName = logicTableName; + this.resultTableNamesCache = resultTableNamesCache; + } + + public static ShardingTableCacheEnum of(String value) { + return valueMap.get(value); + } + + public String logicTableName() { + return logicTableName; + } + + public Set resultTableNamesCache() { + return resultTableNamesCache; + } + + public static Set logicTableNames() { + return valueMap.keySet(); + } + + @Override + public String toString() { + return "ShardingTableCacheEnum{" + + "logicTableName='" + logicTableName + '\'' + + ", resultTableNamesCache=" + resultTableNamesCache + + '}'; + } +} \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/sharding/TimeShardingAlgorithm.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/sharding/TimeShardingAlgorithm.java new file mode 100644 index 0000000..7699de9 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/sharding/TimeShardingAlgorithm.java @@ -0,0 +1,144 @@ +package com.win.framework.datasource.sharding; + + +import com.google.common.collect.Range; +import com.win.framework.datasource.enums.ShardingTableCacheEnum; +import com.win.framework.datasource.utils.ShardingAlgorithmTool; +import lombok.extern.slf4j.Slf4j; +import org.apache.shardingsphere.sharding.api.sharding.standard.PreciseShardingValue; +import org.apache.shardingsphere.sharding.api.sharding.standard.RangeShardingValue; +import org.apache.shardingsphere.sharding.api.sharding.standard.StandardShardingAlgorithm; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.function.Function; + +/** + * 分片算法,按月分片 + */ +@Slf4j +public class TimeShardingAlgorithm implements StandardShardingAlgorithm { + + /** + * 分片时间格式 + */ + private static final DateTimeFormatter TABLE_SHARD_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyyMM"); + + /** + * 完整时间格式 + */ + private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd HH:mm:ss"); + + /** + * 表分片符号,例:t_contract_202201 中,分片符号为 "_" + */ + private final String TABLE_SPLIT_SYMBOL = "_"; + + /** + * 精准分片 + * @param tableNames 对应分片库中所有分片表的集合 + * @param preciseShardingValue 分片键值,其中 logicTableName 为逻辑表,columnName 分片键,value 为从 SQL 中解析出来的分片键的值 + * @return 表名 + */ + @Override + public String doSharding(Collection tableNames, PreciseShardingValue preciseShardingValue) { + String logicTableName = preciseShardingValue.getLogicTableName(); + ShardingTableCacheEnum logicTable = ShardingTableCacheEnum.of(logicTableName); + if (logicTable == null) { + log.error(">>>>>>>>>> 【ERROR】数据表类型错误,请稍后重试,logicTableNames:{},logicTableName:{}", ShardingTableCacheEnum.logicTableNames(), logicTableName); + throw new IllegalArgumentException("数据表类型错误,请稍后重试"); + } + /// 打印分片信息 + log.info(">>>>>>>>>> 【INFO】精确分片,节点配置表名:{},数据库缓存表名:{}", tableNames, logicTable.resultTableNamesCache()); + LocalDateTime dateTime = preciseShardingValue.getValue(); + String resultTableName = logicTableName + "_" + dateTime.format(TABLE_SHARD_TIME_FORMATTER); + // 检查分表获取的表名是否存在,不存在则自动建表 + if (!tableNames.contains(resultTableName)){ + tableNames.add(resultTableName); + } + return ShardingAlgorithmTool.getShardingTableAndCreate(logicTable, resultTableName); + } + + /** + * 范围分片 + * @param tableNames 对应分片库中所有分片表的集合 + * @param rangeShardingValue 分片范围 + * @return 表名集合 + */ + @Override + public Collection doSharding(Collection tableNames, RangeShardingValue rangeShardingValue) { + String logicTableName = rangeShardingValue.getLogicTableName(); + ShardingTableCacheEnum logicTable = ShardingTableCacheEnum.of(logicTableName); + if (logicTable == null) { + log.error(">>>>>>>>>> 【ERROR】逻辑表范围异常,请稍后重试,logicTableNames:{},logicTableName:{}", ShardingTableCacheEnum.logicTableNames(), logicTableName); + throw new IllegalArgumentException("逻辑表范围异常,请稍后重试"); + } + /// 打印分片信息 + log.info(">>>>>>>>>> 【INFO】范围分片,节点配置表名:{},数据库缓存表名:{}", tableNames, logicTable.resultTableNamesCache()); + // between and 的起始值 + Range valueRange = rangeShardingValue.getValueRange(); + boolean hasLowerBound = valueRange.hasLowerBound(); + boolean hasUpperBound = valueRange.hasUpperBound(); + // 获取最大值和最小值 + Set tableNameCache = logicTable.resultTableNamesCache(); + LocalDateTime min = hasLowerBound ? valueRange.lowerEndpoint() :getLowerEndpoint(tableNameCache); + LocalDateTime max = hasUpperBound ? valueRange.upperEndpoint() :getUpperEndpoint(tableNameCache); + // 循环计算分表范围 + Set resultTableNames = new LinkedHashSet<>(); + while (min.isBefore(max) || min.equals(max)) { + String tableName = logicTableName + TABLE_SPLIT_SYMBOL + min.format(TABLE_SHARD_TIME_FORMATTER); + resultTableNames.add(tableName); + min = min.plusMinutes(1); + } + return ShardingAlgorithmTool.getShardingTablesAndCreate(logicTable, resultTableNames); + } + + @Override + public void init() { + + } + + @Override + public String getType() { + return null; + } + + // -------------------------------------------------------------------------------------------------------------- + // 私有方法 + // -------------------------------------------------------------------------------------------------------------- + + /** + * 获取 最小分片值 + * @param tableNames 表名集合 + * @return 最小分片值 + */ + private LocalDateTime getLowerEndpoint(Collection tableNames) { + Optional optional = tableNames.stream() + .map(o -> LocalDateTime.parse(o.replace(TABLE_SPLIT_SYMBOL, "") + "01 00:00:00", DATE_TIME_FORMATTER)) + .min(Comparator.comparing(Function.identity())); + if (optional.isPresent()) { + return optional.get(); + } else { + log.error(">>>>>>>>>> 【ERROR】获取数据最小分表失败,请稍后重试,tableName:{}", tableNames); + throw new IllegalArgumentException("获取数据最小分表失败,请稍后重试"); + } + } + + /** + * 获取 最大分片值 + * @param tableNames 表名集合 + * @return 最大分片值 + */ + private LocalDateTime getUpperEndpoint(Collection tableNames) { + Optional optional = tableNames.stream() + .map(o -> LocalDateTime.parse(o.replace(TABLE_SPLIT_SYMBOL, "") + "01 00:00:00", DATE_TIME_FORMATTER)) + .max(Comparator.comparing(Function.identity())); + if (optional.isPresent()) { + return optional.get(); + } else { + log.error(">>>>>>>>>> 【ERROR】获取数据最大分表失败,请稍后重试,tableName:{}", tableNames); + throw new IllegalArgumentException("获取数据最大分表失败,请稍后重试"); + } + } +} \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/utils/ShardingAlgorithmTool.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/utils/ShardingAlgorithmTool.java new file mode 100644 index 0000000..5f1ad6d --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/utils/ShardingAlgorithmTool.java @@ -0,0 +1,247 @@ +package com.win.framework.datasource.utils; + +import cn.hutool.extra.spring.SpringUtil; +import com.win.framework.datasource.enums.ShardingTableCacheEnum; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.apache.shardingsphere.driver.jdbc.core.datasource.ShardingSphereDataSource; +import org.apache.shardingsphere.infra.config.RuleConfiguration; +import org.apache.shardingsphere.mode.manager.ContextManager; +import org.apache.shardingsphere.sharding.algorithm.config.AlgorithmProvidedShardingRuleConfiguration; +import org.apache.shardingsphere.sharding.api.config.rule.ShardingTableRuleConfiguration; +import org.springframework.core.env.Environment; + +import java.sql.*; +import java.time.YearMonth; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.stream.Collectors; + +/** + *

@Title ShardingAlgorithmTool + *

@Description 按月分片算法工具 + * + * @author liuchen + * @date 2022/12/20 14:03 + */ +@Slf4j +public class ShardingAlgorithmTool { + + /** 表分片符号,例:t_user_202201 中,分片符号为 "_" */ + private static final String TABLE_SPLIT_SYMBOL = "_"; + + /** 数据库配置 */ + private static final Environment ENV = SpringUtil.getApplicationContext().getEnvironment(); + private static final String DATASOURCE_URL = ENV.getProperty("spring.shardingsphere.datasource.master.url"); + private static final String DATASOURCE_USERNAME = ENV.getProperty("spring.shardingsphere.datasource.master.username"); + private static final String DATASOURCE_PASSWORD = ENV.getProperty("spring.shardingsphere.datasource.master.password"); + + + /** + * 检查分表获取的表名是否存在,不存在则自动建表 + * @param logicTable 逻辑表 + * @param resultTableNames 真实表名,例:t_user_202201 + * @return 存在于数据库中的真实表名集合 + */ + public static Set getShardingTablesAndCreate(ShardingTableCacheEnum logicTable, Collection resultTableNames) { + return resultTableNames.stream().map(o -> getShardingTableAndCreate(logicTable, o)).collect(Collectors.toSet()); + } + + /** + * 检查分表获取的表名是否存在,不存在则自动建表 + * @param logicTable 逻辑表 + * @param resultTableName 真实表名,例:t_user_202201 + * @return 确认存在于数据库中的真实表名 + */ + public static String getShardingTableAndCreate(ShardingTableCacheEnum logicTable, String resultTableName) { + // 缓存中有此表则返回,没有则判断创建 + if (logicTable.resultTableNamesCache().contains(resultTableName)) { + return resultTableName; + } else { + // 未创建的表返回逻辑空表 + boolean isSuccess = createShardingTable(logicTable, resultTableName); + return isSuccess ? resultTableName : logicTable.logicTableName(); + } + } + + /** + * 重载全部缓存 + */ + public static void tableNameCacheReloadAll() { + Arrays.stream(ShardingTableCacheEnum.values()).forEach(ShardingAlgorithmTool::tableNameCacheReload); + } + + /** + * 重载指定分表缓存 + * @param logicTable 逻辑表,例:t_user + */ + public static void tableNameCacheReload(ShardingTableCacheEnum logicTable) { + // 读取数据库中|所有表名 + List tableNameList = getAllTableNameBySchema(logicTable); + // 动态更新配置 actualDataNodes(先更新后删除缓存,防止数据不一致) + actualDataNodesRefresh(logicTable.logicTableName(), new HashSet<>(tableNameList)); + // 删除旧的缓存(如果存在) + logicTable.resultTableNamesCache().clear(); + // 写入新的缓存 + logicTable.resultTableNamesCache().addAll(tableNameList); + } + + /** + * 获取所有表名 + * @return 表名集合 + * @param logicTable 逻辑表 + */ + public static List getAllTableNameBySchema(ShardingTableCacheEnum logicTable) { + List tableNames = new ArrayList<>(); + if (StringUtils.isEmpty(DATASOURCE_URL) || StringUtils.isEmpty(DATASOURCE_USERNAME) || StringUtils.isEmpty(DATASOURCE_PASSWORD)) { + log.error(">>>>>>>>>> 【ERROR】数据库连接配置有误,请稍后重试,URL:{}, username:{}, password:{}", DATASOURCE_URL, DATASOURCE_USERNAME, DATASOURCE_PASSWORD); + throw new IllegalArgumentException("数据库连接配置有误,请稍后重试"); + } + try (Connection conn = DriverManager.getConnection(DATASOURCE_URL, DATASOURCE_USERNAME, DATASOURCE_PASSWORD); + Statement st = conn.createStatement()) { + String logicTableName = logicTable.logicTableName(); + try (ResultSet rs = st.executeQuery("show TABLES like '" + logicTableName + TABLE_SPLIT_SYMBOL + "%'")) { + while (rs.next()) { + String tableName = rs.getString(1); + // 匹配分表格式 例:^(t\_contract_\d{6})$ + if (tableName != null && tableName.matches(String.format("^(%s\\d{6})$", logicTableName + TABLE_SPLIT_SYMBOL))) { + tableNames.add(rs.getString(1)); + } + } + } + } catch (SQLException e) { + log.error(">>>>>>>>>> 【ERROR】数据库连接失败,请稍后重试,原因:{}", e.getMessage(), e); + throw new IllegalArgumentException("数据库连接失败,请稍后重试"); + } + return tableNames; + } + + /** + * 动态更新配置 actualDataNodes + * + * @param logicTableName 逻辑表名 + * @param tableNamesCache 真实表名集合 + */ + public static void actualDataNodesRefresh(String logicTableName, Set tableNamesCache) { + try { + // 获取数据分片节点 + String dbName = "master"; + log.info(">>>>>>>>>> 【INFO】更新分表配置,logicTableName:{},tableNamesCache:{}", logicTableName, tableNamesCache); + + // generate actualDataNodes + String newActualDataNodes = tableNamesCache.stream().map(o -> String.format("%s.%s", dbName, o)).collect(Collectors.joining(",")); + ShardingSphereDataSource shardingSphereDataSource = SpringUtil.getBean(ShardingSphereDataSource.class); + updateShardRuleActualDataNodes(shardingSphereDataSource, logicTableName, newActualDataNodes); + }catch (Exception e){ + log.error("初始化 动态表单失败,原因:{}", e.getMessage(), e); + } + } + + + // -------------------------------------------------------------------------------------------------------------- + // 私有方法 + // -------------------------------------------------------------------------------------------------------------- + + + /** + * 刷新ActualDataNodes + */ + private static void updateShardRuleActualDataNodes(ShardingSphereDataSource dataSource, String logicTableName, String newActualDataNodes) { + // Context manager. + ContextManager contextManager = dataSource.getContextManager(); + // Rule configuration. + String schemaName = "logic_db"; + Collection newRuleConfigList = new LinkedList<>(); + Collection oldRuleConfigList = dataSource.getContextManager() + .getMetaDataContexts() + .getMetaData(schemaName) + .getRuleMetaData() + .getConfigurations(); + for (RuleConfiguration oldRuleConfig : oldRuleConfigList) { + if (oldRuleConfig instanceof AlgorithmProvidedShardingRuleConfiguration) { + // Algorithm provided sharding rule configuration + AlgorithmProvidedShardingRuleConfiguration oldAlgorithmConfig = (AlgorithmProvidedShardingRuleConfiguration) oldRuleConfig; + AlgorithmProvidedShardingRuleConfiguration newAlgorithmConfig = new AlgorithmProvidedShardingRuleConfiguration(); + // Sharding table rule configuration Collection + Collection newTableRuleConfigList = new LinkedList<>(); + Collection oldTableRuleConfigList = oldAlgorithmConfig.getTables(); + oldTableRuleConfigList.forEach(oldTableRuleConfig -> { + if (logicTableName.equals(oldTableRuleConfig.getLogicTable())) { + ShardingTableRuleConfiguration newTableRuleConfig = new ShardingTableRuleConfiguration(oldTableRuleConfig.getLogicTable(), newActualDataNodes); + newTableRuleConfig.setTableShardingStrategy(oldTableRuleConfig.getTableShardingStrategy()); + newTableRuleConfig.setDatabaseShardingStrategy(oldTableRuleConfig.getDatabaseShardingStrategy()); + newTableRuleConfig.setKeyGenerateStrategy(oldTableRuleConfig.getKeyGenerateStrategy()); + newTableRuleConfigList.add(newTableRuleConfig); + } else { + newTableRuleConfigList.add(oldTableRuleConfig); + } + }); + newAlgorithmConfig.setTables(newTableRuleConfigList); + newAlgorithmConfig.setAutoTables(oldAlgorithmConfig.getAutoTables()); + newAlgorithmConfig.setBindingTableGroups(oldAlgorithmConfig.getBindingTableGroups()); + newAlgorithmConfig.setBroadcastTables(oldAlgorithmConfig.getBroadcastTables()); + newAlgorithmConfig.setDefaultDatabaseShardingStrategy(oldAlgorithmConfig.getDefaultDatabaseShardingStrategy()); + newAlgorithmConfig.setDefaultTableShardingStrategy(oldAlgorithmConfig.getDefaultTableShardingStrategy()); + newAlgorithmConfig.setDefaultKeyGenerateStrategy(oldAlgorithmConfig.getDefaultKeyGenerateStrategy()); + newAlgorithmConfig.setDefaultShardingColumn(oldAlgorithmConfig.getDefaultShardingColumn()); + newAlgorithmConfig.setShardingAlgorithms(oldAlgorithmConfig.getShardingAlgorithms()); + newAlgorithmConfig.setKeyGenerators(oldAlgorithmConfig.getKeyGenerators()); + newRuleConfigList.add(newAlgorithmConfig); + } + } + // update context + contextManager.alterRuleConfiguration(schemaName, newRuleConfigList); + } + + /** + * 创建分表 + * @param logicTable 逻辑表 + * @param resultTableName 真实表名,例:t_user_202201 + * @return 创建结果(true创建成功,false未创建) + */ + private static boolean createShardingTable(ShardingTableCacheEnum logicTable, String resultTableName) { + // 根据日期判断,当前月份之后分表不提前创建 + String month = resultTableName.replace(logicTable.logicTableName() + TABLE_SPLIT_SYMBOL,""); + YearMonth shardingMonth = YearMonth.parse(month, DateTimeFormatter.ofPattern("yyyyMM")); + if (shardingMonth.isAfter(YearMonth.now())) { + return false; + } + synchronized (logicTable.logicTableName().intern()) { + // 缓存中有此表 返回 + if (logicTable.resultTableNamesCache().contains(resultTableName)) { + return false; + } + // 缓存中无此表,则建表并添加缓存 + executeSql(Collections.singletonList("CREATE TABLE IF NOT EXISTS `" + resultTableName + "` LIKE `" + logicTable.logicTableName() + "`;")); + // 缓存重载 + tableNameCacheReload(logicTable); + } + return true; + } + + /** + * 执行SQL + * @param sqlList SQL集合 + */ + private static void executeSql(List sqlList) { + if (StringUtils.isEmpty(DATASOURCE_URL) || StringUtils.isEmpty(DATASOURCE_USERNAME) || StringUtils.isEmpty(DATASOURCE_PASSWORD)) { + log.error(">>>>>>>>>> 【ERROR】数据库连接配置有误,请稍后重试,URL:{}, username:{}, password:{}", DATASOURCE_URL, DATASOURCE_USERNAME, DATASOURCE_PASSWORD); + throw new IllegalArgumentException("数据库连接配置有误,请稍后重试"); + } + try (Connection conn = DriverManager.getConnection(DATASOURCE_URL, DATASOURCE_USERNAME, DATASOURCE_PASSWORD)) { + try (Statement st = conn.createStatement()) { + conn.setAutoCommit(false); + for (String sql : sqlList) { + st.execute(sql); + } + } catch (Exception e) { + conn.rollback(); + log.error(">>>>>>>>>> 【ERROR】数据表创建执行失败,请稍后重试,原因:{}", e.getMessage(), e); + throw new IllegalArgumentException("数据表创建执行失败,请稍后重试"); + } + } catch (SQLException e) { + log.error(">>>>>>>>>> 【ERROR】数据库连接失败,请稍后重试,原因:{}", e.getMessage(), e); + throw new IllegalArgumentException("数据库连接失败,请稍后重试"); + } + } +} diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/utils/ShardingTablesLoadRunner.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/utils/ShardingTablesLoadRunner.java new file mode 100644 index 0000000..2b277c6 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/utils/ShardingTablesLoadRunner.java @@ -0,0 +1,24 @@ +package com.win.framework.datasource.utils; + +import org.springframework.boot.CommandLineRunner; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +/** + *

@Title ShardingTablesLoadRunner + *

@Description 项目启动后,读取已有分表,进行缓存 + * + * @author liuchen + * @date 2022/12/20 15:41 + */ +@Order(value = 1) // 数字越小,越先执行 +@Component +public class ShardingTablesLoadRunner implements CommandLineRunner { + + @Override + public void run(String... args) { + // 读取已有分表,进行缓存 + ShardingAlgorithmTool.tableNameCacheReloadAll(); + } + +} \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/config/IdTypeEnvironmentPostProcessor.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/config/IdTypeEnvironmentPostProcessor.java new file mode 100644 index 0000000..ce7a938 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/config/IdTypeEnvironmentPostProcessor.java @@ -0,0 +1,108 @@ +package com.win.framework.mybatis.config; + +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.util.collection.SetUtils; +import com.win.framework.mybatis.core.enums.SqlConstants; +import com.win.framework.mybatis.core.util.JdbcUtils; +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.annotation.IdType; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.env.EnvironmentPostProcessor; +import org.springframework.core.env.ConfigurableEnvironment; + +import java.util.Set; + +/** + * 当 IdType 为 {@link IdType#NONE} 时,根据 PRIMARY 数据源所使用的数据库,自动设置 + * + * @author 闻荫源码 + */ +@Slf4j +public class IdTypeEnvironmentPostProcessor implements EnvironmentPostProcessor { + + private static final String ID_TYPE_KEY = "mybatis-plus.global-config.db-config.id-type"; + + private static final String DATASOURCE_DYNAMIC_KEY = "spring.datasource.dynamic"; + + private static final String QUARTZ_JOB_STORE_DRIVER_KEY = "spring.quartz.properties.org.quartz.jobStore.driverDelegateClass"; + + private static final Set INPUT_ID_TYPES = SetUtils.asSet(DbType.ORACLE, DbType.ORACLE_12C, + DbType.POSTGRE_SQL, DbType.KINGBASE_ES, DbType.DB2, DbType.H2); + + @Override + public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { + // 如果获取不到 DbType,则不进行处理 + DbType dbType = getDbType(environment); + if (dbType == null) { + return; + } + + // 设置 Quartz JobStore 对应的 Driver + // TODO 芋艿:暂时没有找到特别合适的地方,先放在这里 + setJobStoreDriverIfPresent(environment, dbType); + + // 初始化 SQL 静态变量 + SqlConstants.init(dbType); + + // 如果非 NONE,则不进行处理 + IdType idType = getIdType(environment); + if (idType != IdType.NONE) { + return; + } + // 情况一,用户输入 ID,适合 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库 + if (INPUT_ID_TYPES.contains(dbType)) { + setIdType(environment, IdType.INPUT); + return; + } + // 情况二,自增 ID,适合 MySQL 等直接自增的数据库 + setIdType(environment, IdType.AUTO); + } + + public IdType getIdType(ConfigurableEnvironment environment) { + return environment.getProperty(ID_TYPE_KEY, IdType.class); + } + + public void setIdType(ConfigurableEnvironment environment, IdType idType) { + environment.getSystemProperties().put(ID_TYPE_KEY, idType); + log.info("[setIdType][修改 MyBatis Plus 的 idType 为({})]", idType); + } + + public void setJobStoreDriverIfPresent(ConfigurableEnvironment environment, DbType dbType) { + String driverClass = environment.getProperty(QUARTZ_JOB_STORE_DRIVER_KEY); + if (StrUtil.isNotEmpty(driverClass)) { + return; + } + // 根据 dbType 类型,获取对应的 driverClass + switch (dbType) { + case POSTGRE_SQL: + driverClass = "org.quartz.impl.jdbcjobstore.PostgreSQLDelegate"; + break; + case ORACLE: + case ORACLE_12C: + driverClass = "org.quartz.impl.jdbcjobstore.oracle.OracleDelegate"; + break; + case SQL_SERVER: + case SQL_SERVER2005: + driverClass = "org.quartz.impl.jdbcjobstore.MSSQLDelegate"; + break; + } + // 设置 driverClass 变量 + if (StrUtil.isNotEmpty(driverClass)) { + environment.getSystemProperties().put(QUARTZ_JOB_STORE_DRIVER_KEY, driverClass); + } + } + + public static DbType getDbType(ConfigurableEnvironment environment) { + String primary = environment.getProperty(DATASOURCE_DYNAMIC_KEY + "." + "primary"); + if (StrUtil.isEmpty(primary)) { + return null; + } + String url = environment.getProperty(DATASOURCE_DYNAMIC_KEY + ".datasource." + primary + ".url"); + if (StrUtil.isEmpty(url)) { + return null; + } + return JdbcUtils.getDbType(url); + } + +} diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/config/WinMybatisAutoConfiguration.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/config/WinMybatisAutoConfiguration.java new file mode 100644 index 0000000..7cf5c9d --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/config/WinMybatisAutoConfiguration.java @@ -0,0 +1,63 @@ +package com.win.framework.mybatis.config; + +import cn.hutool.core.util.StrUtil; +import com.win.framework.mybatis.core.handler.DefaultDBFieldHandler; +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import com.baomidou.mybatisplus.core.incrementer.IKeyGenerator; +import com.baomidou.mybatisplus.extension.incrementer.*; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import org.apache.ibatis.annotations.Mapper; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; +import org.springframework.core.env.ConfigurableEnvironment; + +/** + * MyBaits 配置类 + * + * @author 闻荫源码 + */ +@AutoConfiguration +@MapperScan(value = "${win.info.base-package}", annotationClass = Mapper.class, + lazyInitialization = "${mybatis.lazy-initialization:false}") // Mapper 懒加载,目前仅用于单元测试 +public class WinMybatisAutoConfiguration { + + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor(); + mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor()); // 分页插件 + return mybatisPlusInterceptor; + } + + @Bean + public MetaObjectHandler defaultMetaObjectHandler(){ + return new DefaultDBFieldHandler(); // 自动填充参数类 + } + + @Bean + @ConditionalOnProperty(prefix = "mybatis-plus.global-config.db-config", name = "id-type", havingValue = "INPUT") + public IKeyGenerator keyGenerator(ConfigurableEnvironment environment) { + DbType dbType = IdTypeEnvironmentPostProcessor.getDbType(environment); + if (dbType != null) { + switch (dbType) { + case POSTGRE_SQL: + return new PostgreKeyGenerator(); + case ORACLE: + case ORACLE_12C: + return new OracleKeyGenerator(); + case H2: + return new H2KeyGenerator(); + case KINGBASE_ES: + return new KingbaseKeyGenerator(); + case DM: + return new DmKeyGenerator(); + } + } + // 找不到合适的 IKeyGenerator 实现类 + throw new IllegalArgumentException(StrUtil.format("DbType{} 找不到合适的 IKeyGenerator 实现类", dbType)); + } + +} diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/dataobject/BaseDO.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/dataobject/BaseDO.java new file mode 100644 index 0000000..757ebf8 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/dataobject/BaseDO.java @@ -0,0 +1,50 @@ +package com.win.framework.mybatis.core.dataobject; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableLogic; +import lombok.Data; +import org.apache.ibatis.type.JdbcType; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 基础实体对象 + * + * @author 闻荫源码 + */ +@Data +public abstract class BaseDO implements Serializable { + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + /** + * 最后更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; + /** + * 创建者,目前使用 SysUser 的 id 编号 + * + * 使用 String 类型的原因是,未来可能会存在非数值的情况,留好拓展性。 + */ + @TableField(fill = FieldFill.INSERT, jdbcType = JdbcType.VARCHAR) + private String creator; + /** + * 更新者,目前使用 SysUser 的 id 编号 + * + * 使用 String 类型的原因是,未来可能会存在非数值的情况,留好拓展性。 + */ + @TableField(fill = FieldFill.INSERT_UPDATE, jdbcType = JdbcType.VARCHAR) + private String updater; + /** + * 是否删除 + */ + @TableLogic + private Boolean deleted; + +} diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/enums/SqlConstants.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/enums/SqlConstants.java new file mode 100644 index 0000000..88b159c --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/enums/SqlConstants.java @@ -0,0 +1,21 @@ +package com.win.framework.mybatis.core.enums; + +import com.baomidou.mybatisplus.annotation.DbType; + +/** + * SQL相关常量类 + * + * @author 闻荫源码 + */ +public class SqlConstants { + + /** + * 数据库的类型 + */ + public static DbType DB_TYPE; + + public static void init(DbType dbType) { + DB_TYPE = dbType; + } + +} diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/handler/DefaultDBFieldHandler.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/handler/DefaultDBFieldHandler.java new file mode 100644 index 0000000..d97801c --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/handler/DefaultDBFieldHandler.java @@ -0,0 +1,62 @@ +package com.win.framework.mybatis.core.handler; + +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.framework.web.core.util.WebFrameworkUtils; +import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import org.apache.ibatis.reflection.MetaObject; + +import java.time.LocalDateTime; +import java.util.Objects; + +/** + * 通用参数填充实现类 + * + * 如果没有显式的对通用参数进行赋值,这里会对通用参数进行填充、赋值 + * + * @author hexiaowu + */ +public class DefaultDBFieldHandler implements MetaObjectHandler { + + @Override + public void insertFill(MetaObject metaObject) { + if (Objects.nonNull(metaObject) && metaObject.getOriginalObject() instanceof BaseDO) { + BaseDO baseDO = (BaseDO) metaObject.getOriginalObject(); + + LocalDateTime current = LocalDateTime.now(); + // 创建时间为空,则以当前时间为插入时间 + if (Objects.isNull(baseDO.getCreateTime())) { + baseDO.setCreateTime(current); + } + // 更新时间为空,则以当前时间为更新时间 + if (Objects.isNull(baseDO.getUpdateTime())) { + baseDO.setUpdateTime(current); + } + + Long userId = WebFrameworkUtils.getLoginUserId(); + // 当前登录用户不为空,创建人为空,则当前登录用户为创建人 + if (Objects.nonNull(userId) && Objects.isNull(baseDO.getCreator())) { + baseDO.setCreator(userId.toString()); + } + // 当前登录用户不为空,更新人为空,则当前登录用户为更新人 + if (Objects.nonNull(userId) && Objects.isNull(baseDO.getUpdater())) { + baseDO.setUpdater(userId.toString()); + } + } + } + + @Override + public void updateFill(MetaObject metaObject) { + // 更新时间为空,则以当前时间为更新时间 + Object modifyTime = getFieldValByName("updateTime", metaObject); + if (Objects.isNull(modifyTime)) { + setFieldValByName("updateTime", LocalDateTime.now(), metaObject); + } + + // 当前登录用户不为空,更新人为空,则当前登录用户为更新人 + Object modifier = getFieldValByName("updater", metaObject); + Long userId = WebFrameworkUtils.getLoginUserId(); + if (Objects.nonNull(userId) && Objects.isNull(modifier)) { + setFieldValByName("updater", userId.toString(), metaObject); + } + } +} diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/mapper/BaseMapperX.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/mapper/BaseMapperX.java new file mode 100644 index 0000000..01b6e96 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/mapper/BaseMapperX.java @@ -0,0 +1,135 @@ +package com.win.framework.mybatis.core.mapper; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.support.SFunction; +import com.baomidou.mybatisplus.extension.toolkit.Db; +import com.github.yulichang.base.MPJBaseMapper; +import com.win.framework.common.pojo.PageParam; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.util.MyBatisUtils; +import org.apache.ibatis.annotations.Param; + +import java.util.Collection; +import java.util.List; + +/** + * 在 MyBatis Plus 的 BaseMapper 的基础上拓展,提供更多的能力 + * + * 1. {@link BaseMapper} 为 MyBatis Plus 的基础接口,提供基础的 CRUD 能力 + * 2. {@link MPJBaseMapper} 为 MyBatis Plus Join 的基础接口,提供连表 Join 能力 + */ +public interface BaseMapperX extends MPJBaseMapper { + + default PageResult selectPage(PageParam pageParam, @Param("ew") Wrapper queryWrapper) { + // MyBatis Plus 查询 + IPage mpPage = MyBatisUtils.buildPage(pageParam); + selectPage(mpPage, queryWrapper); + // 转换返回 + return new PageResult<>(mpPage.getRecords(), mpPage.getTotal()); + } + + default T selectOne(String field, Object value) { + return selectOne(new QueryWrapper().eq(field, value)); + } + + default T selectOne(SFunction field, Object value) { + return selectOne(new LambdaQueryWrapper().eq(field, value)); + } + + default T selectOne(String field1, Object value1, String field2, Object value2) { + return selectOne(new QueryWrapper().eq(field1, value1).eq(field2, value2)); + } + + default T selectOne(SFunction field1, Object value1, SFunction field2, Object value2) { + return selectOne(new LambdaQueryWrapper().eq(field1, value1).eq(field2, value2)); + } + + default T selectOne(SFunction field1, Object value1, SFunction field2, Object value2, + SFunction field3, Object value3) { + return selectOne(new LambdaQueryWrapper().eq(field1, value1).eq(field2, value2) + .eq(field3, value3)); + } + + default Long selectCount() { + return selectCount(new QueryWrapper()); + } + + default Long selectCount(String field, Object value) { + return selectCount(new QueryWrapper().eq(field, value)); + } + + default Long selectCount(SFunction field, Object value) { + return selectCount(new LambdaQueryWrapper().eq(field, value)); + } + + default List selectList() { + return selectList(new QueryWrapper<>()); + } + + default List selectList(String field, Object value) { + return selectList(new QueryWrapper().eq(field, value)); + } + + default List selectList(SFunction field, Object value) { + return selectList(new LambdaQueryWrapper().eq(field, value)); + } + + default List selectList(String field, Collection values) { + if (CollUtil.isEmpty(values)) { + return CollUtil.newArrayList(); + } + return selectList(new QueryWrapper().in(field, values)); + } + + default List selectList(SFunction field, Collection values) { + if (CollUtil.isEmpty(values)) { + return CollUtil.newArrayList(); + } + return selectList(new LambdaQueryWrapper().in(field, values)); + } + + default List selectList(SFunction leField, SFunction geField, Object value) { + return selectList(new LambdaQueryWrapper().le(leField, value).ge(geField, value)); + } + + /** + * 批量插入,适合大量数据插入 + * + * @param entities 实体们 + */ + default void insertBatch(Collection entities) { + Db.saveBatch(entities); + } + + /** + * 批量插入,适合大量数据插入 + * + * @param entities 实体们 + * @param size 插入数量 Db.saveBatch 默认为 1000 + */ + default void insertBatch(Collection entities, int size) { + Db.saveBatch(entities, size); + } + + default void updateBatch(T update) { + update(update, new QueryWrapper<>()); + } + + default void updateBatch(Collection entities) { + Db.updateBatchById(entities); + } + + default void updateBatch(Collection entities, int size) { + Db.updateBatchById(entities, size); + } + + default void saveOrUpdateBatch(Collection collection) { + Db.saveOrUpdateBatch(collection); + } + +} diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/query/LambdaQueryWrapperX.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/query/LambdaQueryWrapperX.java new file mode 100644 index 0000000..82d9eac --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/query/LambdaQueryWrapperX.java @@ -0,0 +1,135 @@ +package com.win.framework.mybatis.core.query; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ObjectUtil; +import com.win.framework.common.util.collection.ArrayUtils; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.support.SFunction; +import org.springframework.util.StringUtils; + +import java.util.Collection; + +/** + * 拓展 MyBatis Plus QueryWrapper 类,主要增加如下功能: + *

+ * 1. 拼接条件的方法,增加 xxxIfPresent 方法,用于判断值不存在的时候,不要拼接到条件中。 + * + * @param 数据类型 + */ +public class LambdaQueryWrapperX extends LambdaQueryWrapper { + + public LambdaQueryWrapperX likeIfPresent(SFunction column, String val) { + if (StringUtils.hasText(val)) { + return (LambdaQueryWrapperX) super.like(column, val); + } + return this; + } + + public LambdaQueryWrapperX inIfPresent(SFunction column, Collection values) { + if (ObjectUtil.isAllNotEmpty(values) && !ArrayUtil.isEmpty(values)) { + return (LambdaQueryWrapperX) super.in(column, values); + } + return this; + } + + public LambdaQueryWrapperX inIfPresent(SFunction column, Object... values) { + if (ObjectUtil.isAllNotEmpty(values) && !ArrayUtil.isEmpty(values)) { + return (LambdaQueryWrapperX) super.in(column, values); + } + return this; + } + + public LambdaQueryWrapperX eqIfPresent(SFunction column, Object val) { + if (ObjectUtil.isNotEmpty(val)) { + return (LambdaQueryWrapperX) super.eq(column, val); + } + return this; + } + + public LambdaQueryWrapperX neIfPresent(SFunction column, Object val) { + if (ObjectUtil.isNotEmpty(val)) { + return (LambdaQueryWrapperX) super.ne(column, val); + } + return this; + } + + public LambdaQueryWrapperX gtIfPresent(SFunction column, Object val) { + if (val != null) { + return (LambdaQueryWrapperX) super.gt(column, val); + } + return this; + } + + public LambdaQueryWrapperX geIfPresent(SFunction column, Object val) { + if (val != null) { + return (LambdaQueryWrapperX) super.ge(column, val); + } + return this; + } + + public LambdaQueryWrapperX ltIfPresent(SFunction column, Object val) { + if (val != null) { + return (LambdaQueryWrapperX) super.lt(column, val); + } + return this; + } + + public LambdaQueryWrapperX leIfPresent(SFunction column, Object val) { + if (val != null) { + return (LambdaQueryWrapperX) super.le(column, val); + } + return this; + } + + public LambdaQueryWrapperX betweenIfPresent(SFunction column, Object val1, Object val2) { + if (val1 != null && val2 != null) { + return (LambdaQueryWrapperX) super.between(column, val1, val2); + } + if (val1 != null) { + return (LambdaQueryWrapperX) ge(column, val1); + } + if (val2 != null) { + return (LambdaQueryWrapperX) le(column, val2); + } + return this; + } + + public LambdaQueryWrapperX betweenIfPresent(SFunction column, Object[] values) { + Object val1 = ArrayUtils.get(values, 0); + Object val2 = ArrayUtils.get(values, 1); + return betweenIfPresent(column, val1, val2); + } + + // ========== 重写父类方法,方便链式调用 ========== + + @Override + public LambdaQueryWrapperX eq(boolean condition, SFunction column, Object val) { + super.eq(condition, column, val); + return this; + } + + @Override + public LambdaQueryWrapperX eq(SFunction column, Object val) { + super.eq(column, val); + return this; + } + + @Override + public LambdaQueryWrapperX orderByDesc(SFunction column) { + super.orderByDesc(true, column); + return this; + } + + @Override + public LambdaQueryWrapperX last(String lastSql) { + super.last(lastSql); + return this; + } + + @Override + public LambdaQueryWrapperX in(SFunction column, Collection coll) { + super.in(column, coll); + return this; + } + +} diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/query/QueryWrapperX.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/query/QueryWrapperX.java new file mode 100644 index 0000000..5f03834 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/query/QueryWrapperX.java @@ -0,0 +1,166 @@ +package com.win.framework.mybatis.core.query; + +import cn.hutool.core.lang.Assert; +import com.win.framework.mybatis.core.enums.SqlConstants; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.ArrayUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.util.Collection; + +/** + * 拓展 MyBatis Plus QueryWrapper 类,主要增加如下功能: + * + * 1. 拼接条件的方法,增加 xxxIfPresent 方法,用于判断值不存在的时候,不要拼接到条件中。 + * + * @param 数据类型 + */ +public class QueryWrapperX extends QueryWrapper { + + public QueryWrapperX likeIfPresent(String column, String val) { + if (StringUtils.hasText(val)) { + return (QueryWrapperX) super.like(column, val); + } + return this; + } + + public QueryWrapperX inIfPresent(String column, Collection values) { + if (!CollectionUtils.isEmpty(values)) { + return (QueryWrapperX) super.in(column, values); + } + return this; + } + + public QueryWrapperX inIfPresent(String column, Object... values) { + if (!ArrayUtils.isEmpty(values)) { + return (QueryWrapperX) super.in(column, values); + } + return this; + } + + public QueryWrapperX eqIfPresent(String column, Object val) { + if (val != null) { + return (QueryWrapperX) super.eq(column, val); + } + return this; + } + + public QueryWrapperX neIfPresent(String column, Object val) { + if (val != null) { + return (QueryWrapperX) super.ne(column, val); + } + return this; + } + + public QueryWrapperX gtIfPresent(String column, Object val) { + if (val != null) { + return (QueryWrapperX) super.gt(column, val); + } + return this; + } + + public QueryWrapperX geIfPresent(String column, Object val) { + if (val != null) { + return (QueryWrapperX) super.ge(column, val); + } + return this; + } + + public QueryWrapperX ltIfPresent(String column, Object val) { + if (val != null) { + return (QueryWrapperX) super.lt(column, val); + } + return this; + } + + public QueryWrapperX leIfPresent(String column, Object val) { + if (val != null) { + return (QueryWrapperX) super.le(column, val); + } + return this; + } + + public QueryWrapperX betweenIfPresent(String column, Object val1, Object val2) { + if (val1 != null && val2 != null) { + return (QueryWrapperX) super.between(column, val1, val2); + } + if (val1 != null) { + return (QueryWrapperX) ge(column, val1); + } + if (val2 != null) { + return (QueryWrapperX) le(column, val2); + } + return this; + } + + public QueryWrapperX betweenIfPresent(String column, Object[] values) { + if (values!= null && values.length != 0 && values[0] != null && values[1] != null) { + return (QueryWrapperX) super.between(column, values[0], values[1]); + } + if (values!= null && values.length != 0 && values[0] != null) { + return (QueryWrapperX) ge(column, values[0]); + } + if (values!= null && values.length != 0 && values[1] != null) { + return (QueryWrapperX) le(column, values[1]); + } + return this; + } + + // ========== 重写父类方法,方便链式调用 ========== + + @Override + public QueryWrapperX eq(boolean condition, String column, Object val) { + super.eq(condition, column, val); + return this; + } + + @Override + public QueryWrapperX eq(String column, Object val) { + super.eq(column, val); + return this; + } + + @Override + public QueryWrapperX orderByDesc(String column) { + super.orderByDesc(true, column); + return this; + } + + @Override + public QueryWrapperX last(String lastSql) { + super.last(lastSql); + return this; + } + + @Override + public QueryWrapperX in(String column, Collection coll) { + super.in(column, coll); + return this; + } + + /** + * 设置只返回最后一条 + * + * TODO 芋艿:不是完美解,需要在思考下。如果使用多数据源,并且数据源是多种类型时,可能会存在问题:实现之返回一条的语法不同 + * + * @return this + */ + public QueryWrapperX limitN(int n) { + Assert.notNull(SqlConstants.DB_TYPE, "获取不到数据库的类型"); + switch (SqlConstants.DB_TYPE) { + case ORACLE: + case ORACLE_12C: + super.eq("ROWNUM", n); + break; + case SQL_SERVER: + case SQL_SERVER2005: + super.select("TOP " + n + " *"); // 由于 SQL Server 是通过 SELECT TOP 1 实现限制一条,所以只好使用 * 查询剩余字段 + break; + default: + super.last("LIMIT " + n); + } + return this; + } + +} diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/type/EncryptTypeHandler.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/type/EncryptTypeHandler.java new file mode 100644 index 0000000..2310ba3 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/type/EncryptTypeHandler.java @@ -0,0 +1,75 @@ +package com.win.framework.mybatis.core.type; + +import cn.hutool.core.lang.Assert; +import cn.hutool.crypto.SecureUtil; +import cn.hutool.crypto.symmetric.AES; +import cn.hutool.extra.spring.SpringUtil; +import org.apache.ibatis.type.BaseTypeHandler; +import org.apache.ibatis.type.JdbcType; + +import java.sql.CallableStatement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +/** + * 字段字段的 TypeHandler 实现类,基于 {@link cn.hutool.crypto.symmetric.AES} 实现 + * 可通过 jasypt.encryptor.password 配置项,设置密钥 + * + * @author 闻荫源码 + */ +public class EncryptTypeHandler extends BaseTypeHandler { + + private static final String ENCRYPTOR_PROPERTY_NAME = "mybatis-plus.encryptor.password"; + + private static AES aes; + + @Override + public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException { + ps.setString(i, encrypt(parameter)); + } + + @Override + public String getNullableResult(ResultSet rs, String columnName) throws SQLException { + String value = rs.getString(columnName); + return decrypt(value); + } + + @Override + public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException { + String value = rs.getString(columnIndex); + return decrypt(value); + } + + @Override + public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { + String value = cs.getString(columnIndex); + return decrypt(value); + } + + private static String decrypt(String value) { + if (value == null) { + return null; + } + return getEncryptor().decryptStr(value); + } + + public static String encrypt(String rawValue) { + if (rawValue == null) { + return null; + } + return getEncryptor().encryptBase64(rawValue); + } + + private static AES getEncryptor() { + if (aes != null) { + return aes; + } + // 构建 AES + String password = SpringUtil.getProperty(ENCRYPTOR_PROPERTY_NAME); + Assert.notEmpty(password, "配置项({}) 不能为空", ENCRYPTOR_PROPERTY_NAME); + aes = SecureUtil.aes(password.getBytes()); + return aes; + } + +} diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/type/IntegerListTypeHandler.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/type/IntegerListTypeHandler.java new file mode 100644 index 0000000..0032617 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/type/IntegerListTypeHandler.java @@ -0,0 +1,56 @@ +package com.win.framework.mybatis.core.type; + +import cn.hutool.core.collection.CollUtil; +import com.win.framework.common.util.string.StrUtils; +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.MappedJdbcTypes; +import org.apache.ibatis.type.MappedTypes; +import org.apache.ibatis.type.TypeHandler; + +import java.sql.CallableStatement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +/** + * List 的类型转换器实现类,对应数据库的 varchar 类型 + * + * @author jason + */ +@MappedJdbcTypes(JdbcType.VARCHAR) +@MappedTypes(List.class) +public class IntegerListTypeHandler implements TypeHandler> { + + private static final String COMMA = ","; + + @Override + public void setParameter(PreparedStatement ps, int i, List strings, JdbcType jdbcType) throws SQLException { + ps.setString(i, CollUtil.join(strings, COMMA)); + } + + @Override + public List getResult(ResultSet rs, String columnName) throws SQLException { + String value = rs.getString(columnName); + return getResult(value); + } + + @Override + public List getResult(ResultSet rs, int columnIndex) throws SQLException { + String value = rs.getString(columnIndex); + return getResult(value); + } + + @Override + public List getResult(CallableStatement cs, int columnIndex) throws SQLException { + String value = cs.getString(columnIndex); + return getResult(value); + } + + private List getResult(String value) { + if (value == null) { + return null; + } + return StrUtils.splitToInteger(value, COMMA); + } +} diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/type/JsonLongSetTypeHandler.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/type/JsonLongSetTypeHandler.java new file mode 100644 index 0000000..d98bcf5 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/type/JsonLongSetTypeHandler.java @@ -0,0 +1,31 @@ +package com.win.framework.mybatis.core.type; + +import com.win.framework.common.util.json.JsonUtils; +import com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler; +import com.fasterxml.jackson.core.type.TypeReference; + +import java.util.Set; + +/** + * 参考 {@link com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler} 实现 + * 在我们将字符串反序列化为 Set 并且泛型为 Long 时,如果每个元素的数值太小,会被处理成 Integer 类型,导致可能存在隐性的 BUG。 + * + * 例如说哦,SysUserDO 的 postIds 属性 + * + * @author 闻荫源码 + */ +public class JsonLongSetTypeHandler extends AbstractJsonTypeHandler { + + private static final TypeReference> TYPE_REFERENCE = new TypeReference>(){}; + + @Override + protected Object parse(String json) { + return JsonUtils.parseObject(json, TYPE_REFERENCE); + } + + @Override + protected String toJson(Object obj) { + return JsonUtils.toJsonString(obj); + } + +} diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/type/LongListTypeHandler.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/type/LongListTypeHandler.java new file mode 100644 index 0000000..9aa0d53 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/type/LongListTypeHandler.java @@ -0,0 +1,57 @@ +package com.win.framework.mybatis.core.type; + +import cn.hutool.core.collection.CollUtil; +import com.win.framework.common.util.string.StrUtils; +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.MappedJdbcTypes; +import org.apache.ibatis.type.MappedTypes; +import org.apache.ibatis.type.TypeHandler; + +import java.sql.CallableStatement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +/** + * List 的类型转换器实现类,对应数据库的 varchar 类型 + * + * @author 闻荫源码 + */ +@MappedJdbcTypes(JdbcType.VARCHAR) +@MappedTypes(List.class) +public class LongListTypeHandler implements TypeHandler> { + + private static final String COMMA = ","; + + @Override + public void setParameter(PreparedStatement ps, int i, List strings, JdbcType jdbcType) throws SQLException { + // 设置占位符 + ps.setString(i, CollUtil.join(strings, COMMA)); + } + + @Override + public List getResult(ResultSet rs, String columnName) throws SQLException { + String value = rs.getString(columnName); + return getResult(value); + } + + @Override + public List getResult(ResultSet rs, int columnIndex) throws SQLException { + String value = rs.getString(columnIndex); + return getResult(value); + } + + @Override + public List getResult(CallableStatement cs, int columnIndex) throws SQLException { + String value = cs.getString(columnIndex); + return getResult(value); + } + + private List getResult(String value) { + if (value == null) { + return null; + } + return StrUtils.splitToLong(value, COMMA); + } +} diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/type/StringListTypeHandler.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/type/StringListTypeHandler.java new file mode 100644 index 0000000..fcc4958 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/type/StringListTypeHandler.java @@ -0,0 +1,58 @@ +package com.win.framework.mybatis.core.type; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.MappedJdbcTypes; +import org.apache.ibatis.type.MappedTypes; +import org.apache.ibatis.type.TypeHandler; + +import java.sql.CallableStatement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +/** + * List 的类型转换器实现类,对应数据库的 varchar 类型 + * + * @author 永不言败 + * @since 2022 3/23 12:50:15 + */ +@MappedJdbcTypes(JdbcType.VARCHAR) +@MappedTypes(List.class) +public class StringListTypeHandler implements TypeHandler> { + + private static final String COMMA = ","; + + @Override + public void setParameter(PreparedStatement ps, int i, List strings, JdbcType jdbcType) throws SQLException { + // 设置占位符 + ps.setString(i, CollUtil.join(strings, COMMA)); + } + + @Override + public List getResult(ResultSet rs, String columnName) throws SQLException { + String value = rs.getString(columnName); + return getResult(value); + } + + @Override + public List getResult(ResultSet rs, int columnIndex) throws SQLException { + String value = rs.getString(columnIndex); + return getResult(value); + } + + @Override + public List getResult(CallableStatement cs, int columnIndex) throws SQLException { + String value = cs.getString(columnIndex); + return getResult(value); + } + + private List getResult(String value) { + if (value == null) { + return null; + } + return StrUtil.splitTrim(value, COMMA); + } +} diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/util/JdbcUtils.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/util/JdbcUtils.java new file mode 100644 index 0000000..b908be9 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/util/JdbcUtils.java @@ -0,0 +1,42 @@ +package com.win.framework.mybatis.core.util; + +import com.baomidou.mybatisplus.annotation.DbType; + +import java.sql.Connection; +import java.sql.DriverManager; + +/** + * JDBC 工具类 + * + * @author 闻荫源码 + */ +public class JdbcUtils { + + /** + * 判断连接是否正确 + * + * @param url 数据源连接 + * @param username 账号 + * @param password 密码 + * @return 是否正确 + */ + public static boolean isConnectionOK(String url, String username, String password) { + try (Connection ignored = DriverManager.getConnection(url, username, password)) { + return true; + } catch (Exception ex) { + return false; + } + } + + /** + * 获得 URL 对应的 DB 类型 + * + * @param url URL + * @return DB 类型 + */ + public static DbType getDbType(String url) { + String name = com.alibaba.druid.util.JdbcUtils.getDbType(url, null); + return DbType.getDbType(name); + } + +} diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/util/MyBatisUtils.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/util/MyBatisUtils.java new file mode 100644 index 0000000..3baa48b --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/util/MyBatisUtils.java @@ -0,0 +1,81 @@ +package com.win.framework.mybatis.core.util; + +import com.baomidou.mybatisplus.core.metadata.OrderItem; +import com.baomidou.mybatisplus.core.toolkit.StringPool; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.win.framework.common.pojo.PageParam; +import net.sf.jsqlparser.expression.Alias; +import net.sf.jsqlparser.schema.Column; +import net.sf.jsqlparser.schema.Table; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; + +/** + * MyBatis 工具类 + */ +public class MyBatisUtils { + + private static final String MYSQL_ESCAPE_CHARACTER = "`"; + + public static Page buildPage(PageParam pageParam) { + // 页码 + 数量 + Page page = new Page<>(pageParam.getPageNo(), pageParam.getPageSize()); + // 排序字段 + if (!StringUtils.isEmpty(pageParam.getBy()) && !StringUtils.isEmpty(pageParam.getSort())) { + page.addOrder(PageParam.ORDER_ASC.equals(pageParam.getBy()) ? OrderItem.asc(pageParam.getSort()) : OrderItem.desc(pageParam.getSort())); + } else { + page.addOrder(OrderItem.desc("create_time")); + } + return page; + } + + /** + * 将拦截器添加到链中 + * 由于 MybatisPlusInterceptor 不支持添加拦截器,所以只能全量设置 + * + * @param interceptor 链 + * @param inner 拦截器 + * @param index 位置 + */ + public static void addInterceptor(MybatisPlusInterceptor interceptor, InnerInterceptor inner, int index) { + List inners = new ArrayList<>(interceptor.getInterceptors()); + inners.add(index, inner); + interceptor.setInterceptors(inners); + } + + /** + * 获得 Table 对应的表名 + * + * 兼容 MySQL 转义表名 `t_xxx` + * + * @param table 表 + * @return 去除转移字符后的表名 + */ + public static String getTableName(Table table) { + String tableName = table.getName(); + if (tableName.startsWith(MYSQL_ESCAPE_CHARACTER) && tableName.endsWith(MYSQL_ESCAPE_CHARACTER)) { + tableName = tableName.substring(1, tableName.length() - 1); + } + return tableName; + } + + /** + * 构建 Column 对象 + * + * @param tableName 表名 + * @param tableAlias 别名 + * @param column 字段名 + * @return Column 对象 + */ + public static Column buildColumn(String tableName, Alias tableAlias, String column) { + if (tableAlias != null) { + tableName = tableAlias.getName(); + } + return new Column(tableName + StringPool.DOT + column); + } + +} diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/util/QueryWrapperUtils.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/util/QueryWrapperUtils.java new file mode 100644 index 0000000..4eed2ec --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/util/QueryWrapperUtils.java @@ -0,0 +1,86 @@ +package com.win.framework.mybatis.core.util; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.google.common.base.CaseFormat; +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.util.collection.CollectionUtils; + +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneOffset; +import java.util.Arrays; + +/** + * QueryWrapper工具类 + */ +public class QueryWrapperUtils { + + /** + * 根据参数动态组装QueryWrapper + * @param customConditions filters {column: "userName", action: "==", value: "wenyin"} sorting userName DESC + * @param + * @return + */ + public static QueryWrapper structure(CustomConditions customConditions) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(CollectionUtils.isAnyEmpty(customConditions.getFilters())) { + return queryWrapper; + } + for(CustomConditions.Condition condition : customConditions.getFilters()) { + String column = condition.getColumn(); + if(column == null || column.isEmpty() || condition.getValue() == null || condition.getValue().isEmpty() || condition.getAction() == null || condition.getAction().isEmpty()) { + continue; + } + column = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, column); + switch (condition.getAction()) { + case "==" : + queryWrapper.eq(column, condition.getValue()); + break; + case "!=" : + queryWrapper.ne(column, condition.getValue()); + break; + case ">" : + queryWrapper.gt(column, condition.getValue()); + break; + case "<" : + queryWrapper.lt(column, condition.getValue()); + break; + case ">=" : + queryWrapper.ge(column, condition.getValue()); + break; + case "<=" : + queryWrapper.le(column, condition.getValue()); + break; + case "like" : + queryWrapper.like(column, condition.getValue()); + break; + case "in" : + String[] strs = condition.getValue().split(","); + queryWrapper.in(column, Arrays.asList(strs)); + break; + case "notin" : + strs = condition.getValue().split(","); + queryWrapper.notIn(column, Arrays.asList(strs)); + break; + case "betweeen" : + strs = condition.getValue().split(","); + if(strs.length != 2) { + break; + } + LocalDateTime localDateTime1 = Instant.ofEpochMilli(Long.parseLong(strs[0])).atZone(ZoneOffset.ofHours(8)).toLocalDateTime(); + LocalDateTime localDateTime2 = Instant.ofEpochMilli(Long.parseLong(strs[1])).atZone(ZoneOffset.ofHours(8)).toLocalDateTime(); + queryWrapper.between(column, localDateTime1, localDateTime2); + break; + case "isNull" : + queryWrapper.isNull(column); + break; + case "isNotNull" : + queryWrapper.isNotNull(column); + break; + default: + break; + } + } + return queryWrapper; + } +} diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/resources/META-INF/spring.factories b/win-framework/win-spring-boot-starter-mybatis/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..8e472fc --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/resources/META-INF/spring.factories @@ -0,0 +1,3 @@ +org.springframework.boot.env.EnvironmentPostProcessor=\ + com.win.framework.mybatis.config.IdTypeEnvironmentPostProcessor + diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/win-framework/win-spring-boot-starter-mybatis/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..9c8f0dd --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1,3 @@ +com.win.framework.datasource.config.WinDataSourceAutoConfiguration +com.win.framework.mybatis.config.WinMybatisAutoConfiguration +com.win.framework.datasource.utils.ShardingTablesLoadRunner \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-protection/pom.xml b/win-framework/win-spring-boot-starter-protection/pom.xml new file mode 100644 index 0000000..d14daea --- /dev/null +++ b/win-framework/win-spring-boot-starter-protection/pom.xml @@ -0,0 +1,39 @@ + + + + com.win + win-framework + ${revision} + + 4.0.0 + win-spring-boot-starter-protection + jar + + ${project.artifactId} + 服务保证,提供分布式锁、幂等、限流、熔断等等功能 + https://github.com/YunaiV/ruoyi-vue-pro + + + + + com.win + win-spring-boot-starter-redis + + + + + com.baomidou + lock4j-redisson-spring-boot-starter + true + + + + io.github.resilience4j + resilience4j-spring-boot2 + true + + + + diff --git a/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/config/WinIdempotentConfiguration.java b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/config/WinIdempotentConfiguration.java new file mode 100644 index 0000000..f1efc9b --- /dev/null +++ b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/config/WinIdempotentConfiguration.java @@ -0,0 +1,40 @@ +package com.win.framework.idempotent.config; + +import com.win.framework.idempotent.core.aop.IdempotentAspect; +import com.win.framework.idempotent.core.keyresolver.impl.DefaultIdempotentKeyResolver; +import com.win.framework.idempotent.core.keyresolver.impl.ExpressionIdempotentKeyResolver; +import com.win.framework.idempotent.core.keyresolver.IdempotentKeyResolver; +import com.win.framework.idempotent.core.redis.IdempotentRedisDAO; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import com.win.framework.redis.config.WinRedisAutoConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.data.redis.core.StringRedisTemplate; + +import java.util.List; + +@AutoConfiguration(after = WinRedisAutoConfiguration.class) +public class WinIdempotentConfiguration { + + @Bean + public IdempotentAspect idempotentAspect(List keyResolvers, IdempotentRedisDAO idempotentRedisDAO) { + return new IdempotentAspect(keyResolvers, idempotentRedisDAO); + } + + @Bean + public IdempotentRedisDAO idempotentRedisDAO(StringRedisTemplate stringRedisTemplate) { + return new IdempotentRedisDAO(stringRedisTemplate); + } + + // ========== 各种 IdempotentKeyResolver Bean ========== + + @Bean + public DefaultIdempotentKeyResolver defaultIdempotentKeyResolver() { + return new DefaultIdempotentKeyResolver(); + } + + @Bean + public ExpressionIdempotentKeyResolver expressionIdempotentKeyResolver() { + return new ExpressionIdempotentKeyResolver(); + } + +} diff --git a/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/annotation/Idempotent.java b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/annotation/Idempotent.java new file mode 100644 index 0000000..3040933 --- /dev/null +++ b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/annotation/Idempotent.java @@ -0,0 +1,46 @@ +package com.win.framework.idempotent.core.annotation; + +import com.win.framework.idempotent.core.keyresolver.impl.DefaultIdempotentKeyResolver; +import com.win.framework.idempotent.core.keyresolver.IdempotentKeyResolver; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.util.concurrent.TimeUnit; + +/** + * 幂等注解 + * + * @author 闻荫源码 + */ +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface Idempotent { + + /** + * 幂等的超时时间,默认为 1 秒 + * + * 注意,如果执行时间超过它,请求还是会进来 + */ + int timeout() default 1; + /** + * 时间单位,默认为 SECONDS 秒 + */ + TimeUnit timeUnit() default TimeUnit.SECONDS; + + /** + * 提示信息,正在执行中的提示 + */ + String message() default "重复请求,请稍后重试"; + + /** + * 使用的 Key 解析器 + */ + Class keyResolver() default DefaultIdempotentKeyResolver.class; + /** + * 使用的 Key 参数 + */ + String keyArg() default ""; + +} diff --git a/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/aop/IdempotentAspect.java b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/aop/IdempotentAspect.java new file mode 100644 index 0000000..c484213 --- /dev/null +++ b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/aop/IdempotentAspect.java @@ -0,0 +1,56 @@ +package com.win.framework.idempotent.core.aop; + +import com.win.framework.common.exception.ServiceException; +import com.win.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.win.framework.idempotent.core.annotation.Idempotent; +import com.win.framework.idempotent.core.keyresolver.IdempotentKeyResolver; +import com.win.framework.idempotent.core.redis.IdempotentRedisDAO; +import com.win.framework.common.util.collection.CollectionUtils; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.springframework.util.Assert; + +import java.util.List; +import java.util.Map; + +/** + * 拦截声明了 {@link Idempotent} 注解的方法,实现幂等操作 + * + * @author 闻荫源码 + */ +@Aspect +@Slf4j +public class IdempotentAspect { + + /** + * IdempotentKeyResolver 集合 + */ + private final Map, IdempotentKeyResolver> keyResolvers; + + private final IdempotentRedisDAO idempotentRedisDAO; + + public IdempotentAspect(List keyResolvers, IdempotentRedisDAO idempotentRedisDAO) { + this.keyResolvers = CollectionUtils.convertMap(keyResolvers, IdempotentKeyResolver::getClass); + this.idempotentRedisDAO = idempotentRedisDAO; + } + + @Before("@annotation(idempotent)") + public void beforePointCut(JoinPoint joinPoint, Idempotent idempotent) { + // 获得 IdempotentKeyResolver + IdempotentKeyResolver keyResolver = keyResolvers.get(idempotent.keyResolver()); + Assert.notNull(keyResolver, "找不到对应的 IdempotentKeyResolver"); + // 解析 Key + String key = keyResolver.resolver(joinPoint, idempotent); + + // 锁定 Key。 + boolean success = idempotentRedisDAO.setIfAbsent(key, idempotent.timeout(), idempotent.timeUnit()); + // 锁定失败,抛出异常 + if (!success) { + log.info("[beforePointCut][方法({}) 参数({}) 存在重复请求]", joinPoint.getSignature().toString(), joinPoint.getArgs()); + throw new ServiceException(GlobalErrorCodeConstants.REPEATED_REQUESTS.getCode(), idempotent.message()); + } + } + +} diff --git a/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/keyresolver/IdempotentKeyResolver.java b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/keyresolver/IdempotentKeyResolver.java new file mode 100644 index 0000000..5202aca --- /dev/null +++ b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/keyresolver/IdempotentKeyResolver.java @@ -0,0 +1,22 @@ +package com.win.framework.idempotent.core.keyresolver; + +import com.win.framework.idempotent.core.annotation.Idempotent; +import org.aspectj.lang.JoinPoint; + +/** + * 幂等 Key 解析器接口 + * + * @author 闻荫源码 + */ +public interface IdempotentKeyResolver { + + /** + * 解析一个 Key + * + * @param idempotent 幂等注解 + * @param joinPoint AOP 切面 + * @return Key + */ + String resolver(JoinPoint joinPoint, Idempotent idempotent); + +} diff --git a/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/keyresolver/impl/DefaultIdempotentKeyResolver.java b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/keyresolver/impl/DefaultIdempotentKeyResolver.java new file mode 100644 index 0000000..8a6087c --- /dev/null +++ b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/keyresolver/impl/DefaultIdempotentKeyResolver.java @@ -0,0 +1,25 @@ +package com.win.framework.idempotent.core.keyresolver.impl; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.SecureUtil; +import com.win.framework.idempotent.core.annotation.Idempotent; +import com.win.framework.idempotent.core.keyresolver.IdempotentKeyResolver; +import org.aspectj.lang.JoinPoint; + +/** + * 默认幂等 Key 解析器,使用方法名 + 方法参数,组装成一个 Key + * + * 为了避免 Key 过长,使用 MD5 进行“压缩” + * + * @author 闻荫源码 + */ +public class DefaultIdempotentKeyResolver implements IdempotentKeyResolver { + + @Override + public String resolver(JoinPoint joinPoint, Idempotent idempotent) { + String methodName = joinPoint.getSignature().toString(); + String argsStr = StrUtil.join(",", joinPoint.getArgs()); + return SecureUtil.md5(methodName + argsStr); + } + +} diff --git a/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/keyresolver/impl/ExpressionIdempotentKeyResolver.java b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/keyresolver/impl/ExpressionIdempotentKeyResolver.java new file mode 100644 index 0000000..79a854d --- /dev/null +++ b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/keyresolver/impl/ExpressionIdempotentKeyResolver.java @@ -0,0 +1,63 @@ +package com.win.framework.idempotent.core.keyresolver.impl; + +import cn.hutool.core.util.ArrayUtil; +import com.win.framework.idempotent.core.annotation.Idempotent; +import com.win.framework.idempotent.core.keyresolver.IdempotentKeyResolver; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.core.LocalVariableTableParameterNameDiscoverer; +import org.springframework.core.ParameterNameDiscoverer; +import org.springframework.expression.Expression; +import org.springframework.expression.ExpressionParser; +import org.springframework.expression.spel.standard.SpelExpressionParser; +import org.springframework.expression.spel.support.StandardEvaluationContext; + +import java.lang.reflect.Method; + +/** + * 基于 Spring EL 表达式, + * + * @author 闻荫源码 + */ +public class ExpressionIdempotentKeyResolver implements IdempotentKeyResolver { + + private final ParameterNameDiscoverer parameterNameDiscoverer = new LocalVariableTableParameterNameDiscoverer(); + private final ExpressionParser expressionParser = new SpelExpressionParser(); + + @Override + public String resolver(JoinPoint joinPoint, Idempotent idempotent) { + // 获得被拦截方法参数名列表 + Method method = getMethod(joinPoint); + Object[] args = joinPoint.getArgs(); + String[] parameterNames = this.parameterNameDiscoverer.getParameterNames(method); + // 准备 Spring EL 表达式解析的上下文 + StandardEvaluationContext evaluationContext = new StandardEvaluationContext(); + if (ArrayUtil.isNotEmpty(parameterNames)) { + for (int i = 0; i < parameterNames.length; i++) { + evaluationContext.setVariable(parameterNames[i], args[i]); + } + } + + // 解析参数 + Expression expression = expressionParser.parseExpression(idempotent.keyArg()); + return expression.getValue(evaluationContext, String.class); + } + + private static Method getMethod(JoinPoint point) { + // 处理,声明在类上的情况 + MethodSignature signature = (MethodSignature) point.getSignature(); + Method method = signature.getMethod(); + if (!method.getDeclaringClass().isInterface()) { + return method; + } + + // 处理,声明在接口上的情况 + try { + return point.getTarget().getClass().getDeclaredMethod( + point.getSignature().getName(), method.getParameterTypes()); + } catch (NoSuchMethodException e) { + throw new RuntimeException(e); + } + } + +} diff --git a/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/redis/IdempotentRedisDAO.java b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/redis/IdempotentRedisDAO.java new file mode 100644 index 0000000..e2ed12a --- /dev/null +++ b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/redis/IdempotentRedisDAO.java @@ -0,0 +1,36 @@ +package com.win.framework.idempotent.core.redis; + +import lombok.AllArgsConstructor; +import org.springframework.data.redis.core.StringRedisTemplate; + +import java.util.concurrent.TimeUnit; + +/** + * 幂等 Redis DAO + * + * @author 闻荫源码 + */ +@AllArgsConstructor +public class IdempotentRedisDAO { + + /** + * 幂等操作 + * + * KEY 格式:idempotent:%s // 参数为 uuid + * VALUE 格式:String + * 过期时间:不固定 + */ + private static final String IDEMPOTENT = "idempotent:%s"; + + private final StringRedisTemplate redisTemplate; + + public Boolean setIfAbsent(String key, long timeout, TimeUnit timeUnit) { + String redisKey = formatKey(key); + return redisTemplate.opsForValue().setIfAbsent(redisKey, "", timeout, timeUnit); + } + + private static String formatKey(String key) { + return String.format(IDEMPOTENT, key); + } + +} diff --git a/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/package-info.java b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/package-info.java new file mode 100644 index 0000000..7a0327a --- /dev/null +++ b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/package-info.java @@ -0,0 +1,12 @@ +/** + * 幂等组件,参考 https://github.com/it4alla/idempotent 项目实现 + * 实现原理是,相同参数的方法,一段时间内,有且仅能执行一次。通过这样的方式,保证幂等性。 + * + * 使用场景:例如说,用户快速的双击了某个按钮,前端没有禁用该按钮,导致发送了两次重复的请求。 + * + * 和 it4alla/idempotent 组件的差异点,主要体现在两点: + * 1. 我们去掉了 @Idempotent 注解的 delKey 属性。原因是,本质上 delKey 为 true 时,实现的是分布式锁的能力 + * 此时,我们偏向使用 Lock4j 组件。原则上,一个组件只提供一种单一的能力。 + * 2. 考虑到组件的通用性,我们并未像 it4alla/idempotent 组件一样使用 Redisson RMap 结构,而是直接使用 Redis 的 String 数据格式。 + */ +package com.win.framework.idempotent; diff --git a/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/lock4j/config/WinLock4jConfiguration.java b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/lock4j/config/WinLock4jConfiguration.java new file mode 100644 index 0000000..08184bf --- /dev/null +++ b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/lock4j/config/WinLock4jConfiguration.java @@ -0,0 +1,18 @@ +package com.win.framework.lock4j.config; + +import com.win.framework.lock4j.core.DefaultLockFailureStrategy; +import com.baomidou.lock.spring.boot.autoconfigure.LockAutoConfiguration; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.context.annotation.Bean; + +@AutoConfiguration(before = LockAutoConfiguration.class) +@ConditionalOnClass(name = "com.baomidou.lock.annotation.Lock4j") +public class WinLock4jConfiguration { + + @Bean + public DefaultLockFailureStrategy lockFailureStrategy() { + return new DefaultLockFailureStrategy(); + } + +} diff --git a/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/lock4j/core/DefaultLockFailureStrategy.java b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/lock4j/core/DefaultLockFailureStrategy.java new file mode 100644 index 0000000..4ac4020 --- /dev/null +++ b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/lock4j/core/DefaultLockFailureStrategy.java @@ -0,0 +1,21 @@ +package com.win.framework.lock4j.core; + +import com.win.framework.common.exception.ServiceException; +import com.win.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.baomidou.lock.LockFailureStrategy; +import lombok.extern.slf4j.Slf4j; + +import java.lang.reflect.Method; + +/** + * 自定义获取锁失败策略,抛出 {@link ServiceException} 异常 + */ +@Slf4j +public class DefaultLockFailureStrategy implements LockFailureStrategy { + + @Override + public void onLockFailure(String key, Method method, Object[] arguments) { + log.debug("[onLockFailure][线程:{} 获取锁失败,key:{} 获取失败:{} ]", Thread.currentThread().getName(), key, arguments); + throw new ServiceException(GlobalErrorCodeConstants.LOCKED); + } +} diff --git a/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/lock4j/core/Lock4jRedisKeyConstants.java b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/lock4j/core/Lock4jRedisKeyConstants.java new file mode 100644 index 0000000..4b7b4ee --- /dev/null +++ b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/lock4j/core/Lock4jRedisKeyConstants.java @@ -0,0 +1,19 @@ +package com.win.framework.lock4j.core; + +/** + * Lock4j Redis Key 枚举类 + * + * @author 闻荫源码 + */ +public interface Lock4jRedisKeyConstants { + + /** + * 分布式锁 + * + * KEY 格式:lock4j:%s // 参数来自 DefaultLockKeyBuilder 类 + * VALUE 数据格式:HASH // RLock.class:Redisson 的 Lock 锁,使用 Hash 数据结构 + * 过期时间:不固定 + */ + String LOCK4J = "lock4j:%s"; + +} diff --git a/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/lock4j/package-info.java b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/lock4j/package-info.java new file mode 100644 index 0000000..b76745e --- /dev/null +++ b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/lock4j/package-info.java @@ -0,0 +1,4 @@ +/** + * 分布式锁组件,使用 https://gitee.com/baomidou/lock4j 开源项目 + */ +package com.win.framework.lock4j; diff --git a/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/resilience4j/package-info.java b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/resilience4j/package-info.java new file mode 100644 index 0000000..c9f6f68 --- /dev/null +++ b/win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/resilience4j/package-info.java @@ -0,0 +1,9 @@ +/** + * 使用 Resilience4j 组件,实现服务保障,包括: + * 1. 熔断器 + * 2. 限流器 + * 3. 舱壁隔离 + * 4. 重试 + * 5. 限时器 + */ +package com.win.framework.resilience4j; diff --git a/win-framework/win-spring-boot-starter-protection/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/win-framework/win-spring-boot-starter-protection/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..44c82f2 --- /dev/null +++ b/win-framework/win-spring-boot-starter-protection/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1,2 @@ +com.win.framework.idempotent.config.WinIdempotentConfiguration +com.win.framework.lock4j.config.WinLock4jConfiguration \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-redis/pom.xml b/win-framework/win-spring-boot-starter-redis/pom.xml new file mode 100644 index 0000000..1c5e9f8 --- /dev/null +++ b/win-framework/win-spring-boot-starter-redis/pom.xml @@ -0,0 +1,41 @@ + + + + com.win + win-framework + ${revision} + + 4.0.0 + win-spring-boot-starter-redis + jar + + ${project.artifactId} + Redis 封装拓展 + https://github.com/YunaiV/ruoyi-vue-pro + + + + com.win + win-common + + + + + org.redisson + redisson-spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-cache + + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + + + + diff --git a/win-framework/win-spring-boot-starter-redis/src/main/java/com/win/framework/redis/config/WinCacheAutoConfiguration.java b/win-framework/win-spring-boot-starter-redis/src/main/java/com/win/framework/redis/config/WinCacheAutoConfiguration.java new file mode 100644 index 0000000..f5e8722 --- /dev/null +++ b/win-framework/win-spring-boot-starter-redis/src/main/java/com/win/framework/redis/config/WinCacheAutoConfiguration.java @@ -0,0 +1,76 @@ +package com.win.framework.redis.config; + +import cn.hutool.core.util.StrUtil; +import com.win.framework.redis.core.TimeoutRedisCacheManager; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.cache.CacheProperties; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Primary; +import org.springframework.data.redis.cache.BatchStrategies; +import org.springframework.data.redis.cache.RedisCacheConfiguration; +import org.springframework.data.redis.cache.RedisCacheManager; +import org.springframework.data.redis.cache.RedisCacheWriter; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.RedisSerializationContext; + +import java.util.Objects; + +import static com.win.framework.redis.config.WinRedisAutoConfiguration.buildRedisSerializer; + +/** + * Cache 配置类,基于 Redis 实现 + */ +@AutoConfiguration +@EnableConfigurationProperties({CacheProperties.class, WinCacheProperties.class}) +@EnableCaching +public class WinCacheAutoConfiguration { + + /** + * RedisCacheConfiguration Bean + *

+ * 参考 org.springframework.boot.autoconfigure.cache.RedisCacheConfiguration 的 createConfiguration 方法 + */ + @Bean + @Primary + public RedisCacheConfiguration redisCacheConfiguration(CacheProperties cacheProperties) { + RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig(); + // 设置使用 : 单冒号,而不是双 :: 冒号,避免 Redis Desktop Manager 多余空格 + // 详细可见 https://blog.csdn.net/chuixue24/article/details/103928965 博客 + config = config.computePrefixWith(cacheName -> cacheName + StrUtil.COLON); + // 设置使用 JSON 序列化方式 + config = config.serializeValuesWith( + RedisSerializationContext.SerializationPair.fromSerializer(buildRedisSerializer())); + + // 设置 CacheProperties.Redis 的属性 + CacheProperties.Redis redisProperties = cacheProperties.getRedis(); + if (redisProperties.getTimeToLive() != null) { + config = config.entryTtl(redisProperties.getTimeToLive()); + } + if (redisProperties.getKeyPrefix() != null) { + config = config.prefixCacheNameWith(redisProperties.getKeyPrefix()); + } + if (!redisProperties.isCacheNullValues()) { + config = config.disableCachingNullValues(); + } + if (!redisProperties.isUseKeyPrefix()) { + config = config.disableKeyPrefix(); + } + return config; + } + + @Bean + public RedisCacheManager redisCacheManager(RedisTemplate redisTemplate, + RedisCacheConfiguration redisCacheConfiguration, + WinCacheProperties winCacheProperties) { + // 创建 RedisCacheWriter 对象 + RedisConnectionFactory connectionFactory = Objects.requireNonNull(redisTemplate.getConnectionFactory()); + RedisCacheWriter cacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(connectionFactory, + BatchStrategies.scan(winCacheProperties.getRedisScanBatchSize())); + // 创建 TenantRedisCacheManager 对象 + return new TimeoutRedisCacheManager(cacheWriter, redisCacheConfiguration); + } + +} diff --git a/win-framework/win-spring-boot-starter-redis/src/main/java/com/win/framework/redis/config/WinCacheProperties.java b/win-framework/win-spring-boot-starter-redis/src/main/java/com/win/framework/redis/config/WinCacheProperties.java new file mode 100644 index 0000000..7c45681 --- /dev/null +++ b/win-framework/win-spring-boot-starter-redis/src/main/java/com/win/framework/redis/config/WinCacheProperties.java @@ -0,0 +1,27 @@ +package com.win.framework.redis.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.validation.annotation.Validated; + +/** + * Cache 配置项 + * + * @author Wanwan + */ +@ConfigurationProperties("win.cache") +@Data +@Validated +public class WinCacheProperties { + + /** + * {@link #redisScanBatchSize} 默认值 + */ + private static final Integer REDIS_SCAN_BATCH_SIZE_DEFAULT = 30; + + /** + * redis scan 一次返回数量 + */ + private Integer redisScanBatchSize = REDIS_SCAN_BATCH_SIZE_DEFAULT; + +} diff --git a/win-framework/win-spring-boot-starter-redis/src/main/java/com/win/framework/redis/config/WinRedisAutoConfiguration.java b/win-framework/win-spring-boot-starter-redis/src/main/java/com/win/framework/redis/config/WinRedisAutoConfiguration.java new file mode 100644 index 0000000..b1dc383 --- /dev/null +++ b/win-framework/win-spring-boot-starter-redis/src/main/java/com/win/framework/redis/config/WinRedisAutoConfiguration.java @@ -0,0 +1,44 @@ +package com.win.framework.redis.config; + +import cn.hutool.core.util.ReflectUtil; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.RedisSerializer; + +/** + * Redis 配置类 + */ +@AutoConfiguration +public class WinRedisAutoConfiguration { + + /** + * 创建 RedisTemplate Bean,使用 JSON 序列化方式 + */ + @Bean + public RedisTemplate redisTemplate(RedisConnectionFactory factory) { + // 创建 RedisTemplate 对象 + RedisTemplate template = new RedisTemplate<>(); + // 设置 RedisConnection 工厂。😈 它就是实现多种 Java Redis 客户端接入的秘密工厂。感兴趣的胖友,可以自己去撸下。 + template.setConnectionFactory(factory); + // 使用 String 序列化方式,序列化 KEY 。 + template.setKeySerializer(RedisSerializer.string()); + template.setHashKeySerializer(RedisSerializer.string()); + // 使用 JSON 序列化方式(库是 Jackson ),序列化 VALUE 。 + template.setValueSerializer(buildRedisSerializer()); + template.setHashValueSerializer(buildRedisSerializer()); + return template; + } + + public static RedisSerializer buildRedisSerializer() { + RedisSerializer json = RedisSerializer.json(); + // 解决 LocalDateTime 的序列化 + ObjectMapper objectMapper = (ObjectMapper) ReflectUtil.getFieldValue(json, "mapper"); + objectMapper.registerModules(new JavaTimeModule()); + return json; + } + +} diff --git a/win-framework/win-spring-boot-starter-redis/src/main/java/com/win/framework/redis/core/TimeoutRedisCacheManager.java b/win-framework/win-spring-boot-starter-redis/src/main/java/com/win/framework/redis/core/TimeoutRedisCacheManager.java new file mode 100644 index 0000000..2dd406e --- /dev/null +++ b/win-framework/win-spring-boot-starter-redis/src/main/java/com/win/framework/redis/core/TimeoutRedisCacheManager.java @@ -0,0 +1,83 @@ +package com.win.framework.redis.core; + +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.StrUtil; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.data.redis.cache.RedisCache; +import org.springframework.data.redis.cache.RedisCacheConfiguration; +import org.springframework.data.redis.cache.RedisCacheManager; +import org.springframework.data.redis.cache.RedisCacheWriter; + +import java.time.Duration; + +/** + * 支持自定义过期时间的 {@link RedisCacheManager} 实现类 + * + * 在 {@link Cacheable#cacheNames()} 格式为 "key#ttl" 时,# 后面的 ttl 为过期时间。 + * 单位为最后一个字母(支持的单位有:d 天,h 小时,m 分钟,s 秒),默认单位为 s 秒 + * + * @author 闻荫源码 + */ +public class TimeoutRedisCacheManager extends RedisCacheManager { + + private static final String SPLIT = "#"; + + public TimeoutRedisCacheManager(RedisCacheWriter cacheWriter, RedisCacheConfiguration defaultCacheConfiguration) { + super(cacheWriter, defaultCacheConfiguration); + } + + @Override + protected RedisCache createRedisCache(String name, RedisCacheConfiguration cacheConfig) { + if (StrUtil.isEmpty(name)) { + return super.createRedisCache(name, cacheConfig); + } + // 如果使用 # 分隔,大小不为 2,则说明不使用自定义过期时间 + String[] names = StrUtil.splitToArray(name, SPLIT); + if (names.length != 2) { + return super.createRedisCache(name, cacheConfig); + } + + // 核心:通过修改 cacheConfig 的过期时间,实现自定义过期时间 + if (cacheConfig != null) { + // 移除 # 后面的 : 以及后面的内容,避免影响解析 + names[1] = StrUtil.subBefore(names[1], StrUtil.COLON, false); + // 解析时间 + Duration duration = parseDuration(names[1]); + cacheConfig = cacheConfig.entryTtl(duration); + } + return super.createRedisCache(name, cacheConfig); + } + + /** + * 解析过期时间 Duration + * + * @param ttlStr 过期时间字符串 + * @return 过期时间 Duration + */ + private Duration parseDuration(String ttlStr) { + String timeUnit = StrUtil.subSuf(ttlStr, -1); + switch (timeUnit) { + case "d": + return Duration.ofDays(removeDurationSuffix(ttlStr)); + case "h": + return Duration.ofHours(removeDurationSuffix(ttlStr)); + case "m": + return Duration.ofMinutes(removeDurationSuffix(ttlStr)); + case "s": + return Duration.ofSeconds(removeDurationSuffix(ttlStr)); + default: + return Duration.ofSeconds(Long.parseLong(ttlStr)); + } + } + + /** + * 移除多余的后缀,返回具体的时间 + * + * @param ttlStr 过期时间字符串 + * @return 时间 + */ + private Long removeDurationSuffix(String ttlStr) { + return NumberUtil.parseLong(StrUtil.sub(ttlStr, 0, ttlStr.length() - 1)); + } + +} diff --git a/win-framework/win-spring-boot-starter-redis/src/main/java/com/win/framework/redis/util/RedisCache.java b/win-framework/win-spring-boot-starter-redis/src/main/java/com/win/framework/redis/util/RedisCache.java new file mode 100644 index 0000000..f0c5f1d --- /dev/null +++ b/win-framework/win-spring-boot-starter-redis/src/main/java/com/win/framework/redis/util/RedisCache.java @@ -0,0 +1,258 @@ +package com.win.framework.redis.util; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.BoundSetOperations; +import org.springframework.data.redis.core.HashOperations; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.ValueOperations; + +import java.util.*; +import java.util.concurrent.TimeUnit; + +/** + * spring redis 工具类 + * + * @author win + **/ +@SuppressWarnings(value = {"unchecked", "rawtypes"}) +public class RedisCache { + @Autowired + public RedisTemplate redisTemplate; + + /** + * 缓存基本的对象,Integer、String、实体类等 + * + * @param key 缓存的键值 + * @param value 缓存的值 + */ + public void setCacheObject(final String key, final T value) { + redisTemplate.opsForValue().set(key, value); + } + + /** + * 缓存基本的对象,Integer、String、实体类等 + * + * @param key 缓存的键值 + * @param value 缓存的值 + * @param timeout 时间 + * @param timeUnit 时间颗粒度 + */ + public void setCacheObject(final String key, final T value, final Integer timeout, final TimeUnit timeUnit) { + redisTemplate.opsForValue().set(key, value, timeout, timeUnit); + } + + /** + * 设置有效时间 + * + * @param key Redis键 + * @param timeout 超时时间 + * @return true=设置成功;false=设置失败 + */ + public boolean expire(final String key, final long timeout) { + return expire(key, timeout, TimeUnit.SECONDS); + } + + /** + * 设置有效时间 + * + * @param key Redis键 + * @param timeout 超时时间 + * @param unit 时间单位 + * @return true=设置成功;false=设置失败 + */ + public boolean expire(final String key, final long timeout, final TimeUnit unit) { + return redisTemplate.expire(key, timeout, unit); + } + + /** + * 获取有效时间 + * + * @param key Redis键 + * @return 有效时间 + */ + public long getExpire(final String key) { + return redisTemplate.getExpire(key); + } + + /** + * 判断 key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public Boolean hasKey(String key) { + return redisTemplate.hasKey(key); + } + + /** + * 获得缓存的基本对象。 + * + * @param key 缓存键值 + * @return 缓存键值对应的数据 + */ + public T getCacheObject(final String key) { + ValueOperations operation = redisTemplate.opsForValue(); + return operation.get(key); + } + + /** + * 删除单个对象 + * + * @param key + */ + public boolean deleteObject(final String key) { + return redisTemplate.delete(key); + } + + /** + * 删除集合对象 + * + * @param collection 多个对象 + * @return + */ + public boolean deleteObject(final Collection collection) { + return redisTemplate.delete(collection) > 0; + } + + /** + * 缓存List数据 + * + * @param key 缓存的键值 + * @param dataList 待缓存的List数据 + * @return 缓存的对象 + */ + public long setCacheList(final String key, final List dataList) { + Long count = redisTemplate.opsForList().rightPushAll(key, dataList); + return count == null ? 0 : count; + } + + /** + * 获得缓存的list对象 + * + * @param key 缓存的键值 + * @return 缓存键值对应的数据 + */ + public List getCacheList(final String key) { + return redisTemplate.opsForList().range(key, 0, -1); + } + + /** + * 缓存Set + * + * @param key 缓存键值 + * @param dataSet 缓存的数据 + * @return 缓存数据的对象 + */ + public BoundSetOperations setCacheSet(final String key, final Set dataSet) { + BoundSetOperations setOperation = redisTemplate.boundSetOps(key); + Iterator it = dataSet.iterator(); + while (it.hasNext()) { + setOperation.add(it.next()); + } + return setOperation; + } + + /** + * 获得缓存的set + * + * @param key + * @return + */ + public Set getCacheSet(final String key) { + return redisTemplate.opsForSet().members(key); + } + + /** + * 缓存Map + * + * @param key + * @param dataMap + */ + public void setCacheMap(final String key, final Map dataMap) { + if (dataMap != null) { + redisTemplate.opsForHash().putAll(key, dataMap); + } + } + + /** + * 获得缓存的Map + * + * @param key + * @return + */ + public Map getCacheMap(final String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * 往Hash中存入数据 + * + * @param key Redis键 + * @param hKey Hash键 + * @param value 值 + */ + public void setCacheMapValue(final String key, final String hKey, final T value) { + redisTemplate.opsForHash().put(key, hKey, value); + } + + /** + * 获取Hash中的数据 + * + * @param key Redis键 + * @param hKey Hash键 + * @return Hash中的对象 + */ + public T getCacheMapValue(final String key, final String hKey) { + HashOperations opsForHash = redisTemplate.opsForHash(); + return opsForHash.get(key, hKey); + } + + /** + * 获取多个Hash中的数据 + * + * @param key Redis键 + * @param hKeys Hash键集合 + * @return Hash对象集合 + */ + public List getMultiCacheMapValue(final String key, final Collection hKeys) { + return redisTemplate.opsForHash().multiGet(key, hKeys); + } + + /** + * 删除Hash中的某条数据 + * + * @param key Redis键 + * @param hKey Hash键 + * @return 是否成功 + */ + public boolean deleteCacheMapValue(final String key, final String hKey) { + return redisTemplate.opsForHash().delete(key, hKey) > 0; + } + + /** + * 获得缓存的基本对象列表 + * + * @param pattern 字符串前缀 + * @return 对象列表 + */ + public Collection keys(final String pattern) { + return redisTemplate.keys(pattern); + } + + /** + * 获取自增数 + * + * @param key + * @param liveTime 过期分钟 + * @return + */ + public Long incr(String key, long liveTime) { + ValueOperations ops = redisTemplate.opsForValue(); + Long increment = ops.increment(key, 1); + if (increment != null && increment != 0 && liveTime > 0) { + expire(key, liveTime); + } + return increment; + } + +} diff --git a/win-framework/win-spring-boot-starter-redis/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/win-framework/win-spring-boot-starter-redis/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..bdb84a6 --- /dev/null +++ b/win-framework/win-spring-boot-starter-redis/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1,3 @@ +com.win.framework.redis.config.WinRedisAutoConfiguration +com.win.framework.redis.config.WinCacheAutoConfiguration +com.win.framework.redis.util.RedisCache \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-security/pom.xml b/win-framework/win-spring-boot-starter-security/pom.xml new file mode 100644 index 0000000..47522fd --- /dev/null +++ b/win-framework/win-spring-boot-starter-security/pom.xml @@ -0,0 +1,61 @@ + + + + com.win + win-framework + ${revision} + + 4.0.0 + win-spring-boot-starter-security + jar + + ${project.artifactId} + 用户的认证、权限的校验 + https://github.com/YunaiV/ruoyi-vue-pro + + + + com.win + win-common + + + + + org.springframework.boot + spring-boot-starter-aop + + + + + com.win + win-spring-boot-starter-web + + + + org.springframework.boot + spring-boot-configuration-processor + true + + + + org.springframework.boot + spring-boot-starter-security + + + + + com.google.guava + guava + + + + + com.win + win-module-system-api + ${revision} + + + + diff --git a/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/config/AuthorizeRequestsCustomizer.java b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/config/AuthorizeRequestsCustomizer.java new file mode 100644 index 0000000..8949100 --- /dev/null +++ b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/config/AuthorizeRequestsCustomizer.java @@ -0,0 +1,32 @@ +package com.win.framework.security.config; + +import com.win.framework.web.config.WebProperties; +import org.springframework.core.Ordered; +import org.springframework.security.config.Customizer; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer; + +import javax.annotation.Resource; + +/** + * 自定义的 URL 的安全配置 + * 目的:每个 Maven Module 可以自定义规则! + * + * @author 闻荫源码 + */ +public abstract class AuthorizeRequestsCustomizer + implements Customizer.ExpressionInterceptUrlRegistry>, Ordered { + + @Resource + private WebProperties webProperties; + + protected String buildAdminApi(String url) { + return webProperties.getAdminApi().getPrefix() + url; + } + + @Override + public int getOrder() { + return 0; + } + +} diff --git a/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/config/SecurityProperties.java b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/config/SecurityProperties.java new file mode 100644 index 0000000..23a402f --- /dev/null +++ b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/config/SecurityProperties.java @@ -0,0 +1,44 @@ +package com.win.framework.security.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.validation.annotation.Validated; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.Collections; +import java.util.List; + +@ConfigurationProperties(prefix = "win.security") +@Validated +@Data +public class SecurityProperties { + + /** + * HTTP 请求时,访问令牌的请求 Header + */ + @NotEmpty(message = "Token Header 不能为空") + private String tokenHeader = "Authorization"; + + /** + * mock 模式的开关 + */ + @NotNull(message = "mock 模式的开关不能为空") + private Boolean mockEnable = false; + /** + * mock 模式的密钥 + * 一定要配置密钥,保证安全性 + */ + @NotEmpty(message = "mock 模式的密钥不能为空") // 这里设置了一个默认值,因为实际上只有 mockEnable 为 true 时才需要配置。 + private String mockSecret = "test"; + + /** + * 免登录的 URL 列表 + */ + private List permitAllUrls = Collections.emptyList(); + + /** + * PasswordEncoder 加密复杂度,越高开销越大 + */ + private Integer passwordEncoderLength = 4; +} diff --git a/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/config/WinSecurityAutoConfiguration.java b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/config/WinSecurityAutoConfiguration.java new file mode 100644 index 0000000..f1a8dd2 --- /dev/null +++ b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/config/WinSecurityAutoConfiguration.java @@ -0,0 +1,102 @@ +package com.win.framework.security.config; + +import com.win.framework.security.core.aop.PreAuthenticatedAspect; +import com.win.framework.security.core.context.TransmittableThreadLocalSecurityContextHolderStrategy; +import com.win.framework.security.core.filter.TokenAuthenticationFilter; +import com.win.framework.security.core.handler.AccessDeniedHandlerImpl; +import com.win.framework.security.core.handler.AuthenticationEntryPointImpl; +import com.win.framework.security.core.service.SecurityFrameworkService; +import com.win.framework.security.core.service.SecurityFrameworkServiceImpl; +import com.win.framework.web.core.handler.GlobalExceptionHandler; +import com.win.module.system.api.oauth2.OAuth2TokenApi; +import com.win.module.system.api.permission.PermissionApi; +import org.springframework.beans.factory.config.MethodInvokingFactoryBean; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.AuthenticationEntryPoint; +import org.springframework.security.web.access.AccessDeniedHandler; + +import javax.annotation.Resource; + +/** + * Spring Security 自动配置类,主要用于相关组件的配置 + * + * 注意,不能和 {@link WinWebSecurityConfigurerAdapter} 用一个,原因是会导致初始化报错。 + * 参见 https://stackoverflow.com/questions/53847050/spring-boot-delegatebuilder-cannot-be-null-on-autowiring-authenticationmanager 文档。 + * + * @author 闻荫源码 + */ +@AutoConfiguration +@EnableConfigurationProperties(SecurityProperties.class) +public class WinSecurityAutoConfiguration { + + @Resource + private SecurityProperties securityProperties; + + /** + * 处理用户未登录拦截的切面的 Bean + */ + @Bean + public PreAuthenticatedAspect preAuthenticatedAspect() { + return new PreAuthenticatedAspect(); + } + + /** + * 认证失败处理类 Bean + */ + @Bean + public AuthenticationEntryPoint authenticationEntryPoint() { + return new AuthenticationEntryPointImpl(); + } + + /** + * 权限不够处理器 Bean + */ + @Bean + public AccessDeniedHandler accessDeniedHandler() { + return new AccessDeniedHandlerImpl(); + } + + /** + * Spring Security 加密器 + * 考虑到安全性,这里采用 BCryptPasswordEncoder 加密器 + * + * @see Password Encoding with Spring Security + */ + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(securityProperties.getPasswordEncoderLength()); + } + + /** + * Token 认证过滤器 Bean + */ + @Bean + public TokenAuthenticationFilter authenticationTokenFilter(GlobalExceptionHandler globalExceptionHandler, + OAuth2TokenApi oauth2TokenApi) { + return new TokenAuthenticationFilter(securityProperties, globalExceptionHandler, oauth2TokenApi); + } + + @Bean("ss") // 使用 Spring Security 的缩写,方便使用 + public SecurityFrameworkService securityFrameworkService(PermissionApi permissionApi) { + return new SecurityFrameworkServiceImpl(permissionApi); + } + + /** + * 声明调用 {@link SecurityContextHolder#setStrategyName(String)} 方法, + * 设置使用 {@link TransmittableThreadLocalSecurityContextHolderStrategy} 作为 Security 的上下文策略 + */ + @Bean + public MethodInvokingFactoryBean securityContextHolderMethodInvokingFactoryBean() { + MethodInvokingFactoryBean methodInvokingFactoryBean = new MethodInvokingFactoryBean(); + methodInvokingFactoryBean.setTargetClass(SecurityContextHolder.class); + methodInvokingFactoryBean.setTargetMethod("setStrategyName"); + methodInvokingFactoryBean.setArguments(TransmittableThreadLocalSecurityContextHolderStrategy.class.getName()); + return methodInvokingFactoryBean; + } + +} diff --git a/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/config/WinWebSecurityConfigurerAdapter.java b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/config/WinWebSecurityConfigurerAdapter.java new file mode 100644 index 0000000..200e0c5 --- /dev/null +++ b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/config/WinWebSecurityConfigurerAdapter.java @@ -0,0 +1,184 @@ +package com.win.framework.security.config; + +import com.win.framework.security.core.filter.TokenAuthenticationFilter; +import com.win.framework.web.config.WebProperties; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.http.HttpMethod; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.web.AuthenticationEntryPoint; +import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.access.AccessDeniedHandler; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.mvc.method.RequestMappingInfo; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; + +import javax.annotation.Resource; +import javax.annotation.security.PermitAll; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * 自定义的 Spring Security 配置适配器实现 + * + * @author 闻荫源码 + */ +@AutoConfiguration +@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) +public class WinWebSecurityConfigurerAdapter { + + @Resource + private WebProperties webProperties; + @Resource + private SecurityProperties securityProperties; + + /** + * 认证失败处理类 Bean + */ + @Resource + private AuthenticationEntryPoint authenticationEntryPoint; + /** + * 权限不够处理器 Bean + */ + @Resource + private AccessDeniedHandler accessDeniedHandler; + /** + * Token 认证过滤器 Bean + */ + @Resource + private TokenAuthenticationFilter authenticationTokenFilter; + + /** + * 自定义的权限映射 Bean 们 + * + * @see #filterChain(HttpSecurity) + */ + @Resource + private List authorizeRequestsCustomizers; + + @Resource + private ApplicationContext applicationContext; + + /** + * 由于 Spring Security 创建 AuthenticationManager 对象时,没声明 @Bean 注解,导致无法被注入 + * 通过覆写父类的该方法,添加 @Bean 注解,解决该问题 + */ + @Bean + public AuthenticationManager authenticationManagerBean(AuthenticationConfiguration authenticationConfiguration) throws Exception { + return authenticationConfiguration.getAuthenticationManager(); + } + + /** + * 配置 URL 的安全配置 + * + * anyRequest | 匹配所有请求路径 + * access | SpringEl表达式结果为true时可以访问 + * anonymous | 匿名可以访问 + * denyAll | 用户不能访问 + * fullyAuthenticated | 用户完全认证可以访问(非remember-me下自动登录) + * hasAnyAuthority | 如果有参数,参数表示权限,则其中任何一个权限可以访问 + * hasAnyRole | 如果有参数,参数表示角色,则其中任何一个角色可以访问 + * hasAuthority | 如果有参数,参数表示权限,则其权限可以访问 + * hasIpAddress | 如果有参数,参数表示IP地址,如果用户IP和参数匹配,则可以访问 + * hasRole | 如果有参数,参数表示角色,则其角色可以访问 + * permitAll | 用户可以任意访问 + * rememberMe | 允许通过remember-me登录的用户访问 + * authenticated | 用户登录后可访问 + */ + @Bean + protected SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception { + // 登出 + httpSecurity + // 开启跨域 + .cors().and() + // CSRF 禁用,因为不使用 Session + .csrf().disable() + // 基于 token 机制,所以不需要 Session + .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and() + .headers().frameOptions().disable().and() + // 一堆自定义的 Spring Security 处理器 + .exceptionHandling().authenticationEntryPoint(authenticationEntryPoint) + .accessDeniedHandler(accessDeniedHandler); + // 登录、登录暂时不使用 Spring Security 的拓展点,主要考虑一方面拓展多用户、多种登录方式相对复杂,一方面用户的学习成本较高 + + // 获得 @PermitAll 带来的 URL 列表,免登录 + Multimap permitAllUrls = getPermitAllUrlsFromAnnotations(); + // 设置每个请求的权限 + httpSecurity + // ①:全局共享规则 + .authorizeRequests() + // 1.1 静态资源,可匿名访问 + .antMatchers(HttpMethod.GET, "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/favicon.ico").permitAll() + // 1.2 设置 @PermitAll 无需认证 + .antMatchers(HttpMethod.GET, permitAllUrls.get(HttpMethod.GET).toArray(new String[0])).permitAll() + .antMatchers(HttpMethod.POST, permitAllUrls.get(HttpMethod.POST).toArray(new String[0])).permitAll() + .antMatchers(HttpMethod.PUT, permitAllUrls.get(HttpMethod.PUT).toArray(new String[0])).permitAll() + .antMatchers(HttpMethod.DELETE, permitAllUrls.get(HttpMethod.DELETE).toArray(new String[0])).permitAll() + // 1.3 基于 win.security.permit-all-urls 无需认证 + .antMatchers(securityProperties.getPermitAllUrls().toArray(new String[0])).permitAll() + // 1.4 设置 App API 无需认证 + //.antMatchers(buildAppApi("/**")).permitAll() + // 1.5 验证码captcha 允许匿名访问 + //.antMatchers("/captcha/captchaImage").permitAll() + // 1.6 webSocket 允许匿名访问 + .antMatchers("/websocket/message").permitAll() + // ②:每个项目的自定义规则 + .and().authorizeRequests(registry -> // 下面,循环设置自定义规则 + authorizeRequestsCustomizers.forEach(customizer -> customizer.customize(registry))) + // ③:兜底规则,必须认证 + .authorizeRequests() + .anyRequest().authenticated() + ; + + // 添加 Token Filter + httpSecurity.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class); + return httpSecurity.build(); + } + + private Multimap getPermitAllUrlsFromAnnotations() { + Multimap result = HashMultimap.create(); + // 获得接口对应的 HandlerMethod 集合 + RequestMappingHandlerMapping requestMappingHandlerMapping = (RequestMappingHandlerMapping) + applicationContext.getBean("requestMappingHandlerMapping"); + Map handlerMethodMap = requestMappingHandlerMapping.getHandlerMethods(); + // 获得有 @PermitAll 注解的接口 + for (Map.Entry entry : handlerMethodMap.entrySet()) { + HandlerMethod handlerMethod = entry.getValue(); + if (!handlerMethod.hasMethodAnnotation(PermitAll.class)) { + continue; + } + if (entry.getKey().getPatternsCondition() == null) { + continue; + } + Set urls = entry.getKey().getPatternsCondition().getPatterns(); + // 根据请求方法,添加到 result 结果 + entry.getKey().getMethodsCondition().getMethods().forEach(requestMethod -> { + switch (requestMethod) { + case GET: + result.putAll(HttpMethod.GET, urls); + break; + case POST: + result.putAll(HttpMethod.POST, urls); + break; + case PUT: + result.putAll(HttpMethod.PUT, urls); + break; + case DELETE: + result.putAll(HttpMethod.DELETE, urls); + break; + } + }); + } + return result; + } + +} diff --git a/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/LoginUser.java b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/LoginUser.java new file mode 100644 index 0000000..db206a5 --- /dev/null +++ b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/LoginUser.java @@ -0,0 +1,52 @@ +package com.win.framework.security.core; + +import cn.hutool.core.map.MapUtil; +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 登录用户信息 + * + * @author 闻荫源码 + */ +@Data +public class LoginUser { + + /** + * 用户编号 + */ + private Long id; + /** + * 租户编号 + */ + private Long tenantId; + /** + * 授权范围 + */ + private List scopes; + + // ========== 上下文 ========== + /** + * 上下文字段,不进行持久化 + * + * 1. 用于基于 LoginUser 维度的临时缓存 + */ + @JsonIgnore + private Map context; + + public void setContext(String key, Object value) { + if (context == null) { + context = new HashMap<>(); + } + context.put(key, value); + } + + public T getContext(String key, Class type) { + return MapUtil.get(context, key, type); + } + +} diff --git a/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/annotations/PreAuthenticated.java b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/annotations/PreAuthenticated.java new file mode 100644 index 0000000..3c047bc --- /dev/null +++ b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/annotations/PreAuthenticated.java @@ -0,0 +1,17 @@ +package com.win.framework.security.core.annotations; + +import java.lang.annotation.*; + +/** + * 声明用户需要登录 + * + * 为什么不使用 {@link org.springframework.security.access.prepost.PreAuthorize} 注解,原因是不通过时,抛出的是认证不通过,而不是未登录 + * + * @author 闻荫源码 + */ +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Inherited +@Documented +public @interface PreAuthenticated { +} diff --git a/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/aop/PreAuthenticatedAspect.java b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/aop/PreAuthenticatedAspect.java new file mode 100644 index 0000000..47d01b9 --- /dev/null +++ b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/aop/PreAuthenticatedAspect.java @@ -0,0 +1,25 @@ +package com.win.framework.security.core.aop; + +import com.win.framework.security.core.annotations.PreAuthenticated; +import com.win.framework.security.core.util.SecurityFrameworkUtils; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; + +import static com.win.framework.common.exception.enums.GlobalErrorCodeConstants.UNAUTHORIZED; +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; + +@Aspect +@Slf4j +public class PreAuthenticatedAspect { + + @Around("@annotation(preAuthenticated)") + public Object around(ProceedingJoinPoint joinPoint, PreAuthenticated preAuthenticated) throws Throwable { + if (SecurityFrameworkUtils.getLoginUser() == null) { + throw exception(UNAUTHORIZED); + } + return joinPoint.proceed(); + } + +} diff --git a/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/context/TransmittableThreadLocalSecurityContextHolderStrategy.java b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/context/TransmittableThreadLocalSecurityContextHolderStrategy.java new file mode 100644 index 0000000..cf5556b --- /dev/null +++ b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/context/TransmittableThreadLocalSecurityContextHolderStrategy.java @@ -0,0 +1,48 @@ +package com.win.framework.security.core.context; + +import com.alibaba.ttl.TransmittableThreadLocal; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolderStrategy; +import org.springframework.security.core.context.SecurityContextImpl; +import org.springframework.util.Assert; + +/** + * 基于 TransmittableThreadLocal 实现的 Security Context 持有者策略 + * 目的是,避免 @Async 等异步执行时,原生 ThreadLocal 的丢失问题 + * + * @author 闻荫源码 + */ +public class TransmittableThreadLocalSecurityContextHolderStrategy implements SecurityContextHolderStrategy { + + /** + * 使用 TransmittableThreadLocal 作为上下文 + */ + private static final ThreadLocal CONTEXT_HOLDER = new TransmittableThreadLocal<>(); + + @Override + public void clearContext() { + CONTEXT_HOLDER.remove(); + } + + @Override + public SecurityContext getContext() { + SecurityContext ctx = CONTEXT_HOLDER.get(); + if (ctx == null) { + ctx = createEmptyContext(); + CONTEXT_HOLDER.set(ctx); + } + return ctx; + } + + @Override + public void setContext(SecurityContext context) { + Assert.notNull(context, "Only non-null SecurityContext instances are permitted"); + CONTEXT_HOLDER.set(context); + } + + @Override + public SecurityContext createEmptyContext() { + return new SecurityContextImpl(); + } + +} diff --git a/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/filter/TokenAuthenticationFilter.java b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/filter/TokenAuthenticationFilter.java new file mode 100644 index 0000000..1301b0f --- /dev/null +++ b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/filter/TokenAuthenticationFilter.java @@ -0,0 +1,104 @@ +package com.win.framework.security.core.filter; + +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.exception.ServiceException; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.util.servlet.ServletUtils; +import com.win.framework.security.config.SecurityProperties; +import com.win.framework.security.core.LoginUser; +import com.win.framework.security.core.util.SecurityFrameworkUtils; +import com.win.framework.web.core.handler.GlobalExceptionHandler; +import com.win.framework.web.core.util.WebFrameworkUtils; +import com.win.module.system.api.oauth2.OAuth2TokenApi; +import com.win.module.system.api.oauth2.dto.OAuth2AccessTokenCheckRespDTO; +import lombok.RequiredArgsConstructor; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * Token 过滤器,验证 token 的有效性 + * 验证通过后,获得 {@link LoginUser} 信息,并加入到 Spring Security 上下文 + * + * @author 闻荫源码 + */ +@RequiredArgsConstructor +public class TokenAuthenticationFilter extends OncePerRequestFilter { + + private final SecurityProperties securityProperties; + + private final GlobalExceptionHandler globalExceptionHandler; + + private final OAuth2TokenApi oauth2TokenApi; + + @Override + @SuppressWarnings("NullableProblems") + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) + throws ServletException, IOException { + String token = SecurityFrameworkUtils.obtainAuthorization(request, securityProperties.getTokenHeader()); + if (StrUtil.isNotEmpty(token)) { + try { + // 1.1 基于 token 构建登录用户 + LoginUser loginUser = buildLoginUserByToken(token); + // 1.2 模拟 Login 功能,方便日常开发调试 + if (loginUser == null) { + loginUser = mockLoginUser(request, token); + } + + // 2. 设置当前用户 + if (loginUser != null) { + SecurityFrameworkUtils.setLoginUser(loginUser, request); + } + } catch (Throwable ex) { + CommonResult result = globalExceptionHandler.allExceptionHandler(request, ex); + ServletUtils.writeJSON(response, result); + return; + } + } + + // 继续过滤链 + chain.doFilter(request, response); + } + + private LoginUser buildLoginUserByToken(String token) { + try { + OAuth2AccessTokenCheckRespDTO accessToken = oauth2TokenApi.checkAccessToken(token); + if (accessToken == null) { + return null; + } + // 构建登录用户 + return new LoginUser().setId(accessToken.getUserId()) + .setTenantId(accessToken.getTenantId()).setScopes(accessToken.getScopes()); + } catch (ServiceException serviceException) { + // 校验 Token 不通过时,考虑到一些接口是无需登录的,所以直接返回 null 即可 + return null; + } + } + + /** + * 模拟登录用户,方便日常开发调试 + * + * 注意,在线上环境下,一定要关闭该功能!!! + * + * @param request 请求 + * @param token 模拟的 token,格式为 {@link SecurityProperties#getMockSecret()} + 用户编号 + * @return 模拟的 LoginUser + */ + private LoginUser mockLoginUser(HttpServletRequest request, String token) { + if (!securityProperties.getMockEnable()) { + return null; + } + // 必须以 mockSecret 开头 + if (!token.startsWith(securityProperties.getMockSecret())) { + return null; + } + // 构建模拟用户 + Long userId = Long.valueOf(token.substring(securityProperties.getMockSecret().length())); + return new LoginUser().setId(userId).setTenantId(WebFrameworkUtils.getTenantId(request)); + } + +} diff --git a/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/handler/AccessDeniedHandlerImpl.java b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/handler/AccessDeniedHandlerImpl.java new file mode 100644 index 0000000..58822c5 --- /dev/null +++ b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/handler/AccessDeniedHandlerImpl.java @@ -0,0 +1,43 @@ +package com.win.framework.security.core.handler; + +import com.win.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.security.core.util.SecurityFrameworkUtils; +import com.win.framework.common.util.servlet.ServletUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.web.access.AccessDeniedHandler; +import org.springframework.security.web.access.ExceptionTranslationFilter; +import org.springframework.stereotype.Component; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +import static com.win.framework.common.exception.enums.GlobalErrorCodeConstants.FORBIDDEN; +import static com.win.framework.common.exception.enums.GlobalErrorCodeConstants.UNAUTHORIZED; + +/** + * 访问一个需要认证的 URL 资源,已经认证(登录)但是没有权限的情况下,返回 {@link GlobalErrorCodeConstants#FORBIDDEN} 错误码。 + * + * 补充:Spring Security 通过 {@link ExceptionTranslationFilter#handleAccessDeniedException(HttpServletRequest, HttpServletResponse, FilterChain, AccessDeniedException)} 方法,调用当前类 + * + * @author 闻荫源码 + */ +@Slf4j +@SuppressWarnings("JavadocReference") +public class AccessDeniedHandlerImpl implements AccessDeniedHandler { + + @Override + public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException e) + throws IOException, ServletException { + // 打印 warn 的原因是,不定期合并 warn,看看有没恶意破坏 + log.warn("[commence][访问 URL({}) 时,用户({}) 权限不够]", request.getRequestURI(), + SecurityFrameworkUtils.getLoginUserId(), e); + // 返回 403 + ServletUtils.writeJSON(response, CommonResult.error(FORBIDDEN)); + } + +} diff --git a/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/handler/AuthenticationEntryPointImpl.java b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/handler/AuthenticationEntryPointImpl.java new file mode 100644 index 0000000..4adda52 --- /dev/null +++ b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/handler/AuthenticationEntryPointImpl.java @@ -0,0 +1,35 @@ +package com.win.framework.security.core.handler; + +import com.win.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.util.servlet.ServletUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.AuthenticationEntryPoint; +import org.springframework.security.web.access.ExceptionTranslationFilter; + +import javax.servlet.FilterChain; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import static com.win.framework.common.exception.enums.GlobalErrorCodeConstants.UNAUTHORIZED; + +/** + * 访问一个需要认证的 URL 资源,但是此时自己尚未认证(登录)的情况下,返回 {@link GlobalErrorCodeConstants#UNAUTHORIZED} 错误码,从而使前端重定向到登录页 + * + * 补充:Spring Security 通过 {@link ExceptionTranslationFilter#sendStartAuthentication(HttpServletRequest, HttpServletResponse, FilterChain, AuthenticationException)} 方法,调用当前类 + * + * @author ruoyi + */ +@Slf4j +@SuppressWarnings("JavadocReference") // 忽略文档引用报错 +public class AuthenticationEntryPointImpl implements AuthenticationEntryPoint { + + @Override + public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException e) { + log.debug("[commence][访问 URL({}) 时,没有登录]", request.getRequestURI(), e); + // 返回 401 + ServletUtils.writeJSON(response, CommonResult.error(UNAUTHORIZED)); + } + +} diff --git a/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/service/SecurityFrameworkService.java b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/service/SecurityFrameworkService.java new file mode 100644 index 0000000..a036d6b --- /dev/null +++ b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/service/SecurityFrameworkService.java @@ -0,0 +1,59 @@ +package com.win.framework.security.core.service; + +/** + * Security 框架 Service 接口,定义权限相关的校验操作 + * + * @author 闻荫源码 + */ +public interface SecurityFrameworkService { + + /** + * 判断是否有权限 + * + * @param permission 权限 + * @return 是否 + */ + boolean hasPermission(String permission); + + /** + * 判断是否有权限,任一一个即可 + * + * @param permissions 权限 + * @return 是否 + */ + boolean hasAnyPermissions(String... permissions); + + /** + * 判断是否有角色 + * + * 注意,角色使用的是 SysRoleDO 的 code 标识 + * + * @param role 角色 + * @return 是否 + */ + boolean hasRole(String role); + + /** + * 判断是否有角色,任一一个即可 + * + * @param roles 角色数组 + * @return 是否 + */ + boolean hasAnyRoles(String... roles); + + /** + * 判断是否有授权 + * + * @param scope 授权 + * @return 是否 + */ + boolean hasScope(String scope); + + /** + * 判断是否有授权范围,任一一个即可 + * + * @param scope 授权范围数组 + * @return 是否 + */ + boolean hasAnyScopes(String... scope); +} diff --git a/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/service/SecurityFrameworkServiceImpl.java b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/service/SecurityFrameworkServiceImpl.java new file mode 100644 index 0000000..d098acd --- /dev/null +++ b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/service/SecurityFrameworkServiceImpl.java @@ -0,0 +1,57 @@ +package com.win.framework.security.core.service; + +import cn.hutool.core.collection.CollUtil; +import com.win.framework.security.core.LoginUser; +import com.win.framework.security.core.util.SecurityFrameworkUtils; +import com.win.module.system.api.permission.PermissionApi; +import lombok.AllArgsConstructor; + +import java.util.Arrays; + +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + +/** + * 默认的 {@link SecurityFrameworkService} 实现类 + * + * @author 闻荫源码 + */ +@AllArgsConstructor +public class SecurityFrameworkServiceImpl implements SecurityFrameworkService { + + private final PermissionApi permissionApi; + + @Override + public boolean hasPermission(String permission) { + return hasAnyPermissions(permission); + } + + @Override + public boolean hasAnyPermissions(String... permissions) { + return permissionApi.hasAnyPermissions(getLoginUserId(), permissions); + } + + @Override + public boolean hasRole(String role) { + return hasAnyRoles(role); + } + + @Override + public boolean hasAnyRoles(String... roles) { + return permissionApi.hasAnyRoles(getLoginUserId(), roles); + } + + @Override + public boolean hasScope(String scope) { + return hasAnyScopes(scope); + } + + @Override + public boolean hasAnyScopes(String... scope) { + LoginUser user = SecurityFrameworkUtils.getLoginUser(); + if (user == null) { + return false; + } + return CollUtil.containsAny(user.getScopes(), Arrays.asList(scope)); + } + +} diff --git a/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/util/SecurityFrameworkUtils.java b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/util/SecurityFrameworkUtils.java new file mode 100644 index 0000000..937396d --- /dev/null +++ b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/util/SecurityFrameworkUtils.java @@ -0,0 +1,108 @@ +package com.win.framework.security.core.util; + +import com.win.framework.security.core.LoginUser; +import com.win.framework.web.core.util.WebFrameworkUtils; +import org.springframework.lang.Nullable; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; +import org.springframework.util.StringUtils; + +import javax.servlet.http.HttpServletRequest; +import java.util.Collections; + +/** + * 安全服务工具类 + * + * @author 闻荫源码 + */ +public class SecurityFrameworkUtils { + + public static final String AUTHORIZATION_BEARER = "Bearer"; + + private SecurityFrameworkUtils() {} + + /** + * 从请求中,获得认证 Token + * + * @param request 请求 + * @param header 认证 Token 对应的 Header 名字 + * @return 认证 Token + */ + public static String obtainAuthorization(HttpServletRequest request, String header) { + String authorization = request.getHeader(header); + if (!StringUtils.hasText(authorization)) { + return null; + } + int index = authorization.indexOf(AUTHORIZATION_BEARER + " "); + if (index == -1) { // 未找到 + return null; + } + return authorization.substring(index + 7).trim(); + } + + /** + * 获得当前认证信息 + * + * @return 认证信息 + */ + public static Authentication getAuthentication() { + SecurityContext context = SecurityContextHolder.getContext(); + if (context == null) { + return null; + } + return context.getAuthentication(); + } + + /** + * 获取当前用户 + * + * @return 当前用户 + */ + @Nullable + public static LoginUser getLoginUser() { + Authentication authentication = getAuthentication(); + if (authentication == null) { + return null; + } + return authentication.getPrincipal() instanceof LoginUser ? (LoginUser) authentication.getPrincipal() : null; + } + + /** + * 获得当前用户的编号,从上下文中 + * + * @return 用户编号 + */ + @Nullable + public static Long getLoginUserId() { + LoginUser loginUser = getLoginUser(); + return loginUser != null ? loginUser.getId() : null; + } + + /** + * 设置当前用户 + * + * @param loginUser 登录用户 + * @param request 请求 + */ + public static void setLoginUser(LoginUser loginUser, HttpServletRequest request) { + // 创建 Authentication,并设置到上下文 + Authentication authentication = buildAuthentication(loginUser, request); + SecurityContextHolder.getContext().setAuthentication(authentication); + + // 额外设置到 request 中,用于 ApiAccessLogFilter 可以获取到用户编号; + // 原因是,Spring Security 的 Filter 在 ApiAccessLogFilter 后面,在它记录访问日志时,线上上下文已经没有用户编号等信息 + WebFrameworkUtils.setLoginUserId(request, loginUser.getId()); + } + + private static Authentication buildAuthentication(LoginUser loginUser, HttpServletRequest request) { + // 创建 UsernamePasswordAuthenticationToken 对象 + UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken( + loginUser, null, Collections.emptyList()); + authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); + return authenticationToken; + } + +} diff --git a/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/package-info.java b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/package-info.java new file mode 100644 index 0000000..ef8046d --- /dev/null +++ b/win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/package-info.java @@ -0,0 +1,7 @@ +/** + * 基于 Spring Security 框架 + * 实现安全认证功能 + * + * @author 闻荫源码 + */ +package com.win.framework.security; diff --git a/win-framework/win-spring-boot-starter-security/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/win-framework/win-spring-boot-starter-security/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..1484dac --- /dev/null +++ b/win-framework/win-spring-boot-starter-security/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1,2 @@ +com.win.framework.security.config.WinSecurityAutoConfiguration +com.win.framework.security.config.WinWebSecurityConfigurerAdapter \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-test/pom.xml b/win-framework/win-spring-boot-starter-test/pom.xml new file mode 100644 index 0000000..dc8dce2 --- /dev/null +++ b/win-framework/win-spring-boot-starter-test/pom.xml @@ -0,0 +1,60 @@ + + + + com.win + win-framework + ${revision} + + 4.0.0 + win-spring-boot-starter-test + jar + + ${project.artifactId} + 测试组件,用于单元测试、集成测试 + https://github.com/YunaiV/ruoyi-vue-pro + + + + com.win + win-common + + + + + com.win + win-spring-boot-starter-mybatis + + + + com.win + win-spring-boot-starter-redis + + + + + org.mockito + mockito-inline + + + org.springframework.boot + spring-boot-starter-test + + + + com.h2database + h2 + + + + com.github.fppt + jedis-mock + + + + uk.co.jemos.podam + podam + + + diff --git a/win-framework/win-spring-boot-starter-test/src/main/java/com/win/framework/test/config/RedisTestConfiguration.java b/win-framework/win-spring-boot-starter-test/src/main/java/com/win/framework/test/config/RedisTestConfiguration.java new file mode 100644 index 0000000..b9fe368 --- /dev/null +++ b/win-framework/win-spring-boot-starter-test/src/main/java/com/win/framework/test/config/RedisTestConfiguration.java @@ -0,0 +1,35 @@ +package com.win.framework.test.config; + +import com.github.fppt.jedismock.RedisServer; +import org.springframework.boot.autoconfigure.data.redis.RedisProperties; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Lazy; + +import java.io.IOException; + +/** + * Redis 测试 Configuration,主要实现内嵌 Redis 的启动 + * + * @author 闻荫源码 + */ +@Configuration(proxyBeanMethods = false) +@Lazy(false) // 禁止延迟加载 +@EnableConfigurationProperties(RedisProperties.class) +public class RedisTestConfiguration { + + /** + * 创建模拟的 Redis Server 服务器 + */ + @Bean + public RedisServer redisServer(RedisProperties properties) throws IOException { + RedisServer redisServer = new RedisServer(properties.getPort()); + // 一次执行多个单元测试时,貌似创建多个 spring 容器,导致不进行 stop。这样,就导致端口被占用,无法启动。。。 + try { + redisServer.start(); + } catch (Exception ignore) {} + return redisServer; + } + +} diff --git a/win-framework/win-spring-boot-starter-test/src/main/java/com/win/framework/test/config/SqlInitializationTestConfiguration.java b/win-framework/win-spring-boot-starter-test/src/main/java/com/win/framework/test/config/SqlInitializationTestConfiguration.java new file mode 100644 index 0000000..67918e6 --- /dev/null +++ b/win-framework/win-spring-boot-starter-test/src/main/java/com/win/framework/test/config/SqlInitializationTestConfiguration.java @@ -0,0 +1,52 @@ +package com.win.framework.test.config; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate; +import org.springframework.boot.autoconfigure.sql.init.SqlInitializationProperties; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.jdbc.init.DataSourceScriptDatabaseInitializer; +import org.springframework.boot.sql.init.AbstractScriptDatabaseInitializer; +import org.springframework.boot.sql.init.DatabaseInitializationSettings; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Lazy; + +import javax.sql.DataSource; + +/** + * SQL 初始化的测试 Configuration + * + * 为什么不使用 org.springframework.boot.autoconfigure.sql.init.DataSourceInitializationConfiguration 呢? + * 因为我们在单元测试会使用 spring.main.lazy-initialization 为 true,开启延迟加载。此时,会导致 DataSourceInitializationConfiguration 初始化 + * 不过呢,当前类的实现代码,基本是复制 DataSourceInitializationConfiguration 的哈! + * + * @author 闻荫源码 + */ +@Configuration(proxyBeanMethods = false) +@ConditionalOnMissingBean(AbstractScriptDatabaseInitializer.class) +@ConditionalOnSingleCandidate(DataSource.class) +@ConditionalOnClass(name = "org.springframework.jdbc.datasource.init.DatabasePopulator") +@Lazy(value = false) // 禁止延迟加载 +@EnableConfigurationProperties(SqlInitializationProperties.class) +public class SqlInitializationTestConfiguration { + + @Bean + public DataSourceScriptDatabaseInitializer dataSourceScriptDatabaseInitializer(DataSource dataSource, + SqlInitializationProperties initializationProperties) { + DatabaseInitializationSettings settings = createFrom(initializationProperties); + return new DataSourceScriptDatabaseInitializer(dataSource, settings); + } + + static DatabaseInitializationSettings createFrom(SqlInitializationProperties properties) { + DatabaseInitializationSettings settings = new DatabaseInitializationSettings(); + settings.setSchemaLocations(properties.getSchemaLocations()); + settings.setDataLocations(properties.getDataLocations()); + settings.setContinueOnError(properties.isContinueOnError()); + settings.setSeparator(properties.getSeparator()); + settings.setEncoding(properties.getEncoding()); + settings.setMode(properties.getMode()); + return settings; + } + +} diff --git a/win-framework/win-spring-boot-starter-test/src/main/java/com/win/framework/test/core/ut/BaseDbAndRedisUnitTest.java b/win-framework/win-spring-boot-starter-test/src/main/java/com/win/framework/test/core/ut/BaseDbAndRedisUnitTest.java new file mode 100644 index 0000000..5e60a9c --- /dev/null +++ b/win-framework/win-spring-boot-starter-test/src/main/java/com/win/framework/test/core/ut/BaseDbAndRedisUnitTest.java @@ -0,0 +1,50 @@ +package com.win.framework.test.core.ut; + +import com.win.framework.datasource.config.WinDataSourceAutoConfiguration; +import com.win.framework.mybatis.config.WinMybatisAutoConfiguration; +import com.win.framework.redis.config.WinRedisAutoConfiguration; +import com.win.framework.test.config.RedisTestConfiguration; +import com.win.framework.test.config.SqlInitializationTestConfiguration; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; +import org.redisson.spring.starter.RedissonAutoConfiguration; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.jdbc.Sql; + +/** + * 依赖内存 DB + Redis 的单元测试 + * + * 相比 {@link BaseDbUnitTest} 来说,额外增加了内存 Redis + * + * @author 闻荫源码 + */ +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseDbAndRedisUnitTest.Application.class) +@ActiveProfiles("unit-test") // 设置使用 application-unit-test 配置文件 +@Sql(scripts = "/sql/clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) // 每个单元测试结束后,清理 DB +public class BaseDbAndRedisUnitTest { + + @Import({ + // DB 配置类 + WinDataSourceAutoConfiguration.class, // 自己的 DB 配置类 + DataSourceAutoConfiguration.class, // Spring DB 自动配置类 + DataSourceTransactionManagerAutoConfiguration.class, // Spring 事务自动配置类 + DruidDataSourceAutoConfigure.class, // Druid 自动配置类 + SqlInitializationTestConfiguration.class, // SQL 初始化 + // MyBatis 配置类 + WinMybatisAutoConfiguration.class, // 自己的 MyBatis 配置类 + MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类 + + // Redis 配置类 + RedisTestConfiguration.class, // Redis 测试配置类,用于启动 RedisServer +// RedisAutoConfiguration.class, // Spring Redis 自动配置类 + WinRedisAutoConfiguration.class, // 自己的 Redis 配置类 + RedissonAutoConfiguration.class, // Redisson 自动高配置类 + }) + public static class Application { + } + +} diff --git a/win-framework/win-spring-boot-starter-test/src/main/java/com/win/framework/test/core/ut/BaseDbUnitTest.java b/win-framework/win-spring-boot-starter-test/src/main/java/com/win/framework/test/core/ut/BaseDbUnitTest.java new file mode 100644 index 0000000..119322f --- /dev/null +++ b/win-framework/win-spring-boot-starter-test/src/main/java/com/win/framework/test/core/ut/BaseDbUnitTest.java @@ -0,0 +1,43 @@ +package com.win.framework.test.core.ut; + +import com.win.framework.datasource.config.WinDataSourceAutoConfiguration; +import com.win.framework.mybatis.config.WinMybatisAutoConfiguration; +import com.win.framework.test.config.SqlInitializationTestConfiguration; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; +import com.github.yulichang.autoconfigure.MybatisPlusJoinAutoConfiguration; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.jdbc.Sql; + +/** + * 依赖内存 DB 的单元测试 + * + * 注意,Service 层同样适用。对于 Service 层的单元测试,我们针对自己模块的 Mapper 走的是 H2 内存数据库,针对别的模块的 Service 走的是 Mock 方法 + * + * @author 闻荫源码 + */ +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseDbUnitTest.Application.class) +@ActiveProfiles("unit-test") // 设置使用 application-unit-test 配置文件 +@Sql(scripts = "/sql/clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) // 每个单元测试结束后,清理 DB +public class BaseDbUnitTest { + + @Import({ + // DB 配置类 + WinDataSourceAutoConfiguration.class, // 自己的 DB 配置类 + DataSourceAutoConfiguration.class, // Spring DB 自动配置类 + DataSourceTransactionManagerAutoConfiguration.class, // Spring 事务自动配置类 + DruidDataSourceAutoConfigure.class, // Druid 自动配置类 + SqlInitializationTestConfiguration.class, // SQL 初始化 + // MyBatis 配置类 + WinMybatisAutoConfiguration.class, // 自己的 MyBatis 配置类 + MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类 + MybatisPlusJoinAutoConfiguration.class, // MyBatis 的Join配置类 + }) + public static class Application { + } + +} diff --git a/win-framework/win-spring-boot-starter-test/src/main/java/com/win/framework/test/core/ut/BaseMockitoUnitTest.java b/win-framework/win-spring-boot-starter-test/src/main/java/com/win/framework/test/core/ut/BaseMockitoUnitTest.java new file mode 100644 index 0000000..719dbf9 --- /dev/null +++ b/win-framework/win-spring-boot-starter-test/src/main/java/com/win/framework/test/core/ut/BaseMockitoUnitTest.java @@ -0,0 +1,13 @@ +package com.win.framework.test.core.ut; + +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; + +/** + * 纯 Mockito 的单元测试 + * + * @author 闻荫源码 + */ +@ExtendWith(MockitoExtension.class) +public class BaseMockitoUnitTest { +} diff --git a/win-framework/win-spring-boot-starter-test/src/main/java/com/win/framework/test/core/ut/BaseRedisUnitTest.java b/win-framework/win-spring-boot-starter-test/src/main/java/com/win/framework/test/core/ut/BaseRedisUnitTest.java new file mode 100644 index 0000000..b09f82e --- /dev/null +++ b/win-framework/win-spring-boot-starter-test/src/main/java/com/win/framework/test/core/ut/BaseRedisUnitTest.java @@ -0,0 +1,32 @@ +package com.win.framework.test.core.ut; + +import com.win.framework.redis.config.WinRedisAutoConfiguration; +import com.win.framework.test.config.RedisTestConfiguration; +import org.redisson.spring.starter.RedissonAutoConfiguration; +import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.ActiveProfiles; + +/** + * 依赖内存 Redis 的单元测试 + * + * 相比 {@link BaseDbUnitTest} 来说,从内存 DB 改成了内存 Redis + * + * @author 闻荫源码 + */ +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseRedisUnitTest.Application.class) +@ActiveProfiles("unit-test") // 设置使用 application-unit-test 配置文件 +public class BaseRedisUnitTest { + + @Import({ + // Redis 配置类 + RedisTestConfiguration.class, // Redis 测试配置类,用于启动 RedisServer + RedisAutoConfiguration.class, // Spring Redis 自动配置类 + WinRedisAutoConfiguration.class, // 自己的 Redis 配置类 + RedissonAutoConfiguration.class, // Redisson 自动高配置类 + }) + public static class Application { + } + +} diff --git a/win-framework/win-spring-boot-starter-test/src/main/java/com/win/framework/test/core/ut/package-info.java b/win-framework/win-spring-boot-starter-test/src/main/java/com/win/framework/test/core/ut/package-info.java new file mode 100644 index 0000000..23c159e --- /dev/null +++ b/win-framework/win-spring-boot-starter-test/src/main/java/com/win/framework/test/core/ut/package-info.java @@ -0,0 +1,4 @@ +/** + * 提供单元测试 Unit Test 的基类 + */ +package com.win.framework.test.core.ut; diff --git a/win-framework/win-spring-boot-starter-test/src/main/java/com/win/framework/test/core/util/AssertUtils.java b/win-framework/win-spring-boot-starter-test/src/main/java/com/win/framework/test/core/util/AssertUtils.java new file mode 100644 index 0000000..224db43 --- /dev/null +++ b/win-framework/win-spring-boot-starter-test/src/main/java/com/win/framework/test/core/util/AssertUtils.java @@ -0,0 +1,101 @@ +package com.win.framework.test.core.util; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ReflectUtil; +import com.win.framework.common.exception.ErrorCode; +import com.win.framework.common.exception.ServiceException; +import com.win.framework.common.exception.util.ServiceExceptionUtil; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.function.Executable; + +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.Objects; + +import static org.junit.jupiter.api.Assertions.assertThrows; + +/** + * 单元测试,assert 断言工具类 + * + * @author 闻荫源码 + */ +public class AssertUtils { + + /** + * 比对两个对象的属性是否一致 + * + * 注意,如果 expected 存在的属性,actual 不存在的时候,会进行忽略 + * + * @param expected 期望对象 + * @param actual 实际对象 + * @param ignoreFields 忽略的属性数组 + */ + public static void assertPojoEquals(Object expected, Object actual, String... ignoreFields) { + Field[] expectedFields = ReflectUtil.getFields(expected.getClass()); + Arrays.stream(expectedFields).forEach(expectedField -> { + // 忽略 jacoco 自动生成的 $jacocoData 属性的情况 + if (expectedField.isSynthetic()) { + return; + } + // 如果是忽略的属性,则不进行比对 + if (ArrayUtil.contains(ignoreFields, expectedField.getName())) { + return; + } + // 忽略不存在的属性 + Field actualField = ReflectUtil.getField(actual.getClass(), expectedField.getName()); + if (actualField == null) { + return; + } + // 比对 + Assertions.assertEquals( + ReflectUtil.getFieldValue(expected, expectedField), + ReflectUtil.getFieldValue(actual, actualField), + String.format("Field(%s) 不匹配", expectedField.getName()) + ); + }); + } + + /** + * 比对两个对象的属性是否一致 + * + * 注意,如果 expected 存在的属性,actual 不存在的时候,会进行忽略 + * + * @param expected 期望对象 + * @param actual 实际对象 + * @param ignoreFields 忽略的属性数组 + * @return 是否一致 + */ + public static boolean isPojoEquals(Object expected, Object actual, String... ignoreFields) { + Field[] expectedFields = ReflectUtil.getFields(expected.getClass()); + return Arrays.stream(expectedFields).allMatch(expectedField -> { + // 如果是忽略的属性,则不进行比对 + if (ArrayUtil.contains(ignoreFields, expectedField.getName())) { + return true; + } + // 忽略不存在的属性 + Field actualField = ReflectUtil.getField(actual.getClass(), expectedField.getName()); + if (actualField == null) { + return true; + } + return Objects.equals(ReflectUtil.getFieldValue(expected, expectedField), + ReflectUtil.getFieldValue(actual, actualField)); + }); + } + + /** + * 执行方法,校验抛出的 Service 是否符合条件 + * + * @param executable 业务异常 + * @param errorCode 错误码对象 + * @param messageParams 消息参数 + */ + public static void assertServiceException(Executable executable, ErrorCode errorCode, Object... messageParams) { + // 调用方法 + ServiceException serviceException = assertThrows(ServiceException.class, executable); + // 校验错误码 + Assertions.assertEquals(errorCode.getCode(), serviceException.getCode(), "错误码不匹配"); + String message = ServiceExceptionUtil.doFormat(errorCode.getCode(), errorCode.getMsg(), messageParams); + Assertions.assertEquals(message, serviceException.getMessage(), "错误提示不匹配"); + } + +} diff --git a/win-framework/win-spring-boot-starter-test/src/main/java/com/win/framework/test/core/util/RandomUtils.java b/win-framework/win-spring-boot-starter-test/src/main/java/com/win/framework/test/core/util/RandomUtils.java new file mode 100644 index 0000000..9c0e1ff --- /dev/null +++ b/win-framework/win-spring-boot-starter-test/src/main/java/com/win/framework/test/core/util/RandomUtils.java @@ -0,0 +1,140 @@ +package com.win.framework.test.core.util; + +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.enums.CommonStatusEnum; +import uk.co.jemos.podam.api.PodamFactory; +import uk.co.jemos.podam.api.PodamFactoryImpl; +import uk.co.jemos.podam.common.AttributeStrategy; + +import javax.validation.constraints.Email; +import java.lang.annotation.Annotation; +import java.lang.reflect.Type; +import java.time.LocalDateTime; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.Set; +import java.util.function.Consumer; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * 随机工具类 + * + * @author 闻荫源码 + */ +public class RandomUtils { + + private static final int RANDOM_STRING_LENGTH = 10; + + private static final int TINYINT_MAX = 127; + + private static final int RANDOM_DATE_MAX = 30; + + private static final int RANDOM_COLLECTION_LENGTH = 5; + + private static final PodamFactory PODAM_FACTORY = new PodamFactoryImpl(); + + static { + // 字符串 + PODAM_FACTORY.getStrategy().addOrReplaceTypeManufacturer(String.class, + (dataProviderStrategy, attributeMetadata, map) -> randomString()); + // Integer + PODAM_FACTORY.getStrategy().addOrReplaceTypeManufacturer(Integer.class, (dataProviderStrategy, attributeMetadata, map) -> { + // 如果是 status 的字段,返回 0 或 1 + if ("status".equals(attributeMetadata.getAttributeName())) { + return RandomUtil.randomEle(CommonStatusEnum.values()).getStatus(); + } + // 如果是 type、status 结尾的字段,返回 tinyint 范围 + if (StrUtil.endWithAnyIgnoreCase(attributeMetadata.getAttributeName(), + "type", "status", "category", "scope", "result")) { + return RandomUtil.randomInt(0, TINYINT_MAX + 1); + } + return RandomUtil.randomInt(); + }); + // LocalDateTime + PODAM_FACTORY.getStrategy().addOrReplaceTypeManufacturer(LocalDateTime.class, + (dataProviderStrategy, attributeMetadata, map) -> randomLocalDateTime()); + // Boolean + PODAM_FACTORY.getStrategy().addOrReplaceTypeManufacturer(Boolean.class, (dataProviderStrategy, attributeMetadata, map) -> { + // 如果是 deleted 的字段,返回非删除 + if ("deleted".equals(attributeMetadata.getAttributeName())) { + return false; + } + return RandomUtil.randomBoolean(); + }); + } + + public static String randomString() { + return RandomUtil.randomString(RANDOM_STRING_LENGTH); + } + + public static Long randomLongId() { + return RandomUtil.randomLong(0, Long.MAX_VALUE); + } + + public static Integer randomInteger() { + return RandomUtil.randomInt(0, Integer.MAX_VALUE); + } + + public static Date randomDate() { + return RandomUtil.randomDay(0, RANDOM_DATE_MAX); + } + + public static LocalDateTime randomLocalDateTime() { + // 设置 Nano 为零的原因,避免 MySQL、H2 存储不到时间戳 + return LocalDateTimeUtil.of(randomDate()).withNano(0); + } + + public static Short randomShort() { + return (short) RandomUtil.randomInt(0, Short.MAX_VALUE); + } + + public static Set randomSet(Class clazz) { + return Stream.iterate(0, i -> i).limit(RandomUtil.randomInt(1, RANDOM_COLLECTION_LENGTH)) + .map(i -> randomPojo(clazz)).collect(Collectors.toSet()); + } + + public static Integer randomCommonStatus() { + return RandomUtil.randomEle(CommonStatusEnum.values()).getStatus(); + } + + public static String randomEmail() { + return randomString() + "@qq.com"; + } + + public static String randomURL() { + return "https://www.iocoder.cn/" + randomString(); + } + + @SafeVarargs + public static T randomPojo(Class clazz, Consumer... consumers) { + T pojo = PODAM_FACTORY.manufacturePojo(clazz); + // 非空时,回调逻辑。通过它,可以实现 Pojo 的进一步处理 + if (ArrayUtil.isNotEmpty(consumers)) { + Arrays.stream(consumers).forEach(consumer -> consumer.accept(pojo)); + } + return pojo; + } + + @SafeVarargs + public static T randomPojo(Class clazz, Type type, Consumer... consumers) { + T pojo = PODAM_FACTORY.manufacturePojo(clazz, type); + // 非空时,回调逻辑。通过它,可以实现 Pojo 的进一步处理 + if (ArrayUtil.isNotEmpty(consumers)) { + Arrays.stream(consumers).forEach(consumer -> consumer.accept(pojo)); + } + return pojo; + } + + @SafeVarargs + public static List randomPojoList(Class clazz, Consumer... consumers) { + int size = RandomUtil.randomInt(1, RANDOM_COLLECTION_LENGTH); + return Stream.iterate(0, i -> i).limit(size).map(o -> randomPojo(clazz, consumers)) + .collect(Collectors.toList()); + } + +} diff --git a/win-framework/win-spring-boot-starter-test/src/main/java/com/win/framework/test/package-info.java b/win-framework/win-spring-boot-starter-test/src/main/java/com/win/framework/test/package-info.java new file mode 100644 index 0000000..a8054cc --- /dev/null +++ b/win-framework/win-spring-boot-starter-test/src/main/java/com/win/framework/test/package-info.java @@ -0,0 +1,4 @@ +/** + * 测试组件,用于单元测试、集成测试等等 + */ +package com.win.framework.test; diff --git a/win-framework/win-spring-boot-starter-web/pom.xml b/win-framework/win-spring-boot-starter-web/pom.xml new file mode 100644 index 0000000..29d5404 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/pom.xml @@ -0,0 +1,66 @@ + + + + com.win + win-framework + ${revision} + + 4.0.0 + win-spring-boot-starter-web + jar + + ${project.artifactId} + Web 框架,全局异常、API 日志等 + https://github.com/YunaiV/ruoyi-vue-pro + + + + com.win + win-common + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-configuration-processor + true + + + + com.github.xiaoymin + knife4j-openapi3-spring-boot-starter + + + org.springdoc + springdoc-openapi-ui + + + + org.springframework.security + spring-security-core + provided + + + + + com.win + win-module-infra-api + ${revision} + + + + + org.jsoup + jsoup + + + + + diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/config/WinApiLogAutoConfiguration.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/config/WinApiLogAutoConfiguration.java new file mode 100644 index 0000000..b4fca69 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/config/WinApiLogAutoConfiguration.java @@ -0,0 +1,52 @@ +package com.win.framework.apilog.config; + +import com.win.framework.apilog.core.filter.ApiAccessLogFilter; +import com.win.framework.apilog.core.service.ApiAccessLogFrameworkService; +import com.win.framework.apilog.core.service.ApiAccessLogFrameworkServiceImpl; +import com.win.framework.apilog.core.service.ApiErrorLogFrameworkService; +import com.win.framework.apilog.core.service.ApiErrorLogFrameworkServiceImpl; +import com.win.framework.common.enums.WebFilterOrderEnum; +import com.win.framework.web.config.WebProperties; +import com.win.framework.web.config.WinWebAutoConfiguration; +import com.win.module.infra.api.logger.ApiAccessLogApi; +import com.win.module.infra.api.logger.ApiErrorLogApi; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; + +import javax.servlet.Filter; + +@AutoConfiguration(after = WinWebAutoConfiguration.class) +public class WinApiLogAutoConfiguration { + + @Bean + public ApiAccessLogFrameworkService apiAccessLogFrameworkService(ApiAccessLogApi apiAccessLogApi) { + return new ApiAccessLogFrameworkServiceImpl(apiAccessLogApi); + } + + @Bean + public ApiErrorLogFrameworkService apiErrorLogFrameworkService(ApiErrorLogApi apiErrorLogApi) { + return new ApiErrorLogFrameworkServiceImpl(apiErrorLogApi); + } + + /** + * 创建 ApiAccessLogFilter Bean,记录 API 请求日志 + */ + @Bean + @ConditionalOnProperty(prefix = "win.access-log", value = "enable", matchIfMissing = true) // 允许使用 win.access-log.enable=false 禁用访问日志 + public FilterRegistrationBean apiAccessLogFilter(WebProperties webProperties, + @Value("${spring.application.name}") String applicationName, + ApiAccessLogFrameworkService apiAccessLogFrameworkService) { + ApiAccessLogFilter filter = new ApiAccessLogFilter(webProperties, applicationName, apiAccessLogFrameworkService); + return createFilterBean(filter, WebFilterOrderEnum.API_ACCESS_LOG_FILTER); + } + + private static FilterRegistrationBean createFilterBean(T filter, Integer order) { + FilterRegistrationBean bean = new FilterRegistrationBean<>(filter); + bean.setOrder(order); + return bean; + } + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/core/filter/ApiAccessLogFilter.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/core/filter/ApiAccessLogFilter.java new file mode 100644 index 0000000..d1eee46 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/core/filter/ApiAccessLogFilter.java @@ -0,0 +1,109 @@ +package com.win.framework.apilog.core.filter; + +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.core.exceptions.ExceptionUtil; +import cn.hutool.core.map.MapUtil; +import com.win.framework.apilog.core.service.ApiAccessLog; +import com.win.framework.apilog.core.service.ApiAccessLogFrameworkService; +import com.win.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.util.monitor.TracerUtils; +import com.win.framework.common.util.servlet.ServletUtils; +import com.win.framework.web.config.WebProperties; +import com.win.framework.web.core.filter.ApiRequestFilter; +import com.win.framework.web.core.util.WebFrameworkUtils; +import lombok.extern.slf4j.Slf4j; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; +import java.util.Map; + +import static com.win.framework.common.util.json.JsonUtils.toJsonString; + +/** + * API 访问日志 Filter + * + * @author 闻荫源码 + */ +@Slf4j +public class ApiAccessLogFilter extends ApiRequestFilter { + + private final String applicationName; + + private final ApiAccessLogFrameworkService apiAccessLogFrameworkService; + + public ApiAccessLogFilter(WebProperties webProperties, String applicationName, ApiAccessLogFrameworkService apiAccessLogFrameworkService) { + super(webProperties); + this.applicationName = applicationName; + this.apiAccessLogFrameworkService = apiAccessLogFrameworkService; + } + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) + throws ServletException, IOException { + // 获得开始时间 + LocalDateTime beginTime = LocalDateTime.now(); + // 提前获得参数,避免 XssFilter 过滤处理 + Map queryString = ServletUtils.getParamMap(request); + String requestBody = ServletUtils.isJsonRequest(request) ? ServletUtils.getBody(request) : null; + + try { + // 继续过滤器 + filterChain.doFilter(request, response); + // 正常执行,记录日志 + createApiAccessLog(request, beginTime, queryString, requestBody, null); + } catch (Exception ex) { + // 异常执行,记录日志 + createApiAccessLog(request, beginTime, queryString, requestBody, ex); + throw ex; + } + } + + private void createApiAccessLog(HttpServletRequest request, LocalDateTime beginTime, + Map queryString, String requestBody, Exception ex) { + ApiAccessLog accessLog = new ApiAccessLog(); + try { + this.buildApiAccessLogDTO(accessLog, request, beginTime, queryString, requestBody, ex); + apiAccessLogFrameworkService.createApiAccessLog(accessLog); + } catch (Throwable th) { + log.error("[createApiAccessLog][url({}) log({}) 发生异常]", request.getRequestURI(), toJsonString(accessLog), th); + } + } + + private void buildApiAccessLogDTO(ApiAccessLog accessLog, HttpServletRequest request, LocalDateTime beginTime, + Map queryString, String requestBody, Exception ex) { + // 处理用户信息 + accessLog.setUserId(WebFrameworkUtils.getLoginUserId(request)); + // 设置访问结果 + CommonResult result = WebFrameworkUtils.getCommonResult(request); + if (result != null) { + accessLog.setResultCode(result.getCode()); + accessLog.setResultMsg(result.getMsg()); + } else if (ex != null) { + accessLog.setResultCode(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR.getCode()); + accessLog.setResultMsg(ExceptionUtil.getRootCauseMessage(ex)); + } else { + accessLog.setResultCode(0); + accessLog.setResultMsg(""); + } + // 设置其它字段 + accessLog.setTraceId(TracerUtils.getTraceId()); + accessLog.setApplicationName(applicationName); + accessLog.setRequestUrl(request.getRequestURI()); + Map requestParams = MapUtil.builder().put("query", queryString).put("body", requestBody).build(); + accessLog.setRequestParams(toJsonString(requestParams)); + accessLog.setRequestMethod(request.getMethod()); + accessLog.setUserAgent(ServletUtils.getUserAgent(request)); + accessLog.setUserIp(ServletUtils.getClientIP(request)); + // 持续时间 + accessLog.setBeginTime(beginTime); + accessLog.setEndTime(LocalDateTime.now()); + accessLog.setDuration((int) LocalDateTimeUtil.between(accessLog.getBeginTime(), accessLog.getEndTime(), ChronoUnit.MILLIS)); + } + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/core/service/ApiAccessLog.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/core/service/ApiAccessLog.java new file mode 100644 index 0000000..60ac139 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/core/service/ApiAccessLog.java @@ -0,0 +1,81 @@ +package com.win.framework.apilog.core.service; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +/** + * API 访问日志 + * + * @author 闻荫源码 + */ +@Data +public class ApiAccessLog { + + /** + * 链路追踪编号 + */ + private String traceId; + /** + * 用户编号 + */ + private Long userId; + /** + * 应用名 + */ + @NotNull(message = "应用名不能为空") + private String applicationName; + + /** + * 请求方法名 + */ + @NotNull(message = "http 请求方法不能为空") + private String requestMethod; + /** + * 访问地址 + */ + @NotNull(message = "访问地址不能为空") + private String requestUrl; + /** + * 请求参数 + */ + @NotNull(message = "请求参数不能为空") + private String requestParams; + /** + * 用户 IP + */ + @NotNull(message = "ip 不能为空") + private String userIp; + /** + * 浏览器 UA + */ + @NotNull(message = "User-Agent 不能为空") + private String userAgent; + + /** + * 开始请求时间 + */ + @NotNull(message = "开始请求时间不能为空") + private LocalDateTime beginTime; + /** + * 结束请求时间 + */ + @NotNull(message = "结束请求时间不能为空") + private LocalDateTime endTime; + /** + * 执行时长,单位:毫秒 + */ + @NotNull(message = "执行时长不能为空") + private Integer duration; + /** + * 结果码 + */ + @NotNull(message = "错误码不能为空") + private Integer resultCode; + /** + * 结果提示 + */ + private String resultMsg; + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/core/service/ApiAccessLogFrameworkService.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/core/service/ApiAccessLogFrameworkService.java new file mode 100644 index 0000000..29418f9 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/core/service/ApiAccessLogFrameworkService.java @@ -0,0 +1,17 @@ +package com.win.framework.apilog.core.service; + +/** + * API 访问日志 Framework Service 接口 + * + * @author 闻荫源码 + */ +public interface ApiAccessLogFrameworkService { + + /** + * 创建 API 访问日志 + * + * @param apiAccessLog API 访问日志 + */ + void createApiAccessLog(ApiAccessLog apiAccessLog); + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/core/service/ApiAccessLogFrameworkServiceImpl.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/core/service/ApiAccessLogFrameworkServiceImpl.java new file mode 100644 index 0000000..61252de --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/core/service/ApiAccessLogFrameworkServiceImpl.java @@ -0,0 +1,28 @@ +package com.win.framework.apilog.core.service; + +import cn.hutool.core.bean.BeanUtil; +import com.win.module.infra.api.logger.ApiAccessLogApi; +import com.win.module.infra.api.logger.dto.ApiAccessLogCreateReqDTO; +import lombok.RequiredArgsConstructor; +import org.springframework.scheduling.annotation.Async; + +/** + * API 访问日志 Framework Service 实现类 + * + * 基于 {@link ApiAccessLogApi} 服务,记录访问日志 + * + * @author 闻荫源码 + */ +@RequiredArgsConstructor +public class ApiAccessLogFrameworkServiceImpl implements ApiAccessLogFrameworkService { + + private final ApiAccessLogApi apiAccessLogApi; + + @Override + @Async + public void createApiAccessLog(ApiAccessLog apiAccessLog) { + ApiAccessLogCreateReqDTO reqDTO = BeanUtil.copyProperties(apiAccessLog, ApiAccessLogCreateReqDTO.class); + apiAccessLogApi.createApiAccessLog(reqDTO); + } + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/core/service/ApiErrorLog.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/core/service/ApiErrorLog.java new file mode 100644 index 0000000..7f9cbb0 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/core/service/ApiErrorLog.java @@ -0,0 +1,103 @@ +package com.win.framework.apilog.core.service; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +/** + * API 错误日志 + * + * @author 闻荫源码 + */ +@Data +public class ApiErrorLog { + + /** + * 链路编号 + */ + private String traceId; + /** + * 账号编号 + */ + private Long userId; + /** + * 应用名 + */ + @NotNull(message = "应用名不能为空") + private String applicationName; + + /** + * 请求方法名 + */ + @NotNull(message = "http 请求方法不能为空") + private String requestMethod; + /** + * 访问地址 + */ + @NotNull(message = "访问地址不能为空") + private String requestUrl; + /** + * 请求参数 + */ + @NotNull(message = "请求参数不能为空") + private String requestParams; + /** + * 用户 IP + */ + @NotNull(message = "ip 不能为空") + private String userIp; + /** + * 浏览器 UA + */ + @NotNull(message = "User-Agent 不能为空") + private String userAgent; + + /** + * 异常时间 + */ + @NotNull(message = "异常时间不能为空") + private LocalDateTime exceptionTime; + /** + * 异常名 + */ + @NotNull(message = "异常名不能为空") + private String exceptionName; + /** + * 异常发生的类全名 + */ + @NotNull(message = "异常发生的类全名不能为空") + private String exceptionClassName; + /** + * 异常发生的类文件 + */ + @NotNull(message = "异常发生的类文件不能为空") + private String exceptionFileName; + /** + * 异常发生的方法名 + */ + @NotNull(message = "异常发生的方法名不能为空") + private String exceptionMethodName; + /** + * 异常发生的方法所在行 + */ + @NotNull(message = "异常发生的方法所在行不能为空") + private Integer exceptionLineNumber; + /** + * 异常的栈轨迹异常的栈轨迹 + */ + @NotNull(message = "异常的栈轨迹不能为空") + private String exceptionStackTrace; + /** + * 异常导致的根消息 + */ + @NotNull(message = "异常导致的根消息不能为空") + private String exceptionRootCauseMessage; + /** + * 异常导致的消息 + */ + @NotNull(message = "异常导致的消息不能为空") + private String exceptionMessage; + + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/core/service/ApiErrorLogFrameworkService.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/core/service/ApiErrorLogFrameworkService.java new file mode 100644 index 0000000..587b595 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/core/service/ApiErrorLogFrameworkService.java @@ -0,0 +1,17 @@ +package com.win.framework.apilog.core.service; + +/** + * API 错误日志 Framework Service 接口 + * + * @author 闻荫源码 + */ +public interface ApiErrorLogFrameworkService { + + /** + * 创建 API 错误日志 + * + * @param apiErrorLog API 错误日志 + */ + void createApiErrorLog(ApiErrorLog apiErrorLog); + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/core/service/ApiErrorLogFrameworkServiceImpl.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/core/service/ApiErrorLogFrameworkServiceImpl.java new file mode 100644 index 0000000..a16cd73 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/core/service/ApiErrorLogFrameworkServiceImpl.java @@ -0,0 +1,28 @@ +package com.win.framework.apilog.core.service; + +import cn.hutool.core.bean.BeanUtil; +import com.win.module.infra.api.logger.ApiErrorLogApi; +import com.win.module.infra.api.logger.dto.ApiErrorLogCreateReqDTO; +import lombok.RequiredArgsConstructor; +import org.springframework.scheduling.annotation.Async; + +/** + * API 错误日志 Framework Service 实现类 + * + * 基于 {@link ApiErrorLogApi} 服务,记录错误日志 + * + * @author 闻荫源码 + */ +@RequiredArgsConstructor +public class ApiErrorLogFrameworkServiceImpl implements ApiErrorLogFrameworkService { + + private final ApiErrorLogApi apiErrorLogApi; + + @Override + @Async + public void createApiErrorLog(ApiErrorLog apiErrorLog) { + ApiErrorLogCreateReqDTO reqDTO = BeanUtil.copyProperties(apiErrorLog, ApiErrorLogCreateReqDTO.class); + apiErrorLogApi.createApiErrorLog(reqDTO); + } + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/package-info.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/package-info.java new file mode 100644 index 0000000..4395aa9 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/package-info.java @@ -0,0 +1,8 @@ +/** + * API 日志:包含两类 + * 1. API 访问日志:记录用户访问 API 的访问日志,定期归档历史日志。 + * 2. 异常日志:记录用户访问 API 的系统异常,方便日常排查问题与告警。 + * + * @author 闻荫源码 + */ +package com.win.framework.apilog; diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/jackson/config/WinJacksonAutoConfiguration.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/jackson/config/WinJacksonAutoConfiguration.java new file mode 100644 index 0000000..ca8234b --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/jackson/config/WinJacksonAutoConfiguration.java @@ -0,0 +1,42 @@ +package com.win.framework.jackson.config; + +import cn.hutool.core.collection.CollUtil; +import com.win.framework.common.util.json.JsonUtils; +import com.win.framework.jackson.core.databind.LocalDateTimeDeserializer; +import com.win.framework.jackson.core.databind.LocalDateTimeSerializer; +import com.win.framework.jackson.core.databind.NumberSerializer; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.module.SimpleModule; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.context.annotation.Bean; + +import java.time.LocalDateTime; +import java.util.List; + +@AutoConfiguration +@Slf4j +public class WinJacksonAutoConfiguration { + + @Bean + @SuppressWarnings("InstantiationOfUtilityClass") + public JsonUtils jsonUtils(List objectMappers) { + // 1.1 创建 SimpleModule 对象 + SimpleModule simpleModule = new SimpleModule(); + simpleModule + // 新增 Long 类型序列化规则,数值超过 2^53-1,在 JS 会出现精度丢失问题,因此 Long 自动序列化为字符串类型 + .addSerializer(Long.class, NumberSerializer.INSTANCE) + .addSerializer(Long.TYPE, NumberSerializer.INSTANCE) + // 新增 LocalDateTime 序列化、反序列化规则 + .addSerializer(LocalDateTime.class, LocalDateTimeSerializer.INSTANCE) + .addDeserializer(LocalDateTime.class, LocalDateTimeDeserializer.INSTANCE); + // 1.2 注册到 objectMapper + objectMappers.forEach(objectMapper -> objectMapper.registerModule(simpleModule)); + + // 2. 设置 objectMapper 到 JsonUtils { + JsonUtils.init(CollUtil.getFirst(objectMappers)); + log.info("[init][初始化 JsonUtils 成功]"); + return new JsonUtils(); + } + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/jackson/core/databind/LocalDateTimeDeserializer.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/jackson/core/databind/LocalDateTimeDeserializer.java new file mode 100644 index 0000000..a470146 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/jackson/core/databind/LocalDateTimeDeserializer.java @@ -0,0 +1,25 @@ +package com.win.framework.jackson.core.databind; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; + +import java.io.IOException; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; + +/** + * LocalDateTime反序列化规则 + *

+ * 会将毫秒级时间戳反序列化为LocalDateTime + */ +public class LocalDateTimeDeserializer extends JsonDeserializer { + + public static final LocalDateTimeDeserializer INSTANCE = new LocalDateTimeDeserializer(); + + @Override + public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { + return LocalDateTime.ofInstant(Instant.ofEpochMilli(p.getValueAsLong()), ZoneId.systemDefault()); + } +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/jackson/core/databind/LocalDateTimeSerializer.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/jackson/core/databind/LocalDateTimeSerializer.java new file mode 100644 index 0000000..35b879e --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/jackson/core/databind/LocalDateTimeSerializer.java @@ -0,0 +1,24 @@ +package com.win.framework.jackson.core.databind; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; + +import java.io.IOException; +import java.time.LocalDateTime; +import java.time.ZoneId; + +/** + * LocalDateTime序列化规则 + *

+ * 会将LocalDateTime序列化为毫秒级时间戳 + */ +public class LocalDateTimeSerializer extends JsonSerializer { + + public static final LocalDateTimeSerializer INSTANCE = new LocalDateTimeSerializer(); + + @Override + public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + gen.writeNumber(value.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli()); + } +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/jackson/core/databind/NumberSerializer.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/jackson/core/databind/NumberSerializer.java new file mode 100644 index 0000000..1b01cf5 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/jackson/core/databind/NumberSerializer.java @@ -0,0 +1,37 @@ +package com.win.framework.jackson.core.databind; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.annotation.JacksonStdImpl; + +import java.io.IOException; + +/** + * Long 序列化规则 + * + * 会将超长 long 值转换为 string,解决前端 JavaScript 最大安全整数是 2^53-1 的问题 + * + * @author 星语 + */ +@JacksonStdImpl +public class NumberSerializer extends com.fasterxml.jackson.databind.ser.std.NumberSerializer { + + private static final long MAX_SAFE_INTEGER = 9007199254740991L; + private static final long MIN_SAFE_INTEGER = -9007199254740991L; + + public static final NumberSerializer INSTANCE = new NumberSerializer(Number.class); + + public NumberSerializer(Class rawType) { + super(rawType); + } + + @Override + public void serialize(Number value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + // 超出范围 序列化位字符串 + if (value.longValue() > MIN_SAFE_INTEGER && value.longValue() < MAX_SAFE_INTEGER) { + super.serialize(value, gen, serializers); + } else { + gen.writeString(value.toString()); + } + } +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/jackson/core/package-info.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/jackson/core/package-info.java new file mode 100644 index 0000000..d1951c2 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/jackson/core/package-info.java @@ -0,0 +1 @@ +package com.win.framework.jackson.core; diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/swagger/config/SwaggerProperties.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/swagger/config/SwaggerProperties.java new file mode 100644 index 0000000..b4cc1f8 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/swagger/config/SwaggerProperties.java @@ -0,0 +1,60 @@ +package com.win.framework.swagger.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +import javax.validation.constraints.NotEmpty; + +/** + * Swagger 配置属性 + * + * @author 闻荫源码 + */ +@ConfigurationProperties("win.swagger") +@Data +public class SwaggerProperties { + + /** + * 标题 + */ + @NotEmpty(message = "标题不能为空") + private String title; + /** + * 描述 + */ + @NotEmpty(message = "描述不能为空") + private String description; + /** + * 作者 + */ + @NotEmpty(message = "作者不能为空") + private String author; + /** + * 版本 + */ + @NotEmpty(message = "版本不能为空") + private String version; + /** + * url + */ + @NotEmpty(message = "扫描的 package 不能为空") + private String url; + /** + * email + */ + @NotEmpty(message = "扫描的 email 不能为空") + private String email; + + /** + * license + */ + @NotEmpty(message = "扫描的 license 不能为空") + private String license; + + /** + * license-url + */ + @NotEmpty(message = "扫描的 license-url 不能为空") + private String licenseUrl; + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/swagger/config/WinSwaggerAutoConfiguration.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/swagger/config/WinSwaggerAutoConfiguration.java new file mode 100644 index 0000000..b43239b --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/swagger/config/WinSwaggerAutoConfiguration.java @@ -0,0 +1,155 @@ +package com.win.framework.swagger.config; + +import io.swagger.v3.oas.models.Components; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Contact; +import io.swagger.v3.oas.models.info.Info; +import io.swagger.v3.oas.models.info.License; +import io.swagger.v3.oas.models.media.IntegerSchema; +import io.swagger.v3.oas.models.media.StringSchema; +import io.swagger.v3.oas.models.parameters.Parameter; +import io.swagger.v3.oas.models.security.SecurityRequirement; +import io.swagger.v3.oas.models.security.SecurityScheme; +import org.springdoc.core.*; +import org.springdoc.core.customizers.OpenApiBuilderCustomizer; +import org.springdoc.core.customizers.ServerBaseUrlCustomizer; +import org.springdoc.core.providers.JavadocProvider; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.http.HttpHeaders; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import static com.win.framework.web.core.util.WebFrameworkUtils.HEADER_TENANT_ID; + +/** + * Swagger 自动配置类,基于 OpenAPI + Springdoc 实现。 + * + * 友情提示: + * 1. Springdoc 文档地址:仓库 + * 2. Swagger 规范,于 2015 更名为 OpenAPI 规范,本质是一个东西 + * + * @author 闻荫源码 + */ +@AutoConfiguration +@ConditionalOnClass({OpenAPI.class}) +@EnableConfigurationProperties(SwaggerProperties.class) +@ConditionalOnProperty(prefix = "springdoc.api-docs", name = "enabled", havingValue = "true", matchIfMissing = true) // 设置为 false 时,禁用 +public class WinSwaggerAutoConfiguration { + + // ========== 全局 OpenAPI 配置 ========== + + @Bean + public OpenAPI createApi(SwaggerProperties properties) { + Map securitySchemas = buildSecuritySchemes(); + OpenAPI openAPI = new OpenAPI() + // 接口信息 + .info(buildInfo(properties)) + // 接口安全配置 + .components(new Components().securitySchemes(securitySchemas)) + .addSecurityItem(new SecurityRequirement().addList(HttpHeaders.AUTHORIZATION)); + securitySchemas.keySet().forEach(key -> openAPI.addSecurityItem(new SecurityRequirement().addList(key))); + return openAPI; + } + + /** + * API 摘要信息 + */ + private Info buildInfo(SwaggerProperties properties) { + return new Info() + .title(properties.getTitle()) + .description(properties.getDescription()) + .version(properties.getVersion()) + .contact(new Contact().name(properties.getAuthor()).url(properties.getUrl()).email(properties.getEmail())) + .license(new License().name(properties.getLicense()).url(properties.getLicenseUrl())); + } + + /** + * 安全模式,这里配置通过请求头 Authorization 传递 token 参数 + */ + private Map buildSecuritySchemes() { + Map securitySchemes = new HashMap<>(); + SecurityScheme securityScheme = new SecurityScheme() + .type(SecurityScheme.Type.APIKEY) // 类型 + .name(HttpHeaders.AUTHORIZATION) // 请求头的 name + .in(SecurityScheme.In.HEADER); // token 所在位置 + securitySchemes.put(HttpHeaders.AUTHORIZATION, securityScheme); + return securitySchemes; + } + + /** + * 自定义 OpenAPI 处理器 + */ + @Bean + public OpenAPIService openApiBuilder(Optional openAPI, + SecurityService securityParser, + SpringDocConfigProperties springDocConfigProperties, + PropertyResolverUtils propertyResolverUtils, + Optional> openApiBuilderCustomizers, + Optional> serverBaseUrlCustomizers, + Optional javadocProvider) { + + return new OpenAPIService(openAPI, securityParser, springDocConfigProperties, + propertyResolverUtils, openApiBuilderCustomizers, serverBaseUrlCustomizers, javadocProvider); + } + + // ========== 分组 OpenAPI 配置 ========== + + /** + * 所有模块的 API 分组 + */ + @Bean + public GroupedOpenApi allGroupedOpenApi() { + return buildGroupedOpenApi("all", ""); + } + + public static GroupedOpenApi buildGroupedOpenApi(String group) { + return buildGroupedOpenApi(group, group); + } + + public static GroupedOpenApi buildGroupedOpenApi(String group, String path) { + return GroupedOpenApi.builder() + .group(group) + .pathsToMatch("/admin-api/" + path + "/**") + .addOperationCustomizer((operation, handlerMethod) -> operation + .addParametersItem(buildTenantHeaderParameter()) + .addParametersItem(buildSecurityHeaderParameter())) + .build(); + } + + /** + * 构建 Tenant 租户编号请求头参数 + * + * @return 多租户参数 + */ + private static Parameter buildTenantHeaderParameter() { + return new Parameter() + .name(HEADER_TENANT_ID) // header 名 + .description("租户编号") // 描述 + .in(String.valueOf(SecurityScheme.In.HEADER)) // 请求 header + .schema(new IntegerSchema()._default(1L).name(HEADER_TENANT_ID).description("租户编号")); // 默认:使用租户编号为 1 + } + + /** + * 构建 Authorization 认证请求头参数 + * + * 解决 Knife4j Authorize 未生效,请求header里未包含参数 + * + * @return 认证参数 + */ + private static Parameter buildSecurityHeaderParameter() { + return new Parameter() + .name(HttpHeaders.AUTHORIZATION) // header 名 + .description("认证 Token") // 描述 + .in(String.valueOf(SecurityScheme.In.HEADER)) // 请求 header + .schema(new StringSchema()._default("Bearer test1").name(HEADER_TENANT_ID).description("认证 Token")); // 默认:使用用户编号为 1 + } + +} + diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/swagger/package-info.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/swagger/package-info.java new file mode 100644 index 0000000..315ab04 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/swagger/package-info.java @@ -0,0 +1,6 @@ +/** + * 基于 Swagger + Knife4j 实现 API 接口文档 + * + * @author 闻荫源码 + */ +package com.win.framework.swagger; diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/config/WebProperties.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/config/WebProperties.java new file mode 100644 index 0000000..ee5f161 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/config/WebProperties.java @@ -0,0 +1,67 @@ +package com.win.framework.web.config; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.servlet.config.annotation.PathMatchConfigurer; + +import javax.validation.Valid; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +@ConfigurationProperties(prefix = "win.web") +@Validated +@Data +public class WebProperties { + + @NotNull(message = "Admin API 不能为空") + private Api adminApi = new Api("/admin-api", "**.controller.**"); + + @NotNull(message = "Admin UI 不能为空") + private Ui adminUi; + + @NotNull(message = "profile 不能为空") + private String profile; + + @Data + @AllArgsConstructor + @NoArgsConstructor + @Valid + public static class Api { + + /** + * API 前缀,实现所有 Controller 提供的 RESTFul API 的统一前缀 + * + * + * 意义:通过该前缀,避免 Swagger、Actuator 意外通过 Nginx 暴露出来给外部,带来安全性问题 + * 这样,Nginx 只需要配置转发到 /api/* 的所有接口即可。 + * + * @see WinWebAutoConfiguration#configurePathMatch(PathMatchConfigurer) + */ + @NotEmpty(message = "API 前缀不能为空") + private String prefix; + + /** + * Controller 所在包的 Ant 路径规则 + * + * 主要目的是,给该 Controller 设置指定的 {@link #prefix} + */ + @NotEmpty(message = "Controller 所在包不能为空") + private String controller; + + } + + @Data + @Valid + public static class Ui { + + /** + * 访问地址 + */ + private String url; + + } + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/config/WinWebAutoConfiguration.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/config/WinWebAutoConfiguration.java new file mode 100644 index 0000000..4e32a26 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/config/WinWebAutoConfiguration.java @@ -0,0 +1,169 @@ +package com.win.framework.web.config; + +import com.win.framework.apilog.core.service.ApiErrorLogFrameworkService; +import com.win.framework.common.enums.WebFilterOrderEnum; +import com.win.framework.web.constant.Constant; +import com.win.framework.web.core.filter.CacheRequestBodyFilter; +import com.win.framework.web.core.filter.DemoFilter; +import com.win.framework.web.core.filter.MyI18nInterceptor; +import com.win.framework.web.core.handler.GlobalExceptionHandler; +import com.win.framework.web.core.handler.GlobalResponseBodyHandler; +import com.win.framework.web.core.util.WebFrameworkUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.MessageSource; +import org.springframework.context.annotation.Bean; +import org.springframework.util.AntPathMatcher; +import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import org.springframework.web.filter.CorsFilter; +import org.springframework.web.servlet.LocaleResolver; +import org.springframework.web.servlet.config.annotation.*; +import org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver; + +import javax.annotation.Resource; +import javax.servlet.Filter; + +@AutoConfiguration +@EnableConfigurationProperties(WebProperties.class) +public class WinWebAutoConfiguration implements WebMvcConfigurer { + + @Resource + private WebProperties webProperties; + + /** + * 应用名 + */ + @Value("${spring.application.name}") + private String applicationName; + + @Override + public void configurePathMatch(PathMatchConfigurer configurer) { + configurePathMatch(configurer, webProperties.getAdminApi()); + } + + /** + * 设置validator国际化 + * @param messageSource + * @return + */ + @Bean + public LocalValidatorFactoryBean defaultValidator(MessageSource messageSource) { + LocalValidatorFactoryBean factoryBean = new LocalValidatorFactoryBean(); + factoryBean.setValidationMessageSource(messageSource); + return factoryBean; + } + + @Bean + public LocaleResolver localeResolver() { + return new AcceptHeaderLocaleResolver(); + } + + /** + * 设置 API 前缀,仅仅匹配 controller 包下的 + * + * @param configurer 配置 + * @param api API 配置 + */ + private void configurePathMatch(PathMatchConfigurer configurer, WebProperties.Api api) { + AntPathMatcher antPathMatcher = new AntPathMatcher("."); + configurer.addPathPrefix(api.getPrefix(), clazz -> clazz.isAnnotationPresent(RestController.class) + && antPathMatcher.match(api.getController(), clazz.getPackage().getName())); // 仅仅匹配 controller 包 + } + + @Bean + public GlobalExceptionHandler globalExceptionHandler(ApiErrorLogFrameworkService ApiErrorLogFrameworkService) { + return new GlobalExceptionHandler(applicationName, ApiErrorLogFrameworkService); + } + + @Bean + public GlobalResponseBodyHandler globalResponseBodyHandler() { + return new GlobalResponseBodyHandler(); + } + + @Bean + @SuppressWarnings("InstantiationOfUtilityClass") + public WebFrameworkUtils webFrameworkUtils(WebProperties webProperties) { + // 由于 WebFrameworkUtils 需要使用到 webProperties 属性,所以注册为一个 Bean + return new WebFrameworkUtils(webProperties); + } + + // ========== Filter 相关 ========== + + /** + * 创建 CorsFilter Bean,解决跨域问题 + */ + @Bean + public FilterRegistrationBean corsFilterBean() { + // 创建 CorsConfiguration 对象 + CorsConfiguration config = new CorsConfiguration(); + config.setAllowCredentials(true); + config.addAllowedOriginPattern("*"); // 设置访问源地址 + config.addAllowedHeader("*"); // 设置访问源请求头 + config.addAllowedMethod("*"); // 设置访问源请求方法 + // 创建 UrlBasedCorsConfigurationSource 对象 + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + source.registerCorsConfiguration("/**", config); // 对接口配置跨域设置 + return createFilterBean(new CorsFilter(source), WebFilterOrderEnum.CORS_FILTER); + } + + /** + * 创建 RequestBodyCacheFilter Bean,可重复读取请求内容 + */ + @Bean + public FilterRegistrationBean requestBodyCacheFilter() { + return createFilterBean(new CacheRequestBodyFilter(), WebFilterOrderEnum.REQUEST_BODY_CACHE_FILTER); + } + + /** + * 创建 DemoFilter Bean,演示模式 + */ + @Bean + @ConditionalOnProperty(value = "win.demo", havingValue = "true") + public FilterRegistrationBean demoFilter() { + return createFilterBean(new DemoFilter(), WebFilterOrderEnum.DEMO_FILTER); + } + + public static FilterRegistrationBean createFilterBean(T filter, Integer order) { + FilterRegistrationBean bean = new FilterRegistrationBean<>(filter); + bean.setOrder(order); + return bean; + } + + /** + * 创建 RestTemplate 实例 + * + * @param restTemplateBuilder {@link RestTemplateAutoConfiguration#restTemplateBuilder} + */ + @Bean + public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) { + return restTemplateBuilder.build(); + } + + @Override + public void addInterceptors(InterceptorRegistry registry) { + // 注册拦截器 + MyI18nInterceptor myHandlerInterceptor = new MyI18nInterceptor(); + InterceptorRegistration loginRegistry = registry.addInterceptor(myHandlerInterceptor); + // 拦截路径 + loginRegistry.addPathPatterns("/**"); + } + + /** + * 本地文件上传路径 + * @param registry + */ + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + registry.addResourceHandler(Constant.RESOURCE_PREFIX + "/**").addResourceLocations("file:" + webProperties.getProfile() + "/"); + } + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/constant/Constant.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/constant/Constant.java new file mode 100644 index 0000000..7d2d039 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/constant/Constant.java @@ -0,0 +1,10 @@ +package com.win.framework.web.constant; + +public class Constant { + + /** + * 资源映射路径 前缀 + */ + public static final String RESOURCE_PREFIX = "/profile/"; + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/filter/ApiRequestFilter.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/filter/ApiRequestFilter.java new file mode 100644 index 0000000..160593c --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/filter/ApiRequestFilter.java @@ -0,0 +1,26 @@ +package com.win.framework.web.core.filter; + +import cn.hutool.core.util.StrUtil; +import com.win.framework.web.config.WebProperties; +import lombok.RequiredArgsConstructor; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.http.HttpServletRequest; + +/** + * 过滤 /admin-api、/app-api 等 API 请求的过滤器 + * + * @author 闻荫源码 + */ +@RequiredArgsConstructor +public abstract class ApiRequestFilter extends OncePerRequestFilter { + + protected final WebProperties webProperties; + + @Override + protected boolean shouldNotFilter(HttpServletRequest request) { + // 只过滤 API 请求的地址 + return !StrUtil.startWithAny(request.getRequestURI(), webProperties.getAdminApi().getPrefix()); + } + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/filter/CacheRequestBodyFilter.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/filter/CacheRequestBodyFilter.java new file mode 100644 index 0000000..d4f247d --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/filter/CacheRequestBodyFilter.java @@ -0,0 +1,31 @@ +package com.win.framework.web.core.filter; + +import com.win.framework.common.util.servlet.ServletUtils; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * Request Body 缓存 Filter,实现它的可重复读取 + * + * @author 闻荫源码 + */ +public class CacheRequestBodyFilter extends OncePerRequestFilter { + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) + throws IOException, ServletException { + filterChain.doFilter(new CacheRequestBodyWrapper(request), response); + } + + @Override + protected boolean shouldNotFilter(HttpServletRequest request) { + // 只处理 json 请求内容 + return !ServletUtils.isJsonRequest(request); + } + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/filter/CacheRequestBodyWrapper.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/filter/CacheRequestBodyWrapper.java new file mode 100644 index 0000000..857b16a --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/filter/CacheRequestBodyWrapper.java @@ -0,0 +1,68 @@ +package com.win.framework.web.core.filter; + +import com.win.framework.common.util.servlet.ServletUtils; + +import javax.servlet.ReadListener; +import javax.servlet.ServletInputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStreamReader; + +/** + * Request Body 缓存 Wrapper + * + * @author 闻荫源码 + */ +public class CacheRequestBodyWrapper extends HttpServletRequestWrapper { + + /** + * 缓存的内容 + */ + private final byte[] body; + + public CacheRequestBodyWrapper(HttpServletRequest request) { + super(request); + body = ServletUtils.getBodyBytes(request); + } + + @Override + public BufferedReader getReader() throws IOException { + return new BufferedReader(new InputStreamReader(this.getInputStream())); + } + + @Override + public ServletInputStream getInputStream() throws IOException { + final ByteArrayInputStream inputStream = new ByteArrayInputStream(body); + // 返回 ServletInputStream + return new ServletInputStream() { + + @Override + public int read() { + return inputStream.read(); + } + + @Override + public boolean isFinished() { + return false; + } + + @Override + public boolean isReady() { + return false; + } + + @Override + public void setReadListener(ReadListener readListener) {} + + @Override + public int available() { + return body.length; + } + + }; + } + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/filter/DemoFilter.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/filter/DemoFilter.java new file mode 100644 index 0000000..1527f8a --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/filter/DemoFilter.java @@ -0,0 +1,35 @@ +package com.win.framework.web.core.filter; + +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.util.servlet.ServletUtils; +import com.win.framework.web.core.util.WebFrameworkUtils; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import static com.win.framework.common.exception.enums.GlobalErrorCodeConstants.DEMO_DENY; + +/** + * 演示 Filter,禁止用户发起写操作,避免影响测试数据 + * + * @author 闻荫源码 + */ +public class DemoFilter extends OncePerRequestFilter { + + @Override + protected boolean shouldNotFilter(HttpServletRequest request) { + String method = request.getMethod(); + return !StrUtil.equalsAnyIgnoreCase(method, "POST", "PUT", "DELETE") // 写操作时,不进行过滤率 + || WebFrameworkUtils.getLoginUserId(request) == null; // 非登录用户时,不进行过滤 + } + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) { + // 直接返回 DEMO_DENY 的结果。即,请求不继续 + ServletUtils.writeJSON(response, CommonResult.error(DEMO_DENY)); + } + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/filter/MyI18nInterceptor.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/filter/MyI18nInterceptor.java new file mode 100644 index 0000000..b660326 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/filter/MyI18nInterceptor.java @@ -0,0 +1,44 @@ +package com.win.framework.web.core.filter; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.i18n.LocaleContextHolder; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.Locale; + +@Slf4j +public class MyI18nInterceptor implements HandlerInterceptor { + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + final String key = "language"; + String language = request.getHeader(key); + // 前端传递的language必须是zh-CN格式的,中间的-必须要完整,不能只传递zh或en + log.debug("当前语言={}", language); + if(language == null || language.isEmpty()) { + language = "zh-CN"; + } + Locale locale = new Locale(language.split("-")[0],language.split("-")[1]); + // 这样赋值以后,MessageUtil.message方法就不用修改了 + LocaleContextHolder.setLocale(locale); + return true; + } + + /** + * 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后) + */ + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) { + } + + /** + * 在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作) + */ + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { + } + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/handler/GlobalExceptionHandler.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..1a16b52 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/handler/GlobalExceptionHandler.java @@ -0,0 +1,324 @@ +package com.win.framework.web.core.handler; + +import cn.hutool.core.exceptions.ExceptionUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; +import com.win.framework.apilog.core.service.ApiErrorLog; +import com.win.framework.apilog.core.service.ApiErrorLogFrameworkService; +import com.win.framework.common.exception.ServiceException; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.util.json.JsonUtils; +import com.win.framework.common.util.monitor.TracerUtils; +import com.win.framework.common.util.servlet.ServletUtils; +import com.win.framework.web.core.util.WebFrameworkUtils; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.util.Assert; +import org.springframework.validation.BindException; +import org.springframework.validation.FieldError; +import org.springframework.web.HttpRequestMethodNotSupportedException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.MissingServletRequestParameterException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; +import org.springframework.web.servlet.NoHandlerFoundException; + +import javax.servlet.http.HttpServletRequest; +import javax.validation.ConstraintViolation; +import javax.validation.ConstraintViolationException; +import javax.validation.ValidationException; +import java.time.LocalDateTime; +import java.util.Map; +import java.util.Objects; + +import static com.win.framework.common.exception.enums.GlobalErrorCodeConstants.*; + +/** + * 全局异常处理器,将 Exception 翻译成 CommonResult + 对应的异常编号 + * + * @author 闻荫源码 + */ +@RestControllerAdvice +@AllArgsConstructor +@Slf4j +public class GlobalExceptionHandler { + + private final String applicationName; + + private final ApiErrorLogFrameworkService apiErrorLogFrameworkService; + + /** + * 处理所有异常,主要是提供给 Filter 使用 + * 因为 Filter 不走 SpringMVC 的流程,但是我们又需要兜底处理异常,所以这里提供一个全量的异常处理过程,保持逻辑统一。 + * + * @param request 请求 + * @param ex 异常 + * @return 通用返回 + */ + public CommonResult allExceptionHandler(HttpServletRequest request, Throwable ex) { + if (ex instanceof MissingServletRequestParameterException) { + return missingServletRequestParameterExceptionHandler((MissingServletRequestParameterException) ex); + } + if (ex instanceof MethodArgumentTypeMismatchException) { + return methodArgumentTypeMismatchExceptionHandler((MethodArgumentTypeMismatchException) ex); + } + if (ex instanceof MethodArgumentNotValidException) { + return methodArgumentNotValidExceptionExceptionHandler((MethodArgumentNotValidException) ex); + } + if (ex instanceof BindException) { + return bindExceptionHandler((BindException) ex); + } + if (ex instanceof ConstraintViolationException) { + return constraintViolationExceptionHandler((ConstraintViolationException) ex); + } + if (ex instanceof ValidationException) { + return validationException((ValidationException) ex); + } + if (ex instanceof NoHandlerFoundException) { + return noHandlerFoundExceptionHandler(request, (NoHandlerFoundException) ex); + } + if (ex instanceof HttpRequestMethodNotSupportedException) { + return httpRequestMethodNotSupportedExceptionHandler((HttpRequestMethodNotSupportedException) ex); + } + if (ex instanceof ServiceException) { + return serviceExceptionHandler((ServiceException) ex); + } + if (ex instanceof AccessDeniedException) { + return accessDeniedExceptionHandler(request, (AccessDeniedException) ex); + } + return defaultExceptionHandler(request, ex); + } + + /** + * 处理 SpringMVC 请求参数缺失 + * + * 例如说,接口上设置了 @RequestParam("xx") 参数,结果并未传递 xx 参数 + */ + @ExceptionHandler(value = MissingServletRequestParameterException.class) + public CommonResult missingServletRequestParameterExceptionHandler(MissingServletRequestParameterException ex) { + log.warn("[missingServletRequestParameterExceptionHandler]", ex); + return CommonResult.error(BAD_REQUEST.getCode(), String.format("请求参数缺失:%s", ex.getParameterName())); + } + + /** + * 处理 SpringMVC 请求参数类型错误 + * + * 例如说,接口上设置了 @RequestParam("xx") 参数为 Integer,结果传递 xx 参数类型为 String + */ + @ExceptionHandler(MethodArgumentTypeMismatchException.class) + public CommonResult methodArgumentTypeMismatchExceptionHandler(MethodArgumentTypeMismatchException ex) { + log.warn("[missingServletRequestParameterExceptionHandler]", ex); + return CommonResult.error(BAD_REQUEST.getCode(), String.format("请求参数类型错误:%s", ex.getMessage())); + } + + /** + * 处理 SpringMVC 参数校验不正确 + */ + @ExceptionHandler(MethodArgumentNotValidException.class) + public CommonResult methodArgumentNotValidExceptionExceptionHandler(MethodArgumentNotValidException ex) { + log.warn("[methodArgumentNotValidExceptionExceptionHandler]", ex); + FieldError fieldError = ex.getBindingResult().getFieldError(); + assert fieldError != null; // 断言,避免告警 + return CommonResult.error(BAD_REQUEST.getCode(), String.format("请求参数不正确:%s", fieldError.getDefaultMessage())); + } + + /** + * 处理 SpringMVC 参数绑定不正确,本质上也是通过 Validator 校验 + */ + @ExceptionHandler(BindException.class) + public CommonResult bindExceptionHandler(BindException ex) { + log.warn("[handleBindException]", ex); + FieldError fieldError = ex.getFieldError(); + assert fieldError != null; // 断言,避免告警 + return CommonResult.error(BAD_REQUEST.getCode(), String.format("请求参数不正确:%s", fieldError.getDefaultMessage())); + } + + /** + * 处理 Validator 校验不通过产生的异常 + */ + @ExceptionHandler(value = ConstraintViolationException.class) + public CommonResult constraintViolationExceptionHandler(ConstraintViolationException ex) { + log.warn("[constraintViolationExceptionHandler]", ex); + ConstraintViolation constraintViolation = ex.getConstraintViolations().iterator().next(); + return CommonResult.error(BAD_REQUEST.getCode(), String.format("请求参数不正确:%s", constraintViolation.getMessage())); + } + + /** + * 处理 Dubbo Consumer 本地参数校验时,抛出的 ValidationException 异常 + */ + @ExceptionHandler(value = ValidationException.class) + public CommonResult validationException(ValidationException ex) { + log.warn("[constraintViolationExceptionHandler]", ex); + // 无法拼接明细的错误信息,因为 Dubbo Consumer 抛出 ValidationException 异常时,是直接的字符串信息,且人类不可读 + return CommonResult.error(BAD_REQUEST); + } + + /** + * 处理 SpringMVC 请求地址不存在 + * + * 注意,它需要设置如下两个配置项: + * 1. spring.mvc.throw-exception-if-no-handler-found 为 true + * 2. spring.mvc.static-path-pattern 为 /statics/** + */ + @ExceptionHandler(NoHandlerFoundException.class) + public CommonResult noHandlerFoundExceptionHandler(HttpServletRequest req, NoHandlerFoundException ex) { + log.warn("[noHandlerFoundExceptionHandler]", ex); + return CommonResult.error(NOT_FOUND.getCode(), String.format("请求地址不存在:%s", ex.getRequestURL())); + } + + /** + * 处理 SpringMVC 请求方法不正确 + * + * 例如说,A 接口的方法为 GET 方式,结果请求方法为 POST 方式,导致不匹配 + */ + @ExceptionHandler(HttpRequestMethodNotSupportedException.class) + public CommonResult httpRequestMethodNotSupportedExceptionHandler(HttpRequestMethodNotSupportedException ex) { + log.warn("[httpRequestMethodNotSupportedExceptionHandler]", ex); + return CommonResult.error(METHOD_NOT_ALLOWED.getCode(), String.format("请求方法不正确:%s", ex.getMessage())); + } + + /** + * 处理 Resilience4j 限流抛出的异常 + */ + public CommonResult requestNotPermittedExceptionHandler(HttpServletRequest req, Throwable ex) { + log.warn("[requestNotPermittedExceptionHandler][url({}) 访问过于频繁]", req.getRequestURL(), ex); + return CommonResult.error(TOO_MANY_REQUESTS); + } + + /** + * 处理 Spring Security 权限不足的异常 + * + * 来源是,使用 @PreAuthorize 注解,AOP 进行权限拦截 + */ + @ExceptionHandler(value = AccessDeniedException.class) + public CommonResult accessDeniedExceptionHandler(HttpServletRequest req, AccessDeniedException ex) { + log.warn("[accessDeniedExceptionHandler][userId({}) 无法访问 url({})]", WebFrameworkUtils.getLoginUserId(req), + req.getRequestURL(), ex); + return CommonResult.error(FORBIDDEN); + } + + /** + * 处理业务异常 ServiceException + * + * 例如说,商品库存不足,用户手机号已存在。 + */ + @ExceptionHandler(value = ServiceException.class) + public CommonResult serviceExceptionHandler(ServiceException ex) { + log.info("[serviceExceptionHandler]", ex); + return CommonResult.error(ex.getCode(), ex.getMessage()); + } + + /** + * 处理系统异常,兜底处理所有的一切 + */ + @ExceptionHandler(value = Exception.class) + public CommonResult defaultExceptionHandler(HttpServletRequest req, Throwable ex) { + // 情况一:处理表不存在的异常 + CommonResult tableNotExistsResult = handleTableNotExists(ex); + if (tableNotExistsResult != null) { + return tableNotExistsResult; + } + + // 情况二:部分特殊的库的处理 + if (Objects.equals("io.github.resilience4j.ratelimiter.RequestNotPermitted", ex.getClass().getName())) { + return requestNotPermittedExceptionHandler(req, ex); + } + + // 情况三:处理异常 + log.error("[defaultExceptionHandler]", ex); + // 插入异常日志 + this.createExceptionLog(req, ex); + // 返回 ERROR CommonResult + return CommonResult.error(INTERNAL_SERVER_ERROR.getCode(), INTERNAL_SERVER_ERROR.getMsg()); + } + + private void createExceptionLog(HttpServletRequest req, Throwable e) { + // 插入错误日志 + ApiErrorLog errorLog = new ApiErrorLog(); + try { + // 初始化 errorLog + initExceptionLog(errorLog, req, e); + // 执行插入 errorLog + apiErrorLogFrameworkService.createApiErrorLog(errorLog); + } catch (Throwable th) { + log.error("[createExceptionLog][url({}) log({}) 发生异常]", req.getRequestURI(), JsonUtils.toJsonString(errorLog), th); + } + } + + private void initExceptionLog(ApiErrorLog errorLog, HttpServletRequest request, Throwable e) { + // 处理用户信息 + errorLog.setUserId(WebFrameworkUtils.getLoginUserId(request)); + // 设置异常字段 + errorLog.setExceptionName(e.getClass().getName()); + errorLog.setExceptionMessage(ExceptionUtil.getMessage(e)); + errorLog.setExceptionRootCauseMessage(ExceptionUtil.getRootCauseMessage(e)); + errorLog.setExceptionStackTrace(ExceptionUtils.getStackTrace(e)); + StackTraceElement[] stackTraceElements = e.getStackTrace(); + Assert.notEmpty(stackTraceElements, "异常 stackTraceElements 不能为空"); + StackTraceElement stackTraceElement = stackTraceElements[0]; + errorLog.setExceptionClassName(stackTraceElement.getClassName()); + errorLog.setExceptionFileName(stackTraceElement.getFileName()); + errorLog.setExceptionMethodName(stackTraceElement.getMethodName()); + errorLog.setExceptionLineNumber(stackTraceElement.getLineNumber()); + // 设置其它字段 + errorLog.setTraceId(TracerUtils.getTraceId()); + errorLog.setApplicationName(applicationName); + errorLog.setRequestUrl(request.getRequestURI()); + Map requestParams = MapUtil.builder() + .put("query", ServletUtils.getParamMap(request)) + .put("body", ServletUtils.getBody(request)).build(); + errorLog.setRequestParams(JsonUtils.toJsonString(requestParams)); + errorLog.setRequestMethod(request.getMethod()); + errorLog.setUserAgent(ServletUtils.getUserAgent(request)); + errorLog.setUserIp(ServletUtils.getClientIP(request)); + errorLog.setExceptionTime(LocalDateTime.now()); + } + + /** + * 处理 Table 不存在的异常情况 + * + * @param ex 异常 + * @return 如果是 Table 不存在的异常,则返回对应的 CommonResult + */ + private CommonResult handleTableNotExists(Throwable ex) { + String message = ExceptionUtil.getRootCauseMessage(ex); + if (!message.contains("doesn't exist")) { + return null; + } + // 1. 数据报表 + if (message.contains("report_")) { + log.error("[报表模块 win-module-report - 表结构未导入][参考 https://doc.iocoder.cn/report/ 开启]"); + return CommonResult.error(NOT_IMPLEMENTED.getCode(), + "[报表模块 win-module-report - 表结构未导入][参考 https://doc.iocoder.cn/report/ 开启]"); + } + // 2. 工作流 + if (message.contains("bpm_")) { + log.error("[工作流模块 win-module-bpm - 表结构未导入][参考 https://doc.iocoder.cn/bpm/ 开启]"); + return CommonResult.error(NOT_IMPLEMENTED.getCode(), + "[工作流模块 win-module-bpm - 表结构未导入][参考 https://doc.iocoder.cn/bpm/ 开启]"); + } + // 3. 微信公众号 + if (message.contains("mp_")) { + log.error("[微信公众号 win-module-mp - 表结构未导入][参考 https://doc.iocoder.cn/mp/build/ 开启]"); + return CommonResult.error(NOT_IMPLEMENTED.getCode(), + "[微信公众号 win-module-mp - 表结构未导入][参考 https://doc.iocoder.cn/mp/build/ 开启]"); + } + // 4. 商城系统 + if (StrUtil.containsAny(message, "product_", "promotion_", "trade_")) { + log.error("[商城系统 win-module-mall - 已禁用][参考 https://doc.iocoder.cn/mall/build/ 开启]"); + return CommonResult.error(NOT_IMPLEMENTED.getCode(), + "[商城系统 win-module-mall - 已禁用][参考 https://doc.iocoder.cn/mall/build/ 开启]"); + } + // 5. 支付平台 + if (message.contains("pay_")) { + log.error("[支付模块 win-module-pay - 表结构未导入][参考 https://doc.iocoder.cn/pay/build/ 开启]"); + return CommonResult.error(NOT_IMPLEMENTED.getCode(), + "[支付模块 win-module-pay - 表结构未导入][参考 https://doc.iocoder.cn/pay/build/ 开启]"); + } + return null; + } + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/handler/GlobalResponseBodyHandler.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/handler/GlobalResponseBodyHandler.java new file mode 100644 index 0000000..f006b3a --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/handler/GlobalResponseBodyHandler.java @@ -0,0 +1,45 @@ +package com.win.framework.web.core.handler; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.web.core.util.WebFrameworkUtils; +import org.springframework.core.MethodParameter; +import org.springframework.http.MediaType; +import org.springframework.http.server.ServerHttpRequest; +import org.springframework.http.server.ServerHttpResponse; +import org.springframework.http.server.ServletServerHttpRequest; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; + +/** + * 全局响应结果(ResponseBody)处理器 + * + * 不同于在网上看到的很多文章,会选择自动将 Controller 返回结果包上 {@link CommonResult}, + * 在 onemall 中,是 Controller 在返回时,主动自己包上 {@link CommonResult}。 + * 原因是,GlobalResponseBodyHandler 本质上是 AOP,它不应该改变 Controller 返回的数据结构 + * + * 目前,GlobalResponseBodyHandler 的主要作用是,记录 Controller 的返回结果, + * 方便 {@link com.win.framework.apilog.core.filter.ApiAccessLogFilter} 记录访问日志 + */ +@ControllerAdvice +public class GlobalResponseBodyHandler implements ResponseBodyAdvice { + + @Override + @SuppressWarnings("NullableProblems") // 避免 IDEA 警告 + public boolean supports(MethodParameter returnType, Class converterType) { + if (returnType.getMethod() == null) { + return false; + } + // 只拦截返回结果为 CommonResult 类型 + return returnType.getMethod().getReturnType() == CommonResult.class; + } + + @Override + @SuppressWarnings("NullableProblems") // 避免 IDEA 警告 + public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, + ServerHttpRequest request, ServerHttpResponse response) { + // 记录 Controller 结果 + WebFrameworkUtils.setCommonResult(((ServletServerHttpRequest) request).getServletRequest(), (CommonResult) body); + return body; + } + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/util/WebFrameworkUtils.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/util/WebFrameworkUtils.java new file mode 100644 index 0000000..74f4f07 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/util/WebFrameworkUtils.java @@ -0,0 +1,85 @@ +package com.win.framework.web.core.util; + +import cn.hutool.core.util.NumberUtil; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.web.config.WebProperties; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.ServletRequest; +import javax.servlet.http.HttpServletRequest; + +/** + * 专属于 web 包的工具类 + * + * @author 闻荫源码 + */ +public class WebFrameworkUtils { + + private static final String REQUEST_ATTRIBUTE_LOGIN_USER_ID = "login_user_id"; + private static final String REQUEST_ATTRIBUTE_LOGIN_USER_TYPE = "login_user_type"; + + private static final String REQUEST_ATTRIBUTE_COMMON_RESULT = "common_result"; + + public static final String HEADER_TENANT_ID = "tenant-id"; + + private static WebProperties properties; + + public WebFrameworkUtils(WebProperties webProperties) { + WebFrameworkUtils.properties = webProperties; + } + + /** + * 获得租户编号,从 header 中 + * 考虑到其它 framework 组件也会使用到租户编号,所以不得不放在 WebFrameworkUtils 统一提供 + * + * @param request 请求 + * @return 租户编号 + */ + public static Long getTenantId(HttpServletRequest request) { + String tenantId = request.getHeader(HEADER_TENANT_ID); + return NumberUtil.isNumber(tenantId) ? Long.valueOf(tenantId) : null; + } + + public static void setLoginUserId(ServletRequest request, Long userId) { + request.setAttribute(REQUEST_ATTRIBUTE_LOGIN_USER_ID, userId); + } + + /** + * 获得当前用户的编号,从请求中 + * 注意:该方法仅限于 framework 框架使用!!! + * + * @param request 请求 + * @return 用户编号 + */ + public static Long getLoginUserId(HttpServletRequest request) { + if (request == null) { + return null; + } + return (Long) request.getAttribute(REQUEST_ATTRIBUTE_LOGIN_USER_ID); + } + + public static Long getLoginUserId() { + HttpServletRequest request = getRequest(); + return getLoginUserId(request); + } + + public static void setCommonResult(ServletRequest request, CommonResult result) { + request.setAttribute(REQUEST_ATTRIBUTE_COMMON_RESULT, result); + } + + public static CommonResult getCommonResult(ServletRequest request) { + return (CommonResult) request.getAttribute(REQUEST_ATTRIBUTE_COMMON_RESULT); + } + + public static HttpServletRequest getRequest() { + RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); + if (!(requestAttributes instanceof ServletRequestAttributes)) { + return null; + } + ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) requestAttributes; + return servletRequestAttributes.getRequest(); + } + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/package-info.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/package-info.java new file mode 100644 index 0000000..2c269be --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/package-info.java @@ -0,0 +1,4 @@ +/** + * 针对 SpringMVC 的基础封装 + */ +package com.win.framework.web; diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/config/WinXssAutoConfiguration.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/config/WinXssAutoConfiguration.java new file mode 100644 index 0000000..7ee743d --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/config/WinXssAutoConfiguration.java @@ -0,0 +1,61 @@ +package com.win.framework.xss.config; + +import com.win.framework.common.enums.WebFilterOrderEnum; +import com.win.framework.xss.core.clean.JsoupXssCleaner; +import com.win.framework.xss.core.clean.XssCleaner; +import com.win.framework.xss.core.filter.XssFilter; +import com.win.framework.xss.core.json.XssStringJsonDeserializer; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.util.PathMatcher; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import static com.win.framework.web.config.WinWebAutoConfiguration.createFilterBean; + +@AutoConfiguration +@EnableConfigurationProperties(XssProperties.class) +@ConditionalOnProperty(prefix = "win.xss", name = "enable", havingValue = "true", matchIfMissing = true) // 设置为 false 时,禁用 +public class WinXssAutoConfiguration implements WebMvcConfigurer { + + /** + * Xss 清理者 + * + * @return XssCleaner + */ + @Bean + @ConditionalOnMissingBean(XssCleaner.class) + public XssCleaner xssCleaner() { + return new JsoupXssCleaner(); + } + + /** + * 注册 Jackson 的序列化器,用于处理 json 类型参数的 xss 过滤 + * + * @return Jackson2ObjectMapperBuilderCustomizer + */ + @Bean + @ConditionalOnMissingBean(name = "xssJacksonCustomizer") + @ConditionalOnBean(ObjectMapper.class) + @ConditionalOnProperty(value = "win.xss.enable", havingValue = "true") + public Jackson2ObjectMapperBuilderCustomizer xssJacksonCustomizer(XssCleaner xssCleaner) { + // 在反序列化时进行 xss 过滤,可以替换使用 XssStringJsonSerializer,在序列化时进行处理 + return builder -> builder.deserializerByType(String.class, new XssStringJsonDeserializer(xssCleaner)); + } + + /** + * 创建 XssFilter Bean,解决 Xss 安全问题 + */ + @Bean + @ConditionalOnBean(XssCleaner.class) + public FilterRegistrationBean xssFilter(XssProperties properties, PathMatcher pathMatcher, XssCleaner xssCleaner) { + return createFilterBean(new XssFilter(properties, pathMatcher, xssCleaner), WebFilterOrderEnum.XSS_FILTER); + } + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/config/XssProperties.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/config/XssProperties.java new file mode 100644 index 0000000..4e3100a --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/config/XssProperties.java @@ -0,0 +1,29 @@ +package com.win.framework.xss.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.validation.annotation.Validated; + +import java.util.Collections; +import java.util.List; + +/** + * Xss 配置属性 + * + * @author 闻荫源码 + */ +@ConfigurationProperties(prefix = "win.xss") +@Validated +@Data +public class XssProperties { + + /** + * 是否开启,默认为 true + */ + private boolean enable = true; + /** + * 需要排除的 URL,默认为空 + */ + private List excludeUrls = Collections.emptyList(); + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/core/clean/JsoupXssCleaner.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/core/clean/JsoupXssCleaner.java new file mode 100644 index 0000000..12f77a6 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/core/clean/JsoupXssCleaner.java @@ -0,0 +1,64 @@ +package com.win.framework.xss.core.clean; + +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.safety.Safelist; + +/** + * 基于 JSONP 实现 XSS 过滤字符串 + */ +public class JsoupXssCleaner implements XssCleaner { + + private final Safelist safelist; + + /** + * 用于在 src 属性使用相对路径时,强制转换为绝对路径。 为空时不处理,值应为绝对路径的前缀(包含协议部分) + */ + private final String baseUri; + + /** + * 无参构造,默认使用 {@link JsoupXssCleaner#buildSafelist} 方法构建一个安全列表 + */ + public JsoupXssCleaner() { + this.safelist = buildSafelist(); + this.baseUri = ""; + } + + /** + * 构建一个 Xss 清理的 Safelist 规则。 + * 基于 Safelist#relaxed() 的基础上: + * 1. 扩展支持了 style 和 class 属性 + * 2. a 标签额外支持了 target 属性 + * 3. img 标签额外支持了 data 协议,便于支持 base64 + * + * @return Safelist + */ + private Safelist buildSafelist() { + // 使用 jsoup 提供的默认的 + Safelist relaxedSafelist = Safelist.relaxed(); + // 富文本编辑时一些样式是使用 style 来进行实现的 + // 比如红色字体 style="color:red;", 所以需要给所有标签添加 style 属性 + // 注意:style 属性会有注入风险 + relaxedSafelist.addAttributes(":all", "style", "class"); + // 保留 a 标签的 target 属性 + relaxedSafelist.addAttributes("a", "target"); + // 支持img 为base64 + relaxedSafelist.addProtocols("img", "src", "data"); + + // 保留相对路径, 保留相对路径时,必须提供对应的 baseUri 属性,否则依然会被删除 + // WHITELIST.preserveRelativeLinks(false); + + // 移除 a 标签和 img 标签的一些协议限制,这会导致 xss 防注入失效,如 + // 虽然可以重写 WhiteList#isSafeAttribute 来处理,但是有隐患,所以暂时不支持相对路径 + // WHITELIST.removeProtocols("a", "href", "ftp", "http", "https", "mailto"); + // WHITELIST.removeProtocols("img", "src", "http", "https"); + return relaxedSafelist; + } + + @Override + public String clean(String html) { + return Jsoup.clean(html, baseUri, safelist, new Document.OutputSettings().prettyPrint(false)); + } + +} + diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/core/clean/XssCleaner.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/core/clean/XssCleaner.java new file mode 100644 index 0000000..f9673a5 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/core/clean/XssCleaner.java @@ -0,0 +1,16 @@ +package com.win.framework.xss.core.clean; + +/** + * 对 html 文本中的有 Xss 风险的数据进行清理 + */ +public interface XssCleaner { + + /** + * 清理有 Xss 风险的文本 + * + * @param html 原 html + * @return 清理后的 html + */ + String clean(String html); + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/core/filter/XssFilter.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/core/filter/XssFilter.java new file mode 100644 index 0000000..65d5e7b --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/core/filter/XssFilter.java @@ -0,0 +1,52 @@ +package com.win.framework.xss.core.filter; + +import com.win.framework.xss.config.XssProperties; +import com.win.framework.xss.core.clean.XssCleaner; +import lombok.AllArgsConstructor; +import org.springframework.util.PathMatcher; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * Xss 过滤器 + * + * @author 闻荫源码 + */ +@AllArgsConstructor +public class XssFilter extends OncePerRequestFilter { + + /** + * 属性 + */ + private final XssProperties properties; + /** + * 路径匹配器 + */ + private final PathMatcher pathMatcher; + + private final XssCleaner xssCleaner; + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) + throws IOException, ServletException { + filterChain.doFilter(new XssRequestWrapper(request, xssCleaner), response); + } + + @Override + protected boolean shouldNotFilter(HttpServletRequest request) { + // 如果关闭,则不过滤 + if (!properties.isEnable()) { + return true; + } + + // 如果匹配到无需过滤,则不过滤 + String uri = request.getRequestURI(); + return properties.getExcludeUrls().stream().anyMatch(excludeUrl -> pathMatcher.match(excludeUrl, uri)); + } + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/core/filter/XssRequestWrapper.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/core/filter/XssRequestWrapper.java new file mode 100644 index 0000000..7a6781e --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/core/filter/XssRequestWrapper.java @@ -0,0 +1,92 @@ +package com.win.framework.xss.core.filter; + +import com.win.framework.xss.core.clean.XssCleaner; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * Xss 请求 Wrapper + * + * @author 闻荫源码 + */ +public class XssRequestWrapper extends HttpServletRequestWrapper { + + private final XssCleaner xssCleaner; + + public XssRequestWrapper(HttpServletRequest request, XssCleaner xssCleaner) { + super(request); + this.xssCleaner = xssCleaner; + } + + // ============================ parameter ============================ + @Override + public Map getParameterMap() { + Map map = new LinkedHashMap<>(); + Map parameters = super.getParameterMap(); + for (Map.Entry entry : parameters.entrySet()) { + String[] values = entry.getValue(); + for (int i = 0; i < values.length; i++) { + values[i] = xssCleaner.clean(values[i]); + } + map.put(entry.getKey(), values); + } + return map; + } + + @Override + public String[] getParameterValues(String name) { + String[] values = super.getParameterValues(name); + if (values == null) { + return null; + } + int count = values.length; + String[] encodedValues = new String[count]; + for (int i = 0; i < count; i++) { + encodedValues[i] = xssCleaner.clean(values[i]); + } + return encodedValues; + } + + @Override + public String getParameter(String name) { + String value = super.getParameter(name); + if (value == null) { + return null; + } + return xssCleaner.clean(value); + } + + // ============================ attribute ============================ + @Override + public Object getAttribute(String name) { + Object value = super.getAttribute(name); + if (value instanceof String) { + return xssCleaner.clean((String) value); + } + return value; + } + + // ============================ header ============================ + @Override + public String getHeader(String name) { + String value = super.getHeader(name); + if (value == null) { + return null; + } + return xssCleaner.clean(value); + } + + // ============================ queryString ============================ + @Override + public String getQueryString() { + String value = super.getQueryString(); + if (value == null) { + return null; + } + return xssCleaner.clean(value); + } + +} diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/core/json/XssStringJsonDeserializer.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/core/json/XssStringJsonDeserializer.java new file mode 100644 index 0000000..e557b5d --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/core/json/XssStringJsonDeserializer.java @@ -0,0 +1,59 @@ +package com.win.framework.xss.core.json; + +import com.win.framework.xss.core.clean.XssCleaner; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.deser.std.StringDeserializer; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import java.io.IOException; + +/** + * XSS 过滤 jackson 反序列化器。 + * 在反序列化的过程中,会对字符串进行 XSS 过滤。 + * + * @author Hccake + */ +@Slf4j +@AllArgsConstructor +public class XssStringJsonDeserializer extends StringDeserializer { + + private final XssCleaner xssCleaner; + + @Override + public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { + if (p.hasToken(JsonToken.VALUE_STRING)) { + return xssCleaner.clean(p.getText()); + } + JsonToken t = p.currentToken(); + // [databind#381] + if (t == JsonToken.START_ARRAY) { + return _deserializeFromArray(p, ctxt); + } + // need to gracefully handle byte[] data, as base64 + if (t == JsonToken.VALUE_EMBEDDED_OBJECT) { + Object ob = p.getEmbeddedObject(); + if (ob == null) { + return null; + } + if (ob instanceof byte[]) { + return ctxt.getBase64Variant().encode((byte[]) ob, false); + } + // otherwise, try conversion using toString()... + return ob.toString(); + } + // 29-Jun-2020, tatu: New! "Scalar from Object" (mostly for XML) + if (t == JsonToken.START_OBJECT) { + return ctxt.extractScalarFromObject(p, this, _valueClass); + } + + if (t.isScalarValue()) { + String text = p.getValueAsString(); + return xssCleaner.clean(text); + } + return (String) ctxt.handleUnexpectedToken(_valueClass, p); + } +} + diff --git a/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/package-info.java b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/package-info.java new file mode 100644 index 0000000..73558a0 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/package-info.java @@ -0,0 +1,6 @@ +/** + * 针对 XSS 的基础封装 + * + * XSS 说明:https://tech.meituan.com/2018/09/27/fe-security.html + */ +package com.win.framework.xss; diff --git a/win-framework/win-spring-boot-starter-web/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/win-framework/win-spring-boot-starter-web/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..ceafd46 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1,5 @@ +com.win.framework.apilog.config.WinApiLogAutoConfiguration +com.win.framework.jackson.config.WinJacksonAutoConfiguration +com.win.framework.swagger.config.WinSwaggerAutoConfiguration +com.win.framework.web.config.WinWebAutoConfiguration +com.win.framework.xss.config.WinXssAutoConfiguration diff --git a/win-framework/win-spring-boot-starter-websocket/pom.xml b/win-framework/win-spring-boot-starter-websocket/pom.xml new file mode 100644 index 0000000..07682de --- /dev/null +++ b/win-framework/win-spring-boot-starter-websocket/pom.xml @@ -0,0 +1,37 @@ + + + + com.win + win-framework + ${revision} + + 4.0.0 + win-spring-boot-starter-websocket + jar + + ${project.artifactId} + WebSocket + https://github.com/YunaiV/ruoyi-vue-pro + + + + + + com.win + win-common + + + + com.win + win-spring-boot-starter-security + + + + org.springframework.boot + spring-boot-starter-websocket + + + + \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/config/WebSocketHandlerConfig.java b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/config/WebSocketHandlerConfig.java new file mode 100644 index 0000000..34a8b87 --- /dev/null +++ b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/config/WebSocketHandlerConfig.java @@ -0,0 +1,14 @@ +package com.win.framework.websocket.config; + +import com.win.framework.websocket.core.UserHandshakeInterceptor; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.web.socket.server.HandshakeInterceptor; + +@EnableConfigurationProperties(WebSocketProperties.class) +public class WebSocketHandlerConfig { + @Bean + public HandshakeInterceptor handshakeInterceptor() { + return new UserHandshakeInterceptor(); + } +} diff --git a/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/config/WebSocketProperties.java b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/config/WebSocketProperties.java new file mode 100644 index 0000000..062ca7d --- /dev/null +++ b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/config/WebSocketProperties.java @@ -0,0 +1,29 @@ +package com.win.framework.websocket.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.validation.annotation.Validated; + +/** + * WebSocket 配置项 + * + * @author xingyu4j + */ +@ConfigurationProperties("win.websocket") +@Data +@Validated +public class WebSocketProperties { + + /** + * 路径 + */ + private String path = ""; + /** + * 默认最多允许同时在线用户数 + */ + private int maxOnlineCount = 0; + /** + * 是否保存session + */ + private boolean sessionMap = true; +} diff --git a/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/config/WinWebSocketAutoConfiguration.java b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/config/WinWebSocketAutoConfiguration.java new file mode 100644 index 0000000..2a2786a --- /dev/null +++ b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/config/WinWebSocketAutoConfiguration.java @@ -0,0 +1,34 @@ +package com.win.framework.websocket.config; + +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.web.socket.WebSocketHandler; +import org.springframework.web.socket.config.annotation.WebSocketConfigurer; +import org.springframework.web.socket.server.HandshakeInterceptor; + +import java.util.List; + +/** + * WebSocket 自动配置 + * + * @author xingyu4j + */ +@AutoConfiguration +// 允许使用 win.websocket.enable=false 禁用websocket +@ConditionalOnProperty(prefix = "win.websocket", value = "enable", matchIfMissing = true) +@EnableConfigurationProperties(WebSocketProperties.class) +public class WinWebSocketAutoConfiguration { + @Bean + @ConditionalOnMissingBean + public WebSocketConfigurer webSocketConfigurer(List handshakeInterceptor, + WebSocketHandler webSocketHandler, + WebSocketProperties webSocketProperties) { + + return registry -> registry + .addHandler(webSocketHandler, webSocketProperties.getPath()) + .addInterceptors(handshakeInterceptor.toArray(new HandshakeInterceptor[0])); + } +} diff --git a/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/UserHandshakeInterceptor.java b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/UserHandshakeInterceptor.java new file mode 100644 index 0000000..99ebe9b --- /dev/null +++ b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/UserHandshakeInterceptor.java @@ -0,0 +1,24 @@ +package com.win.framework.websocket.core; + +import com.win.framework.security.core.LoginUser; +import com.win.framework.security.core.util.SecurityFrameworkUtils; +import org.springframework.http.server.ServerHttpRequest; +import org.springframework.http.server.ServerHttpResponse; +import org.springframework.web.socket.WebSocketHandler; +import org.springframework.web.socket.server.HandshakeInterceptor; + +import java.util.Map; + +public class UserHandshakeInterceptor implements HandshakeInterceptor { + @Override + public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map attributes) throws Exception { + LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); + attributes.put(WebSocketKeyDefine.LOGIN_USER, loginUser); + return true; + } + + @Override + public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) { + + } +} diff --git a/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/WebSocketKeyDefine.java b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/WebSocketKeyDefine.java new file mode 100644 index 0000000..c8c3a20 --- /dev/null +++ b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/WebSocketKeyDefine.java @@ -0,0 +1,9 @@ +package com.win.framework.websocket.core; + + +import lombok.Data; + +@Data +public class WebSocketKeyDefine { + public static final String LOGIN_USER ="LOGIN_USER"; +} diff --git a/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/WebSocketMessageDO.java b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/WebSocketMessageDO.java new file mode 100644 index 0000000..ab5a97c --- /dev/null +++ b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/WebSocketMessageDO.java @@ -0,0 +1,24 @@ +package com.win.framework.websocket.core; + +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.List; + +@Data +@Accessors(chain = true) +public class WebSocketMessageDO { + /** + * 接收消息的seesion + */ + private List seesionKeyList; + /** + * 发送消息 + */ + private String msgText; + + public static WebSocketMessageDO build(List seesionKeyList, String msgText) { + return new WebSocketMessageDO().setMsgText(msgText).setSeesionKeyList(seesionKeyList); + } + +} diff --git a/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/WebSocketSessionHandler.java b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/WebSocketSessionHandler.java new file mode 100644 index 0000000..09e4dff --- /dev/null +++ b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/WebSocketSessionHandler.java @@ -0,0 +1,36 @@ +package com.win.framework.websocket.core; + +import org.springframework.web.socket.WebSocketSession; + +import java.util.Collection; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +public final class WebSocketSessionHandler { + private WebSocketSessionHandler() { + } + + private static final Map SESSION_MAP = new ConcurrentHashMap<>(); + + public static void addSession(Object sessionKey, WebSocketSession session) { + SESSION_MAP.put(sessionKey.toString(), session); + } + + public static void removeSession(Object sessionKey) { + SESSION_MAP.remove(sessionKey.toString()); + } + + public static WebSocketSession getSession(Object sessionKey) { + return SESSION_MAP.get(sessionKey.toString()); + } + + public static Collection getSessions() { + return SESSION_MAP.values(); + } + + public static Set getSessionKeys() { + return SESSION_MAP.keySet(); + } + +} diff --git a/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/WebSocketUtils.java b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/WebSocketUtils.java new file mode 100644 index 0000000..7f7809a --- /dev/null +++ b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/WebSocketUtils.java @@ -0,0 +1,31 @@ +package com.win.framework.websocket.core; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.socket.TextMessage; +import org.springframework.web.socket.WebSocketSession; + +import java.io.IOException; + +@Slf4j +public class WebSocketUtils { + public static boolean sendMessage(WebSocketSession seesion, String message) { + if (seesion == null) { + log.error("seesion 不存在"); + return false; + } + if (seesion.isOpen()) { + try { + seesion.sendMessage(new TextMessage(message)); + } catch (IOException e) { + log.error("WebSocket 消息发送异常 Session={} | msg= {} | exception={}", seesion, message, e); + return false; + } + } + return true; + } + + public static boolean sendMessage(Object sessionKey, String message) { + WebSocketSession session = WebSocketSessionHandler.getSession(sessionKey); + return sendMessage(session, message); + } +} diff --git a/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/WinWebSocketHandlerDecorator.java b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/WinWebSocketHandlerDecorator.java new file mode 100644 index 0000000..3505e70 --- /dev/null +++ b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/WinWebSocketHandlerDecorator.java @@ -0,0 +1,49 @@ +package com.win.framework.websocket.core; + +import com.win.framework.security.core.LoginUser; +import org.springframework.web.socket.CloseStatus; +import org.springframework.web.socket.WebSocketHandler; +import org.springframework.web.socket.WebSocketSession; +import org.springframework.web.socket.handler.WebSocketHandlerDecorator; + +public class WinWebSocketHandlerDecorator extends WebSocketHandlerDecorator { + public WinWebSocketHandlerDecorator(WebSocketHandler delegate) { + super(delegate); + } + + /** + * websocket 连接时执行的动作 + * @param session websocket session 对象 + * @throws Exception 异常对象 + */ + @Override + public void afterConnectionEstablished(final WebSocketSession session) throws Exception { + Object sessionKey = sessionKeyGen(session); + WebSocketSessionHandler.addSession(sessionKey, session); + } + + /** + * websocket 关闭连接时执行的动作 + * @param session websocket session 对象 + * @param closeStatus 关闭状态对象 + * @throws Exception 异常对象 + */ + @Override + public void afterConnectionClosed(final WebSocketSession session, CloseStatus closeStatus) throws Exception { + Object sessionKey = sessionKeyGen(session); + WebSocketSessionHandler.removeSession(sessionKey); + } + + public Object sessionKeyGen(WebSocketSession webSocketSession) { + + Object obj = webSocketSession.getAttributes().get(WebSocketKeyDefine.LOGIN_USER); + + if (obj instanceof LoginUser) { + LoginUser loginUser = (LoginUser) obj; + // userId 作为唯一区分 + return String.valueOf(loginUser.getId()); + } + + return null; + } +} diff --git a/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/package-info.java b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/package-info.java new file mode 100644 index 0000000..e60bb03 --- /dev/null +++ b/win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/package-info.java @@ -0,0 +1 @@ +package com.win.framework.websocket; diff --git a/win-framework/win-spring-boot-starter-websocket/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/win-framework/win-spring-boot-starter-websocket/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..21b10e0 --- /dev/null +++ b/win-framework/win-spring-boot-starter-websocket/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +com.win.framework.websocket.config.WinWebSocketAutoConfiguration \ No newline at end of file diff --git a/win-module-bpm/pom.xml b/win-module-bpm/pom.xml new file mode 100644 index 0000000..95bbb74 --- /dev/null +++ b/win-module-bpm/pom.xml @@ -0,0 +1,27 @@ + + + + win + com.win + ${revision} + + 4.0.0 + + win-module-bpm-api + win-module-bpm-biz + + win-module-bpm + pom + + ${project.artifactId} + + bpm 包下,业务流程管理(Business Process Management),我们放工作流的功能。 + 例如说:流程定义、表单配置、审核中心(我的申请、我的待办、我的已办)等等 + bpm 解释:https://baike.baidu.com/item/BPM/1933 + + 工作流基于 Flowable 6 实现,分成流程定义、流程表单、流程实例、流程任务等功能模块。 + + + diff --git a/win-module-bpm/win-module-bpm-api/pom.xml b/win-module-bpm/win-module-bpm-api/pom.xml new file mode 100644 index 0000000..79c96c1 --- /dev/null +++ b/win-module-bpm/win-module-bpm-api/pom.xml @@ -0,0 +1,33 @@ + + + + com.win + win-module-bpm + ${revision} + + 4.0.0 + win-module-bpm-api + jar + + ${project.artifactId} + + bpm 模块 API,暴露给其它模块调用 + + + + + com.win + win-common + + + + + org.springframework.boot + spring-boot-starter-validation + true + + + + diff --git a/win-module-bpm/win-module-bpm-api/src/main/java/com/win/module/bpm/api/package-info.java b/win-module-bpm/win-module-bpm-api/src/main/java/com/win/module/bpm/api/package-info.java new file mode 100644 index 0000000..6af3b56 --- /dev/null +++ b/win-module-bpm/win-module-bpm-api/src/main/java/com/win/module/bpm/api/package-info.java @@ -0,0 +1,4 @@ +/** + * bpm API 包,定义暴露给其它模块的 API + */ +package com.win.module.bpm.api; diff --git a/win-module-bpm/win-module-bpm-api/src/main/java/com/win/module/bpm/api/task/BpmProcessInstanceApi.java b/win-module-bpm/win-module-bpm-api/src/main/java/com/win/module/bpm/api/task/BpmProcessInstanceApi.java new file mode 100644 index 0000000..89c4db4 --- /dev/null +++ b/win-module-bpm/win-module-bpm-api/src/main/java/com/win/module/bpm/api/task/BpmProcessInstanceApi.java @@ -0,0 +1,23 @@ +package com.win.module.bpm.api.task; + +import com.win.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; + +import javax.validation.Valid; + +/** + * 流程实例 Api 接口 + * + * @author 闻荫源码 + */ +public interface BpmProcessInstanceApi { + + /** + * 创建流程实例(提供给内部) + * + * @param userId 用户编号 + * @param reqDTO 创建信息 + * @return 实例的编号 + */ + String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqDTO reqDTO); + +} diff --git a/win-module-bpm/win-module-bpm-api/src/main/java/com/win/module/bpm/api/task/dto/BpmProcessInstanceCreateReqDTO.java b/win-module-bpm/win-module-bpm-api/src/main/java/com/win/module/bpm/api/task/dto/BpmProcessInstanceCreateReqDTO.java new file mode 100644 index 0000000..8d0c204 --- /dev/null +++ b/win-module-bpm/win-module-bpm-api/src/main/java/com/win/module/bpm/api/task/dto/BpmProcessInstanceCreateReqDTO.java @@ -0,0 +1,33 @@ +package com.win.module.bpm.api.task.dto; + +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import java.util.Map; + +/** + * 流程实例的创建 Request DTO + * + * @author 闻荫源码 + */ +@Data +public class BpmProcessInstanceCreateReqDTO { + + /** + * 流程定义的标识 + */ + @NotEmpty(message = "流程定义的标识不能为空") + private String processDefinitionKey; + /** + * 变量实例 + */ + private Map variables; + + /** + * 业务的唯一标识 + * + * 例如说,请假申请的编号。通过它,可以查询到对应的实例 + */ + @NotEmpty(message = "业务的唯一标识") + private String businessKey; +} diff --git a/win-module-bpm/win-module-bpm-api/src/main/java/com/win/module/bpm/enums/DictTypeConstants.java b/win-module-bpm/win-module-bpm-api/src/main/java/com/win/module/bpm/enums/DictTypeConstants.java new file mode 100644 index 0000000..e7178a8 --- /dev/null +++ b/win-module-bpm/win-module-bpm-api/src/main/java/com/win/module/bpm/enums/DictTypeConstants.java @@ -0,0 +1,13 @@ +package com.win.module.bpm.enums; + +/** + * BPM 字典类型的枚举类 + * + * @author 闻荫源码 + */ +public interface DictTypeConstants { + + String TASK_ASSIGN_RULE_TYPE = "bpm_task_assign_rule_type"; // 任务分配规则类型 + String TASK_ASSIGN_SCRIPT = "bpm_task_assign_script"; // 任务分配自定义脚本 + +} diff --git a/win-module-bpm/win-module-bpm-api/src/main/java/com/win/module/bpm/enums/ErrorCodeConstants.java b/win-module-bpm/win-module-bpm-api/src/main/java/com/win/module/bpm/enums/ErrorCodeConstants.java new file mode 100644 index 0000000..8fb9ab5 --- /dev/null +++ b/win-module-bpm/win-module-bpm-api/src/main/java/com/win/module/bpm/enums/ErrorCodeConstants.java @@ -0,0 +1,64 @@ +package com.win.module.bpm.enums; + +import com.win.framework.common.exception.ErrorCode; + +/** + * Bpm 错误码枚举类 + * + * bpm 系统,使用 1-009-000-000 段 + */ +public interface ErrorCodeConstants { + + // ========== 通用流程处理 模块 1-009-000-000 ========== + ErrorCode HIGHLIGHT_IMG_ERROR = new ErrorCode(1_009_000_002, "获取高亮流程图异常"); + + // ========== OA 流程模块 1-009-001-000 ========== + ErrorCode OA_LEAVE_NOT_EXISTS = new ErrorCode(1_009_001_001, "请假申请不存在"); + ErrorCode OA_PM_POST_NOT_EXISTS = new ErrorCode(1_009_001_002, "项目经理岗位未设置"); + ErrorCode OA_DEPART_PM_POST_NOT_EXISTS = new ErrorCode(1_009_001_009, "部门的项目经理不存在"); + ErrorCode OA_BM_POST_NOT_EXISTS = new ErrorCode(1_009_001_004, "部门经理岗位未设置"); + ErrorCode OA_DEPART_BM_POST_NOT_EXISTS = new ErrorCode(1_009_001_005, "部门的部门经理不存在"); + ErrorCode OA_HR_POST_NOT_EXISTS = new ErrorCode(1_009_001_006, "HR岗位未设置"); + ErrorCode OA_DAY_LEAVE_ERROR = new ErrorCode(1_009_001_007, "请假天数必须>=1"); + + // ========== 流程模型 1-009-002-000 ========== + ErrorCode MODEL_KEY_EXISTS = new ErrorCode(1_009_002_000, "已经存在流程标识为【{}】的流程"); + ErrorCode MODEL_NOT_EXISTS = new ErrorCode(1_009_002_001, "流程模型不存在"); + ErrorCode MODEL_KEY_VALID = new ErrorCode(1_009_002_002, "流程标识格式不正确,需要以字母或下划线开头,后接任意字母、数字、中划线、下划线、句点!"); + ErrorCode MODEL_DEPLOY_FAIL_FORM_NOT_CONFIG = new ErrorCode(1_009_002_003, "部署流程失败,原因:流程表单未配置,请点击【修改流程】按钮进行配置"); + ErrorCode MODEL_DEPLOY_FAIL_TASK_ASSIGN_RULE_NOT_CONFIG = new ErrorCode(1_009_002_004, "部署流程失败," + + "原因:用户任务({})未配置分配规则,请点击【修改流程】按钮进行配置"); + ErrorCode MODEL_DEPLOY_FAIL_TASK_INFO_EQUALS = new ErrorCode(1_009_003_005, "流程定义部署失败,原因:信息未发生变化"); + + // ========== 流程定义 1-009-003-000 ========== + ErrorCode PROCESS_DEFINITION_KEY_NOT_MATCH = new ErrorCode(1_009_003_000, "流程定义的标识期望是({}),当前是({}),请修改 BPMN 流程图"); + ErrorCode PROCESS_DEFINITION_NAME_NOT_MATCH = new ErrorCode(1_009_003_001, "流程定义的名字期望是({}),当前是({}),请修改 BPMN 流程图"); + ErrorCode PROCESS_DEFINITION_NOT_EXISTS = new ErrorCode(1_009_003_002, "流程定义不存在"); + ErrorCode PROCESS_DEFINITION_IS_SUSPENDED = new ErrorCode(1_009_003_003, "流程定义处于挂起状态"); + ErrorCode PROCESS_DEFINITION_BPMN_MODEL_NOT_EXISTS = new ErrorCode(1_009_003_004, "流程定义的模型不存在"); + + // ========== 流程实例 1-009-004-000 ========== + ErrorCode PROCESS_INSTANCE_NOT_EXISTS = new ErrorCode(1_009_004_000, "流程实例不存在"); + ErrorCode PROCESS_INSTANCE_CANCEL_FAIL_NOT_EXISTS = new ErrorCode(1_009_004_001, "流程取消失败,流程不处于运行中"); + ErrorCode PROCESS_INSTANCE_CANCEL_FAIL_NOT_SELF = new ErrorCode(1_009_004_002, "流程取消失败,该流程不是你发起的"); + + // ========== 流程任务 1-009-005-000 ========== + ErrorCode TASK_COMPLETE_FAIL_NOT_EXISTS = new ErrorCode(1_009_005_000, "审批任务失败,原因:该任务不处于未审批"); + ErrorCode TASK_COMPLETE_FAIL_ASSIGN_NOT_SELF = new ErrorCode(1_009_005_001, "审批任务失败,原因:该任务的审批人不是你"); + + // ========== 流程任务分配规则 1-009-006-000 ========== + ErrorCode TASK_ASSIGN_RULE_EXISTS = new ErrorCode(1_009_006_000, "流程({}) 的任务({}) 已经存在分配规则"); + ErrorCode TASK_ASSIGN_RULE_NOT_EXISTS = new ErrorCode(1_009_006_001, "流程任务分配规则不存在"); + ErrorCode TASK_UPDATE_FAIL_NOT_MODEL = new ErrorCode(1_009_006_002, "只有流程模型的任务分配规则,才允许被修改"); + ErrorCode TASK_CREATE_FAIL_NO_CANDIDATE_USER = new ErrorCode(1_009_006_003, "操作失败,原因:找不到任务的审批人!"); + ErrorCode TASK_ASSIGN_SCRIPT_NOT_EXISTS = new ErrorCode(1_009_006_004, "操作失败,原因:任务分配脚本({}) 不存在"); + + // ========== 动态表单模块 1-009-010-000 ========== + ErrorCode FORM_NOT_EXISTS = new ErrorCode(1_009_010_000, "动态表单不存在"); + ErrorCode FORM_FIELD_REPEAT = new ErrorCode(1_009_010_001, "表单项({}) 和 ({}) 使用了相同的字段名({})"); + + // ========== 用户组模块 1-009-011-000 ========== + ErrorCode USER_GROUP_NOT_EXISTS = new ErrorCode(1_009_011_000, "用户组不存在"); + ErrorCode USER_GROUP_IS_DISABLE = new ErrorCode(1_009_011_001, "名字为【{}】的用户组已被禁用"); + +} diff --git a/win-module-bpm/win-module-bpm-api/src/main/java/com/win/module/bpm/enums/definition/BpmModelFormTypeEnum.java b/win-module-bpm/win-module-bpm-api/src/main/java/com/win/module/bpm/enums/definition/BpmModelFormTypeEnum.java new file mode 100644 index 0000000..55ec36b --- /dev/null +++ b/win-module-bpm/win-module-bpm-api/src/main/java/com/win/module/bpm/enums/definition/BpmModelFormTypeEnum.java @@ -0,0 +1,21 @@ +package com.win.module.bpm.enums.definition; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * BPM 模型的表单类型的枚举 + * + * @author 闻荫源码 + */ +@Getter +@AllArgsConstructor +public enum BpmModelFormTypeEnum { + + NORMAL(10, "流程表单"), // 对应 BpmFormDO + CUSTOM(20, "业务表单") // 业务自己定义的表单,自己进行数据的存储 + ; + + private final Integer type; + private final String desc; +} diff --git a/win-module-bpm/win-module-bpm-api/src/main/java/com/win/module/bpm/enums/definition/BpmTaskAssignRuleTypeEnum.java b/win-module-bpm/win-module-bpm-api/src/main/java/com/win/module/bpm/enums/definition/BpmTaskAssignRuleTypeEnum.java new file mode 100644 index 0000000..cfd935e --- /dev/null +++ b/win-module-bpm/win-module-bpm-api/src/main/java/com/win/module/bpm/enums/definition/BpmTaskAssignRuleTypeEnum.java @@ -0,0 +1,33 @@ +package com.win.module.bpm.enums.definition; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * BPM 任务分配规则的类型枚举 + * + * @author 闻荫源码 + */ +@Getter +@AllArgsConstructor +public enum BpmTaskAssignRuleTypeEnum { + + ROLE(10, "角色"), + DEPT_MEMBER(20, "部门的成员"), // 包括负责人 + DEPT_LEADER(21, "部门的负责人"), + POST(22, "岗位"), + USER(30, "用户"), + USER_GROUP(40, "用户组"), + SCRIPT(50, "自定义脚本"), // 例如说,发起人所在部门的领导、发起人所在部门的领导的领导 + ; + + /** + * 类型 + */ + private final Integer type; + /** + * 描述 + */ + private final String desc; + +} diff --git a/win-module-bpm/win-module-bpm-api/src/main/java/com/win/module/bpm/enums/definition/BpmTaskRuleScriptEnum.java b/win-module-bpm/win-module-bpm-api/src/main/java/com/win/module/bpm/enums/definition/BpmTaskRuleScriptEnum.java new file mode 100644 index 0000000..2afcaca --- /dev/null +++ b/win-module-bpm/win-module-bpm-api/src/main/java/com/win/module/bpm/enums/definition/BpmTaskRuleScriptEnum.java @@ -0,0 +1,30 @@ +package com.win.module.bpm.enums.definition; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * BPM 任务规则的脚本枚举 + * 目前暂时通过 TODO 芋艿:硬编码,未来可以考虑 Groovy 动态脚本的方式 + * + * @author 闻荫源码 + */ +@Getter +@AllArgsConstructor +public enum BpmTaskRuleScriptEnum { + + START_USER(10L, "流程发起人"), + + LEADER_X1(20L, "流程发起人的一级领导"), + LEADER_X2(21L, "流程发起人的二级领导"); + + /** + * 脚本编号 + */ + private final Long id; + /** + * 脚本描述 + */ + private final String desc; + +} diff --git a/win-module-bpm/win-module-bpm-api/src/main/java/com/win/module/bpm/enums/message/BpmMessageEnum.java b/win-module-bpm/win-module-bpm-api/src/main/java/com/win/module/bpm/enums/message/BpmMessageEnum.java new file mode 100644 index 0000000..35256dc --- /dev/null +++ b/win-module-bpm/win-module-bpm-api/src/main/java/com/win/module/bpm/enums/message/BpmMessageEnum.java @@ -0,0 +1,26 @@ +package com.win.module.bpm.enums.message; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * Bpm 消息的枚举 + * + * @author 闻荫源码 + */ +@AllArgsConstructor +@Getter +public enum BpmMessageEnum { + + PROCESS_INSTANCE_APPROVE("bpm_process_instance_approve"), // 流程任务被审批通过时,发送给申请人 + PROCESS_INSTANCE_REJECT("bpm_process_instance_reject"), // 流程任务被审批不通过时,发送给申请人 + TASK_ASSIGNED("bpm_task_assigned"); // 任务被分配时,发送给审批人 + + /** + * 短信模板的标识 + * + * 关联 SmsTemplateDO 的 code 属性 + */ + private final String smsTemplateCode; + +} diff --git a/win-module-bpm/win-module-bpm-api/src/main/java/com/win/module/bpm/enums/task/BpmProcessInstanceDeleteReasonEnum.java b/win-module-bpm/win-module-bpm-api/src/main/java/com/win/module/bpm/enums/task/BpmProcessInstanceDeleteReasonEnum.java new file mode 100644 index 0000000..b76568f --- /dev/null +++ b/win-module-bpm/win-module-bpm-api/src/main/java/com/win/module/bpm/enums/task/BpmProcessInstanceDeleteReasonEnum.java @@ -0,0 +1,58 @@ +package com.win.module.bpm.enums.task; + +import cn.hutool.core.util.StrUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 流程实例的删除原因 + * + * @author 闻荫源码 + */ +@Getter +@AllArgsConstructor +public enum BpmProcessInstanceDeleteReasonEnum { + + REJECT_TASK("不通过任务,原因:{}"), // 修改文案时,需要注意 isRejectReason 方法 + CANCEL_TASK("主动取消任务,原因:{}"), + + // ========== 流程任务的独有原因 ========== + MULTI_TASK_END("系统自动取消,原因:多任务审批已经满足条件,无需审批该任务"), // 多实例满足 condition 而结束时,其它任务实例任务会被取消,对应的删除原因是 MI_END + + ; + + private final String reason; + + /** + * 格式化理由 + * + * @param args 参数 + * @return 理由 + */ + public String format(Object... args) { + return StrUtil.format(reason, args); + } + + // ========== 逻辑 ========== + + public static boolean isRejectReason(String reason) { + return StrUtil.startWith(reason, "不通过任务,原因:"); + } + + /** + * 将 Flowable 的删除原因,翻译成对应的中文原因 + * + * @param reason 原始原因 + * @return 原因 + */ + public static String translateReason(String reason) { + if (StrUtil.isEmpty(reason)) { + return reason; + } + switch (reason) { + case "MI_END": return MULTI_TASK_END.getReason(); + default: return reason; + } + } + +} diff --git a/win-module-bpm/win-module-bpm-api/src/main/java/com/win/module/bpm/enums/task/BpmProcessInstanceResultEnum.java b/win-module-bpm/win-module-bpm-api/src/main/java/com/win/module/bpm/enums/task/BpmProcessInstanceResultEnum.java new file mode 100644 index 0000000..b6b0fcb --- /dev/null +++ b/win-module-bpm/win-module-bpm-api/src/main/java/com/win/module/bpm/enums/task/BpmProcessInstanceResultEnum.java @@ -0,0 +1,48 @@ +package com.win.module.bpm.enums.task; + +import com.win.framework.common.util.object.ObjectUtils; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 流程实例的结果 + * + * @author jason + */ +@Getter +@AllArgsConstructor +public enum BpmProcessInstanceResultEnum { + + PROCESS(1, "处理中"), + APPROVE(2, "通过"), + REJECT(3, "不通过"), + CANCEL(4, "已取消"), + + // ========== 流程任务独有的状态 ========== + + BACK(5, "退回/驳回"); + + /** + * 结果 + * + * 如果新增时,注意 {@link #isEndResult(Integer)} 是否需要变更 + */ + private final Integer result; + /** + * 描述 + */ + private final String desc; + + /** + * 判断该结果是否已经处于 End 最终结果 + * + * 主要用于一些结果更新的逻辑,如果已经是最终结果,就不再进行更新 + * + * @param result 结果 + * @return 是否 + */ + public static boolean isEndResult(Integer result) { + return ObjectUtils.equalsAny(result, APPROVE.getResult(), REJECT.getResult(), CANCEL.getResult(), BACK.getResult()); + } + +} diff --git a/win-module-bpm/win-module-bpm-api/src/main/java/com/win/module/bpm/enums/task/BpmProcessInstanceStatusEnum.java b/win-module-bpm/win-module-bpm-api/src/main/java/com/win/module/bpm/enums/task/BpmProcessInstanceStatusEnum.java new file mode 100644 index 0000000..6196a37 --- /dev/null +++ b/win-module-bpm/win-module-bpm-api/src/main/java/com/win/module/bpm/enums/task/BpmProcessInstanceStatusEnum.java @@ -0,0 +1,27 @@ +package com.win.module.bpm.enums.task; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 流程实例的状态 + * + * @author 闻荫源码 + */ +@Getter +@AllArgsConstructor +public enum BpmProcessInstanceStatusEnum { + + RUNNING(1, "进行中"), + FINISH(2, "已完成"); + + /** + * 状态 + */ + private final Integer status; + /** + * 描述 + */ + private final String desc; + +} diff --git a/win-module-bpm/win-module-bpm-biz/pom.xml b/win-module-bpm/win-module-bpm-biz/pom.xml new file mode 100644 index 0000000..c22e6fe --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/pom.xml @@ -0,0 +1,72 @@ + + + + com.win + win-module-bpm + ${revision} + + 4.0.0 + win-module-bpm-biz + + ${project.artifactId} + + bpm 包下,业务流程管理(Business Process Management),我们放工作流的功能,基于 Flowable 6 版本实现。 + 例如说:流程定义、表单配置、审核中心(我的申请、我的待办、我的已办)等等 + + + + com.win + win-module-bpm-api + ${revision} + + + com.win + win-module-system-api + ${revision} + + + + + com.win + win-spring-boot-starter-biz-operatelog + + + com.win + win-spring-boot-starter-biz-data-permission + + + com.win + win-spring-boot-starter-biz-tenant + + + + + com.win + win-spring-boot-starter-web + + + + com.win + win-spring-boot-starter-security + + + + + com.win + win-spring-boot-starter-mybatis + + + + + com.win + win-spring-boot-starter-test + + + + com.win + win-spring-boot-starter-flowable + + + diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/api/package-info.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/api/package-info.java new file mode 100644 index 0000000..a9eba17 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/api/package-info.java @@ -0,0 +1,4 @@ +/** + * bpm API 实现类,定义暴露给其它模块的 API + */ +package com.win.module.bpm.api; diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/api/task/BpmProcessInstanceApiImpl.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/api/task/BpmProcessInstanceApiImpl.java new file mode 100644 index 0000000..dd7d78c --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/api/task/BpmProcessInstanceApiImpl.java @@ -0,0 +1,28 @@ +package com.win.module.bpm.api.task; + +import com.win.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; +import com.win.module.bpm.service.task.BpmProcessInstanceService; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import javax.validation.Valid; + +/** + * Flowable 流程实例 Api 实现类 + * + * @author 闻荫源码 + * @author jason + */ +@Service +@Validated +public class BpmProcessInstanceApiImpl implements BpmProcessInstanceApi { + + @Resource + private BpmProcessInstanceService processInstanceService; + + @Override + public String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqDTO reqDTO) { + return processInstanceService.createProcessInstance(userId, reqDTO); + } +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/BpmFormController.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/BpmFormController.java new file mode 100644 index 0000000..39bd8d6 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/BpmFormController.java @@ -0,0 +1,79 @@ +package com.win.module.bpm.controller.definition; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.module.bpm.controller.definition.vo.form.*; +import com.win.module.bpm.convert.definition.BpmFormConvert; +import com.win.module.bpm.dal.dataobject.definition.BpmFormDO; +import com.win.module.bpm.service.definition.BpmFormService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.List; + +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 动态表单") +@RestController +@RequestMapping("/bpm/form") +@Validated +public class BpmFormController { + + @Resource + private BpmFormService formService; + + @PostMapping("/create") + @Operation(summary = "创建动态表单") + @PreAuthorize("@ss.hasPermission('bpm:form:create')") + public CommonResult createForm(@Valid @RequestBody BpmFormCreateReqVO createReqVO) { + return success(formService.createForm(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新动态表单") + @PreAuthorize("@ss.hasPermission('bpm:form:update')") + public CommonResult updateForm(@Valid @RequestBody BpmFormUpdateReqVO updateReqVO) { + formService.updateForm(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除动态表单") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('bpm:form:delete')") + public CommonResult deleteForm(@RequestParam("id") Long id) { + formService.deleteForm(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得动态表单") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('bpm:form:query')") + public CommonResult getForm(@RequestParam("id") Long id) { + BpmFormDO form = formService.getForm(id); + return success(BpmFormConvert.INSTANCE.convert(form)); + } + + @GetMapping("/list-all-simple") + @Operation(summary = "获得动态表单的精简列表", description = "用于表单下拉框") + public CommonResult> getSimpleForms() { + List list = formService.getFormList(); + return success(BpmFormConvert.INSTANCE.convertList2(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得动态表单分页") + @PreAuthorize("@ss.hasPermission('bpm:form:query')") + public CommonResult> getFormPage(@Valid BpmFormPageReqVO pageVO) { + PageResult pageResult = formService.getFormPage(pageVO); + return success(BpmFormConvert.INSTANCE.convertPage(pageResult)); + } + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/BpmModelController.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/BpmModelController.java new file mode 100644 index 0000000..20ed92f --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/BpmModelController.java @@ -0,0 +1,96 @@ +package com.win.module.bpm.controller.definition; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.io.IoUtils; +import com.win.module.bpm.controller.definition.vo.model.*; +import com.win.module.bpm.convert.definition.BpmModelConvert; +import com.win.module.bpm.service.definition.BpmModelService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.io.IOException; + +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 流程模型") +@RestController +@RequestMapping("/bpm/model") +@Validated +public class BpmModelController { + + @Resource + private BpmModelService modelService; + + @GetMapping("/page") + @Operation(summary = "获得模型分页") + public CommonResult> getModelPage(BpmModelPageReqVO pageVO) { + return success(modelService.getModelPage(pageVO)); + } + + @GetMapping("/get") + @Operation(summary = "获得模型") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('bpm:model:query')") + public CommonResult getModel(@RequestParam("id") String id) { + BpmModelRespVO model = modelService.getModel(id); + return success(model); + } + + @PostMapping("/create") + @Operation(summary = "新建模型") + @PreAuthorize("@ss.hasPermission('bpm:model:create')") + public CommonResult createModel(@Valid @RequestBody BpmModelCreateReqVO createRetVO) { + return success(modelService.createModel(createRetVO, null)); + } + + @PutMapping("/update") + @Operation(summary = "修改模型") + @PreAuthorize("@ss.hasPermission('bpm:model:update')") + public CommonResult updateModel(@Valid @RequestBody BpmModelUpdateReqVO modelVO) { + modelService.updateModel(modelVO); + return success(true); + } + + @PostMapping("/import") + @Operation(summary = "导入模型") + @PreAuthorize("@ss.hasPermission('bpm:model:import')") + public CommonResult importModel(@Valid BpmModeImportReqVO importReqVO) throws IOException { + BpmModelCreateReqVO createReqVO = BpmModelConvert.INSTANCE.convert(importReqVO); + // 读取文件 + String bpmnXml = IoUtils.readUtf8(importReqVO.getBpmnFile().getInputStream(), false); + return success(modelService.createModel(createReqVO, bpmnXml)); + } + + @PostMapping("/deploy") + @Operation(summary = "部署模型") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('bpm:model:deploy')") + public CommonResult deployModel(@RequestParam("id") String id) { + modelService.deployModel(id); + return success(true); + } + + @PutMapping("/update-state") + @Operation(summary = "修改模型的状态", description = "实际更新的部署的流程定义的状态") + @PreAuthorize("@ss.hasPermission('bpm:model:update')") + public CommonResult updateModelState(@Valid @RequestBody BpmModelUpdateStateReqVO reqVO) { + modelService.updateModelState(reqVO.getId(), reqVO.getState()); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除模型") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('bpm:model:delete')") + public CommonResult deleteModel(@RequestParam("id") String id) { + modelService.deleteModel(id); + return success(true); + } +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/BpmProcessDefinitionController.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/BpmProcessDefinitionController.java new file mode 100644 index 0000000..bce2365 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/BpmProcessDefinitionController.java @@ -0,0 +1,59 @@ +package com.win.module.bpm.controller.definition; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.module.bpm.controller.definition.vo.process.BpmProcessDefinitionListReqVO; +import com.win.module.bpm.controller.definition.vo.process.BpmProcessDefinitionPageItemRespVO; +import com.win.module.bpm.controller.definition.vo.process.BpmProcessDefinitionPageReqVO; +import com.win.module.bpm.controller.definition.vo.process.BpmProcessDefinitionRespVO; +import com.win.module.bpm.service.definition.BpmProcessDefinitionService; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +import java.util.List; + +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 流程定义") +@RestController +@RequestMapping("/bpm/process-definition") +@Validated +public class BpmProcessDefinitionController { + + @Resource + private BpmProcessDefinitionService bpmDefinitionService; + + @GetMapping("/page") + @Operation(summary = "获得流程定义分页") + @PreAuthorize("@ss.hasPermission('bpm:process-definition:query')") + public CommonResult> getProcessDefinitionPage( + BpmProcessDefinitionPageReqVO pageReqVO) { + return success(bpmDefinitionService.getProcessDefinitionPage(pageReqVO)); + } + + @GetMapping ("/list") + @Operation(summary = "获得流程定义列表") + @PreAuthorize("@ss.hasPermission('bpm:process-definition:query')") + public CommonResult> getProcessDefinitionList( + BpmProcessDefinitionListReqVO listReqVO) { + return success(bpmDefinitionService.getProcessDefinitionList(listReqVO)); + } + + @GetMapping ("/get-bpmn-xml") + @Operation(summary = "获得流程定义的 BPMN XML") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('bpm:process-definition:query')") + public CommonResult getProcessDefinitionBpmnXML(@RequestParam("id") String id) { + String bpmnXML = bpmDefinitionService.getProcessDefinitionBpmnXML(id); + return success(bpmnXML); + } +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/BpmTaskAssignRuleController.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/BpmTaskAssignRuleController.java new file mode 100644 index 0000000..17538c2 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/BpmTaskAssignRuleController.java @@ -0,0 +1,58 @@ +package com.win.module.bpm.controller.definition; + +import com.win.framework.common.pojo.CommonResult; +import com.win.module.bpm.controller.definition.vo.rule.BpmTaskAssignRuleCreateReqVO; +import com.win.module.bpm.controller.definition.vo.rule.BpmTaskAssignRuleRespVO; +import com.win.module.bpm.controller.definition.vo.rule.BpmTaskAssignRuleUpdateReqVO; +import com.win.module.bpm.service.definition.BpmTaskAssignRuleService; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.Operation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.List; + +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 任务分配规则") +@RestController +@RequestMapping("/bpm/task-assign-rule") +@Validated +public class BpmTaskAssignRuleController { + + @Resource + private BpmTaskAssignRuleService taskAssignRuleService; + + @GetMapping("/list") + @Operation(summary = "获得任务分配规则列表") + @Parameters({ + @Parameter(name = "modelId", description = "模型编号", example = "1024"), + @Parameter(name = "processDefinitionId", description = "流程定义的编号", example = "2048") + }) + @PreAuthorize("@ss.hasPermission('bpm:task-assign-rule:query')") + public CommonResult> getTaskAssignRuleList( + @RequestParam(value = "modelId", required = false) String modelId, + @RequestParam(value = "processDefinitionId", required = false) String processDefinitionId) { + return success(taskAssignRuleService.getTaskAssignRuleList(modelId, processDefinitionId)); + } + + @PostMapping("/create") + @Operation(summary = "创建任务分配规则") + @PreAuthorize("@ss.hasPermission('bpm:task-assign-rule:create')") + public CommonResult createTaskAssignRule(@Valid @RequestBody BpmTaskAssignRuleCreateReqVO reqVO) { + return success(taskAssignRuleService.createTaskAssignRule(reqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新任务分配规则") + @PreAuthorize("@ss.hasPermission('bpm:task-assign-rule:update')") + public CommonResult updateTaskAssignRule(@Valid @RequestBody BpmTaskAssignRuleUpdateReqVO reqVO) { + taskAssignRuleService.updateTaskAssignRule(reqVO); + return success(true); + } +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/BpmUserGroupController.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/BpmUserGroupController.java new file mode 100644 index 0000000..49f263d --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/BpmUserGroupController.java @@ -0,0 +1,85 @@ +package com.win.module.bpm.controller.definition; + +import com.win.module.bpm.controller.definition.vo.group.BpmUserGroupCreateReqVO; +import com.win.module.bpm.controller.definition.vo.group.BpmUserGroupPageReqVO; +import com.win.module.bpm.controller.definition.vo.group.BpmUserGroupRespVO; +import com.win.module.bpm.controller.definition.vo.group.BpmUserGroupUpdateReqVO; +import com.win.module.bpm.convert.definition.BpmUserGroupConvert; +import com.win.module.bpm.dal.dataobject.definition.BpmUserGroupDO; +import com.win.module.bpm.service.definition.BpmUserGroupService; +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.List; + +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 用户组") +@RestController +@RequestMapping("/bpm/user-group") +@Validated +public class BpmUserGroupController { + + @Resource + private BpmUserGroupService userGroupService; + + @PostMapping("/create") + @Operation(summary = "创建用户组") + @PreAuthorize("@ss.hasPermission('bpm:user-group:create')") + public CommonResult createUserGroup(@Valid @RequestBody BpmUserGroupCreateReqVO createReqVO) { + return success(userGroupService.createUserGroup(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新用户组") + @PreAuthorize("@ss.hasPermission('bpm:user-group:update')") + public CommonResult updateUserGroup(@Valid @RequestBody BpmUserGroupUpdateReqVO updateReqVO) { + userGroupService.updateUserGroup(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除用户组") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('bpm:user-group:delete')") + public CommonResult deleteUserGroup(@RequestParam("id") Long id) { + userGroupService.deleteUserGroup(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得用户组") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('bpm:user-group:query')") + public CommonResult getUserGroup(@RequestParam("id") Long id) { + BpmUserGroupDO userGroup = userGroupService.getUserGroup(id); + return success(BpmUserGroupConvert.INSTANCE.convert(userGroup)); + } + + @GetMapping("/page") + @Operation(summary = "获得用户组分页") + @PreAuthorize("@ss.hasPermission('bpm:user-group:query')") + public CommonResult> getUserGroupPage(@Valid BpmUserGroupPageReqVO pageVO) { + PageResult pageResult = userGroupService.getUserGroupPage(pageVO); + return success(BpmUserGroupConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/list-all-simple") + @Operation(summary = "获取用户组精简信息列表", description = "只包含被开启的用户组,主要用于前端的下拉选项") + public CommonResult> getSimpleUserGroups() { + // 获用户门列表,只要开启状态的 + List list = userGroupService.getUserGroupListByStatus(CommonStatusEnum.ENABLE.getStatus()); + // 排序后,返回给前端 + return success(BpmUserGroupConvert.INSTANCE.convertList2(list)); + } + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/form/BpmFormBaseVO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/form/BpmFormBaseVO.java new file mode 100644 index 0000000..9eae7a8 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/form/BpmFormBaseVO.java @@ -0,0 +1,24 @@ +package com.win.module.bpm.controller.definition.vo.form; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import javax.validation.constraints.*; + +/** +* 动态表单 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class BpmFormBaseVO { + + @Schema(description = "表单名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "闻荫") + @NotNull(message = "表单名称不能为空") + private String name; + + @Schema(description = "表单状态-参见 CommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "表单状态不能为空") + private Integer status; + + @Schema(description = "备注", example = "我是备注") + private String remark; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/form/BpmFormCreateReqVO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/form/BpmFormCreateReqVO.java new file mode 100644 index 0000000..7dc20e8 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/form/BpmFormCreateReqVO.java @@ -0,0 +1,22 @@ +package com.win.module.bpm.controller.definition.vo.form; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import javax.validation.constraints.NotNull; +import java.util.List; + +@Schema(description = "管理后台 - 动态表单创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class BpmFormCreateReqVO extends BpmFormBaseVO { + + @Schema(description = "表单的配置-JSON 字符串", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "表单的配置不能为空") + private String conf; + + @Schema(description = "表单项的数组-JSON 字符串的数组", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "表单项的数组不能为空") + private List fields; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/form/BpmFormPageReqVO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/form/BpmFormPageReqVO.java new file mode 100644 index 0000000..81dceb5 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/form/BpmFormPageReqVO.java @@ -0,0 +1,18 @@ +package com.win.module.bpm.controller.definition.vo.form; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Schema(description = "管理后台 - 动态表单分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class BpmFormPageReqVO extends PageParam { + + @Schema(description = "表单名称", example = "闻荫") + private String name; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/form/BpmFormRespVO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/form/BpmFormRespVO.java new file mode 100644 index 0000000..457182c --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/form/BpmFormRespVO.java @@ -0,0 +1,31 @@ +package com.win.module.bpm.controller.definition.vo.form; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; +import java.util.List; + +@Schema(description = "管理后台 - 动态表单 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class BpmFormRespVO extends BpmFormBaseVO { + + @Schema(description = "表单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "表单的配置-JSON 字符串", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "表单的配置不能为空") + private String conf; + + @Schema(description = "表单项的数组-JSON 字符串的数组", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "表单项的数组不能为空") + private List fields; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/form/BpmFormSimpleRespVO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/form/BpmFormSimpleRespVO.java new file mode 100644 index 0000000..8605788 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/form/BpmFormSimpleRespVO.java @@ -0,0 +1,16 @@ +package com.win.module.bpm.controller.definition.vo.form; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 流程表单精简 Response VO") +@Data +public class BpmFormSimpleRespVO { + + @Schema(description = "表单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "表单名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "闻荫") + private String name; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/form/BpmFormUpdateReqVO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/form/BpmFormUpdateReqVO.java new file mode 100644 index 0000000..7a99250 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/form/BpmFormUpdateReqVO.java @@ -0,0 +1,25 @@ +package com.win.module.bpm.controller.definition.vo.form; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import javax.validation.constraints.*; +import java.util.List; + +@Schema(description = "管理后台 - 动态表单更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class BpmFormUpdateReqVO extends BpmFormBaseVO { + + @Schema(description = "表单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "表单编号不能为空") + private Long id; + + @Schema(description = "表单的配置-JSON 字符串", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "表单的配置不能为空") + private String conf; + + @Schema(description = "表单项的数组-JSON 字符串的数组", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "表单项的数组不能为空") + private List fields; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/group/BpmUserGroupBaseVO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/group/BpmUserGroupBaseVO.java new file mode 100644 index 0000000..17fbd36 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/group/BpmUserGroupBaseVO.java @@ -0,0 +1,32 @@ +package com.win.module.bpm.controller.definition.vo.group; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.Set; + +/** +* 用户组 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class BpmUserGroupBaseVO { + + @Schema(description = "组名", requiredMode = Schema.RequiredMode.REQUIRED, example = "闻荫") + @NotNull(message = "组名不能为空") + private String name; + + @Schema(description = "描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "闻荫源码") + @NotNull(message = "描述不能为空") + private String description; + + @Schema(description = "成员编号数组", requiredMode = Schema.RequiredMode.REQUIRED, example = "1,2,3") + @NotNull(message = "成员编号数组不能为空") + private Set memberUserIds; + + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "状态不能为空") + private Integer status; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/group/BpmUserGroupCreateReqVO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/group/BpmUserGroupCreateReqVO.java new file mode 100644 index 0000000..ed680fb --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/group/BpmUserGroupCreateReqVO.java @@ -0,0 +1,11 @@ +package com.win.module.bpm.controller.definition.vo.group; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +@Schema(description = "管理后台 - 用户组创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class BpmUserGroupCreateReqVO extends BpmUserGroupBaseVO { + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/group/BpmUserGroupPageReqVO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/group/BpmUserGroupPageReqVO.java new file mode 100644 index 0000000..44935ea --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/group/BpmUserGroupPageReqVO.java @@ -0,0 +1,29 @@ +package com.win.module.bpm.controller.definition.vo.group; + +import com.win.framework.common.pojo.PageParam; +import com.win.framework.common.util.date.DateUtils; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 用户组分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class BpmUserGroupPageReqVO extends PageParam { + + @Schema(description = "组名", example = "闻荫") + private String name; + + @Schema(description = "状态", example = "1") + private Integer status; + + @DateTimeFormat(pattern = DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @Schema(description = "创建时间") + private LocalDateTime[] createTime; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/group/BpmUserGroupRespVO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/group/BpmUserGroupRespVO.java new file mode 100644 index 0000000..e6c2efe --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/group/BpmUserGroupRespVO.java @@ -0,0 +1,20 @@ +package com.win.module.bpm.controller.definition.vo.group; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 用户组 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class BpmUserGroupRespVO extends BpmUserGroupBaseVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/group/BpmUserGroupSimpleRespVO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/group/BpmUserGroupSimpleRespVO.java new file mode 100644 index 0000000..1fdfce1 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/group/BpmUserGroupSimpleRespVO.java @@ -0,0 +1,20 @@ +package com.win.module.bpm.controller.definition.vo.group; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Schema(description = "管理后台 - 用户组精简信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class BpmUserGroupSimpleRespVO { + + @Schema(description = "用户组编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "用户组名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "闻荫") + private String name; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/group/BpmUserGroupUpdateReqVO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/group/BpmUserGroupUpdateReqVO.java new file mode 100644 index 0000000..ae0290c --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/group/BpmUserGroupUpdateReqVO.java @@ -0,0 +1,17 @@ +package com.win.module.bpm.controller.definition.vo.group; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 用户组更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class BpmUserGroupUpdateReqVO extends BpmUserGroupBaseVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "编号不能为空") + private Long id; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/model/BpmModeImportReqVO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/model/BpmModeImportReqVO.java new file mode 100644 index 0000000..4355313 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/model/BpmModeImportReqVO.java @@ -0,0 +1,21 @@ +package com.win.module.bpm.controller.definition.vo.model; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.web.multipart.MultipartFile; + +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 流程模型的导入 Request VO 相比流程模型的新建来说,只是多了一个 bpmnFile 文件") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class BpmModeImportReqVO extends BpmModelCreateReqVO { + + @Schema(description = "BPMN 文件", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "BPMN 文件不能为空") + private MultipartFile bpmnFile; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/model/BpmModelBaseVO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/model/BpmModelBaseVO.java new file mode 100644 index 0000000..2f5f7e6 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/model/BpmModelBaseVO.java @@ -0,0 +1,40 @@ +package com.win.module.bpm.controller.definition.vo.model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; + +/** +* 流程模型 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class BpmModelBaseVO { + + @Schema(description = "流程标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "process_win") + @NotEmpty(message = "流程标识不能为空") + private String key; + + @Schema(description = "流程名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "闻荫") + @NotEmpty(message = "流程名称不能为空") + private String name; + + @Schema(description = "流程描述", example = "我是描述") + private String description; + + @Schema(description = "流程分类-参见 bpm_model_category 数据字典", example = "1") + @NotEmpty(message = "流程分类不能为空") + private String category; + + @Schema(description = "表单类型-参见 bpm_model_form_type 数据字典", example = "1") + private Integer formType; + @Schema(description = "表单编号-在表单类型为 {@link BpmModelFormTypeEnum#CUSTOM} 时,必须非空", example = "1024") + private Long formId; + @Schema(description = "自定义表单的提交路径,使用 Vue 的路由地址-在表单类型为 {@link BpmModelFormTypeEnum#CUSTOM} 时,必须非空", + example = "/bpm/oa/leave/create") + private String formCustomCreatePath; + @Schema(description = "自定义表单的查看路径,使用 Vue 的路由地址-在表单类型为 {@link BpmModelFormTypeEnum#CUSTOM} 时,必须非空", + example = "/bpm/oa/leave/view") + private String formCustomViewPath; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/model/BpmModelCreateReqVO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/model/BpmModelCreateReqVO.java new file mode 100644 index 0000000..244a535 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/model/BpmModelCreateReqVO.java @@ -0,0 +1,25 @@ +package com.win.module.bpm.controller.definition.vo.model; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotEmpty; + +@Schema(description = "管理后台 - 流程模型的创建 Request VO") +@Data +public class BpmModelCreateReqVO { + + @Schema(description = "流程标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "process_win") + @NotEmpty(message = "流程标识不能为空") + private String key; + + @Schema(description = "流程名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "闻荫") + @NotEmpty(message = "流程名称不能为空") + private String name; + + @Schema(description = "流程描述", example = "我是描述") + private String description; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/model/BpmModelPageItemRespVO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/model/BpmModelPageItemRespVO.java new file mode 100644 index 0000000..281e3cb --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/model/BpmModelPageItemRespVO.java @@ -0,0 +1,48 @@ +package com.win.module.bpm.controller.definition.vo.model; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 流程模型的分页的每一项 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class BpmModelPageItemRespVO extends BpmModelBaseVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private String id; + + @Schema(description = "表单名字", example = "请假表单") + private String formName; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + + /** + * 最新部署的流程定义 + */ + private ProcessDefinition processDefinition; + + @Schema(description = "流程定义") + @Data + public static class ProcessDefinition { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private String id; + + @Schema(description = "版本", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer version; + + @Schema(description = "部署时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime deploymentTime; + + @Schema(description = "中断状态-参见 SuspensionState 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer suspensionState; + + } + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/model/BpmModelPageReqVO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/model/BpmModelPageReqVO.java new file mode 100644 index 0000000..8fff723 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/model/BpmModelPageReqVO.java @@ -0,0 +1,25 @@ +package com.win.module.bpm.controller.definition.vo.model; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + + +@Schema(description = "管理后台 - 流程模型分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class BpmModelPageReqVO extends PageParam { + + @Schema(description = "标识-精准匹配", example = "process1641042089407") + private String key; + + @Schema(description = "名字-模糊匹配", example = "闻荫") + private String name; + + @Schema(description = "流程分类-参见 bpm_model_category 数据字典", example = "1") + private String category; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/model/BpmModelRespVO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/model/BpmModelRespVO.java new file mode 100644 index 0000000..22ecf3a --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/model/BpmModelRespVO.java @@ -0,0 +1,25 @@ +package com.win.module.bpm.controller.definition.vo.model; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 流程模型的创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class BpmModelRespVO extends BpmModelBaseVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private String id; + + @Schema(description = "BPMN XML", requiredMode = Schema.RequiredMode.REQUIRED) + private String bpmnXml; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/model/BpmModelUpdateReqVO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/model/BpmModelUpdateReqVO.java new file mode 100644 index 0000000..2a41c17 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/model/BpmModelUpdateReqVO.java @@ -0,0 +1,39 @@ +package com.win.module.bpm.controller.definition.vo.model; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; + +@Schema(description = "管理后台 - 流程模型的更新 Request VO") +@Data +public class BpmModelUpdateReqVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotEmpty(message = "编号不能为空") + private String id; + + @Schema(description = "流程名称", example = "闻荫") + private String name; + + @Schema(description = "流程描述", example = "我是描述") + private String description; + + @Schema(description = "流程分类-参见 bpm_model_category 数据字典", example = "1") + private String category; + + @Schema(description = "BPMN XML", requiredMode = Schema.RequiredMode.REQUIRED) + private String bpmnXml; + + @Schema(description = "表单类型-参见 bpm_model_form_type 数据字典", example = "1") + private Integer formType; + @Schema(description = "表单编号-在表单类型为 {@link BpmModelFormTypeEnum#CUSTOM} 时,必须非空", example = "1024") + private Long formId; + @Schema(description = "自定义表单的提交路径,使用 Vue 的路由地址-在表单类型为 {@link BpmModelFormTypeEnum#CUSTOM} 时,必须非空", + example = "/bpm/oa/leave/create") + private String formCustomCreatePath; + @Schema(description = "自定义表单的查看路径,使用 Vue 的路由地址-在表单类型为 {@link BpmModelFormTypeEnum#CUSTOM} 时,必须非空", + example = "/bpm/oa/leave/view") + private String formCustomViewPath; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/model/BpmModelUpdateStateReqVO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/model/BpmModelUpdateStateReqVO.java new file mode 100644 index 0000000..08cdb2b --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/model/BpmModelUpdateStateReqVO.java @@ -0,0 +1,20 @@ +package com.win.module.bpm.controller.definition.vo.model; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 流程模型更新状态 Request VO") +@Data +public class BpmModelUpdateStateReqVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "编号不能为空") + private String id; + + @Schema(description = "状态-见 SuspensionState 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "状态不能为空") + private Integer state; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/process/BpmProcessDefinitionListReqVO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/process/BpmProcessDefinitionListReqVO.java new file mode 100644 index 0000000..846f8f0 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/process/BpmProcessDefinitionListReqVO.java @@ -0,0 +1,18 @@ +package com.win.module.bpm.controller.definition.vo.process; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Schema(description = "管理后台 - 流程定义列表 Request VO") +@Data +@ToString(callSuper = true) +@EqualsAndHashCode(callSuper = true) +public class BpmProcessDefinitionListReqVO extends PageParam { + + @Schema(description = "中断状态-参见 SuspensionState 枚举", example = "1") + private Integer suspensionState; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/process/BpmProcessDefinitionPageItemRespVO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/process/BpmProcessDefinitionPageItemRespVO.java new file mode 100644 index 0000000..d59690c --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/process/BpmProcessDefinitionPageItemRespVO.java @@ -0,0 +1,22 @@ +package com.win.module.bpm.controller.definition.vo.process; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 流程定义的分页的每一项 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class BpmProcessDefinitionPageItemRespVO extends BpmProcessDefinitionRespVO { + + @Schema(description = "表单名字", example = "请假表单") + private String formName; + + @Schema(description = "部署时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime deploymentTime; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/process/BpmProcessDefinitionPageReqVO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/process/BpmProcessDefinitionPageReqVO.java new file mode 100644 index 0000000..f292d33 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/process/BpmProcessDefinitionPageReqVO.java @@ -0,0 +1,18 @@ +package com.win.module.bpm.controller.definition.vo.process; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Schema(description = "管理后台 - 流程定义分页 Request VO") +@Data +@ToString(callSuper = true) +@EqualsAndHashCode(callSuper = true) +public class BpmProcessDefinitionPageReqVO extends PageParam { + + @Schema(description = "标识-精准匹配", example = "process1641042089407") + private String key; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/process/BpmProcessDefinitionRespVO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/process/BpmProcessDefinitionRespVO.java new file mode 100644 index 0000000..9b52af5 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/process/BpmProcessDefinitionRespVO.java @@ -0,0 +1,48 @@ +package com.win.module.bpm.controller.definition.vo.process; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import java.util.List; + +@Schema(description = "管理后台 - 流程定义 Response VO") +@Data +public class BpmProcessDefinitionRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private String id; + + @Schema(description = "版本", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer version; + + @Schema(description = "流程名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "闻荫") + @NotEmpty(message = "流程名称不能为空") + private String name; + + @Schema(description = "流程描述", example = "我是描述") + private String description; + + @Schema(description = "流程分类-参见 bpm_model_category 数据字典", example = "1") + @NotEmpty(message = "流程分类不能为空") + private String category; + + @Schema(description = "表单类型-参见 bpm_model_form_type 数据字典", example = "1") + private Integer formType; + @Schema(description = "表单编号-在表单类型为 {@link BpmModelFormTypeEnum#CUSTOM} 时,必须非空", example = "1024") + private Long formId; + @Schema(description = "表单的配置-JSON 字符串。在表单类型为 {@link BpmModelFormTypeEnum#CUSTOM} 时,必须非空", requiredMode = Schema.RequiredMode.REQUIRED) + private String formConf; + @Schema(description = "表单项的数组-JSON 字符串的数组。在表单类型为 {@link BpmModelFormTypeEnum#CUSTOM} 时,必须非空", requiredMode = Schema.RequiredMode.REQUIRED) + private List formFields; + @Schema(description = "自定义表单的提交路径,使用 Vue 的路由地址-在表单类型为 {@link BpmModelFormTypeEnum#CUSTOM} 时,必须非空", + example = "/bpm/oa/leave/create") + private String formCustomCreatePath; + @Schema(description = "自定义表单的查看路径,使用 Vue 的路由地址-在表单类型为 {@link BpmModelFormTypeEnum#CUSTOM} 时,必须非空", + example = "/bpm/oa/leave/view") + private String formCustomViewPath; + + @Schema(description = "中断状态-参见 SuspensionState 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer suspensionState; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/rule/BpmTaskAssignRuleBaseVO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/rule/BpmTaskAssignRuleBaseVO.java new file mode 100644 index 0000000..dfc14bf --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/rule/BpmTaskAssignRuleBaseVO.java @@ -0,0 +1,24 @@ +package com.win.module.bpm.controller.definition.vo.rule; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.Set; + +/** + * 流程任务分配规则 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class BpmTaskAssignRuleBaseVO { + + @Schema(description = "规则类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "bpm_task_assign_rule_type") + @NotNull(message = "规则类型不能为空") + private Integer type; + + @Schema(description = "规则值数组", requiredMode = Schema.RequiredMode.REQUIRED, example = "1,2,3") + @NotNull(message = "规则值数组不能为空") + private Set options; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/rule/BpmTaskAssignRuleCreateReqVO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/rule/BpmTaskAssignRuleCreateReqVO.java new file mode 100644 index 0000000..57890d4 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/rule/BpmTaskAssignRuleCreateReqVO.java @@ -0,0 +1,24 @@ +package com.win.module.bpm.controller.definition.vo.rule; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotEmpty; + +@Schema(description = "管理后台 - 流程任务分配规则的创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class BpmTaskAssignRuleCreateReqVO extends BpmTaskAssignRuleBaseVO { + + @Schema(description = "流程模型的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotEmpty(message = "流程模型的编号不能为空") + private String modelId; + + @Schema(description = "流程任务定义的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") + @NotEmpty(message = "流程任务定义的编号不能为空") + private String taskDefinitionKey; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/rule/BpmTaskAssignRuleRespVO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/rule/BpmTaskAssignRuleRespVO.java new file mode 100644 index 0000000..d174159 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/rule/BpmTaskAssignRuleRespVO.java @@ -0,0 +1,28 @@ +package com.win.module.bpm.controller.definition.vo.rule; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Schema(description = "管理后台 - 流程任务分配规则的 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class BpmTaskAssignRuleRespVO extends BpmTaskAssignRuleBaseVO { + + @Schema(description = "任务分配规则的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "流程模型的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") + private String modelId; + + @Schema(description = "流程定义的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "4096") + private String processDefinitionId; + + @Schema(description = "流程任务定义的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") + private String taskDefinitionKey; + @Schema(description = "流程任务定义的名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "关注闻荫") + private String taskDefinitionName; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/rule/BpmTaskAssignRuleUpdateReqVO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/rule/BpmTaskAssignRuleUpdateReqVO.java new file mode 100644 index 0000000..983db36 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/rule/BpmTaskAssignRuleUpdateReqVO.java @@ -0,0 +1,20 @@ +package com.win.module.bpm.controller.definition.vo.rule; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 流程任务分配规则的更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class BpmTaskAssignRuleUpdateReqVO extends BpmTaskAssignRuleBaseVO { + + @Schema(description = "任务分配规则的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "任务分配规则的编号不能为空") + private Long id; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/oa/BpmOALeaveController.http b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/oa/BpmOALeaveController.http new file mode 100644 index 0000000..96bbf96 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/oa/BpmOALeaveController.http @@ -0,0 +1,12 @@ +### 请求 /bpm/oa/leave/create 接口 => 成功 +POST {{baseUrl}}/bpm/oa/leave/create +Content-Type: application/json +tenant-id: 1 +Authorization: Bearer {{token}} + +{ + "startTime": "2022-03-01", + "endTime": "2022-03-05", + "type": 1, + "reason": "我要请假啦啦啦!" +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/oa/BpmOALeaveController.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/oa/BpmOALeaveController.java new file mode 100644 index 0000000..e4c64cc --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/oa/BpmOALeaveController.java @@ -0,0 +1,63 @@ +package com.win.module.bpm.controller.oa; + +import com.win.module.bpm.controller.oa.vo.BpmOALeaveCreateReqVO; +import com.win.module.bpm.controller.oa.vo.BpmOALeavePageReqVO; +import com.win.module.bpm.controller.oa.vo.BpmOALeaveRespVO; +import com.win.module.bpm.convert.oa.BpmOALeaveConvert; +import com.win.module.bpm.dal.dataobject.oa.BpmOALeaveDO; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.module.bpm.service.oa.BpmOALeaveService; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; + +import static com.win.framework.common.pojo.CommonResult.success; +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + +/** + * OA 请假申请 Controller,用于演示自己存储数据,接入工作流的例子 + * + * @author jason + * @author 闻荫源码 + */ +@Tag(name = "管理后台 - OA 请假申请") +@RestController +@RequestMapping("/bpm/oa/leave") +@Validated +public class BpmOALeaveController { + + @Resource + private BpmOALeaveService leaveService; + + @PostMapping("/create") + @PreAuthorize("@ss.hasPermission('bpm:oa-leave:create')") + @Operation(summary = "创建请求申请") + public CommonResult createLeave(@Valid @RequestBody BpmOALeaveCreateReqVO createReqVO) { + return success(leaveService.createLeave(getLoginUserId(), createReqVO)); + } + + @GetMapping("/get") + @PreAuthorize("@ss.hasPermission('bpm:oa-leave:query')") + @Operation(summary = "获得请假申请") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + public CommonResult getLeave(@RequestParam("id") Long id) { + BpmOALeaveDO leave = leaveService.getLeave(id); + return success(BpmOALeaveConvert.INSTANCE.convert(leave)); + } + + @GetMapping("/page") + @PreAuthorize("@ss.hasPermission('bpm:oa-leave:query')") + @Operation(summary = "获得请假申请分页") + public CommonResult> getLeavePage(@Valid BpmOALeavePageReqVO pageVO) { + PageResult pageResult = leaveService.getLeavePage(getLoginUserId(), pageVO); + return success(BpmOALeaveConvert.INSTANCE.convertPage(pageResult)); + } + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/oa/package-info.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/oa/package-info.java new file mode 100644 index 0000000..3ff7434 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/oa/package-info.java @@ -0,0 +1,5 @@ +/** + * OA 示例,用于演示外部业务接入 BPM 工作流的示例 + * 一般的接入方式,只需要调用 接口,后续 Admin 用户在管理后台的【待办事务】进行审批 + */ +package com.win.module.bpm.controller.oa; diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/oa/vo/BpmOALeaveBaseVO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/oa/vo/BpmOALeaveBaseVO.java new file mode 100644 index 0000000..0df24a2 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/oa/vo/BpmOALeaveBaseVO.java @@ -0,0 +1,33 @@ +package com.win.module.bpm.controller.oa.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.time.LocalDateTime; +import javax.validation.constraints.*; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +/** +* 请假申请 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class BpmOALeaveBaseVO { + + @Schema(description = "请假的开始时间", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "开始时间不能为空") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime startTime; + @Schema(description = "请假的结束时间", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "结束时间不能为空") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime endTime; + + @Schema(description = "请假类型-参见 bpm_oa_type 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer type; + + @Schema(description = "原因", requiredMode = Schema.RequiredMode.REQUIRED, example = "阅读闻荫源码") + private String reason; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/oa/vo/BpmOALeaveCreateReqVO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/oa/vo/BpmOALeaveCreateReqVO.java new file mode 100644 index 0000000..9aae79f --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/oa/vo/BpmOALeaveCreateReqVO.java @@ -0,0 +1,20 @@ +package com.win.module.bpm.controller.oa.vo; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.AssertTrue; + +@Schema(description = "管理后台 - 请假申请创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class BpmOALeaveCreateReqVO extends BpmOALeaveBaseVO { + + @AssertTrue(message = "结束时间,需要在开始时间之后") + public boolean isEndTimeValid() { + return !getEndTime().isBefore(getStartTime()); + } + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/oa/vo/BpmOALeavePageReqVO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/oa/vo/BpmOALeavePageReqVO.java new file mode 100644 index 0000000..6bec890 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/oa/vo/BpmOALeavePageReqVO.java @@ -0,0 +1,29 @@ +package com.win.module.bpm.controller.oa.vo; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.time.LocalDateTime; +import com.win.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 请假申请分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class BpmOALeavePageReqVO extends PageParam { + + @Schema(description = "状态-参见 bpm_process_instance_result 枚举", example = "1") + private Integer result; + + @Schema(description = "请假类型-参见 bpm_oa_type", example = "1") + private Integer type; + + @Schema(description = "原因-模糊匹配", example = "阅读闻荫源码") + private String reason; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @Schema(description = "申请时间") + private LocalDateTime[] createTime; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/oa/vo/BpmOALeaveRespVO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/oa/vo/BpmOALeaveRespVO.java new file mode 100644 index 0000000..2e94a3b --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/oa/vo/BpmOALeaveRespVO.java @@ -0,0 +1,32 @@ +package com.win.module.bpm.controller.oa.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 请假申请 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class BpmOALeaveRespVO extends BpmOALeaveBaseVO { + + @Schema(description = "请假表单主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "状态-参见 bpm_process_instance_result 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer result; + + @Schema(description = "申请时间", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "申请时间不能为空") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime createTime; + + @Schema(description = "流程id") + private String processInstanceId; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/BpmActivityController.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/BpmActivityController.java new file mode 100644 index 0000000..9db8133 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/BpmActivityController.java @@ -0,0 +1,39 @@ +package com.win.module.bpm.controller.task; + +import com.win.framework.common.pojo.CommonResult; +import com.win.module.bpm.controller.task.vo.activity.BpmActivityRespVO; +import com.win.module.bpm.service.task.BpmActivityService; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.List; + +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 流程活动实例") +@RestController +@RequestMapping("/bpm/activity") +@Validated +public class BpmActivityController { + + @Resource + private BpmActivityService activityService; + + @GetMapping("/list") + @Operation(summary = "生成指定流程实例的高亮流程图", + description = "只高亮进行中的任务。不过要注意,该接口暂时没用,通过前端的 ProcessViewer.vue 界面的 highlightDiagram 方法生成") + @Parameter(name = "processInstanceId", description = "流程实例的编号", required = true) + @PreAuthorize("@ss.hasPermission('bpm:task:query')") + public CommonResult> getActivityList( + @RequestParam("processInstanceId") String processInstanceId) { + return success(activityService.getActivityListByProcessInstanceId(processInstanceId)); + } +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/BpmProcessInstanceController.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/BpmProcessInstanceController.java new file mode 100644 index 0000000..b195513 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/BpmProcessInstanceController.java @@ -0,0 +1,59 @@ +package com.win.module.bpm.controller.task; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.module.bpm.controller.task.vo.instance.*; +import com.win.module.bpm.service.task.BpmProcessInstanceService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; + +import static com.win.framework.common.pojo.CommonResult.success; +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + +@Tag(name = "管理后台 - 流程实例") // 流程实例,通过流程定义创建的一次“申请” +@RestController +@RequestMapping("/bpm/process-instance") +@Validated +public class BpmProcessInstanceController { + + @Resource + private BpmProcessInstanceService processInstanceService; + + @GetMapping("/my-page") + @Operation(summary = "获得我的实例分页列表", description = "在【我的流程】菜单中,进行调用") + @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')") + public CommonResult> getMyProcessInstancePage( + @Valid BpmProcessInstanceMyPageReqVO pageReqVO) { + return success(processInstanceService.getMyProcessInstancePage(getLoginUserId(), pageReqVO)); + } + + @PostMapping("/create") + @Operation(summary = "新建流程实例") + @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')") + public CommonResult createProcessInstance(@Valid @RequestBody BpmProcessInstanceCreateReqVO createReqVO) { + return success(processInstanceService.createProcessInstance(getLoginUserId(), createReqVO)); + } + + @GetMapping("/get") + @Operation(summary = "获得指定流程实例", description = "在【流程详细】界面中,进行调用") + @Parameter(name = "id", description = "流程实例的编号", required = true) + @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')") + public CommonResult getProcessInstance(@RequestParam("id") String id) { + return success(processInstanceService.getProcessInstanceVO(id)); + } + + @DeleteMapping("/cancel") + @Operation(summary = "取消流程实例", description = "撤回发起的流程") + @PreAuthorize("@ss.hasPermission('bpm:process-instance:cancel')") + public CommonResult cancelProcessInstance(@Valid @RequestBody BpmProcessInstanceCancelReqVO cancelReqVO) { + processInstanceService.cancelProcessInstance(getLoginUserId(), cancelReqVO); + return success(true); + } +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/BpmTaskController.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/BpmTaskController.java new file mode 100644 index 0000000..f999504 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/BpmTaskController.java @@ -0,0 +1,77 @@ +package com.win.module.bpm.controller.task; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.module.bpm.controller.task.vo.task.*; +import com.win.module.bpm.service.task.BpmTaskService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.List; + +import static com.win.framework.common.pojo.CommonResult.success; +import static com.win.framework.web.core.util.WebFrameworkUtils.getLoginUserId; + +@Tag(name = "管理后台 - 流程任务实例") +@RestController +@RequestMapping("/bpm/task") +@Validated +public class BpmTaskController { + + @Resource + private BpmTaskService taskService; + + @GetMapping("todo-page") + @Operation(summary = "获取 Todo 待办任务分页") + @PreAuthorize("@ss.hasPermission('bpm:task:query')") + public CommonResult> getTodoTaskPage(@Valid BpmTaskTodoPageReqVO pageVO) { + return success(taskService.getTodoTaskPage(getLoginUserId(), pageVO)); + } + + @GetMapping("done-page") + @Operation(summary = "获取 Done 已办任务分页") + @PreAuthorize("@ss.hasPermission('bpm:task:query')") + public CommonResult> getDoneTaskPage(@Valid BpmTaskDonePageReqVO pageVO) { + return success(taskService.getDoneTaskPage(getLoginUserId(), pageVO)); + } + + @GetMapping("/list-by-process-instance-id") + @Operation(summary = "获得指定流程实例的任务列表", description = "包括完成的、未完成的") + @Parameter(name = "processInstanceId", description = "流程实例的编号", required = true) + @PreAuthorize("@ss.hasPermission('bpm:task:query')") + public CommonResult> getTaskListByProcessInstanceId( + @RequestParam("processInstanceId") String processInstanceId) { + return success(taskService.getTaskListByProcessInstanceId(processInstanceId)); + } + + @PutMapping("/approve") + @Operation(summary = "通过任务") + @PreAuthorize("@ss.hasPermission('bpm:task:update')") + public CommonResult approveTask(@Valid @RequestBody BpmTaskApproveReqVO reqVO) { + taskService.approveTask(getLoginUserId(), reqVO); + return success(true); + } + + @PutMapping("/reject") + @Operation(summary = "不通过任务") + @PreAuthorize("@ss.hasPermission('bpm:task:update')") + public CommonResult rejectTask(@Valid @RequestBody BpmTaskRejectReqVO reqVO) { + taskService.rejectTask(getLoginUserId(), reqVO); + return success(true); + } + + @PutMapping("/update-assignee") + @Operation(summary = "更新任务的负责人", description = "用于【流程详情】的【转派】按钮") + @PreAuthorize("@ss.hasPermission('bpm:task:update')") + public CommonResult updateTaskAssignee(@Valid @RequestBody BpmTaskUpdateAssigneeReqVO reqVO) { + taskService.updateTaskAssignee(getLoginUserId(), reqVO); + return success(true); + } + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/activity/BpmActivityRespVO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/activity/BpmActivityRespVO.java new file mode 100644 index 0000000..0a24d85 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/activity/BpmActivityRespVO.java @@ -0,0 +1,25 @@ +package com.win.module.bpm.controller.task.vo.activity; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 流程活动的 Response VO") +@Data +public class BpmActivityRespVO { + + @Schema(description = "流程活动的标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private String key; + @Schema(description = "流程活动的类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "StartEvent") + private String type; + + @Schema(description = "流程活动的开始时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime startTime; + @Schema(description = "流程活动的结束时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime endTime; + + @Schema(description = "关联的流程任务的编号-关联的流程任务,只有 UserTask 等类型才有", example = "2048") + private String taskId; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/instance/BpmProcessInstanceCancelReqVO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/instance/BpmProcessInstanceCancelReqVO.java new file mode 100644 index 0000000..7858b1f --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/instance/BpmProcessInstanceCancelReqVO.java @@ -0,0 +1,20 @@ +package com.win.module.bpm.controller.task.vo.instance; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; + +@Schema(description = "管理后台 - 流程实例的取消 Request VO") +@Data +public class BpmProcessInstanceCancelReqVO { + + @Schema(description = "流程实例的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotEmpty(message = "流程实例的编号不能为空") + private String id; + + @Schema(description = "取消原因", requiredMode = Schema.RequiredMode.REQUIRED, example = "不请假了!") + @NotEmpty(message = "取消原因不能为空") + private String reason; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/instance/BpmProcessInstanceCreateReqVO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/instance/BpmProcessInstanceCreateReqVO.java new file mode 100644 index 0000000..51bef86 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/instance/BpmProcessInstanceCreateReqVO.java @@ -0,0 +1,20 @@ +package com.win.module.bpm.controller.task.vo.instance; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import java.util.Map; + +@Schema(description = "管理后台 - 流程实例的创建 Request VO") +@Data +public class BpmProcessInstanceCreateReqVO { + + @Schema(description = "流程定义的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotEmpty(message = "流程定义编号不能为空") + private String processDefinitionId; + + @Schema(description = "变量实例") + private Map variables; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/instance/BpmProcessInstanceMyPageReqVO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/instance/BpmProcessInstanceMyPageReqVO.java new file mode 100644 index 0000000..73f3af7 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/instance/BpmProcessInstanceMyPageReqVO.java @@ -0,0 +1,39 @@ +package com.win.module.bpm.controller.task.vo.instance; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 流程实例的分页 Item Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class BpmProcessInstanceMyPageReqVO extends PageParam { + + @Schema(description = "流程名称", example = "闻荫") + private String name; + + @Schema(description = "流程定义的编号", example = "2048") + private String processDefinitionId; + + @Schema(description = "流程实例的状态-参见 bpm_process_instance_status", example = "1") + private Integer status; + + @Schema(description = "流程实例的结果-参见 bpm_process_instance_result", example = "2") + private Integer result; + + @Schema(description = "流程分类-参见 bpm_model_category 数据字典", example = "1") + private String category; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/instance/BpmProcessInstancePageItemRespVO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/instance/BpmProcessInstancePageItemRespVO.java new file mode 100644 index 0000000..c7e33d1 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/instance/BpmProcessInstancePageItemRespVO.java @@ -0,0 +1,54 @@ +package com.win.module.bpm.controller.task.vo.instance; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +@Schema(description = "管理后台 - 流程实例的分页 Item Response VO") +@Data +public class BpmProcessInstancePageItemRespVO { + + @Schema(description = "流程实例的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private String id; + + @Schema(description = "流程名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "闻荫") + private String name; + + @Schema(description = "流程定义的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") + private String processDefinitionId; + + @Schema(description = "流程分类-参见 bpm_model_category 数据字典", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private String category; + + @Schema(description = "流程实例的状态-参见 bpm_process_instance_status", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer status; + + @Schema(description = "流程实例的结果-参见 bpm_process_instance_result", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + private Integer result; + + @Schema(description = "提交时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + + @Schema(description = "结束时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime endTime; + + /** + * 当前任务 + */ + private List tasks; + + @Schema(description = "流程任务") + @Data + public static class Task { + + @Schema(description = "流程任务的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private String id; + + @Schema(description = "任务名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "闻荫") + private String name; + + } + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/instance/BpmProcessInstanceRespVO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/instance/BpmProcessInstanceRespVO.java new file mode 100644 index 0000000..cf31468 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/instance/BpmProcessInstanceRespVO.java @@ -0,0 +1,94 @@ +package com.win.module.bpm.controller.task.vo.instance; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; + +@Schema(description = "管理后台 - 流程实例的 Response VO") +@Data +public class BpmProcessInstanceRespVO { + + @Schema(description = "流程实例的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private String id; + + @Schema(description = "流程名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "闻荫") + private String name; + + @Schema(description = "流程分类-参见 bpm_model_category 数据字典", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private String category; + + @Schema(description = "流程实例的状态-参见 bpm_process_instance_status", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer status; + + @Schema(description = "流程实例的结果-参见 bpm_process_instance_result", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + private Integer result; + + @Schema(description = "提交时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + + @Schema(description = "结束时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime endTime; + + @Schema(description = "提交的表单值", requiredMode = Schema.RequiredMode.REQUIRED) + private Map formVariables; + + @Schema(description = "业务的唯一标识-例如说,请假申请的编号", example = "1") + private String businessKey; + + /** + * 发起流程的用户 + */ + private User startUser; + + /** + * 流程定义 + */ + private ProcessDefinition processDefinition; + + @Schema(description = "用户信息") + @Data + public static class User { + + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long id; + @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + private String nickname; + + @Schema(description = "部门编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long deptId; + @Schema(description = "部门名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "研发部") + private String deptName; + + } + + @Schema(description = "流程定义信息") + @Data + public static class ProcessDefinition { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private String id; + + @Schema(description = "表单类型-参见 bpm_model_form_type 数据字典", example = "1") + private Integer formType; + @Schema(description = "表单编号-在表单类型为 {@link BpmModelFormTypeEnum#CUSTOM} 时,必须非空", example = "1024") + private Long formId; + @Schema(description = "表单的配置-JSON 字符串。在表单类型为 {@link BpmModelFormTypeEnum#CUSTOM} 时,必须非空", requiredMode = Schema.RequiredMode.REQUIRED) + private String formConf; + @Schema(description = "表单项的数组-JSON 字符串的数组。在表单类型为 {@link BpmModelFormTypeEnum#CUSTOM} 时,必须非空", requiredMode = Schema.RequiredMode.REQUIRED) + private List formFields; + @Schema(description = "自定义表单的提交路径,使用 Vue 的路由地址-在表单类型为 {@link BpmModelFormTypeEnum#CUSTOM} 时,必须非空", + example = "/bpm/oa/leave/create") + private String formCustomCreatePath; + @Schema(description = "自定义表单的查看路径,使用 Vue 的路由地址-在表单类型为 {@link BpmModelFormTypeEnum#CUSTOM} 时,必须非空", + example = "/bpm/oa/leave/view") + private String formCustomViewPath; + + @Schema(description = "BPMN XML", requiredMode = Schema.RequiredMode.REQUIRED) + private String bpmnXml; + + } + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/task/BpmTaskApproveReqVO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/task/BpmTaskApproveReqVO.java new file mode 100644 index 0000000..d38a05b --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/task/BpmTaskApproveReqVO.java @@ -0,0 +1,20 @@ +package com.win.module.bpm.controller.task.vo.task; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; + +@Schema(description = "管理后台 - 通过流程任务的 Request VO") +@Data +public class BpmTaskApproveReqVO { + + @Schema(description = "任务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotEmpty(message = "任务编号不能为空") + private String id; + + @Schema(description = "审批意见", requiredMode = Schema.RequiredMode.REQUIRED, example = "不错不错!") + @NotEmpty(message = "审批意见不能为空") + private String reason; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/task/BpmTaskDonePageItemRespVO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/task/BpmTaskDonePageItemRespVO.java new file mode 100644 index 0000000..da718af --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/task/BpmTaskDonePageItemRespVO.java @@ -0,0 +1,26 @@ +package com.win.module.bpm.controller.task.vo.task; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 流程任务的 Done 已完成的分页项 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class BpmTaskDonePageItemRespVO extends BpmTaskTodoPageItemRespVO { + + @Schema(description = "结束时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime endTime; + @Schema(description = "持续时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "1000") + private Long durationInMillis; + + @Schema(description = "任务结果-参见 bpm_process_instance_result", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + private Integer result; + @Schema(description = "审批建议", requiredMode = Schema.RequiredMode.REQUIRED, example = "不请假了!") + private String reason; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/task/BpmTaskDonePageReqVO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/task/BpmTaskDonePageReqVO.java new file mode 100644 index 0000000..d80e9c1 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/task/BpmTaskDonePageReqVO.java @@ -0,0 +1,31 @@ +package com.win.module.bpm.controller.task.vo.task; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 流程任务的 Done 已办的分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class BpmTaskDonePageReqVO extends PageParam { + + @Schema(description = "流程任务名", example = "闻荫") + private String name; + + @Schema(description = "开始的创建收间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime beginCreateTime; + + @Schema(description = "结束的创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime endCreateTime; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/task/BpmTaskRejectReqVO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/task/BpmTaskRejectReqVO.java new file mode 100644 index 0000000..5421dad --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/task/BpmTaskRejectReqVO.java @@ -0,0 +1,20 @@ +package com.win.module.bpm.controller.task.vo.task; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; + +@Schema(description = "管理后台 - 不通过流程任务的 Request VO") +@Data +public class BpmTaskRejectReqVO { + + @Schema(description = "任务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotEmpty(message = "任务编号不能为空") + private String id; + + @Schema(description = "审批意见", requiredMode = Schema.RequiredMode.REQUIRED, example = "不错不错!") + @NotEmpty(message = "审批意见不能为空") + private String reason; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/task/BpmTaskRespVO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/task/BpmTaskRespVO.java new file mode 100644 index 0000000..3f2d993 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/task/BpmTaskRespVO.java @@ -0,0 +1,37 @@ +package com.win.module.bpm.controller.task.vo.task; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Schema(description = "管理后台 - 流程任务的 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class BpmTaskRespVO extends BpmTaskDonePageItemRespVO { + + @Schema(description = "任务定义的标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "user-001") + private String definitionKey; + + /** + * 审核的用户信息 + */ + private User assigneeUser; + + @Schema(description = "用户信息") + @Data + public static class User { + + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long id; + @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + private String nickname; + + @Schema(description = "部门编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long deptId; + @Schema(description = "部门名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "研发部") + private String deptName; + + } +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/task/BpmTaskTodoPageItemRespVO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/task/BpmTaskTodoPageItemRespVO.java new file mode 100644 index 0000000..db1fe28 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/task/BpmTaskTodoPageItemRespVO.java @@ -0,0 +1,53 @@ +package com.win.module.bpm.controller.task.vo.task; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 流程任务的 Running 进行中的分页项 Response VO") +@Data +public class BpmTaskTodoPageItemRespVO { + + @Schema(description = "任务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private String id; + + @Schema(description = "任务名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "闻荫") + private String name; + + @Schema(description = "接收时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime claimTime; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + + @Schema(description = "激活状态-参见 SuspensionState 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer suspensionState; + + /** + * 所属流程实例 + */ + private ProcessInstance processInstance; + + @Data + @Schema(description = "流程实例") + public static class ProcessInstance { + + @Schema(description = "流程实例编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private String id; + + @Schema(description = "流程实例名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "闻荫") + private String name; + + @Schema(description = "发起人的用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long startUserId; + + @Schema(description = "发起人的用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + private String startUserNickname; + + @Schema(description = "流程定义的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") + private String processDefinitionId; + + } + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/task/BpmTaskTodoPageReqVO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/task/BpmTaskTodoPageReqVO.java new file mode 100644 index 0000000..5cd3722 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/task/BpmTaskTodoPageReqVO.java @@ -0,0 +1,28 @@ +package com.win.module.bpm.controller.task.vo.task; + +import com.win.framework.common.pojo.PageParam; +import com.win.framework.common.util.date.DateUtils; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 流程任务的 TODO 待办的分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class BpmTaskTodoPageReqVO extends PageParam { + + @Schema(description = "流程任务名", example = "闻荫") + private String name; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/task/BpmTaskUpdateAssigneeReqVO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/task/BpmTaskUpdateAssigneeReqVO.java new file mode 100644 index 0000000..27e2d4e --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/task/BpmTaskUpdateAssigneeReqVO.java @@ -0,0 +1,21 @@ +package com.win.module.bpm.controller.task.vo.task; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 流程任务的更新负责人的 Request VO") +@Data +public class BpmTaskUpdateAssigneeReqVO { + + @Schema(description = "任务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotEmpty(message = "任务编号不能为空") + private String id; + + @Schema(description = "新审批人的用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") + @NotNull(message = "新审批人的用户编号不能为空") + private Long assigneeUserId; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/convert/definition/BpmFormConvert.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/convert/definition/BpmFormConvert.java new file mode 100644 index 0000000..a60f395 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/convert/definition/BpmFormConvert.java @@ -0,0 +1,34 @@ +package com.win.module.bpm.convert.definition; + +import com.win.module.bpm.controller.definition.vo.form.BpmFormCreateReqVO; +import com.win.module.bpm.controller.definition.vo.form.BpmFormRespVO; +import com.win.module.bpm.controller.definition.vo.form.BpmFormSimpleRespVO; +import com.win.module.bpm.controller.definition.vo.form.BpmFormUpdateReqVO; +import com.win.module.bpm.dal.dataobject.definition.BpmFormDO; +import com.win.framework.common.pojo.PageResult; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 动态表单 Convert + * + * @author 芋艿 + */ +@Mapper +public interface BpmFormConvert { + + BpmFormConvert INSTANCE = Mappers.getMapper(BpmFormConvert.class); + + BpmFormDO convert(BpmFormCreateReqVO bean); + + BpmFormDO convert(BpmFormUpdateReqVO bean); + + BpmFormRespVO convert(BpmFormDO bean); + + List convertList2(List list); + + PageResult convertPage(PageResult page); + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/convert/definition/BpmModelConvert.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/convert/definition/BpmModelConvert.java new file mode 100644 index 0000000..11b52bf --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/convert/definition/BpmModelConvert.java @@ -0,0 +1,141 @@ +package com.win.module.bpm.convert.definition; + +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.util.collection.CollectionUtils; +import com.win.framework.common.util.date.DateUtils; +import com.win.framework.common.util.json.JsonUtils; +import com.win.module.bpm.controller.definition.vo.model.*; +import com.win.module.bpm.dal.dataobject.definition.BpmFormDO; +import com.win.module.bpm.service.definition.dto.BpmModelMetaInfoRespDTO; +import com.win.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO; +import org.flowable.common.engine.impl.db.SuspensionState; +import org.flowable.engine.repository.Deployment; +import org.flowable.engine.repository.Model; +import org.flowable.engine.repository.ProcessDefinition; +import org.mapstruct.Mapper; +import org.mapstruct.MappingTarget; +import org.mapstruct.factory.Mappers; + +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * 流程模型 Convert + * + * @author yunlongn + */ +@Mapper +public interface BpmModelConvert { + + BpmModelConvert INSTANCE = Mappers.getMapper(BpmModelConvert.class); + + default List convertList(List list, Map formMap, + Map deploymentMap, + Map processDefinitionMap) { + return CollectionUtils.convertList(list, model -> { + BpmModelMetaInfoRespDTO metaInfo = JsonUtils.parseObject(model.getMetaInfo(), BpmModelMetaInfoRespDTO.class); + BpmFormDO form = metaInfo != null ? formMap.get(metaInfo.getFormId()) : null; + Deployment deployment = model.getDeploymentId() != null ? deploymentMap.get(model.getDeploymentId()) : null; + ProcessDefinition processDefinition = model.getDeploymentId() != null ? processDefinitionMap.get(model.getDeploymentId()) : null; + return convert(model, form, deployment, processDefinition); + }); + } + + default BpmModelPageItemRespVO convert(Model model, BpmFormDO form, Deployment deployment, ProcessDefinition processDefinition) { + BpmModelPageItemRespVO modelRespVO = new BpmModelPageItemRespVO(); + modelRespVO.setId(model.getId()); + modelRespVO.setCreateTime(DateUtils.of(model.getCreateTime())); + // 通用 copy + copyTo(model, modelRespVO); + // Form + if (form != null) { + modelRespVO.setFormId(form.getId()); + modelRespVO.setFormName(form.getName()); + } + // ProcessDefinition + modelRespVO.setProcessDefinition(this.convert(processDefinition)); + if (modelRespVO.getProcessDefinition() != null) { + modelRespVO.getProcessDefinition().setSuspensionState(processDefinition.isSuspended() ? + SuspensionState.SUSPENDED.getStateCode() : SuspensionState.ACTIVE.getStateCode()); + modelRespVO.getProcessDefinition().setDeploymentTime(DateUtils.of(deployment.getDeploymentTime())); + } + return modelRespVO; + } + + default BpmModelRespVO convert(Model model) { + BpmModelRespVO modelRespVO = new BpmModelRespVO(); + modelRespVO.setId(model.getId()); + modelRespVO.setCreateTime(DateUtils.of(model.getCreateTime())); + // 通用 copy + copyTo(model, modelRespVO); + return modelRespVO; + } + + default void copyTo(Model model, BpmModelBaseVO to) { + to.setName(model.getName()); + to.setKey(model.getKey()); + to.setCategory(model.getCategory()); + // metaInfo + BpmModelMetaInfoRespDTO metaInfo = JsonUtils.parseObject(model.getMetaInfo(), BpmModelMetaInfoRespDTO.class); + copyTo(metaInfo, to); + } + + BpmModelCreateReqVO convert(BpmModeImportReqVO bean); + + default BpmProcessDefinitionCreateReqDTO convert2(Model model, BpmFormDO form) { + BpmProcessDefinitionCreateReqDTO createReqDTO = new BpmProcessDefinitionCreateReqDTO(); + createReqDTO.setModelId(model.getId()); + createReqDTO.setName(model.getName()); + createReqDTO.setKey(model.getKey()); + createReqDTO.setCategory(model.getCategory()); + BpmModelMetaInfoRespDTO metaInfo = JsonUtils.parseObject(model.getMetaInfo(), BpmModelMetaInfoRespDTO.class); + // metaInfo + copyTo(metaInfo, createReqDTO); + // form + if (form != null) { + createReqDTO.setFormConf(form.getConf()); + createReqDTO.setFormFields(form.getFields()); + } + return createReqDTO; + } + + void copyTo(BpmModelMetaInfoRespDTO from, @MappingTarget BpmProcessDefinitionCreateReqDTO to); + + void copyTo(BpmModelMetaInfoRespDTO from, @MappingTarget BpmModelBaseVO to); + + BpmModelPageItemRespVO.ProcessDefinition convert(ProcessDefinition bean); + + default void copy(Model model, BpmModelCreateReqVO bean) { + model.setName(bean.getName()); + model.setKey(bean.getKey()); + model.setMetaInfo(buildMetaInfoStr(null, bean.getDescription(), null, null, + null, null)); + } + + default void copy(Model model, BpmModelUpdateReqVO bean) { + model.setName(bean.getName()); + model.setCategory(bean.getCategory()); + model.setMetaInfo(buildMetaInfoStr(JsonUtils.parseObject(model.getMetaInfo(), BpmModelMetaInfoRespDTO.class), + bean.getDescription(), bean.getFormType(), bean.getFormId(), + bean.getFormCustomCreatePath(), bean.getFormCustomViewPath())); + } + + default String buildMetaInfoStr(BpmModelMetaInfoRespDTO metaInfo, String description, Integer formType, + Long formId, String formCustomCreatePath, String formCustomViewPath) { + if (metaInfo == null) { + metaInfo = new BpmModelMetaInfoRespDTO(); + } + // 只有非空,才进行设置,避免更新时的覆盖 + if (StrUtil.isNotEmpty(description)) { + metaInfo.setDescription(description); + } + if (Objects.nonNull(formType)) { + metaInfo.setFormType(formType); + metaInfo.setFormId(formId); + metaInfo.setFormCustomCreatePath(formCustomCreatePath); + metaInfo.setFormCustomViewPath(formCustomViewPath); + } + return JsonUtils.toJsonString(metaInfo); + } +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/convert/definition/BpmProcessDefinitionConvert.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/convert/definition/BpmProcessDefinitionConvert.java new file mode 100644 index 0000000..6e048b4 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/convert/definition/BpmProcessDefinitionConvert.java @@ -0,0 +1,83 @@ +package com.win.module.bpm.convert.definition; + +import cn.hutool.core.date.LocalDateTimeUtil; +import com.win.framework.common.util.collection.CollectionUtils; +import com.win.module.bpm.controller.definition.vo.process.BpmProcessDefinitionPageItemRespVO; +import com.win.module.bpm.controller.definition.vo.process.BpmProcessDefinitionRespVO; +import com.win.module.bpm.dal.dataobject.definition.BpmFormDO; +import com.win.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; +import com.win.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO; +import org.flowable.common.engine.impl.db.SuspensionState; +import org.flowable.engine.repository.Deployment; +import org.flowable.engine.repository.ProcessDefinition; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.MappingTarget; +import org.mapstruct.Named; +import org.mapstruct.factory.Mappers; + +import java.util.List; +import java.util.Map; + +/** + * Bpm 流程定义的 Convert + * + * @author yunlong.li + */ +@Mapper +public interface BpmProcessDefinitionConvert { + + BpmProcessDefinitionConvert INSTANCE = Mappers.getMapper(BpmProcessDefinitionConvert.class); + + BpmProcessDefinitionPageItemRespVO convert(ProcessDefinition bean); + + BpmProcessDefinitionExtDO convert2(BpmProcessDefinitionCreateReqDTO bean); + + default List convertList(List list, Map deploymentMap, + Map processDefinitionDOMap, Map formMap) { + return CollectionUtils.convertList(list, definition -> { + Deployment deployment = definition.getDeploymentId() != null ? deploymentMap.get(definition.getDeploymentId()) : null; + BpmProcessDefinitionExtDO definitionDO = processDefinitionDOMap.get(definition.getId()); + BpmFormDO form = definitionDO != null ? formMap.get(definitionDO.getFormId()) : null; + return convert(definition, deployment, definitionDO, form); + }); + } + + default List convertList3(List list, + Map processDefinitionDOMap) { + return CollectionUtils.convertList(list, processDefinition -> { + BpmProcessDefinitionRespVO respVO = convert3(processDefinition); + BpmProcessDefinitionExtDO processDefinitionExtDO = processDefinitionDOMap.get(processDefinition.getId()); + // 复制通用属性 + copyTo(processDefinitionExtDO, respVO); + return respVO; + }); + } + + @Mapping(source = "suspended", target = "suspensionState", qualifiedByName = "convertSuspendedToSuspensionState") + BpmProcessDefinitionRespVO convert3(ProcessDefinition bean); + + @Named("convertSuspendedToSuspensionState") + default Integer convertSuspendedToSuspensionState(boolean suspended) { + return suspended ? SuspensionState.SUSPENDED.getStateCode() : + SuspensionState.ACTIVE.getStateCode(); + } + + default BpmProcessDefinitionPageItemRespVO convert(ProcessDefinition bean, Deployment deployment, + BpmProcessDefinitionExtDO processDefinitionExtDO, BpmFormDO form) { + BpmProcessDefinitionPageItemRespVO respVO = convert(bean); + respVO.setSuspensionState(bean.isSuspended() ? SuspensionState.SUSPENDED.getStateCode() : SuspensionState.ACTIVE.getStateCode()); + if (deployment != null) { + respVO.setDeploymentTime(LocalDateTimeUtil.of(deployment.getDeploymentTime())); + } + if (form != null) { + respVO.setFormName(form.getName()); + } + // 复制通用属性 + copyTo(processDefinitionExtDO, respVO); + return respVO; + } + + @Mapping(source = "from.id", target = "to.id", ignore = true) + void copyTo(BpmProcessDefinitionExtDO from, @MappingTarget BpmProcessDefinitionRespVO to); +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/convert/definition/BpmTaskAssignRuleConvert.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/convert/definition/BpmTaskAssignRuleConvert.java new file mode 100644 index 0000000..e8c343e --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/convert/definition/BpmTaskAssignRuleConvert.java @@ -0,0 +1,40 @@ +package com.win.module.bpm.convert.definition; + +import com.win.framework.common.util.collection.CollectionUtils; +import com.win.module.bpm.controller.definition.vo.rule.BpmTaskAssignRuleCreateReqVO; +import com.win.module.bpm.controller.definition.vo.rule.BpmTaskAssignRuleRespVO; +import com.win.module.bpm.controller.definition.vo.rule.BpmTaskAssignRuleUpdateReqVO; +import com.win.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO; +import org.flowable.bpmn.model.UserTask; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; +import java.util.Map; + +@Mapper +public interface BpmTaskAssignRuleConvert { + BpmTaskAssignRuleConvert INSTANCE = Mappers.getMapper(BpmTaskAssignRuleConvert.class); + + default List convertList(List tasks, List rules) { + Map ruleMap = CollectionUtils.convertMap(rules, BpmTaskAssignRuleDO::getTaskDefinitionKey); + // 以 UserTask 为主维度,原因是:流程图编辑后,一些规则实际就没用了。 + return CollectionUtils.convertList(tasks, task -> { + BpmTaskAssignRuleRespVO respVO = convert(ruleMap.get(task.getId())); + if (respVO == null) { + respVO = new BpmTaskAssignRuleRespVO(); + respVO.setTaskDefinitionKey(task.getId()); + } + respVO.setTaskDefinitionName(task.getName()); + return respVO; + }); + } + + BpmTaskAssignRuleRespVO convert(BpmTaskAssignRuleDO bean); + + BpmTaskAssignRuleDO convert(BpmTaskAssignRuleCreateReqVO bean); + + BpmTaskAssignRuleDO convert(BpmTaskAssignRuleUpdateReqVO bean); + + List convertList2(List list); +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/convert/definition/BpmUserGroupConvert.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/convert/definition/BpmUserGroupConvert.java new file mode 100644 index 0000000..84e7b9e --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/convert/definition/BpmUserGroupConvert.java @@ -0,0 +1,38 @@ +package com.win.module.bpm.convert.definition; + +import java.util.*; + +import com.win.module.bpm.controller.definition.vo.group.BpmUserGroupCreateReqVO; +import com.win.module.bpm.controller.definition.vo.group.BpmUserGroupRespVO; +import com.win.module.bpm.controller.definition.vo.group.BpmUserGroupUpdateReqVO; +import com.win.module.bpm.dal.dataobject.definition.BpmUserGroupDO; +import com.win.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.Named; +import org.mapstruct.factory.Mappers; + +/** + * 用户组 Convert + * + * @author 闻荫源码 + */ +@Mapper +public interface BpmUserGroupConvert { + + BpmUserGroupConvert INSTANCE = Mappers.getMapper(BpmUserGroupConvert.class); + + BpmUserGroupDO convert(BpmUserGroupCreateReqVO bean); + + BpmUserGroupDO convert(BpmUserGroupUpdateReqVO bean); + + BpmUserGroupRespVO convert(BpmUserGroupDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + @Named("convertList2") + List convertList2(List list); + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/convert/message/BpmMessageConvert.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/convert/message/BpmMessageConvert.java new file mode 100644 index 0000000..69139ba --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/convert/message/BpmMessageConvert.java @@ -0,0 +1,21 @@ +package com.win.module.bpm.convert.message; + +import com.win.module.system.api.sms.dto.send.SmsSendSingleToUserReqDTO; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.factory.Mappers; + +import java.util.Map; + +@Mapper +public interface BpmMessageConvert { + + BpmMessageConvert INSTANCE = Mappers.getMapper(BpmMessageConvert.class); + + @Mapping(target = "mobile", ignore = true) + @Mapping(source = "userId", target = "userId") + @Mapping(source = "templateCode", target = "templateCode") + @Mapping(source = "templateParams", target = "templateParams") + SmsSendSingleToUserReqDTO convert(Long userId, String templateCode, Map templateParams); + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/convert/oa/BpmOALeaveConvert.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/convert/oa/BpmOALeaveConvert.java new file mode 100644 index 0000000..99c1319 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/convert/oa/BpmOALeaveConvert.java @@ -0,0 +1,30 @@ +package com.win.module.bpm.convert.oa; + +import com.win.module.bpm.controller.oa.vo.BpmOALeaveCreateReqVO; +import com.win.module.bpm.controller.oa.vo.BpmOALeaveRespVO; +import com.win.module.bpm.dal.dataobject.oa.BpmOALeaveDO; +import com.win.framework.common.pojo.PageResult; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 请假申请 Convert + * + * @author 芋艿 + */ +@Mapper +public interface BpmOALeaveConvert { + + BpmOALeaveConvert INSTANCE = Mappers.getMapper(BpmOALeaveConvert.class); + + BpmOALeaveDO convert(BpmOALeaveCreateReqVO bean); + + BpmOALeaveRespVO convert(BpmOALeaveDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/convert/package-info.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/convert/package-info.java new file mode 100644 index 0000000..58e52d3 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/convert/package-info.java @@ -0,0 +1,6 @@ +/** + * 提供 POJO 类的实体转换 + * + * 目前使用 MapStruct 框架 + */ +package com.win.module.bpm.convert; diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/convert/task/BpmActivityConvert.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/convert/task/BpmActivityConvert.java new file mode 100644 index 0000000..dccbbaa --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/convert/task/BpmActivityConvert.java @@ -0,0 +1,30 @@ +package com.win.module.bpm.convert.task; + +import com.win.framework.common.util.date.DateUtils; +import com.win.module.bpm.controller.task.vo.activity.BpmActivityRespVO; +import org.flowable.engine.history.HistoricActivityInstance; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.Mappings; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * BPM 活动 Convert + * + * @author 闻荫源码 + */ +@Mapper(uses = DateUtils.class) +public interface BpmActivityConvert { + + BpmActivityConvert INSTANCE = Mappers.getMapper(BpmActivityConvert.class); + + List convertList(List list); + + @Mappings({ + @Mapping(source = "activityId", target = "key"), + @Mapping(source = "activityType", target = "type") + }) + BpmActivityRespVO convert(HistoricActivityInstance bean); +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/convert/task/BpmProcessInstanceConvert.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/convert/task/BpmProcessInstanceConvert.java new file mode 100644 index 0000000..41fa125 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/convert/task/BpmProcessInstanceConvert.java @@ -0,0 +1,115 @@ +package com.win.module.bpm.convert.task; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.date.DateUtils; +import com.win.framework.common.util.number.NumberUtils; +import com.win.module.bpm.controller.task.vo.instance.BpmProcessInstancePageItemRespVO; +import com.win.module.bpm.controller.task.vo.instance.BpmProcessInstanceRespVO; +import com.win.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; +import com.win.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; +import com.win.module.bpm.framework.bpm.core.event.BpmProcessInstanceResultEvent; +import com.win.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO; +import com.win.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceRejectReqDTO; +import com.win.module.system.api.dept.dto.DeptRespDTO; +import com.win.module.system.api.user.dto.AdminUserRespDTO; +import org.flowable.engine.history.HistoricProcessInstance; +import org.flowable.engine.repository.ProcessDefinition; +import org.flowable.engine.runtime.ProcessInstance; +import org.flowable.task.api.Task; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.MappingTarget; +import org.mapstruct.factory.Mappers; + +import java.util.List; +import java.util.Map; + +/** + * 流程实例 Convert + * + * @author 闻荫源码 + */ +@Mapper(uses = DateUtils.class) +public interface BpmProcessInstanceConvert { + + BpmProcessInstanceConvert INSTANCE = Mappers.getMapper(BpmProcessInstanceConvert.class); + + default PageResult convertPage(PageResult page, + Map> taskMap) { + List list = convertList(page.getList()); + list.forEach(respVO -> respVO.setTasks(convertList2(taskMap.get(respVO.getId())))); + return new PageResult<>(list, page.getTotal()); + } + + List convertList(List list); + + @Mapping(source = "processInstanceId", target = "id") + BpmProcessInstancePageItemRespVO convert(BpmProcessInstanceExtDO bean); + + List convertList2(List tasks); + + default BpmProcessInstanceRespVO convert2(HistoricProcessInstance processInstance, BpmProcessInstanceExtDO processInstanceExt, + ProcessDefinition processDefinition, BpmProcessDefinitionExtDO processDefinitionExt, + String bpmnXml, AdminUserRespDTO startUser, DeptRespDTO dept) { + BpmProcessInstanceRespVO respVO = convert2(processInstance); + copyTo(processInstanceExt, respVO); + // definition + respVO.setProcessDefinition(convert2(processDefinition)); + copyTo(processDefinitionExt, respVO.getProcessDefinition()); + respVO.getProcessDefinition().setBpmnXml(bpmnXml); + // user + if (startUser != null) { + respVO.setStartUser(convert2(startUser)); + if (dept != null) { + respVO.getStartUser().setDeptName(dept.getName()); + } + } + return respVO; + } + + BpmProcessInstanceRespVO convert2(HistoricProcessInstance bean); + + @Mapping(source = "from.id", target = "to.id", ignore = true) + void copyTo(BpmProcessInstanceExtDO from, @MappingTarget BpmProcessInstanceRespVO to); + + BpmProcessInstanceRespVO.ProcessDefinition convert2(ProcessDefinition bean); + + @Mapping(source = "from.id", target = "to.id", ignore = true) + void copyTo(BpmProcessDefinitionExtDO from, @MappingTarget BpmProcessInstanceRespVO.ProcessDefinition to); + + BpmProcessInstanceRespVO.User convert2(AdminUserRespDTO bean); + + default BpmProcessInstanceResultEvent convert(Object source, HistoricProcessInstance instance, Integer result) { + BpmProcessInstanceResultEvent event = new BpmProcessInstanceResultEvent(source); + event.setId(instance.getId()); + event.setProcessDefinitionKey(instance.getProcessDefinitionKey()); + event.setBusinessKey(instance.getBusinessKey()); + event.setResult(result); + return event; + } + + default BpmProcessInstanceResultEvent convert(Object source, ProcessInstance instance, Integer result) { + BpmProcessInstanceResultEvent event = new BpmProcessInstanceResultEvent(source); + event.setId(instance.getId()); + event.setProcessDefinitionKey(instance.getProcessDefinitionKey()); + event.setBusinessKey(instance.getBusinessKey()); + event.setResult(result); + return event; + } + + default BpmMessageSendWhenProcessInstanceApproveReqDTO convert2ApprovedReq(ProcessInstance instance){ + return new BpmMessageSendWhenProcessInstanceApproveReqDTO() + .setStartUserId(NumberUtils.parseLong(instance.getStartUserId())) + .setProcessInstanceId(instance.getId()) + .setProcessInstanceName(instance.getName()); + } + + default BpmMessageSendWhenProcessInstanceRejectReqDTO convert2RejectReq(ProcessInstance instance, String reason) { + return new BpmMessageSendWhenProcessInstanceRejectReqDTO() + .setProcessInstanceName(instance.getName()) + .setProcessInstanceId(instance.getId()) + .setReason(reason) + .setStartUserId(NumberUtils.parseLong(instance.getStartUserId())); + } + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/convert/task/BpmTaskConvert.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/convert/task/BpmTaskConvert.java new file mode 100644 index 0000000..326e717 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/convert/task/BpmTaskConvert.java @@ -0,0 +1,141 @@ +package com.win.module.bpm.convert.task; + +import cn.hutool.core.date.LocalDateTimeUtil; +import com.win.framework.common.util.collection.CollectionUtils; +import com.win.framework.common.util.date.DateUtils; +import com.win.framework.common.util.number.NumberUtils; +import com.win.module.bpm.controller.task.vo.task.BpmTaskDonePageItemRespVO; +import com.win.module.bpm.controller.task.vo.task.BpmTaskRespVO; +import com.win.module.bpm.controller.task.vo.task.BpmTaskTodoPageItemRespVO; +import com.win.module.bpm.dal.dataobject.task.BpmTaskExtDO; +import com.win.module.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO; +import com.win.module.system.api.dept.dto.DeptRespDTO; +import com.win.module.system.api.user.dto.AdminUserRespDTO; +import org.flowable.common.engine.impl.db.SuspensionState; +import org.flowable.engine.history.HistoricProcessInstance; +import org.flowable.engine.runtime.ProcessInstance; +import org.flowable.task.api.Task; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.mapstruct.*; +import org.mapstruct.factory.Mappers; + +import java.util.List; +import java.util.Map; + +/** + * Bpm 任务 Convert + * + * @author 闻荫源码 + */ +@Mapper(uses = DateUtils.class) +public interface BpmTaskConvert { + + BpmTaskConvert INSTANCE = Mappers.getMapper(BpmTaskConvert.class); + + default List convertList1(List tasks, + Map processInstanceMap, + Map userMap) { + return CollectionUtils.convertList(tasks, task -> { + BpmTaskTodoPageItemRespVO respVO = convert1(task); + ProcessInstance processInstance = processInstanceMap.get(task.getProcessInstanceId()); + if (processInstance != null) { + AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId())); + respVO.setProcessInstance(convert(processInstance, startUser)); + } + return respVO; + }); + } + + @Mapping(source = "suspended", target = "suspensionState", qualifiedByName = "convertSuspendedToSuspensionState") + BpmTaskTodoPageItemRespVO convert1(Task bean); + + @Named("convertSuspendedToSuspensionState") + default Integer convertSuspendedToSuspensionState(boolean suspended) { + return suspended ? SuspensionState.SUSPENDED.getStateCode() : SuspensionState.ACTIVE.getStateCode(); + } + + default List convertList2(List tasks, + Map bpmTaskExtDOMap, Map historicProcessInstanceMap, + Map userMap) { + return CollectionUtils.convertList(tasks, task -> { + BpmTaskDonePageItemRespVO respVO = convert2(task); + BpmTaskExtDO taskExtDO = bpmTaskExtDOMap.get(task.getId()); + copyTo(taskExtDO, respVO); + HistoricProcessInstance processInstance = historicProcessInstanceMap.get(task.getProcessInstanceId()); + if (processInstance != null) { + AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId())); + respVO.setProcessInstance(convert(processInstance, startUser)); + } + return respVO; + }); + } + + BpmTaskDonePageItemRespVO convert2(HistoricTaskInstance bean); + + @Mappings({ + @Mapping(source = "processInstance.id", target = "id"), + @Mapping(source = "processInstance.name", target = "name"), + @Mapping(source = "processInstance.startUserId", target = "startUserId"), + @Mapping(source = "processInstance.processDefinitionId", target = "processDefinitionId"), + @Mapping(source = "startUser.nickname", target = "startUserNickname") + }) + BpmTaskTodoPageItemRespVO.ProcessInstance convert(ProcessInstance processInstance, AdminUserRespDTO startUser); + + default List convertList3(List tasks, + Map bpmTaskExtDOMap, HistoricProcessInstance processInstance, + Map userMap, Map deptMap) { + return CollectionUtils.convertList(tasks, task -> { + BpmTaskRespVO respVO = convert3(task); + BpmTaskExtDO taskExtDO = bpmTaskExtDOMap.get(task.getId()); + copyTo(taskExtDO, respVO); + if (processInstance != null) { + AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId())); + respVO.setProcessInstance(convert(processInstance, startUser)); + } + AdminUserRespDTO assignUser = userMap.get(NumberUtils.parseLong(task.getAssignee())); + if (assignUser != null) { + respVO.setAssigneeUser(convert3(assignUser)); + DeptRespDTO dept = deptMap.get(assignUser.getDeptId()); + if (dept != null) { + respVO.getAssigneeUser().setDeptName(dept.getName()); + } + } + return respVO; + }); + } + + @Mapping(source = "taskDefinitionKey", target = "definitionKey") + BpmTaskRespVO convert3(HistoricTaskInstance bean); + + BpmTaskRespVO.User convert3(AdminUserRespDTO bean); + + @Mapping(target = "id", ignore = true) + void copyTo(BpmTaskExtDO from, @MappingTarget BpmTaskDonePageItemRespVO to); + + @Mappings({@Mapping(source = "processInstance.id", target = "id"), + @Mapping(source = "processInstance.name", target = "name"), + @Mapping(source = "processInstance.startUserId", target = "startUserId"), + @Mapping(source = "processInstance.processDefinitionId", target = "processDefinitionId"), + @Mapping(source = "startUser.nickname", target = "startUserNickname")}) + BpmTaskTodoPageItemRespVO.ProcessInstance convert(HistoricProcessInstance processInstance, + AdminUserRespDTO startUser); + + default BpmTaskExtDO convert2TaskExt(Task task) { + BpmTaskExtDO taskExtDO = new BpmTaskExtDO().setTaskId(task.getId()) + .setAssigneeUserId(NumberUtils.parseLong(task.getAssignee())).setName(task.getName()) + .setProcessDefinitionId(task.getProcessDefinitionId()).setProcessInstanceId(task.getProcessInstanceId()); + taskExtDO.setCreateTime(LocalDateTimeUtil.of(task.getCreateTime())); + return taskExtDO; + } + + default BpmMessageSendWhenTaskCreatedReqDTO convert(ProcessInstance processInstance, AdminUserRespDTO startUser, + Task task) { + BpmMessageSendWhenTaskCreatedReqDTO reqDTO = new BpmMessageSendWhenTaskCreatedReqDTO(); + reqDTO.setProcessInstanceId(processInstance.getProcessInstanceId()) + .setProcessInstanceName(processInstance.getName()).setStartUserId(startUser.getId()) + .setStartUserNickname(startUser.getNickname()).setTaskId(task.getId()).setTaskName(task.getName()) + .setAssigneeUserId(NumberUtils.parseLong(task.getAssignee())); + return reqDTO; + } + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/convert/task/package-info.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/convert/task/package-info.java new file mode 100644 index 0000000..e8b27dd --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/convert/task/package-info.java @@ -0,0 +1 @@ +package com.win.module.bpm.convert.task; diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/dataobject/definition/BpmFormDO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/dataobject/definition/BpmFormDO.java new file mode 100644 index 0000000..2d9ed89 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/dataobject/definition/BpmFormDO.java @@ -0,0 +1,57 @@ +package com.win.module.bpm.dal.dataobject.definition; + +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.*; + +import java.util.List; + +/** + * 工作流的表单定义 + * 用于工作流的申请表单,需要动态配置的场景 + * + * @author 闻荫源码 + */ +@TableName(value = "bpm_form", autoResultMap = true) +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class BpmFormDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 表单名 + */ + private String name; + /** + * 状态 + */ + private Integer status; + /** + * 表单的配置 + */ + private String conf; + /** + * 表单项的数组 + * + * 目前直接将 https://github.com/JakHuang/form-generator 生成的 JSON 串,直接保存 + * 定义:https://github.com/JakHuang/form-generator/issues/46 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List fields; + /** + * 备注 + */ + private String remark; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/dataobject/definition/BpmProcessDefinitionExtDO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/dataobject/definition/BpmProcessDefinitionExtDO.java new file mode 100644 index 0000000..c3608ab --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/dataobject/definition/BpmProcessDefinitionExtDO.java @@ -0,0 +1,90 @@ +package com.win.module.bpm.dal.dataobject.definition; + +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.module.bpm.enums.definition.BpmModelFormTypeEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.*; + +import java.util.List; + +/** + * Bpm 流程定义的拓展表 + * 主要解决 Activiti {@link ProcessDefinition} 不支持拓展字段,所以新建拓展表 + * + * @author 闻荫源码 + */ +@TableName(value = "bpm_process_definition_ext", autoResultMap = true) +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class BpmProcessDefinitionExtDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 流程定义的编号 + * + * 关联 ProcessDefinition 的 id 属性 + */ + private String processDefinitionId; + /** + * 流程模型的编号 + * + * 关联 Model 的 id 属性 + */ + private String modelId; + /** + * 描述 + */ + private String description; + + /** + * 表单类型 + * + * 关联 {@link BpmModelFormTypeEnum} + */ + private Integer formType; + /** + * 动态表单编号 + * 在表单类型为 {@link BpmModelFormTypeEnum#NORMAL} 时 + * + * 关联 {@link BpmFormDO#getId()} + */ + private Long formId; + /** + * 表单的配置 + * 在表单类型为 {@link BpmModelFormTypeEnum#NORMAL} 时 + * + * 冗余 {@link BpmFormDO#getConf()} + */ + private String formConf; + /** + * 表单项的数组 + * 在表单类型为 {@link BpmModelFormTypeEnum#NORMAL} 时 + * + * 冗余 {@link BpmFormDO#getFields()} ()} + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List formFields; + /** + * 自定义表单的提交路径,使用 Vue 的路由地址 + * 在表单类型为 {@link BpmModelFormTypeEnum#CUSTOM} 时 + */ + private String formCustomCreatePath; + /** + * 自定义表单的查看路径,使用 Vue 的路由地址 + * 在表单类型为 {@link BpmModelFormTypeEnum#CUSTOM} 时 + */ + private String formCustomViewPath; + + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/dataobject/definition/BpmTaskAssignRuleDO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/dataobject/definition/BpmTaskAssignRuleDO.java new file mode 100644 index 0000000..ac782b3 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/dataobject/definition/BpmTaskAssignRuleDO.java @@ -0,0 +1,83 @@ +package com.win.module.bpm.dal.dataobject.definition; + +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.framework.mybatis.core.type.JsonLongSetTypeHandler; +import com.win.module.bpm.enums.definition.BpmTaskAssignRuleTypeEnum; +import com.win.module.bpm.enums.definition.BpmTaskRuleScriptEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.util.Set; + +/** + * Bpm 任务分配的规则表,用于自定义配置每个任务的负责人、候选人的分配规则。 + * 也就是说,废弃 BPMN 原本的 UserTask 设置的 assignee、candidateUsers 等配置,而是通过使用该规则进行计算对应的负责人。 + * + * 1. 默认情况下,{@link #processDefinitionId} 为 {@link #PROCESS_DEFINITION_ID_NULL} 值,表示贵改则与流程模型关联 + * 2. 在流程模型部署后,会将他的所有规则记录,复制出一份新部署出来的流程定义,通过设置 {@link #processDefinitionId} 为新的流程定义的编号进行关联 + * + * @author 闻荫源码 + */ +@TableName(value = "bpm_task_assign_rule", autoResultMap = true) +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class BpmTaskAssignRuleDO extends BaseDO { + + /** + * {@link #processDefinitionId} 空串,用于标识属于流程模型,而不属于流程定义 + */ + public static final String PROCESS_DEFINITION_ID_NULL = ""; + + /** + * 编号 + */ + @TableId + private Long id; + + /** + * 流程模型编号 + * + * 关联 Model 的 id 属性 + */ + private String modelId; + /** + * 流程定义编号 + * + * 关联 ProcessDefinition 的 id 属性 + */ + private String processDefinitionId; + /** + * 流程任务的定义 Key + * + * 关联 Task 的 taskDefinitionKey 属性 + */ + private String taskDefinitionKey; + + /** + * 规则类型 + * + * 枚举 {@link BpmTaskAssignRuleTypeEnum} + */ + @TableField("`type`") + private Integer type; + /** + * 规则值数组,一般关联指定表的编号 + * 根据 type 不同,对应的值是不同的: + * + * 1. {@link BpmTaskAssignRuleTypeEnum#ROLE} 时:角色编号 + * 2. {@link BpmTaskAssignRuleTypeEnum#DEPT_MEMBER} 时:部门编号 + * 3. {@link BpmTaskAssignRuleTypeEnum#DEPT_LEADER} 时:部门编号 + * 4. {@link BpmTaskAssignRuleTypeEnum#USER} 时:用户编号 + * 5. {@link BpmTaskAssignRuleTypeEnum#USER_GROUP} 时:用户组编号 + * 6. {@link BpmTaskAssignRuleTypeEnum#SCRIPT} 时:脚本编号,目前通过 {@link BpmTaskRuleScriptEnum#getId()} 标识 + */ + @TableField(typeHandler = JsonLongSetTypeHandler.class) + private Set options; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/dataobject/definition/BpmTaskMessageRuleDO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/dataobject/definition/BpmTaskMessageRuleDO.java new file mode 100644 index 0000000..69075b3 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/dataobject/definition/BpmTaskMessageRuleDO.java @@ -0,0 +1,5 @@ +package com.win.module.bpm.dal.dataobject.definition; + +// TODO 芋艿:先埋个坑。任务消息的配置规则。说白了,就是不同的 +public class BpmTaskMessageRuleDO { +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/dataobject/definition/BpmUserGroupDO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/dataobject/definition/BpmUserGroupDO.java new file mode 100644 index 0000000..387559b --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/dataobject/definition/BpmUserGroupDO.java @@ -0,0 +1,52 @@ +package com.win.module.bpm.dal.dataobject.definition; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.framework.mybatis.core.type.JsonLongSetTypeHandler; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.util.Set; + +/** + * Bpm 用户组 + * + * @author 闻荫源码 + */ +@TableName(value = "bpm_user_group", autoResultMap = true) +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class BpmUserGroupDO extends BaseDO { + + /** + * 编号,自增 + */ + @TableId + private Long id; + /** + * 组名 + */ + private String name; + /** + * 描述 + */ + private String description; + /** + * 状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 成员用户编号数组 + */ + @TableField(typeHandler = JsonLongSetTypeHandler.class) + private Set memberUserIds; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/dataobject/oa/BpmOALeaveDO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/dataobject/oa/BpmOALeaveDO.java new file mode 100644 index 0000000..66be9ca --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/dataobject/oa/BpmOALeaveDO.java @@ -0,0 +1,73 @@ +package com.win.module.bpm.dal.dataobject.oa; + +import com.win.module.bpm.enums.task.BpmProcessInstanceResultEnum; +import lombok.*; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import com.win.framework.mybatis.core.dataobject.BaseDO; + +/** + * OA 请假申请 DO + * + * {@link #day} 请假天数,目前先简单做。一般是分成请假上午和下午,可以是 1 整天,可以是 0.5 半天 + * + * @author jason + * @author 闻荫源码 + */ +@TableName("bpm_oa_leave") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class BpmOALeaveDO extends BaseDO { + + /** + * 请假表单主键 + */ + @TableId + private Long id; + /** + * 申请人的用户编号 + * + * 关联 AdminUserDO 的 id 属性 + */ + private Long userId; + /** + * 请假类型 + */ + @TableField("`type`") + private String type; + /** + * 原因 + */ + private String reason; + /** + * 开始时间 + */ + private LocalDateTime startTime; + /** + * 结束时间 + */ + private LocalDateTime endTime; + /** + * 请假天数 + */ + private Long day; + /** + * 请假的结果 + * + * 枚举 {@link BpmProcessInstanceResultEnum} + * 考虑到简单,所以直接复用了 BpmProcessInstanceResultEnum 枚举,也可以自己定义一个枚举哈 + */ + private Integer result; + + /** + * 对应的流程编号 + * + * 关联 ProcessInstance 的 id 属性 + */ + private String processInstanceId; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/dataobject/task/BpmProcessInstanceExtDO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/dataobject/task/BpmProcessInstanceExtDO.java new file mode 100644 index 0000000..fd107fa --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/dataobject/task/BpmProcessInstanceExtDO.java @@ -0,0 +1,90 @@ +package com.win.module.bpm.dal.dataobject.task; + +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.module.bpm.enums.task.BpmProcessInstanceResultEnum; +import com.win.module.bpm.enums.task.BpmProcessInstanceStatusEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.time.LocalDateTime; +import java.util.Map; + +/** + * Bpm 流程实例的拓展表 + * 主要解决 Activiti ProcessInstance 和 HistoricProcessInstance 不支持拓展字段,所以新建拓展表 + * + * @author 闻荫源码 + */ +@TableName(value = "bpm_process_instance_ext", autoResultMap = true) +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class BpmProcessInstanceExtDO extends BaseDO { + + /** + * 编号,自增 + */ + @TableId + private Long id; + /** + * 发起流程的用户编号 + * + * 冗余 HistoricProcessInstance 的 startUserId 属性 + */ + private Long startUserId; + /** + * 流程实例的名字 + * + * 冗余 ProcessInstance 的 name 属性,用于筛选 + */ + private String name; + /** + * 流程实例的编号 + * + * 关联 ProcessInstance 的 id 属性 + */ + private String processInstanceId; + /** + * 流程定义的编号 + * + * 关联 ProcessDefinition 的 id 属性 + */ + private String processDefinitionId; + /** + * 流程分类 + * + * 冗余 ProcessDefinition 的 category 属性 + * 数据字典 bpm_model_category + */ + private String category; + /** + * 流程实例的状态 + * + * 枚举 {@link BpmProcessInstanceStatusEnum} + */ + private Integer status; + /** + * 流程实例的结果 + * + * 枚举 {@link BpmProcessInstanceResultEnum} + */ + private Integer result; + /** + * 结束时间 + * + * 冗余 HistoricProcessInstance 的 endTime 属性 + */ + private LocalDateTime endTime; + + /** + * 提交的表单值 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private Map formVariables; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/dataobject/task/BpmTaskExtDO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/dataobject/task/BpmTaskExtDO.java new file mode 100644 index 0000000..2edc517 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/dataobject/task/BpmTaskExtDO.java @@ -0,0 +1,85 @@ +package com.win.module.bpm.dal.dataobject.task; + +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.module.bpm.enums.task.BpmProcessInstanceResultEnum; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.time.LocalDateTime; + +/** + * Bpm 流程任务的拓展表 + * 主要解决 Flowable Task 和 HistoricTaskInstance 不支持拓展字段,所以新建拓展表 + * + * @author 闻荫源码 + */ +@TableName(value = "bpm_task_ext", autoResultMap = true) +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class BpmTaskExtDO extends BaseDO { + + /** + * 编号,自增 + */ + @TableId + private Long id; + + /** + * 任务的审批人 + * + * 冗余 Task 的 assignee 属性 + */ + private Long assigneeUserId; + /** + * 任务的名字 + * + * 冗余 Task 的 name 属性,为了筛选 + */ + private String name; + /** + * 任务的编号 + * + * 关联 Task 的 id 属性 + */ + private String taskId; +// /** +// * 任务的标识 +// * +// * 关联 {@link Task#getTaskDefinitionKey()} +// */ +// private String definitionKey; + /** + * 任务的结果 + * + * 枚举 {@link BpmProcessInstanceResultEnum} + */ + private Integer result; + /** + * 审批建议 + */ + private String reason; + /** + * 任务的结束时间 + * + * 冗余 HistoricTaskInstance 的 endTime 属性 + */ + private LocalDateTime endTime; + + /** + * 流程实例的编号 + * + * 关联 ProcessInstance 的 id 属性 + */ + private String processInstanceId; + /** + * 流程定义的编号 + * + * 关联 ProcessDefinition 的 id 属性 + */ + private String processDefinitionId; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/mysql/definition/BpmFormMapper.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/mysql/definition/BpmFormMapper.java new file mode 100644 index 0000000..f31095a --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/mysql/definition/BpmFormMapper.java @@ -0,0 +1,25 @@ +package com.win.module.bpm.dal.mysql.definition; + + +import com.win.module.bpm.controller.definition.vo.form.BpmFormPageReqVO; +import com.win.module.bpm.dal.dataobject.definition.BpmFormDO; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.QueryWrapperX; +import org.apache.ibatis.annotations.Mapper; + +/** + * 动态表单 Mapper + * + * @author 风里雾里 + */ +@Mapper +public interface BpmFormMapper extends BaseMapperX { + + default PageResult selectPage(BpmFormPageReqVO reqVO) { + return selectPage(reqVO, new QueryWrapperX() + .likeIfPresent("name", reqVO.getName()) + .orderByDesc("id")); + } + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/mysql/definition/BpmProcessDefinitionExtMapper.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/mysql/definition/BpmProcessDefinitionExtMapper.java new file mode 100644 index 0000000..9a5301a --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/mysql/definition/BpmProcessDefinitionExtMapper.java @@ -0,0 +1,22 @@ +package com.win.module.bpm.dal.mysql.definition; + +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Collection; +import java.util.List; + +@Mapper +public interface BpmProcessDefinitionExtMapper extends BaseMapperX { + + default List selectListByProcessDefinitionIds(Collection processDefinitionIds) { + return selectList("process_definition_id", processDefinitionIds); + } + + default BpmProcessDefinitionExtDO selectByProcessDefinitionId(String processDefinitionId) { + return selectOne("process_definition_id", processDefinitionId); + } + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/mysql/definition/BpmTaskAssignRuleMapper.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/mysql/definition/BpmTaskAssignRuleMapper.java new file mode 100644 index 0000000..21f7c8c --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/mysql/definition/BpmTaskAssignRuleMapper.java @@ -0,0 +1,37 @@ +package com.win.module.bpm.dal.mysql.definition; + +import com.win.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.QueryWrapperX; +import org.apache.ibatis.annotations.Mapper; +import org.springframework.lang.Nullable; + +import java.util.List; + +@Mapper +public interface BpmTaskAssignRuleMapper extends BaseMapperX { + + default List selectListByProcessDefinitionId(String processDefinitionId, + @Nullable String taskDefinitionKey) { + return selectList(new QueryWrapperX() + .eq("process_definition_id", processDefinitionId) + .eqIfPresent("task_definition_key", taskDefinitionKey)); + } + + default List selectListByModelId(String modelId) { + return selectList(new QueryWrapperX() + .eq("model_id", modelId) + .eq("process_definition_id", BpmTaskAssignRuleDO.PROCESS_DEFINITION_ID_NULL)); + } + + default BpmTaskAssignRuleDO selectListByModelIdAndTaskDefinitionKey(String modelId, + String taskDefinitionKey) { + return selectOne(new QueryWrapperX() + .eq("model_id", modelId) + .eq("process_definition_id", BpmTaskAssignRuleDO.PROCESS_DEFINITION_ID_NULL) + .eq("task_definition_key", taskDefinitionKey)); + } + + + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/mysql/definition/BpmUserGroupMapper.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/mysql/definition/BpmUserGroupMapper.java new file mode 100644 index 0000000..384d545 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/mysql/definition/BpmUserGroupMapper.java @@ -0,0 +1,32 @@ +package com.win.module.bpm.dal.mysql.definition; + +import com.win.module.bpm.controller.definition.vo.group.BpmUserGroupPageReqVO; +import com.win.module.bpm.dal.dataobject.definition.BpmUserGroupDO; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 用户组 Mapper + * + * @author 闻荫源码 + */ +@Mapper +public interface BpmUserGroupMapper extends BaseMapperX { + + default PageResult selectPage(BpmUserGroupPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(BpmUserGroupDO::getName, reqVO.getName()) + .eqIfPresent(BpmUserGroupDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(BpmUserGroupDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(BpmUserGroupDO::getId)); + } + + default List selectListByStatus(Integer status) { + return selectList(BpmUserGroupDO::getStatus, status); + } + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/mysql/oa/BpmOALeaveMapper.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/mysql/oa/BpmOALeaveMapper.java new file mode 100644 index 0000000..0dcf4a9 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/mysql/oa/BpmOALeaveMapper.java @@ -0,0 +1,29 @@ +package com.win.module.bpm.dal.mysql.oa; + +import com.win.module.bpm.controller.oa.vo.BpmOALeavePageReqVO; +import com.win.module.bpm.dal.dataobject.oa.BpmOALeaveDO; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import org.apache.ibatis.annotations.Mapper; + +/** + * 请假申请 Mapper + * + * @author jason + * @author 闻荫源码 + */ +@Mapper +public interface BpmOALeaveMapper extends BaseMapperX { + + default PageResult selectPage(Long userId, BpmOALeavePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(BpmOALeaveDO::getUserId, userId) + .eqIfPresent(BpmOALeaveDO::getResult, reqVO.getResult()) + .eqIfPresent(BpmOALeaveDO::getType, reqVO.getType()) + .likeIfPresent(BpmOALeaveDO::getReason, reqVO.getReason()) + .betweenIfPresent(BpmOALeaveDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(BpmOALeaveDO::getId)); + } + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/mysql/task/BpmProcessInstanceExtMapper.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/mysql/task/BpmProcessInstanceExtMapper.java new file mode 100644 index 0000000..436c6d1 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/mysql/task/BpmProcessInstanceExtMapper.java @@ -0,0 +1,34 @@ +package com.win.module.bpm.dal.mysql.task; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.bpm.controller.task.vo.instance.BpmProcessInstanceMyPageReqVO; +import com.win.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface BpmProcessInstanceExtMapper extends BaseMapperX { + + default PageResult selectPage(Long userId, BpmProcessInstanceMyPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(BpmProcessInstanceExtDO::getStartUserId, userId) + .likeIfPresent(BpmProcessInstanceExtDO::getName, reqVO.getName()) + .eqIfPresent(BpmProcessInstanceExtDO::getProcessDefinitionId, reqVO.getProcessDefinitionId()) + .eqIfPresent(BpmProcessInstanceExtDO::getCategory, reqVO.getCategory()) + .eqIfPresent(BpmProcessInstanceExtDO::getStatus, reqVO.getStatus()) + .eqIfPresent(BpmProcessInstanceExtDO::getResult, reqVO.getResult()) + .betweenIfPresent(BpmProcessInstanceExtDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(BpmProcessInstanceExtDO::getId)); + } + + default BpmProcessInstanceExtDO selectByProcessInstanceId(String processInstanceId) { + return selectOne(BpmProcessInstanceExtDO::getProcessInstanceId, processInstanceId); + } + + default void updateByProcessInstanceId(BpmProcessInstanceExtDO updateObj) { + update(updateObj, new LambdaQueryWrapperX() + .eq(BpmProcessInstanceExtDO::getProcessInstanceId, updateObj.getProcessInstanceId())); + } + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/mysql/task/BpmTaskExtMapper.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/mysql/task/BpmTaskExtMapper.java new file mode 100644 index 0000000..7c4fc4d --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/mysql/task/BpmTaskExtMapper.java @@ -0,0 +1,26 @@ +package com.win.module.bpm.dal.mysql.task; + +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.module.bpm.dal.dataobject.task.BpmTaskExtDO; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Collection; +import java.util.List; + +@Mapper +public interface BpmTaskExtMapper extends BaseMapperX { + + default void updateByTaskId(BpmTaskExtDO entity) { + update(entity, new LambdaQueryWrapper().eq(BpmTaskExtDO::getTaskId, entity.getTaskId())); + } + + default List selectListByTaskIds(Collection taskIds) { + return selectList(BpmTaskExtDO::getTaskId, taskIds); + } + + default BpmTaskExtDO selectByTaskId(String taskId) { + return selectOne(BpmTaskExtDO::getTaskId, taskId); + } + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/bpm/config/BpmCommonConfiguration.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/bpm/config/BpmCommonConfiguration.java new file mode 100644 index 0000000..a0aa2bb --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/bpm/config/BpmCommonConfiguration.java @@ -0,0 +1,19 @@ +package com.win.module.bpm.framework.bpm.config; + +import com.win.module.bpm.framework.bpm.core.event.BpmProcessInstanceResultEventPublisher; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * BPM 通用的 Configuration 配置类,提供给 Activiti 和 Flowable + */ +@Configuration(proxyBeanMethods = false) +public class BpmCommonConfiguration { + + @Bean + public BpmProcessInstanceResultEventPublisher processInstanceResultEventPublisher(ApplicationEventPublisher publisher) { + return new BpmProcessInstanceResultEventPublisher(publisher); + } + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/bpm/config/BpmSecurityConfiguration.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/bpm/config/BpmSecurityConfiguration.java new file mode 100644 index 0000000..659593e --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/bpm/config/BpmSecurityConfiguration.java @@ -0,0 +1,28 @@ +package com.win.module.bpm.framework.bpm.config; + +import com.win.framework.security.config.AuthorizeRequestsCustomizer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer; + +/** + * @author kemengkai + * @create 2022-05-07 08:15 + */ +@Configuration("bpmSecurityConfiguration") +public class BpmSecurityConfiguration { + + @Bean("bpmAuthorizeRequestsCustomizer") + public AuthorizeRequestsCustomizer authorizeRequestsCustomizer() { + return new AuthorizeRequestsCustomizer() { + + @Override + public void customize(ExpressionUrlAuthorizationConfigurer.ExpressionInterceptUrlRegistry registry) { + // 任务回退接口 + registry.antMatchers(buildAdminApi("/bpm/task/back")).permitAll(); + } + + }; + } +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/bpm/core/event/BpmProcessInstanceResultEvent.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/bpm/core/event/BpmProcessInstanceResultEvent.java new file mode 100644 index 0000000..d91ca5e --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/bpm/core/event/BpmProcessInstanceResultEvent.java @@ -0,0 +1,44 @@ +package com.win.module.bpm.framework.bpm.core.event; + +import com.win.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; +import lombok.Data; +import org.springframework.context.ApplicationEvent; + +import javax.validation.constraints.NotNull; + +/** + * 流程实例的结果发生变化的 Event + * 定位:由于额外增加了 {@link BpmProcessInstanceExtDO#getResult()} 结果,所以增加该事件 + * + * @author 闻荫源码 + */ +@SuppressWarnings("ALL") +@Data +public class BpmProcessInstanceResultEvent extends ApplicationEvent { + + /** + * 流程实例的编号 + */ + @NotNull(message = "流程实例的编号不能为空") + private String id; + /** + * 流程实例的 key + */ + @NotNull(message = "流程实例的 key 不能为空") + private String processDefinitionKey; + /** + * 流程实例的结果 + */ + @NotNull(message = "流程实例的结果不能为空") + private Integer result; + /** + * 流程实例对应的业务标识 + * 例如说,请假 + */ + private String businessKey; + + public BpmProcessInstanceResultEvent(Object source) { + super(source); + } + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/bpm/core/event/BpmProcessInstanceResultEventListener.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/bpm/core/event/BpmProcessInstanceResultEventListener.java new file mode 100644 index 0000000..6a8bfe3 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/bpm/core/event/BpmProcessInstanceResultEventListener.java @@ -0,0 +1,34 @@ +package com.win.module.bpm.framework.bpm.core.event; + +import cn.hutool.core.util.StrUtil; +import org.springframework.context.ApplicationListener; + +/** + * {@link BpmProcessInstanceResultEvent} 的监听器 + * + * @author 闻荫源码 + */ +public abstract class BpmProcessInstanceResultEventListener + implements ApplicationListener { + + @Override + public final void onApplicationEvent(BpmProcessInstanceResultEvent event) { + if (!StrUtil.equals(event.getProcessDefinitionKey(), getProcessDefinitionKey())) { + return; + } + onEvent(event); + } + + /** + * @return 返回监听的流程定义 Key + */ + protected abstract String getProcessDefinitionKey(); + + /** + * 处理事件 + * + * @param event 事件 + */ + protected abstract void onEvent(BpmProcessInstanceResultEvent event); + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/bpm/core/event/BpmProcessInstanceResultEventPublisher.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/bpm/core/event/BpmProcessInstanceResultEventPublisher.java new file mode 100644 index 0000000..c0758f5 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/bpm/core/event/BpmProcessInstanceResultEventPublisher.java @@ -0,0 +1,24 @@ +package com.win.module.bpm.framework.bpm.core.event; + +import lombok.AllArgsConstructor; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.validation.annotation.Validated; + +import javax.validation.Valid; + +/** + * {@link BpmProcessInstanceResultEvent} 的生产者 + * + * @author 闻荫源码 + */ +@AllArgsConstructor +@Validated +public class BpmProcessInstanceResultEventPublisher { + + private final ApplicationEventPublisher publisher; + + public void sendProcessInstanceResultEvent(@Valid BpmProcessInstanceResultEvent event) { + publisher.publishEvent(event); + } + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/bpm/core/event/package-info.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/bpm/core/event/package-info.java new file mode 100644 index 0000000..c6f06a5 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/bpm/core/event/package-info.java @@ -0,0 +1,6 @@ +/** + * 自定义 Event 实现,提供方便业务接入的 Listener! + * + * @author 闻荫源码 + */ +package com.win.module.bpm.framework.bpm.core.event; diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/bpm/core/package-info.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/bpm/core/package-info.java new file mode 100644 index 0000000..034d445 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/bpm/core/package-info.java @@ -0,0 +1,4 @@ +/** + * 占位 + */ +package com.win.module.bpm.framework.bpm.core; diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/bpm/package-info.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/bpm/package-info.java new file mode 100644 index 0000000..42b13db --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/bpm/package-info.java @@ -0,0 +1,6 @@ +/** + * 提供给 Activiti 和 Flowable 的通用封装 + * + * @author 闻荫源码 + */ +package com.win.module.bpm.framework.bpm; diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/flowable/config/BpmFlowableConfiguration.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/flowable/config/BpmFlowableConfiguration.java new file mode 100644 index 0000000..c52b949 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/flowable/config/BpmFlowableConfiguration.java @@ -0,0 +1,46 @@ +package com.win.module.bpm.framework.flowable.config; + +import cn.hutool.core.collection.ListUtil; +import com.win.module.bpm.framework.flowable.core.behavior.BpmActivityBehaviorFactory; +import com.win.module.bpm.service.definition.BpmTaskAssignRuleService; +import org.flowable.common.engine.api.delegate.event.FlowableEventListener; +import org.flowable.spring.SpringProcessEngineConfiguration; +import org.flowable.spring.boot.EngineConfigurationConfigurer; +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * BPM 模块的 Flowable 配置类 + * + * @author jason + */ +@Configuration(proxyBeanMethods = false) +public class BpmFlowableConfiguration { + + /** + * BPM 模块的 ProcessEngineConfigurationConfigurer 实现类: + * + * 1. 设置各种监听器 + * 2. 设置自定义的 ActivityBehaviorFactory 实现 + */ + @Bean + public EngineConfigurationConfigurer bpmProcessEngineConfigurationConfigurer( + ObjectProvider listeners, + BpmActivityBehaviorFactory bpmActivityBehaviorFactory) { + return configuration -> { + // 注册监听器,例如说 BpmActivityEventListener + configuration.setEventListeners(ListUtil.toList(listeners.iterator())); + // 设置 ActivityBehaviorFactory 实现类,用于流程任务的审核人的自定义 + configuration.setActivityBehaviorFactory(bpmActivityBehaviorFactory); + }; + } + + @Bean + public BpmActivityBehaviorFactory bpmActivityBehaviorFactory(BpmTaskAssignRuleService taskRuleService) { + BpmActivityBehaviorFactory bpmActivityBehaviorFactory = new BpmActivityBehaviorFactory(); + bpmActivityBehaviorFactory.setBpmTaskRuleService(taskRuleService); + return bpmActivityBehaviorFactory; + } + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/flowable/core/behavior/BpmActivityBehaviorFactory.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/flowable/core/behavior/BpmActivityBehaviorFactory.java new file mode 100644 index 0000000..be1d4bb --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/flowable/core/behavior/BpmActivityBehaviorFactory.java @@ -0,0 +1,44 @@ +package com.win.module.bpm.framework.flowable.core.behavior; + +import com.win.module.bpm.service.definition.BpmTaskAssignRuleService; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.Setter; +import lombok.ToString; +import org.flowable.bpmn.model.Activity; +import org.flowable.bpmn.model.UserTask; +import org.flowable.engine.impl.bpmn.behavior.AbstractBpmnActivityBehavior; +import org.flowable.engine.impl.bpmn.behavior.ParallelMultiInstanceBehavior; +import org.flowable.engine.impl.bpmn.behavior.UserTaskActivityBehavior; +import org.flowable.engine.impl.bpmn.parser.factory.DefaultActivityBehaviorFactory; + +/** + * 自定义的 ActivityBehaviorFactory 实现类,目的如下: + * 1. 自定义 {@link #createUserTaskActivityBehavior(UserTask)}:实现自定义的流程任务的 assignee 负责人的分配 + * + * @author 闻荫源码 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class BpmActivityBehaviorFactory extends DefaultActivityBehaviorFactory { + + @Setter + private BpmTaskAssignRuleService bpmTaskRuleService; + + @Override + public UserTaskActivityBehavior createUserTaskActivityBehavior(UserTask userTask) { + return new BpmUserTaskActivityBehavior(userTask) + .setBpmTaskRuleService(bpmTaskRuleService); + } + + @Override + public ParallelMultiInstanceBehavior createParallelMultiInstanceBehavior(Activity activity, + AbstractBpmnActivityBehavior innerActivityBehavior) { + return new BpmParallelMultiInstanceBehavior(activity, innerActivityBehavior) + .setBpmTaskRuleService(bpmTaskRuleService); + } + + // TODO @ke:SequentialMultiInstanceBehavior 这个抽空也可以看看 + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/flowable/core/behavior/BpmParallelMultiInstanceBehavior.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/flowable/core/behavior/BpmParallelMultiInstanceBehavior.java new file mode 100644 index 0000000..096bb45 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/flowable/core/behavior/BpmParallelMultiInstanceBehavior.java @@ -0,0 +1,58 @@ +package com.win.module.bpm.framework.flowable.core.behavior; + +import com.win.framework.flowable.core.util.FlowableUtils; +import com.win.module.bpm.service.definition.BpmTaskAssignRuleService; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; +import org.flowable.bpmn.model.Activity; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.impl.bpmn.behavior.AbstractBpmnActivityBehavior; +import org.flowable.engine.impl.bpmn.behavior.ParallelMultiInstanceBehavior; + +import java.util.Set; + +/** + * 自定义的【并行】的【多个】流程任务的 assignee 负责人的分配 + * 第一步,基于分配规则,计算出分配任务的【多个】候选人们。 + * 第二步,将【多个】任务候选人们,设置到 DelegateExecution 的 collectionVariable 变量中,以便 BpmUserTaskActivityBehavior 使用它 + * + * @author kemengkai + * @date 2022-04-21 16:57 + */ +@Slf4j +public class BpmParallelMultiInstanceBehavior extends ParallelMultiInstanceBehavior { + + @Setter + private BpmTaskAssignRuleService bpmTaskRuleService; + + public BpmParallelMultiInstanceBehavior(Activity activity, + AbstractBpmnActivityBehavior innerActivityBehavior) { + super(activity, innerActivityBehavior); + } + + /** + * 重写该方法,主要实现两个功能: + * 1. 忽略原有的 collectionVariable、collectionElementVariable 表达式,而是采用自己定义的 + * 2. 获得任务的处理人,并设置到 collectionVariable 中,用于 BpmUserTaskActivityBehavior 从中可以获取任务的处理人 + * + * 注意,多个任务实例,每个任务实例对应一个处理人,所以返回的数量就是任务处理人的数量 + * + * @param execution 执行任务 + * @return 数量 + */ + @Override + protected int resolveNrOfInstances(DelegateExecution execution) { + // 第一步,设置 collectionVariable 和 CollectionVariable + // 从 execution.getVariable() 读取所有任务处理人的 key + super.collectionExpression = null; // collectionExpression 和 collectionVariable 是互斥的 + super.collectionVariable = FlowableUtils.formatCollectionVariable(execution.getCurrentActivityId()); + // 从 execution.getVariable() 读取当前所有任务处理的人的 key + super.collectionElementVariable = FlowableUtils.formatCollectionElementVariable(execution.getCurrentActivityId()); + + // 第二步,获取任务的所有处理人 + Set assigneeUserIds = bpmTaskRuleService.calculateTaskCandidateUsers(execution); + execution.setVariable(super.collectionVariable, assigneeUserIds); + return assigneeUserIds.size(); + } + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/flowable/core/behavior/BpmUserTaskActivityBehavior.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/flowable/core/behavior/BpmUserTaskActivityBehavior.java new file mode 100644 index 0000000..be715e6 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/flowable/core/behavior/BpmUserTaskActivityBehavior.java @@ -0,0 +1,66 @@ +package com.win.module.bpm.framework.flowable.core.behavior; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.RandomUtil; +import com.win.module.bpm.service.definition.BpmTaskAssignRuleService; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; +import org.flowable.bpmn.model.UserTask; +import org.flowable.common.engine.impl.el.ExpressionManager; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.impl.bpmn.behavior.UserTaskActivityBehavior; +import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl; +import org.flowable.engine.impl.util.TaskHelper; +import org.flowable.task.service.TaskService; +import org.flowable.task.service.impl.persistence.entity.TaskEntity; + +import java.util.List; +import java.util.Set; + +/** + * 自定义的【单个】流程任务的 assignee 负责人的分配 + * 第一步,基于分配规则,计算出分配任务的【单个】候选人。如果找不到,则直接报业务异常,不继续执行后续的流程; + * 第二步,随机选择一个候选人,则选择作为 assignee 负责人。 + * + * @author 闻荫源码 + */ +@Slf4j +public class BpmUserTaskActivityBehavior extends UserTaskActivityBehavior { + + @Setter + private BpmTaskAssignRuleService bpmTaskRuleService; + + public BpmUserTaskActivityBehavior(UserTask userTask) { + super(userTask); + } + + @Override + protected void handleAssignments(TaskService taskService, String assignee, String owner, + List candidateUsers, List candidateGroups, TaskEntity task, ExpressionManager expressionManager, + DelegateExecution execution, ProcessEngineConfigurationImpl processEngineConfiguration) { + // 第一步,获得任务的候选用户 + Long assigneeUserId = calculateTaskCandidateUsers(execution); + Assert.notNull(assigneeUserId, "任务处理人不能为空"); + // 第二步,设置作为负责人 + TaskHelper.changeTaskAssignee(task, String.valueOf(assigneeUserId)); + } + + private Long calculateTaskCandidateUsers(DelegateExecution execution) { + // 情况一,如果是多实例的任务,例如说会签、或签等情况,则从 Variable 中获取。它的任务处理人在 BpmParallelMultiInstanceBehavior 中已经被分配了 + if (super.multiInstanceActivityBehavior != null) { + return execution.getVariable(super.multiInstanceActivityBehavior.getCollectionElementVariable(), Long.class); + } + + // 情况二,如果非多实例的任务,则计算任务处理人 + // 第一步,先计算可处理该任务的处理人们 + Set candidateUserIds = bpmTaskRuleService.calculateTaskCandidateUsers(execution); + // 第二步,后随机选择一个任务的处理人 + // 疑问:为什么一定要选择一个任务处理人? + // 解答:项目对 bpm 的任务是责任到人,所以每个任务有且仅有一个处理人。 + // 如果希望一个任务可以同时被多个人处理,可以考虑使用 BpmParallelMultiInstanceBehavior 实现的会签 or 或签。 + int index = RandomUtil.randomInt(candidateUserIds.size()); + return CollUtil.get(candidateUserIds, index); + } + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/flowable/core/behavior/script/BpmTaskAssignScript.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/flowable/core/behavior/script/BpmTaskAssignScript.java new file mode 100644 index 0000000..a913dcb --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/flowable/core/behavior/script/BpmTaskAssignScript.java @@ -0,0 +1,34 @@ +package com.win.module.bpm.framework.flowable.core.behavior.script; + +import com.win.module.bpm.enums.definition.BpmTaskRuleScriptEnum; +import org.flowable.engine.delegate.DelegateExecution; + +import java.util.Set; + +/** + * Bpm 任务分配的自定义 Script 脚本 + * 使用场景: + * 1. 设置审批人为发起人 + * 2. 设置审批人为发起人的 Leader + * 3. 甚至审批人为发起人的 Leader 的 Leader + * + * @author 闻荫源码 + */ +public interface BpmTaskAssignScript { + + /** + * 基于执行任务,获得任务的候选用户们 + * + * @param execution 执行任务 + * @return 候选人用户的编号数组 + */ + Set calculateTaskCandidateUsers(DelegateExecution execution); + + /** + * 获得枚举值 + * + * @return 枚举值 + */ + BpmTaskRuleScriptEnum getEnum(); +} + diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/flowable/core/behavior/script/impl/BpmTaskAssignLeaderAbstractScript.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/flowable/core/behavior/script/impl/BpmTaskAssignLeaderAbstractScript.java new file mode 100644 index 0000000..eda636d --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/flowable/core/behavior/script/impl/BpmTaskAssignLeaderAbstractScript.java @@ -0,0 +1,70 @@ +package com.win.module.bpm.framework.flowable.core.behavior.script.impl; + +import com.win.framework.common.util.number.NumberUtils; +import com.win.module.bpm.framework.flowable.core.behavior.script.BpmTaskAssignScript; +import com.win.module.bpm.service.task.BpmProcessInstanceService; +import com.win.module.system.api.dept.DeptApi; +import com.win.module.system.api.dept.dto.DeptRespDTO; +import com.win.module.system.api.user.AdminUserApi; +import com.win.module.system.api.user.dto.AdminUserRespDTO; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.runtime.ProcessInstance; +import org.springframework.context.annotation.Lazy; +import org.springframework.util.Assert; + +import javax.annotation.Resource; +import java.util.Set; + +import static com.win.framework.common.util.collection.SetUtils.asSet; +import static java.util.Collections.emptySet; + +/** + * 分配给发起人的 Leader 审批的 Script 实现类 + * 目前 Leader 的定义是, + * + * @author 闻荫源码 + */ +public abstract class BpmTaskAssignLeaderAbstractScript implements BpmTaskAssignScript { + + @Resource + private AdminUserApi adminUserApi; + @Resource + private DeptApi deptApi; + @Resource + @Lazy // 解决循环依赖 + private BpmProcessInstanceService bpmProcessInstanceService; + + protected Set calculateTaskCandidateUsers(DelegateExecution execution, int level) { + Assert.isTrue(level > 0, "level 必须大于 0"); + // 获得发起人 + ProcessInstance processInstance = bpmProcessInstanceService.getProcessInstance(execution.getProcessInstanceId()); + Long startUserId = NumberUtils.parseLong(processInstance.getStartUserId()); + // 获得对应 leve 的部门 + DeptRespDTO dept = null; + for (int i = 0; i < level; i++) { + // 获得 level 对应的部门 + if (dept == null) { + dept = getStartUserDept(startUserId); + if (dept == null) { // 找不到发起人的部门,所以无法使用该规则 + return emptySet(); + } + } else { + DeptRespDTO parentDept = deptApi.getDept(dept.getParentId()); + if (parentDept == null) { // 找不到父级部门,所以只好结束寻找。原因是:例如说,级别比较高的人,所在部门层级比较少 + break; + } + dept = parentDept; + } + } + return dept.getLeaderUserId() != null ? asSet(dept.getLeaderUserId()) : emptySet(); + } + + private DeptRespDTO getStartUserDept(Long startUserId) { + AdminUserRespDTO startUser = adminUserApi.getUser(startUserId); + if (startUser.getDeptId() == null) { // 找不到部门,所以无法使用该规则 + return null; + } + return deptApi.getDept(startUser.getDeptId()); + } + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/flowable/core/behavior/script/impl/BpmTaskAssignLeaderX1Script.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/flowable/core/behavior/script/impl/BpmTaskAssignLeaderX1Script.java new file mode 100644 index 0000000..44b8f02 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/flowable/core/behavior/script/impl/BpmTaskAssignLeaderX1Script.java @@ -0,0 +1,27 @@ +package com.win.module.bpm.framework.flowable.core.behavior.script.impl; + +import com.win.module.bpm.enums.definition.BpmTaskRuleScriptEnum; +import org.flowable.engine.delegate.DelegateExecution; +import org.springframework.stereotype.Component; + +import java.util.Set; + +/** + * 分配给发起人的一级 Leader 审批的 Script 实现类 + * + * @author 闻荫源码 + */ +@Component +public class BpmTaskAssignLeaderX1Script extends BpmTaskAssignLeaderAbstractScript { + + @Override + public Set calculateTaskCandidateUsers(DelegateExecution execution) { + return calculateTaskCandidateUsers(execution, 1); + } + + @Override + public BpmTaskRuleScriptEnum getEnum() { + return BpmTaskRuleScriptEnum.LEADER_X1; + } + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/flowable/core/behavior/script/impl/BpmTaskAssignLeaderX2Script.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/flowable/core/behavior/script/impl/BpmTaskAssignLeaderX2Script.java new file mode 100644 index 0000000..233ba99 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/flowable/core/behavior/script/impl/BpmTaskAssignLeaderX2Script.java @@ -0,0 +1,27 @@ +package com.win.module.bpm.framework.flowable.core.behavior.script.impl; + +import com.win.module.bpm.enums.definition.BpmTaskRuleScriptEnum; +import org.flowable.engine.delegate.DelegateExecution; +import org.springframework.stereotype.Component; + +import java.util.Set; + +/** + * 分配给发起人的二级 Leader 审批的 Script 实现类 + * + * @author 闻荫源码 + */ +@Component +public class BpmTaskAssignLeaderX2Script extends BpmTaskAssignLeaderAbstractScript { + + @Override + public Set calculateTaskCandidateUsers(DelegateExecution execution) { + return calculateTaskCandidateUsers(execution, 2); + } + + @Override + public BpmTaskRuleScriptEnum getEnum() { + return BpmTaskRuleScriptEnum.LEADER_X2; + } + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/flowable/core/behavior/script/impl/BpmTaskAssignStartUserScript.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/flowable/core/behavior/script/impl/BpmTaskAssignStartUserScript.java new file mode 100644 index 0000000..100647e --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/flowable/core/behavior/script/impl/BpmTaskAssignStartUserScript.java @@ -0,0 +1,40 @@ +package com.win.module.bpm.framework.flowable.core.behavior.script.impl; + +import com.win.framework.common.util.collection.SetUtils; +import com.win.framework.common.util.number.NumberUtils; +import com.win.module.bpm.enums.definition.BpmTaskRuleScriptEnum; +import com.win.module.bpm.framework.flowable.core.behavior.script.BpmTaskAssignScript; +import com.win.module.bpm.service.task.BpmProcessInstanceService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.runtime.ProcessInstance; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.Set; + +/** + * 分配给发起人审批的 Script 实现类 + * + * @author 闻荫源码 + */ +@Component +public class BpmTaskAssignStartUserScript implements BpmTaskAssignScript { + + @Resource + @Lazy // 解决循环依赖 + private BpmProcessInstanceService bpmProcessInstanceService; + + @Override + public Set calculateTaskCandidateUsers(DelegateExecution execution) { + ProcessInstance processInstance = bpmProcessInstanceService.getProcessInstance(execution.getProcessInstanceId()); + Long startUserId = NumberUtils.parseLong(processInstance.getStartUserId()); + return SetUtils.asSet(startUserId); + } + + @Override + public BpmTaskRuleScriptEnum getEnum() { + return BpmTaskRuleScriptEnum.START_USER; + } + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/flowable/core/listener/BpmProcessInstanceEventListener.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/flowable/core/listener/BpmProcessInstanceEventListener.java new file mode 100644 index 0000000..0e8a90a --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/flowable/core/listener/BpmProcessInstanceEventListener.java @@ -0,0 +1,53 @@ +package com.win.module.bpm.framework.flowable.core.listener; + +import com.win.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; +import com.win.module.bpm.service.task.BpmProcessInstanceService; +import com.google.common.collect.ImmutableSet; +import org.flowable.common.engine.api.delegate.event.FlowableEngineEntityEvent; +import org.flowable.common.engine.api.delegate.event.FlowableEngineEventType; +import org.flowable.engine.delegate.event.AbstractFlowableEngineEventListener; +import org.flowable.engine.delegate.event.FlowableCancelledEvent; +import org.flowable.engine.runtime.ProcessInstance; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.Set; + +/** + * 监听 {@link ProcessInstance} 的开始与完成,创建与更新对应的 {@link BpmProcessInstanceExtDO} 记录 + * + * @author jason + */ +@Component +public class BpmProcessInstanceEventListener extends AbstractFlowableEngineEventListener { + + @Resource + @Lazy + private BpmProcessInstanceService processInstanceService; + + public static final Set PROCESS_INSTANCE_EVENTS = ImmutableSet.builder() + .add(FlowableEngineEventType.PROCESS_CREATED) + .add(FlowableEngineEventType.PROCESS_CANCELLED) + .add(FlowableEngineEventType.PROCESS_COMPLETED) + .build(); + + public BpmProcessInstanceEventListener(){ + super(PROCESS_INSTANCE_EVENTS); + } + + @Override + protected void processCreated(FlowableEngineEntityEvent event) { + processInstanceService.createProcessInstanceExt((ProcessInstance)event.getEntity()); + } + + @Override + protected void processCancelled(FlowableCancelledEvent event) { + processInstanceService.updateProcessInstanceExtCancel(event); + } + + @Override + protected void processCompleted(FlowableEngineEntityEvent event) { + processInstanceService.updateProcessInstanceExtComplete((ProcessInstance)event.getEntity()); + } +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/flowable/core/listener/BpmTaskEventListener.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/flowable/core/listener/BpmTaskEventListener.java new file mode 100644 index 0000000..5b29cae --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/flowable/core/listener/BpmTaskEventListener.java @@ -0,0 +1,82 @@ +package com.win.module.bpm.framework.flowable.core.listener; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.win.module.bpm.dal.dataobject.task.BpmTaskExtDO; +import com.win.module.bpm.service.task.BpmActivityService; +import com.win.module.bpm.service.task.BpmTaskService; +import com.google.common.collect.ImmutableSet; +import lombok.extern.slf4j.Slf4j; +import org.flowable.common.engine.api.delegate.event.FlowableEngineEntityEvent; +import org.flowable.common.engine.api.delegate.event.FlowableEngineEventType; +import org.flowable.engine.delegate.event.AbstractFlowableEngineEventListener; +import org.flowable.engine.delegate.event.FlowableActivityCancelledEvent; +import org.flowable.engine.history.HistoricActivityInstance; +import org.flowable.task.api.Task; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Set; + +/** + * 监听 {@link org.flowable.task.api.Task} 的开始与完成,创建与更新对应的 {@link BpmTaskExtDO} 记录 + * + * @author jason + */ +@Component +@Slf4j +public class BpmTaskEventListener extends AbstractFlowableEngineEventListener { + + @Resource + @Lazy // 解决循环依赖 + private BpmTaskService taskService; + + @Resource + @Lazy // 解决循环依赖 + private BpmActivityService activityService; + + public static final Set TASK_EVENTS = ImmutableSet.builder() + .add(FlowableEngineEventType.TASK_CREATED) + .add(FlowableEngineEventType.TASK_ASSIGNED) + .add(FlowableEngineEventType.TASK_COMPLETED) + .add(FlowableEngineEventType.ACTIVITY_CANCELLED) + .build(); + + public BpmTaskEventListener(){ + super(TASK_EVENTS); + } + + @Override + protected void taskCreated(FlowableEngineEntityEvent event) { + taskService.createTaskExt((Task) event.getEntity()); + } + + @Override + protected void taskCompleted(FlowableEngineEntityEvent event) { + taskService.updateTaskExtComplete((Task)event.getEntity()); + } + + @Override + protected void taskAssigned(FlowableEngineEntityEvent event) { + taskService.updateTaskExtAssign((Task)event.getEntity()); + } + + @Override + protected void activityCancelled(FlowableActivityCancelledEvent event) { + List activityList = activityService.getHistoricActivityListByExecutionId(event.getExecutionId()); + if (CollUtil.isEmpty(activityList)) { + log.error("[activityCancelled][使用 executionId({}) 查找不到对应的活动实例]", event.getExecutionId()); + return; + } + // 遍历处理 + activityList.forEach(activity -> { + if (StrUtil.isEmpty(activity.getTaskId())) { + return; + } + taskService.updateTaskExtCancel(activity.getTaskId()); + }); + } + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/package-info.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/package-info.java new file mode 100644 index 0000000..aebcc55 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/package-info.java @@ -0,0 +1,6 @@ +/** + * 属于 bpm 模块的 framework 封装 + * + * @author 闻荫源码 + */ +package com.win.module.bpm.framework; diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/web/config/BpmWebConfiguration.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/web/config/BpmWebConfiguration.java new file mode 100644 index 0000000..fefbccd --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/web/config/BpmWebConfiguration.java @@ -0,0 +1,24 @@ +package com.win.module.bpm.framework.web.config; + +import com.win.framework.swagger.config.WinSwaggerAutoConfiguration; +import org.springdoc.core.GroupedOpenApi; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * bpm 模块的 web 组件的 Configuration + * + * @author 闻荫源码 + */ +@Configuration(proxyBeanMethods = false) +public class BpmWebConfiguration { + + /** + * bpm 模块的 API 分组 + */ + @Bean + public GroupedOpenApi bpmGroupedOpenApi() { + return WinSwaggerAutoConfiguration.buildGroupedOpenApi("bpm"); + } + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/web/package-info.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/web/package-info.java new file mode 100644 index 0000000..919006a --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/web/package-info.java @@ -0,0 +1,4 @@ +/** + * bpm 模块的 web 配置 + */ +package com.win.module.bpm.framework.web; diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/package-info.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/package-info.java new file mode 100644 index 0000000..42183df --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/package-info.java @@ -0,0 +1,12 @@ +/** + * bpm 包下,业务流程管理(Business Process Management),我们放工作流的功能,基于 Flowable 6 版本实现。 + * 例如说:流程定义、表单配置、审核中心(我的申请、我的待办、我的已办)等等 + * + * bpm 解释:https://baike.baidu.com/item/BPM/1933 + * + * 1. Controller URL:以 /bpm/ 开头,避免和其它 Module 冲突 + * 2. DataObject 表名:以 bpm_ 开头,方便在数据库中区分 + * + * 注意,由于 Bpm 模块下,容易和其它模块重名,所以类名都加载 Bpm 的前缀~ + */ +package com.win.module.bpm; diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/BpmFormService.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/BpmFormService.java new file mode 100644 index 0000000..40ce541 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/BpmFormService.java @@ -0,0 +1,99 @@ +package com.win.module.bpm.service.definition; + +import cn.hutool.core.collection.CollUtil; +import com.win.module.bpm.controller.definition.vo.form.BpmFormCreateReqVO; +import com.win.module.bpm.controller.definition.vo.form.BpmFormPageReqVO; +import com.win.module.bpm.controller.definition.vo.form.BpmFormUpdateReqVO; +import com.win.module.bpm.dal.dataobject.definition.BpmFormDO; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.collection.CollectionUtils; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Map; + + +/** + * 动态表单 Service 接口 + * + * @author @风里雾里 + */ +public interface BpmFormService { + + /** + * 创建动态表单 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createForm(@Valid BpmFormCreateReqVO createReqVO); + + /** + * 更新动态表单 + * + * @param updateReqVO 更新信息 + */ + void updateForm(@Valid BpmFormUpdateReqVO updateReqVO); + + /** + * 删除动态表单 + * + * @param id 编号 + */ + void deleteForm(Long id); + + /** + * 获得动态表单 + * + * @param id 编号 + * @return 动态表单 + */ + BpmFormDO getForm(Long id); + + /** + * 获得动态表单列表 + * + * @return 动态表单列表 + */ + List getFormList(); + + /** + * 获得动态表单列表 + * + * @param ids 编号 + * @return 动态表单列表 + */ + List getFormList(Collection ids); + + /** + * 获得动态表单 Map + * + * @param ids 编号 + * @return 动态表单 Map + */ + default Map getFormMap(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return Collections.emptyMap(); + } + return CollectionUtils.convertMap(this.getFormList(ids), BpmFormDO::getId); + } + + /** + * 获得动态表单分页 + * + * @param pageReqVO 分页查询 + * @return 动态表单分页 + */ + PageResult getFormPage(BpmFormPageReqVO pageReqVO); + + /** + * 校验流程表单已配置 + * + * @param configStr configStr 字段 + * @return 流程表单 + */ + BpmFormDO checkFormConfig(String configStr); + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/BpmFormServiceImpl.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/BpmFormServiceImpl.java new file mode 100644 index 0000000..74973d3 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/BpmFormServiceImpl.java @@ -0,0 +1,132 @@ +package com.win.module.bpm.service.definition; + +import cn.hutool.core.lang.Assert; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.json.JsonUtils; +import com.win.module.bpm.controller.definition.vo.form.BpmFormCreateReqVO; +import com.win.module.bpm.controller.definition.vo.form.BpmFormPageReqVO; +import com.win.module.bpm.controller.definition.vo.form.BpmFormUpdateReqVO; +import com.win.module.bpm.convert.definition.BpmFormConvert; +import com.win.module.bpm.dal.dataobject.definition.BpmFormDO; +import com.win.module.bpm.dal.mysql.definition.BpmFormMapper; +import com.win.module.bpm.enums.ErrorCodeConstants; +import com.win.module.bpm.enums.definition.BpmModelFormTypeEnum; +import com.win.module.bpm.service.definition.dto.BpmFormFieldRespDTO; +import com.win.module.bpm.service.definition.dto.BpmModelMetaInfoRespDTO; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.*; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.bpm.enums.ErrorCodeConstants.*; + +/** + * 动态表单 Service 实现类 + * + * @author 风里雾里 + */ +@Service +@Validated +public class BpmFormServiceImpl implements BpmFormService { + + @Resource + private BpmFormMapper formMapper; + + @Override + public Long createForm(BpmFormCreateReqVO createReqVO) { + this.checkFields(createReqVO.getFields()); + // 插入 + BpmFormDO form = BpmFormConvert.INSTANCE.convert(createReqVO); + formMapper.insert(form); + // 返回 + return form.getId(); + } + + @Override + public void updateForm(BpmFormUpdateReqVO updateReqVO) { + this.checkFields(updateReqVO.getFields()); + // 校验存在 + this.validateFormExists(updateReqVO.getId()); + // 更新 + BpmFormDO updateObj = BpmFormConvert.INSTANCE.convert(updateReqVO); + formMapper.updateById(updateObj); + } + + @Override + public void deleteForm(Long id) { + // 校验存在 + this.validateFormExists(id); + // 删除 + formMapper.deleteById(id); + } + + private void validateFormExists(Long id) { + if (formMapper.selectById(id) == null) { + throw exception(ErrorCodeConstants.FORM_NOT_EXISTS); + } + } + + @Override + public BpmFormDO getForm(Long id) { + return formMapper.selectById(id); + } + + @Override + public List getFormList() { + return formMapper.selectList(); + } + + @Override + public List getFormList(Collection ids) { + return formMapper.selectBatchIds(ids); + } + + @Override + public PageResult getFormPage(BpmFormPageReqVO pageReqVO) { + return formMapper.selectPage(pageReqVO); + } + + + @Override + public BpmFormDO checkFormConfig(String configStr) { + BpmModelMetaInfoRespDTO metaInfo = JsonUtils.parseObject(configStr, BpmModelMetaInfoRespDTO.class); + if (metaInfo == null || metaInfo.getFormType() == null) { + throw exception(MODEL_DEPLOY_FAIL_FORM_NOT_CONFIG); + } + // 校验表单存在 + if (Objects.equals(metaInfo.getFormType(), BpmModelFormTypeEnum.NORMAL.getType())) { + BpmFormDO form = getForm(metaInfo.getFormId()); + if (form == null) { + throw exception(FORM_NOT_EXISTS); + } + return form; + } + return null; + } + + /** + * 校验 Field,避免 field 重复 + * + * @param fields field 数组 + */ + private void checkFields(List fields) { + if (true) { // TODO 芋艿:兼容 Vue3 工作流:因为采用了新的表单设计器,所以暂时不校验 + return; + } + Map fieldMap = new HashMap<>(); // key 是 vModel,value 是 label + for (String field : fields) { + BpmFormFieldRespDTO fieldDTO = JsonUtils.parseObject(field, BpmFormFieldRespDTO.class); + Assert.notNull(fieldDTO); + String oldLabel = fieldMap.put(fieldDTO.getVModel(), fieldDTO.getLabel()); + // 如果不存在,则直接返回 + if (oldLabel == null) { + continue; + } + // 如果存在,则报错 + throw exception(ErrorCodeConstants.FORM_FIELD_REPEAT, oldLabel, fieldDTO.getLabel(), fieldDTO.getVModel()); + } + } + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/BpmModelService.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/BpmModelService.java new file mode 100644 index 0000000..7f9ac11 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/BpmModelService.java @@ -0,0 +1,77 @@ +package com.win.module.bpm.service.definition; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.bpm.controller.definition.vo.model.*; +import org.flowable.bpmn.model.BpmnModel; + +import javax.validation.Valid; + +/** + * Flowable流程模型接口 + * + * @author yunlongn + */ +public interface BpmModelService { + /** + * 获得流程模型分页 + * + * @param pageVO 分页查询 + * @return 流程模型分页 + */ + PageResult getModelPage(BpmModelPageReqVO pageVO); + + /** + * 创建流程模型 + * + * @param modelVO 创建信息 + * @param bpmnXml BPMN XML + * @return 创建的流程模型的编号 + */ + String createModel(@Valid BpmModelCreateReqVO modelVO, String bpmnXml); + + /** + * 获得流程模块 + * + * @param id 编号 + * @return 流程模型 + */ + BpmModelRespVO getModel(String id); + + /** + * 修改流程模型 + * + * @param updateReqVO 更新信息 + */ + void updateModel(@Valid BpmModelUpdateReqVO updateReqVO); + + /** + * 将流程模型,部署成一个流程定义 + * + * @param id 编号 + */ + void deployModel(String id); + + /** + * 删除模型 + * + * @param id 编号 + */ + void deleteModel(String id); + + /** + * 修改模型的状态,实际更新的部署的流程定义的状态 + * + * @param id 编号 + * @param state 状态 + */ + void updateModelState(String id, Integer state); + + /** + * 获得流程模型编号对应的 BPMN Model + * + * @param id 流程模型编号 + * @return BPMN Model + */ + BpmnModel getBpmnModel(String id); + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/BpmModelServiceImpl.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/BpmModelServiceImpl.java new file mode 100644 index 0000000..f2f0609 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/BpmModelServiceImpl.java @@ -0,0 +1,287 @@ +package com.win.module.bpm.service.definition; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.collection.CollectionUtils; +import com.win.framework.common.util.json.JsonUtils; +import com.win.framework.common.util.object.PageUtils; +import com.win.framework.common.util.validation.ValidationUtils; +import com.win.module.bpm.controller.definition.vo.model.*; +import com.win.module.bpm.convert.definition.BpmModelConvert; +import com.win.module.bpm.dal.dataobject.definition.BpmFormDO; +import com.win.module.bpm.enums.definition.BpmModelFormTypeEnum; +import com.win.module.bpm.service.definition.dto.BpmModelMetaInfoRespDTO; +import com.win.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO; +import lombok.extern.slf4j.Slf4j; +import org.flowable.bpmn.converter.BpmnXMLConverter; +import org.flowable.bpmn.model.BpmnModel; +import org.flowable.common.engine.impl.db.SuspensionState; +import org.flowable.common.engine.impl.util.io.BytesStreamSource; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.repository.Deployment; +import org.flowable.engine.repository.Model; +import org.flowable.engine.repository.ModelQuery; +import org.flowable.engine.repository.ProcessDefinition; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.ObjectUtils; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.*; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.framework.common.util.collection.CollectionUtils.convertMap; +import static com.win.module.bpm.enums.ErrorCodeConstants.*; + +/** + * Flowable流程模型实现 + * 主要进行 Flowable {@link Model} 的维护 + * + * @author yunlongn + * @author 闻荫源码 + * @author jason + */ +@Service +@Validated +@Slf4j +public class BpmModelServiceImpl implements BpmModelService { + + @Resource + private RepositoryService repositoryService; + @Resource + private BpmProcessDefinitionService processDefinitionService; + @Resource + private BpmFormService bpmFormService; + @Resource + private BpmTaskAssignRuleService taskAssignRuleService; + + @Override + public PageResult getModelPage(BpmModelPageReqVO pageVO) { + ModelQuery modelQuery = repositoryService.createModelQuery(); + if (StrUtil.isNotBlank(pageVO.getKey())) { + modelQuery.modelKey(pageVO.getKey()); + } + if (StrUtil.isNotBlank(pageVO.getName())) { + modelQuery.modelNameLike("%" + pageVO.getName() + "%"); // 模糊匹配 + } + if (StrUtil.isNotBlank(pageVO.getCategory())) { + modelQuery.modelCategory(pageVO.getCategory()); + } + // 执行查询 + List models = modelQuery.orderByCreateTime().desc() + .listPage(PageUtils.getStart(pageVO), pageVO.getPageSize()); + + // 获得 Form Map + Set formIds = CollectionUtils.convertSet(models, model -> { + BpmModelMetaInfoRespDTO metaInfo = JsonUtils.parseObject(model.getMetaInfo(), BpmModelMetaInfoRespDTO.class); + return metaInfo != null ? metaInfo.getFormId() : null; + }); + Map formMap = bpmFormService.getFormMap(formIds); + + // 获得 Deployment Map + Set deploymentIds = new HashSet<>(); + models.forEach(model -> CollectionUtils.addIfNotNull(deploymentIds, model.getDeploymentId())); + Map deploymentMap = processDefinitionService.getDeploymentMap(deploymentIds); + // 获得 ProcessDefinition Map + List processDefinitions = processDefinitionService.getProcessDefinitionListByDeploymentIds(deploymentIds); + Map processDefinitionMap = convertMap(processDefinitions, ProcessDefinition::getDeploymentId); + + // 拼接结果 + long modelCount = modelQuery.count(); + return new PageResult<>(BpmModelConvert.INSTANCE.convertList(models, formMap, deploymentMap, processDefinitionMap), modelCount); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public String createModel(@Valid BpmModelCreateReqVO createReqVO, String bpmnXml) { + checkKeyNCName(createReqVO.getKey()); + // 校验流程标识已经存在 + Model keyModel = getModelByKey(createReqVO.getKey()); + if (keyModel != null) { + throw exception(MODEL_KEY_EXISTS, createReqVO.getKey()); + } + + // 创建流程定义 + Model model = repositoryService.newModel(); + BpmModelConvert.INSTANCE.copy(model, createReqVO); + // 保存流程定义 + repositoryService.saveModel(model); + // 保存 BPMN XML + saveModelBpmnXml(model, bpmnXml); + return model.getId(); + } + + private Model getModelByKey(String key) { + return repositoryService.createModelQuery().modelKey(key).singleResult(); + } + + @Override + public BpmModelRespVO getModel(String id) { + Model model = repositoryService.getModel(id); + if (model == null) { + return null; + } + BpmModelRespVO modelRespVO = BpmModelConvert.INSTANCE.convert(model); + // 拼接 bpmn XML + byte[] bpmnBytes = repositoryService.getModelEditorSource(id); + modelRespVO.setBpmnXml(StrUtil.utf8Str(bpmnBytes)); + return modelRespVO; + } + + @Override + @Transactional(rollbackFor = Exception.class) // 因为进行多个操作,所以开启事务 + public void updateModel(@Valid BpmModelUpdateReqVO updateReqVO) { + // 校验流程模型存在 + Model model = repositoryService.getModel(updateReqVO.getId()); + if (model == null) { + throw exception(MODEL_NOT_EXISTS); + } + + // 修改流程定义 + BpmModelConvert.INSTANCE.copy(model, updateReqVO); + // 更新模型 + repositoryService.saveModel(model); + // 更新 BPMN XML + saveModelBpmnXml(model, updateReqVO.getBpmnXml()); + } + + @Override + @Transactional(rollbackFor = Exception.class) // 因为进行多个操作,所以开启事务 + public void deployModel(String id) { + // 1.1 校验流程模型存在 + Model model = repositoryService.getModel(id); + if (ObjectUtils.isEmpty(model)) { + throw exception(MODEL_NOT_EXISTS); + } + // 1.2 校验流程图 + // TODO 芋艿:校验流程图的有效性;例如说,是否有开始的元素,是否有结束的元素; + byte[] bpmnBytes = repositoryService.getModelEditorSource(model.getId()); + if (bpmnBytes == null) { + throw exception(MODEL_NOT_EXISTS); + } + // 1.3 校验表单已配 + BpmFormDO form = checkFormConfig(model.getMetaInfo()); + // 1.4 校验任务分配规则已配置 + taskAssignRuleService.checkTaskAssignRuleAllConfig(id); + + // 1.5 校验模型是否发生修改。如果未修改,则不允许创建 + BpmProcessDefinitionCreateReqDTO definitionCreateReqDTO = BpmModelConvert.INSTANCE.convert2(model, form).setBpmnBytes(bpmnBytes); + if (processDefinitionService.isProcessDefinitionEquals(definitionCreateReqDTO)) { // 流程定义的信息相等 + ProcessDefinition oldProcessDefinition = processDefinitionService.getProcessDefinitionByDeploymentId(model.getDeploymentId()); + if (oldProcessDefinition != null && taskAssignRuleService.isTaskAssignRulesEquals(model.getId(), oldProcessDefinition.getId())) { + throw exception(MODEL_DEPLOY_FAIL_TASK_INFO_EQUALS); + } + } + + // 2.1 创建流程定义 + String definitionId = processDefinitionService.createProcessDefinition(definitionCreateReqDTO); + + // 2.2 将老的流程定义进行挂起。也就是说,只有最新部署的流程定义,才可以发起任务。 + updateProcessDefinitionSuspended(model.getDeploymentId()); + + // 2.3 更新 model 的 deploymentId,进行关联 + ProcessDefinition definition = processDefinitionService.getProcessDefinition(definitionId); + model.setDeploymentId(definition.getDeploymentId()); + repositoryService.saveModel(model); + + // 2.4 复制任务分配规则 + taskAssignRuleService.copyTaskAssignRules(id, definition.getId()); + } + + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteModel(String id) { + // 校验流程模型存在 + Model model = repositoryService.getModel(id); + if (model == null) { + throw exception(MODEL_NOT_EXISTS); + } + // 执行删除 + repositoryService.deleteModel(id); + // 禁用流程定义 + updateProcessDefinitionSuspended(model.getDeploymentId()); + } + + @Override + public void updateModelState(String id, Integer state) { + // 校验流程模型存在 + Model model = repositoryService.getModel(id); + if (model == null) { + throw exception(MODEL_NOT_EXISTS); + } + // 校验流程定义存在 + ProcessDefinition definition = processDefinitionService.getProcessDefinitionByDeploymentId(model.getDeploymentId()); + if (definition == null) { + throw exception(PROCESS_DEFINITION_NOT_EXISTS); + } + + // 更新状态 + processDefinitionService.updateProcessDefinitionState(definition.getId(), state); + } + + @Override + public BpmnModel getBpmnModel(String id) { + byte[] bpmnBytes = repositoryService.getModelEditorSource(id); + if (ArrayUtil.isEmpty(bpmnBytes)) { + return null; + } + BpmnXMLConverter converter = new BpmnXMLConverter(); + return converter.convertToBpmnModel(new BytesStreamSource(bpmnBytes), true, true); + } + + private void checkKeyNCName(String key) { + if (!ValidationUtils.isXmlNCName(key)) { + throw exception(MODEL_KEY_VALID); + } + } + + /** + * 校验流程表单已配置 + * + * @param metaInfoStr 流程模型 metaInfo 字段 + * @return 流程表单 + */ + private BpmFormDO checkFormConfig(String metaInfoStr) { + BpmModelMetaInfoRespDTO metaInfo = JsonUtils.parseObject(metaInfoStr, BpmModelMetaInfoRespDTO.class); + if (metaInfo == null || metaInfo.getFormType() == null) { + throw exception(MODEL_DEPLOY_FAIL_FORM_NOT_CONFIG); + } + // 校验表单存在 + if (Objects.equals(metaInfo.getFormType(), BpmModelFormTypeEnum.NORMAL.getType())) { + BpmFormDO form = bpmFormService.getForm(metaInfo.getFormId()); + if (form == null) { + throw exception(FORM_NOT_EXISTS); + } + return form; + } + return null; + } + + private void saveModelBpmnXml(Model model, String bpmnXml) { + if (StrUtil.isEmpty(bpmnXml)) { + return; + } + repositoryService.addModelEditorSource(model.getId(), StrUtil.utf8Bytes(bpmnXml)); + } + + /** + * 挂起 deploymentId 对应的流程定义。 这里一个deploymentId 只关联一个流程定义 + * @param deploymentId 流程发布Id. + */ + private void updateProcessDefinitionSuspended(String deploymentId) { + if (StrUtil.isEmpty(deploymentId)) { + return; + } + ProcessDefinition oldDefinition = processDefinitionService.getProcessDefinitionByDeploymentId(deploymentId); + if (oldDefinition == null) { + return; + } + processDefinitionService.updateProcessDefinitionState(oldDefinition.getId(), SuspensionState.SUSPENDED.getStateCode()); + } + + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/BpmProcessDefinitionService.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/BpmProcessDefinitionService.java new file mode 100644 index 0000000..2ee0d6f --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/BpmProcessDefinitionService.java @@ -0,0 +1,159 @@ +package com.win.module.bpm.service.definition; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.collection.CollectionUtils; +import com.win.module.bpm.controller.definition.vo.process.BpmProcessDefinitionListReqVO; +import com.win.module.bpm.controller.definition.vo.process.BpmProcessDefinitionPageItemRespVO; +import com.win.module.bpm.controller.definition.vo.process.BpmProcessDefinitionPageReqVO; +import com.win.module.bpm.controller.definition.vo.process.BpmProcessDefinitionRespVO; +import com.win.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; +import com.win.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO; +import org.flowable.bpmn.model.BpmnModel; +import org.flowable.engine.repository.Deployment; +import org.flowable.engine.repository.ProcessDefinition; + +import javax.validation.Valid; +import java.util.List; +import java.util.Map; +import java.util.Set; +/** + * Flowable流程定义接口 + * + * @author yunlong.li + * @author ZJQ + * @author 闻荫源码 + */ +public interface BpmProcessDefinitionService { + + /** + * 获得流程定义分页 + * + * @param pageReqVO 分页入参 + * @return 流程定义 Page + */ + PageResult getProcessDefinitionPage(BpmProcessDefinitionPageReqVO pageReqVO); + + /** + * 获得流程定义列表 + * + * @param listReqVO 列表入参 + * @return 流程定义列表 + */ + List getProcessDefinitionList(BpmProcessDefinitionListReqVO listReqVO); + + /** + * 创建流程定义 + * + * @param createReqDTO 创建信息 + * @return 流程编号 + */ + String createProcessDefinition(@Valid BpmProcessDefinitionCreateReqDTO createReqDTO); + + /** + * 更新流程定义状态 + * + * @param id 流程定义的编号 + * @param state 状态 + */ + void updateProcessDefinitionState(String id, Integer state); + + /** + * 获得流程定义对应的 BPMN XML + * + * @param id 流程定义编号 + * @return BPMN XML + */ + String getProcessDefinitionBpmnXML(String id); + + /** + * 获得需要创建的流程定义,是否和当前激活的流程定义相等 + * + * @param createReqDTO 创建信息 + * @return 是否相等 + */ + boolean isProcessDefinitionEquals(@Valid BpmProcessDefinitionCreateReqDTO createReqDTO); + + /** + * 获得编号对应的 BpmProcessDefinitionExtDO + * + * @param id 编号 + * @return 流程定义拓展 + */ + BpmProcessDefinitionExtDO getProcessDefinitionExt(String id); + + /** + * 获得编号对应的 ProcessDefinition + * + * @param id 编号 + * @return 流程定义 + */ + ProcessDefinition getProcessDefinition(String id); + + /** + * 获得编号对应的 ProcessDefinition + * + * 相比 {@link #getProcessDefinition(String)} 方法,category 的取值是正确 + * + * @param id 编号 + * @return 流程定义 + */ + ProcessDefinition getProcessDefinition2(String id); + + /** + * 获得 deploymentId 对应的 ProcessDefinition + * + * @param deploymentId 部署编号 + * @return 流程定义 + */ + ProcessDefinition getProcessDefinitionByDeploymentId(String deploymentId); + + /** + * 获得 deploymentIds 对应的 ProcessDefinition 数组 + * + * @param deploymentIds 部署编号的数组 + * @return 流程定义的数组 + */ + List getProcessDefinitionListByDeploymentIds(Set deploymentIds); + + /** + * 获得流程定义标识对应的激活的流程定义 + * + * @param key 流程定义的标识 + * @return 流程定义 + */ + ProcessDefinition getActiveProcessDefinition(String key); + + /** + * 获得 ids 对应的 Deployment Map + * + * @param ids 部署编号的数组 + * @return 流程部署 Map + */ + default Map getDeploymentMap(Set ids) { + return CollectionUtils.convertMap(getDeployments(ids), Deployment::getId); + } + + /** + * 获得 ids 对应的 Deployment 数组 + * + * @param ids 部署编号的数组 + * @return 流程部署的数组 + */ + List getDeployments(Set ids); + + /** + * 获得 id 对应的 Deployment + * + * @param id 部署编号 + * @return 流程部署 + */ + Deployment getDeployment(String id); + + /** + * 获得 Bpmn 模型 + * + * @param processDefinitionId 流程定义的编号 + * @return Bpmn 模型 + */ + BpmnModel getBpmnModel(String processDefinitionId); +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/BpmProcessDefinitionServiceImpl.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/BpmProcessDefinitionServiceImpl.java new file mode 100644 index 0000000..b49b72c --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/BpmProcessDefinitionServiceImpl.java @@ -0,0 +1,286 @@ +package com.win.module.bpm.service.definition; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.object.PageUtils; +import com.win.framework.flowable.core.util.FlowableUtils; +import com.win.module.bpm.controller.definition.vo.process.BpmProcessDefinitionListReqVO; +import com.win.module.bpm.controller.definition.vo.process.BpmProcessDefinitionPageItemRespVO; +import com.win.module.bpm.controller.definition.vo.process.BpmProcessDefinitionPageReqVO; +import com.win.module.bpm.controller.definition.vo.process.BpmProcessDefinitionRespVO; +import com.win.module.bpm.convert.definition.BpmProcessDefinitionConvert; +import com.win.module.bpm.dal.dataobject.definition.BpmFormDO; +import com.win.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; +import com.win.module.bpm.dal.mysql.definition.BpmProcessDefinitionExtMapper; +import com.win.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO; +import lombok.extern.slf4j.Slf4j; +import org.flowable.bpmn.converter.BpmnXMLConverter; +import org.flowable.bpmn.model.BpmnModel; +import org.flowable.common.engine.impl.db.SuspensionState; +import org.flowable.common.engine.impl.util.io.BytesStreamSource; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.repository.Deployment; +import org.flowable.engine.repository.ProcessDefinition; +import org.flowable.engine.repository.ProcessDefinitionQuery; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.*; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.framework.common.util.collection.CollectionUtils.*; +import static com.win.framework.common.util.collection.CollectionUtils.convertMap; +import static com.win.module.bpm.enums.ErrorCodeConstants.PROCESS_DEFINITION_KEY_NOT_MATCH; +import static com.win.module.bpm.enums.ErrorCodeConstants.PROCESS_DEFINITION_NAME_NOT_MATCH; +import static java.util.Collections.emptyList; + +/** + * 流程定义实现 + * 主要进行 Flowable {@link ProcessDefinition} 和 {@link Deployment} 的维护 + * + * @author yunlongn + * @author ZJQ + * @author 闻荫源码 + */ +@Service +@Validated +@Slf4j +public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionService { + + private static final String BPMN_FILE_SUFFIX = ".bpmn"; + + @Resource + private RepositoryService repositoryService; + + @Resource + private BpmProcessDefinitionExtMapper processDefinitionMapper; + + @Resource + private BpmFormService formService; + + @Override + public ProcessDefinition getProcessDefinition(String id) { + return repositoryService.getProcessDefinition(id); + } + + @Override + public ProcessDefinition getProcessDefinition2(String id) { + return repositoryService.createProcessDefinitionQuery().processDefinitionId(id).singleResult(); + } + + @Override + public ProcessDefinition getProcessDefinitionByDeploymentId(String deploymentId) { + if (StrUtil.isEmpty(deploymentId)) { + return null; + } + return repositoryService.createProcessDefinitionQuery().deploymentId(deploymentId).singleResult(); + } + + @Override + public List getProcessDefinitionListByDeploymentIds(Set deploymentIds) { + if (CollUtil.isEmpty(deploymentIds)) { + return emptyList(); + } + return repositoryService.createProcessDefinitionQuery().deploymentIds(deploymentIds).list(); + } + + @Override + public ProcessDefinition getActiveProcessDefinition(String key) { + return repositoryService.createProcessDefinitionQuery().processDefinitionKey(key).active().singleResult(); + } + + @Override + public List getDeployments(Set ids) { + if (CollUtil.isEmpty(ids)) { + return emptyList(); + } + List list = new ArrayList<>(ids.size()); + for (String id : ids) { + addIfNotNull(list, getDeployment(id)); + } + return list; + } + + @Override + public Deployment getDeployment(String id) { + if (StrUtil.isEmpty(id)) { + return null; + } + return repositoryService.createDeploymentQuery().deploymentId(id).singleResult(); + } + + @Override + public BpmnModel getBpmnModel(String processDefinitionId) { + return repositoryService.getBpmnModel(processDefinitionId); + } + + @Override + public String createProcessDefinition(@Valid BpmProcessDefinitionCreateReqDTO createReqDTO) { + // 创建 Deployment 部署 + Deployment deploy = repositoryService.createDeployment() + .key(createReqDTO.getKey()).name(createReqDTO.getName()).category(createReqDTO.getCategory()) + .addBytes(createReqDTO.getKey() + BPMN_FILE_SUFFIX, createReqDTO.getBpmnBytes()) + .deploy(); + + // 设置 ProcessDefinition 的 category 分类 + ProcessDefinition definition = repositoryService.createProcessDefinitionQuery() + .deploymentId(deploy.getId()).singleResult(); + repositoryService.setProcessDefinitionCategory(definition.getId(), createReqDTO.getCategory()); + // 注意 1,ProcessDefinition 的 key 和 name 是通过 BPMN 中的 的 id 和 name 决定 + // 注意 2,目前该项目的设计上,需要保证 Model、Deployment、ProcessDefinition 使用相同的 key,保证关联性。 + // 否则,会导致 ProcessDefinition 的分页无法查询到。 + if (!Objects.equals(definition.getKey(), createReqDTO.getKey())) { + throw exception(PROCESS_DEFINITION_KEY_NOT_MATCH, createReqDTO.getKey(), definition.getKey()); + } + if (!Objects.equals(definition.getName(), createReqDTO.getName())) { + throw exception(PROCESS_DEFINITION_NAME_NOT_MATCH, createReqDTO.getName(), definition.getName()); + } + + // 插入拓展表 + BpmProcessDefinitionExtDO definitionDO = BpmProcessDefinitionConvert.INSTANCE.convert2(createReqDTO) + .setProcessDefinitionId(definition.getId()); + processDefinitionMapper.insert(definitionDO); + return definition.getId(); + } + + @Override + public void updateProcessDefinitionState(String id, Integer state) { + // 激活 + if (Objects.equals(SuspensionState.ACTIVE.getStateCode(), state)) { + repositoryService.activateProcessDefinitionById(id, false, null); + return; + } + // 挂起 + if (Objects.equals(SuspensionState.SUSPENDED.getStateCode(), state)) { + // suspendProcessInstances = false,进行中的任务,不进行挂起。 + // 原因:只要新的流程不允许发起即可,老流程继续可以执行。 + repositoryService.suspendProcessDefinitionById(id, false, null); + return; + } + log.error("[updateProcessDefinitionState][流程定义({}) 修改未知状态({})]", id, state); + } + + @Override + public String getProcessDefinitionBpmnXML(String id) { + BpmnModel bpmnModel = repositoryService.getBpmnModel(id); + if (bpmnModel == null) { + return null; + } + BpmnXMLConverter converter = new BpmnXMLConverter(); + return StrUtil.utf8Str(converter.convertToXML(bpmnModel)); + } + + @Override + public boolean isProcessDefinitionEquals(@Valid BpmProcessDefinitionCreateReqDTO createReqDTO) { + // 校验 name、description 是否更新 + ProcessDefinition oldProcessDefinition = getActiveProcessDefinition(createReqDTO.getKey()); + if (oldProcessDefinition == null) { + return false; + } + BpmProcessDefinitionExtDO oldProcessDefinitionExt = getProcessDefinitionExt(oldProcessDefinition.getId()); + if (!StrUtil.equals(createReqDTO.getName(), oldProcessDefinition.getName()) + || !StrUtil.equals(createReqDTO.getDescription(), oldProcessDefinitionExt.getDescription()) + || !StrUtil.equals(createReqDTO.getCategory(), oldProcessDefinition.getCategory())) { + return false; + } + // 校验 form 信息是否更新 + if (!ObjectUtil.equal(createReqDTO.getFormType(), oldProcessDefinitionExt.getFormType()) + || !ObjectUtil.equal(createReqDTO.getFormId(), oldProcessDefinitionExt.getFormId()) + || !ObjectUtil.equal(createReqDTO.getFormConf(), oldProcessDefinitionExt.getFormConf()) + || !ObjectUtil.equal(createReqDTO.getFormFields(), oldProcessDefinitionExt.getFormFields()) + || !ObjectUtil.equal(createReqDTO.getFormCustomCreatePath(), oldProcessDefinitionExt.getFormCustomCreatePath()) + || !ObjectUtil.equal(createReqDTO.getFormCustomViewPath(), oldProcessDefinitionExt.getFormCustomViewPath())) { + return false; + } + // 校验 BPMN XML 信息 + BpmnModel newModel = buildBpmnModel(createReqDTO.getBpmnBytes()); + BpmnModel oldModel = getBpmnModel(oldProcessDefinition.getId()); + // 对比字节变化 + if (!FlowableUtils.equals(oldModel, newModel)) { + return false; + } + // 最终发现都一致,则返回 true + return true; + } + + /** + * 构建对应的 BPMN Model + * + * @param bpmnBytes 原始的 BPMN XML 字节数组 + * @return BPMN Model + */ + private BpmnModel buildBpmnModel(byte[] bpmnBytes) { + // 转换成 BpmnModel 对象 + BpmnXMLConverter converter = new BpmnXMLConverter(); + return converter.convertToBpmnModel(new BytesStreamSource(bpmnBytes), true, true); + } + + @Override + public BpmProcessDefinitionExtDO getProcessDefinitionExt(String id) { + return processDefinitionMapper.selectByProcessDefinitionId(id); + } + + @Override + public List getProcessDefinitionList(BpmProcessDefinitionListReqVO listReqVO) { + // 拼接查询条件 + ProcessDefinitionQuery definitionQuery = repositoryService.createProcessDefinitionQuery(); + if (Objects.equals(SuspensionState.SUSPENDED.getStateCode(), listReqVO.getSuspensionState())) { + definitionQuery.suspended(); + } else if (Objects.equals(SuspensionState.ACTIVE.getStateCode(), listReqVO.getSuspensionState())) { + definitionQuery.active(); + } + // 执行查询 + List processDefinitions = definitionQuery.list(); + if (CollUtil.isEmpty(processDefinitions)) { + return Collections.emptyList(); + } + + // 获得 BpmProcessDefinitionDO Map + List processDefinitionDOs = processDefinitionMapper.selectListByProcessDefinitionIds( + convertList(processDefinitions, ProcessDefinition::getId)); + Map processDefinitionDOMap = convertMap(processDefinitionDOs, + BpmProcessDefinitionExtDO::getProcessDefinitionId); + // 执行查询,并返回 + return BpmProcessDefinitionConvert.INSTANCE.convertList3(processDefinitions, processDefinitionDOMap); + } + + @Override + public PageResult getProcessDefinitionPage(BpmProcessDefinitionPageReqVO pageVO) { + ProcessDefinitionQuery definitionQuery = repositoryService.createProcessDefinitionQuery(); + if (StrUtil.isNotBlank(pageVO.getKey())) { + definitionQuery.processDefinitionKey(pageVO.getKey()); + } + + // 执行查询 + List processDefinitions = definitionQuery.orderByProcessDefinitionVersion().desc() + .listPage(PageUtils.getStart(pageVO), pageVO.getPageSize()); + + if (CollUtil.isEmpty(processDefinitions)) { + return new PageResult<>(emptyList(), definitionQuery.count()); + } + // 获得 Deployment Map + Set deploymentIds = new HashSet<>(); + processDefinitions.forEach(definition -> addIfNotNull(deploymentIds, definition.getDeploymentId())); + Map deploymentMap = getDeploymentMap(deploymentIds); + + // 获得 BpmProcessDefinitionDO Map + List processDefinitionDOs = processDefinitionMapper.selectListByProcessDefinitionIds( + convertList(processDefinitions, ProcessDefinition::getId)); + Map processDefinitionDOMap = convertMap(processDefinitionDOs, + BpmProcessDefinitionExtDO::getProcessDefinitionId); + + // 获得 Form Map + Set formIds = convertSet(processDefinitionDOs, BpmProcessDefinitionExtDO::getFormId); + Map formMap = formService.getFormMap(formIds); + + // 拼接结果 + long definitionCount = definitionQuery.count(); + return new PageResult<>(BpmProcessDefinitionConvert.INSTANCE.convertList(processDefinitions, deploymentMap, + processDefinitionDOMap, formMap), definitionCount); + } + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/BpmTaskAssignRuleService.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/BpmTaskAssignRuleService.java new file mode 100644 index 0000000..7075d24 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/BpmTaskAssignRuleService.java @@ -0,0 +1,97 @@ +package com.win.module.bpm.service.definition; + +import com.win.module.bpm.controller.definition.vo.rule.BpmTaskAssignRuleCreateReqVO; +import com.win.module.bpm.controller.definition.vo.rule.BpmTaskAssignRuleRespVO; +import com.win.module.bpm.controller.definition.vo.rule.BpmTaskAssignRuleUpdateReqVO; +import com.win.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO; +import org.flowable.engine.delegate.DelegateExecution; +import org.springframework.lang.Nullable; + +import javax.validation.Valid; +import java.util.List; +import java.util.Set; + +/** + * BPM 任务分配规则 Service 接口 + * + * @author 闻荫源码 + */ +public interface BpmTaskAssignRuleService { + + /** + * 获得流程定义的任务分配规则数组 + * + * @param processDefinitionId 流程定义的编号 + * @param taskDefinitionKey 流程任务定义的 Key。允许空 + * @return 任务规则数组 + */ + List getTaskAssignRuleListByProcessDefinitionId(String processDefinitionId, + @Nullable String taskDefinitionKey); + + /** + * 获得流程模型的任务规则数组 + * + * @param modelId 流程模型的编号 + * @return 任务规则数组 + */ + List getTaskAssignRuleListByModelId(String modelId); + + /** + * 获得流程定义的任务分配规则数组 + * + * @param modelId 流程模型的编号 + * @param processDefinitionId 流程定义的编号 + * @return 任务规则数组 + */ + List getTaskAssignRuleList(String modelId, String processDefinitionId); + + /** + * 创建任务分配规则 + * + * @param reqVO 创建信息 + * @return 规则编号 + */ + Long createTaskAssignRule(@Valid BpmTaskAssignRuleCreateReqVO reqVO); + + /** + * 更新任务分配规则 + * + * @param reqVO 创建信息 + */ + void updateTaskAssignRule(@Valid BpmTaskAssignRuleUpdateReqVO reqVO); + + /** + * 判断指定流程模型和流程定义的分配规则是否相等 + * + * @param modelId 流程模型编号 + * @param processDefinitionId 流程定义编号 + * @return 是否相等 + */ + boolean isTaskAssignRulesEquals(String modelId, String processDefinitionId); + + /** + * 将流程流程模型的任务分配规则,复制一份给流程定义 + * 目的:每次流程模型部署时,都会生成一个新的流程定义,此时考虑到每次部署的流程不可变性,所以需要复制一份给该流程定义 + * + * @param fromModelId 流程模型编号 + * @param toProcessDefinitionId 流程定义编号 + */ + void copyTaskAssignRules(String fromModelId, String toProcessDefinitionId); + + /** + * 校验流程模型的任务分配规则全部都配置了 + * 目的:如果有规则未配置,会导致流程任务找不到负责人,进而流程无法进行下去! + * + * @param id 流程模型编号 + */ + void checkTaskAssignRuleAllConfig(String id); + + /** + * 计算当前执行任务的处理人 + * + * @param execution 执行任务 + * @return 处理人的编号数组 + */ + Set calculateTaskCandidateUsers(DelegateExecution execution); + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/BpmTaskAssignRuleServiceImpl.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/BpmTaskAssignRuleServiceImpl.java new file mode 100644 index 0000000..47ebf10 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/BpmTaskAssignRuleServiceImpl.java @@ -0,0 +1,344 @@ +package com.win.module.bpm.service.definition; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.util.collection.CollectionUtils; +import com.win.framework.common.util.object.ObjectUtils; +import com.win.framework.datapermission.core.annotation.DataPermission; +import com.win.framework.flowable.core.util.FlowableUtils; +import com.win.module.bpm.controller.definition.vo.rule.BpmTaskAssignRuleCreateReqVO; +import com.win.module.bpm.controller.definition.vo.rule.BpmTaskAssignRuleRespVO; +import com.win.module.bpm.controller.definition.vo.rule.BpmTaskAssignRuleUpdateReqVO; +import com.win.module.bpm.convert.definition.BpmTaskAssignRuleConvert; +import com.win.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO; +import com.win.module.bpm.dal.dataobject.definition.BpmUserGroupDO; +import com.win.module.bpm.dal.mysql.definition.BpmTaskAssignRuleMapper; +import com.win.module.bpm.enums.DictTypeConstants; +import com.win.module.bpm.enums.definition.BpmTaskAssignRuleTypeEnum; +import com.win.module.bpm.framework.flowable.core.behavior.script.BpmTaskAssignScript; +import com.win.module.system.api.dept.DeptApi; +import com.win.module.system.api.dept.PostApi; +import com.win.module.system.api.dept.dto.DeptRespDTO; +import com.win.module.system.api.dict.DictDataApi; +import com.win.module.system.api.permission.PermissionApi; +import com.win.module.system.api.permission.RoleApi; +import com.win.module.system.api.user.AdminUserApi; +import com.win.module.system.api.user.dto.AdminUserRespDTO; +import com.google.common.annotations.VisibleForTesting; +import lombok.extern.slf4j.Slf4j; +import org.flowable.bpmn.model.BpmnModel; +import org.flowable.bpmn.model.UserTask; +import org.flowable.common.engine.api.FlowableException; +import org.flowable.engine.delegate.DelegateExecution; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.*; + +import static cn.hutool.core.text.CharSequenceUtil.format; +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.framework.common.util.collection.CollectionUtils.convertMap; +import static com.win.framework.common.util.collection.CollectionUtils.convertSet; +import static com.win.framework.common.util.json.JsonUtils.toJsonString; +import static com.win.module.bpm.enums.ErrorCodeConstants.*; + +/** + * BPM 任务分配规则 Service 实现类 + */ +@Service +@Validated +@Slf4j +public class BpmTaskAssignRuleServiceImpl implements BpmTaskAssignRuleService { + + @Resource + private BpmTaskAssignRuleMapper taskRuleMapper; + @Resource + @Lazy // 解决循环依赖 + private BpmModelService modelService; + @Resource + @Lazy // 解决循环依赖 + private BpmProcessDefinitionService processDefinitionService; + @Resource + private BpmUserGroupService userGroupService; + @Resource + private RoleApi roleApi; + @Resource + private DeptApi deptApi; + @Resource + private PostApi postApi; + @Resource + private AdminUserApi adminUserApi; + @Resource + private DictDataApi dictDataApi; + @Resource + private PermissionApi permissionApi; + /** + * 任务分配脚本 + */ + private Map scriptMap = Collections.emptyMap(); + + @Resource + public void setScripts(List scripts) { + this.scriptMap = convertMap(scripts, script -> script.getEnum().getId()); + } + + @Override + public List getTaskAssignRuleListByProcessDefinitionId(String processDefinitionId, + String taskDefinitionKey) { + return taskRuleMapper.selectListByProcessDefinitionId(processDefinitionId, taskDefinitionKey); + } + + @Override + public List getTaskAssignRuleListByModelId(String modelId) { + return taskRuleMapper.selectListByModelId(modelId); + } + + @Override + public List getTaskAssignRuleList(String modelId, String processDefinitionId) { + // 获得规则 + List rules = Collections.emptyList(); + BpmnModel model = null; + if (StrUtil.isNotEmpty(modelId)) { + rules = getTaskAssignRuleListByModelId(modelId); + model = modelService.getBpmnModel(modelId); + } else if (StrUtil.isNotEmpty(processDefinitionId)) { + rules = getTaskAssignRuleListByProcessDefinitionId(processDefinitionId, null); + model = processDefinitionService.getBpmnModel(processDefinitionId); + } + if (model == null) { + return Collections.emptyList(); + } + // 获得用户任务,只有用户任务才可以设置分配规则 + List userTasks = FlowableUtils.getBpmnModelElements(model, UserTask.class); + if (CollUtil.isEmpty(userTasks)) { + return Collections.emptyList(); + } + // 转换数据 + return BpmTaskAssignRuleConvert.INSTANCE.convertList(userTasks, rules); + } + + @Override + public Long createTaskAssignRule(@Valid BpmTaskAssignRuleCreateReqVO reqVO) { + // 校验参数 + validTaskAssignRuleOptions(reqVO.getType(), reqVO.getOptions()); + // 校验是否已经配置 + BpmTaskAssignRuleDO existRule = + taskRuleMapper.selectListByModelIdAndTaskDefinitionKey(reqVO.getModelId(), reqVO.getTaskDefinitionKey()); + if (existRule != null) { + throw exception(TASK_ASSIGN_RULE_EXISTS, reqVO.getModelId(), reqVO.getTaskDefinitionKey()); + } + + // 存储 + BpmTaskAssignRuleDO rule = BpmTaskAssignRuleConvert.INSTANCE.convert(reqVO) + .setProcessDefinitionId(BpmTaskAssignRuleDO.PROCESS_DEFINITION_ID_NULL); // 只有流程模型,才允许新建 + taskRuleMapper.insert(rule); + return rule.getId(); + } + + @Override + public void updateTaskAssignRule(@Valid BpmTaskAssignRuleUpdateReqVO reqVO) { + // 校验参数 + validTaskAssignRuleOptions(reqVO.getType(), reqVO.getOptions()); + // 校验是否存在 + BpmTaskAssignRuleDO existRule = taskRuleMapper.selectById(reqVO.getId()); + if (existRule == null) { + throw exception(TASK_ASSIGN_RULE_NOT_EXISTS); + } + // 只允许修改流程模型的规则 + if (!Objects.equals(BpmTaskAssignRuleDO.PROCESS_DEFINITION_ID_NULL, existRule.getProcessDefinitionId())) { + throw exception(TASK_UPDATE_FAIL_NOT_MODEL); + } + + // 执行更新 + taskRuleMapper.updateById(BpmTaskAssignRuleConvert.INSTANCE.convert(reqVO)); + } + + @Override + public boolean isTaskAssignRulesEquals(String modelId, String processDefinitionId) { + // 调用 VO 接口的原因是,过滤掉流程模型不需要的规则,保持和 copyTaskAssignRules 方法的一致性 + List modelRules = getTaskAssignRuleList(modelId, null); + List processInstanceRules = getTaskAssignRuleList(null, processDefinitionId); + if (modelRules.size() != processInstanceRules.size()) { + return false; + } + + // 遍历,匹配对应的规则 + Map processInstanceRuleMap = + CollectionUtils.convertMap(processInstanceRules, BpmTaskAssignRuleRespVO::getTaskDefinitionKey); + for (BpmTaskAssignRuleRespVO modelRule : modelRules) { + BpmTaskAssignRuleRespVO processInstanceRule = processInstanceRuleMap.get(modelRule.getTaskDefinitionKey()); + if (processInstanceRule == null) { + return false; + } + if (!ObjectUtil.equals(modelRule.getType(), processInstanceRule.getType()) || !ObjectUtil.equal( + modelRule.getOptions(), processInstanceRule.getOptions())) { + return false; + } + } + return true; + } + + @Override + public void copyTaskAssignRules(String fromModelId, String toProcessDefinitionId) { + List rules = getTaskAssignRuleList(fromModelId, null); + if (CollUtil.isEmpty(rules)) { + return; + } + // 开始复制 + List newRules = BpmTaskAssignRuleConvert.INSTANCE.convertList2(rules); + newRules.forEach(rule -> rule.setProcessDefinitionId(toProcessDefinitionId).setId(null).setCreateTime(null) + .setUpdateTime(null)); + taskRuleMapper.insertBatch(newRules); + } + + @Override + public void checkTaskAssignRuleAllConfig(String id) { + // 一个用户任务都没配置,所以无需配置规则 + List taskAssignRules = getTaskAssignRuleList(id, null); + if (CollUtil.isEmpty(taskAssignRules)) { + return; + } + // 校验未配置规则的任务 + taskAssignRules.forEach(rule -> { + if (CollUtil.isEmpty(rule.getOptions())) { + throw exception(MODEL_DEPLOY_FAIL_TASK_ASSIGN_RULE_NOT_CONFIG, rule.getTaskDefinitionName()); + } + }); + } + + private void validTaskAssignRuleOptions(Integer type, Set options) { + if (Objects.equals(type, BpmTaskAssignRuleTypeEnum.ROLE.getType())) { + roleApi.validRoleList(options); + } else if (ObjectUtils.equalsAny(type, BpmTaskAssignRuleTypeEnum.DEPT_MEMBER.getType(), + BpmTaskAssignRuleTypeEnum.DEPT_LEADER.getType())) { + deptApi.validateDeptList(options); + } else if (Objects.equals(type, BpmTaskAssignRuleTypeEnum.POST.getType())) { + postApi.validPostList(options); + } else if (Objects.equals(type, BpmTaskAssignRuleTypeEnum.USER.getType())) { + adminUserApi.validateUserList(options); + } else if (Objects.equals(type, BpmTaskAssignRuleTypeEnum.USER_GROUP.getType())) { + userGroupService.validUserGroups(options); + } else if (Objects.equals(type, BpmTaskAssignRuleTypeEnum.SCRIPT.getType())) { + dictDataApi.validateDictDataList(DictTypeConstants.TASK_ASSIGN_SCRIPT, + CollectionUtils.convertSet(options, String::valueOf)); + } else { + throw new IllegalArgumentException(format("未知的规则类型({})", type)); + } + } + + @Override + @DataPermission(enable = false) // 忽略数据权限,不然分配会存在问题 + public Set calculateTaskCandidateUsers(DelegateExecution execution) { + BpmTaskAssignRuleDO rule = getTaskRule(execution); + return calculateTaskCandidateUsers(execution, rule); + } + + @VisibleForTesting + BpmTaskAssignRuleDO getTaskRule(DelegateExecution execution) { + List taskRules = getTaskAssignRuleListByProcessDefinitionId( + execution.getProcessDefinitionId(), execution.getCurrentActivityId()); + if (CollUtil.isEmpty(taskRules)) { + throw new FlowableException(format("流程任务({}/{}/{}) 找不到符合的任务规则", + execution.getId(), execution.getProcessDefinitionId(), execution.getCurrentActivityId())); + } + if (taskRules.size() > 1) { + throw new FlowableException(format("流程任务({}/{}/{}) 找到过多任务规则({})", + execution.getId(), execution.getProcessDefinitionId(), execution.getCurrentActivityId())); + } + return taskRules.get(0); + } + + @VisibleForTesting + Set calculateTaskCandidateUsers(DelegateExecution execution, BpmTaskAssignRuleDO rule) { + Set assigneeUserIds = null; + if (Objects.equals(BpmTaskAssignRuleTypeEnum.ROLE.getType(), rule.getType())) { + assigneeUserIds = calculateTaskCandidateUsersByRole(rule); + } else if (Objects.equals(BpmTaskAssignRuleTypeEnum.DEPT_MEMBER.getType(), rule.getType())) { + assigneeUserIds = calculateTaskCandidateUsersByDeptMember(rule); + } else if (Objects.equals(BpmTaskAssignRuleTypeEnum.DEPT_LEADER.getType(), rule.getType())) { + assigneeUserIds = calculateTaskCandidateUsersByDeptLeader(rule); + } else if (Objects.equals(BpmTaskAssignRuleTypeEnum.POST.getType(), rule.getType())) { + assigneeUserIds = calculateTaskCandidateUsersByPost(rule); + } else if (Objects.equals(BpmTaskAssignRuleTypeEnum.USER.getType(), rule.getType())) { + assigneeUserIds = calculateTaskCandidateUsersByUser(rule); + } else if (Objects.equals(BpmTaskAssignRuleTypeEnum.USER_GROUP.getType(), rule.getType())) { + assigneeUserIds = calculateTaskCandidateUsersByUserGroup(rule); + } else if (Objects.equals(BpmTaskAssignRuleTypeEnum.SCRIPT.getType(), rule.getType())) { + assigneeUserIds = calculateTaskCandidateUsersByScript(execution, rule); + } + + // 移除被禁用的用户 + removeDisableUsers(assigneeUserIds); + // 如果候选人为空,抛出异常 + if (CollUtil.isEmpty(assigneeUserIds)) { + log.error("[calculateTaskCandidateUsers][流程任务({}/{}/{}) 任务规则({}) 找不到候选人]", execution.getId(), + execution.getProcessDefinitionId(), execution.getCurrentActivityId(), toJsonString(rule)); + throw exception(TASK_CREATE_FAIL_NO_CANDIDATE_USER); + } + return assigneeUserIds; + } + + private Set calculateTaskCandidateUsersByRole(BpmTaskAssignRuleDO rule) { + return permissionApi.getUserRoleIdListByRoleIds(rule.getOptions()); + } + + private Set calculateTaskCandidateUsersByDeptMember(BpmTaskAssignRuleDO rule) { + List users = adminUserApi.getUserListByDeptIds(rule.getOptions()); + return convertSet(users, AdminUserRespDTO::getId); + } + + private Set calculateTaskCandidateUsersByDeptLeader(BpmTaskAssignRuleDO rule) { + List depts = deptApi.getDeptList(rule.getOptions()); + return convertSet(depts, DeptRespDTO::getLeaderUserId); + } + + private Set calculateTaskCandidateUsersByPost(BpmTaskAssignRuleDO rule) { + List users = adminUserApi.getUserListByPostIds(rule.getOptions()); + return convertSet(users, AdminUserRespDTO::getId); + } + + private Set calculateTaskCandidateUsersByUser(BpmTaskAssignRuleDO rule) { + return rule.getOptions(); + } + + private Set calculateTaskCandidateUsersByUserGroup(BpmTaskAssignRuleDO rule) { + List userGroups = userGroupService.getUserGroupList(rule.getOptions()); + Set userIds = new HashSet<>(); + userGroups.forEach(group -> userIds.addAll(group.getMemberUserIds())); + return userIds; + } + + private Set calculateTaskCandidateUsersByScript(DelegateExecution execution, BpmTaskAssignRuleDO rule) { + // 获得对应的脚本 + List scripts = new ArrayList<>(rule.getOptions().size()); + rule.getOptions().forEach(id -> { + BpmTaskAssignScript script = scriptMap.get(id); + if (script == null) { + throw exception(TASK_ASSIGN_SCRIPT_NOT_EXISTS, id); + } + scripts.add(script); + }); + // 逐个计算任务 + Set userIds = new HashSet<>(); + scripts.forEach(script -> CollUtil.addAll(userIds, script.calculateTaskCandidateUsers(execution))); + return userIds; + } + + @VisibleForTesting + void removeDisableUsers(Set assigneeUserIds) { + if (CollUtil.isEmpty(assigneeUserIds)) { + return; + } + Map userMap = adminUserApi.getUserMap(assigneeUserIds); + assigneeUserIds.removeIf(id -> { + AdminUserRespDTO user = userMap.get(id); + return user == null || !CommonStatusEnum.ENABLE.getStatus().equals(user.getStatus()); + }); + } + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/BpmUserGroupService.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/BpmUserGroupService.java new file mode 100644 index 0000000..a9b8b78 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/BpmUserGroupService.java @@ -0,0 +1,82 @@ +package com.win.module.bpm.service.definition; + +import java.util.*; +import javax.validation.*; + +import com.win.module.bpm.controller.definition.vo.group.BpmUserGroupCreateReqVO; +import com.win.module.bpm.controller.definition.vo.group.BpmUserGroupPageReqVO; +import com.win.module.bpm.controller.definition.vo.group.BpmUserGroupUpdateReqVO; +import com.win.module.bpm.dal.dataobject.definition.BpmUserGroupDO; +import com.win.framework.common.pojo.PageResult; + +/** + * 用户组 Service 接口 + * + * @author 闻荫源码 + */ +public interface BpmUserGroupService { + + /** + * 创建用户组 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createUserGroup(@Valid BpmUserGroupCreateReqVO createReqVO); + + /** + * 更新用户组 + * + * @param updateReqVO 更新信息 + */ + void updateUserGroup(@Valid BpmUserGroupUpdateReqVO updateReqVO); + + /** + * 删除用户组 + * + * @param id 编号 + */ + void deleteUserGroup(Long id); + + /** + * 获得用户组 + * + * @param id 编号 + * @return 用户组 + */ + BpmUserGroupDO getUserGroup(Long id); + + /** + * 获得用户组列表 + * + * @param ids 编号 + * @return 用户组列表 + */ + List getUserGroupList(Collection ids); + + /** + * 获得指定状态的用户组列表 + * + * @param status 状态 + * @return 用户组列表 + */ + List getUserGroupListByStatus(Integer status); + + /** + * 获得用户组分页 + * + * @param pageReqVO 分页查询 + * @return 用户组分页 + */ + PageResult getUserGroupPage(BpmUserGroupPageReqVO pageReqVO); + + /** + * 校验用户组们是否有效。如下情况,视为无效: + * 1. 用户组编号不存在 + * 2. 用户组被禁用 + * + * @param ids 用户组编号数组 + */ + void validUserGroups(Set ids); + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/BpmUserGroupServiceImpl.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/BpmUserGroupServiceImpl.java new file mode 100644 index 0000000..b19a3a7 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/BpmUserGroupServiceImpl.java @@ -0,0 +1,111 @@ +package com.win.module.bpm.service.definition; + +import cn.hutool.core.collection.CollUtil; +import com.win.module.bpm.controller.definition.vo.group.BpmUserGroupCreateReqVO; +import com.win.module.bpm.controller.definition.vo.group.BpmUserGroupPageReqVO; +import com.win.module.bpm.controller.definition.vo.group.BpmUserGroupUpdateReqVO; +import com.win.module.bpm.convert.definition.BpmUserGroupConvert; +import com.win.module.bpm.dal.dataobject.definition.BpmUserGroupDO; +import com.win.module.bpm.dal.mysql.definition.BpmUserGroupMapper; +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.exception.util.ServiceExceptionUtil; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.collection.CollectionUtils; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.bpm.enums.ErrorCodeConstants.*; + +/** + * 用户组 Service 实现类 + * + * @author 闻荫源码 + */ +@Service +@Validated +public class BpmUserGroupServiceImpl implements BpmUserGroupService { + + @Resource + private BpmUserGroupMapper userGroupMapper; + + @Override + public Long createUserGroup(BpmUserGroupCreateReqVO createReqVO) { + // 插入 + BpmUserGroupDO userGroup = BpmUserGroupConvert.INSTANCE.convert(createReqVO); + userGroupMapper.insert(userGroup); + // 返回 + return userGroup.getId(); + } + + @Override + public void updateUserGroup(BpmUserGroupUpdateReqVO updateReqVO) { + // 校验存在 + this.validateUserGroupExists(updateReqVO.getId()); + // 更新 + BpmUserGroupDO updateObj = BpmUserGroupConvert.INSTANCE.convert(updateReqVO); + userGroupMapper.updateById(updateObj); + } + + @Override + public void deleteUserGroup(Long id) { + // 校验存在 + this.validateUserGroupExists(id); + // 删除 + userGroupMapper.deleteById(id); + } + + private void validateUserGroupExists(Long id) { + if (userGroupMapper.selectById(id) == null) { + throw ServiceExceptionUtil.exception(USER_GROUP_NOT_EXISTS); + } + } + + @Override + public BpmUserGroupDO getUserGroup(Long id) { + return userGroupMapper.selectById(id); + } + + @Override + public List getUserGroupList(Collection ids) { + return userGroupMapper.selectBatchIds(ids); + } + + + @Override + public List getUserGroupListByStatus(Integer status) { + return userGroupMapper.selectListByStatus(status); + } + + @Override + public PageResult getUserGroupPage(BpmUserGroupPageReqVO pageReqVO) { + return userGroupMapper.selectPage(pageReqVO); + } + + @Override + public void validUserGroups(Set ids) { + if (CollUtil.isEmpty(ids)) { + return; + } + // 获得用户组信息 + List userGroups = userGroupMapper.selectBatchIds(ids); + Map userGroupMap = CollectionUtils.convertMap(userGroups, BpmUserGroupDO::getId); + // 校验 + ids.forEach(id -> { + BpmUserGroupDO userGroup = userGroupMap.get(id); + if (userGroup == null) { + throw ServiceExceptionUtil.exception(USER_GROUP_NOT_EXISTS); + } + if (!CommonStatusEnum.ENABLE.getStatus().equals(userGroup.getStatus())) { + throw exception(USER_GROUP_IS_DISABLE, userGroup.getName()); + } + }); + } + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/dto/BpmFormFieldRespDTO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/dto/BpmFormFieldRespDTO.java new file mode 100644 index 0000000..ac3b2a7 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/dto/BpmFormFieldRespDTO.java @@ -0,0 +1,25 @@ +package com.win.module.bpm.service.definition.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +/** + * Bpm 表单的 Field 表单项 Response DTO + * 字段的定义,可见 https://github.com/JakHuang/form-generator/issues/46 文档 + * + * @author 闻荫源码 + */ +@Data +public class BpmFormFieldRespDTO { + + /** + * 表单标题 + */ + private String label; + /** + * 表单字段的属性名,可自定义 + */ + @JsonProperty(value = "vModel") + private String vModel; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/dto/BpmModelMetaInfoRespDTO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/dto/BpmModelMetaInfoRespDTO.java new file mode 100644 index 0000000..b6f3045 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/dto/BpmModelMetaInfoRespDTO.java @@ -0,0 +1,39 @@ +package com.win.module.bpm.service.definition.dto; + +import com.win.module.bpm.enums.definition.BpmModelFormTypeEnum; +import lombok.Data; + +/** + * BPM 流程 MetaInfo Response DTO + * 主要用于 { Model#setMetaInfo(String)} 的存储 + * + * @author 闻荫源码 + */ +@Data +public class BpmModelMetaInfoRespDTO { + + /** + * 流程描述 + */ + private String description; + /** + * 表单类型 + */ + private Integer formType; + /** + * 表单编号 + * 在表单类型为 {@link BpmModelFormTypeEnum#NORMAL} 时 + */ + private Long formId; + /** + * 自定义表单的提交路径,使用 Vue 的路由地址 + * 在表单类型为 {@link BpmModelFormTypeEnum#CUSTOM} 时 + */ + private String formCustomCreatePath; + /** + * 自定义表单的查看路径,使用 Vue 的路由地址 + * 在表单类型为 {@link BpmModelFormTypeEnum#CUSTOM} 时 + */ + private String formCustomViewPath; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/dto/BpmProcessDefinitionCreateReqDTO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/dto/BpmProcessDefinitionCreateReqDTO.java new file mode 100644 index 0000000..0f0f232 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/dto/BpmProcessDefinitionCreateReqDTO.java @@ -0,0 +1,104 @@ +package com.win.module.bpm.service.definition.dto; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.win.module.bpm.enums.definition.BpmModelFormTypeEnum; +import lombok.Data; + +import javax.validation.constraints.AssertTrue; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; +import java.util.Objects; + +/** + * 流程定义创建 Request DTO + */ +@Data +public class BpmProcessDefinitionCreateReqDTO { + + // ========== 模型相关 ========== + + /** + * 流程模型的编号 + */ + @NotEmpty(message = "流程模型编号不能为空") + private String modelId; + /** + * 流程标识 + */ + @NotEmpty(message = "流程标识不能为空") + private String key; + /** + * 流程名称 + */ + @NotEmpty(message = "流程名称不能为空") + private String name; + /** + * 流程描述 + */ + private String description; + /** + * 流程分类 + * 参见 bpm_model_category 数据字典 + */ + @NotEmpty(message = "流程分类不能为空") + private String category; + /** + * BPMN XML + */ + @NotEmpty(message = "BPMN XML 不能为空") + private byte[] bpmnBytes; + + // ========== 表单相关 ========== + + /** + * 表单类型 + */ + @NotNull(message = "表单类型不能为空") + private Integer formType; + /** + * 动态表单编号 + * 在表单类型为 {@link BpmModelFormTypeEnum#NORMAL} 时 + */ + private Long formId; + /** + * 表单的配置 + * 在表单类型为 {@link BpmModelFormTypeEnum#NORMAL} 时 + */ + private String formConf; + /** + * 表单项的数组 + * 在表单类型为 {@link BpmModelFormTypeEnum#NORMAL} 时 + */ + private List formFields; + /** + * 自定义表单的提交路径,使用 Vue 的路由地址 + * 在表单类型为 {@link BpmModelFormTypeEnum#CUSTOM} 时 + */ + private String formCustomCreatePath; + /** + * 自定义表单的查看路径,使用 Vue 的路由地址 + * 在表单类型为 {@link BpmModelFormTypeEnum#CUSTOM} 时 + */ + private String formCustomViewPath; + + @AssertTrue(message = "流程表单信息不全") + public boolean isNormalFormTypeValid() { + // 如果非业务表单,则直接通过 + if (!Objects.equals(formType, BpmModelFormTypeEnum.NORMAL.getType())) { + return true; + } + return formId != null && StrUtil.isNotEmpty(formConf) && CollUtil.isNotEmpty(formFields); + } + + @AssertTrue(message = "业务表单信息不全") + public boolean isNormalCustomTypeValid() { + // 如果非业务表单,则直接通过 + if (!Objects.equals(formType, BpmModelFormTypeEnum.CUSTOM.getType())) { + return true; + } + return StrUtil.isNotEmpty(formCustomCreatePath) && StrUtil.isNotEmpty(formCustomViewPath); + } + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/message/BpmMessageService.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/message/BpmMessageService.java new file mode 100644 index 0000000..46db929 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/message/BpmMessageService.java @@ -0,0 +1,39 @@ +package com.win.module.bpm.service.message; + +import com.win.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO; +import com.win.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceRejectReqDTO; +import com.win.module.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO; + +import javax.validation.Valid; + +/** + * BPM 消息 Service 接口 + * + * TODO 芋艿:未来支持消息的可配置;不同的流程,在什么场景下,需要发送什么消息,消息的内容是什么; + * + * @author 闻荫源码 + */ +public interface BpmMessageService { + + /** + * 发送流程实例被通过的消息 + * + * @param reqDTO 发送信息 + */ + void sendMessageWhenProcessInstanceApprove(@Valid BpmMessageSendWhenProcessInstanceApproveReqDTO reqDTO); + + /** + * 发送流程实例被不通过的消息 + * + * @param reqDTO 发送信息 + */ + void sendMessageWhenProcessInstanceReject(@Valid BpmMessageSendWhenProcessInstanceRejectReqDTO reqDTO); + + /** + * 发送任务被分配的消息 + * + * @param reqDTO 发送信息 + */ + void sendMessageWhenTaskAssigned(@Valid BpmMessageSendWhenTaskCreatedReqDTO reqDTO); + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/message/BpmMessageServiceImpl.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/message/BpmMessageServiceImpl.java new file mode 100644 index 0000000..70a5e0e --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/message/BpmMessageServiceImpl.java @@ -0,0 +1,68 @@ +package com.win.module.bpm.service.message; + +import com.win.framework.web.config.WebProperties; +import com.win.module.bpm.convert.message.BpmMessageConvert; +import com.win.module.bpm.enums.message.BpmMessageEnum; +import com.win.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO; +import com.win.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceRejectReqDTO; +import com.win.module.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO; +import com.win.module.system.api.sms.SmsSendApi; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.Map; + +/** + * BPM 消息 Service 实现类 + * + * @author 闻荫源码 + */ +@Service +@Validated +@Slf4j +public class BpmMessageServiceImpl implements BpmMessageService { + + @Resource + private SmsSendApi smsSendApi; + + @Resource + private WebProperties webProperties; + + @Override + public void sendMessageWhenProcessInstanceApprove(BpmMessageSendWhenProcessInstanceApproveReqDTO reqDTO) { + Map templateParams = new HashMap<>(); + templateParams.put("processInstanceName", reqDTO.getProcessInstanceName()); + templateParams.put("detailUrl", getProcessInstanceDetailUrl(reqDTO.getProcessInstanceId())); + smsSendApi.sendSingleSmsToAdmin(BpmMessageConvert.INSTANCE.convert(reqDTO.getStartUserId(), + BpmMessageEnum.PROCESS_INSTANCE_APPROVE.getSmsTemplateCode(), templateParams)); + } + + @Override + public void sendMessageWhenProcessInstanceReject(BpmMessageSendWhenProcessInstanceRejectReqDTO reqDTO) { + Map templateParams = new HashMap<>(); + templateParams.put("processInstanceName", reqDTO.getProcessInstanceName()); + templateParams.put("reason", reqDTO.getReason()); + templateParams.put("detailUrl", getProcessInstanceDetailUrl(reqDTO.getProcessInstanceId())); + smsSendApi.sendSingleSmsToAdmin(BpmMessageConvert.INSTANCE.convert(reqDTO.getStartUserId(), + BpmMessageEnum.PROCESS_INSTANCE_REJECT.getSmsTemplateCode(), templateParams)); + } + + @Override + public void sendMessageWhenTaskAssigned(BpmMessageSendWhenTaskCreatedReqDTO reqDTO) { + Map templateParams = new HashMap<>(); + templateParams.put("processInstanceName", reqDTO.getProcessInstanceName()); + templateParams.put("taskName", reqDTO.getTaskName()); + templateParams.put("startUserNickname", reqDTO.getStartUserNickname()); + templateParams.put("detailUrl", getProcessInstanceDetailUrl(reqDTO.getProcessInstanceId())); + smsSendApi.sendSingleSmsToAdmin(BpmMessageConvert.INSTANCE.convert(reqDTO.getAssigneeUserId(), + BpmMessageEnum.TASK_ASSIGNED.getSmsTemplateCode(), templateParams)); + } + + private String getProcessInstanceDetailUrl(String taskId) { + return webProperties.getAdminUi().getUrl() + "/bpm/process-instance/detail?id=" + taskId; + } + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceApproveReqDTO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceApproveReqDTO.java new file mode 100644 index 0000000..aa96235 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceApproveReqDTO.java @@ -0,0 +1,27 @@ +package com.win.module.bpm.service.message.dto; + +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +/** + * BPM 发送流程实例被通过 Request DTO + */ +@Data +public class BpmMessageSendWhenProcessInstanceApproveReqDTO { + + /** + * 流程实例的编号 + */ + @NotEmpty(message = "流程实例的编号不能为空") + private String processInstanceId; + /** + * 流程实例的名字 + */ + @NotEmpty(message = "流程实例的名字不能为空") + private String processInstanceName; + @NotNull(message = "发起人的用户编号") + private Long startUserId; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceRejectReqDTO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceRejectReqDTO.java new file mode 100644 index 0000000..f209584 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceRejectReqDTO.java @@ -0,0 +1,33 @@ +package com.win.module.bpm.service.message.dto; + +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +/** + * BPM 发送流程实例被不通过 Request DTO + */ +@Data +public class BpmMessageSendWhenProcessInstanceRejectReqDTO { + + /** + * 流程实例的编号 + */ + @NotEmpty(message = "流程实例的编号不能为空") + private String processInstanceId; + /** + * 流程实例的名字 + */ + @NotEmpty(message = "流程实例的名字不能为空") + private String processInstanceName; + @NotNull(message = "发起人的用户编号") + private Long startUserId; + + /** + * 不通过理由 + */ + @NotEmpty(message = "不通过理由不能为空") + private String reason; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/message/dto/BpmMessageSendWhenTaskCreatedReqDTO.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/message/dto/BpmMessageSendWhenTaskCreatedReqDTO.java new file mode 100644 index 0000000..f0790b4 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/message/dto/BpmMessageSendWhenTaskCreatedReqDTO.java @@ -0,0 +1,46 @@ +package com.win.module.bpm.service.message.dto; + +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +/** + * BPM 发送任务被分配 Request DTO + */ +@Data +public class BpmMessageSendWhenTaskCreatedReqDTO { + + /** + * 流程实例的编号 + */ + @NotEmpty(message = "流程实例的编号不能为空") + private String processInstanceId; + /** + * 流程实例的名字 + */ + @NotEmpty(message = "流程实例的名字不能为空") + private String processInstanceName; + @NotNull(message = "发起人的用户编号") + private Long startUserId; + @NotEmpty(message = "发起人的昵称") + private String startUserNickname; + + /** + * 流程任务的编号 + */ + @NotEmpty(message = "流程任务的编号不能为空") + private String taskId; + /** + * 流程任务的名字 + */ + @NotEmpty(message = "流程任务的名字不能为空") + private String taskName; + + /** + * 审批人的用户编号 + */ + @NotNull(message = "审批人的用户编号不能为空") + private Long assigneeUserId; + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/oa/BpmOALeaveService.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/oa/BpmOALeaveService.java new file mode 100644 index 0000000..7d2d701 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/oa/BpmOALeaveService.java @@ -0,0 +1,53 @@ +package com.win.module.bpm.service.oa; + + +import com.win.framework.common.pojo.PageResult; +import com.win.module.bpm.controller.oa.vo.BpmOALeaveCreateReqVO; +import com.win.module.bpm.controller.oa.vo.BpmOALeavePageReqVO; +import com.win.module.bpm.dal.dataobject.oa.BpmOALeaveDO; + +import javax.validation.Valid; + +/** + * 请假申请 Service 接口 + * + * @author jason + * @author 闻荫源码 + */ +public interface BpmOALeaveService { + + /** + * 创建请假申请 + * + * @param userId 用户编号 + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createLeave(Long userId, @Valid BpmOALeaveCreateReqVO createReqVO); + + /** + * 更新请假申请的状态 + * + * @param id 编号 + * @param result 结果 + */ + void updateLeaveResult(Long id, Integer result); + + /** + * 获得请假申请 + * + * @param id 编号 + * @return 请假申请 + */ + BpmOALeaveDO getLeave(Long id); + + /** + * 获得请假申请分页 + * + * @param userId 用户编号 + * @param pageReqVO 分页查询 + * @return 请假申请分页 + */ + PageResult getLeavePage(Long userId, BpmOALeavePageReqVO pageReqVO); + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/oa/BpmOALeaveServiceImpl.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/oa/BpmOALeaveServiceImpl.java new file mode 100644 index 0000000..b26804e --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/oa/BpmOALeaveServiceImpl.java @@ -0,0 +1,88 @@ +package com.win.module.bpm.service.oa; + +import cn.hutool.core.date.LocalDateTimeUtil; +import com.win.framework.common.pojo.PageResult; +import com.win.module.bpm.api.task.BpmProcessInstanceApi; +import com.win.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; +import com.win.module.bpm.controller.oa.vo.BpmOALeaveCreateReqVO; +import com.win.module.bpm.controller.oa.vo.BpmOALeavePageReqVO; +import com.win.module.bpm.convert.oa.BpmOALeaveConvert; +import com.win.module.bpm.dal.dataobject.oa.BpmOALeaveDO; +import com.win.module.bpm.dal.mysql.oa.BpmOALeaveMapper; +import com.win.module.bpm.enums.task.BpmProcessInstanceResultEnum; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.Map; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.bpm.enums.ErrorCodeConstants.OA_LEAVE_NOT_EXISTS; + +/** + * OA 请假申请 Service 实现类 + * + * @author jason + * @author 闻荫源码 + */ +@Service +@Validated +public class BpmOALeaveServiceImpl implements BpmOALeaveService { + + /** + * OA 请假对应的流程定义 KEY + */ + public static final String PROCESS_KEY = "oa_leave"; + + @Resource + private BpmOALeaveMapper leaveMapper; + + @Resource + private BpmProcessInstanceApi processInstanceApi; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createLeave(Long userId, BpmOALeaveCreateReqVO createReqVO) { + // 插入 OA 请假单 + long day = LocalDateTimeUtil.between(createReqVO.getStartTime(), createReqVO.getEndTime()).toDays(); + BpmOALeaveDO leave = BpmOALeaveConvert.INSTANCE.convert(createReqVO).setUserId(userId).setDay(day) + .setResult(BpmProcessInstanceResultEnum.PROCESS.getResult()); + leaveMapper.insert(leave); + + // 发起 BPM 流程 + Map processInstanceVariables = new HashMap<>(); + processInstanceVariables.put("day", day); + String processInstanceId = processInstanceApi.createProcessInstance(userId, + new BpmProcessInstanceCreateReqDTO().setProcessDefinitionKey(PROCESS_KEY) + .setVariables(processInstanceVariables).setBusinessKey(String.valueOf(leave.getId()))); + + // 将工作流的编号,更新到 OA 请假单中 + leaveMapper.updateById(new BpmOALeaveDO().setId(leave.getId()).setProcessInstanceId(processInstanceId)); + return leave.getId(); + } + + @Override + public void updateLeaveResult(Long id, Integer result) { + validateLeaveExists(id); + leaveMapper.updateById(new BpmOALeaveDO().setId(id).setResult(result)); + } + + private void validateLeaveExists(Long id) { + if (leaveMapper.selectById(id) == null) { + throw exception(OA_LEAVE_NOT_EXISTS); + } + } + + @Override + public BpmOALeaveDO getLeave(Long id) { + return leaveMapper.selectById(id); + } + + @Override + public PageResult getLeavePage(Long userId, BpmOALeavePageReqVO pageReqVO) { + return leaveMapper.selectPage(userId, pageReqVO); + } + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/oa/listener/BpmOALeaveResultListener.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/oa/listener/BpmOALeaveResultListener.java new file mode 100644 index 0000000..008ac52 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/oa/listener/BpmOALeaveResultListener.java @@ -0,0 +1,32 @@ +package com.win.module.bpm.service.oa.listener; + +import com.win.module.bpm.framework.bpm.core.event.BpmProcessInstanceResultEvent; +import com.win.module.bpm.framework.bpm.core.event.BpmProcessInstanceResultEventListener; +import com.win.module.bpm.service.oa.BpmOALeaveService; +import com.win.module.bpm.service.oa.BpmOALeaveServiceImpl; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * OA 请假单的结果的监听器实现类 + * + * @author 闻荫源码 + */ +@Component +public class BpmOALeaveResultListener extends BpmProcessInstanceResultEventListener { + + @Resource + private BpmOALeaveService leaveService; + + @Override + protected String getProcessDefinitionKey() { + return BpmOALeaveServiceImpl.PROCESS_KEY; + } + + @Override + protected void onEvent(BpmProcessInstanceResultEvent event) { + leaveService.updateLeaveResult(Long.parseLong(event.getBusinessKey()), event.getResult()); + } + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/task/BpmActivityService.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/task/BpmActivityService.java new file mode 100644 index 0000000..b45b30e --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/task/BpmActivityService.java @@ -0,0 +1,31 @@ +package com.win.module.bpm.service.task; + +import com.win.module.bpm.controller.task.vo.activity.BpmActivityRespVO; +import org.flowable.engine.history.HistoricActivityInstance; + +import java.util.List; + +/** + * BPM 活动实例 Service 接口 + * + * @author 闻荫源码 + */ +public interface BpmActivityService { + + /** + * 获得指定流程实例的活动实例列表 + * + * @param processInstanceId 流程实例的编号 + * @return 活动实例列表 + */ + List getActivityListByProcessInstanceId(String processInstanceId); + + /** + * 获得执行编号对应的活动实例 + * + * @param executionId 执行编号 + * @return 活动实例 + */ + List getHistoricActivityListByExecutionId(String executionId); + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/task/BpmActivityServiceImpl.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/task/BpmActivityServiceImpl.java new file mode 100644 index 0000000..1955220 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/task/BpmActivityServiceImpl.java @@ -0,0 +1,40 @@ +package com.win.module.bpm.service.task; + +import com.win.module.bpm.controller.task.vo.activity.BpmActivityRespVO; +import com.win.module.bpm.convert.task.BpmActivityConvert; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.history.HistoricActivityInstance; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; + + +/** + * BPM 活动实例 Service 实现类 + * + * @author 闻荫源码 + */ +@Service +@Slf4j +@Validated +public class BpmActivityServiceImpl implements BpmActivityService { + + @Resource + private HistoryService historyService; + + @Override + public List getActivityListByProcessInstanceId(String processInstanceId) { + List activityList = historyService.createHistoricActivityInstanceQuery() + .processInstanceId(processInstanceId).list(); + return BpmActivityConvert.INSTANCE.convertList(activityList); + } + + @Override + public List getHistoricActivityListByExecutionId(String executionId) { + return historyService.createHistoricActivityInstanceQuery().executionId(executionId).list(); + } + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/task/BpmProcessInstanceService.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/task/BpmProcessInstanceService.java new file mode 100644 index 0000000..1c71001 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/task/BpmProcessInstanceService.java @@ -0,0 +1,147 @@ +package com.win.module.bpm.service.task; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.collection.CollectionUtils; +import com.win.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; +import com.win.module.bpm.controller.task.vo.instance.*; +import org.flowable.engine.delegate.event.FlowableCancelledEvent; +import org.flowable.engine.history.HistoricProcessInstance; +import org.flowable.engine.runtime.ProcessInstance; + +import javax.validation.Valid; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * 流程实例 Service 接口 + * + * @author 闻荫源码 + */ +public interface BpmProcessInstanceService { + + /** + * 获得流程实例 + * + * @param id 流程实例的编号 + * @return 流程实例 + */ + ProcessInstance getProcessInstance(String id); + + /** + * 获得流程实例列表 + * + * @param ids 流程实例的编号集合 + * @return 流程实例列表 + */ + List getProcessInstances(Set ids); + + /** + * 获得流程实例 Map + * + * @param ids 流程实例的编号集合 + * @return 流程实例列表 Map + */ + default Map getProcessInstanceMap(Set ids) { + return CollectionUtils.convertMap(getProcessInstances(ids), ProcessInstance::getProcessInstanceId); + } + + /** + * 获得流程实例的分页 + * + * @param userId 用户编号 + * @param pageReqVO 分页请求 + * @return 流程实例的分页 + */ + PageResult getMyProcessInstancePage(Long userId, + @Valid BpmProcessInstanceMyPageReqVO pageReqVO); + /** + * 创建流程实例(提供给前端) + * + * @param userId 用户编号 + * @param createReqVO 创建信息 + * @return 实例的编号 + */ + String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqVO createReqVO); + + /** + * 创建流程实例(提供给内部) + * + * @param userId 用户编号 + * @param createReqDTO 创建信息 + * @return 实例的编号 + */ + String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqDTO createReqDTO); + + /** + * 获得流程实例 VO 信息 + * + * @param id 流程实例的编号 + * @return 流程实例 + */ + BpmProcessInstanceRespVO getProcessInstanceVO(String id); + + /** + * 取消流程实例 + * + * @param userId 用户编号 + * @param cancelReqVO 取消信息 + */ + void cancelProcessInstance(Long userId, @Valid BpmProcessInstanceCancelReqVO cancelReqVO); + + /** + * 获得历史的流程实例 + * + * @param id 流程实例的编号 + * @return 历史的流程实例 + */ + HistoricProcessInstance getHistoricProcessInstance(String id); + + /** + * 获得历史的流程实例列表 + * + * @param ids 流程实例的编号集合 + * @return 历史的流程实例列表 + */ + List getHistoricProcessInstances(Set ids); + + /** + * 获得历史的流程实例 Map + * + * @param ids 流程实例的编号集合 + * @return 历史的流程实例列表 Map + */ + default Map getHistoricProcessInstanceMap(Set ids) { + return CollectionUtils.convertMap(getHistoricProcessInstances(ids), HistoricProcessInstance::getId); + } + + /** + * 创建 ProcessInstance 拓展记录 + * + * @param instance 流程任务 + */ + void createProcessInstanceExt(ProcessInstance instance); + + /** + * 更新 ProcessInstance 拓展记录为取消 + * + * @param event 流程取消事件 + */ + void updateProcessInstanceExtCancel(FlowableCancelledEvent event); + + /** + * 更新 ProcessInstance 拓展记录为完成 + * + * @param instance 流程任务 + */ + void updateProcessInstanceExtComplete(ProcessInstance instance); + + /** + * 更新 ProcessInstance 拓展记录为不通过 + * + * @param id 流程编号 + * @param reason 理由。例如说,审批不通过时,需要传递该值 + */ + void updateProcessInstanceExtReject(String id, String reason); + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/task/BpmProcessInstanceServiceImpl.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/task/BpmProcessInstanceServiceImpl.java new file mode 100644 index 0000000..abef2af --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/task/BpmProcessInstanceServiceImpl.java @@ -0,0 +1 @@ +package com.win.module.bpm.service.task; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; import com.win.framework.common.pojo.PageResult; import com.win.framework.common.util.number.NumberUtils; import com.win.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; import com.win.module.bpm.controller.task.vo.instance.*; import com.win.module.bpm.convert.task.BpmProcessInstanceConvert; import com.win.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; import com.win.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; import com.win.module.bpm.dal.mysql.task.BpmProcessInstanceExtMapper; import com.win.module.bpm.enums.task.BpmProcessInstanceDeleteReasonEnum; import com.win.module.bpm.enums.task.BpmProcessInstanceResultEnum; import com.win.module.bpm.enums.task.BpmProcessInstanceStatusEnum; import com.win.module.bpm.framework.bpm.core.event.BpmProcessInstanceResultEventPublisher; import com.win.module.bpm.service.definition.BpmProcessDefinitionService; import com.win.module.bpm.service.message.BpmMessageService; import com.win.module.system.api.dept.DeptApi; import com.win.module.system.api.dept.dto.DeptRespDTO; import com.win.module.system.api.user.AdminUserApi; import com.win.module.system.api.user.dto.AdminUserRespDTO; import lombok.extern.slf4j.Slf4j; import org.flowable.engine.HistoryService; import org.flowable.engine.RuntimeService; import org.flowable.engine.delegate.event.FlowableCancelledEvent; import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.repository.ProcessDefinition; import org.flowable.engine.runtime.ProcessInstance; import org.flowable.task.api.Task; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import javax.validation.Valid; import java.time.LocalDateTime; import java.util.*; import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.win.framework.common.util.collection.CollectionUtils.convertList; import static com.win.module.bpm.enums.ErrorCodeConstants.*; /** * 流程实例 Service 实现类 * * ProcessDefinition & ProcessInstance & Execution & Task 的关系: * 1. * * HistoricProcessInstance & ProcessInstance 的关系: * 1. * * 简单来说,前者 = 历史 + 运行中的流程实例,后者仅是运行中的流程实例 * * @author 闻荫源码 */ @Service @Validated @Slf4j public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService { @Resource private RuntimeService runtimeService; @Resource private BpmProcessInstanceExtMapper processInstanceExtMapper; @Resource @Lazy // 解决循环依赖 private BpmTaskService taskService; @Resource private BpmProcessDefinitionService processDefinitionService; @Resource private HistoryService historyService; @Resource private AdminUserApi adminUserApi; @Resource private DeptApi deptApi; @Resource private BpmProcessInstanceResultEventPublisher processInstanceResultEventPublisher; @Resource private BpmMessageService messageService; @Override public ProcessInstance getProcessInstance(String id) { return runtimeService.createProcessInstanceQuery().processInstanceId(id).singleResult(); } @Override public List getProcessInstances(Set ids) { return runtimeService.createProcessInstanceQuery().processInstanceIds(ids).list(); } @Override public PageResult getMyProcessInstancePage(Long userId, BpmProcessInstanceMyPageReqVO pageReqVO) { // 通过 BpmProcessInstanceExtDO 表,先查询到对应的分页 PageResult pageResult = processInstanceExtMapper.selectPage(userId, pageReqVO); if (CollUtil.isEmpty(pageResult.getList())) { return new PageResult<>(pageResult.getTotal()); } // 获得流程 Task Map List processInstanceIds = convertList(pageResult.getList(), BpmProcessInstanceExtDO::getProcessInstanceId); Map> taskMap = taskService.getTaskMapByProcessInstanceIds(processInstanceIds); // 转换返回 return BpmProcessInstanceConvert.INSTANCE.convertPage(pageResult, taskMap); } @Override @Transactional(rollbackFor = Exception.class) public String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqVO createReqVO) { // 获得流程定义 ProcessDefinition definition = processDefinitionService.getProcessDefinition(createReqVO.getProcessDefinitionId()); // 发起流程 return createProcessInstance0(userId, definition, createReqVO.getVariables(), null); } @Override public String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqDTO createReqDTO) { // 获得流程定义 ProcessDefinition definition = processDefinitionService.getActiveProcessDefinition(createReqDTO.getProcessDefinitionKey()); // 发起流程 return createProcessInstance0(userId, definition, createReqDTO.getVariables(), createReqDTO.getBusinessKey()); } @Override public BpmProcessInstanceRespVO getProcessInstanceVO(String id) { // 获得流程实例 HistoricProcessInstance processInstance = getHistoricProcessInstance(id); if (processInstance == null) { return null; } BpmProcessInstanceExtDO processInstanceExt = processInstanceExtMapper.selectByProcessInstanceId(id); Assert.notNull(processInstanceExt, "流程实例拓展({}) 不存在", id); // 获得流程定义 ProcessDefinition processDefinition = processDefinitionService .getProcessDefinition(processInstance.getProcessDefinitionId()); Assert.notNull(processDefinition, "流程定义({}) 不存在", processInstance.getProcessDefinitionId()); BpmProcessDefinitionExtDO processDefinitionExt = processDefinitionService.getProcessDefinitionExt( processInstance.getProcessDefinitionId()); Assert.notNull(processDefinitionExt, "流程定义拓展({}) 不存在", id); String bpmnXml = processDefinitionService.getProcessDefinitionBpmnXML(processInstance.getProcessDefinitionId()); // 获得 User AdminUserRespDTO startUser = adminUserApi.getUser(NumberUtils.parseLong(processInstance.getStartUserId())); DeptRespDTO dept = null; if (startUser != null) { dept = deptApi.getDept(startUser.getDeptId()); } // 拼接结果 return BpmProcessInstanceConvert.INSTANCE.convert2(processInstance, processInstanceExt, processDefinition, processDefinitionExt, bpmnXml, startUser, dept); } @Override public void cancelProcessInstance(Long userId, @Valid BpmProcessInstanceCancelReqVO cancelReqVO) { // 校验流程实例存在 ProcessInstance instance = getProcessInstance(cancelReqVO.getId()); if (instance == null) { throw exception(PROCESS_INSTANCE_CANCEL_FAIL_NOT_EXISTS); } // 只能取消自己的 if (!Objects.equals(instance.getStartUserId(), String.valueOf(userId))) { throw exception(PROCESS_INSTANCE_CANCEL_FAIL_NOT_SELF); } // 通过删除流程实例,实现流程实例的取消, // 删除流程实例,正则执行任务 ACT_RU_TASK. 任务会被删除。通过历史表查询 deleteProcessInstance(cancelReqVO.getId(), BpmProcessInstanceDeleteReasonEnum.CANCEL_TASK.format(cancelReqVO.getReason())); } /** * 获得历史的流程实例 * * @param id 流程实例的编号 * @return 历史的流程实例 */ @Override public HistoricProcessInstance getHistoricProcessInstance(String id) { return historyService.createHistoricProcessInstanceQuery().processInstanceId(id).singleResult(); } @Override public List getHistoricProcessInstances(Set ids) { return historyService.createHistoricProcessInstanceQuery().processInstanceIds(ids).list(); } @Override public void createProcessInstanceExt(ProcessInstance instance) { // 获得流程定义 ProcessDefinition definition = processDefinitionService.getProcessDefinition2(instance.getProcessDefinitionId()); // 插入 BpmProcessInstanceExtDO 对象 BpmProcessInstanceExtDO instanceExtDO = new BpmProcessInstanceExtDO() .setProcessInstanceId(instance.getId()) .setProcessDefinitionId(definition.getId()) .setName(instance.getProcessDefinitionName()) .setStartUserId(Long.valueOf(instance.getStartUserId())) .setCategory(definition.getCategory()) .setStatus(BpmProcessInstanceStatusEnum.RUNNING.getStatus()) .setResult(BpmProcessInstanceResultEnum.PROCESS.getResult()); processInstanceExtMapper.insert(instanceExtDO); } @Override public void updateProcessInstanceExtCancel(FlowableCancelledEvent event) { // 判断是否为 Reject 不通过。如果是,则不进行更新. // 因为,updateProcessInstanceExtReject 方法,已经进行更新了 if (BpmProcessInstanceDeleteReasonEnum.isRejectReason((String)event.getCause())) { return; } // 需要主动查询,因为 instance 只有 id 属性 // 另外,此时如果去查询 ProcessInstance 的话,字段是不全的,所以去查询了 HistoricProcessInstance HistoricProcessInstance processInstance = getHistoricProcessInstance(event.getProcessInstanceId()); // 更新拓展表 BpmProcessInstanceExtDO instanceExtDO = new BpmProcessInstanceExtDO() .setProcessInstanceId(event.getProcessInstanceId()) .setEndTime(LocalDateTime.now()) // 由于 ProcessInstance 里没有办法拿到 endTime,所以这里设置 .setStatus(BpmProcessInstanceStatusEnum.FINISH.getStatus()) .setResult(BpmProcessInstanceResultEnum.CANCEL.getResult()); processInstanceExtMapper.updateByProcessInstanceId(instanceExtDO); // 发送流程实例的状态事件 processInstanceResultEventPublisher.sendProcessInstanceResultEvent( BpmProcessInstanceConvert.INSTANCE.convert(this, processInstance, instanceExtDO.getResult())); } @Override public void updateProcessInstanceExtComplete(ProcessInstance instance) { // 需要主动查询,因为 instance 只有 id 属性 // 另外,此时如果去查询 ProcessInstance 的话,字段是不全的,所以去查询了 HistoricProcessInstance HistoricProcessInstance processInstance = getHistoricProcessInstance(instance.getId()); // 更新拓展表 BpmProcessInstanceExtDO instanceExtDO = new BpmProcessInstanceExtDO() .setProcessInstanceId(instance.getProcessInstanceId()) .setEndTime(LocalDateTime.now()) // 由于 ProcessInstance 里没有办法拿到 endTime,所以这里设置 .setStatus(BpmProcessInstanceStatusEnum.FINISH.getStatus()) .setResult(BpmProcessInstanceResultEnum.APPROVE.getResult()); // 如果正常完全,说明审批通过 processInstanceExtMapper.updateByProcessInstanceId(instanceExtDO); // 发送流程被通过的消息 messageService.sendMessageWhenProcessInstanceApprove(BpmProcessInstanceConvert.INSTANCE.convert2ApprovedReq(instance)); // 发送流程实例的状态事件 processInstanceResultEventPublisher.sendProcessInstanceResultEvent( BpmProcessInstanceConvert.INSTANCE.convert(this, processInstance, instanceExtDO.getResult())); } @Override @Transactional(rollbackFor = Exception.class) public void updateProcessInstanceExtReject(String id, String reason) { // 需要主动查询,因为 instance 只有 id 属性 ProcessInstance processInstance = getProcessInstance(id); // 删除流程实例,以实现驳回任务时,取消整个审批流程 deleteProcessInstance(id, StrUtil.format(BpmProcessInstanceDeleteReasonEnum.REJECT_TASK.format(reason))); // 更新 status + result // 注意,不能和上面的逻辑更换位置。因为 deleteProcessInstance 会触发流程的取消,进而调用 updateProcessInstanceExtCancel 方法, // 设置 result 为 BpmProcessInstanceStatusEnum.CANCEL,显然和 result 不一定是一致的 BpmProcessInstanceExtDO instanceExtDO = new BpmProcessInstanceExtDO().setProcessInstanceId(id) .setStatus(BpmProcessInstanceStatusEnum.FINISH.getStatus()) .setResult(BpmProcessInstanceResultEnum.REJECT.getResult()); processInstanceExtMapper.updateByProcessInstanceId(instanceExtDO); // 发送流程被不通过的消息 messageService.sendMessageWhenProcessInstanceReject(BpmProcessInstanceConvert.INSTANCE.convert2RejectReq(processInstance, reason)); // 发送流程实例的状态事件 processInstanceResultEventPublisher.sendProcessInstanceResultEvent( BpmProcessInstanceConvert.INSTANCE.convert(this, processInstance, instanceExtDO.getResult())); } private void deleteProcessInstance(String id, String reason) { runtimeService.deleteProcessInstance(id, reason); } private String createProcessInstance0(Long userId, ProcessDefinition definition, Map variables, String businessKey) { // 校验流程定义 if (definition == null) { throw exception(PROCESS_DEFINITION_NOT_EXISTS); } if (definition.isSuspended()) { throw exception(PROCESS_DEFINITION_IS_SUSPENDED); } // 创建流程实例 ProcessInstance instance = runtimeService.createProcessInstanceBuilder() .processDefinitionId(definition.getId()) .businessKey(businessKey) .name(definition.getName().trim()) .variables(variables) .start(); // 设置流程名字 runtimeService.setProcessInstanceName(instance.getId(), definition.getName()); // 补全流程实例的拓展表 processInstanceExtMapper.updateByProcessInstanceId(new BpmProcessInstanceExtDO().setProcessInstanceId(instance.getId()) .setFormVariables(variables)); return instance.getId(); } } \ No newline at end of file diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/task/BpmTaskService.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/task/BpmTaskService.java new file mode 100644 index 0000000..00872ef --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/task/BpmTaskService.java @@ -0,0 +1,130 @@ +package com.win.module.bpm.service.task; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.collection.CollectionUtils; +import com.win.module.bpm.controller.task.vo.task.*; +import org.flowable.task.api.Task; + +import javax.validation.Valid; +import java.util.List; +import java.util.Map; + +/** + * 流程任务实例 Service 接口 + * + * @author jason + * @author 闻荫源码 + */ +public interface BpmTaskService { + + /** + * 获得待办的流程任务分页 + * + * @param userId 用户编号 + * @param pageReqVO 分页请求 + * + * @return 流程任务分页 + */ + PageResult getTodoTaskPage(Long userId, BpmTaskTodoPageReqVO pageReqVO); + + /** + * 获得已办的流程任务分页 + * + * @param userId 用户编号 + * @param pageReqVO 分页请求 + * + * @return 流程任务分页 + */ + PageResult getDoneTaskPage(Long userId, BpmTaskDonePageReqVO pageReqVO); + + /** + * 获得流程任务 Map + * + * @param processInstanceIds 流程实例的编号数组 + * + * @return 流程任务 Map + */ + default Map> getTaskMapByProcessInstanceIds(List processInstanceIds) { + return CollectionUtils.convertMultiMap(getTasksByProcessInstanceIds(processInstanceIds), + Task::getProcessInstanceId); + } + + /** + * 获得流程任务列表 + * + * @param processInstanceIds 流程实例的编号数组 + * + * @return 流程任务列表 + */ + List getTasksByProcessInstanceIds(List processInstanceIds); + + /** + * 获得指令流程实例的流程任务列表,包括所有状态的 + * + * @param processInstanceId 流程实例的编号 + * + * @return 流程任务列表 + */ + List getTaskListByProcessInstanceId(String processInstanceId); + + /** + * 通过任务 + * + * @param userId 用户编号 + * @param reqVO 通过请求 + */ + void approveTask(Long userId, @Valid BpmTaskApproveReqVO reqVO); + + /** + * 不通过任务 + * + * @param userId 用户编号 + * @param reqVO 不通过请求 + */ + void rejectTask(Long userId, @Valid BpmTaskRejectReqVO reqVO); + + /** + * 将流程任务分配给指定用户 + * + * @param userId 用户编号 + * @param reqVO 分配请求 + */ + void updateTaskAssignee(Long userId, BpmTaskUpdateAssigneeReqVO reqVO); + + /** + * 将流程任务分配给指定用户 + * + * @param id 流程任务编号 + * @param userId 用户编号 + */ + void updateTaskAssignee(String id, Long userId); + + /** + * 创建 Task 拓展记录 + * + * @param task 任务实体 + */ + void createTaskExt(Task task); + + /** + * 更新 Task 拓展记录为完成 + * + * @param task 任务实体 + */ + void updateTaskExtComplete(Task task); + + /** + * 更新 Task 拓展记录为已取消 + * + * @param taskId 任务的编号 + */ + void updateTaskExtCancel(String taskId); + + /** + * 更新 Task 拓展记录,并发送通知 + * + * @param task 任务实体 + */ + void updateTaskExtAssign(Task task); + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/task/BpmTaskServiceImpl.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/task/BpmTaskServiceImpl.java new file mode 100644 index 0000000..c20e31e --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/task/BpmTaskServiceImpl.java @@ -0,0 +1,318 @@ +package com.win.module.bpm.service.task; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.date.DateUtils; +import com.win.framework.common.util.number.NumberUtils; +import com.win.framework.common.util.object.PageUtils; +import com.win.module.bpm.controller.task.vo.task.*; +import com.win.module.bpm.convert.task.BpmTaskConvert; +import com.win.module.bpm.dal.dataobject.task.BpmTaskExtDO; +import com.win.module.bpm.dal.mysql.task.BpmTaskExtMapper; +import com.win.module.bpm.enums.task.BpmProcessInstanceDeleteReasonEnum; +import com.win.module.bpm.enums.task.BpmProcessInstanceResultEnum; +import com.win.module.bpm.service.message.BpmMessageService; +import com.win.module.system.api.dept.DeptApi; +import com.win.module.system.api.dept.dto.DeptRespDTO; +import com.win.module.system.api.user.AdminUserApi; +import com.win.module.system.api.user.dto.AdminUserRespDTO; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.TaskService; +import org.flowable.engine.history.HistoricProcessInstance; +import org.flowable.engine.runtime.ProcessInstance; +import org.flowable.task.api.Task; +import org.flowable.task.api.TaskQuery; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.api.history.HistoricTaskInstanceQuery; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.support.TransactionSynchronization; +import org.springframework.transaction.support.TransactionSynchronizationManager; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.time.LocalDateTime; +import java.util.*; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.framework.common.util.collection.CollectionUtils.convertMap; +import static com.win.framework.common.util.collection.CollectionUtils.convertSet; +import static com.win.module.bpm.enums.ErrorCodeConstants.*; + +/** + * 流程任务实例 Service 实现类 + * + * @author 闻荫源码 + * @author jason + */ +@Slf4j +@Service +public class BpmTaskServiceImpl implements BpmTaskService { + + @Resource + private TaskService taskService; + @Resource + private HistoryService historyService; + + @Resource + private BpmProcessInstanceService processInstanceService; + @Resource + private AdminUserApi adminUserApi; + @Resource + private DeptApi deptApi; + @Resource + private BpmTaskExtMapper taskExtMapper; + @Resource + private BpmMessageService messageService; + + @Override + public PageResult getTodoTaskPage(Long userId, BpmTaskTodoPageReqVO pageVO) { + // 查询待办任务 + TaskQuery taskQuery = taskService.createTaskQuery().taskAssignee(String.valueOf(userId)) // 分配给自己 + .orderByTaskCreateTime().desc(); // 创建时间倒序 + if (StrUtil.isNotBlank(pageVO.getName())) { + taskQuery.taskNameLike("%" + pageVO.getName() + "%"); + } + if (ArrayUtil.get(pageVO.getCreateTime(), 0) != null) { + taskQuery.taskCreatedAfter(DateUtils.of(pageVO.getCreateTime()[0])); + } + if (ArrayUtil.get(pageVO.getCreateTime(), 1) != null) { + taskQuery.taskCreatedBefore(DateUtils.of(pageVO.getCreateTime()[1])); + } + // 执行查询 + List tasks = taskQuery.listPage(PageUtils.getStart(pageVO), pageVO.getPageSize()); + if (CollUtil.isEmpty(tasks)) { + return PageResult.empty(taskQuery.count()); + } + + // 获得 ProcessInstance Map + Map processInstanceMap = + processInstanceService.getProcessInstanceMap(convertSet(tasks, Task::getProcessInstanceId)); + // 获得 User Map + Map userMap = adminUserApi.getUserMap( + convertSet(processInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId()))); + // 拼接结果 + return new PageResult<>(BpmTaskConvert.INSTANCE.convertList1(tasks, processInstanceMap, userMap), + taskQuery.count()); + } + + @Override + public PageResult getDoneTaskPage(Long userId, BpmTaskDonePageReqVO pageVO) { + // 查询已办任务 + HistoricTaskInstanceQuery taskQuery = historyService.createHistoricTaskInstanceQuery().finished() // 已完成 + .taskAssignee(String.valueOf(userId)) // 分配给自己 + .orderByHistoricTaskInstanceEndTime().desc(); // 审批时间倒序 + if (StrUtil.isNotBlank(pageVO.getName())) { + taskQuery.taskNameLike("%" + pageVO.getName() + "%"); + } + if (pageVO.getBeginCreateTime() != null) { + taskQuery.taskCreatedAfter(DateUtils.of(pageVO.getBeginCreateTime())); + } + if (pageVO.getEndCreateTime() != null) { + taskQuery.taskCreatedBefore(DateUtils.of(pageVO.getEndCreateTime())); + } + // 执行查询 + List tasks = taskQuery.listPage(PageUtils.getStart(pageVO), pageVO.getPageSize()); + if (CollUtil.isEmpty(tasks)) { + return PageResult.empty(taskQuery.count()); + } + + // 获得 TaskExtDO Map + List bpmTaskExtDOs = + taskExtMapper.selectListByTaskIds(convertSet(tasks, HistoricTaskInstance::getId)); + Map bpmTaskExtDOMap = convertMap(bpmTaskExtDOs, BpmTaskExtDO::getTaskId); + // 获得 ProcessInstance Map + Map historicProcessInstanceMap = + processInstanceService.getHistoricProcessInstanceMap( + convertSet(tasks, HistoricTaskInstance::getProcessInstanceId)); + // 获得 User Map + Map userMap = adminUserApi.getUserMap( + convertSet(historicProcessInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId()))); + // 拼接结果 + return new PageResult<>( + BpmTaskConvert.INSTANCE.convertList2(tasks, bpmTaskExtDOMap, historicProcessInstanceMap, userMap), + taskQuery.count()); + } + + @Override + public List getTasksByProcessInstanceIds(List processInstanceIds) { + if (CollUtil.isEmpty(processInstanceIds)) { + return Collections.emptyList(); + } + return taskService.createTaskQuery().processInstanceIdIn(processInstanceIds).list(); + } + + @Override + public List getTaskListByProcessInstanceId(String processInstanceId) { + // 获得任务列表 + List tasks = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(processInstanceId) + .orderByHistoricTaskInstanceStartTime().desc() // 创建时间倒序 + .list(); + if (CollUtil.isEmpty(tasks)) { + return Collections.emptyList(); + } + + // 获得 TaskExtDO Map + List bpmTaskExtDOs = taskExtMapper.selectListByTaskIds(convertSet(tasks, HistoricTaskInstance::getId)); + Map bpmTaskExtDOMap = convertMap(bpmTaskExtDOs, BpmTaskExtDO::getTaskId); + // 获得 ProcessInstance Map + HistoricProcessInstance processInstance = processInstanceService.getHistoricProcessInstance(processInstanceId); + // 获得 User Map + Set userIds = convertSet(tasks, task -> NumberUtils.parseLong(task.getAssignee())); + userIds.add(NumberUtils.parseLong(processInstance.getStartUserId())); + Map userMap = adminUserApi.getUserMap(userIds); + // 获得 Dept Map + Map deptMap = deptApi.getDeptMap(convertSet(userMap.values(), AdminUserRespDTO::getDeptId)); + + // 拼接数据 + return BpmTaskConvert.INSTANCE.convertList3(tasks, bpmTaskExtDOMap, processInstance, userMap, deptMap); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void approveTask(Long userId, @Valid BpmTaskApproveReqVO reqVO) { + // 校验任务存在 + Task task = checkTask(userId, reqVO.getId()); + // 校验流程实例存在 + ProcessInstance instance = processInstanceService.getProcessInstance(task.getProcessInstanceId()); + if (instance == null) { + throw exception(PROCESS_INSTANCE_NOT_EXISTS); + } + + // 完成任务,审批通过 + taskService.complete(task.getId(), instance.getProcessVariables()); + + // 更新任务拓展表为通过 + taskExtMapper.updateByTaskId( + new BpmTaskExtDO().setTaskId(task.getId()).setResult(BpmProcessInstanceResultEnum.APPROVE.getResult()) + .setReason(reqVO.getReason())); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void rejectTask(Long userId, @Valid BpmTaskRejectReqVO reqVO) { + Task task = checkTask(userId, reqVO.getId()); + // 校验流程实例存在 + ProcessInstance instance = processInstanceService.getProcessInstance(task.getProcessInstanceId()); + if (instance == null) { + throw exception(PROCESS_INSTANCE_NOT_EXISTS); + } + + // 更新流程实例为不通过 + processInstanceService.updateProcessInstanceExtReject(instance.getProcessInstanceId(), reqVO.getReason()); + + // 更新任务拓展表为不通过 + taskExtMapper.updateByTaskId( + new BpmTaskExtDO().setTaskId(task.getId()).setResult(BpmProcessInstanceResultEnum.REJECT.getResult()) + .setEndTime(LocalDateTime.now()).setReason(reqVO.getReason())); + } + + @Override + public void updateTaskAssignee(Long userId, BpmTaskUpdateAssigneeReqVO reqVO) { + // 校验任务存在 + Task task = checkTask(userId, reqVO.getId()); + // 更新负责人 + updateTaskAssignee(task.getId(), reqVO.getAssigneeUserId()); + } + + @Override + public void updateTaskAssignee(String id, Long userId) { + taskService.setAssignee(id, String.valueOf(userId)); + } + + /** + * 校验任务是否存在, 并且是否是分配给自己的任务 + * + * @param userId 用户 id + * @param taskId task id + */ + private Task checkTask(Long userId, String taskId) { + Task task = getTask(taskId); + if (task == null) { + throw exception(TASK_COMPLETE_FAIL_NOT_EXISTS); + } + if (!Objects.equals(userId, NumberUtils.parseLong(task.getAssignee()))) { + throw exception(TASK_COMPLETE_FAIL_ASSIGN_NOT_SELF); + } + return task; + } + + @Override + public void createTaskExt(Task task) { + BpmTaskExtDO taskExtDO = + BpmTaskConvert.INSTANCE.convert2TaskExt(task).setResult(BpmProcessInstanceResultEnum.PROCESS.getResult()); + taskExtMapper.insert(taskExtDO); + } + + @Override + public void updateTaskExtComplete(Task task) { + BpmTaskExtDO taskExtDO = BpmTaskConvert.INSTANCE.convert2TaskExt(task) + .setResult(BpmProcessInstanceResultEnum.APPROVE.getResult()) // 不设置也问题不大,因为 Complete 一般是审核通过,已经设置 + .setEndTime(LocalDateTime.now()); + taskExtMapper.updateByTaskId(taskExtDO); + } + + @Override + public void updateTaskExtCancel(String taskId) { + // 需要在事务提交后,才进行查询。不然查询不到历史的原因 + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { + + @Override + public void afterCommit() { + // 可能只是活动,不是任务,所以查询不到 + HistoricTaskInstance task = getHistoricTask(taskId); + if (task == null) { + return; + } + + // 如果任务拓展表已经是完成的状态,则跳过 + BpmTaskExtDO taskExt = taskExtMapper.selectByTaskId(taskId); + if (taskExt == null) { + log.error("[updateTaskExtCancel][taskId({}) 查找不到对应的记录,可能存在问题]", taskId); + return; + } + // 如果已经是最终的结果,则跳过 + if (BpmProcessInstanceResultEnum.isEndResult(taskExt.getResult())) { + log.error("[updateTaskExtCancel][taskId({}) 处于结果({}),无需进行更新]", taskId, taskExt.getResult()); + return; + } + + // 更新任务 + taskExtMapper.updateById(new BpmTaskExtDO().setId(taskExt.getId()).setResult(BpmProcessInstanceResultEnum.CANCEL.getResult()) + .setEndTime(LocalDateTime.now()).setReason(BpmProcessInstanceDeleteReasonEnum.translateReason(task.getDeleteReason()))); + } + + }); + } + + @Override + public void updateTaskExtAssign(Task task) { + BpmTaskExtDO taskExtDO = + new BpmTaskExtDO().setAssigneeUserId(NumberUtils.parseLong(task.getAssignee())).setTaskId(task.getId()); + taskExtMapper.updateByTaskId(taskExtDO); + // 发送通知。在事务提交时,批量执行操作,所以直接查询会无法查询到 ProcessInstance,所以这里是通过监听事务的提交来实现。 + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { + @Override + public void afterCommit() { + ProcessInstance processInstance = + processInstanceService.getProcessInstance(task.getProcessInstanceId()); + AdminUserRespDTO startUser = adminUserApi.getUser(Long.valueOf(processInstance.getStartUserId())); + messageService.sendMessageWhenTaskAssigned( + BpmTaskConvert.INSTANCE.convert(processInstance, startUser, task)); + } + }); + } + + private Task getTask(String id) { + return taskService.createTaskQuery().taskId(id).singleResult(); + } + + private HistoricTaskInstance getHistoricTask(String id) { + return historyService.createHistoricTaskInstanceQuery().taskId(id).singleResult(); + } + +} diff --git a/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/task/package-info.java b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/task/package-info.java new file mode 100644 index 0000000..3e8bc3d --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/task/package-info.java @@ -0,0 +1 @@ +package com.win.module.bpm.service.task; diff --git a/win-module-bpm/win-module-bpm-biz/src/main/resources/i18n/bpm.properties b/win-module-bpm/win-module-bpm-biz/src/main/resources/i18n/bpm.properties new file mode 100644 index 0000000..6882c29 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/main/resources/i18n/bpm.properties @@ -0,0 +1 @@ +#\u6B64\u6587\u4EF6\u4E0D\u9700\u8981\u586B\u5199 \ No newline at end of file diff --git a/win-module-bpm/win-module-bpm-biz/src/main/resources/i18n/bpm_en_US.properties b/win-module-bpm/win-module-bpm-biz/src/main/resources/i18n/bpm_en_US.properties new file mode 100644 index 0000000..e69de29 diff --git a/win-module-bpm/win-module-bpm-biz/src/main/resources/i18n/bpm_zh_CN.properties b/win-module-bpm/win-module-bpm-biz/src/main/resources/i18n/bpm_zh_CN.properties new file mode 100644 index 0000000..e69de29 diff --git a/win-module-bpm/win-module-bpm-biz/src/test/resources/application-unit-test.yaml b/win-module-bpm/win-module-bpm-biz/src/test/resources/application-unit-test.yaml new file mode 100644 index 0000000..eefc6e6 --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/test/resources/application-unit-test.yaml @@ -0,0 +1,44 @@ +spring: + main: + lazy-initialization: true # 开启懒加载,加快速度 + banner-mode: off # 单元测试,禁用 Banner + +--- #################### 数据库相关配置 #################### + +spring: + # 数据源配置项 + datasource: + name: ruoyi-vue-pro + url: jdbc:h2:mem:testdb;MODE=MYSQL;DATABASE_TO_UPPER=false;NON_KEYWORDS=value; # MODE 使用 MySQL 模式;DATABASE_TO_UPPER 配置表和字段使用小写 + driver-class-name: org.h2.Driver + username: sa + password: + druid: + async-init: true # 单元测试,异步初始化 Druid 连接池,提升启动速度 + initial-size: 1 # 单元测试,配置为 1,提升启动速度 + sql: + init: + schema-locations: classpath:/sql/create_tables.sql + +mybatis-plus: + lazy-initialization: true # 单元测试,设置 MyBatis Mapper 延迟加载,加速每个单元测试 + type-aliases-package: ${win.info.base-package}.module.*.dal.dataobject + +--- #################### 定时任务相关配置 #################### + +--- #################### 配置中心相关配置 #################### + +--- #################### 服务保障相关配置 #################### + +# Lock4j 配置项(单元测试,禁用 Lock4j) + +# Resilience4j 配置项 + +--- #################### 监控相关配置 #################### + +--- #################### 闻荫相关配置 #################### + +# 闻荫配置项,设置当前项目所有自定义的配置 +win: + info: + base-package: com.win.module diff --git a/win-module-bpm/win-module-bpm-biz/src/test/resources/logback.xml b/win-module-bpm/win-module-bpm-biz/src/test/resources/logback.xml new file mode 100644 index 0000000..daf756b --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/test/resources/logback.xml @@ -0,0 +1,4 @@ + + + + diff --git a/win-module-bpm/win-module-bpm-biz/src/test/resources/sql/clean.sql b/win-module-bpm/win-module-bpm-biz/src/test/resources/sql/clean.sql new file mode 100644 index 0000000..6e42d3c --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/test/resources/sql/clean.sql @@ -0,0 +1,2 @@ +DELETE FROM "bpm_form"; +DELETE FROM "bpm_user_group"; diff --git a/win-module-bpm/win-module-bpm-biz/src/test/resources/sql/create_tables.sql b/win-module-bpm/win-module-bpm-biz/src/test/resources/sql/create_tables.sql new file mode 100644 index 0000000..20a939b --- /dev/null +++ b/win-module-bpm/win-module-bpm-biz/src/test/resources/sql/create_tables.sql @@ -0,0 +1,28 @@ +CREATE TABLE IF NOT EXISTS "bpm_user_group" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(63) NOT NULL, + "description" varchar(255) NOT NULL, + "status" tinyint NOT NULL, + "member_user_ids" varchar(255) NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '用户组'; + +CREATE TABLE IF NOT EXISTS "bpm_form" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(63) NOT NULL, + "status" tinyint NOT NULL, + "fields" varchar(255) NOT NULL, + "conf" varchar(255) NOT NULL, + "remark" varchar(255), + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '动态表单'; diff --git a/win-module-infra/pom.xml b/win-module-infra/pom.xml new file mode 100644 index 0000000..0b145e0 --- /dev/null +++ b/win-module-infra/pom.xml @@ -0,0 +1,25 @@ + + + + com.win + win + ${revision} + + 4.0.0 + + win-module-infra-api + win-module-infra-biz + + win-module-infra + pom + + ${project.artifactId} + + infra 模块,主要提供两块能力: + 1. 我们放基础设施的运维与管理,支撑上层的通用与核心业务。 例如说:定时任务的管理、服务器的信息等等 + 2. 研发工具,提升研发效率与质量。 例如说:代码生成器、接口文档等等 + + + diff --git a/win-module-infra/win-module-infra-api/pom.xml b/win-module-infra/win-module-infra-api/pom.xml new file mode 100644 index 0000000..b0c7ba9 --- /dev/null +++ b/win-module-infra/win-module-infra-api/pom.xml @@ -0,0 +1,33 @@ + + + + com.win + win-module-infra + ${revision} + + 4.0.0 + win-module-infra-api + jar + + ${project.artifactId} + + infra 模块 API,暴露给其它模块调用 + + + + + com.win + win-common + + + + + org.springframework.boot + spring-boot-starter-validation + true + + + + diff --git a/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/file/FileApi.java b/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/file/FileApi.java new file mode 100644 index 0000000..d6c78ef --- /dev/null +++ b/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/file/FileApi.java @@ -0,0 +1,47 @@ +package com.win.module.infra.api.file; + +/** + * 文件 API 接口 + * + * @author 闻荫源码 + */ +public interface FileApi { + + /** + * 保存文件,并返回文件的访问路径 + * + * @param content 文件内容 + * @param tableName 表名 + * @param tableId 表数据id + * @return 文件路径 + */ + default String createFile(byte[] content, String tableName, Long tableId) { + return createFile(null, null, content, tableName, tableId); + } + + /** + * 保存文件,并返回文件的访问路径 + * + * @param path 文件路径 + * @param content 文件内容 + * @param tableName 表名 + * @param tableId 表数据id + * @return 文件路径 + */ + default String createFile(String path, byte[] content, String tableName, Long tableId) { + return createFile(null, path, content, tableName, tableId); + } + + /** + * 保存文件,并返回文件的访问路径 + * + * @param name 文件名称 + * @param path 文件路径 + * @param content 文件内容 + * @param tableName 表名 + * @param tableId 表数据id + * @return 文件路径 + */ + String createFile(String name, String path, byte[] content, String tableName, Long tableId); + +} diff --git a/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/logger/ApiAccessLogApi.java b/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/logger/ApiAccessLogApi.java new file mode 100644 index 0000000..24c9488 --- /dev/null +++ b/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/logger/ApiAccessLogApi.java @@ -0,0 +1,21 @@ +package com.win.module.infra.api.logger; + +import com.win.module.infra.api.logger.dto.ApiAccessLogCreateReqDTO; + +import javax.validation.Valid; + +/** + * API 访问日志的 API 接口 + * + * @author 闻荫源码 + */ +public interface ApiAccessLogApi { + + /** + * 创建 API 访问日志 + * + * @param createDTO 创建信息 + */ + void createApiAccessLog(@Valid ApiAccessLogCreateReqDTO createDTO); + +} diff --git a/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/logger/ApiErrorLogApi.java b/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/logger/ApiErrorLogApi.java new file mode 100644 index 0000000..883707d --- /dev/null +++ b/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/logger/ApiErrorLogApi.java @@ -0,0 +1,21 @@ +package com.win.module.infra.api.logger; + +import com.win.module.infra.api.logger.dto.ApiErrorLogCreateReqDTO; + +import javax.validation.Valid; + +/** + * API 错误日志的 API 接口 + * + * @author 闻荫源码 + */ +public interface ApiErrorLogApi { + + /** + * 创建 API 错误日志 + * + * @param createDTO 创建信息 + */ + void createApiErrorLog(@Valid ApiErrorLogCreateReqDTO createDTO); + +} diff --git a/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/logger/dto/ApiAccessLogCreateReqDTO.java b/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/logger/dto/ApiAccessLogCreateReqDTO.java new file mode 100644 index 0000000..c3937ae --- /dev/null +++ b/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/logger/dto/ApiAccessLogCreateReqDTO.java @@ -0,0 +1,81 @@ +package com.win.module.infra.api.logger.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +/** + * API 访问日志 + * + * @author 闻荫源码 + */ +@Data +public class ApiAccessLogCreateReqDTO { + + /** + * 链路追踪编号 + */ + private String traceId; + /** + * 用户编号 + */ + private Long userId; + /** + * 应用名 + */ + @NotNull(message = "应用名不能为空") + private String applicationName; + + /** + * 请求方法名 + */ + @NotNull(message = "http 请求方法不能为空") + private String requestMethod; + /** + * 访问地址 + */ + @NotNull(message = "访问地址不能为空") + private String requestUrl; + /** + * 请求参数 + */ + @NotNull(message = "请求参数不能为空") + private String requestParams; + /** + * 用户 IP + */ + @NotNull(message = "ip 不能为空") + private String userIp; + /** + * 浏览器 UA + */ + @NotNull(message = "User-Agent 不能为空") + private String userAgent; + + /** + * 开始请求时间 + */ + @NotNull(message = "开始请求时间不能为空") + private LocalDateTime beginTime; + /** + * 结束请求时间 + */ + @NotNull(message = "结束请求时间不能为空") + private LocalDateTime endTime; + /** + * 执行时长,单位:毫秒 + */ + @NotNull(message = "执行时长不能为空") + private Integer duration; + /** + * 结果码 + */ + @NotNull(message = "错误码不能为空") + private Integer resultCode; + /** + * 结果提示 + */ + private String resultMsg; + +} diff --git a/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/logger/dto/ApiErrorLogCreateReqDTO.java b/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/logger/dto/ApiErrorLogCreateReqDTO.java new file mode 100644 index 0000000..55c74b3 --- /dev/null +++ b/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/logger/dto/ApiErrorLogCreateReqDTO.java @@ -0,0 +1,103 @@ +package com.win.module.infra.api.logger.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +/** + * API 错误日志 + * + * @author 闻荫源码 + */ +@Data +public class ApiErrorLogCreateReqDTO { + + /** + * 链路编号 + */ + private String traceId; + /** + * 账号编号 + */ + private Long userId; + /** + * 应用名 + */ + @NotNull(message = "应用名不能为空") + private String applicationName; + + /** + * 请求方法名 + */ + @NotNull(message = "http 请求方法不能为空") + private String requestMethod; + /** + * 访问地址 + */ + @NotNull(message = "访问地址不能为空") + private String requestUrl; + /** + * 请求参数 + */ + @NotNull(message = "请求参数不能为空") + private String requestParams; + /** + * 用户 IP + */ + @NotNull(message = "ip 不能为空") + private String userIp; + /** + * 浏览器 UA + */ + @NotNull(message = "User-Agent 不能为空") + private String userAgent; + + /** + * 异常时间 + */ + @NotNull(message = "异常时间不能为空") + private LocalDateTime exceptionTime; + /** + * 异常名 + */ + @NotNull(message = "异常名不能为空") + private String exceptionName; + /** + * 异常发生的类全名 + */ + @NotNull(message = "异常发生的类全名不能为空") + private String exceptionClassName; + /** + * 异常发生的类文件 + */ + @NotNull(message = "异常发生的类文件不能为空") + private String exceptionFileName; + /** + * 异常发生的方法名 + */ + @NotNull(message = "异常发生的方法名不能为空") + private String exceptionMethodName; + /** + * 异常发生的方法所在行 + */ + @NotNull(message = "异常发生的方法所在行不能为空") + private Integer exceptionLineNumber; + /** + * 异常的栈轨迹异常的栈轨迹 + */ + @NotNull(message = "异常的栈轨迹不能为空") + private String exceptionStackTrace; + /** + * 异常导致的根消息 + */ + @NotNull(message = "异常导致的根消息不能为空") + private String exceptionRootCauseMessage; + /** + * 异常导致的消息 + */ + @NotNull(message = "异常导致的消息不能为空") + private String exceptionMessage; + + +} diff --git a/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/trends/TrendsApi.java b/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/trends/TrendsApi.java new file mode 100644 index 0000000..b5860ed --- /dev/null +++ b/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/trends/TrendsApi.java @@ -0,0 +1,15 @@ +package com.win.module.infra.api.trends; + +import com.win.module.infra.api.trends.dto.TrendsCreateReqDTO; + +import javax.validation.Valid; + +public interface TrendsApi { + + /** + * 创建动态记录 + * @param createDTO + */ + void createTrends(@Valid TrendsCreateReqDTO createDTO); + +} diff --git a/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/trends/dto/TrendsCreateReqDTO.java b/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/trends/dto/TrendsCreateReqDTO.java new file mode 100644 index 0000000..f8e4166 --- /dev/null +++ b/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/trends/dto/TrendsCreateReqDTO.java @@ -0,0 +1,24 @@ +package com.win.module.infra.api.trends.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; + +@Data +public class TrendsCreateReqDTO { + + @NotNull(message = "表名不能为空") + private String tableName; + + @NotNull(message = "表数据id不能为空") + private Long tableId; + + @NotNull(message = "类型不能为空") + private Integer type; + + @NotNull(message = "内容不能为空") + private String content; + + private String creator; + +} diff --git a/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/enums/DictTypeConstants.java b/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/enums/DictTypeConstants.java new file mode 100644 index 0000000..625380b --- /dev/null +++ b/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/enums/DictTypeConstants.java @@ -0,0 +1,20 @@ +package com.win.module.infra.enums; + +/** + * Infra 字典类型的枚举类 + * + * @author 闻荫源码 + */ +public interface DictTypeConstants { + + String REDIS_TIMEOUT_TYPE = "infra_redis_timeout_type"; // Redis 超时类型 + + String JOB_STATUS = "infra_job_status"; // 定时任务状态的枚举 + String JOB_LOG_STATUS = "infra_job_log_status"; // 定时任务日志状态的枚举 + + String API_ERROR_LOG_PROCESS_STATUS = "infra_api_error_log_process_status"; // API 错误日志的处理状态的枚举 + + String CONFIG_TYPE = "infra_config_type"; // 参数配置类型 + String BOOLEAN_STRING = "infra_boolean_string"; // Boolean 是否类型 + +} diff --git a/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/enums/ErrorCodeConstants.java b/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/enums/ErrorCodeConstants.java new file mode 100644 index 0000000..32110f4 --- /dev/null +++ b/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/enums/ErrorCodeConstants.java @@ -0,0 +1,57 @@ +package com.win.module.infra.enums; + +import com.win.framework.common.exception.ErrorCode; + +/** + * Infra 错误码枚举类 + * + * infra 系统,使用 1-001-000-000 段 + */ +public interface ErrorCodeConstants { + + // ========== 参数配置 1-001-000-000 ========== + ErrorCode CONFIG_NOT_EXISTS = new ErrorCode(1_001_000_001, "参数配置不存在"); + ErrorCode CONFIG_KEY_DUPLICATE = new ErrorCode(1_001_000_002, "参数配置 key 重复"); + ErrorCode CONFIG_CAN_NOT_DELETE_SYSTEM_TYPE = new ErrorCode(1_001_000_003, "不能删除类型为系统内置的参数配置"); + ErrorCode CONFIG_GET_VALUE_ERROR_IF_VISIBLE = new ErrorCode(1_001_000_004, "获取参数配置失败,原因:不允许获取不可见配置"); + + // ========== 定时任务 1-001-001-000 ========== + ErrorCode JOB_NOT_EXISTS = new ErrorCode(1_001_001_000, "定时任务不存在"); + ErrorCode JOB_HANDLER_EXISTS = new ErrorCode(1_001_001_001, "定时任务的处理器已经存在"); + ErrorCode JOB_CHANGE_STATUS_INVALID = new ErrorCode(1_001_001_002, "只允许修改为开启或者关闭状态"); + ErrorCode JOB_CHANGE_STATUS_EQUALS = new ErrorCode(1_001_001_003, "定时任务已经处于该状态,无需修改"); + ErrorCode JOB_UPDATE_ONLY_NORMAL_STATUS = new ErrorCode(1_001_001_004, "只有开启状态的任务,才可以修改"); + ErrorCode JOB_CRON_EXPRESSION_VALID = new ErrorCode(1_001_001_005, "CRON 表达式不正确"); + + // ========== API 错误日志 1-001-002-000 ========== + ErrorCode API_ERROR_LOG_NOT_FOUND = new ErrorCode(1_001_002_000, "API 错误日志不存在"); + ErrorCode API_ERROR_LOG_PROCESSED = new ErrorCode(1_001_002_001, "API 错误日志已处理"); + + // ========= 文件相关 1-001-003-000 ================= + ErrorCode FILE_PATH_EXISTS = new ErrorCode(1_001_003_000, "文件路径已存在"); + ErrorCode FILE_NOT_EXISTS = new ErrorCode(1_001_003_001, "文件不存在"); + ErrorCode FILE_IS_EMPTY = new ErrorCode(1_001_003_002, "文件为空"); + + // ========== 代码生成器 1-001-004-000 ========== + ErrorCode CODEGEN_TABLE_EXISTS = new ErrorCode(1_003_001_000, "表定义已经存在"); + ErrorCode CODEGEN_IMPORT_TABLE_NULL = new ErrorCode(1_003_001_001, "导入的表不存在"); + ErrorCode CODEGEN_IMPORT_COLUMNS_NULL = new ErrorCode(1_003_001_002, "导入的字段不存在"); + ErrorCode CODEGEN_TABLE_NOT_EXISTS = new ErrorCode(1_003_001_004, "表定义不存在"); + ErrorCode CODEGEN_COLUMN_NOT_EXISTS = new ErrorCode(1_003_001_005, "字段义不存在"); + ErrorCode CODEGEN_SYNC_COLUMNS_NULL = new ErrorCode(1_003_001_006, "同步的字段不存在"); + ErrorCode CODEGEN_SYNC_NONE_CHANGE = new ErrorCode(1_003_001_007, "同步失败,不存在改变"); + ErrorCode CODEGEN_TABLE_INFO_TABLE_COMMENT_IS_NULL = new ErrorCode(1_003_001_008, "数据库的表注释未填写"); + ErrorCode CODEGEN_TABLE_INFO_COLUMN_COMMENT_IS_NULL = new ErrorCode(1_003_001_009, "数据库的表字段({})注释未填写"); + + // ========== 字典类型(测试)1-001-005-000 ========== + ErrorCode TEST_DEMO_NOT_EXISTS = new ErrorCode(1_001_005_000, "测试示例不存在"); + + // ========== 文件配置 1-001-006-000 ========== + ErrorCode FILE_CONFIG_NOT_EXISTS = new ErrorCode(1_001_006_000, "文件配置不存在"); + ErrorCode FILE_CONFIG_DELETE_FAIL_MASTER = new ErrorCode(1_001_006_001, "该文件配置不允许删除,原因:它是主配置,删除会导致无法上传文件"); + + // ========== 数据源配置 1-001-007-000 ========== + ErrorCode DATA_SOURCE_CONFIG_NOT_EXISTS = new ErrorCode(1_001_007_000, "数据源配置不存在"); + ErrorCode DATA_SOURCE_CONFIG_NOT_OK = new ErrorCode(1_001_007_001, "数据源配置不正确,无法进行连接"); + +} diff --git a/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/enums/TrendsTypeEnum.java b/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/enums/TrendsTypeEnum.java new file mode 100644 index 0000000..33b25a3 --- /dev/null +++ b/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/enums/TrendsTypeEnum.java @@ -0,0 +1,48 @@ +package com.win.module.infra.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.stream.Stream; + +@Getter +@AllArgsConstructor +public enum TrendsTypeEnum { + + CREATE(1, "创建"), + UPDATE(2, "修改"), + DELETE(3, "删除"), + UPDATE_STATUS(4, "修改状态"), + UPLOAD_ANNEX(5, "上传附件"), + DELETE_ANNEX(6, "删除附件"), + CREATE_REMARK(7, "增加备注"), + DELETE_REMARK(8, "删除备注"); + + /** + * 状态值 + */ + private final Integer type; + /** + * 状态名 + */ + private final String name; + + public static TrendsTypeEnum convert(Integer value) { + return Stream.of(values()) + .filter(bean -> bean.type.equals(value)) + .findAny() + .orElse(CREATE); + } + + public static TrendsTypeEnum convert(String description) { + return Stream.of(values()) + .filter(bean -> bean.name.equals(description)) + .findAny() + .orElse(CREATE); + } + + public static String[] getStatusNameArray() { + return Stream.of(values()).map(TrendsTypeEnum::getName).toArray(String[]::new); + } + +} diff --git a/win-module-infra/win-module-infra-biz/pom.xml b/win-module-infra/win-module-infra-biz/pom.xml new file mode 100644 index 0000000..25986c0 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/pom.xml @@ -0,0 +1,121 @@ + + + + com.win + win-module-infra + ${revision} + + 4.0.0 + win-module-infra-biz + jar + + ${project.artifactId} + + infra 模块,主要提供两块能力: + 1. 我们放基础设施的运维与管理,支撑上层的通用与核心业务。 例如说:定时任务的管理、服务器的信息等等 + 2. 研发工具,提升研发效率与质量。 例如说:代码生成器、接口文档等等 + + + + + com.win + win-module-system-api + ${revision} + + + com.win + win-module-infra-api + ${revision} + + + + + com.win + win-spring-boot-starter-biz-operatelog + + + + + com.win + win-spring-boot-starter-security + + + + + com.win + win-spring-boot-starter-mybatis + + + com.baomidou + mybatis-plus-generator + + + + com.win + win-spring-boot-starter-redis + + + + + + + com.win + win-spring-boot-starter-job + + + + + com.win + win-spring-boot-starter-mq + + + + + com.win + win-spring-boot-starter-test + test + + + + + com.win + win-spring-boot-starter-excel + + + + org.apache.velocity + velocity-engine-core + + + + cn.smallbun.screw + screw-core + + + + + com.win + win-spring-boot-starter-monitor + + + + de.codecentric + spring-boot-admin-starter-server + + + + + com.win + win-spring-boot-starter-file + + + + + org.springframework.boot + spring-boot-starter-websocket + + + + diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/api/file/FileApiImpl.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/api/file/FileApiImpl.java new file mode 100644 index 0000000..3c9c63e --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/api/file/FileApiImpl.java @@ -0,0 +1,26 @@ +package com.win.module.infra.api.file; + +import com.win.module.infra.service.file.FileService; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; + +/** + * 文件 API 实现类 + * + * @author 闻荫源码 + */ +@Service +@Validated +public class FileApiImpl implements FileApi { + + @Resource + private FileService fileService; + + @Override + public String createFile(String name, String path, byte[] content, String tableName, Long tableId) { + return fileService.createFile(name, path, content, tableName, tableId); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/api/logger/ApiAccessLogApiImpl.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/api/logger/ApiAccessLogApiImpl.java new file mode 100644 index 0000000..a37ea3e --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/api/logger/ApiAccessLogApiImpl.java @@ -0,0 +1,33 @@ +package com.win.module.infra.api.logger; + +import com.win.module.infra.api.logger.dto.ApiAccessLogCreateReqDTO; +import com.win.module.infra.mq.producer.logger.ApiAccessLogProducer; +import com.win.module.infra.service.logger.ApiAccessLogService; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; + +/** + * API 访问日志的 API 实现类 + * + * @author 闻荫源码 + */ +@Service +@Validated +public class ApiAccessLogApiImpl implements ApiAccessLogApi { + + @Resource + private ApiAccessLogService apiAccessLogService; + + @Resource + private ApiAccessLogProducer apiAccessLogProducer; + + @Override + public void createApiAccessLog(ApiAccessLogCreateReqDTO createDTO) { + apiAccessLogService.createApiAccessLog(createDTO); + //ApiAccessLogMessage accessLogMessage = ApiAccessLogConvert.INSTANCE.convertMessage(createDTO); + //apiAccessLogProducer.sendMessage(accessLogMessage); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/api/logger/ApiErrorLogApiImpl.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/api/logger/ApiErrorLogApiImpl.java new file mode 100644 index 0000000..f78cf53 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/api/logger/ApiErrorLogApiImpl.java @@ -0,0 +1,33 @@ +package com.win.module.infra.api.logger; + +import com.win.module.infra.api.logger.dto.ApiErrorLogCreateReqDTO; +import com.win.module.infra.mq.producer.logger.ApiErrorLogProducer; +import com.win.module.infra.service.logger.ApiErrorLogService; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; + +/** + * API 访问日志的 API 接口 + * + * @author 闻荫源码 + */ +@Service +@Validated +public class ApiErrorLogApiImpl implements ApiErrorLogApi { + + @Resource + private ApiErrorLogService apiErrorLogService; + + @Resource + private ApiErrorLogProducer apiErrorLogProducer; + + @Override + public void createApiErrorLog(ApiErrorLogCreateReqDTO createDTO) { + apiErrorLogService.createApiErrorLog(createDTO); + //ApiErrorLogMessage errorLogMessage = ApiErrorLogConvert.INSTANCE.convertMessage(createDTO); + //apiErrorLogProducer.sendMessage(errorLogMessage); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/api/trends/TrendsApiImpl.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/api/trends/TrendsApiImpl.java new file mode 100644 index 0000000..d681f93 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/api/trends/TrendsApiImpl.java @@ -0,0 +1,33 @@ +package com.win.module.infra.api.trends; + +import com.win.module.infra.api.trends.dto.TrendsCreateReqDTO; +import com.win.module.infra.mq.producer.trends.TrendsProducer; +import com.win.module.infra.service.trends.TrendsService; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; + +/** + * API 访问日志的 API 实现类 + * + * @author 闻荫源码 + */ +@Service +@Validated +public class TrendsApiImpl implements TrendsApi { + + @Resource + private TrendsProducer trendsProducer; + + @Resource + private TrendsService trendsService; + + @Override + public void createTrends(TrendsCreateReqDTO createDTO) { + trendsService.createTrends(createDTO); + //TrendsMessage trendsMessage = TrendsConvert.INSTANCE.convertMessage(createDTO); + //trendsProducer.sendMessage(trendsMessage); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/codegen/CodegenController.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/codegen/CodegenController.java new file mode 100644 index 0000000..4d06e18 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/codegen/CodegenController.java @@ -0,0 +1,141 @@ +package com.win.module.infra.controller.codegen; + +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.ZipUtil; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.servlet.ServletUtils; +import com.win.module.infra.controller.codegen.vo.CodegenCreateListReqVO; +import com.win.module.infra.controller.codegen.vo.CodegenDetailRespVO; +import com.win.module.infra.controller.codegen.vo.CodegenPreviewRespVO; +import com.win.module.infra.controller.codegen.vo.CodegenUpdateReqVO; +import com.win.module.infra.controller.codegen.vo.table.CodegenTablePageReqVO; +import com.win.module.infra.controller.codegen.vo.table.CodegenTableRespVO; +import com.win.module.infra.controller.codegen.vo.table.DatabaseTableRespVO; +import com.win.module.infra.convert.codegen.CodegenConvert; +import com.win.module.infra.dal.dataobject.codegen.CodegenColumnDO; +import com.win.module.infra.dal.dataobject.codegen.CodegenTableDO; +import com.win.module.infra.service.codegen.CodegenService; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.Operation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.List; +import java.util.Map; + +import static com.win.framework.common.pojo.CommonResult.success; +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + +@Tag(name = "管理后台 - 代码生成器") +@RestController +@RequestMapping("/infra/codegen") +@Validated +public class CodegenController { + + @Resource + private CodegenService codegenService; + + @GetMapping("/db/table/list") + @Operation(summary = "获得数据库自带的表定义列表", description = "会过滤掉已经导入 Codegen 的表") + @Parameters({ + @Parameter(name = "dataSourceConfigId", description = "数据源配置的编号", required = true, example = "1"), + @Parameter(name = "name", description = "表名,模糊匹配", example = "win"), + @Parameter(name = "comment", description = "描述,模糊匹配", example = "闻荫") + }) + @PreAuthorize("@ss.hasPermission('infra:codegen:query')") + public CommonResult> getDatabaseTableList( + @RequestParam(value = "dataSourceConfigId") Long dataSourceConfigId, + @RequestParam(value = "name", required = false) String name, + @RequestParam(value = "comment", required = false) String comment) { + return success(codegenService.getDatabaseTableList(dataSourceConfigId, name, comment)); + } + + @GetMapping("/table/page") + @Operation(summary = "获得表定义分页") + @PreAuthorize("@ss.hasPermission('infra:codegen:query')") + public CommonResult> getCodeGenTablePage(@Valid CodegenTablePageReqVO pageReqVO) { + PageResult pageResult = codegenService.getCodegenTablePage(pageReqVO); + return success(CodegenConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/detail") + @Operation(summary = "获得表和字段的明细") + @Parameter(name = "tableId", description = "表编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('infra:codegen:query')") + public CommonResult getCodegenDetail(@RequestParam("tableId") Long tableId) { + CodegenTableDO table = codegenService.getCodegenTablePage(tableId); + List columns = codegenService.getCodegenColumnListByTableId(tableId); + // 拼装返回 + return success(CodegenConvert.INSTANCE.convert(table, columns)); + } + + @Operation(summary = "基于数据库的表结构,创建代码生成器的表和字段定义") + @PostMapping("/create-list") + @PreAuthorize("@ss.hasPermission('infra:codegen:create')") + public CommonResult> createCodegenList(@Valid @RequestBody CodegenCreateListReqVO reqVO) { + return success(codegenService.createCodegenList(getLoginUserId(), reqVO)); + } + + @Operation(summary = "更新数据库的表和字段定义") + @PutMapping("/update") + @PreAuthorize("@ss.hasPermission('infra:codegen:update')") + public CommonResult updateCodegen(@Valid @RequestBody CodegenUpdateReqVO updateReqVO) { + codegenService.updateCodegen(updateReqVO); + return success(true); + } + + @Operation(summary = "基于数据库的表结构,同步数据库的表和字段定义") + @PutMapping("/sync-from-db") + @Parameter(name = "tableId", description = "表编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('infra:codegen:update')") + public CommonResult syncCodegenFromDB(@RequestParam("tableId") Long tableId) { + codegenService.syncCodegenFromDB(tableId); + return success(true); + } + + @Operation(summary = "删除数据库的表和字段定义") + @DeleteMapping("/delete") + @Parameter(name = "tableId", description = "表编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('infra:codegen:delete')") + public CommonResult deleteCodegen(@RequestParam("tableId") Long tableId) { + codegenService.deleteCodegen(tableId); + return success(true); + } + + @Operation(summary = "预览生成代码") + @GetMapping("/preview") + @Parameter(name = "tableId", description = "表编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('infra:codegen:preview')") + public CommonResult> previewCodegen(@RequestParam("tableId") Long tableId) { + Map codes = codegenService.generationCodes(tableId); + return success(CodegenConvert.INSTANCE.convert(codes)); + } + + @Operation(summary = "下载生成代码") + @GetMapping("/download") + @Parameter(name = "tableId", description = "表编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('infra:codegen:download')") + public void downloadCodegen(@RequestParam("tableId") Long tableId, + HttpServletResponse response) throws IOException { + // 生成代码 + Map codes = codegenService.generationCodes(tableId); + // 构建 zip 包 + String[] paths = codes.keySet().toArray(new String[0]); + ByteArrayInputStream[] ins = codes.values().stream().map(IoUtil::toUtf8Stream).toArray(ByteArrayInputStream[]::new); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ZipUtil.zip(outputStream, paths, ins); + // 输出 + ServletUtils.writeAttachment(response, "codegen.zip", outputStream.toByteArray()); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/codegen/vo/CodegenCreateListReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/codegen/vo/CodegenCreateListReqVO.java new file mode 100644 index 0000000..1225234 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/codegen/vo/CodegenCreateListReqVO.java @@ -0,0 +1,21 @@ +package com.win.module.infra.controller.codegen.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +@Schema(description = "管理后台 - 基于数据库的表结构,创建代码生成器的表和字段定义 Request VO") +@Data +public class CodegenCreateListReqVO { + + @Schema(description = "数据源配置的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "数据源配置的编号不能为空") + private Long dataSourceConfigId; + + @Schema(description = "表名数组", requiredMode = Schema.RequiredMode.REQUIRED, example = "[1, 2, 3]") + @NotNull(message = "表名数组不能为空") + private List tableNames; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/codegen/vo/CodegenDetailRespVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/codegen/vo/CodegenDetailRespVO.java new file mode 100644 index 0000000..392f559 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/codegen/vo/CodegenDetailRespVO.java @@ -0,0 +1,20 @@ +package com.win.module.infra.controller.codegen.vo; + +import com.win.module.infra.controller.codegen.vo.column.CodegenColumnRespVO; +import com.win.module.infra.controller.codegen.vo.table.CodegenTableRespVO; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +@Schema(description = "管理后台 - 代码生成表和字段的明细 Response VO") +@Data +public class CodegenDetailRespVO { + + @Schema(description = "表定义") + private CodegenTableRespVO table; + + @Schema(description = "字段定义") + private List columns; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/codegen/vo/CodegenPreviewRespVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/codegen/vo/CodegenPreviewRespVO.java new file mode 100644 index 0000000..bc0cbfd --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/codegen/vo/CodegenPreviewRespVO.java @@ -0,0 +1,16 @@ +package com.win.module.infra.controller.codegen.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 代码生成预览 Response VO,注意,每个文件都是一个该对象") +@Data +public class CodegenPreviewRespVO { + + @Schema(description = "文件路径", requiredMode = Schema.RequiredMode.REQUIRED, example = "java/com.win/adminserver/modules/system/controller/test/SysTestDemoController.java") + private String filePath; + + @Schema(description = "代码", requiredMode = Schema.RequiredMode.REQUIRED, example = "Hello World") + private String code; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/codegen/vo/CodegenUpdateReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/codegen/vo/CodegenUpdateReqVO.java new file mode 100644 index 0000000..20c2470 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/codegen/vo/CodegenUpdateReqVO.java @@ -0,0 +1,59 @@ +package com.win.module.infra.controller.codegen.vo; + +import cn.hutool.core.util.ObjectUtil; +import com.win.module.infra.controller.codegen.vo.column.CodegenColumnBaseVO; +import com.win.module.infra.controller.codegen.vo.table.CodegenTableBaseVO; +import com.win.module.infra.enums.codegen.CodegenSceneEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.Valid; +import javax.validation.constraints.AssertTrue; +import javax.validation.constraints.NotNull; +import java.util.List; + +@Schema(description = "管理后台 - 代码生成表和字段的修改 Request VO") +@Data +public class CodegenUpdateReqVO { + + @Valid // 校验内嵌的字段 + @NotNull(message = "表定义不能为空") + private Table table; + + @Valid // 校验内嵌的字段 + @NotNull(message = "字段定义不能为空") + private List columns; + + @Schema(description = "更新表定义") + @Data + @EqualsAndHashCode(callSuper = true) + @ToString(callSuper = true) + @Valid + public static class Table extends CodegenTableBaseVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long id; + + @AssertTrue(message = "上级菜单不能为空,请前往 [修改生成配置 -> 生成信息] 界面,设置“上级菜单”字段") + public boolean isParentMenuIdValid() { + // 生成场景为管理后台时,必须设置上级菜单,不然生成的菜单 SQL 是无父级菜单的 + return ObjectUtil.notEqual(getScene(), CodegenSceneEnum.ADMIN.getScene()) + || getParentMenuId() != null; + } + + } + + @Schema(description = "更新表定义") + @Data + @EqualsAndHashCode(callSuper = true) + @ToString(callSuper = true) + public static class Column extends CodegenColumnBaseVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long id; + + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/codegen/vo/column/CodegenColumnBaseVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/codegen/vo/column/CodegenColumnBaseVO.java new file mode 100644 index 0000000..bae26b7 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/codegen/vo/column/CodegenColumnBaseVO.java @@ -0,0 +1,85 @@ +package com.win.module.infra.controller.codegen.vo.column; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** +* 代码生成字段定义 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class CodegenColumnBaseVO { + + @Schema(description = "表编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "表编号不能为空") + private Long tableId; + + @Schema(description = "字段名", requiredMode = Schema.RequiredMode.REQUIRED, example = "user_age") + @NotNull(message = "字段名不能为空") + private String columnName; + + @Schema(description = "字段类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "int(11)") + @NotNull(message = "字段类型不能为空") + private String dataType; + + @Schema(description = "字段描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "年龄") + @NotNull(message = "字段描述不能为空") + private String columnComment; + + @Schema(description = "是否允许为空", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") + @NotNull(message = "是否允许为空不能为空") + private Boolean nullable; + + @Schema(description = "是否主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") + @NotNull(message = "是否主键不能为空") + private Boolean primaryKey; + + @Schema(description = "是否自增", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") + @NotNull(message = "是否自增不能为空") + private String autoIncrement; + + @Schema(description = "排序", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") + @NotNull(message = "排序不能为空") + private Integer ordinalPosition; + + @Schema(description = "Java 属性类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "userAge") + @NotNull(message = "Java 属性类型不能为空") + private String javaType; + + @Schema(description = "Java 属性名", requiredMode = Schema.RequiredMode.REQUIRED, example = "Integer") + @NotNull(message = "Java 属性名不能为空") + private String javaField; + + @Schema(description = "字典类型", example = "sys_gender") + private String dictType; + + @Schema(description = "数据示例", example = "1024") + private String example; + + @Schema(description = "是否为 Create 创建操作的字段", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") + @NotNull(message = "是否为 Create 创建操作的字段不能为空") + private Boolean createOperation; + + @Schema(description = "是否为 Update 更新操作的字段", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") + @NotNull(message = "是否为 Update 更新操作的字段不能为空") + private Boolean updateOperation; + + @Schema(description = "是否为 List 查询操作的字段", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") + @NotNull(message = "是否为 List 查询操作的字段不能为空") + private Boolean listOperation; + + @Schema(description = "List 查询操作的条件类型,参见 CodegenColumnListConditionEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "LIKE") + @NotNull(message = "List 查询操作的条件类型不能为空") + private String listOperationCondition; + + @Schema(description = "是否为 List 查询操作的返回字段", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") + @NotNull(message = "是否为 List 查询操作的返回字段不能为空") + private Boolean listOperationResult; + + @Schema(description = "显示类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "input") + @NotNull(message = "显示类型不能为空") + private String htmlType; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/codegen/vo/column/CodegenColumnRespVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/codegen/vo/column/CodegenColumnRespVO.java new file mode 100644 index 0000000..02b379f --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/codegen/vo/column/CodegenColumnRespVO.java @@ -0,0 +1,22 @@ +package com.win.module.infra.controller.codegen.vo.column; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 代码生成字段定义 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class CodegenColumnRespVO extends CodegenColumnBaseVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long id; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/codegen/vo/table/CodegenTableBaseVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/codegen/vo/table/CodegenTableBaseVO.java new file mode 100644 index 0000000..8d8a2c4 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/codegen/vo/table/CodegenTableBaseVO.java @@ -0,0 +1,61 @@ +package com.win.module.infra.controller.codegen.vo.table; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * 代码生成 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class CodegenTableBaseVO { + + @Schema(description = "生成场景,参见 CodegenSceneEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "导入类型不能为空") + private Integer scene; + + @Schema(description = "表名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "win") + @NotNull(message = "表名称不能为空") + private String tableName; + + @Schema(description = "表描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "闻荫") + @NotNull(message = "表描述不能为空") + private String tableComment; + + @Schema(description = "备注", example = "我是备注") + private String remark; + + @Schema(description = "模块名", requiredMode = Schema.RequiredMode.REQUIRED, example = "system") + @NotNull(message = "模块名不能为空") + private String moduleName; + + @Schema(description = "业务名", requiredMode = Schema.RequiredMode.REQUIRED, example = "codegen") + @NotNull(message = "业务名不能为空") + private String businessName; + + @Schema(description = "类名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "CodegenTable") + @NotNull(message = "类名称不能为空") + private String className; + + @Schema(description = "类描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "代码生成器的表定义") + @NotNull(message = "类描述不能为空") + private String classComment; + + @Schema(description = "作者", requiredMode = Schema.RequiredMode.REQUIRED, example = "闻荫源码") + @NotNull(message = "作者不能为空") + private String author; + + @Schema(description = "模板类型,参见 CodegenTemplateTypeEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "模板类型不能为空") + private Integer templateType; + + @Schema(description = "前端类型,参见 CodegenFrontTypeEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "20") + @NotNull(message = "前端类型不能为空") + private Integer frontType; + + @Schema(description = "父菜单编号", example = "1024") + private Long parentMenuId; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/codegen/vo/table/CodegenTablePageReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/codegen/vo/table/CodegenTablePageReqVO.java new file mode 100644 index 0000000..bd9fe3e --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/codegen/vo/table/CodegenTablePageReqVO.java @@ -0,0 +1,33 @@ +package com.win.module.infra.controller.codegen.vo.table; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 表定义分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class CodegenTablePageReqVO extends PageParam { + + @Schema(description = "表名称,模糊匹配", example = "win") + private String tableName; + + @Schema(description = "表描述,模糊匹配", example = "闻荫") + private String tableComment; + + @Schema(description = "实体,模糊匹配", example = "Win") + private String className; + + @Schema(description = "创建时间", example = "[2022-07-01 00:00:00,2022-07-01 23:59:59]") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/codegen/vo/table/CodegenTableRespVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/codegen/vo/table/CodegenTableRespVO.java new file mode 100644 index 0000000..0784e64 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/codegen/vo/table/CodegenTableRespVO.java @@ -0,0 +1,28 @@ +package com.win.module.infra.controller.codegen.vo.table; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 代码生成表定义 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class CodegenTableRespVO extends CodegenTableBaseVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long id; + + @Schema(description = "主键编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Integer dataSourceConfigId; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + + @Schema(description = "更新时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime updateTime; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/codegen/vo/table/DatabaseTableRespVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/codegen/vo/table/DatabaseTableRespVO.java new file mode 100644 index 0000000..953fbdb --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/codegen/vo/table/DatabaseTableRespVO.java @@ -0,0 +1,16 @@ +package com.win.module.infra.controller.codegen.vo.table; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 数据库的表定义 Response VO") +@Data +public class DatabaseTableRespVO { + + @Schema(description = "表名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "yuanma") + private String name; + + @Schema(description = "表描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "闻荫源码") + private String comment; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/config/ConfigController.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/config/ConfigController.java new file mode 100644 index 0000000..5f1eb9f --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/config/ConfigController.java @@ -0,0 +1,105 @@ +package com.win.module.infra.controller.config; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.excel.core.util.ExcelUtils; +import com.win.framework.operatelog.core.annotations.OperateLog; +import com.win.module.infra.controller.config.vo.*; +import com.win.module.infra.convert.config.ConfigConvert; +import com.win.module.infra.dal.dataobject.config.ConfigDO; +import com.win.module.infra.enums.ErrorCodeConstants; +import com.win.module.infra.service.config.ConfigService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.framework.common.pojo.CommonResult.success; +import static com.win.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 参数配置") +@RestController +@RequestMapping("/infra/config") +@Validated +public class ConfigController { + + @Resource + private ConfigService configService; + + @PostMapping("/create") + @Operation(summary = "创建参数配置") + @PreAuthorize("@ss.hasPermission('infra:config:create')") + public CommonResult createConfig(@Valid @RequestBody ConfigCreateReqVO reqVO) { + return success(configService.createConfig(reqVO)); + } + + @PutMapping("/update") + @Operation(summary = "修改参数配置") + @PreAuthorize("@ss.hasPermission('infra:config:update')") + public CommonResult updateConfig(@Valid @RequestBody ConfigUpdateReqVO reqVO) { + configService.updateConfig(reqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除参数配置") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('infra:config:delete')") + public CommonResult deleteConfig(@RequestParam("id") Long id) { + configService.deleteConfig(id); + return success(true); + } + + @GetMapping(value = "/get") + @Operation(summary = "获得参数配置") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('infra:config:query')") + public CommonResult getConfig(@RequestParam("id") Long id) { + return success(ConfigConvert.INSTANCE.convert(configService.getConfig(id))); + } + + @GetMapping(value = "/get-value-by-key") + @Operation(summary = "根据参数键名查询参数值", description = "不可见的配置,不允许返回给前端") + @Parameter(name = "key", description = "参数键", required = true, example = "yunai.biz.username") + public CommonResult getConfigKey(@RequestParam("key") String key) { + ConfigDO config = configService.getConfigByKey(key); + if (config == null) { + return success(null); + } + if (!config.getVisible()) { + throw exception(ErrorCodeConstants.CONFIG_GET_VALUE_ERROR_IF_VISIBLE); + } + return success(config.getValue()); + } + + @GetMapping("/page") + @Operation(summary = "获取参数配置分页") + @PreAuthorize("@ss.hasPermission('infra:config:query')") + public CommonResult> getConfigPage(@Valid ConfigPageReqVO reqVO) { + PageResult page = configService.getConfigPage(reqVO); + return success(ConfigConvert.INSTANCE.convertPage(page)); + } + + @GetMapping("/export") + @Operation(summary = "导出参数配置") + @PreAuthorize("@ss.hasPermission('infra:config:export')") + @OperateLog(type = EXPORT) + public void exportConfig(@Valid ConfigExportReqVO reqVO, + HttpServletResponse response) throws IOException { + List list = configService.getConfigList(reqVO); + // 拼接数据 + List datas = ConfigConvert.INSTANCE.convertList(list); + // 输出 + ExcelUtils.write(response, "参数配置.xls", "数据", ConfigExcelVO.class, datas); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/config/vo/ConfigBaseVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/config/vo/ConfigBaseVO.java new file mode 100644 index 0000000..ea09db8 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/config/vo/ConfigBaseVO.java @@ -0,0 +1,40 @@ +package com.win.module.infra.controller.config.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +/** + * 参数配置 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class ConfigBaseVO { + + @Schema(description = "参数分组", requiredMode = Schema.RequiredMode.REQUIRED, example = "biz") + @NotEmpty(message = "参数分组不能为空") + @Size(max = 50, message = "参数名称不能超过50个字符") + private String category; + + @Schema(description = "参数名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "数据库名") + @NotBlank(message = "参数名称不能为空") + @Size(max = 100, message = "参数名称不能超过100个字符") + private String name; + + @Schema(description = "参数键值", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotBlank(message = "参数键值不能为空") + @Size(max = 500, message = "参数键值长度不能超过500个字符") + private String value; + + @Schema(description = "是否可见", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") + @NotNull(message = "是否可见不能为空") + private Boolean visible; + + @Schema(description = "备注", example = "备注一下很帅气!") + private String remark; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/config/vo/ConfigCreateReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/config/vo/ConfigCreateReqVO.java new file mode 100644 index 0000000..9615628 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/config/vo/ConfigCreateReqVO.java @@ -0,0 +1,20 @@ +package com.win.module.infra.controller.config.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; + +@Schema(description = "管理后台 - 参数配置创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class ConfigCreateReqVO extends ConfigBaseVO { + + @Schema(description = "参数键名", requiredMode = Schema.RequiredMode.REQUIRED, example = "yunai.db.username") + @NotBlank(message = "参数键名长度不能为空") + @Size(max = 100, message = "参数键名长度不能超过100个字符") + private String key; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/config/vo/ConfigExcelVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/config/vo/ConfigExcelVO.java new file mode 100644 index 0000000..366349f --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/config/vo/ConfigExcelVO.java @@ -0,0 +1,46 @@ +package com.win.module.infra.controller.config.vo; + +import com.win.framework.excel.core.annotations.DictFormat; +import com.win.framework.excel.core.convert.DictConvert; +import com.win.module.infra.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 参数配置 Excel 导出响应 VO + */ +@Data +public class ConfigExcelVO { + + @ExcelProperty("参数配置序号") + private Long id; + + @ExcelProperty("参数键名") + private String configKey; + + @ExcelProperty("参数分类") + private String category; + + @ExcelProperty("参数名称") + private String name; + + @ExcelProperty("参数键值") + private String value; + + @ExcelProperty(value = "参数类型", converter = DictConvert.class) + @DictFormat(DictTypeConstants.CONFIG_TYPE) + private Integer type; + + @ExcelProperty(value = "是否可见", converter = DictConvert.class) + @DictFormat(DictTypeConstants.BOOLEAN_STRING) + private Boolean visible; + + @ExcelProperty("备注") + private String remark; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/config/vo/ConfigExportReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/config/vo/ConfigExportReqVO.java new file mode 100644 index 0000000..31cd2ae --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/config/vo/ConfigExportReqVO.java @@ -0,0 +1,28 @@ +package com.win.module.infra.controller.config.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 参数配置导出 Request VO") +@Data +public class ConfigExportReqVO { + + @Schema(description = "参数名称", example = "模糊匹配") + private String name; + + @Schema(description = "参数键名,模糊匹配", example = "yunai.db.username") + private String key; + + @Schema(description = "参数类型,参见 SysConfigTypeEnum 枚举", example = "1") + private Integer type; + + @Schema(description = "创建时间", example = "[2022-07-01 00:00:00,2022-07-01 23:59:59]") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/config/vo/ConfigPageReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/config/vo/ConfigPageReqVO.java new file mode 100644 index 0000000..2615a34 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/config/vo/ConfigPageReqVO.java @@ -0,0 +1,33 @@ +package com.win.module.infra.controller.config.vo; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 参数配置分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ConfigPageReqVO extends PageParam { + + @Schema(description = "数据源名称,模糊匹配", example = "名称") + private String name; + + @Schema(description = "参数键名,模糊匹配", example = "yunai.db.username") + private String key; + + @Schema(description = "参数类型,参见 SysConfigTypeEnum 枚举", example = "1") + private Integer type; + + @Schema(description = "创建时间", example = "[2022-07-01 00:00:00,2022-07-01 23:59:59]") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/config/vo/ConfigRespVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/config/vo/ConfigRespVO.java new file mode 100644 index 0000000..4870278 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/config/vo/ConfigRespVO.java @@ -0,0 +1,30 @@ +package com.win.module.infra.controller.config.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 参数配置信息 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class ConfigRespVO extends ConfigBaseVO { + + @Schema(description = "参数配置序号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "参数键名", requiredMode = Schema.RequiredMode.REQUIRED, example = "yunai.db.username") + @NotBlank(message = "参数键名长度不能为空") + @Size(max = 100, message = "参数键名长度不能超过100个字符") + private String key; + + @Schema(description = "参数类型,参见 SysConfigTypeEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer type; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "时间戳格式") + private LocalDateTime createTime; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/config/vo/ConfigUpdateReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/config/vo/ConfigUpdateReqVO.java new file mode 100644 index 0000000..71f799e --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/config/vo/ConfigUpdateReqVO.java @@ -0,0 +1,20 @@ +package com.win.module.infra.controller.config.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 参数配置创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ConfigUpdateReqVO extends ConfigBaseVO { + + @Schema(description = "参数配置序号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "参数配置编号不能为空") + private Long id; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/db/DataSourceConfigController.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/db/DataSourceConfigController.java new file mode 100644 index 0000000..6033f1f --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/db/DataSourceConfigController.java @@ -0,0 +1,73 @@ +package com.win.module.infra.controller.db; + +import com.win.framework.common.pojo.CommonResult; +import com.win.module.infra.controller.db.vo.DataSourceConfigCreateReqVO; +import com.win.module.infra.controller.db.vo.DataSourceConfigRespVO; +import com.win.module.infra.controller.db.vo.DataSourceConfigUpdateReqVO; +import com.win.module.infra.convert.db.DataSourceConfigConvert; +import com.win.module.infra.dal.dataobject.db.DataSourceConfigDO; +import com.win.module.infra.service.db.DataSourceConfigService; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.List; + +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 数据源配置") +@RestController +@RequestMapping("/infra/data-source-config") +@Validated +public class DataSourceConfigController { + + @Resource + private DataSourceConfigService dataSourceConfigService; + + @PostMapping("/create") + @Operation(summary = "创建数据源配置") + @PreAuthorize("@ss.hasPermission('infra:data-source-config:create')") + public CommonResult createDataSourceConfig(@Valid @RequestBody DataSourceConfigCreateReqVO createReqVO) { + return success(dataSourceConfigService.createDataSourceConfig(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新数据源配置") + @PreAuthorize("@ss.hasPermission('infra:data-source-config:update')") + public CommonResult updateDataSourceConfig(@Valid @RequestBody DataSourceConfigUpdateReqVO updateReqVO) { + dataSourceConfigService.updateDataSourceConfig(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除数据源配置") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('infra:data-source-config:delete')") + public CommonResult deleteDataSourceConfig(@RequestParam("id") Long id) { + dataSourceConfigService.deleteDataSourceConfig(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得数据源配置") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('infra:data-source-config:query')") + public CommonResult getDataSourceConfig(@RequestParam("id") Long id) { + DataSourceConfigDO dataSourceConfig = dataSourceConfigService.getDataSourceConfig(id); + return success(DataSourceConfigConvert.INSTANCE.convert(dataSourceConfig)); + } + + @GetMapping("/list") + @Operation(summary = "获得数据源配置列表") + @PreAuthorize("@ss.hasPermission('infra:data-source-config:query')") + public CommonResult> getDataSourceConfigList() { + List list = dataSourceConfigService.getDataSourceConfigList(); + return success(DataSourceConfigConvert.INSTANCE.convertList(list)); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/db/DatabaseDocController.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/db/DatabaseDocController.java new file mode 100644 index 0000000..5c5560f --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/db/DatabaseDocController.java @@ -0,0 +1,154 @@ +package com.win.module.infra.controller.db; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.IdUtil; +import com.win.framework.common.util.servlet.ServletUtils; +import cn.smallbun.screw.core.Configuration; +import cn.smallbun.screw.core.engine.EngineConfig; +import cn.smallbun.screw.core.engine.EngineFileType; +import cn.smallbun.screw.core.engine.EngineTemplateType; +import cn.smallbun.screw.core.execute.DocumentationExecute; +import cn.smallbun.screw.core.process.ProcessConfig; +import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty; +import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties; +import com.zaxxer.hikari.HikariConfig; +import com.zaxxer.hikari.HikariDataSource; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.IOException; +import java.util.Arrays; + +@Tag(name = "管理后台 - 数据库文档") +@RestController +@RequestMapping("/infra/db-doc") +public class DatabaseDocController { + + @Resource + private DynamicDataSourceProperties dynamicDataSourceProperties; + + private static final String FILE_OUTPUT_DIR = System.getProperty("java.io.tmpdir") + File.separator + + "db-doc"; + private static final String DOC_FILE_NAME = "数据库文档"; + private static final String DOC_VERSION = "1.0.0"; + private static final String DOC_DESCRIPTION = "文档描述"; + + @GetMapping("/export-html") + @Operation(summary = "导出 html 格式的数据文档") + @Parameter(name = "deleteFile", description = "是否删除在服务器本地生成的数据库文档", example = "true") + public void exportHtml(@RequestParam(defaultValue = "true") Boolean deleteFile, + HttpServletResponse response) throws IOException { + doExportFile(EngineFileType.HTML, deleteFile, response); + } + + @GetMapping("/export-word") + @Operation(summary = "导出 word 格式的数据文档") + @Parameter(name = "deleteFile", description = "是否删除在服务器本地生成的数据库文档", example = "true") + public void exportWord(@RequestParam(defaultValue = "true") Boolean deleteFile, + HttpServletResponse response) throws IOException { + doExportFile(EngineFileType.WORD, deleteFile, response); + } + + @GetMapping("/export-markdown") + @Operation(summary = "导出 markdown 格式的数据文档") + @Parameter(name = "deleteFile", description = "是否删除在服务器本地生成的数据库文档", example = "true") + public void exportMarkdown(@RequestParam(defaultValue = "true") Boolean deleteFile, + HttpServletResponse response) throws IOException { + doExportFile(EngineFileType.MD, deleteFile, response); + } + + private void doExportFile(EngineFileType fileOutputType, Boolean deleteFile, + HttpServletResponse response) throws IOException { + String docFileName = DOC_FILE_NAME + "_" + IdUtil.fastSimpleUUID(); + String filePath = doExportFile(fileOutputType, docFileName); + String downloadFileName = DOC_FILE_NAME + fileOutputType.getFileSuffix(); //下载后的文件名 + try { + // 读取,返回 + ServletUtils.writeAttachment(response, downloadFileName, FileUtil.readBytes(filePath)); + } finally { + handleDeleteFile(deleteFile, filePath); + } + } + + /** + * 输出文件,返回文件路径 + * + * @param fileOutputType 文件类型 + * @param fileName 文件名, 无需 ".docx" 等文件后缀 + * @return 生成的文件所在路径 + */ + private String doExportFile(EngineFileType fileOutputType, String fileName) { + try (HikariDataSource dataSource = buildDataSource()) { + // 创建 screw 的配置 + Configuration config = Configuration.builder() + .version(DOC_VERSION) // 版本 + .description(DOC_DESCRIPTION) // 描述 + .dataSource(dataSource) // 数据源 + .engineConfig(buildEngineConfig(fileOutputType, fileName)) // 引擎配置 + .produceConfig(buildProcessConfig()) // 处理配置 + .build(); + + // 执行 screw,生成数据库文档 + new DocumentationExecute(config).execute(); + + return FILE_OUTPUT_DIR + File.separator + fileName + fileOutputType.getFileSuffix(); + } + } + + private void handleDeleteFile(Boolean deleteFile, String filePath) { + if (!deleteFile) { + return; + } + FileUtil.del(filePath); + } + + /** + * 创建数据源 + */ + // TODO 芋艿:screw 暂时不支持 druid,尴尬 + private HikariDataSource buildDataSource() { + // 获得 DataSource 数据源,目前只支持首个 + String primary = dynamicDataSourceProperties.getPrimary(); + DataSourceProperty dataSourceProperty = dynamicDataSourceProperties.getDatasource().get(primary); + // 创建 HikariConfig 配置类 + HikariConfig hikariConfig = new HikariConfig(); + hikariConfig.setJdbcUrl(dataSourceProperty.getUrl()); + hikariConfig.setUsername(dataSourceProperty.getUsername()); + hikariConfig.setPassword(dataSourceProperty.getPassword()); + hikariConfig.addDataSourceProperty("useInformationSchema", "true"); // 设置可以获取 tables remarks 信息 + // 创建数据源 + return new HikariDataSource(hikariConfig); + } + + /** + * 创建 screw 的引擎配置 + */ + private static EngineConfig buildEngineConfig(EngineFileType fileOutputType, String docFileName) { + return EngineConfig.builder() + .fileOutputDir(FILE_OUTPUT_DIR) // 生成文件路径 + .openOutputDir(false) // 打开目录 + .fileType(fileOutputType) // 文件类型 + .produceType(EngineTemplateType.velocity) // 文件类型 + .fileName(docFileName) // 自定义文件名称 + .build(); + } + + /** + * 创建 screw 的处理配置,一般可忽略 + * 指定生成逻辑、当存在指定表、指定表前缀、指定表后缀时,将生成指定表,其余表不生成、并跳过忽略表配置 + */ + private static ProcessConfig buildProcessConfig() { + return ProcessConfig.builder() + .ignoreTablePrefix(Arrays.asList("QRTZ_", "ACT_")) // 忽略表前缀 + .build(); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/db/vo/DataSourceConfigBaseVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/db/vo/DataSourceConfigBaseVO.java new file mode 100644 index 0000000..51c2a33 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/db/vo/DataSourceConfigBaseVO.java @@ -0,0 +1,25 @@ +package com.win.module.infra.controller.db.vo; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import javax.validation.constraints.*; + +/** +* 数据源配置 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class DataSourceConfigBaseVO { + + @Schema(description = "数据源名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "test") + @NotNull(message = "数据源名称不能为空") + private String name; + + @Schema(description = "数据源连接", requiredMode = Schema.RequiredMode.REQUIRED, example = "jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro") + @NotNull(message = "数据源连接不能为空") + private String url; + + @Schema(description = "用户名", requiredMode = Schema.RequiredMode.REQUIRED, example = "root") + @NotNull(message = "用户名不能为空") + private String username; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/db/vo/DataSourceConfigCreateReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/db/vo/DataSourceConfigCreateReqVO.java new file mode 100644 index 0000000..ddd5a24 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/db/vo/DataSourceConfigCreateReqVO.java @@ -0,0 +1,17 @@ +package com.win.module.infra.controller.db.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 数据源配置创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DataSourceConfigCreateReqVO extends DataSourceConfigBaseVO { + + @Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456") + @NotNull(message = "密码不能为空") + private String password; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/db/vo/DataSourceConfigRespVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/db/vo/DataSourceConfigRespVO.java new file mode 100644 index 0000000..d64658b --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/db/vo/DataSourceConfigRespVO.java @@ -0,0 +1,20 @@ +package com.win.module.infra.controller.db.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 数据源配置 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DataSourceConfigRespVO extends DataSourceConfigBaseVO { + + @Schema(description = "主键编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Integer id; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/db/vo/DataSourceConfigUpdateReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/db/vo/DataSourceConfigUpdateReqVO.java new file mode 100644 index 0000000..558dcde --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/db/vo/DataSourceConfigUpdateReqVO.java @@ -0,0 +1,21 @@ +package com.win.module.infra.controller.db.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 数据源配置更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DataSourceConfigUpdateReqVO extends DataSourceConfigBaseVO { + + @Schema(description = "主键编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "主键编号不能为空") + private Long id; + + @Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456") + @NotNull(message = "密码不能为空") + private String password; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/file/FileConfigController.http b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/file/FileConfigController.http new file mode 100644 index 0000000..79b231c --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/file/FileConfigController.http @@ -0,0 +1,45 @@ +### 请求 /infra/file-config/create 接口 => 成功 +POST {{baseUrl}}/infra/file-config/create +Content-Type: application/json +tenant-id: {{adminTenentId}} +Authorization: Bearer {{token}} + +{ + "name": "S3 - 七牛云", + "remark": "", + "storage": 20, + "config": { + "accessKey": "b7yvuhBSAGjmtPhMFcn9iMOxUOY_I06cA_p0ZUx8", + "accessSecret": "kXM1l5ia1RvSX3QaOEcwI3RLz3Y2rmNszWonKZtP", + "bucket": "ruoyi-vue-pro", + "endpoint": "s3-cn-south-1.qiniucs.com", + "domain": "http://test.win.iocoder.cn", + "region": "oss-cn-beijing" + } +} + +### 请求 /infra/file-config/update 接口 => 成功 +PUT {{baseUrl}}/infra/file-config/update +Content-Type: application/json +tenant-id: {{adminTenentId}} +Authorization: Bearer {{token}} + +{ + "id": 2, + "name": "S3 - 七牛云", + "remark": "", + "config": { + "accessKey": "b7yvuhBSAGjmtPhMFcn9iMOxUOY_I06cA_p0ZUx8", + "accessSecret": "kXM1l5ia1RvSX3QaOEcwI3RLz3Y2rmNszWonKZtP", + "bucket": "ruoyi-vue-pro", + "endpoint": "s3-cn-south-1.qiniucs.com", + "domain": "http://test.win.iocoder.cn", + "region": "oss-cn-beijing" + } +} + +### 请求 /infra/file-config/test 接口 => 成功 +GET {{baseUrl}}/infra/file-config/test?id=2 +Content-Type: application/json +tenant-id: {{adminTenentId}} +Authorization: Bearer {{token}} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/file/FileConfigController.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/file/FileConfigController.java new file mode 100644 index 0000000..0e9e05c --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/file/FileConfigController.java @@ -0,0 +1,89 @@ +package com.win.module.infra.controller.file; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.module.infra.controller.file.vo.config.FileConfigCreateReqVO; +import com.win.module.infra.controller.file.vo.config.FileConfigPageReqVO; +import com.win.module.infra.controller.file.vo.config.FileConfigRespVO; +import com.win.module.infra.controller.file.vo.config.FileConfigUpdateReqVO; +import com.win.module.infra.convert.file.FileConfigConvert; +import com.win.module.infra.dal.dataobject.file.FileConfigDO; +import com.win.module.infra.service.file.FileConfigService; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; + +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 文件配置") +@RestController +@RequestMapping("/infra/file-config") +@Validated +public class FileConfigController { + + @Resource + private FileConfigService fileConfigService; + + @PostMapping("/create") + @Operation(summary = "创建文件配置") + @PreAuthorize("@ss.hasPermission('infra:file-config:create')") + public CommonResult createFileConfig(@Valid @RequestBody FileConfigCreateReqVO createReqVO) { + return success(fileConfigService.createFileConfig(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新文件配置") + @PreAuthorize("@ss.hasPermission('infra:file-config:update')") + public CommonResult updateFileConfig(@Valid @RequestBody FileConfigUpdateReqVO updateReqVO) { + fileConfigService.updateFileConfig(updateReqVO); + return success(true); + } + + @PutMapping("/update-master") + @Operation(summary = "更新文件配置为 Master") + @PreAuthorize("@ss.hasPermission('infra:file-config:update')") + public CommonResult updateFileConfigMaster(@RequestParam("id") Long id) { + fileConfigService.updateFileConfigMaster(id); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除文件配置") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('infra:file-config:delete')") + public CommonResult deleteFileConfig(@RequestParam("id") Long id) { + fileConfigService.deleteFileConfig(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得文件配置") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('infra:file-config:query')") + public CommonResult getFileConfig(@RequestParam("id") Long id) { + FileConfigDO fileConfig = fileConfigService.getFileConfig(id); + return success(FileConfigConvert.INSTANCE.convert(fileConfig)); + } + + @GetMapping("/page") + @Operation(summary = "获得文件配置分页") + @PreAuthorize("@ss.hasPermission('infra:file-config:query')") + public CommonResult> getFileConfigPage(@Valid FileConfigPageReqVO pageVO) { + PageResult pageResult = fileConfigService.getFileConfigPage(pageVO); + return success(FileConfigConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/test") + @Operation(summary = "测试文件配置是否正确") + @PreAuthorize("@ss.hasPermission('infra:file-config:query')") + public CommonResult testFileConfig(@RequestParam("id") Long id) throws Exception { + String url = fileConfigService.testFileConfig(id); + return success(url); + } +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/file/FileController.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/file/FileController.java new file mode 100644 index 0000000..ee75dc0 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/file/FileController.java @@ -0,0 +1,115 @@ +package com.win.module.infra.controller.file; + +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.servlet.ServletUtils; +import com.win.framework.operatelog.core.annotations.OperateLog; +import com.win.module.infra.controller.file.vo.file.FileListReqVO; +import com.win.module.infra.controller.file.vo.file.FilePageReqVO; +import com.win.module.infra.controller.file.vo.file.FileRespVO; +import com.win.module.infra.controller.file.vo.file.FileUploadReqVO; +import com.win.module.infra.convert.file.FileConvert; +import com.win.module.infra.dal.dataobject.file.FileDO; +import com.win.module.infra.service.file.FileService; +import com.win.module.system.api.user.AdminUserApi; +import com.win.module.system.api.user.dto.AdminUserRespDTO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.annotation.security.PermitAll; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.List; + +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 文件存储") +@RestController +@RequestMapping("/infra/file") +@Validated +@Slf4j +public class FileController { + + @Resource + private FileService fileService; + + @Resource + private AdminUserApi adminUserApi; + + @PostMapping("/upload") + @Operation(summary = "上传文件") + @OperateLog(logArgs = false) // 上传文件,没有记录操作日志的必要 + public CommonResult uploadFile(FileUploadReqVO uploadReqVO) throws Exception { + MultipartFile file = uploadReqVO.getFile(); + String path = uploadReqVO.getPath(); + return success(fileService.createFile(file.getOriginalFilename(), path, IoUtil.readBytes(file.getInputStream()), uploadReqVO.getTableName(), uploadReqVO.getTableId())); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除文件") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('infra:file:delete')") + public CommonResult deleteFile(@RequestParam("id") Long id) throws Exception { + fileService.deleteFile(id); + return success(true); + } + + @GetMapping("/{configId}/get/**") + @PermitAll + @Operation(summary = "下载文件") + @Parameter(name = "configId", description = "配置编号", required = true) + public void getFileContent(HttpServletRequest request, + HttpServletResponse response, + @PathVariable("configId") Long configId) throws Exception { + // 获取请求的路径 + String path = StrUtil.subAfter(request.getRequestURI(), "/get/", false); + if (StrUtil.isEmpty(path)) { + throw new IllegalArgumentException("结尾的 path 路径必须传递"); + } + + // 读取内容 + byte[] content = fileService.getFileContent(configId, path); + if (content == null) { + log.warn("[getFileContent][configId({}) path({}) 文件不存在]", configId, path); + response.setStatus(HttpStatus.NOT_FOUND.value()); + return; + } + ServletUtils.writeAttachment(response, path, content); + } + + @GetMapping("/page") + @Operation(summary = "获得文件分页") + @PreAuthorize("@ss.hasPermission('infra:file:query')") + public CommonResult> getFilePage(@Valid FilePageReqVO pageVO) { + PageResult pageResult = fileService.getFilePage(pageVO); + return success(FileConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/list") + @Operation(summary = "获得文件分页") + @PreAuthorize("@ss.hasPermission('infra:file:query')") + public CommonResult> getFilePage(@Valid FileListReqVO listVO) { + List listResult = fileService.getFileList(listVO); + List fileRespVOList = FileConvert.INSTANCE.convertList(listResult); + for(FileRespVO fileRespVO : fileRespVOList) { + AdminUserRespDTO user = adminUserApi.getUser(Long.parseLong(fileRespVO.getCreator())); + if(user != null) { + fileRespVO.setNickname(user.getNickname()); + fileRespVO.setAvatar(user.getAvatar()); + } + } + return success(fileRespVOList); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/file/vo/config/FileConfigBaseVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/file/vo/config/FileConfigBaseVO.java new file mode 100644 index 0000000..7a28982 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/file/vo/config/FileConfigBaseVO.java @@ -0,0 +1,22 @@ +package com.win.module.infra.controller.file.vo.config; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** +* 文件配置 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class FileConfigBaseVO { + + @Schema(description = "配置名", requiredMode = Schema.RequiredMode.REQUIRED, example = "S3 - 阿里云") + @NotNull(message = "配置名不能为空") + private String name; + + @Schema(description = "备注", example = "我是备注") + private String remark; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/file/vo/config/FileConfigCreateReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/file/vo/config/FileConfigCreateReqVO.java new file mode 100644 index 0000000..88c04e2 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/file/vo/config/FileConfigCreateReqVO.java @@ -0,0 +1,25 @@ +package com.win.module.infra.controller.file.vo.config; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; +import java.util.Map; + +@Schema(description = "管理后台 - 文件配置创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class FileConfigCreateReqVO extends FileConfigBaseVO { + + @Schema(description = "存储器,参见 FileStorageEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "存储器不能为空") + private Integer storage; + + @Schema(description = "存储配置,配置是动态参数,所以使用 Map 接收", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "存储配置不能为空") + private Map config; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/file/vo/config/FileConfigPageReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/file/vo/config/FileConfigPageReqVO.java new file mode 100644 index 0000000..27fd69f --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/file/vo/config/FileConfigPageReqVO.java @@ -0,0 +1,30 @@ +package com.win.module.infra.controller.file.vo.config; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 文件配置分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class FileConfigPageReqVO extends PageParam { + + @Schema(description = "配置名", example = "S3 - 阿里云") + private String name; + + @Schema(description = "存储器", example = "1") + private Integer storage; + + @Schema(description = "创建时间", example = "[2022-07-01 00:00:00, 2022-07-01 23:59:59]") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/file/vo/config/FileConfigRespVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/file/vo/config/FileConfigRespVO.java new file mode 100644 index 0000000..0821985 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/file/vo/config/FileConfigRespVO.java @@ -0,0 +1,35 @@ +package com.win.module.infra.controller.file.vo.config; + +import com.win.framework.file.core.client.FileClientConfig; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 文件配置 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class FileConfigRespVO extends FileConfigBaseVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long id; + + @Schema(description = "存储器,参见 FileStorageEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "存储器不能为空") + private Integer storage; + + @Schema(description = "是否为主配置", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") + @NotNull(message = "是否为主配置不能为空") + private Boolean master; + + @Schema(description = "存储配置", requiredMode = Schema.RequiredMode.REQUIRED) + private FileClientConfig config; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/file/vo/config/FileConfigUpdateReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/file/vo/config/FileConfigUpdateReqVO.java new file mode 100644 index 0000000..418ff8f --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/file/vo/config/FileConfigUpdateReqVO.java @@ -0,0 +1,25 @@ +package com.win.module.infra.controller.file.vo.config; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; +import java.util.Map; + +@Schema(description = "管理后台 - 文件配置更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class FileConfigUpdateReqVO extends FileConfigBaseVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "编号不能为空") + private Long id; + + @Schema(description = "存储配置,配置是动态参数,所以使用 Map 接收", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "存储配置不能为空") + private Map config; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/file/vo/file/FileListReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/file/vo/file/FileListReqVO.java new file mode 100644 index 0000000..644c8fc --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/file/vo/file/FileListReqVO.java @@ -0,0 +1,18 @@ +package com.win.module.infra.controller.file.vo.file; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +@Schema(description = "管理后台 - 文件分页 Request VO") +@Data +@ToString(callSuper = true) +public class FileListReqVO { + + @Schema(description = "表名", example = "infraTrends") + private String tableName; + + @Schema(description = "表数据id", example = "9210") + private Long tableId; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/file/vo/file/FilePageReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/file/vo/file/FilePageReqVO.java new file mode 100644 index 0000000..ecde578 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/file/vo/file/FilePageReqVO.java @@ -0,0 +1,36 @@ +package com.win.module.infra.controller.file.vo.file; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 文件分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class FilePageReqVO extends PageParam { + + @Schema(description = "文件路径,模糊匹配", example = "win") + private String path; + + @Schema(description = "文件类型,模糊匹配", example = "jpg") + private String type; + + @Schema(description = "创建时间", example = "[2022-07-01 00:00:00, 2022-07-01 23:59:59]") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "表名", example = "infraTrends") + private String tableName; + + @Schema(description = "表数据id", example = "9210") + private Long tableId; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/file/vo/file/FileRespVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/file/vo/file/FileRespVO.java new file mode 100644 index 0000000..c8085cc --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/file/vo/file/FileRespVO.java @@ -0,0 +1,51 @@ +package com.win.module.infra.controller.file.vo.file; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 文件 Response VO,不返回 content 字段,太大") +@Data +public class FileRespVO { + + @Schema(description = "文件编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "配置编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "11") + private Long configId; + + @Schema(description = "文件路径", requiredMode = Schema.RequiredMode.REQUIRED, example = "win.jpg") + private String path; + + @Schema(description = "原文件名", requiredMode = Schema.RequiredMode.REQUIRED, example = "win.jpg") + private String name; + + @Schema(description = "文件 URL", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/win.jpg") + private String url; + + @Schema(description = "文件MIME类型", example = "application/octet-stream") + private String type; + + @Schema(description = "文件大小", example = "2048", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer size; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + + @Schema(description = "表名", requiredMode = Schema.RequiredMode.REQUIRED) + private String tableName; + + @Schema(description = "表数据id", requiredMode = Schema.RequiredMode.REQUIRED) + private Long tableId; + + @Schema(description = "用户id") + private String creator; + + @Schema(description = "用户昵称") + private String nickname; + + @Schema(description = "用户头像") + private String avatar; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/file/vo/file/FileUploadReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/file/vo/file/FileUploadReqVO.java new file mode 100644 index 0000000..312b60f --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/file/vo/file/FileUploadReqVO.java @@ -0,0 +1,28 @@ +package com.win.module.infra.controller.file.vo.file; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.web.multipart.MultipartFile; + +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 上传文件 Request VO") +@Data +public class FileUploadReqVO { + + @Schema(description = "文件附件", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "文件附件不能为空") + private MultipartFile file; + + @Schema(description = "文件附件", example = "winyuanma.png") + private String path; + + @Schema(description = "表名", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "表名不能为空") + private String tableName; + + @Schema(description = "表数据id", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "表数据id不能为空") + private Long tableId; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/JobController.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/JobController.java new file mode 100644 index 0000000..2a37a64 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/JobController.java @@ -0,0 +1,145 @@ +package com.win.module.infra.controller.job; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.excel.core.util.ExcelUtils; +import com.win.framework.operatelog.core.annotations.OperateLog; +import com.win.framework.quartz.core.util.CronUtils; +import com.win.module.infra.controller.job.vo.job.*; +import com.win.module.infra.convert.job.JobConvert; +import com.win.module.infra.dal.dataobject.job.JobDO; +import com.win.module.infra.service.job.JobService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.quartz.SchedulerException; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.time.LocalDateTime; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +import static com.win.framework.common.pojo.CommonResult.success; +import static com.win.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 定时任务") +@RestController +@RequestMapping("/infra/job") +@Validated +public class JobController { + + @Resource + private JobService jobService; + + @PostMapping("/create") + @Operation(summary = "创建定时任务") + @PreAuthorize("@ss.hasPermission('infra:job:create')") + public CommonResult createJob(@Valid @RequestBody JobCreateReqVO createReqVO) + throws SchedulerException { + return success(jobService.createJob(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新定时任务") + @PreAuthorize("@ss.hasPermission('infra:job:update')") + public CommonResult updateJob(@Valid @RequestBody JobUpdateReqVO updateReqVO) + throws SchedulerException { + jobService.updateJob(updateReqVO); + return success(true); + } + + @PutMapping("/update-status") + @Operation(summary = "更新定时任务的状态") + @Parameters({ + @Parameter(name = "id", description = "编号", required = true, example = "1024"), + @Parameter(name = "status", description = "状态", required = true, example = "1"), + }) + @PreAuthorize("@ss.hasPermission('infra:job:update')") + public CommonResult updateJobStatus(@RequestParam(value = "id") Long id, @RequestParam("status") Integer status) + throws SchedulerException { + jobService.updateJobStatus(id, status); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除定时任务") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('infra:job:delete')") + public CommonResult deleteJob(@RequestParam("id") Long id) + throws SchedulerException { + jobService.deleteJob(id); + return success(true); + } + + @PutMapping("/trigger") + @Operation(summary = "触发定时任务") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('infra:job:trigger')") + public CommonResult triggerJob(@RequestParam("id") Long id) throws SchedulerException { + jobService.triggerJob(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得定时任务") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('infra:job:query')") + public CommonResult getJob(@RequestParam("id") Long id) { + JobDO job = jobService.getJob(id); + return success(JobConvert.INSTANCE.convert(job)); + } + + @GetMapping("/list") + @Operation(summary = "获得定时任务列表") + @Parameter(name = "ids", description = "编号列表", required = true) + @PreAuthorize("@ss.hasPermission('infra:job:query')") + public CommonResult> getJobList(@RequestParam("ids") Collection ids) { + List list = jobService.getJobList(ids); + return success(JobConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得定时任务分页") + @PreAuthorize("@ss.hasPermission('infra:job:query')") + public CommonResult> getJobPage(@Valid JobPageReqVO pageVO) { + PageResult pageResult = jobService.getJobPage(pageVO); + return success(JobConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出定时任务 Excel") + @PreAuthorize("@ss.hasPermission('infra:job:export')") + @OperateLog(type = EXPORT) + public void exportJobExcel(@Valid JobExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = jobService.getJobList(exportReqVO); + // 导出 Excel + List datas = JobConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "定时任务.xls", "数据", JobExcelVO.class, datas); + } + + @GetMapping("/get_next_times") + @Operation(summary = "获得定时任务的下 n 次执行时间") + @Parameters({ + @Parameter(name = "id", description = "编号", required = true, example = "1024"), + @Parameter(name = "count", description = "数量", example = "5") + }) + @PreAuthorize("@ss.hasPermission('infra:job:query')") + public CommonResult> getJobNextTimes(@RequestParam("id") Long id, + @RequestParam(value = "count", required = false, defaultValue = "5") Integer count) { + JobDO job = jobService.getJob(id); + if (job == null) { + return success(Collections.emptyList()); + } + return success(CronUtils.getNextTimes(job.getCronExpression(), count)); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/JobLogController.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/JobLogController.java new file mode 100644 index 0000000..4729c60 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/JobLogController.java @@ -0,0 +1,81 @@ +package com.win.module.infra.controller.job; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.excel.core.util.ExcelUtils; +import com.win.framework.operatelog.core.annotations.OperateLog; +import com.win.module.infra.controller.job.vo.log.JobLogExcelVO; +import com.win.module.infra.controller.job.vo.log.JobLogExportReqVO; +import com.win.module.infra.controller.job.vo.log.JobLogPageReqVO; +import com.win.module.infra.controller.job.vo.log.JobLogRespVO; +import com.win.module.infra.convert.job.JobLogConvert; +import com.win.module.infra.dal.dataobject.job.JobLogDO; +import com.win.module.infra.service.job.JobLogService; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.Collection; +import java.util.List; + +import static com.win.framework.common.pojo.CommonResult.success; +import static com.win.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 定时任务日志") +@RestController +@RequestMapping("/infra/job-log") +@Validated +public class JobLogController { + + @Resource + private JobLogService jobLogService; + + @GetMapping("/get") + @Operation(summary = "获得定时任务日志") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('infra:job:query')") + public CommonResult getJobLog(@RequestParam("id") Long id) { + JobLogDO jobLog = jobLogService.getJobLog(id); + return success(JobLogConvert.INSTANCE.convert(jobLog)); + } + + @GetMapping("/list") + @Operation(summary = "获得定时任务日志列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + @PreAuthorize("@ss.hasPermission('infra:job:query')") + public CommonResult> getJobLogList(@RequestParam("ids") Collection ids) { + List list = jobLogService.getJobLogList(ids); + return success(JobLogConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得定时任务日志分页") + @PreAuthorize("@ss.hasPermission('infra:job:query')") + public CommonResult> getJobLogPage(@Valid JobLogPageReqVO pageVO) { + PageResult pageResult = jobLogService.getJobLogPage(pageVO); + return success(JobLogConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出定时任务日志 Excel") + @PreAuthorize("@ss.hasPermission('infra:job:export')") + @OperateLog(type = EXPORT) + public void exportJobLogExcel(@Valid JobLogExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = jobLogService.getJobLogList(exportReqVO); + // 导出 Excel + List datas = JobLogConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "任务日志.xls", "数据", JobLogExcelVO.class, datas); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/vo/job/JobBaseVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/vo/job/JobBaseVO.java new file mode 100644 index 0000000..229df58 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/vo/job/JobBaseVO.java @@ -0,0 +1,37 @@ +package com.win.module.infra.controller.job.vo.job; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** +* 定时任务 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class JobBaseVO { + + @Schema(description = "任务名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "测试任务") + @NotNull(message = "任务名称不能为空") + private String name; + + @Schema(description = "处理器的参数", example = "win") + private String handlerParam; + + @Schema(description = "CRON 表达式", requiredMode = Schema.RequiredMode.REQUIRED, example = "0/10 * * * * ? *") + @NotNull(message = "CRON 表达式不能为空") + private String cronExpression; + + @Schema(description = "重试次数", requiredMode = Schema.RequiredMode.REQUIRED, example = "3") + @NotNull(message = "重试次数不能为空") + private Integer retryCount; + + @Schema(description = "重试间隔", requiredMode = Schema.RequiredMode.REQUIRED, example = "1000") + @NotNull(message = "重试间隔不能为空") + private Integer retryInterval; + + @Schema(description = "监控超时时间", example = "1000") + private Integer monitorTimeout; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/vo/job/JobCreateReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/vo/job/JobCreateReqVO.java new file mode 100644 index 0000000..a198d32 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/vo/job/JobCreateReqVO.java @@ -0,0 +1,20 @@ +package com.win.module.infra.controller.job.vo.job; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 定时任务创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class JobCreateReqVO extends JobBaseVO { + + @Schema(description = "处理器的名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "sysUserSessionTimeoutJob") + @NotNull(message = "处理器的名字不能为空") + private String handlerName; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/vo/job/JobExcelVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/vo/job/JobExcelVO.java new file mode 100644 index 0000000..8b03646 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/vo/job/JobExcelVO.java @@ -0,0 +1,56 @@ +package com.win.module.infra.controller.job.vo.job; + +import com.win.framework.excel.core.annotations.DictFormat; +import com.win.framework.excel.core.convert.DictConvert; +import com.win.module.infra.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 定时任务 Excel VO + * + * @author 闻荫源码 + */ +@Data +public class JobExcelVO { + + @ExcelProperty("任务编号") + private Long id; + + @ExcelProperty("任务名称") + private String name; + + @ExcelProperty(value = "任务状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.JOB_STATUS) + private Integer status; + + @ExcelProperty("处理器的名字") + private String handlerName; + + @ExcelProperty("处理器的参数") + private String handlerParam; + + @ExcelProperty("CRON 表达式") + private String cronExpression; + + @ExcelProperty("最后一次执行的开始时间") + private LocalDateTime executeBeginTime; + + @ExcelProperty("最后一次执行的结束时间") + private LocalDateTime executeEndTime; + + @ExcelProperty("上一次触发时间") + private LocalDateTime firePrevTime; + + @ExcelProperty("下一次触发时间") + private LocalDateTime fireNextTime; + + @ExcelProperty("监控超时时间") + private Integer monitorTimeout; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/vo/job/JobExportReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/vo/job/JobExportReqVO.java new file mode 100644 index 0000000..2ad3acd --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/vo/job/JobExportReqVO.java @@ -0,0 +1,19 @@ +package com.win.module.infra.controller.job.vo.job; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 定时任务 Excel 导出 Request VO-参数和 JobPageReqVO 是一致的") +@Data +public class JobExportReqVO { + + @Schema(description = "任务名称-模糊匹配", example = "测试任务") + private String name; + + @Schema(description = "任务状态-参见 JobStatusEnum 枚举", example = "1") + private Integer status; + + @Schema(description = "处理器的名字-模糊匹配", example = "UserSessionTimeoutJob") + private String handlerName; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/vo/job/JobPageReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/vo/job/JobPageReqVO.java new file mode 100644 index 0000000..3719faf --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/vo/job/JobPageReqVO.java @@ -0,0 +1,24 @@ +package com.win.module.infra.controller.job.vo.job; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Schema(description = "管理后台 - 定时任务分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class JobPageReqVO extends PageParam { + + @Schema(description = "任务名称,模糊匹配", example = "测试任务") + private String name; + + @Schema(description = "任务状态,参见 JobStatusEnum 枚举", example = "1") + private Integer status; + + @Schema(description = "处理器的名字,模糊匹配", example = "sysUserSessionTimeoutJob") + private String handlerName; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/vo/job/JobRespVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/vo/job/JobRespVO.java new file mode 100644 index 0000000..427a7f9 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/vo/job/JobRespVO.java @@ -0,0 +1,30 @@ +package com.win.module.infra.controller.job.vo.job; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 定时任务 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class JobRespVO extends JobBaseVO { + + @Schema(description = "任务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "任务状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer status; + + @Schema(description = "处理器的名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "sysUserSessionTimeoutJob") + @NotNull(message = "处理器的名字不能为空") + private String handlerName; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/vo/job/JobUpdateReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/vo/job/JobUpdateReqVO.java new file mode 100644 index 0000000..49b748b --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/vo/job/JobUpdateReqVO.java @@ -0,0 +1,20 @@ +package com.win.module.infra.controller.job.vo.job; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 定时任务更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class JobUpdateReqVO extends JobBaseVO { + + @Schema(description = "任务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "任务编号不能为空") + private Long id; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/vo/log/JobLogBaseVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/vo/log/JobLogBaseVO.java new file mode 100644 index 0000000..e31a149 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/vo/log/JobLogBaseVO.java @@ -0,0 +1,53 @@ +package com.win.module.infra.controller.job.vo.log; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +/** +* 定时任务日志 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class JobLogBaseVO { + + @Schema(description = "任务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "任务编号不能为空") + private Long jobId; + + @Schema(description = "处理器的名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "sysUserSessionTimeoutJob") + @NotNull(message = "处理器的名字不能为空") + private String handlerName; + + @Schema(description = "处理器的参数", example = "win") + private String handlerParam; + + @Schema(description = "第几次执行", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "第几次执行不能为空") + private Integer executeIndex; + + @Schema(description = "开始执行时间", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "开始执行时间不能为空") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime beginTime; + + @Schema(description = "结束执行时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime endTime; + + @Schema(description = "执行时长", example = "123") + private Integer duration; + + @Schema(description = "任务状态,参见 JobLogStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "任务状态不能为空") + private Integer status; + + @Schema(description = "结果数据", example = "执行成功") + private String result; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/vo/log/JobLogExcelVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/vo/log/JobLogExcelVO.java new file mode 100644 index 0000000..b783214 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/vo/log/JobLogExcelVO.java @@ -0,0 +1,53 @@ +package com.win.module.infra.controller.job.vo.log; + +import com.win.framework.excel.core.annotations.DictFormat; +import com.win.framework.excel.core.convert.DictConvert; +import com.win.module.infra.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 定时任务 Excel VO + * + * @author 芋艿 + */ +@Data +public class JobLogExcelVO { + + @ExcelProperty("日志编号") + private Long id; + + @ExcelProperty("任务编号") + private Long jobId; + + @ExcelProperty("处理器的名字") + private String handlerName; + + @ExcelProperty("处理器的参数") + private String handlerParam; + + @ExcelProperty("第几次执行") + private Integer executeIndex; + + @ExcelProperty("开始执行时间") + private LocalDateTime beginTime; + + @ExcelProperty("结束执行时间") + private LocalDateTime endTime; + + @ExcelProperty("执行时长") + private Integer duration; + + @ExcelProperty(value = "任务状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.JOB_STATUS) + private Integer status; + + @ExcelProperty("结果数据") + private String result; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/vo/log/JobLogExportReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/vo/log/JobLogExportReqVO.java new file mode 100644 index 0000000..763578f --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/vo/log/JobLogExportReqVO.java @@ -0,0 +1,32 @@ +package com.win.module.infra.controller.job.vo.log; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 定时任务 Excel 导出 Request VO,参数和 JobLogPageReqVO 是一致的") +@Data +public class JobLogExportReqVO { + + @Schema(description = "任务编号", example = "10") + private Long jobId; + + @Schema(description = "处理器的名字,模糊匹配") + private String handlerName; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @Schema(description = "开始执行时间") + private LocalDateTime beginTime; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @Schema(description = "结束执行时间") + private LocalDateTime endTime; + + @Schema(description = "任务状态,参见 JobLogStatusEnum 枚举") + private Integer status; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/vo/log/JobLogPageReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/vo/log/JobLogPageReqVO.java new file mode 100644 index 0000000..a78af44 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/vo/log/JobLogPageReqVO.java @@ -0,0 +1,37 @@ +package com.win.module.infra.controller.job.vo.log; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 定时任务日志分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class JobLogPageReqVO extends PageParam { + + @Schema(description = "任务编号", example = "10") + private Long jobId; + + @Schema(description = "处理器的名字,模糊匹配") + private String handlerName; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @Schema(description = "开始执行时间") + private LocalDateTime beginTime; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @Schema(description = "结束执行时间") + private LocalDateTime endTime; + + @Schema(description = "任务状态,参见 JobLogStatusEnum 枚举") + private Integer status; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/vo/log/JobLogRespVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/vo/log/JobLogRespVO.java new file mode 100644 index 0000000..22c3a5c --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/vo/log/JobLogRespVO.java @@ -0,0 +1,22 @@ +package com.win.module.infra.controller.job.vo.log; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 定时任务日志 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class JobLogRespVO extends JobLogBaseVO { + + @Schema(description = "日志编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/logger/ApiAccessLogController.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/logger/ApiAccessLogController.java new file mode 100644 index 0000000..e633ece --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/logger/ApiAccessLogController.java @@ -0,0 +1,60 @@ +package com.win.module.infra.controller.logger; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.excel.core.util.ExcelUtils; +import com.win.framework.operatelog.core.annotations.OperateLog; +import com.win.module.infra.controller.logger.vo.apiaccesslog.ApiAccessLogExcelVO; +import com.win.module.infra.controller.logger.vo.apiaccesslog.ApiAccessLogExportReqVO; +import com.win.module.infra.controller.logger.vo.apiaccesslog.ApiAccessLogPageReqVO; +import com.win.module.infra.controller.logger.vo.apiaccesslog.ApiAccessLogRespVO; +import com.win.module.infra.convert.logger.ApiAccessLogConvert; +import com.win.module.infra.dal.dataobject.logger.ApiAccessLogDO; +import com.win.module.infra.service.logger.ApiAccessLogService; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static com.win.framework.common.pojo.CommonResult.success; +import static com.win.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - API 访问日志") +@RestController +@RequestMapping("/infra/api-access-log") +@Validated +public class ApiAccessLogController { + + @Resource + private ApiAccessLogService apiAccessLogService; + + @GetMapping("/page") + @Operation(summary = "获得API 访问日志分页") + @PreAuthorize("@ss.hasPermission('infra:api-access-log:query')") + public CommonResult> getApiAccessLogPage(@Valid ApiAccessLogPageReqVO pageVO) { + PageResult pageResult = apiAccessLogService.getApiAccessLogPage(pageVO); + return success(ApiAccessLogConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出API 访问日志 Excel") + @PreAuthorize("@ss.hasPermission('infra:api-access-log:export')") + @OperateLog(type = EXPORT) + public void exportApiAccessLogExcel(@Valid ApiAccessLogExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = apiAccessLogService.getApiAccessLogList(exportReqVO); + // 导出 Excel + List datas = ApiAccessLogConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "API 访问日志.xls", "数据", ApiAccessLogExcelVO.class, datas); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/logger/ApiErrorLogController.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/logger/ApiErrorLogController.java new file mode 100644 index 0000000..3c6f33f --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/logger/ApiErrorLogController.java @@ -0,0 +1,74 @@ +package com.win.module.infra.controller.logger; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.excel.core.util.ExcelUtils; +import com.win.framework.operatelog.core.annotations.OperateLog; +import com.win.module.infra.controller.logger.vo.apierrorlog.ApiErrorLogExcelVO; +import com.win.module.infra.controller.logger.vo.apierrorlog.ApiErrorLogExportReqVO; +import com.win.module.infra.controller.logger.vo.apierrorlog.ApiErrorLogPageReqVO; +import com.win.module.infra.controller.logger.vo.apierrorlog.ApiErrorLogRespVO; +import com.win.module.infra.convert.logger.ApiErrorLogConvert; +import com.win.module.infra.dal.dataobject.logger.ApiErrorLogDO; +import com.win.module.infra.service.logger.ApiErrorLogService; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.Operation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static com.win.framework.common.pojo.CommonResult.success; +import static com.win.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + +@Tag(name = "管理后台 - API 错误日志") +@RestController +@RequestMapping("/infra/api-error-log") +@Validated +public class ApiErrorLogController { + + @Resource + private ApiErrorLogService apiErrorLogService; + + @PutMapping("/update-status") + @Operation(summary = "更新 API 错误日志的状态") + @Parameters({ + @Parameter(name = "id", description = "编号", required = true, example = "1024"), + @Parameter(name = "processStatus", description = "处理状态", required = true, example = "1") + }) + @PreAuthorize("@ss.hasPermission('infra:api-error-log:update-status')") + public CommonResult updateApiErrorLogProcess(@RequestParam("id") Long id, + @RequestParam("processStatus") Integer processStatus) { + apiErrorLogService.updateApiErrorLogProcess(id, processStatus, getLoginUserId()); + return success(true); + } + + @GetMapping("/page") + @Operation(summary = "获得 API 错误日志分页") + @PreAuthorize("@ss.hasPermission('infra:api-error-log:query')") + public CommonResult> getApiErrorLogPage(@Valid ApiErrorLogPageReqVO pageVO) { + PageResult pageResult = apiErrorLogService.getApiErrorLogPage(pageVO); + return success(ApiErrorLogConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出 API 错误日志 Excel") + @PreAuthorize("@ss.hasPermission('infra:api-error-log:export')") + @OperateLog(type = EXPORT) + public void exportApiErrorLogExcel(@Valid ApiErrorLogExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = apiErrorLogService.getApiErrorLogList(exportReqVO); + // 导出 Excel + List datas = ApiErrorLogConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "API 错误日志.xls", "数据", ApiErrorLogExcelVO.class, datas); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/logger/vo/apiaccesslog/ApiAccessLogBaseVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/logger/vo/apiaccesslog/ApiAccessLogBaseVO.java new file mode 100644 index 0000000..c22ebe1 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/logger/vo/apiaccesslog/ApiAccessLogBaseVO.java @@ -0,0 +1,71 @@ +package com.win.module.infra.controller.logger.vo.apiaccesslog; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +/** +* API 访问日志 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class ApiAccessLogBaseVO { + + @Schema(description = "链路追踪编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "66600cb6-7852-11eb-9439-0242ac130002") + @NotNull(message = "链路追踪编号不能为空") + private String traceId; + + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "666") + @NotNull(message = "用户编号不能为空") + private Long userId; + + @Schema(description = "应用名", requiredMode = Schema.RequiredMode.REQUIRED, example = "dashboard") + @NotNull(message = "应用名不能为空") + private String applicationName; + + @Schema(description = "请求方法名", requiredMode = Schema.RequiredMode.REQUIRED, example = "GET") + @NotNull(message = "请求方法名不能为空") + private String requestMethod; + + @Schema(description = "请求地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "/xxx/yyy") + @NotNull(message = "请求地址不能为空") + private String requestUrl; + + @Schema(description = "请求参数") + private String requestParams; + + @Schema(description = "用户 IP", requiredMode = Schema.RequiredMode.REQUIRED, example = "127.0.0.1") + @NotNull(message = "用户 IP不能为空") + private String userIp; + + @Schema(description = "浏览器 UA", requiredMode = Schema.RequiredMode.REQUIRED, example = "Mozilla/5.0") + @NotNull(message = "浏览器 UA不能为空") + private String userAgent; + + @Schema(description = "开始请求时间", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "开始请求时间不能为空") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime beginTime; + + @Schema(description = "结束请求时间", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "结束请求时间不能为空") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime endTime; + + @Schema(description = "执行时长", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") + @NotNull(message = "执行时长不能为空") + private Integer duration; + + @Schema(description = "结果码", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") + @NotNull(message = "结果码不能为空") + private Integer resultCode; + + @Schema(description = "结果提示", example = "闻荫源码,牛逼!") + private String resultMsg; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/logger/vo/apiaccesslog/ApiAccessLogExcelVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/logger/vo/apiaccesslog/ApiAccessLogExcelVO.java new file mode 100644 index 0000000..7f9a0d7 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/logger/vo/apiaccesslog/ApiAccessLogExcelVO.java @@ -0,0 +1,58 @@ +package com.win.module.infra.controller.logger.vo.apiaccesslog; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * API 访问日志 Excel VO + * + * @author 闻荫源码 + */ +@Data +public class ApiAccessLogExcelVO { + + @ExcelProperty("日志主键") + private Long id; + + @ExcelProperty("链路追踪编号") + private String traceId; + + @ExcelProperty("用户编号") + private Long userId; + + @ExcelProperty("应用名") + private String applicationName; + + @ExcelProperty("请求方法名") + private String requestMethod; + + @ExcelProperty("请求地址") + private String requestUrl; + + @ExcelProperty("请求参数") + private String requestParams; + + @ExcelProperty("用户 IP") + private String userIp; + + @ExcelProperty("浏览器 UA") + private String userAgent; + + @ExcelProperty("开始请求时间") + private LocalDateTime beginTime; + + @ExcelProperty("结束请求时间") + private LocalDateTime endTime; + + @ExcelProperty("执行时长") + private Integer duration; + + @ExcelProperty("结果码") + private Integer resultCode; + + @ExcelProperty("结果提示") + private String resultMsg; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/logger/vo/apiaccesslog/ApiAccessLogExportReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/logger/vo/apiaccesslog/ApiAccessLogExportReqVO.java new file mode 100644 index 0000000..b068ba8 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/logger/vo/apiaccesslog/ApiAccessLogExportReqVO.java @@ -0,0 +1,34 @@ +package com.win.module.infra.controller.logger.vo.apiaccesslog; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - API 访问日志 Excel 导出 Request VO,参数和 ApiAccessLogPageReqVO 是一致的") +@Data +public class ApiAccessLogExportReqVO { + + @Schema(description = "用户编号", example = "666") + private Long userId; + + @Schema(description = "应用名", example = "dashboard") + private String applicationName; + + @Schema(description = "请求地址,模糊匹配", example = "/xxx/yyy") + private String requestUrl; + + @Schema(description = "开始时间", example = "[2022-07-01 00:00:00, 2022-07-01 23:59:59]") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] beginTime; + + @Schema(description = "执行时长,大于等于,单位:毫秒", example = "100") + private Integer duration; + + @Schema(description = "结果码", example = "0") + private Integer resultCode; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/logger/vo/apiaccesslog/ApiAccessLogPageReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/logger/vo/apiaccesslog/ApiAccessLogPageReqVO.java new file mode 100644 index 0000000..3115965 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/logger/vo/apiaccesslog/ApiAccessLogPageReqVO.java @@ -0,0 +1,39 @@ +package com.win.module.infra.controller.logger.vo.apiaccesslog; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - API 访问日志分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ApiAccessLogPageReqVO extends PageParam { + + @Schema(description = "用户编号", example = "666") + private Long userId; + + @Schema(description = "应用名", example = "dashboard") + private String applicationName; + + @Schema(description = "请求地址,模糊匹配", example = "/xxx/yyy") + private String requestUrl; + + @Schema(description = "开始时间", example = "[2022-07-01 00:00:00, 2022-07-01 23:59:59]") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] beginTime; + + @Schema(description = "执行时长,大于等于,单位:毫秒", example = "100") + private Integer duration; + + @Schema(description = "结果码", example = "0") + private Integer resultCode; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/logger/vo/apiaccesslog/ApiAccessLogRespVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/logger/vo/apiaccesslog/ApiAccessLogRespVO.java new file mode 100644 index 0000000..f38ba01 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/logger/vo/apiaccesslog/ApiAccessLogRespVO.java @@ -0,0 +1,22 @@ +package com.win.module.infra.controller.logger.vo.apiaccesslog; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - API 访问日志 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ApiAccessLogRespVO extends ApiAccessLogBaseVO { + + @Schema(description = "日志主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/logger/vo/apierrorlog/ApiErrorLogBaseVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/logger/vo/apierrorlog/ApiErrorLogBaseVO.java new file mode 100644 index 0000000..6acab57 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/logger/vo/apierrorlog/ApiErrorLogBaseVO.java @@ -0,0 +1,91 @@ +package com.win.module.infra.controller.logger.vo.apierrorlog; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +/** +* API 错误日志 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class ApiErrorLogBaseVO { + + @Schema(description = "链路追踪编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "66600cb6-7852-11eb-9439-0242ac130002") + @NotNull(message = "链路追踪编号不能为空") + private String traceId; + + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "666") + @NotNull(message = "用户编号不能为空") + private Integer userId; + + @Schema(description = "应用名", requiredMode = Schema.RequiredMode.REQUIRED, example = "dashboard") + @NotNull(message = "应用名不能为空") + private String applicationName; + + @Schema(description = "请求方法名", requiredMode = Schema.RequiredMode.REQUIRED, example = "GET") + @NotNull(message = "请求方法名不能为空") + private String requestMethod; + + @Schema(description = "请求地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "/xx/yy") + @NotNull(message = "请求地址不能为空") + private String requestUrl; + + @Schema(description = "请求参数", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "请求参数不能为空") + private String requestParams; + + @Schema(description = "用户 IP", requiredMode = Schema.RequiredMode.REQUIRED, example = "127.0.0.1") + @NotNull(message = "用户 IP不能为空") + private String userIp; + + @Schema(description = "浏览器 UA", requiredMode = Schema.RequiredMode.REQUIRED, example = "Mozilla/5.0") + @NotNull(message = "浏览器 UA不能为空") + private String userAgent; + + @Schema(description = "异常发生时间", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "异常发生时间不能为空") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime exceptionTime; + + @Schema(description = "异常名", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "异常名不能为空") + private String exceptionName; + + @Schema(description = "异常导致的消息", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "异常导致的消息不能为空") + private String exceptionMessage; + + @Schema(description = "异常导致的根消息", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "异常导致的根消息不能为空") + private String exceptionRootCauseMessage; + + @Schema(description = "异常的栈轨迹", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "异常的栈轨迹不能为空") + private String exceptionStackTrace; + + @Schema(description = "异常发生的类全名", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "异常发生的类全名不能为空") + private String exceptionClassName; + + @Schema(description = "异常发生的类文件", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "异常发生的类文件不能为空") + private String exceptionFileName; + + @Schema(description = "异常发生的方法名", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "异常发生的方法名不能为空") + private String exceptionMethodName; + + @Schema(description = "异常发生的方法所在行", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "异常发生的方法所在行不能为空") + private Integer exceptionLineNumber; + + @Schema(description = "处理状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") + @NotNull(message = "处理状态不能为空") + private Integer processStatus; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/logger/vo/apierrorlog/ApiErrorLogExcelVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/logger/vo/apierrorlog/ApiErrorLogExcelVO.java new file mode 100644 index 0000000..d506a44 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/logger/vo/apierrorlog/ApiErrorLogExcelVO.java @@ -0,0 +1,86 @@ +package com.win.module.infra.controller.logger.vo.apierrorlog; + +import com.win.framework.excel.core.annotations.DictFormat; +import com.win.framework.excel.core.convert.DictConvert; +import com.win.module.infra.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * API 错误日志 Excel VO + * + * @author 闻荫源码 + */ +@Data +public class ApiErrorLogExcelVO { + + @ExcelProperty("编号") + private Integer id; + + @ExcelProperty("链路追踪编号") + private String traceId; + + @ExcelProperty("用户编号") + private Integer userId; + + @ExcelProperty("应用名") + private String applicationName; + + @ExcelProperty("请求方法名") + private String requestMethod; + + @ExcelProperty("请求地址") + private String requestUrl; + + @ExcelProperty("请求参数") + private String requestParams; + + @ExcelProperty("用户 IP") + private String userIp; + + @ExcelProperty("浏览器 UA") + private String userAgent; + + @ExcelProperty("异常发生时间") + private LocalDateTime exceptionTime; + + @ExcelProperty("异常名") + private String exceptionName; + + @ExcelProperty("异常导致的消息") + private String exceptionMessage; + + @ExcelProperty("异常导致的根消息") + private String exceptionRootCauseMessage; + + @ExcelProperty("异常的栈轨迹") + private String exceptionStackTrace; + + @ExcelProperty("异常发生的类全名") + private String exceptionClassName; + + @ExcelProperty("异常发生的类文件") + private String exceptionFileName; + + @ExcelProperty("异常发生的方法名") + private String exceptionMethodName; + + @ExcelProperty("异常发生的方法所在行") + private Integer exceptionLineNumber; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @ExcelProperty(value = "处理状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.API_ERROR_LOG_PROCESS_STATUS) + private Integer processStatus; + + @ExcelProperty("处理时间") + private LocalDateTime processTime; + + @ExcelProperty("处理用户编号") + private Integer processUserId; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/logger/vo/apierrorlog/ApiErrorLogExportReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/logger/vo/apierrorlog/ApiErrorLogExportReqVO.java new file mode 100644 index 0000000..85f3628 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/logger/vo/apierrorlog/ApiErrorLogExportReqVO.java @@ -0,0 +1,31 @@ +package com.win.module.infra.controller.logger.vo.apierrorlog; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - API 错误日志 Excel 导出 Request VO,参数和 ApiErrorLogPageReqVO 是一致的") +@Data +public class ApiErrorLogExportReqVO { + + @Schema(description = "用户编号", example = "666") + private Long userId; + + @Schema(description = "应用名", example = "dashboard") + private String applicationName; + + @Schema(description = "请求地址", example = "/xx/yy") + private String requestUrl; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @Schema(description = "异常发生时间") + private LocalDateTime[] exceptionTime; + + @Schema(description = "处理状态", example = "0") + private Integer processStatus; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/logger/vo/apierrorlog/ApiErrorLogPageReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/logger/vo/apierrorlog/ApiErrorLogPageReqVO.java new file mode 100644 index 0000000..793d9d8 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/logger/vo/apierrorlog/ApiErrorLogPageReqVO.java @@ -0,0 +1,36 @@ +package com.win.module.infra.controller.logger.vo.apierrorlog; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - API 错误日志分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ApiErrorLogPageReqVO extends PageParam { + + @Schema(description = "用户编号", example = "666") + private Long userId; + + @Schema(description = "应用名", example = "dashboard") + private String applicationName; + + @Schema(description = "请求地址", example = "/xx/yy") + private String requestUrl; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @Schema(description = "异常发生时间") + private LocalDateTime[] exceptionTime; + + @Schema(description = "处理状态", example = "0") + private Integer processStatus; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/logger/vo/apierrorlog/ApiErrorLogRespVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/logger/vo/apierrorlog/ApiErrorLogRespVO.java new file mode 100644 index 0000000..18bc31c --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/logger/vo/apierrorlog/ApiErrorLogRespVO.java @@ -0,0 +1,28 @@ +package com.win.module.infra.controller.logger.vo.apierrorlog; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - API 错误日志 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ApiErrorLogRespVO extends ApiErrorLogBaseVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Integer id; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + + @Schema(description = "处理时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime processTime; + + @Schema(description = "处理用户编号", example = "233") + private Integer processUserId; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/redis/RedisController.http b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/redis/RedisController.http new file mode 100644 index 0000000..8a0e70f --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/redis/RedisController.http @@ -0,0 +1,4 @@ +### 请求 /infra/redis/get-monitor-info 接口 => 成功 +GET {{baseUrl}}/infra/redis/get-monitor-info +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/redis/RedisController.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/redis/RedisController.java new file mode 100644 index 0000000..417ceff --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/redis/RedisController.java @@ -0,0 +1,86 @@ +package com.win.module.infra.controller.redis; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.operatelog.core.annotations.OperateLog; +import com.win.framework.redis.util.RedisCache; +import com.win.framework.security.core.LoginUser; +import com.win.framework.security.core.util.SecurityFrameworkUtils; +import com.win.module.infra.controller.redis.vo.RedisGetReqVo; +import com.win.module.infra.controller.redis.vo.RedisMonitorRespVO; +import com.win.module.infra.controller.redis.vo.RedisUpdateReqVo; +import com.win.module.infra.convert.redis.RedisConvert; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.data.redis.connection.RedisServerCommands; +import org.springframework.data.redis.core.RedisCallback; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.Properties; + +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - Redis 监控") +@RestController +@RequestMapping("/infra/redis") +public class RedisController { + + @Resource + private StringRedisTemplate stringRedisTemplate; + @Resource + private RedisCache redisCache; + + @GetMapping("/get-monitor-info") + @Operation(summary = "获得 Redis 监控信息") + @OperateLog(enable = false) + @PreAuthorize("@ss.hasPermission('infra:redis:get-monitor-info')") + public CommonResult getRedisMonitorInfo() { + // 获得 Redis 统计信息 + Properties info = stringRedisTemplate.execute((RedisCallback) RedisServerCommands::info); + Long dbSize = stringRedisTemplate.execute(RedisServerCommands::dbSize); + Properties commandStats = stringRedisTemplate.execute((RedisCallback) connection -> connection.info("commandstats")); + assert commandStats != null; // 断言,避免警告 + // 拼接结果返回 + return success(RedisConvert.INSTANCE.build(info, dbSize, commandStats)); + } + + /** + * 加入缓存 + */ + @PostMapping("/set") + @Operation(summary = "加入缓存") + @OperateLog(enable = false) + public CommonResult setRedisHash(@Valid @RequestBody RedisUpdateReqVo reqVO) { + LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); + redisCache.setCacheMapValue(reqVO.getKey(), String.valueOf(loginUser.getId()), reqVO.getValue()); + return success(Boolean.TRUE); + } + + /** + * 获取缓存 + */ + @GetMapping("/get") + @Operation(summary = "获取缓存") + @OperateLog(enable = false) + public CommonResult getRedisHash(@Valid RedisGetReqVo reqVO) { + LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); + String result = redisCache.getCacheMapValue(reqVO.getKey(), String.valueOf(loginUser.getId())); + return success(result); + } + + /** + * 删除缓存 + */ + @DeleteMapping("/delete") + @Operation(summary = "删除缓存") + @OperateLog(enable = false) + public CommonResult deleteRedisHash(@Valid RedisGetReqVo reqVO) { + LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); + Boolean result = redisCache.deleteCacheMapValue(reqVO.getKey(), String.valueOf(loginUser.getId())); + return success(result); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/redis/vo/RedisGetReqVo.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/redis/vo/RedisGetReqVo.java new file mode 100644 index 0000000..712bd4f --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/redis/vo/RedisGetReqVo.java @@ -0,0 +1,22 @@ +package com.win.module.infra.controller.redis.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; + +/** + * 个性化设置增加缓存接口 + */ +@Data +public class RedisGetReqVo { + + @Schema(description = "缓存键", requiredMode = Schema.RequiredMode.REQUIRED, example = "basic_itembasic") + @NotBlank(message = "缓存键不能为空") + @Pattern(regexp = "^[a-zA-Z0-9]{3,30}$", message = "缓存键账号由 数字、字母 组成") + @Size(min = 3, max = 30, message = "缓存键长度为 3-30 个字符") + private String key; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/redis/vo/RedisMonitorRespVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/redis/vo/RedisMonitorRespVO.java new file mode 100644 index 0000000..55377b7 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/redis/vo/RedisMonitorRespVO.java @@ -0,0 +1,43 @@ +package com.win.module.infra.controller.redis.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +import java.util.List; +import java.util.Properties; + +@Schema(description = "管理后台 - Redis 监控信息 Response VO") +@Data +@Builder +@AllArgsConstructor +public class RedisMonitorRespVO { + + @Schema(description = "Redis info 指令结果,具体字段,查看 Redis 文档", requiredMode = Schema.RequiredMode.REQUIRED) + private Properties info; + + @Schema(description = "Redis key 数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long dbSize; + + @Schema(description = "CommandStat 数组", requiredMode = Schema.RequiredMode.REQUIRED) + private List commandStats; + + @Schema(description = "Redis 命令统计结果") + @Data + @Builder + @AllArgsConstructor + public static class CommandStat { + + @Schema(description = "Redis 命令", requiredMode = Schema.RequiredMode.REQUIRED, example = "get") + private String command; + + @Schema(description = "调用次数", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long calls; + + @Schema(description = "消耗 CPU 秒数", requiredMode = Schema.RequiredMode.REQUIRED, example = "666") + private Long usec; + + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/redis/vo/RedisUpdateReqVo.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/redis/vo/RedisUpdateReqVo.java new file mode 100644 index 0000000..5cd3475 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/redis/vo/RedisUpdateReqVo.java @@ -0,0 +1,26 @@ +package com.win.module.infra.controller.redis.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; + +/** + * 个性化设置增加缓存接口 + */ +@Data +public class RedisUpdateReqVo { + + @Schema(description = "缓存键", requiredMode = Schema.RequiredMode.REQUIRED, example = "basic_itembasic") + @NotBlank(message = "缓存键不能为空") + @Pattern(regexp = "^[a-zA-Z0-9]{3,30}$", message = "缓存键账号由 数字、字母 组成") + @Size(min = 3, max = 30, message = "缓存键长度为 3-30 个字符") + private String key; + + @Schema(description = "缓存值", requiredMode = Schema.RequiredMode.REQUIRED, example = "个性化列表") + @NotBlank(message = "缓存值不能为空") + private String value; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/remark/RemarkController.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/remark/RemarkController.java new file mode 100644 index 0000000..bfd706d --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/remark/RemarkController.java @@ -0,0 +1,69 @@ +package com.win.module.infra.controller.remark; + +import com.win.framework.common.pojo.CommonResult; +import com.win.module.infra.controller.remark.vo.RemarkCreateReqVO; +import com.win.module.infra.controller.remark.vo.RemarkListReqVO; +import com.win.module.infra.controller.remark.vo.RemarkRespVO; +import com.win.module.infra.convert.remark.RemarkConvert; +import com.win.module.infra.dal.dataobject.remark.RemarkDO; +import com.win.module.infra.service.remark.RemarkService; +import com.win.module.system.api.user.AdminUserApi; +import com.win.module.system.api.user.dto.AdminUserRespDTO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.List; + +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 备注") +@RestController +@RequestMapping("/infra/remark") +@Validated +public class RemarkController { + + @Resource + private RemarkService remarkService; + + @Resource + private AdminUserApi adminUserApi; + + @PostMapping("/create") + @Operation(summary = "创建备注") + @PreAuthorize("@ss.hasPermission('infra:remark:create')") + public CommonResult createRemark(@Valid @RequestBody RemarkCreateReqVO createReqVO) { + return success(remarkService.createRemark(createReqVO)); + } + + @GetMapping("/get") + @Operation(summary = "获得备注") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('infra:remark:query')") + public CommonResult getRemark(@RequestParam("id") Long id) { + RemarkDO remark = remarkService.getRemark(id); + return success(RemarkConvert.INSTANCE.convert(remark)); + } + + @GetMapping("/list") + @Operation(summary = "获得备注列表") + @PreAuthorize("@ss.hasPermission('infra:remark:query')") + public CommonResult> getRemarkList(@Valid RemarkListReqVO listVO) { + List list = remarkService.getRemarkList(listVO); + List remarkRespVOList = RemarkConvert.INSTANCE.convertList(list); + for(RemarkRespVO remarkRespVO : remarkRespVOList) { + AdminUserRespDTO user = adminUserApi.getUser(Long.parseLong(remarkRespVO.getCreator())); + if(user != null) { + remarkRespVO.setNickname(user.getNickname()); + remarkRespVO.setAvatar(user.getAvatar()); + } + } + return success(remarkRespVOList); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/remark/vo/RemarkBaseVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/remark/vo/RemarkBaseVO.java new file mode 100644 index 0000000..ca38b49 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/remark/vo/RemarkBaseVO.java @@ -0,0 +1,30 @@ +package com.win.module.infra.controller.remark.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import javax.validation.constraints.*; + +/** + * 备注 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class RemarkBaseVO { + + @Schema(description = "表名", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + @NotNull(message = "表名不能为空") + private String tableName; + + @Schema(description = "表数据id", requiredMode = Schema.RequiredMode.REQUIRED, example = "8766") + @NotNull(message = "表数据id不能为空") + private Long tableId; + + @Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED, example = "随便") + @NotNull(message = "备注不能为空") + private String remark; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/remark/vo/RemarkCreateReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/remark/vo/RemarkCreateReqVO.java new file mode 100644 index 0000000..839f04c --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/remark/vo/RemarkCreateReqVO.java @@ -0,0 +1,12 @@ +package com.win.module.infra.controller.remark.vo; + +import lombok.*; +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(description = "管理后台 - 备注创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class RemarkCreateReqVO extends RemarkBaseVO { + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/remark/vo/RemarkListReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/remark/vo/RemarkListReqVO.java new file mode 100644 index 0000000..e85fd93 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/remark/vo/RemarkListReqVO.java @@ -0,0 +1,27 @@ +package com.win.module.infra.controller.remark.vo; + +import lombok.*; +import io.swagger.v3.oas.annotations.media.Schema; +import com.win.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 备注分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class RemarkListReqVO extends PageParam { + + @Schema(description = "表名", example = "芋艿") + private String tableName; + + @Schema(description = "表数据id", example = "8766") + private Long tableId; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/remark/vo/RemarkRespVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/remark/vo/RemarkRespVO.java new file mode 100644 index 0000000..e47274a --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/remark/vo/RemarkRespVO.java @@ -0,0 +1,25 @@ +package com.win.module.infra.controller.remark.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 备注 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class RemarkRespVO extends RemarkBaseVO { + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + + @Schema(description = "用户id") + private String creator; + + @Schema(description = "用户昵称") + private String nickname; + + @Schema(description = "用户头像") + private String avatar; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/test/TestDemoController.http b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/test/TestDemoController.http new file mode 100644 index 0000000..ed65d0b --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/test/TestDemoController.http @@ -0,0 +1,19 @@ +### 请求 /infra/test-demo/get 接口 => 成功 +GET {{baseUrl}}/infra/test-demo/get?id=106 +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} + +### 请求 /infra/test-demo/update 接口 => 成功 +PUT {{baseUrl}}/infra/test-demo/update +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} +Content-Type: application/json + + +{ + "id": 106, + "name": "测试", + "status": "0", + "type": 1, + "category": 1 +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/test/TestDemoController.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/test/TestDemoController.java new file mode 100644 index 0000000..4ed859f --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/test/TestDemoController.java @@ -0,0 +1,97 @@ +package com.win.module.infra.controller.test; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.excel.core.util.ExcelUtils; +import com.win.framework.operatelog.core.annotations.OperateLog; +import com.win.module.infra.controller.test.vo.*; +import com.win.module.infra.convert.test.TestDemoConvert; +import com.win.module.infra.dal.dataobject.test.TestDemoDO; +import com.win.module.infra.service.test.TestDemoService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.Collection; +import java.util.List; + +import static com.win.framework.common.pojo.CommonResult.success; +import static com.win.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 字典类型") +@RestController +@RequestMapping("/infra/test-demo") +@Validated +public class TestDemoController { + + @Resource + private TestDemoService testDemoService; + + @PostMapping("/create") + @Operation(summary = "创建字典类型") + @PreAuthorize("@ss.hasPermission('infra:test-demo:create')") + public CommonResult createTestDemo(@Valid @RequestBody TestDemoCreateReqVO createReqVO) { + return success(testDemoService.createTestDemo(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新字典类型") + @PreAuthorize("@ss.hasPermission('infra:test-demo:update')") + public CommonResult updateTestDemo(@Valid @RequestBody TestDemoUpdateReqVO updateReqVO) { + testDemoService.updateTestDemo(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除字典类型") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('infra:test-demo:delete')") + public CommonResult deleteTestDemo(@RequestParam("id") Long id) { + testDemoService.deleteTestDemo(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得字典类型") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('infra:test-demo:query')") + public CommonResult getTestDemo(@RequestParam("id") Long id) { + TestDemoDO testDemo = testDemoService.getTestDemo(id); + return success(TestDemoConvert.INSTANCE.convert(testDemo)); + } + + @GetMapping("/list") + @Operation(summary = "获得字典类型列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + @PreAuthorize("@ss.hasPermission('infra:test-demo:query')") + public CommonResult> getTestDemoList(@RequestParam("ids") Collection ids) { + List list = testDemoService.getTestDemoList(ids); + return success(TestDemoConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得字典类型分页") + @PreAuthorize("@ss.hasPermission('infra:test-demo:query')") public CommonResult> getTestDemoPage(@Valid TestDemoPageReqVO pageVO) { + PageResult pageResult = testDemoService.getTestDemoPage(pageVO); + return success(TestDemoConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出字典类型 Excel") + @PreAuthorize("@ss.hasPermission('infra:test-demo:export')") @OperateLog(type = EXPORT) + public void exportTestDemoExcel(@Valid TestDemoExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = testDemoService.getTestDemoList(exportReqVO); + // 导出 Excel + List datas = TestDemoConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "字典类型.xls", "数据", TestDemoExcelVO.class, datas); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/test/vo/TestDemoBaseVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/test/vo/TestDemoBaseVO.java new file mode 100644 index 0000000..ea64310 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/test/vo/TestDemoBaseVO.java @@ -0,0 +1,32 @@ +package com.win.module.infra.controller.test.vo; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import javax.validation.constraints.*; + +/** +* 字典类型 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class TestDemoBaseVO { + + @Schema(description = "名字", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "名字不能为空") + private String name; + + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "状态不能为空") + private Integer status; + + @Schema(description = "类型", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "类型不能为空") + private Integer type; + + @Schema(description = "分类", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "分类不能为空") + private Integer category; + + @Schema(description = "备注") + private String remark; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/test/vo/TestDemoCreateReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/test/vo/TestDemoCreateReqVO.java new file mode 100644 index 0000000..36aa572 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/test/vo/TestDemoCreateReqVO.java @@ -0,0 +1,11 @@ +package com.win.module.infra.controller.test.vo; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +@Schema(description = "管理后台 - 字典类型创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class TestDemoCreateReqVO extends TestDemoBaseVO { + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/test/vo/TestDemoExcelVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/test/vo/TestDemoExcelVO.java new file mode 100644 index 0000000..454b796 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/test/vo/TestDemoExcelVO.java @@ -0,0 +1,38 @@ +package com.win.module.infra.controller.test.vo; + +import lombok.*; + +import java.time.LocalDateTime; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 字典类型 Excel VO + * + * @author 闻荫源码 + */ +@Data +public class TestDemoExcelVO { + + @ExcelProperty("编号") + private Long id; + + @ExcelProperty("名字") + private String name; + + @ExcelProperty("状态") + private Integer status; + + @ExcelProperty("类型") + private Integer type; + + @ExcelProperty("分类") + private Integer category; + + @ExcelProperty("备注") + private String remark; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/test/vo/TestDemoExportReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/test/vo/TestDemoExportReqVO.java new file mode 100644 index 0000000..eac05ec --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/test/vo/TestDemoExportReqVO.java @@ -0,0 +1,33 @@ +package com.win.module.infra.controller.test.vo; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import java.time.LocalDateTime; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 字典类型 Excel 导出 Request VO,参数和 TestDemoPageReqVO 是一致的") +@Data +public class TestDemoExportReqVO { + + @Schema(description = "名字") + private String name; + + @Schema(description = "状态") + private Integer status; + + @Schema(description = "类型") + private Integer type; + + @Schema(description = "分类") + private Integer category; + + @Schema(description = "备注") + private String remark; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @Schema(description = "创建时间") + private LocalDateTime[] createTime; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/test/vo/TestDemoPageReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/test/vo/TestDemoPageReqVO.java new file mode 100644 index 0000000..9e5a77c --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/test/vo/TestDemoPageReqVO.java @@ -0,0 +1,36 @@ +package com.win.module.infra.controller.test.vo; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import java.time.LocalDateTime; +import com.win.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 字典类型分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class TestDemoPageReqVO extends PageParam { + + @Schema(description = "名字") + private String name; + + @Schema(description = "状态") + private Integer status; + + @Schema(description = "类型") + private Integer type; + + @Schema(description = "分类") + private Integer category; + + @Schema(description = "备注") + private String remark; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @Schema(description = "创建时间") + private LocalDateTime[] createTime; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/test/vo/TestDemoRespVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/test/vo/TestDemoRespVO.java new file mode 100644 index 0000000..ad57c43 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/test/vo/TestDemoRespVO.java @@ -0,0 +1,19 @@ +package com.win.module.infra.controller.test.vo; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 字典类型 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class TestDemoRespVO extends TestDemoBaseVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED) + private Long id; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/test/vo/TestDemoUpdateReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/test/vo/TestDemoUpdateReqVO.java new file mode 100644 index 0000000..25092db --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/test/vo/TestDemoUpdateReqVO.java @@ -0,0 +1,16 @@ +package com.win.module.infra.controller.test.vo; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 字典类型更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class TestDemoUpdateReqVO extends TestDemoBaseVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "编号不能为空") + private Long id; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/trends/TrendsController.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/trends/TrendsController.java new file mode 100644 index 0000000..8a17b43 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/trends/TrendsController.java @@ -0,0 +1,92 @@ +package com.win.module.infra.controller.trends; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.excel.core.util.ExcelUtils; +import com.win.framework.operatelog.core.annotations.OperateLog; +import com.win.module.infra.controller.trends.vo.TrendsExcelVO; +import com.win.module.infra.controller.trends.vo.TrendsExportReqVO; +import com.win.module.infra.controller.trends.vo.TrendsPageReqVO; +import com.win.module.infra.controller.trends.vo.TrendsRespVO; +import com.win.module.infra.convert.trends.TrendsConvert; +import com.win.module.infra.dal.dataobject.trends.TrendsDO; +import com.win.module.infra.service.trends.TrendsService; +import com.win.module.system.api.user.AdminUserApi; +import com.win.module.system.api.user.dto.AdminUserRespDTO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static com.win.framework.common.pojo.CommonResult.success; +import static com.win.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 动态记录") +@RestController +@RequestMapping("/infra/trends") +@Validated +public class TrendsController { + + @Resource + private TrendsService trendsService; + + @Resource + private AdminUserApi adminUserApi; + + @GetMapping("/get") + @Operation(summary = "获得动态记录") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('infra:trends:query')") + public CommonResult getTrends(@RequestParam("id") Long id) { + TrendsDO trends = trendsService.getTrends(id); + return success(TrendsConvert.INSTANCE.convert(trends)); + } + + @GetMapping("/list") + @Operation(summary = "获得动态记录列表") + @PreAuthorize("@ss.hasPermission('infra:trends:query')") + public CommonResult> getTrendsList(@Valid TrendsExportReqVO exportReqVO) { + List list = trendsService.getTrendsList(exportReqVO); + List trendsRespVOList = TrendsConvert.INSTANCE.convertList(list); + for(TrendsRespVO trendsRespVO : trendsRespVOList) { + AdminUserRespDTO user = adminUserApi.getUser(Long.parseLong(trendsRespVO.getCreator())); + if(user != null) { + trendsRespVO.setNickname(user.getNickname()); + trendsRespVO.setAvatar(user.getAvatar()); + } + } + return success(trendsRespVOList); + } + + @GetMapping("/page") + @Operation(summary = "获得动态记录分页") + @PreAuthorize("@ss.hasPermission('infra:trends:query')") + public CommonResult> getTrendsPage(@Valid TrendsPageReqVO pageVO) { + PageResult pageResult = trendsService.getTrendsPage(pageVO); + return success(TrendsConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出动态记录 Excel") + @PreAuthorize("@ss.hasPermission('infra:trends:export')") + @OperateLog(type = EXPORT) + public void exportTrendsExcel(@Valid TrendsExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = trendsService.getTrendsList(exportReqVO); + // 导出 Excel + List datas = TrendsConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "动态记录.xls", "数据", TrendsExcelVO.class, datas); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/trends/vo/TrendsBaseVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/trends/vo/TrendsBaseVO.java new file mode 100644 index 0000000..516ec94 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/trends/vo/TrendsBaseVO.java @@ -0,0 +1,30 @@ +package com.win.module.infra.controller.trends.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * 动态记录 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class TrendsBaseVO { + + @Schema(description = "表名", requiredMode = Schema.RequiredMode.REQUIRED, example = "infraTrends") + @NotNull(message = "表名不能为空") + private String tableName; + + @Schema(description = "表数据id", requiredMode = Schema.RequiredMode.REQUIRED, example = "9210") + @NotNull(message = "表数据id不能为空") + private Long tableId; + + @Schema(description = "类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @NotNull(message = "类型") + private Integer type; + + @Schema(description = "内容") + private String content; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/trends/vo/TrendsCreateReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/trends/vo/TrendsCreateReqVO.java new file mode 100644 index 0000000..0f1c5dc --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/trends/vo/TrendsCreateReqVO.java @@ -0,0 +1,12 @@ +package com.win.module.infra.controller.trends.vo; + +import lombok.*; +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(description = "管理后台 - 动态记录创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class TrendsCreateReqVO extends TrendsBaseVO { + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/trends/vo/TrendsExcelVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/trends/vo/TrendsExcelVO.java new file mode 100644 index 0000000..3f1a7d5 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/trends/vo/TrendsExcelVO.java @@ -0,0 +1,31 @@ +package com.win.module.infra.controller.trends.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 动态记录 Excel VO + * + * @author 超级管理员 + */ +@Data +public class TrendsExcelVO { + + @ExcelProperty("表名") + private String tableName; + + @ExcelProperty("表数据id") + private Long tableId; + + @ExcelProperty("类型") + private Integer type; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @ExcelProperty("内容") + private String content; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/trends/vo/TrendsExportReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/trends/vo/TrendsExportReqVO.java new file mode 100644 index 0000000..5b9e9a1 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/trends/vo/TrendsExportReqVO.java @@ -0,0 +1,28 @@ +package com.win.module.infra.controller.trends.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 动态记录 Excel 导出 Request VO,参数和 TrendsPageReqVO 是一致的") +@Data +public class TrendsExportReqVO { + + @Schema(description = "表名", example = "赵六") + private String tableName; + + @Schema(description = "表数据id", example = "9210") + private Long tableId; + + @Schema(description = "类型", example = "2") + private Integer type; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/trends/vo/TrendsPageReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/trends/vo/TrendsPageReqVO.java new file mode 100644 index 0000000..b4a6a59 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/trends/vo/TrendsPageReqVO.java @@ -0,0 +1,33 @@ +package com.win.module.infra.controller.trends.vo; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 动态记录分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class TrendsPageReqVO extends PageParam { + + @Schema(description = "表名", example = "infraTrends") + private String tableName; + + @Schema(description = "表数据id", example = "9210") + private Long tableId; + + @Schema(description = "类型", example = "2") + private Integer type; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/trends/vo/TrendsRespVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/trends/vo/TrendsRespVO.java new file mode 100644 index 0000000..62b419b --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/trends/vo/TrendsRespVO.java @@ -0,0 +1,25 @@ +package com.win.module.infra.controller.trends.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 动态记录 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class TrendsRespVO extends TrendsBaseVO { + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + + @Schema(description = "用户id") + private String creator; + + @Schema(description = "用户昵称") + private String nickname; + + @Schema(description = "用户头像") + private String avatar; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/trends/vo/TrendsUpdateReqVO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/trends/vo/TrendsUpdateReqVO.java new file mode 100644 index 0000000..a240e52 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/trends/vo/TrendsUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.win.module.infra.controller.trends.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 动态记录更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class TrendsUpdateReqVO extends TrendsBaseVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "3523") + @NotNull(message = "id不能为空") + private Long id; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/codegen/CodegenConvert.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/codegen/CodegenConvert.java new file mode 100644 index 0000000..6142ac5 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/codegen/CodegenConvert.java @@ -0,0 +1,93 @@ +package com.win.module.infra.convert.codegen; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.infra.controller.codegen.vo.CodegenDetailRespVO; +import com.win.module.infra.controller.codegen.vo.CodegenPreviewRespVO; +import com.win.module.infra.controller.codegen.vo.CodegenUpdateReqVO; +import com.win.module.infra.controller.codegen.vo.column.CodegenColumnRespVO; +import com.win.module.infra.controller.codegen.vo.table.CodegenTableRespVO; +import com.win.module.infra.controller.codegen.vo.table.DatabaseTableRespVO; +import com.win.module.infra.dal.dataobject.codegen.CodegenColumnDO; +import com.win.module.infra.dal.dataobject.codegen.CodegenTableDO; +import com.baomidou.mybatisplus.generator.config.po.TableField; +import com.baomidou.mybatisplus.generator.config.po.TableInfo; +import org.apache.ibatis.type.JdbcType; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.Mappings; +import org.mapstruct.Named; +import org.mapstruct.factory.Mappers; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Mapper +public interface CodegenConvert { + + CodegenConvert INSTANCE = Mappers.getMapper(CodegenConvert.class); + + // ========== TableInfo 相关 ========== + + @Mappings({ + @Mapping(source = "name", target = "tableName"), + @Mapping(source = "comment", target = "tableComment"), + }) + CodegenTableDO convert(TableInfo bean); + + List convertList(List list); + + @Mappings({ + @Mapping(source = "name", target = "columnName"), + @Mapping(source = "metaInfo.jdbcType", target = "dataType", qualifiedByName = "getDataType"), + @Mapping(source = "comment", target = "columnComment"), + @Mapping(source = "metaInfo.nullable", target = "nullable"), + @Mapping(source = "keyFlag", target = "primaryKey"), + @Mapping(source = "keyIdentityFlag", target = "autoIncrement"), + @Mapping(source = "columnType.type", target = "javaType"), + @Mapping(source = "propertyName", target = "javaField"), + }) + CodegenColumnDO convert(TableField bean); + + @Named("getDataType") + default String getDataType(JdbcType jdbcType) { + return jdbcType.name(); + } + + // ========== CodegenTableDO 相关 ========== + +// List convertList02(List list); + + CodegenTableRespVO convert(CodegenTableDO bean); + + PageResult convertPage(PageResult page); + + // ========== CodegenTableDO 相关 ========== + + List convertList02(List list); + + CodegenTableDO convert(CodegenUpdateReqVO.Table bean); + + List convertList03(List columns); + + List convertList04(List list); + + // ========== 其它 ========== + + default CodegenDetailRespVO convert(CodegenTableDO table, List columns) { + CodegenDetailRespVO respVO = new CodegenDetailRespVO(); + respVO.setTable(convert(table)); + respVO.setColumns(convertList02(columns)); + return respVO; + } + + default List convert(Map codes) { + return codes.entrySet().stream().map(entry -> { + CodegenPreviewRespVO respVO = new CodegenPreviewRespVO(); + respVO.setFilePath(entry.getKey()); + respVO.setCode(entry.getValue()); + return respVO; + }).collect(Collectors.toList()); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/config/ConfigConvert.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/config/ConfigConvert.java new file mode 100644 index 0000000..e319448 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/config/ConfigConvert.java @@ -0,0 +1,33 @@ +package com.win.module.infra.convert.config; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.infra.controller.config.vo.ConfigCreateReqVO; +import com.win.module.infra.controller.config.vo.ConfigExcelVO; +import com.win.module.infra.controller.config.vo.ConfigRespVO; +import com.win.module.infra.controller.config.vo.ConfigUpdateReqVO; +import com.win.module.infra.dal.dataobject.config.ConfigDO; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface ConfigConvert { + + ConfigConvert INSTANCE = Mappers.getMapper(ConfigConvert.class); + + PageResult convertPage(PageResult page); + + @Mapping(source = "configKey", target = "key") + ConfigRespVO convert(ConfigDO bean); + + @Mapping(source = "key", target = "configKey") + ConfigDO convert(ConfigCreateReqVO bean); + + ConfigDO convert(ConfigUpdateReqVO bean); + + @Mapping(source = "configKey", target = "key") + List convertList(List list); + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/db/DataSourceConfigConvert.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/db/DataSourceConfigConvert.java new file mode 100644 index 0000000..59e69af --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/db/DataSourceConfigConvert.java @@ -0,0 +1,30 @@ +package com.win.module.infra.convert.db; + +import java.util.*; + +import com.win.module.infra.controller.db.vo.DataSourceConfigCreateReqVO; +import com.win.module.infra.controller.db.vo.DataSourceConfigRespVO; +import com.win.module.infra.controller.db.vo.DataSourceConfigUpdateReqVO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.win.module.infra.dal.dataobject.db.DataSourceConfigDO; + +/** + * 数据源配置 Convert + * + * @author 闻荫源码 + */ +@Mapper +public interface DataSourceConfigConvert { + + DataSourceConfigConvert INSTANCE = Mappers.getMapper(DataSourceConfigConvert.class); + + DataSourceConfigDO convert(DataSourceConfigCreateReqVO bean); + + DataSourceConfigDO convert(DataSourceConfigUpdateReqVO bean); + + DataSourceConfigRespVO convert(DataSourceConfigDO bean); + + List convertList(List list); + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/file/FileConfigConvert.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/file/FileConfigConvert.java new file mode 100644 index 0000000..140ecc6 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/file/FileConfigConvert.java @@ -0,0 +1,36 @@ +package com.win.module.infra.convert.file; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.infra.controller.file.vo.config.FileConfigCreateReqVO; +import com.win.module.infra.controller.file.vo.config.FileConfigRespVO; +import com.win.module.infra.controller.file.vo.config.FileConfigUpdateReqVO; +import com.win.module.infra.dal.dataobject.file.FileConfigDO; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 文件配置 Convert + * + * @author 闻荫源码 + */ +@Mapper +public interface FileConfigConvert { + + FileConfigConvert INSTANCE = Mappers.getMapper(FileConfigConvert.class); + + @Mapping(target = "config", ignore = true) + FileConfigDO convert(FileConfigCreateReqVO bean); + + @Mapping(target = "config", ignore = true) + FileConfigDO convert(FileConfigUpdateReqVO bean); + + FileConfigRespVO convert(FileConfigDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/file/FileConvert.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/file/FileConvert.java new file mode 100644 index 0000000..157da2b --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/file/FileConvert.java @@ -0,0 +1,22 @@ +package com.win.module.infra.convert.file; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.infra.controller.file.vo.file.FileRespVO; +import com.win.module.infra.dal.dataobject.file.FileDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface FileConvert { + + FileConvert INSTANCE = Mappers.getMapper(FileConvert.class); + + FileRespVO convert(FileDO bean); + + PageResult convertPage(PageResult page); + + List convertList(List list); + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/job/JobConvert.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/job/JobConvert.java new file mode 100644 index 0000000..11aeafe --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/job/JobConvert.java @@ -0,0 +1,36 @@ +package com.win.module.infra.convert.job; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.infra.controller.job.vo.job.JobCreateReqVO; +import com.win.module.infra.controller.job.vo.job.JobExcelVO; +import com.win.module.infra.controller.job.vo.job.JobRespVO; +import com.win.module.infra.controller.job.vo.job.JobUpdateReqVO; +import com.win.module.infra.dal.dataobject.job.JobDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 定时任务 Convert + * + * @author 闻荫源码 + */ +@Mapper +public interface JobConvert { + + JobConvert INSTANCE = Mappers.getMapper(JobConvert.class); + + JobDO convert(JobCreateReqVO bean); + + JobDO convert(JobUpdateReqVO bean); + + JobRespVO convert(JobDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/job/JobLogConvert.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/job/JobLogConvert.java new file mode 100644 index 0000000..8898fcb --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/job/JobLogConvert.java @@ -0,0 +1,30 @@ +package com.win.module.infra.convert.job; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.infra.controller.job.vo.log.JobLogExcelVO; +import com.win.module.infra.controller.job.vo.log.JobLogRespVO; +import com.win.module.infra.dal.dataobject.job.JobLogDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 定时任务日志 Convert + * + * @author 芋艿 + */ +@Mapper +public interface JobLogConvert { + + JobLogConvert INSTANCE = Mappers.getMapper(JobLogConvert.class); + + JobLogRespVO convert(JobLogDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/logger/ApiAccessLogConvert.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/logger/ApiAccessLogConvert.java new file mode 100644 index 0000000..a95faeb --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/logger/ApiAccessLogConvert.java @@ -0,0 +1,38 @@ +package com.win.module.infra.convert.logger; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.infra.api.logger.dto.ApiAccessLogCreateReqDTO; +import com.win.module.infra.controller.logger.vo.apiaccesslog.ApiAccessLogExcelVO; +import com.win.module.infra.controller.logger.vo.apiaccesslog.ApiAccessLogRespVO; +import com.win.module.infra.dal.dataobject.logger.ApiAccessLogDO; +import com.win.module.infra.mq.message.logger.ApiAccessLogMessage; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * API 访问日志 Convert + * + * @author 闻荫源码 + */ +@Mapper +public interface ApiAccessLogConvert { + + ApiAccessLogConvert INSTANCE = Mappers.getMapper(ApiAccessLogConvert.class); + + ApiAccessLogRespVO convert(ApiAccessLogDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + + ApiAccessLogDO convert(ApiAccessLogCreateReqDTO bean); + + ApiAccessLogCreateReqDTO convert(ApiAccessLogMessage bean); + + ApiAccessLogMessage convertMessage(ApiAccessLogCreateReqDTO bean); + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/logger/ApiErrorLogConvert.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/logger/ApiErrorLogConvert.java new file mode 100644 index 0000000..9790986 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/logger/ApiErrorLogConvert.java @@ -0,0 +1,36 @@ +package com.win.module.infra.convert.logger; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.infra.api.logger.dto.ApiErrorLogCreateReqDTO; +import com.win.module.infra.controller.logger.vo.apierrorlog.ApiErrorLogExcelVO; +import com.win.module.infra.controller.logger.vo.apierrorlog.ApiErrorLogRespVO; +import com.win.module.infra.dal.dataobject.logger.ApiErrorLogDO; +import com.win.module.infra.mq.message.logger.ApiErrorLogMessage; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * API 错误日志 Convert + * + * @author 闻荫源码 + */ +@Mapper +public interface ApiErrorLogConvert { + + ApiErrorLogConvert INSTANCE = Mappers.getMapper(ApiErrorLogConvert.class); + + ApiErrorLogRespVO convert(ApiErrorLogDO bean); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + + ApiErrorLogDO convert(ApiErrorLogCreateReqDTO bean); + + ApiErrorLogCreateReqDTO convert(ApiErrorLogMessage bean); + + ApiErrorLogMessage convertMessage(ApiErrorLogCreateReqDTO bean); + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/redis/RedisConvert.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/redis/RedisConvert.java new file mode 100644 index 0000000..cb511c1 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/redis/RedisConvert.java @@ -0,0 +1,29 @@ +package com.win.module.infra.convert.redis; + +import cn.hutool.core.util.StrUtil; +import com.win.module.infra.controller.redis.vo.RedisMonitorRespVO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.ArrayList; +import java.util.Properties; + +@Mapper +public interface RedisConvert { + + RedisConvert INSTANCE = Mappers.getMapper(RedisConvert.class); + + default RedisMonitorRespVO build(Properties info, Long dbSize, Properties commandStats) { + RedisMonitorRespVO respVO = RedisMonitorRespVO.builder().info(info).dbSize(dbSize) + .commandStats(new ArrayList<>(commandStats.size())).build(); + commandStats.forEach((key, value) -> { + respVO.getCommandStats().add(RedisMonitorRespVO.CommandStat.builder() + .command(StrUtil.subAfter((String) key, "cmdstat_", false)) + .calls(Long.valueOf(StrUtil.subBetween((String) value, "calls=", ","))) + .usec(Long.valueOf(StrUtil.subBetween((String) value, "usec=", ","))) + .build()); + }); + return respVO; + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/remark/RemarkConvert.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/remark/RemarkConvert.java new file mode 100644 index 0000000..91ae375 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/remark/RemarkConvert.java @@ -0,0 +1,30 @@ +package com.win.module.infra.convert.remark; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.infra.controller.remark.vo.RemarkCreateReqVO; +import com.win.module.infra.controller.remark.vo.RemarkRespVO; +import com.win.module.infra.dal.dataobject.remark.RemarkDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 备注 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface RemarkConvert { + + RemarkConvert INSTANCE = Mappers.getMapper(RemarkConvert.class); + + RemarkDO convert(RemarkCreateReqVO bean); + + RemarkRespVO convert(RemarkDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/test/TestDemoConvert.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/test/TestDemoConvert.java new file mode 100644 index 0000000..7089e72 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/test/TestDemoConvert.java @@ -0,0 +1,36 @@ +package com.win.module.infra.convert.test; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.infra.controller.test.vo.TestDemoCreateReqVO; +import com.win.module.infra.controller.test.vo.TestDemoExcelVO; +import com.win.module.infra.controller.test.vo.TestDemoRespVO; +import com.win.module.infra.controller.test.vo.TestDemoUpdateReqVO; +import com.win.module.infra.dal.dataobject.test.TestDemoDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 字典类型 Convert + * + * @author 闻荫源码 + */ +@Mapper +public interface TestDemoConvert { + + TestDemoConvert INSTANCE = Mappers.getMapper(TestDemoConvert.class); + + TestDemoDO convert(TestDemoCreateReqVO bean); + + TestDemoDO convert(TestDemoUpdateReqVO bean); + + TestDemoRespVO convert(TestDemoDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/trends/TrendsConvert.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/trends/TrendsConvert.java new file mode 100644 index 0000000..3f60a82 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/trends/TrendsConvert.java @@ -0,0 +1,44 @@ +package com.win.module.infra.convert.trends; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.infra.api.trends.dto.TrendsCreateReqDTO; +import com.win.module.infra.controller.trends.vo.TrendsCreateReqVO; +import com.win.module.infra.controller.trends.vo.TrendsExcelVO; +import com.win.module.infra.controller.trends.vo.TrendsRespVO; +import com.win.module.infra.controller.trends.vo.TrendsUpdateReqVO; +import com.win.module.infra.dal.dataobject.trends.TrendsDO; +import com.win.module.infra.mq.message.trends.TrendsMessage; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 动态记录 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface TrendsConvert { + + TrendsConvert INSTANCE = Mappers.getMapper(TrendsConvert.class); + + TrendsDO convert(TrendsCreateReqVO bean); + + TrendsDO convert(TrendsUpdateReqVO bean); + + TrendsRespVO convert(TrendsDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + + TrendsDO convert(TrendsCreateReqDTO trendsDTO); + + TrendsCreateReqDTO convert(TrendsMessage bean); + + TrendsMessage convertMessage(TrendsCreateReqDTO bean); + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/codegen/CodegenColumnDO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/codegen/CodegenColumnDO.java new file mode 100644 index 0000000..b1e7891 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/codegen/CodegenColumnDO.java @@ -0,0 +1,142 @@ +package com.win.module.infra.dal.dataobject.codegen; + +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.module.infra.enums.codegen.CodegenColumnHtmlTypeEnum; +import com.win.module.infra.enums.codegen.CodegenColumnListConditionEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.generator.config.po.TableField; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 代码生成 column 字段定义 + * + * @author 闻荫源码 + */ +@TableName(value = "infra_codegen_column", autoResultMap = true) +@KeySequence("infra_codegen_column_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +public class CodegenColumnDO extends BaseDO { + + /** + * ID 编号 + */ + @TableId + private Long id; + /** + * 表编号 + *

+ * 关联 {@link CodegenTableDO#getId()} + */ + private Long tableId; + + // ========== 表相关字段 ========== + + /** + * 字段名 + * + * 关联 {@link TableField#getName()} + */ + private String columnName; + /** + * 数据库字段类型 + * + * 关联 {@link TableField.MetaInfo#getJdbcType()} + */ + private String dataType; + /** + * 字段描述 + * + * 关联 {@link TableField#getComment()} + */ + private String columnComment; + /** + * 是否允许为空 + * + * 关联 {@link TableField.MetaInfo#isNullable()} + */ + private Boolean nullable; + /** + * 是否主键 + * + * 关联 {@link TableField#isKeyFlag()} + */ + private Boolean primaryKey; + /** + * 是否自增 + * + * 关联 {@link TableField#isKeyIdentityFlag()} + */ + private Boolean autoIncrement; + /** + * 排序 + */ + private Integer ordinalPosition; + + // ========== Java 相关字段 ========== + + /** + * Java 属性类型 + * + * 例如说 String、Boolean 等等 + * + * 关联 {@link TableField#getColumnType()} + */ + private String javaType; + /** + * Java 属性名 + * + * 关联 {@link TableField#getPropertyName()} + */ + private String javaField; + /** + * 字典类型 + *

+ * 关联 DictTypeDO 的 type 属性 + */ + private String dictType; + /** + * 数据示例,主要用于生成 Swagger 注解的 example 字段 + */ + private String example; + + // ========== CRUD 相关字段 ========== + + /** + * 是否为 Create 创建操作的字段 + */ + private Boolean createOperation; + /** + * 是否为 Update 更新操作的字段 + */ + private Boolean updateOperation; + /** + * 是否为 List 查询操作的字段 + */ + private Boolean listOperation; + /** + * List 查询操作的条件类型 + *

+ * 枚举 {@link CodegenColumnListConditionEnum} + */ + private String listOperationCondition; + /** + * 是否为 List 查询操作的返回字段 + */ + private Boolean listOperationResult; + + // ========== UI 相关字段 ========== + + /** + * 显示类型 + *

+ * 枚举 {@link CodegenColumnHtmlTypeEnum} + */ + private String htmlType; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/codegen/CodegenTableDO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/codegen/CodegenTableDO.java new file mode 100644 index 0000000..962fc2b --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/codegen/CodegenTableDO.java @@ -0,0 +1,119 @@ +package com.win.module.infra.dal.dataobject.codegen; + +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.module.infra.dal.dataobject.db.DataSourceConfigDO; +import com.win.module.infra.enums.codegen.CodegenFrontTypeEnum; +import com.win.module.infra.enums.codegen.CodegenSceneEnum; +import com.win.module.infra.enums.codegen.CodegenTemplateTypeEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.generator.config.po.TableInfo; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 代码生成 table 表定义 + * + * @author 闻荫源码 + */ +@TableName(value = "infra_codegen_table", autoResultMap = true) +@KeySequence("infra_codegen_table_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +public class CodegenTableDO extends BaseDO { + + /** + * ID 编号 + */ + @TableId + private Long id; + + /** + * 数据源编号 + * + * 关联 {@link DataSourceConfigDO#getId()} + */ + private Long dataSourceConfigId; + /** + * 生成场景 + * + * 枚举 {@link CodegenSceneEnum} + */ + private Integer scene; + + // ========== 表相关字段 ========== + + /** + * 表名称 + * + * 关联 {@link TableInfo#getName()} + */ + private String tableName; + /** + * 表描述 + * + * 关联 {@link TableInfo#getComment()} + */ + private String tableComment; + /** + * 备注 + */ + private String remark; + + // ========== 类相关字段 ========== + + /** + * 模块名,即一级目录 + * + * 例如说,system、infra、tool 等等 + */ + private String moduleName; + /** + * 业务名,即二级目录 + * + * 例如说,user、permission、dict 等等 + */ + private String businessName; + /** + * 类名称(首字母大写) + * + * 例如说,SysUser、SysMenu、SysDictData 等等 + */ + private String className; + /** + * 类描述 + */ + private String classComment; + /** + * 作者 + */ + private String author; + + // ========== 生成相关字段 ========== + + /** + * 模板类型 + * + * 枚举 {@link CodegenTemplateTypeEnum} + */ + private Integer templateType; + /** + * 代码生成的前端类型 + * + * 枚举 {@link CodegenFrontTypeEnum} + */ + private Integer frontType; + + // ========== 菜单相关字段 ========== + + /** + * 父菜单编号 + * + * 关联 MenuDO 的 id 属性 + */ + private Long parentMenuId; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/config/ConfigDO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/config/ConfigDO.java new file mode 100644 index 0000000..c42e250 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/config/ConfigDO.java @@ -0,0 +1,64 @@ +package com.win.module.infra.dal.dataobject.config; + +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.module.infra.enums.config.ConfigTypeEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +/** + * 参数配置表 + * + * @author 闻荫源码 + */ +@TableName("infra_config") +@KeySequence("infra_config_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ConfigDO extends BaseDO { + + /** + * 参数主键 + */ + @TableId + private Long id; + /** + * 参数分类 + */ + private String category; + /** + * 参数名称 + */ + private String name; + /** + * 参数键名 + * + * 支持多 DB 类型时,无法直接使用 key + @TableField("config_key") 来实现转换,原因是 "config_key" AS key 而存在报错 + */ + private String configKey; + /** + * 参数键值 + */ + private String value; + /** + * 参数类型 + * + * 枚举 {@link ConfigTypeEnum} + */ + private Integer type; + /** + * 是否可见 + * + * 不可见的参数,一般是敏感参数,前端不可获取 + */ + private Boolean visible; + /** + * 备注 + */ + private String remark; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/db/DataSourceConfigDO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/db/DataSourceConfigDO.java new file mode 100644 index 0000000..8ba15e1 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/db/DataSourceConfigDO.java @@ -0,0 +1,48 @@ +package com.win.module.infra.dal.dataobject.db; + +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.framework.mybatis.core.type.EncryptTypeHandler; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +/** + * 数据源配置 + * + * @author 闻荫源码 + */ +@TableName(value = "infra_data_source_config", autoResultMap = true) +@KeySequence("infra_data_source_config_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +public class DataSourceConfigDO extends BaseDO { + + /** + * 主键编号 - Master 数据源 + */ + public static final Long ID_MASTER = 0L; + + /** + * 主键编号 + */ + private Long id; + /** + * 连接名 + */ + private String name; + + /** + * 数据源连接 + */ + private String url; + /** + * 用户名 + */ + private String username; + /** + * 密码 + */ + @TableField(typeHandler = EncryptTypeHandler.class) + private String password; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/file/FileConfigDO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/file/FileConfigDO.java new file mode 100644 index 0000000..738b0f3 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/file/FileConfigDO.java @@ -0,0 +1,58 @@ +package com.win.module.infra.dal.dataobject.file; + +import com.win.framework.file.core.client.FileClientConfig; +import com.win.framework.file.core.enums.FileStorageEnum; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.*; + +/** + * 文件配置表 + * + * @author 闻荫源码 + */ +@TableName(value = "infra_file_config", autoResultMap = true) +@KeySequence("infra_file_config_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class FileConfigDO extends BaseDO { + + /** + * 配置编号,数据库自增 + */ + private Long id; + /** + * 配置名 + */ + private String name; + /** + * 存储器 + * + * 枚举 {@link FileStorageEnum} + */ + private Integer storage; + /** + * 备注 + */ + private String remark; + /** + * 是否为主配置 + * + * 由于我们可以配置多个文件配置,默认情况下,使用主配置进行文件的上传 + */ + private Boolean master; + + /** + * 支付渠道配置 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private FileClientConfig config; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/file/FileContentDO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/file/FileContentDO.java new file mode 100644 index 0000000..a7d4c3f --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/file/FileContentDO.java @@ -0,0 +1,47 @@ +package com.win.module.infra.dal.dataobject.file; + +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +/** + * 文件内容表 + * + * 专门用于存储 {@link com.win.framework.file.core.client.db.DBFileClient} 的文件内容 + * + * @author 闻荫源码 + */ +@TableName("infra_file_content") +@KeySequence("infra_file_content_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class FileContentDO extends BaseDO { + + /** + * 编号,数据库自增 + */ + @TableId(type = IdType.INPUT) + private String id; + /** + * 配置编号 + * + * 关联 {@link FileConfigDO#getId()} + */ + private Long configId; + /** + * 路径,即文件名 + */ + private String path; + /** + * 文件内容 + */ + private byte[] content; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/file/FileDO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/file/FileDO.java new file mode 100644 index 0000000..76f3cd3 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/file/FileDO.java @@ -0,0 +1,62 @@ +package com.win.module.infra.dal.dataobject.file; + +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +/** + * 文件表 + * 每次文件上传,都会记录一条记录到该表中 + * + * @author 闻荫源码 + */ +@TableName("infra_file") +@KeySequence("infra_file_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class FileDO extends BaseDO { + + /** + * 编号,数据库自增 + */ + private Long id; + /** + * 配置编号 + * + * 关联 {@link FileConfigDO#getId()} + */ + private Long configId; + /** + * 原文件名 + */ + private String name; + /** + * 路径,即文件名 + */ + private String path; + /** + * 访问地址 + */ + private String url; + /** + * 文件的 MIME 类型,例如 "application/octet-stream" + */ + private String type; + /** + * 文件大小 + */ + private Integer size; + /** + * 表名 + */ + private String tableName; + /** + * 表数据id + */ + private Long tableId; +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/job/JobDO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/job/JobDO.java new file mode 100644 index 0000000..421bde1 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/job/JobDO.java @@ -0,0 +1,74 @@ +package com.win.module.infra.dal.dataobject.job; + +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.module.infra.enums.job.JobStatusEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +/** + * 定时任务 DO + * + * @author 闻荫源码 + */ +@TableName("infra_job") +@KeySequence("infra_job_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class JobDO extends BaseDO { + + /** + * 任务编号 + */ + @TableId + private Long id; + /** + * 任务名称 + */ + private String name; + /** + * 任务状态 + * + * 枚举 {@link JobStatusEnum} + */ + private Integer status; + /** + * 处理器的名字 + */ + private String handlerName; + /** + * 处理器的参数 + */ + private String handlerParam; + /** + * CRON 表达式 + */ + private String cronExpression; + + // ========== 重试相关字段 ========== + /** + * 重试次数 + * 如果不重试,则设置为 0 + */ + private Integer retryCount; + /** + * 重试间隔,单位:毫秒 + * 如果没有间隔,则设置为 0 + */ + private Integer retryInterval; + + // ========== 监控相关字段 ========== + /** + * 监控超时时间,单位:毫秒 + * 为空时,表示不监控 + * + * 注意,这里的超时的目的,不是进行任务的取消,而是告警任务的执行时间过长 + */ + private Integer monitorTimeout; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/job/JobLogDO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/job/JobLogDO.java new file mode 100644 index 0000000..70e13c1 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/job/JobLogDO.java @@ -0,0 +1,82 @@ +package com.win.module.infra.dal.dataobject.job; + +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.framework.quartz.core.handler.JobHandler; +import com.win.module.infra.enums.job.JobLogStatusEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.time.LocalDateTime; + +/** + * 定时任务的执行日志 + * + * @author 闻荫源码 + */ +@TableName("infra_job_log") +@KeySequence("infra_job_log_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class JobLogDO extends BaseDO { + + /** + * 日志编号 + */ + private Long id; + /** + * 任务编号 + * + * 关联 {@link JobDO#getId()} + */ + private Long jobId; + /** + * 处理器的名字 + * + * 冗余字段 {@link JobDO#getHandlerName()} + */ + private String handlerName; + /** + * 处理器的参数 + * + * 冗余字段 {@link JobDO#getHandlerParam()} + */ + private String handlerParam; + /** + * 第几次执行 + * + * 用于区分是不是重试执行。如果是重试执行,则 index 大于 1 + */ + private Integer executeIndex; + + /** + * 开始执行时间 + */ + private LocalDateTime beginTime; + /** + * 结束执行时间 + */ + private LocalDateTime endTime; + /** + * 执行时长,单位:毫秒 + */ + private Integer duration; + /** + * 状态 + * + * 枚举 {@link JobLogStatusEnum} + */ + private Integer status; + /** + * 结果数据 + * + * 成功时,使用 {@link JobHandler#execute(String)} 的结果 + * 失败时,使用 {@link JobHandler#execute(String)} 的异常堆栈 + */ + private String result; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/logger/ApiAccessLogDO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/logger/ApiAccessLogDO.java new file mode 100644 index 0000000..e5aa503 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/logger/ApiAccessLogDO.java @@ -0,0 +1,102 @@ +package com.win.module.infra.dal.dataobject.logger; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.time.LocalDateTime; + +/** + * API 访问日志 + * + * @author 闻荫源码 + */ +@TableName("infra_api_access_log") +@KeySequence(value = "infra_api_access_log_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ApiAccessLogDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 链路追踪编号 + * + * 一般来说,通过链路追踪编号,可以将访问日志,错误日志,链路追踪日志,logger 打印日志等,结合在一起,从而进行排错。 + */ + private String traceId; + /** + * 用户编号 + */ + private Long userId; + /** + * 应用名 + * + * 目前读取 `spring.application.name` 配置项 + */ + private String applicationName; + + // ========== 请求相关字段 ========== + + /** + * 请求方法名 + */ + private String requestMethod; + /** + * 访问地址 + */ + private String requestUrl; + /** + * 请求参数 + * + * query: Query String + * body: Quest Body + */ + private String requestParams; + /** + * 用户 IP + */ + private String userIp; + /** + * 浏览器 UA + */ + private String userAgent; + + // ========== 执行相关字段 ========== + + /** + * 开始请求时间 + */ + private LocalDateTime beginTime; + /** + * 结束请求时间 + */ + private LocalDateTime endTime; + /** + * 执行时长,单位:毫秒 + */ + private Integer duration; + /** + * 结果码 + * + * 目前使用的 {@link CommonResult#getCode()} 属性 + */ + private Integer resultCode; + /** + * 结果提示 + * + * 目前使用的 {@link CommonResult#getMsg()} 属性 + */ + private String resultMsg; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/logger/ApiErrorLogDO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/logger/ApiErrorLogDO.java new file mode 100644 index 0000000..2bae1e1 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/logger/ApiErrorLogDO.java @@ -0,0 +1,149 @@ +package com.win.module.infra.dal.dataobject.logger; + +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.module.infra.enums.logger.ApiErrorLogProcessStatusEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.time.LocalDateTime; + +/** + * API 异常数据 + * + * @author 闻荫源码 + */ +@TableName("infra_api_error_log") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +@KeySequence(value = "infra_api_error_log_seq") +public class ApiErrorLogDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 用户编号 + */ + private Long userId; + /** + * 链路追踪编号 + * + * 一般来说,通过链路追踪编号,可以将访问日志,错误日志,链路追踪日志,logger 打印日志等,结合在一起,从而进行排错。 + */ + private String traceId; + /** + * 应用名 + * + * 目前读取 spring.application.name + */ + private String applicationName; + + // ========== 请求相关字段 ========== + + /** + * 请求方法名 + */ + private String requestMethod; + /** + * 访问地址 + */ + private String requestUrl; + /** + * 请求参数 + * + * query: Query String + * body: Quest Body + */ + private String requestParams; + /** + * 用户 IP + */ + private String userIp; + /** + * 浏览器 UA + */ + private String userAgent; + + // ========== 异常相关字段 ========== + + /** + * 异常发生时间 + */ + private LocalDateTime exceptionTime; + /** + * 异常名 + * + * {@link Throwable#getClass()} 的类全名 + */ + private String exceptionName; + /** + * 异常导致的消息 + * + * {@link cn.hutool.core.exceptions.ExceptionUtil#getMessage(Throwable)} + */ + private String exceptionMessage; + /** + * 异常导致的根消息 + * + * {@link cn.hutool.core.exceptions.ExceptionUtil#getRootCauseMessage(Throwable)} + */ + private String exceptionRootCauseMessage; + /** + * 异常的栈轨迹 + * + * {@link org.apache.commons.lang3.exception.ExceptionUtils#getStackTrace(Throwable)} + */ + private String exceptionStackTrace; + /** + * 异常发生的类全名 + * + * {@link StackTraceElement#getClassName()} + */ + private String exceptionClassName; + /** + * 异常发生的类文件 + * + * {@link StackTraceElement#getFileName()} + */ + private String exceptionFileName; + /** + * 异常发生的方法名 + * + * {@link StackTraceElement#getMethodName()} + */ + private String exceptionMethodName; + /** + * 异常发生的方法所在行 + * + * {@link StackTraceElement#getLineNumber()} + */ + private Integer exceptionLineNumber; + + // ========== 处理相关字段 ========== + + /** + * 处理状态 + * + * 枚举 {@link ApiErrorLogProcessStatusEnum} + */ + private Integer processStatus; + /** + * 处理时间 + */ + private LocalDateTime processTime; + /** + * 处理用户编号 + * + * 关联 com.win.adminserver.modules.system.dal.dataobject.user.SysUserDO.SysUserDO#getId() + */ + private Long processUserId; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/remark/RemarkDO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/remark/RemarkDO.java new file mode 100644 index 0000000..e5b3b9d --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/remark/RemarkDO.java @@ -0,0 +1,51 @@ +package com.win.module.infra.dal.dataobject.remark; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import com.win.framework.mybatis.core.dataobject.BaseDO; + +/** + * 备注 DO + * + * @author 超级管理员 + */ +@TableName("infra_remark") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class RemarkDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 表名 + */ + private String tableName; + /** + * 表数据id + */ + private Long tableId; + /** + * 备注 + */ + private String remark; + /** + * 删除时间 + */ + private LocalDateTime deletionTime; + /** + * 删除者ID + */ + private String deleterId; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/test/TestDemoDO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/test/TestDemoDO.java new file mode 100644 index 0000000..6b90027 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/test/TestDemoDO.java @@ -0,0 +1,50 @@ +package com.win.module.infra.dal.dataobject.test; + +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +/** + * 字典类型 DO + * + * @author 闻荫源码 + */ +@TableName("infra_test_demo") +@KeySequence("infra_test_demo_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class TestDemoDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 名字 + */ + private String name; + /** + * 状态 + */ + private Integer status; + /** + * 类型 + */ + private Integer type; + /** + * 分类 + */ + private Integer category; + /** + * 备注 + */ + private String remark; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/trends/TrendsDO.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/trends/TrendsDO.java new file mode 100644 index 0000000..787a09d --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/trends/TrendsDO.java @@ -0,0 +1,55 @@ +package com.win.module.infra.dal.dataobject.trends; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import com.win.framework.mybatis.core.dataobject.BaseDO; + +/** + * 动态记录 DO + * + * @author 超级管理员 + */ +@TableName("infra_trends") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class TrendsDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 表名 + */ + private String tableName; + /** + * 表数据id + */ + private Long tableId; + /** + * 类型1增加2删除3修改 + */ + private Integer type; + /** + * 删除时间 + */ + private LocalDateTime deletionTime; + /** + * 删除者ID + */ + private String deleterId; + /** + * 内容 + */ + private String content; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/codegen/CodegenColumnMapper.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/codegen/CodegenColumnMapper.java new file mode 100644 index 0000000..8eac5c7 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/codegen/CodegenColumnMapper.java @@ -0,0 +1,24 @@ +package com.win.module.infra.dal.mysql.codegen; + +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.infra.dal.dataobject.codegen.CodegenColumnDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface CodegenColumnMapper extends BaseMapperX { + + default List selectListByTableId(Long tableId) { + return selectList(new LambdaQueryWrapperX() + .eq(CodegenColumnDO::getTableId, tableId) + .orderByAsc(CodegenColumnDO::getId)); + } + + default void deleteListByTableId(Long tableId) { + delete(new LambdaQueryWrapperX() + .eq(CodegenColumnDO::getTableId, tableId)); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/codegen/CodegenTableMapper.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/codegen/CodegenTableMapper.java new file mode 100644 index 0000000..16af754 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/codegen/CodegenTableMapper.java @@ -0,0 +1,32 @@ +package com.win.module.infra.dal.mysql.codegen; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.infra.controller.codegen.vo.table.CodegenTablePageReqVO; +import com.win.module.infra.dal.dataobject.codegen.CodegenTableDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface CodegenTableMapper extends BaseMapperX { + + default CodegenTableDO selectByTableNameAndDataSourceConfigId(String tableName, Long dataSourceConfigId) { + return selectOne(CodegenTableDO::getTableName, tableName, + CodegenTableDO::getDataSourceConfigId, dataSourceConfigId); + } + + default PageResult selectPage(CodegenTablePageReqVO pageReqVO) { + return selectPage(pageReqVO, new LambdaQueryWrapperX() + .likeIfPresent(CodegenTableDO::getTableName, pageReqVO.getTableName()) + .likeIfPresent(CodegenTableDO::getTableComment, pageReqVO.getTableComment()) + .likeIfPresent(CodegenTableDO::getClassName, pageReqVO.getClassName()) + .betweenIfPresent(CodegenTableDO::getCreateTime, pageReqVO.getCreateTime())); + } + + default List selectListByDataSourceConfigId(Long dataSourceConfigId) { + return selectList(CodegenTableDO::getDataSourceConfigId, dataSourceConfigId); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/config/ConfigMapper.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/config/ConfigMapper.java new file mode 100644 index 0000000..4f45110 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/config/ConfigMapper.java @@ -0,0 +1,36 @@ +package com.win.module.infra.dal.mysql.config; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.infra.controller.config.vo.ConfigExportReqVO; +import com.win.module.infra.controller.config.vo.ConfigPageReqVO; +import com.win.module.infra.dal.dataobject.config.ConfigDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface ConfigMapper extends BaseMapperX { + + default ConfigDO selectByKey(String key) { + return selectOne(ConfigDO::getConfigKey, key); + } + + default PageResult selectPage(ConfigPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(ConfigDO::getName, reqVO.getName()) + .likeIfPresent(ConfigDO::getConfigKey, reqVO.getKey()) + .eqIfPresent(ConfigDO::getType, reqVO.getType()) + .betweenIfPresent(ConfigDO::getCreateTime, reqVO.getCreateTime())); + } + + default List selectList(ConfigExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(ConfigDO::getName, reqVO.getName()) + .likeIfPresent(ConfigDO::getConfigKey, reqVO.getKey()) + .eqIfPresent(ConfigDO::getType, reqVO.getType()) + .betweenIfPresent(ConfigDO::getCreateTime, reqVO.getCreateTime())); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/db/DataSourceConfigMapper.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/db/DataSourceConfigMapper.java new file mode 100644 index 0000000..510dd0e --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/db/DataSourceConfigMapper.java @@ -0,0 +1,14 @@ +package com.win.module.infra.dal.mysql.db; + +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.module.infra.dal.dataobject.db.DataSourceConfigDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * 数据源配置 Mapper + * + * @author 闻荫源码 + */ +@Mapper +public interface DataSourceConfigMapper extends BaseMapperX { +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/file/FileConfigMapper.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/file/FileConfigMapper.java new file mode 100644 index 0000000..cdd2d51 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/file/FileConfigMapper.java @@ -0,0 +1,25 @@ +package com.win.module.infra.dal.mysql.file; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.infra.controller.file.vo.config.FileConfigPageReqVO; +import com.win.module.infra.dal.dataobject.file.FileConfigDO; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface FileConfigMapper extends BaseMapperX { + + default PageResult selectPage(FileConfigPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(FileConfigDO::getName, reqVO.getName()) + .eqIfPresent(FileConfigDO::getStorage, reqVO.getStorage()) + .betweenIfPresent(FileConfigDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(FileConfigDO::getId)); + } + + default FileConfigDO selectByMaster() { + return selectOne(FileConfigDO::getMaster, true); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/file/FileContentDAOImpl.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/file/FileContentDAOImpl.java new file mode 100644 index 0000000..81ed5b7 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/file/FileContentDAOImpl.java @@ -0,0 +1,46 @@ +package com.win.module.infra.dal.mysql.file; + +import cn.hutool.core.collection.CollUtil; +import com.win.framework.file.core.client.db.DBFileContentFrameworkDAO; +import com.win.module.infra.dal.dataobject.file.FileContentDO; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.springframework.stereotype.Repository; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Optional; + +@Repository +public class FileContentDAOImpl implements DBFileContentFrameworkDAO { + + @Resource + private FileContentMapper fileContentMapper; + + @Override + public void insert(Long configId, String path, byte[] content) { + FileContentDO entity = new FileContentDO().setConfigId(configId) + .setPath(path).setContent(content); + fileContentMapper.insert(entity); + } + + @Override + public void delete(Long configId, String path) { + fileContentMapper.delete(buildQuery(configId, path)); + } + + @Override + public byte[] selectContent(Long configId, String path) { + List list = fileContentMapper.selectList( + buildQuery(configId, path).select(FileContentDO::getContent).orderByDesc(FileContentDO::getId)); + return Optional.ofNullable(CollUtil.getFirst(list)) + .map(FileContentDO::getContent) + .orElse(null); + } + + private LambdaQueryWrapper buildQuery(Long configId, String path) { + return new LambdaQueryWrapper() + .eq(FileContentDO::getConfigId, configId) + .eq(FileContentDO::getPath, path); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/file/FileContentMapper.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/file/FileContentMapper.java new file mode 100644 index 0000000..7942a76 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/file/FileContentMapper.java @@ -0,0 +1,9 @@ +package com.win.module.infra.dal.mysql.file; + +import com.win.module.infra.dal.dataobject.file.FileContentDO; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface FileContentMapper extends BaseMapper { +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/file/FileMapper.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/file/FileMapper.java new file mode 100644 index 0000000..92b9c37 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/file/FileMapper.java @@ -0,0 +1,36 @@ +package com.win.module.infra.dal.mysql.file; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.infra.controller.file.vo.file.FileListReqVO; +import com.win.module.infra.controller.file.vo.file.FilePageReqVO; +import com.win.module.infra.dal.dataobject.file.FileDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 文件操作 Mapper + * + * @author 闻荫源码 + */ +@Mapper +public interface FileMapper extends BaseMapperX { + + default PageResult selectPage(FilePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(FileDO::getPath, reqVO.getPath()) + .likeIfPresent(FileDO::getType, reqVO.getType()) + .betweenIfPresent(FileDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(FileDO::getId)); + } + + default List selectList(FileListReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(FileDO::getTableName, reqVO.getTableName()) + .eqIfPresent(FileDO::getTableId, reqVO.getTableId()) + .orderByDesc(FileDO::getId)); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/job/JobLogMapper.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/job/JobLogMapper.java new file mode 100644 index 0000000..6e67322 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/job/JobLogMapper.java @@ -0,0 +1,43 @@ +package com.win.module.infra.dal.mysql.job; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.infra.controller.job.vo.log.JobLogExportReqVO; +import com.win.module.infra.controller.job.vo.log.JobLogPageReqVO; +import com.win.module.infra.dal.dataobject.job.JobLogDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 任务日志 Mapper + * + * @author 闻荫源码 + */ +@Mapper +public interface JobLogMapper extends BaseMapperX { + + default PageResult selectPage(JobLogPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(JobLogDO::getJobId, reqVO.getJobId()) + .likeIfPresent(JobLogDO::getHandlerName, reqVO.getHandlerName()) + .geIfPresent(JobLogDO::getBeginTime, reqVO.getBeginTime()) + .leIfPresent(JobLogDO::getEndTime, reqVO.getEndTime()) + .eqIfPresent(JobLogDO::getStatus, reqVO.getStatus()) + .orderByDesc(JobLogDO::getId) // ID 倒序 + ); + } + + default List selectList(JobLogExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(JobLogDO::getJobId, reqVO.getJobId()) + .likeIfPresent(JobLogDO::getHandlerName, reqVO.getHandlerName()) + .geIfPresent(JobLogDO::getBeginTime, reqVO.getBeginTime()) + .leIfPresent(JobLogDO::getEndTime, reqVO.getEndTime()) + .eqIfPresent(JobLogDO::getStatus, reqVO.getStatus()) + .orderByDesc(JobLogDO::getId) // ID 倒序 + ); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/job/JobMapper.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/job/JobMapper.java new file mode 100644 index 0000000..adf2fd6 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/job/JobMapper.java @@ -0,0 +1,41 @@ +package com.win.module.infra.dal.mysql.job; + +import com.win.module.infra.controller.job.vo.job.JobExportReqVO; +import com.win.module.infra.controller.job.vo.job.JobPageReqVO; +import com.win.module.infra.dal.dataobject.job.JobDO; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 定时任务 Mapper + * + * @author 闻荫源码 + */ +@Mapper +public interface JobMapper extends BaseMapperX { + + default JobDO selectByHandlerName(String handlerName) { + return selectOne(JobDO::getHandlerName, handlerName); + } + + default PageResult selectPage(JobPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(JobDO::getName, reqVO.getName()) + .eqIfPresent(JobDO::getStatus, reqVO.getStatus()) + .likeIfPresent(JobDO::getHandlerName, reqVO.getHandlerName()) + ); + } + + default List selectList(JobExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(JobDO::getName, reqVO.getName()) + .eqIfPresent(JobDO::getStatus, reqVO.getStatus()) + .likeIfPresent(JobDO::getHandlerName, reqVO.getHandlerName()) + ); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/logger/ApiAccessLogMapper.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/logger/ApiAccessLogMapper.java new file mode 100644 index 0000000..ef19ff8 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/logger/ApiAccessLogMapper.java @@ -0,0 +1,45 @@ +package com.win.module.infra.dal.mysql.logger; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.infra.controller.logger.vo.apiaccesslog.ApiAccessLogExportReqVO; +import com.win.module.infra.controller.logger.vo.apiaccesslog.ApiAccessLogPageReqVO; +import com.win.module.infra.dal.dataobject.logger.ApiAccessLogDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * API 访问日志 Mapper + * + * @author 闻荫源码 + */ +@Mapper +public interface ApiAccessLogMapper extends BaseMapperX { + + default PageResult selectPage(ApiAccessLogPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(ApiAccessLogDO::getUserId, reqVO.getUserId()) + .eqIfPresent(ApiAccessLogDO::getApplicationName, reqVO.getApplicationName()) + .likeIfPresent(ApiAccessLogDO::getRequestUrl, reqVO.getRequestUrl()) + .betweenIfPresent(ApiAccessLogDO::getBeginTime, reqVO.getBeginTime()) + .geIfPresent(ApiAccessLogDO::getDuration, reqVO.getDuration()) + .eqIfPresent(ApiAccessLogDO::getResultCode, reqVO.getResultCode()) + .orderByDesc(ApiAccessLogDO::getId) + ); + } + + default List selectList(ApiAccessLogExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(ApiAccessLogDO::getUserId, reqVO.getUserId()) + .eqIfPresent(ApiAccessLogDO::getApplicationName, reqVO.getApplicationName()) + .likeIfPresent(ApiAccessLogDO::getRequestUrl, reqVO.getRequestUrl()) + .betweenIfPresent(ApiAccessLogDO::getBeginTime, reqVO.getBeginTime()) + .geIfPresent(ApiAccessLogDO::getDuration, reqVO.getDuration()) + .eqIfPresent(ApiAccessLogDO::getResultCode, reqVO.getResultCode()) + .orderByDesc(ApiAccessLogDO::getId) + ); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/logger/ApiErrorLogMapper.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/logger/ApiErrorLogMapper.java new file mode 100644 index 0000000..c871e78 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/logger/ApiErrorLogMapper.java @@ -0,0 +1,43 @@ +package com.win.module.infra.dal.mysql.logger; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.infra.controller.logger.vo.apierrorlog.ApiErrorLogExportReqVO; +import com.win.module.infra.controller.logger.vo.apierrorlog.ApiErrorLogPageReqVO; +import com.win.module.infra.dal.dataobject.logger.ApiErrorLogDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * API 错误日志 Mapper + * + * @author 闻荫源码 + */ +@Mapper +public interface ApiErrorLogMapper extends BaseMapperX { + + default PageResult selectPage(ApiErrorLogPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(ApiErrorLogDO::getUserId, reqVO.getUserId()) + .eqIfPresent(ApiErrorLogDO::getApplicationName, reqVO.getApplicationName()) + .likeIfPresent(ApiErrorLogDO::getRequestUrl, reqVO.getRequestUrl()) + .betweenIfPresent(ApiErrorLogDO::getExceptionTime, reqVO.getExceptionTime()) + .eqIfPresent(ApiErrorLogDO::getProcessStatus, reqVO.getProcessStatus()) + .orderByDesc(ApiErrorLogDO::getId) + ); + } + + default List selectList(ApiErrorLogExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(ApiErrorLogDO::getUserId, reqVO.getUserId()) + .eqIfPresent(ApiErrorLogDO::getApplicationName, reqVO.getApplicationName()) + .likeIfPresent(ApiErrorLogDO::getRequestUrl, reqVO.getRequestUrl()) + .betweenIfPresent(ApiErrorLogDO::getExceptionTime, reqVO.getExceptionTime()) + .eqIfPresent(ApiErrorLogDO::getProcessStatus, reqVO.getProcessStatus()) + .orderByDesc(ApiErrorLogDO::getId) + ); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/remark/RemarkMapper.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/remark/RemarkMapper.java new file mode 100644 index 0000000..d76b043 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/remark/RemarkMapper.java @@ -0,0 +1,27 @@ +package com.win.module.infra.dal.mysql.remark; + +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.infra.controller.remark.vo.RemarkListReqVO; +import com.win.module.infra.dal.dataobject.remark.RemarkDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 备注 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface RemarkMapper extends BaseMapperX { + + default List selectList(RemarkListReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(RemarkDO::getTableName, reqVO.getTableName()) + .eqIfPresent(RemarkDO::getTableId, reqVO.getTableId()) + .betweenIfPresent(RemarkDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(RemarkDO::getId)); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/test/TestDemoMapper.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/test/TestDemoMapper.java new file mode 100644 index 0000000..44d8287 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/test/TestDemoMapper.java @@ -0,0 +1,45 @@ +package com.win.module.infra.dal.mysql.test; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.infra.controller.test.vo.TestDemoExportReqVO; +import com.win.module.infra.controller.test.vo.TestDemoPageReqVO; +import com.win.module.infra.dal.dataobject.test.TestDemoDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 字典类型 Mapper + * + * @author 闻荫源码 + */ +@Mapper +public interface TestDemoMapper extends BaseMapperX { + + default PageResult selectPage(TestDemoPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(TestDemoDO::getName, reqVO.getName()) + .eqIfPresent(TestDemoDO::getStatus, reqVO.getStatus()) + .eqIfPresent(TestDemoDO::getType, reqVO.getType()) + .eqIfPresent(TestDemoDO::getCategory, reqVO.getCategory()) + .eqIfPresent(TestDemoDO::getRemark, reqVO.getRemark()) + .betweenIfPresent(TestDemoDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(TestDemoDO::getId)); + } + + default List selectList(TestDemoExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(TestDemoDO::getName, reqVO.getName()) + .eqIfPresent(TestDemoDO::getStatus, reqVO.getStatus()) + .eqIfPresent(TestDemoDO::getType, reqVO.getType()) + .eqIfPresent(TestDemoDO::getCategory, reqVO.getCategory()) + .eqIfPresent(TestDemoDO::getRemark, reqVO.getRemark()) + .betweenIfPresent(TestDemoDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(TestDemoDO::getId)); + } + + List selectList2(); + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/trends/TrendsMapper.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/trends/TrendsMapper.java new file mode 100644 index 0000000..905aea1 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/trends/TrendsMapper.java @@ -0,0 +1,39 @@ +package com.win.module.infra.dal.mysql.trends; + +import java.util.*; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.module.infra.controller.trends.vo.TrendsExportReqVO; +import com.win.module.infra.controller.trends.vo.TrendsPageReqVO; +import com.win.module.infra.dal.dataobject.trends.TrendsDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * 动态记录 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface TrendsMapper extends BaseMapperX { + + default PageResult selectPage(TrendsPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(TrendsDO::getTableName, reqVO.getTableName()) + .eqIfPresent(TrendsDO::getTableId, reqVO.getTableId()) + .eqIfPresent(TrendsDO::getType, reqVO.getType()) + .betweenIfPresent(TrendsDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(TrendsDO::getId)); + } + + default List selectList(TrendsExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(TrendsDO::getTableName, reqVO.getTableName()) + .eqIfPresent(TrendsDO::getTableId, reqVO.getTableId()) + .eqIfPresent(TrendsDO::getType, reqVO.getType()) + .betweenIfPresent(TrendsDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(TrendsDO::getId)); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/codegen/CodegenColumnHtmlTypeEnum.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/codegen/CodegenColumnHtmlTypeEnum.java new file mode 100644 index 0000000..410eb06 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/codegen/CodegenColumnHtmlTypeEnum.java @@ -0,0 +1,29 @@ +package com.win.module.infra.enums.codegen; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 代码生成器的字段 HTML 展示枚举 + */ +@AllArgsConstructor +@Getter +public enum CodegenColumnHtmlTypeEnum { + + INPUT("input"), // 文本框 + TEXTAREA("textarea"), // 文本域 + SELECT("select"), // 下拉框 + RADIO("radio"), // 单选框 + CHECKBOX("checkbox"), // 复选框 + DATETIME("datetime"), // 日期控件 + UPLOAD_IMAGE("upload_image"), // 上传图片 + UPLOAD_FILE("upload_file"), // 上传文件 + EDITOR("editor"), // 富文本控件 + ; + + /** + * 条件 + */ + private final String type; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/codegen/CodegenColumnListConditionEnum.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/codegen/CodegenColumnListConditionEnum.java new file mode 100644 index 0000000..cc240e9 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/codegen/CodegenColumnListConditionEnum.java @@ -0,0 +1,27 @@ +package com.win.module.infra.enums.codegen; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 代码生成器的字段过滤条件枚举 + */ +@AllArgsConstructor +@Getter +public enum CodegenColumnListConditionEnum { + + EQ("="), + NE("!="), + GT(">"), + GTE(">="), + LT("<"), + LTE("<="), + LIKE("LIKE"), + BETWEEN("BETWEEN"); + + /** + * 条件 + */ + private final String condition; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/codegen/CodegenFrontTypeEnum.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/codegen/CodegenFrontTypeEnum.java new file mode 100644 index 0000000..ba8e138 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/codegen/CodegenFrontTypeEnum.java @@ -0,0 +1,26 @@ +package com.win.module.infra.enums.codegen; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 代码生成的前端类型枚举 + * + * @author 闻荫源码 + */ +@AllArgsConstructor +@Getter +public enum CodegenFrontTypeEnum { + + VUE2(10), // Vue2 Element UI 标准模版 + VUE3(20), // Vue3 Element Plus 标准模版 + VUE3_SCHEMA(21), // Vue3 Element Plus Schema 模版 + VUE3_VBEN(30), // Vue3 VBEN 模版 + ; + + /** + * 类型 + */ + private final Integer type; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/codegen/CodegenSceneEnum.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/codegen/CodegenSceneEnum.java new file mode 100644 index 0000000..932f81b --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/codegen/CodegenSceneEnum.java @@ -0,0 +1,41 @@ +package com.win.module.infra.enums.codegen; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import static cn.hutool.core.util.ArrayUtil.*; + +/** + * 代码生成的场景枚举 + * + * @author 闻荫源码 + */ +@AllArgsConstructor +@Getter +public enum CodegenSceneEnum { + + ADMIN(1, "管理后台", "admin", ""), + APP(2, "用户 APP", "app", "App"); + + /** + * 场景 + */ + private final Integer scene; + /** + * 场景名 + */ + private final String name; + /** + * 基础包名 + */ + private final String basePackage; + /** + * Controller 和 VO 类的前缀 + */ + private final String prefixClass; + + public static CodegenSceneEnum valueOf(Integer scene) { + return firstMatch(sceneEnum -> sceneEnum.getScene().equals(scene), values()); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/codegen/CodegenTemplateTypeEnum.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/codegen/CodegenTemplateTypeEnum.java new file mode 100644 index 0000000..fe4be88 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/codegen/CodegenTemplateTypeEnum.java @@ -0,0 +1,24 @@ +package com.win.module.infra.enums.codegen; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 代码生成模板类型 + * + * @author 闻荫源码 + */ +@AllArgsConstructor +@Getter +public enum CodegenTemplateTypeEnum { + + CRUD(1), // 单表(增删改查) + TREE(2), // 树表(增删改查) + ; + + /** + * 类型 + */ + private final Integer type; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/config/ConfigTypeEnum.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/config/ConfigTypeEnum.java new file mode 100644 index 0000000..dd88e2c --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/config/ConfigTypeEnum.java @@ -0,0 +1,21 @@ +package com.win.module.infra.enums.config; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum ConfigTypeEnum { + + /** + * 系统配置 + */ + SYSTEM(1), + /** + * 自定义配置 + */ + CUSTOM(2); + + private final Integer type; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/job/JobLogStatusEnum.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/job/JobLogStatusEnum.java new file mode 100644 index 0000000..230ce95 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/job/JobLogStatusEnum.java @@ -0,0 +1,24 @@ +package com.win.module.infra.enums.job; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 任务日志的状态枚举 + * + * @author 闻荫源码 + */ +@Getter +@AllArgsConstructor +public enum JobLogStatusEnum { + + RUNNING(0), // 运行中 + SUCCESS(1), // 成功 + FAILURE(2); // 失败 + + /** + * 状态 + */ + private final Integer status; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/job/JobStatusEnum.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/job/JobStatusEnum.java new file mode 100644 index 0000000..d86bb94 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/job/JobStatusEnum.java @@ -0,0 +1,42 @@ +package com.win.module.infra.enums.job; + +import com.google.common.collect.Sets; +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.quartz.impl.jdbcjobstore.Constants; + +import java.util.Collections; +import java.util.Set; + +/** + * 任务状态的枚举 + * + * @author 闻荫源码 + */ +@Getter +@AllArgsConstructor +public enum JobStatusEnum { + + /** + * 初始化中 + */ + INIT(0, Collections.emptySet()), + /** + * 开启 + */ + NORMAL(1, Sets.newHashSet(Constants.STATE_WAITING, Constants.STATE_ACQUIRED, Constants.STATE_BLOCKED)), + /** + * 暂停 + */ + STOP(2, Sets.newHashSet(Constants.STATE_PAUSED, Constants.STATE_PAUSED_BLOCKED)); + + /** + * 状态 + */ + private final Integer status; + /** + * 对应的 Quartz 触发器的状态集合 + */ + private final Set quartzStates; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/logger/ApiErrorLogProcessStatusEnum.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/logger/ApiErrorLogProcessStatusEnum.java new file mode 100644 index 0000000..1f32105 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/logger/ApiErrorLogProcessStatusEnum.java @@ -0,0 +1,28 @@ +package com.win.module.infra.enums.logger; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * API 异常数据的处理状态 + * + * @author 闻荫源码 + */ +@AllArgsConstructor +@Getter +public enum ApiErrorLogProcessStatusEnum { + + INIT(0, "未处理"), + DONE(1, "已处理"), + IGNORE(2, "已忽略"); + + /** + * 状态 + */ + private final Integer status; + /** + * 资源类型名 + */ + private final String name; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/package-info.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/package-info.java new file mode 100644 index 0000000..7d9572a --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/package-info.java @@ -0,0 +1,4 @@ +/** + * 占位 + */ +package com.win.module.infra.enums; diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/codegen/config/CodegenConfiguration.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/codegen/config/CodegenConfiguration.java new file mode 100644 index 0000000..6283f03 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/codegen/config/CodegenConfiguration.java @@ -0,0 +1,9 @@ +package com.win.module.infra.framework.codegen.config; + +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Configuration(proxyBeanMethods = false) +@EnableConfigurationProperties(CodegenProperties.class) +public class CodegenConfiguration { +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/codegen/config/CodegenProperties.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/codegen/config/CodegenProperties.java new file mode 100644 index 0000000..520f6dc --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/codegen/config/CodegenProperties.java @@ -0,0 +1,37 @@ +package com.win.module.infra.framework.codegen.config; + +import com.win.module.infra.enums.codegen.CodegenFrontTypeEnum; +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.validation.annotation.Validated; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.Collection; + +@ConfigurationProperties(prefix = "win.codegen") +@Validated +@Data +public class CodegenProperties { + + /** + * 生成的 Java 代码的基础包 + */ + @NotNull(message = "Java 代码的基础包不能为空") + private String basePackage; + + /** + * 数据库名数组 + */ + @NotEmpty(message = "数据库不能为空") + private Collection dbSchemas; + + /** + * 代码生成的前端类型(默认) + * + * 枚举 {@link CodegenFrontTypeEnum#getType()} + */ + @NotNull(message = "代码生成的前端类型不能为空") + private Integer frontType; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/codegen/package-info.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/codegen/package-info.java new file mode 100644 index 0000000..87b2b4a --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/codegen/package-info.java @@ -0,0 +1,4 @@ +/** + * 代码生成器 + */ +package com.win.module.infra.framework.codegen; diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/monitor/config/AdminServerConfiguration.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/monitor/config/AdminServerConfiguration.java new file mode 100644 index 0000000..847b7a1 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/monitor/config/AdminServerConfiguration.java @@ -0,0 +1,9 @@ +package com.win.module.infra.framework.monitor.config; + +import de.codecentric.boot.admin.server.config.EnableAdminServer; +import org.springframework.context.annotation.Configuration; + +@Configuration(proxyBeanMethods = false) +@EnableAdminServer +public class AdminServerConfiguration { +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/monitor/package-info.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/monitor/package-info.java new file mode 100644 index 0000000..9f9f730 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/monitor/package-info.java @@ -0,0 +1,4 @@ +/** + * 使用 Spring Boot Admin 实现简单的监控平台 + */ +package com.win.module.infra.framework.monitor; diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/package-info.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/package-info.java new file mode 100644 index 0000000..9b5fba9 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/package-info.java @@ -0,0 +1,6 @@ +/** + * 属于 infra 模块的 framework 封装 + * + * @author 闻荫源码 + */ +package com.win.module.infra.framework; diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/security/config/SecurityConfiguration.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/security/config/SecurityConfiguration.java new file mode 100644 index 0000000..17a39a6 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/security/config/SecurityConfiguration.java @@ -0,0 +1,52 @@ +package com.win.module.infra.framework.security.config; + +import com.win.framework.security.config.AuthorizeRequestsCustomizer; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer; + +/** + * Infra 模块的 Security 配置 + */ +@Configuration(proxyBeanMethods = false, value = "infraSecurityConfiguration") +public class SecurityConfiguration { + + @Value("${spring.boot.admin.context-path:''}") + private String adminSeverContextPath; + + @Bean("infraAuthorizeRequestsCustomizer") + public AuthorizeRequestsCustomizer authorizeRequestsCustomizer() { + return new AuthorizeRequestsCustomizer() { + + @Override + public void customize(ExpressionUrlAuthorizationConfigurer.ExpressionInterceptUrlRegistry registry) { + // Swagger 接口文档 + registry.antMatchers("/v3/api-docs/**").permitAll() + .antMatchers("/swagger-ui.html").permitAll() + .antMatchers("/swagger-ui/**").permitAll() + .antMatchers("/swagger-resources/**").anonymous() + .antMatchers("/webjars/**").anonymous() + .antMatchers("/*/api-docs").anonymous(); + // 积木报表 + registry.antMatchers("/jmreport/**").permitAll(); + // Spring Boot Actuator 的安全配置 + registry.antMatchers("/actuator").anonymous() + .antMatchers("/actuator/**").anonymous(); + // Druid 监控 + registry.antMatchers("/druid/**").anonymous(); + // Spring Boot Admin Server 的安全配置 + registry.antMatchers(adminSeverContextPath).anonymous() + .antMatchers(adminSeverContextPath + "/**").anonymous(); + // magic-api 允许匿名访问 + registry.antMatchers("/magic/web/**").anonymous() + .antMatchers("/magic-api/**").anonymous(); + // 文件读取 + registry.antMatchers(buildAdminApi("/infra/file/*/get/**")).permitAll(); + } + + }; + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/security/core/package-info.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/security/core/package-info.java new file mode 100644 index 0000000..26f91a7 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/security/core/package-info.java @@ -0,0 +1,4 @@ +/** + * 占位 + */ +package com.win.module.infra.framework.security.core; diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/web/config/InfraWebConfiguration.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/web/config/InfraWebConfiguration.java new file mode 100644 index 0000000..f55a6ed --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/web/config/InfraWebConfiguration.java @@ -0,0 +1,24 @@ +package com.win.module.infra.framework.web.config; + +import com.win.framework.swagger.config.WinSwaggerAutoConfiguration; +import org.springdoc.core.GroupedOpenApi; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * infra 模块的 web 组件的 Configuration + * + * @author 闻荫源码 + */ +@Configuration(proxyBeanMethods = false) +public class InfraWebConfiguration { + + /** + * infra 模块的 API 分组 + */ + @Bean + public GroupedOpenApi infraGroupedOpenApi() { + return WinSwaggerAutoConfiguration.buildGroupedOpenApi("infra"); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/web/package-info.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/web/package-info.java new file mode 100644 index 0000000..20da828 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/web/package-info.java @@ -0,0 +1,4 @@ +/** + * infra 模块的 web 配置 + */ +package com.win.module.infra.framework.web; diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/mq/consumer/logger/ApiAccessLogConsumer.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/mq/consumer/logger/ApiAccessLogConsumer.java new file mode 100644 index 0000000..b3e88e1 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/mq/consumer/logger/ApiAccessLogConsumer.java @@ -0,0 +1,32 @@ +package com.win.module.infra.mq.consumer.logger; + +import com.win.framework.mq.core.stream.AbstractStreamMessageListener; +import com.win.module.infra.api.logger.dto.ApiAccessLogCreateReqDTO; +import com.win.module.infra.convert.logger.ApiAccessLogConvert; +import com.win.module.infra.mq.message.logger.ApiAccessLogMessage; +import com.win.module.infra.service.logger.ApiAccessLogService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * 访问日志消费端 + * + * @author zzf + */ +@Component +@Slf4j +public class ApiAccessLogConsumer extends AbstractStreamMessageListener { + + @Resource + private ApiAccessLogService apiAccessLogService; + + @Override + public void onMessage(ApiAccessLogMessage message) { + log.info("[onMessage][消息内容({})]", message); + ApiAccessLogCreateReqDTO apiAccessLog = ApiAccessLogConvert.INSTANCE.convert(message); + apiAccessLogService.createApiAccessLog(apiAccessLog); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/mq/consumer/logger/ApiErrorLogConsumer.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/mq/consumer/logger/ApiErrorLogConsumer.java new file mode 100644 index 0000000..c129b39 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/mq/consumer/logger/ApiErrorLogConsumer.java @@ -0,0 +1,32 @@ +package com.win.module.infra.mq.consumer.logger; + +import com.win.framework.mq.core.stream.AbstractStreamMessageListener; +import com.win.module.infra.api.logger.dto.ApiErrorLogCreateReqDTO; +import com.win.module.infra.convert.logger.ApiErrorLogConvert; +import com.win.module.infra.mq.message.logger.ApiErrorLogMessage; +import com.win.module.infra.service.logger.ApiErrorLogService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * 访问日志消费端 + * + * @author zzf + */ +@Component +@Slf4j +public class ApiErrorLogConsumer extends AbstractStreamMessageListener { + + @Resource + private ApiErrorLogService apiErrorLogService; + + @Override + public void onMessage(ApiErrorLogMessage message) { + log.info("[onMessage][消息内容({})]", message); + ApiErrorLogCreateReqDTO apiAccessLog = ApiErrorLogConvert.INSTANCE.convert(message); + apiErrorLogService.createApiErrorLog(apiAccessLog); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/mq/consumer/trends/TrendsConsumer.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/mq/consumer/trends/TrendsConsumer.java new file mode 100644 index 0000000..2dd3d7d --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/mq/consumer/trends/TrendsConsumer.java @@ -0,0 +1,32 @@ +package com.win.module.infra.mq.consumer.trends; + +import com.win.framework.mq.core.stream.AbstractStreamMessageListener; +import com.win.module.infra.api.trends.dto.TrendsCreateReqDTO; +import com.win.module.infra.convert.trends.TrendsConvert; +import com.win.module.infra.mq.message.trends.TrendsMessage; +import com.win.module.infra.service.trends.TrendsService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * 访问日志消费端 + * + * @author zzf + */ +@Component +@Slf4j +public class TrendsConsumer extends AbstractStreamMessageListener { + + @Resource + private TrendsService trendsService; + + @Override + public void onMessage(TrendsMessage message) { + log.info("[onMessage][消息内容({})]", message); + TrendsCreateReqDTO trendsCreateReqDTO = TrendsConvert.INSTANCE.convert(message); + trendsService.createTrends(trendsCreateReqDTO); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/mq/message/logger/ApiAccessLogMessage.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/mq/message/logger/ApiAccessLogMessage.java new file mode 100644 index 0000000..437535f --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/mq/message/logger/ApiAccessLogMessage.java @@ -0,0 +1,89 @@ +package com.win.module.infra.mq.message.logger; + +import com.win.framework.mq.core.stream.AbstractStreamMessage; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +/** + * 短信发送消息 + * + * @author 闻荫源码 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class ApiAccessLogMessage extends AbstractStreamMessage { + + /** + * 链路追踪编号 + */ + private String traceId; + /** + * 用户编号 + */ + private Long userId; + /** + * 应用名 + */ + @NotNull(message = "应用名不能为空") + private String applicationName; + + /** + * 请求方法名 + */ + @NotNull(message = "http 请求方法不能为空") + private String requestMethod; + /** + * 访问地址 + */ + @NotNull(message = "访问地址不能为空") + private String requestUrl; + /** + * 请求参数 + */ + @NotNull(message = "请求参数不能为空") + private String requestParams; + /** + * 用户 IP + */ + @NotNull(message = "ip 不能为空") + private String userIp; + /** + * 浏览器 UA + */ + @NotNull(message = "User-Agent 不能为空") + private String userAgent; + + /** + * 开始请求时间 + */ + @NotNull(message = "开始请求时间不能为空") + private LocalDateTime beginTime; + /** + * 结束请求时间 + */ + @NotNull(message = "结束请求时间不能为空") + private LocalDateTime endTime; + /** + * 执行时长,单位:毫秒 + */ + @NotNull(message = "执行时长不能为空") + private Integer duration; + /** + * 结果码 + */ + @NotNull(message = "错误码不能为空") + private Integer resultCode; + /** + * 结果提示 + */ + private String resultMsg; + + @Override + public String getStreamKey() { + return "api.access.log.create"; + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/mq/message/logger/ApiErrorLogMessage.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/mq/message/logger/ApiErrorLogMessage.java new file mode 100644 index 0000000..3d2341c --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/mq/message/logger/ApiErrorLogMessage.java @@ -0,0 +1,110 @@ +package com.win.module.infra.mq.message.logger; + +import com.win.framework.mq.core.stream.AbstractStreamMessage; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +/** + * 短信发送消息 + * + * @author 闻荫源码 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class ApiErrorLogMessage extends AbstractStreamMessage { + + /** + * 链路编号 + */ + private String traceId; + /** + * 账号编号 + */ + private Long userId; + /** + * 应用名 + */ + @NotNull(message = "应用名不能为空") + private String applicationName; + + /** + * 请求方法名 + */ + @NotNull(message = "http 请求方法不能为空") + private String requestMethod; + /** + * 访问地址 + */ + @NotNull(message = "访问地址不能为空") + private String requestUrl; + /** + * 请求参数 + */ + @NotNull(message = "请求参数不能为空") + private String requestParams; + /** + * 用户 IP + */ + @NotNull(message = "ip 不能为空") + private String userIp; + /** + * 浏览器 UA + */ + @NotNull(message = "User-Agent 不能为空") + private String userAgent; + + /** + * 异常时间 + */ + @NotNull(message = "异常时间不能为空") + private LocalDateTime exceptionTime; + /** + * 异常名 + */ + @NotNull(message = "异常名不能为空") + private String exceptionName; + /** + * 异常发生的类全名 + */ + @NotNull(message = "异常发生的类全名不能为空") + private String exceptionClassName; + /** + * 异常发生的类文件 + */ + @NotNull(message = "异常发生的类文件不能为空") + private String exceptionFileName; + /** + * 异常发生的方法名 + */ + @NotNull(message = "异常发生的方法名不能为空") + private String exceptionMethodName; + /** + * 异常发生的方法所在行 + */ + @NotNull(message = "异常发生的方法所在行不能为空") + private Integer exceptionLineNumber; + /** + * 异常的栈轨迹异常的栈轨迹 + */ + @NotNull(message = "异常的栈轨迹不能为空") + private String exceptionStackTrace; + /** + * 异常导致的根消息 + */ + @NotNull(message = "异常导致的根消息不能为空") + private String exceptionRootCauseMessage; + /** + * 异常导致的消息 + */ + @NotNull(message = "异常导致的消息不能为空") + private String exceptionMessage; + + @Override + public String getStreamKey() { + return "api.error.log.create"; + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/mq/message/trends/TrendsMessage.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/mq/message/trends/TrendsMessage.java new file mode 100644 index 0000000..c756bd8 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/mq/message/trends/TrendsMessage.java @@ -0,0 +1,37 @@ +package com.win.module.infra.mq.message.trends; + +import com.win.framework.mq.core.stream.AbstractStreamMessage; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotNull; + +/** + * 短信发送消息 + * + * @author 闻荫源码 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class TrendsMessage extends AbstractStreamMessage { + + @NotNull(message = "表名不能为空") + private String tableName; + + @NotNull(message = "表数据id不能为空") + private Long tableId; + + @NotNull(message = "类型不能为空") + private Integer type; + + @NotNull(message = "内容不能为空") + private String content; + + private String creator; + + @Override + public String getStreamKey() { + return "trends.create"; + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/mq/producer/logger/ApiAccessLogProducer.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/mq/producer/logger/ApiAccessLogProducer.java new file mode 100644 index 0000000..3c84bff --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/mq/producer/logger/ApiAccessLogProducer.java @@ -0,0 +1,26 @@ +package com.win.module.infra.mq.producer.logger; + +import com.win.framework.mq.core.RedisMQTemplate; +import com.win.module.infra.mq.message.logger.ApiAccessLogMessage; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +@Slf4j +@Component +public class ApiAccessLogProducer { + + @Resource + private RedisMQTemplate redisMQTemplate; + + /** + * 创建访问记录 + * + * @param apiAccessLogMessage + */ + public void sendMessage(ApiAccessLogMessage apiAccessLogMessage) { + redisMQTemplate.send(apiAccessLogMessage); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/mq/producer/logger/ApiErrorLogProducer.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/mq/producer/logger/ApiErrorLogProducer.java new file mode 100644 index 0000000..40789ae --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/mq/producer/logger/ApiErrorLogProducer.java @@ -0,0 +1,26 @@ +package com.win.module.infra.mq.producer.logger; + +import com.win.framework.mq.core.RedisMQTemplate; +import com.win.module.infra.mq.message.logger.ApiErrorLogMessage; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +@Slf4j +@Component +public class ApiErrorLogProducer { + + @Resource + private RedisMQTemplate redisMQTemplate; + + /** + * 创建访问记录 + * + * @param apiErrorLogMessage + */ + public void sendMessage(ApiErrorLogMessage apiErrorLogMessage) { + redisMQTemplate.send(apiErrorLogMessage); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/mq/producer/trends/TrendsProducer.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/mq/producer/trends/TrendsProducer.java new file mode 100644 index 0000000..897512c --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/mq/producer/trends/TrendsProducer.java @@ -0,0 +1,26 @@ +package com.win.module.infra.mq.producer.trends; + +import com.win.framework.mq.core.RedisMQTemplate; +import com.win.module.infra.mq.message.trends.TrendsMessage; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +@Slf4j +@Component +public class TrendsProducer { + + @Resource + private RedisMQTemplate redisMQTemplate; + + /** + * 创建访问记录 + * + * @param trendsMessage + */ + public void sendMessage(TrendsMessage trendsMessage) { + redisMQTemplate.send(trendsMessage); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/codegen/CodegenService.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/codegen/CodegenService.java new file mode 100644 index 0000000..e1ab539 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/codegen/CodegenService.java @@ -0,0 +1,94 @@ +package com.win.module.infra.service.codegen; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.infra.controller.codegen.vo.CodegenCreateListReqVO; +import com.win.module.infra.controller.codegen.vo.CodegenUpdateReqVO; +import com.win.module.infra.controller.codegen.vo.table.CodegenTablePageReqVO; +import com.win.module.infra.controller.codegen.vo.table.DatabaseTableRespVO; +import com.win.module.infra.dal.dataobject.codegen.CodegenColumnDO; +import com.win.module.infra.dal.dataobject.codegen.CodegenTableDO; + +import java.util.List; +import java.util.Map; + +/** + * 代码生成 Service 接口 + * + * @author 闻荫源码 + */ +public interface CodegenService { + + /** + * 基于数据库的表结构,创建代码生成器的表定义 + * + * @param userId 用户编号 + * @param reqVO 表信息 + * @return 创建的表定义的编号数组 + */ + List createCodegenList(Long userId, CodegenCreateListReqVO reqVO); + + /** + * 更新数据库的表和字段定义 + * + * @param updateReqVO 更新信息 + */ + void updateCodegen(CodegenUpdateReqVO updateReqVO); + + /** + * 基于数据库的表结构,同步数据库的表和字段定义 + * + * @param tableId 表编号 + */ + void syncCodegenFromDB(Long tableId); + + /** + * 删除数据库的表和字段定义 + * + * @param tableId 数据编号 + */ + void deleteCodegen(Long tableId); + + /** + * 获得表定义分页 + * + * @param pageReqVO 分页条件 + * @return 表定义分页 + */ + PageResult getCodegenTablePage(CodegenTablePageReqVO pageReqVO); + + /** + * 获得表定义 + * + * @param id 表编号 + * @return 表定义 + */ + CodegenTableDO getCodegenTablePage(Long id); + + /** + * 获得指定表的字段定义数组 + * + * @param tableId 表编号 + * @return 字段定义数组 + */ + List getCodegenColumnListByTableId(Long tableId); + + /** + * 执行指定表的代码生成 + * + * @param tableId 表编号 + * @return 生成结果。key 为文件路径,value 为对应的代码内容 + */ + Map generationCodes(Long tableId); + + /** + * 获得数据库自带的表定义列表 + * + * + * @param dataSourceConfigId 数据源的配置编号 + * @param name 表名称 + * @param comment 表描述 + * @return 表定义列表 + */ + List getDatabaseTableList(Long dataSourceConfigId, String name, String comment); + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/codegen/CodegenServiceImpl.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/codegen/CodegenServiceImpl.java new file mode 100644 index 0000000..d2946f8 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/codegen/CodegenServiceImpl.java @@ -0,0 +1,253 @@ +package com.win.module.infra.service.codegen; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.collection.CollectionUtils; +import com.win.module.infra.controller.codegen.vo.CodegenCreateListReqVO; +import com.win.module.infra.controller.codegen.vo.CodegenUpdateReqVO; +import com.win.module.infra.controller.codegen.vo.table.CodegenTablePageReqVO; +import com.win.module.infra.controller.codegen.vo.table.DatabaseTableRespVO; +import com.win.module.infra.convert.codegen.CodegenConvert; +import com.win.module.infra.dal.dataobject.codegen.CodegenColumnDO; +import com.win.module.infra.dal.dataobject.codegen.CodegenTableDO; +import com.win.module.infra.dal.mysql.codegen.CodegenColumnMapper; +import com.win.module.infra.dal.mysql.codegen.CodegenTableMapper; +import com.win.module.infra.enums.codegen.CodegenSceneEnum; +import com.win.module.infra.framework.codegen.config.CodegenProperties; +import com.win.module.infra.service.codegen.inner.CodegenBuilder; +import com.win.module.infra.service.codegen.inner.CodegenEngine; +import com.win.module.infra.service.db.DatabaseTableService; +import com.win.module.system.api.user.AdminUserApi; +import com.baomidou.mybatisplus.generator.config.po.TableField; +import com.baomidou.mybatisplus.generator.config.po.TableInfo; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.BiPredicate; +import java.util.stream.Collectors; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.infra.enums.ErrorCodeConstants.*; + +/** + * 代码生成 Service 实现类 + * + * @author 闻荫源码 + */ +@Service +public class CodegenServiceImpl implements CodegenService { + + @Resource + private DatabaseTableService databaseTableService; + + @Resource + private CodegenTableMapper codegenTableMapper; + @Resource + private CodegenColumnMapper codegenColumnMapper; + + @Resource + private AdminUserApi userApi; + + @Resource + private CodegenBuilder codegenBuilder; + @Resource + private CodegenEngine codegenEngine; + + @Resource + private CodegenProperties codegenProperties; + + @Override + @Transactional(rollbackFor = Exception.class) + public List createCodegenList(Long userId, CodegenCreateListReqVO reqVO) { + List ids = new ArrayList<>(reqVO.getTableNames().size()); + // 遍历添加。虽然效率会低一点,但是没必要做成完全批量,因为不会这么大量 + reqVO.getTableNames().forEach(tableName -> ids.add(createCodegen(userId, reqVO.getDataSourceConfigId(), tableName))); + return ids; + } + + public Long createCodegen(Long userId, Long dataSourceConfigId, String tableName) { + // 从数据库中,获得数据库表结构 + TableInfo tableInfo = databaseTableService.getTable(dataSourceConfigId, tableName); + // 导入 + return createCodegen0(userId, dataSourceConfigId, tableInfo); + } + + private Long createCodegen0(Long userId, Long dataSourceConfigId, TableInfo tableInfo) { + // 校验导入的表和字段非空 + validateTableInfo(tableInfo); + // 校验是否已经存在 + if (codegenTableMapper.selectByTableNameAndDataSourceConfigId(tableInfo.getName(), + dataSourceConfigId) != null) { + throw exception(CODEGEN_TABLE_EXISTS); + } + + // 构建 CodegenTableDO 对象,插入到 DB 中 + CodegenTableDO table = codegenBuilder.buildTable(tableInfo); + table.setDataSourceConfigId(dataSourceConfigId); + table.setScene(CodegenSceneEnum.ADMIN.getScene()); // 默认配置下,使用管理后台的模板 + table.setFrontType(codegenProperties.getFrontType()); + table.setAuthor(userApi.getUser(userId).getNickname()); + codegenTableMapper.insert(table); + + // 构建 CodegenColumnDO 数组,插入到 DB 中 + List columns = codegenBuilder.buildColumns(table.getId(), tableInfo.getFields()); + // 如果没有主键,则使用第一个字段作为主键 + if (!tableInfo.isHavePrimaryKey()) { + columns.get(0).setPrimaryKey(true); + } + codegenColumnMapper.insertBatch(columns); + return table.getId(); + } + + private void validateTableInfo(TableInfo tableInfo) { + if (tableInfo == null) { + throw exception(CODEGEN_IMPORT_TABLE_NULL); + } + if (StrUtil.isEmpty(tableInfo.getComment())) { + throw exception(CODEGEN_TABLE_INFO_TABLE_COMMENT_IS_NULL); + } + if (CollUtil.isEmpty(tableInfo.getFields())) { + throw exception(CODEGEN_IMPORT_COLUMNS_NULL); + } + tableInfo.getFields().forEach(field -> { + if (StrUtil.isEmpty(field.getComment())) { + throw exception(CODEGEN_TABLE_INFO_COLUMN_COMMENT_IS_NULL, field.getName()); + } + }); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateCodegen(CodegenUpdateReqVO updateReqVO) { + // 校验是否已经存在 + if (codegenTableMapper.selectById(updateReqVO.getTable().getId()) == null) { + throw exception(CODEGEN_TABLE_NOT_EXISTS); + } + + // 更新 table 表定义 + CodegenTableDO updateTableObj = CodegenConvert.INSTANCE.convert(updateReqVO.getTable()); + codegenTableMapper.updateById(updateTableObj); + // 更新 column 字段定义 + List updateColumnObjs = CodegenConvert.INSTANCE.convertList03(updateReqVO.getColumns()); + updateColumnObjs.forEach(updateColumnObj -> codegenColumnMapper.updateById(updateColumnObj)); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void syncCodegenFromDB(Long tableId) { + // 校验是否已经存在 + CodegenTableDO table = codegenTableMapper.selectById(tableId); + if (table == null) { + throw exception(CODEGEN_TABLE_NOT_EXISTS); + } + // 从数据库中,获得数据库表结构 + TableInfo tableInfo = databaseTableService.getTable(table.getDataSourceConfigId(), table.getTableName()); + // 执行同步 + syncCodegen0(tableId, tableInfo); + } + + private void syncCodegen0(Long tableId, TableInfo tableInfo) { + // 校验导入的表和字段非空 + validateTableInfo(tableInfo); + List tableFields = tableInfo.getFields(); + + // 构建 CodegenColumnDO 数组,只同步新增的字段 + List codegenColumns = codegenColumnMapper.selectListByTableId(tableId); + Set codegenColumnNames = CollectionUtils.convertSet(codegenColumns, CodegenColumnDO::getColumnName); + + //计算需要修改的字段,插入时重新插入,删除时将原来的删除 + BiPredicate pr = + (tableField, codegenColumn) -> tableField.getMetaInfo().getJdbcType().name().equals(codegenColumn.getDataType()) + && tableField.getMetaInfo().isNullable() == codegenColumn.getNullable() + && tableField.isKeyFlag() == codegenColumn.getPrimaryKey() + && tableField.getComment().equals(codegenColumn.getColumnComment()); + Map codegenColumnDOMap = CollectionUtils.convertMap(codegenColumns, CodegenColumnDO::getColumnName); + //需要修改的字段 + Set modifyFieldNames = tableFields.stream() + .filter(tableField -> codegenColumnDOMap.get(tableField.getColumnName()) != null + && !pr.test(tableField, codegenColumnDOMap.get(tableField.getColumnName()))) + .map(TableField::getColumnName) + .collect(Collectors.toSet()); + // 计算需要删除的字段 + Set tableFieldNames = CollectionUtils.convertSet(tableFields, TableField::getName); + Set deleteColumnIds = codegenColumns.stream() + .filter(column -> (!tableFieldNames.contains(column.getColumnName())) || modifyFieldNames.contains(column.getColumnName())) + .map(CodegenColumnDO::getId).collect(Collectors.toSet()); + // 移除已经存在的字段 + tableFields.removeIf(column -> codegenColumnNames.contains(column.getColumnName()) && (!modifyFieldNames.contains(column.getColumnName()))); + if (CollUtil.isEmpty(tableFields) && CollUtil.isEmpty(deleteColumnIds)) { + throw exception(CODEGEN_SYNC_NONE_CHANGE); + } + + // 插入新增的字段 + List columns = codegenBuilder.buildColumns(tableId, tableFields); + codegenColumnMapper.insertBatch(columns); + // 删除不存在的字段 + if (CollUtil.isNotEmpty(deleteColumnIds)) { + codegenColumnMapper.deleteBatchIds(deleteColumnIds); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteCodegen(Long tableId) { + // 校验是否已经存在 + if (codegenTableMapper.selectById(tableId) == null) { + throw exception(CODEGEN_TABLE_NOT_EXISTS); + } + + // 删除 table 表定义 + codegenTableMapper.deleteById(tableId); + // 删除 column 字段定义 + codegenColumnMapper.deleteListByTableId(tableId); + } + + @Override + public PageResult getCodegenTablePage(CodegenTablePageReqVO pageReqVO) { + return codegenTableMapper.selectPage(pageReqVO); + } + + @Override + public CodegenTableDO getCodegenTablePage(Long id) { + return codegenTableMapper.selectById(id); + } + + @Override + public List getCodegenColumnListByTableId(Long tableId) { + return codegenColumnMapper.selectListByTableId(tableId); + } + + @Override + public Map generationCodes(Long tableId) { + // 校验是否已经存在 + CodegenTableDO table = codegenTableMapper.selectById(tableId); + if (table == null) { + throw exception(CODEGEN_TABLE_NOT_EXISTS); + } + List columns = codegenColumnMapper.selectListByTableId(tableId); + if (CollUtil.isEmpty(columns)) { + throw exception(CODEGEN_COLUMN_NOT_EXISTS); + } + + // 执行生成 + return codegenEngine.execute(table, columns); + } + + @Override + public List getDatabaseTableList(Long dataSourceConfigId, String name, String comment) { + List tables = databaseTableService.getTableList(dataSourceConfigId, name, comment); + // 移除已经生成的表 + // 移除在 Codegen 中,已经存在的 + Set existsTables = CollectionUtils.convertSet( + codegenTableMapper.selectListByDataSourceConfigId(dataSourceConfigId), CodegenTableDO::getTableName); + tables.removeIf(table -> existsTables.contains(table.getName())); + return CodegenConvert.INSTANCE.convertList04(tables); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/codegen/inner/CodegenBuilder.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/codegen/inner/CodegenBuilder.java new file mode 100644 index 0000000..5819603 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/codegen/inner/CodegenBuilder.java @@ -0,0 +1,213 @@ +package com.win.module.infra.service.codegen.inner; + +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.ReflectUtil; +import cn.hutool.core.util.StrUtil; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.module.infra.convert.codegen.CodegenConvert; +import com.win.module.infra.dal.dataobject.codegen.CodegenColumnDO; +import com.win.module.infra.dal.dataobject.codegen.CodegenTableDO; +import com.win.module.infra.enums.codegen.CodegenColumnHtmlTypeEnum; +import com.win.module.infra.enums.codegen.CodegenColumnListConditionEnum; +import com.win.module.infra.enums.codegen.CodegenTemplateTypeEnum; +import com.baomidou.mybatisplus.generator.config.po.TableField; +import com.baomidou.mybatisplus.generator.config.po.TableInfo; +import com.google.common.collect.Sets; +import org.springframework.stereotype.Component; + +import java.util.*; + +import static cn.hutool.core.text.CharSequenceUtil.*; +import static cn.hutool.core.util.RandomUtil.randomEle; +import static cn.hutool.core.util.RandomUtil.randomInt; + +/** + * 代码生成器的 Builder,负责: + * 1. 将数据库的表 {@link TableInfo} 定义,构建成 {@link CodegenTableDO} + * 2. 将数据库的列 {@link TableField} 构定义,建成 {@link CodegenColumnDO} + */ +@Component +public class CodegenBuilder { + + /** + * 字段名与 {@link CodegenColumnListConditionEnum} 的默认映射 + * 注意,字段的匹配以后缀的方式 + */ + private static final Map COLUMN_LIST_OPERATION_CONDITION_MAPPINGS = + MapUtil.builder() + .put("name", CodegenColumnListConditionEnum.LIKE) + .put("time", CodegenColumnListConditionEnum.BETWEEN) + .put("date", CodegenColumnListConditionEnum.BETWEEN) + .build(); + + /** + * 字段名与 {@link CodegenColumnHtmlTypeEnum} 的默认映射 + * 注意,字段的匹配以后缀的方式 + */ + private static final Map COLUMN_HTML_TYPE_MAPPINGS = + MapUtil.builder() + .put("status", CodegenColumnHtmlTypeEnum.RADIO) + .put("sex", CodegenColumnHtmlTypeEnum.RADIO) + .put("type", CodegenColumnHtmlTypeEnum.SELECT) + .put("image", CodegenColumnHtmlTypeEnum.UPLOAD_IMAGE) + .put("file", CodegenColumnHtmlTypeEnum.UPLOAD_FILE) + .put("content", CodegenColumnHtmlTypeEnum.EDITOR) + .put("description", CodegenColumnHtmlTypeEnum.EDITOR) + .put("demo", CodegenColumnHtmlTypeEnum.EDITOR) + .put("time", CodegenColumnHtmlTypeEnum.DATETIME) + .put("date", CodegenColumnHtmlTypeEnum.DATETIME) + .build(); + + /** + * 多租户编号的字段名 + */ + public static final String TENANT_ID_FIELD = "tenantId"; + /** + * {@link com.win.framework.mybatis.core.dataobject.BaseDO} 的字段 + */ + public static final Set BASE_DO_FIELDS = new HashSet<>(); + /** + * 新增操作,不需要传递的字段 + */ + private static final Set CREATE_OPERATION_EXCLUDE_COLUMN = Sets.newHashSet("id"); + /** + * 修改操作,不需要传递的字段 + */ + private static final Set UPDATE_OPERATION_EXCLUDE_COLUMN = Sets.newHashSet(); + /** + * 列表操作的条件,不需要传递的字段 + */ + private static final Set LIST_OPERATION_EXCLUDE_COLUMN = Sets.newHashSet("id"); + /** + * 列表操作的结果,不需要返回的字段 + */ + private static final Set LIST_OPERATION_RESULT_EXCLUDE_COLUMN = Sets.newHashSet(); + + static { + Arrays.stream(ReflectUtil.getFields(BaseDO.class)).forEach(field -> BASE_DO_FIELDS.add(field.getName())); + BASE_DO_FIELDS.add(TENANT_ID_FIELD); + // 处理 OPERATION 相关的字段 + CREATE_OPERATION_EXCLUDE_COLUMN.addAll(BASE_DO_FIELDS); + UPDATE_OPERATION_EXCLUDE_COLUMN.addAll(BASE_DO_FIELDS); + LIST_OPERATION_EXCLUDE_COLUMN.addAll(BASE_DO_FIELDS); + LIST_OPERATION_EXCLUDE_COLUMN.remove("createTime"); // 创建时间,还是可能需要传递的 + LIST_OPERATION_RESULT_EXCLUDE_COLUMN.addAll(BASE_DO_FIELDS); + LIST_OPERATION_RESULT_EXCLUDE_COLUMN.remove("createTime"); // 创建时间,还是需要返回的 + } + + public CodegenTableDO buildTable(TableInfo tableInfo) { + CodegenTableDO table = CodegenConvert.INSTANCE.convert(tableInfo); + initTableDefault(table); + return table; + } + + /** + * 初始化 Table 表的默认字段 + * + * @param table 表定义 + */ + private void initTableDefault(CodegenTableDO table) { + // 以 system_dept 举例子。moduleName 为 system、businessName 为 dept、className 为 Dept + // 如果希望以 System 前缀,则可以手动在【代码生成 - 修改生成配置 - 基本信息】,将实体类名称改为 SystemDept 即可 + String tableName = table.getTableName().toLowerCase(); + // 第一步,_ 前缀的前面,作为 module 名字;第二步,moduleName 必须小写; + table.setModuleName(subBefore(tableName, '_', false).toLowerCase()); + // 第一步,第一个 _ 前缀的后面,作为 module 名字; 第二步,可能存在多个 _ 的情况,转换成驼峰; 第三步,businessName 必须小写; + table.setBusinessName(toCamelCase(subAfter(tableName, '_', false)).toLowerCase()); + // 驼峰 + 首字母大写;第一步,第一个 _ 前缀的后面,作为 class 名字;第二步,驼峰命名 + table.setClassName(upperFirst(toCamelCase(subAfter(tableName, '_', false)))); + // 去除结尾的表,作为类描述 + table.setClassComment(StrUtil.removeSuffixIgnoreCase(table.getTableComment(), "表")); + table.setTemplateType(CodegenTemplateTypeEnum.CRUD.getType()); + } + + public List buildColumns(Long tableId, List tableFields) { + List columns = CodegenConvert.INSTANCE.convertList(tableFields); + int index = 1; + for (CodegenColumnDO column : columns) { + column.setTableId(tableId); + column.setOrdinalPosition(index++); + // 初始化 Column 列的默认字段 + processColumnOperation(column); // 处理 CRUD 相关的字段的默认值 + processColumnUI(column); // 处理 UI 相关的字段的默认值 + processColumnExample(column); // 处理字段的 swagger example 示例 + } + return columns; + } + + private void processColumnOperation(CodegenColumnDO column) { + // 处理 createOperation 字段 + column.setCreateOperation(!CREATE_OPERATION_EXCLUDE_COLUMN.contains(column.getJavaField()) + && !column.getPrimaryKey()); // 对于主键,创建时无需传递 + // 处理 updateOperation 字段 + column.setUpdateOperation(!UPDATE_OPERATION_EXCLUDE_COLUMN.contains(column.getJavaField()) + || column.getPrimaryKey()); // 对于主键,更新时需要传递 + // 处理 listOperation 字段 + column.setListOperation(!LIST_OPERATION_EXCLUDE_COLUMN.contains(column.getJavaField()) + && !column.getPrimaryKey()); // 对于主键,列表过滤不需要传递 + // 处理 listOperationCondition 字段 + COLUMN_LIST_OPERATION_CONDITION_MAPPINGS.entrySet().stream() + .filter(entry -> StrUtil.endWithIgnoreCase(column.getJavaField(), entry.getKey())) + .findFirst().ifPresent(entry -> column.setListOperationCondition(entry.getValue().getCondition())); + if (column.getListOperationCondition() == null) { + column.setListOperationCondition(CodegenColumnListConditionEnum.EQ.getCondition()); + } + // 处理 listOperationResult 字段 + column.setListOperationResult(!LIST_OPERATION_RESULT_EXCLUDE_COLUMN.contains(column.getJavaField())); + } + + private void processColumnUI(CodegenColumnDO column) { + // 基于后缀进行匹配 + COLUMN_HTML_TYPE_MAPPINGS.entrySet().stream() + .filter(entry -> StrUtil.endWithIgnoreCase(column.getJavaField(), entry.getKey())) + .findFirst().ifPresent(entry -> column.setHtmlType(entry.getValue().getType())); + // 如果是 Boolean 类型时,设置为 radio 类型. + // 其它类型,因为字段名可以相对保障,所以不进行处理。例如说 date 对应 datetime 类型. + if (Boolean.class.getSimpleName().equals(column.getJavaType())) { + column.setHtmlType(CodegenColumnHtmlTypeEnum.RADIO.getType()); + } + // 兜底,设置默认为 input 类型 + if (column.getHtmlType() == null) { + column.setHtmlType(CodegenColumnHtmlTypeEnum.INPUT.getType()); + } + } + + /** + * 处理字段的 swagger example 示例 + * + * @param column 字段 + */ + private void processColumnExample(CodegenColumnDO column) { + // id、price、count 等可能是整数的后缀 + if (StrUtil.endWithAnyIgnoreCase(column.getJavaField(), "id", "price", "count")) { + column.setExample(String.valueOf(randomInt(1, Short.MAX_VALUE))); + return; + } + // name + if (StrUtil.endWithIgnoreCase(column.getJavaField(), "name")) { + column.setExample(randomEle(new String[]{"张三", "李四", "王五", "赵六", "芋艿"})); + return; + } + // status + if (StrUtil.endWithAnyIgnoreCase(column.getJavaField(), "status", "type")) { + column.setExample(randomEle(new String[]{"1", "2"})); + return; + } + // url + if (StrUtil.endWithIgnoreCase(column.getColumnName(), "url")) { + column.setExample("https://www.iocoder.cn"); + return; + } + // reason + if (StrUtil.endWithIgnoreCase(column.getColumnName(), "reason")) { + column.setExample(randomEle(new String[]{"不喜欢", "不对", "不好", "不香"})); + return; + } + // description、memo、remark + if (StrUtil.endWithAnyIgnoreCase(column.getColumnName(), "description", "memo", "remark")) { + column.setExample(randomEle(new String[]{"你猜", "随便", "你说的对"})); + return; + } + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/codegen/inner/CodegenEngine.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/codegen/inner/CodegenEngine.java new file mode 100644 index 0000000..a741984 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/codegen/inner/CodegenEngine.java @@ -0,0 +1,303 @@ +package com.win.module.infra.service.codegen.inner; + +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.template.TemplateConfig; +import cn.hutool.extra.template.TemplateEngine; +import cn.hutool.extra.template.engine.velocity.VelocityEngine; +import com.win.framework.common.exception.util.ServiceExceptionUtil; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageParam; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.collection.CollectionUtils; +import com.win.framework.common.util.date.DateUtils; +import com.win.framework.common.util.date.LocalDateTimeUtils; +import com.win.framework.common.util.object.ObjectUtils; +import com.win.framework.excel.core.annotations.DictFormat; +import com.win.framework.excel.core.convert.DictConvert; +import com.win.framework.excel.core.util.ExcelUtils; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.framework.operatelog.core.annotations.OperateLog; +import com.win.framework.operatelog.core.enums.OperateTypeEnum; +import com.win.module.infra.dal.dataobject.codegen.CodegenColumnDO; +import com.win.module.infra.dal.dataobject.codegen.CodegenTableDO; +import com.win.module.infra.enums.codegen.CodegenFrontTypeEnum; +import com.win.module.infra.enums.codegen.CodegenSceneEnum; +import com.win.module.infra.framework.codegen.config.CodegenProperties; +import com.google.common.collect.ImmutableTable; +import com.google.common.collect.Maps; +import com.google.common.collect.Table; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import static cn.hutool.core.map.MapUtil.getStr; +import static cn.hutool.core.text.CharSequenceUtil.*; + +/** + * 代码生成的引擎,用于具体生成代码 + * 目前基于 {@link org.apache.velocity.app.Velocity} 模板引擎实现 + * + * 考虑到 Java 模板引擎的框架非常多,Freemarker、Velocity、Thymeleaf 等等,所以我们采用 hutool 封装的 {@link cn.hutool.extra.template.Template} 抽象 + * + * @author 闻荫源码 + */ +@Component +public class CodegenEngine { + + /** + * 后端的模板配置 + * + * key:模板在 resources 的地址 + * value:生成的路径 + */ + private static final Map SERVER_TEMPLATES = MapUtil.builder(new LinkedHashMap<>()) // 有序 + // Java module-biz Main + .put(javaTemplatePath("controller/vo/baseVO"), javaModuleImplVOFilePath("BaseVO")) + .put(javaTemplatePath("controller/vo/createReqVO"), javaModuleImplVOFilePath("CreateReqVO")) + .put(javaTemplatePath("controller/vo/pageReqVO"), javaModuleImplVOFilePath("PageReqVO")) + .put(javaTemplatePath("controller/vo/respVO"), javaModuleImplVOFilePath("RespVO")) + .put(javaTemplatePath("controller/vo/updateReqVO"), javaModuleImplVOFilePath("UpdateReqVO")) + .put(javaTemplatePath("controller/vo/exportReqVO"), javaModuleImplVOFilePath("ExportReqVO")) + .put(javaTemplatePath("controller/vo/excelVO"), javaModuleImplVOFilePath("ExcelVO")) + .put(javaTemplatePath("controller/controller"), javaModuleImplControllerFilePath()) + .put(javaTemplatePath("convert/convert"), + javaModuleImplMainFilePath("convert/${table.businessName}/${table.className}Convert")) + .put(javaTemplatePath("dal/do"), + javaModuleImplMainFilePath("dal/dataobject/${table.businessName}/${table.className}DO")) + .put(javaTemplatePath("dal/mapper"), + javaModuleImplMainFilePath("dal/mysql/${table.businessName}/${table.className}Mapper")) + .put(javaTemplatePath("dal/mapper.xml"), mapperXmlFilePath()) + .put(javaTemplatePath("service/serviceImpl"), + javaModuleImplMainFilePath("service/${table.businessName}/${table.className}ServiceImpl")) + .put(javaTemplatePath("service/service"), + javaModuleImplMainFilePath("service/${table.businessName}/${table.className}Service")) + // Java module-biz Test + .put(javaTemplatePath("test/serviceTest"), + javaModuleImplTestFilePath("service/${table.businessName}/${table.className}ServiceImplTest")) + // Java module-api Main + .put(javaTemplatePath("enums/errorcode"), javaModuleApiMainFilePath("enums/ErrorCodeConstants_手动操作")) + // SQL + .put("codegen/sql/sql.vm", "sql/sql.sql") + .put("codegen/sql/h2.vm", "sql/h2.sql") + .build(); + + /** + * 后端的配置模版 + * + * key1:UI 模版的类型 {@link CodegenFrontTypeEnum#getType()} + * key2:模板在 resources 的地址 + * value:生成的路径 + */ + private static final Table FRONT_TEMPLATES = ImmutableTable.builder() + // Vue2 标准模版 + .put(CodegenFrontTypeEnum.VUE2.getType(), vueTemplatePath("views/index.vue"), + vueFilePath("views/${table.moduleName}/${classNameVar}/index.vue")) + .put(CodegenFrontTypeEnum.VUE2.getType(), vueTemplatePath("api/api.js"), + vueFilePath("api/${table.moduleName}/${classNameVar}.js")) + // Vue3 标准模版 + .put(CodegenFrontTypeEnum.VUE3.getType(), vue3TemplatePath("views/data.ts"), + vue3FilePath("views/${table.moduleName}/${classNameVar}/${classNameVar}.data.ts")) + .put(CodegenFrontTypeEnum.VUE3.getType(), vue3TemplatePath("views/index.vue"), + vue3FilePath("views/${table.moduleName}/${classNameVar}/index.vue")) +// .put(CodegenFrontTypeEnum.VUE3.getType(), vue3TemplatePath("views/form.vue"), +// vue3FilePath("views/${table.moduleName}/${classNameVar}/${simpleClassName}Form.vue")) + .put(CodegenFrontTypeEnum.VUE3.getType(), vue3TemplatePath("api/api.ts"), + vue3FilePath("api/${table.moduleName}/${classNameVar}/index.ts")) + // Vue3 Schema 模版 + .put(CodegenFrontTypeEnum.VUE3_SCHEMA.getType(), vue3SchemaTemplatePath("views/data.ts"), + vue3FilePath("views/${table.moduleName}/${classNameVar}/${classNameVar}.data.ts")) + .put(CodegenFrontTypeEnum.VUE3_SCHEMA.getType(), vue3SchemaTemplatePath("views/index.vue"), + vue3FilePath("views/${table.moduleName}/${classNameVar}/index.vue")) + .put(CodegenFrontTypeEnum.VUE3_SCHEMA.getType(), vue3SchemaTemplatePath("views/form.vue"), + vue3FilePath("views/${table.moduleName}/${classNameVar}/${simpleClassName}Form.vue")) + .put(CodegenFrontTypeEnum.VUE3_SCHEMA.getType(), vue3SchemaTemplatePath("api/api.ts"), + vue3FilePath("api/${table.moduleName}/${classNameVar}/index.ts")) + // Vue3 vben 模版 + .put(CodegenFrontTypeEnum.VUE3_VBEN.getType(), vue3VbenTemplatePath("views/data.ts"), + vue3FilePath("views/${table.moduleName}/${classNameVar}/${classNameVar}.data.ts")) + .put(CodegenFrontTypeEnum.VUE3_VBEN.getType(), vue3VbenTemplatePath("views/index.vue"), + vue3FilePath("views/${table.moduleName}/${classNameVar}/index.vue")) + .put(CodegenFrontTypeEnum.VUE3_VBEN.getType(), vue3VbenTemplatePath("views/form.vue"), + vue3FilePath("views/${table.moduleName}/${classNameVar}/${simpleClassName}Modal.vue")) + .put(CodegenFrontTypeEnum.VUE3_VBEN.getType(), vue3VbenTemplatePath("api/api.ts"), + vue3FilePath("api/${table.moduleName}/${classNameVar}/index.ts")) + .build(); + + @Resource + private CodegenProperties codegenProperties; + + /** + * 模板引擎,由 hutool 实现 + */ + private final TemplateEngine templateEngine; + /** + * 全局通用变量映射 + */ + private final Map globalBindingMap = new HashMap<>(); + + public CodegenEngine() { + // 初始化 TemplateEngine 属性 + TemplateConfig config = new TemplateConfig(); + config.setResourceMode(TemplateConfig.ResourceMode.CLASSPATH); + this.templateEngine = new VelocityEngine(config); + } + + @PostConstruct + private void initGlobalBindingMap() { + // 全局配置 + globalBindingMap.put("basePackage", codegenProperties.getBasePackage()); + globalBindingMap.put("baseFrameworkPackage", codegenProperties.getBasePackage() + + '.' + "framework"); // 用于后续获取测试类的 package 地址 + // 全局 Java Bean + globalBindingMap.put("CommonResultClassName", CommonResult.class.getName()); + globalBindingMap.put("PageResultClassName", PageResult.class.getName()); + // VO 类,独有字段 + globalBindingMap.put("PageParamClassName", PageParam.class.getName()); + globalBindingMap.put("DictFormatClassName", DictFormat.class.getName()); + // DO 类,独有字段 + globalBindingMap.put("BaseDOClassName", BaseDO.class.getName()); + globalBindingMap.put("baseDOFields", CodegenBuilder.BASE_DO_FIELDS); + globalBindingMap.put("QueryWrapperClassName", LambdaQueryWrapperX.class.getName()); + globalBindingMap.put("BaseMapperClassName", BaseMapperX.class.getName()); + // Util 工具类 + globalBindingMap.put("ServiceExceptionUtilClassName", ServiceExceptionUtil.class.getName()); + globalBindingMap.put("DateUtilsClassName", DateUtils.class.getName()); + globalBindingMap.put("ExcelUtilsClassName", ExcelUtils.class.getName()); + globalBindingMap.put("LocalDateTimeUtilsClassName", LocalDateTimeUtils.class.getName()); + globalBindingMap.put("ObjectUtilsClassName", ObjectUtils.class.getName()); + globalBindingMap.put("DictConvertClassName", DictConvert.class.getName()); + globalBindingMap.put("OperateLogClassName", OperateLog.class.getName()); + globalBindingMap.put("OperateTypeEnumClassName", OperateTypeEnum.class.getName()); + } + + public Map execute(CodegenTableDO table, List columns) { + // 创建 bindingMap + Map bindingMap = new HashMap<>(globalBindingMap); + bindingMap.put("table", table); + bindingMap.put("columns", columns); + bindingMap.put("primaryColumn", CollectionUtils.findFirst(columns, CodegenColumnDO::getPrimaryKey)); // 主键字段 + bindingMap.put("sceneEnum", CodegenSceneEnum.valueOf(table.getScene())); + + // className 相关 + // 去掉指定前缀,将 TestDictType 转换成 DictType. 因为在 create 等方法后,不需要带上 Test 前缀 + String simpleClassName = removePrefix(table.getClassName(), upperFirst(table.getModuleName())); + bindingMap.put("simpleClassName", simpleClassName); + bindingMap.put("simpleClassName_underlineCase", toUnderlineCase(simpleClassName)); // 将 DictType 转换成 dict_type + bindingMap.put("classNameVar", lowerFirst(simpleClassName)); // 将 DictType 转换成 dictType,用于变量 + // 将 DictType 转换成 dict-type + String simpleClassNameStrikeCase = toSymbolCase(simpleClassName, '-'); + bindingMap.put("simpleClassName_strikeCase", simpleClassNameStrikeCase); + // permission 前缀 + bindingMap.put("permissionPrefix", table.getModuleName() + ":" + simpleClassNameStrikeCase); + + // 执行生成 + Map templates = getTemplates(table.getFrontType()); + Map result = Maps.newLinkedHashMapWithExpectedSize(templates.size()); // 有序 + templates.forEach((vmPath, filePath) -> { + filePath = formatFilePath(filePath, bindingMap); + String content = templateEngine.getTemplate(vmPath).render(bindingMap); + // 去除字段后面多余的 , 逗号 + content = content.replaceAll(",\n}", "\n}").replaceAll(",\n }", "\n }"); + result.put(filePath, content); + }); + return result; + } + + private Map getTemplates(Integer frontType) { + Map templates = new LinkedHashMap<>(); + templates.putAll(SERVER_TEMPLATES); + templates.putAll(FRONT_TEMPLATES.row(frontType)); + return templates; + } + + private String formatFilePath(String filePath, Map bindingMap) { + filePath = StrUtil.replace(filePath, "${basePackage}", + getStr(bindingMap, "basePackage").replaceAll("\\.", "/")); + filePath = StrUtil.replace(filePath, "${classNameVar}", + getStr(bindingMap, "classNameVar")); + filePath = StrUtil.replace(filePath, "${simpleClassName}", + getStr(bindingMap, "simpleClassName")); + // sceneEnum 包含的字段 + CodegenSceneEnum sceneEnum = (CodegenSceneEnum) bindingMap.get("sceneEnum"); + filePath = StrUtil.replace(filePath, "${sceneEnum.prefixClass}", sceneEnum.getPrefixClass()); + filePath = StrUtil.replace(filePath, "${sceneEnum.basePackage}", sceneEnum.getBasePackage()); + // table 包含的字段 + CodegenTableDO table = (CodegenTableDO) bindingMap.get("table"); + filePath = StrUtil.replace(filePath, "${table.moduleName}", table.getModuleName()); + filePath = StrUtil.replace(filePath, "${table.businessName}", table.getBusinessName()); + filePath = StrUtil.replace(filePath, "${table.className}", table.getClassName()); + return filePath; + } + + private static String javaTemplatePath(String path) { + return "codegen/java/" + path + ".vm"; + } + + private static String javaModuleImplVOFilePath(String path) { + return javaModuleFilePath("controller/${sceneEnum.basePackage}/${table.businessName}/" + + "vo/${sceneEnum.prefixClass}${table.className}" + path, "biz", "main"); + } + + private static String javaModuleImplControllerFilePath() { + return javaModuleFilePath("controller/${sceneEnum.basePackage}/${table.businessName}/" + + "${sceneEnum.prefixClass}${table.className}Controller", "biz", "main"); + } + + private static String javaModuleImplMainFilePath(String path) { + return javaModuleFilePath(path, "biz", "main"); + } + + private static String javaModuleApiMainFilePath(String path) { + return javaModuleFilePath(path, "api", "main"); + } + + private static String javaModuleImplTestFilePath(String path) { + return javaModuleFilePath(path, "biz", "test"); + } + + private static String javaModuleFilePath(String path, String module, String src) { + return "win-module-${table.moduleName}/" + // 顶级模块 + "win-module-${table.moduleName}-" + module + "/" + // 子模块 + "src/" + src + "/java/${basePackage}/module/${table.moduleName}/" + path + ".java"; + } + + private static String mapperXmlFilePath() { + return "win-module-${table.moduleName}/" + // 顶级模块 + "win-module-${table.moduleName}-biz/" + // 子模块 + "src/main/resources/mapper/${table.businessName}/${table.className}Mapper.xml"; + } + + private static String vueTemplatePath(String path) { + return "codegen/vue/" + path + ".vm"; + } + + private static String vueFilePath(String path) { + return "win-ui-${sceneEnum.basePackage}/" + // 顶级目录 + "src/" + path; + } + + private static String vue3TemplatePath(String path) { + return "codegen/vue3/" + path + ".vm"; + } + + private static String vue3FilePath(String path) { + return "win-ui-${sceneEnum.basePackage}-vue3/" + // 顶级目录 + "src/" + path; + } + + private static String vue3SchemaTemplatePath(String path) { + return "codegen/vue3_schema/" + path + ".vm"; + } + + private static String vue3VbenTemplatePath(String path) { + return "codegen/vue3_vben/" + path + ".vm"; + } +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/config/ConfigService.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/config/ConfigService.java new file mode 100644 index 0000000..6ed6514 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/config/ConfigService.java @@ -0,0 +1,75 @@ +package com.win.module.infra.service.config; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.infra.controller.config.vo.ConfigCreateReqVO; +import com.win.module.infra.controller.config.vo.ConfigExportReqVO; +import com.win.module.infra.controller.config.vo.ConfigPageReqVO; +import com.win.module.infra.controller.config.vo.ConfigUpdateReqVO; +import com.win.module.infra.dal.dataobject.config.ConfigDO; + +import javax.validation.Valid; +import java.util.List; + +/** + * 参数配置 Service 接口 + * + * @author 闻荫源码 + */ +public interface ConfigService { + + /** + * 创建参数配置 + * + * @param reqVO 创建信息 + * @return 配置编号 + */ + Long createConfig(@Valid ConfigCreateReqVO reqVO); + + /** + * 更新参数配置 + * + * @param reqVO 更新信息 + */ + void updateConfig(@Valid ConfigUpdateReqVO reqVO); + + /** + * 删除参数配置 + * + * @param id 配置编号 + */ + void deleteConfig(Long id); + + /** + * 获得参数配置 + * + * @param id 配置编号 + * @return 参数配置 + */ + ConfigDO getConfig(Long id); + + /** + * 根据参数键,获得参数配置 + * + * @param key 配置键 + * @return 参数配置 + */ + ConfigDO getConfigByKey(String key); + + /** + * 获得参数配置分页列表 + * + * @param reqVO 分页条件 + * @return 分页列表 + */ + PageResult getConfigPage(@Valid ConfigPageReqVO reqVO); + + /** + * 获得参数配置列表 + * + * @param reqVO 列表 + * @return 列表 + */ + List getConfigList(@Valid ConfigExportReqVO reqVO); + + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/config/ConfigServiceImpl.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/config/ConfigServiceImpl.java new file mode 100644 index 0000000..7663c45 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/config/ConfigServiceImpl.java @@ -0,0 +1,123 @@ +package com.win.module.infra.service.config; + +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.pojo.PageResult; +import com.win.module.infra.controller.config.vo.ConfigCreateReqVO; +import com.win.module.infra.controller.config.vo.ConfigExportReqVO; +import com.win.module.infra.controller.config.vo.ConfigPageReqVO; +import com.win.module.infra.controller.config.vo.ConfigUpdateReqVO; +import com.win.module.infra.convert.config.ConfigConvert; +import com.win.module.infra.dal.dataobject.config.ConfigDO; +import com.win.module.infra.dal.mysql.config.ConfigMapper; +import com.win.module.infra.enums.config.ConfigTypeEnum; +import com.google.common.annotations.VisibleForTesting; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.infra.enums.ErrorCodeConstants.*; + +/** + * 参数配置 Service 实现类 + */ +@Service +@Slf4j +@Validated +public class ConfigServiceImpl implements ConfigService { + + @Resource + private ConfigMapper configMapper; + + @Override + public Long createConfig(ConfigCreateReqVO reqVO) { + // 校验正确性 + validateConfigForCreateOrUpdate(null, reqVO.getKey()); + // 插入参数配置 + ConfigDO config = ConfigConvert.INSTANCE.convert(reqVO); + config.setType(ConfigTypeEnum.CUSTOM.getType()); + configMapper.insert(config); + return config.getId(); + } + + @Override + public void updateConfig(ConfigUpdateReqVO reqVO) { + // 校验正确性 + validateConfigForCreateOrUpdate(reqVO.getId(), null); // 不允许更新 key + // 更新参数配置 + ConfigDO updateObj = ConfigConvert.INSTANCE.convert(reqVO); + configMapper.updateById(updateObj); + } + + @Override + public void deleteConfig(Long id) { + // 校验配置存在 + ConfigDO config = validateConfigExists(id); + // 内置配置,不允许删除 + if (ConfigTypeEnum.SYSTEM.getType().equals(config.getType())) { + throw exception(CONFIG_CAN_NOT_DELETE_SYSTEM_TYPE); + } + // 删除 + configMapper.deleteById(id); + } + + @Override + public ConfigDO getConfig(Long id) { + return configMapper.selectById(id); + } + + @Override + public ConfigDO getConfigByKey(String key) { + return configMapper.selectByKey(key); + } + + @Override + public PageResult getConfigPage(ConfigPageReqVO reqVO) { + return configMapper.selectPage(reqVO); + } + + @Override + public List getConfigList(ConfigExportReqVO reqVO) { + return configMapper.selectList(reqVO); + } + + private void validateConfigForCreateOrUpdate(Long id, String key) { + // 校验自己存在 + validateConfigExists(id); + // 校验参数配置 key 的唯一性 + if (StrUtil.isNotEmpty(key)) { + validateConfigKeyUnique(id, key); + } + } + + @VisibleForTesting + public ConfigDO validateConfigExists(Long id) { + if (id == null) { + return null; + } + ConfigDO config = configMapper.selectById(id); + if (config == null) { + throw exception(CONFIG_NOT_EXISTS); + } + return config; + } + + @VisibleForTesting + public void validateConfigKeyUnique(Long id, String key) { + ConfigDO config = configMapper.selectByKey(key); + if (config == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的参数配置 + if (id == null) { + throw exception(CONFIG_KEY_DUPLICATE); + } + if (!config.getId().equals(id)) { + throw exception(CONFIG_KEY_DUPLICATE); + } + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/db/DataSourceConfigService.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/db/DataSourceConfigService.java new file mode 100644 index 0000000..d84f572 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/db/DataSourceConfigService.java @@ -0,0 +1,54 @@ +package com.win.module.infra.service.db; + +import com.win.module.infra.controller.db.vo.DataSourceConfigCreateReqVO; +import com.win.module.infra.controller.db.vo.DataSourceConfigUpdateReqVO; +import com.win.module.infra.dal.dataobject.db.DataSourceConfigDO; + +import javax.validation.Valid; +import java.util.List; + +/** + * 数据源配置 Service 接口 + * + * @author 闻荫源码 + */ +public interface DataSourceConfigService { + + /** + * 创建数据源配置 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDataSourceConfig(@Valid DataSourceConfigCreateReqVO createReqVO); + + /** + * 更新数据源配置 + * + * @param updateReqVO 更新信息 + */ + void updateDataSourceConfig(@Valid DataSourceConfigUpdateReqVO updateReqVO); + + /** + * 删除数据源配置 + * + * @param id 编号 + */ + void deleteDataSourceConfig(Long id); + + /** + * 获得数据源配置 + * + * @param id 编号 + * @return 数据源配置 + */ + DataSourceConfigDO getDataSourceConfig(Long id); + + /** + * 获得数据源配置列表 + * + * @return 数据源配置列表 + */ + List getDataSourceConfigList(); + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/db/DataSourceConfigServiceImpl.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/db/DataSourceConfigServiceImpl.java new file mode 100644 index 0000000..e16b6e5 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/db/DataSourceConfigServiceImpl.java @@ -0,0 +1,107 @@ +package com.win.module.infra.service.db; + +import com.win.framework.mybatis.core.util.JdbcUtils; +import com.win.module.infra.controller.db.vo.DataSourceConfigCreateReqVO; +import com.win.module.infra.controller.db.vo.DataSourceConfigUpdateReqVO; +import com.win.module.infra.convert.db.DataSourceConfigConvert; +import com.win.module.infra.dal.dataobject.db.DataSourceConfigDO; +import com.win.module.infra.dal.mysql.db.DataSourceConfigMapper; +import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty; +import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Objects; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.infra.enums.ErrorCodeConstants.DATA_SOURCE_CONFIG_NOT_EXISTS; +import static com.win.module.infra.enums.ErrorCodeConstants.DATA_SOURCE_CONFIG_NOT_OK; + +/** + * 数据源配置 Service 实现类 + * + * @author 闻荫源码 + */ +@Service +@Validated +public class DataSourceConfigServiceImpl implements DataSourceConfigService { + + @Resource + private DataSourceConfigMapper dataSourceConfigMapper; + + @Resource + private DynamicDataSourceProperties dynamicDataSourceProperties; + + @Override + public Long createDataSourceConfig(DataSourceConfigCreateReqVO createReqVO) { + DataSourceConfigDO dataSourceConfig = DataSourceConfigConvert.INSTANCE.convert(createReqVO); + validateConnectionOK(dataSourceConfig); + + // 插入 + dataSourceConfigMapper.insert(dataSourceConfig); + // 返回 + return dataSourceConfig.getId(); + } + + @Override + public void updateDataSourceConfig(DataSourceConfigUpdateReqVO updateReqVO) { + // 校验存在 + validateDataSourceConfigExists(updateReqVO.getId()); + DataSourceConfigDO updateObj = DataSourceConfigConvert.INSTANCE.convert(updateReqVO); + validateConnectionOK(updateObj); + + // 更新 + dataSourceConfigMapper.updateById(updateObj); + } + + @Override + public void deleteDataSourceConfig(Long id) { + // 校验存在 + validateDataSourceConfigExists(id); + // 删除 + dataSourceConfigMapper.deleteById(id); + } + + private void validateDataSourceConfigExists(Long id) { + if (dataSourceConfigMapper.selectById(id) == null) { + throw exception(DATA_SOURCE_CONFIG_NOT_EXISTS); + } + } + + @Override + public DataSourceConfigDO getDataSourceConfig(Long id) { + // 如果 id 为 0,默认为 master 的数据源 + if (Objects.equals(id, DataSourceConfigDO.ID_MASTER)) { + return buildMasterDataSourceConfig(); + } + // 从 DB 中读取 + return dataSourceConfigMapper.selectById(id); + } + + @Override + public List getDataSourceConfigList() { + List result = dataSourceConfigMapper.selectList(); + // 补充 master 数据源 + result.add(0, buildMasterDataSourceConfig()); + return result; + } + + private void validateConnectionOK(DataSourceConfigDO config) { + boolean success = JdbcUtils.isConnectionOK(config.getUrl(), config.getUsername(), config.getPassword()); + if (!success) { + throw exception(DATA_SOURCE_CONFIG_NOT_OK); + } + } + + private DataSourceConfigDO buildMasterDataSourceConfig() { + String primary = dynamicDataSourceProperties.getPrimary(); + DataSourceProperty dataSourceProperty = dynamicDataSourceProperties.getDatasource().get(primary); + return new DataSourceConfigDO().setId(DataSourceConfigDO.ID_MASTER).setName(primary) + .setUrl(dataSourceProperty.getUrl()) + .setUsername(dataSourceProperty.getUsername()) + .setPassword(dataSourceProperty.getPassword()); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/db/DatabaseTableService.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/db/DatabaseTableService.java new file mode 100644 index 0000000..7071019 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/db/DatabaseTableService.java @@ -0,0 +1,33 @@ +package com.win.module.infra.service.db; + +import com.baomidou.mybatisplus.generator.config.po.TableInfo; + +import java.util.List; + +/** + * 数据库表 Service + * + * @author 闻荫源码 + */ +public interface DatabaseTableService { + + /** + * 获得表列表,基于表名称 + 表描述进行模糊匹配 + * + * @param dataSourceConfigId 数据源配置的编号 + * @param nameLike 表名称,模糊匹配 + * @param commentLike 表描述,模糊匹配 + * @return 表列表 + */ + List getTableList(Long dataSourceConfigId, String nameLike, String commentLike); + + /** + * 获得指定表名 + * + * @param dataSourceConfigId 数据源配置的编号 + * @param tableName 表名称 + * @return 表 + */ + TableInfo getTable(Long dataSourceConfigId, String tableName); + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/db/DatabaseTableServiceImpl.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/db/DatabaseTableServiceImpl.java new file mode 100644 index 0000000..70e0a2d --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/db/DatabaseTableServiceImpl.java @@ -0,0 +1,69 @@ +package com.win.module.infra.service.db; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.StrUtil; +import com.win.module.infra.dal.dataobject.db.DataSourceConfigDO; +import com.baomidou.mybatisplus.generator.config.DataSourceConfig; +import com.baomidou.mybatisplus.generator.config.GlobalConfig; +import com.baomidou.mybatisplus.generator.config.StrategyConfig; +import com.baomidou.mybatisplus.generator.config.builder.ConfigBuilder; +import com.baomidou.mybatisplus.generator.config.po.TableInfo; +import com.baomidou.mybatisplus.generator.config.rules.DateType; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 数据库表 Service 实现类 + * + * @author 闻荫源码 + */ +@Service +public class DatabaseTableServiceImpl implements DatabaseTableService { + + @Resource + private DataSourceConfigService dataSourceConfigService; + + @Override + public List getTableList(Long dataSourceConfigId, String nameLike, String commentLike) { + List tables = getTableList0(dataSourceConfigId, null); + return tables.stream().filter(tableInfo -> (StrUtil.isEmpty(nameLike) || tableInfo.getName().contains(nameLike)) + && (StrUtil.isEmpty(commentLike) || tableInfo.getComment().contains(commentLike))) + .collect(Collectors.toList()); + } + + @Override + public TableInfo getTable(Long dataSourceConfigId, String name) { + return CollUtil.getFirst(getTableList0(dataSourceConfigId, name)); + } + + private List getTableList0(Long dataSourceConfigId, String name) { + // 获得数据源配置 + DataSourceConfigDO config = dataSourceConfigService.getDataSourceConfig(dataSourceConfigId); + Assert.notNull(config, "数据源({}) 不存在!", dataSourceConfigId); + + // 使用 MyBatis Plus Generator 解析表结构 + DataSourceConfig dataSourceConfig = new DataSourceConfig.Builder(config.getUrl(), config.getUsername(), + config.getPassword()).build(); + StrategyConfig.Builder strategyConfig = new StrategyConfig.Builder(); + if (StrUtil.isNotEmpty(name)) { + strategyConfig.addInclude(name); + } else { + // 移除工作流和定时任务前缀的表名 // TODO 未来做成可配置 + strategyConfig.addExclude("ACT_[\\S\\s]+|QRTZ_[\\S\\s]+|FLW_[\\S\\s]+"); + } + + GlobalConfig globalConfig = new GlobalConfig.Builder().dateType(DateType.TIME_PACK).build(); // 只使用 LocalDateTime 类型,不使用 LocalDate + ConfigBuilder builder = new ConfigBuilder(null, dataSourceConfig, strategyConfig.build(), + null, globalConfig, null); + // 按照名字排序 + List tables = builder.getTableInfoList(); + tables.sort(Comparator.comparing(TableInfo::getName)); + return tables; + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/file/FileConfigService.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/file/FileConfigService.java new file mode 100644 index 0000000..c164304 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/file/FileConfigService.java @@ -0,0 +1,87 @@ +package com.win.module.infra.service.file; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.file.core.client.FileClient; +import com.win.module.infra.controller.file.vo.config.FileConfigCreateReqVO; +import com.win.module.infra.controller.file.vo.config.FileConfigPageReqVO; +import com.win.module.infra.controller.file.vo.config.FileConfigUpdateReqVO; +import com.win.module.infra.dal.dataobject.file.FileConfigDO; + +import javax.validation.Valid; + +/** + * 文件配置 Service 接口 + * + * @author 闻荫源码 + */ +public interface FileConfigService { + + /** + * 创建文件配置 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createFileConfig(@Valid FileConfigCreateReqVO createReqVO); + + /** + * 更新文件配置 + * + * @param updateReqVO 更新信息 + */ + void updateFileConfig(@Valid FileConfigUpdateReqVO updateReqVO); + + /** + * 更新文件配置为 Master + * + * @param id 编号 + */ + void updateFileConfigMaster(Long id); + + /** + * 删除文件配置 + * + * @param id 编号 + */ + void deleteFileConfig(Long id); + + /** + * 获得文件配置 + * + * @param id 编号 + * @return 文件配置 + */ + FileConfigDO getFileConfig(Long id); + + /** + * 获得文件配置分页 + * + * @param pageReqVO 分页查询 + * @return 文件配置分页 + */ + PageResult getFileConfigPage(FileConfigPageReqVO pageReqVO); + + /** + * 测试文件配置是否正确,通过上传文件 + * + * @param id 编号 + * @return 文件 URL + */ + String testFileConfig(Long id) throws Exception; + + /** + * 获得指定编号的文件客户端 + * + * @param id 配置编号 + * @return 文件客户端 + */ + FileClient getFileClient(Long id); + + /** + * 获得 Master 文件客户端 + * + * @return 文件客户端 + */ + FileClient getMasterFileClient(); + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/file/FileConfigServiceImpl.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/file/FileConfigServiceImpl.java new file mode 100644 index 0000000..ba4b4fd --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/file/FileConfigServiceImpl.java @@ -0,0 +1,190 @@ +package com.win.module.infra.service.file; + +import cn.hutool.core.io.resource.ResourceUtil; +import cn.hutool.core.util.IdUtil; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.json.JsonUtils; +import com.win.framework.common.util.validation.ValidationUtils; +import com.win.framework.file.core.client.FileClient; +import com.win.framework.file.core.client.FileClientConfig; +import com.win.framework.file.core.client.FileClientFactory; +import com.win.framework.file.core.enums.FileStorageEnum; +import com.win.module.infra.controller.file.vo.config.FileConfigCreateReqVO; +import com.win.module.infra.controller.file.vo.config.FileConfigPageReqVO; +import com.win.module.infra.controller.file.vo.config.FileConfigUpdateReqVO; +import com.win.module.infra.convert.file.FileConfigConvert; +import com.win.module.infra.dal.dataobject.file.FileConfigDO; +import com.win.module.infra.dal.mysql.file.FileConfigMapper; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import javax.validation.Validator; +import java.time.Duration; +import java.util.Map; +import java.util.Objects; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.framework.common.util.cache.CacheUtils.buildAsyncReloadingCache; +import static com.win.module.infra.enums.ErrorCodeConstants.FILE_CONFIG_DELETE_FAIL_MASTER; +import static com.win.module.infra.enums.ErrorCodeConstants.FILE_CONFIG_NOT_EXISTS; + +/** + * 文件配置 Service 实现类 + * + * @author 闻荫源码 + */ +@Service +@Validated +@Slf4j +public class FileConfigServiceImpl implements FileConfigService { + + private static final Long CACHE_MASTER_ID = 0L; + + /** + * {@link FileClient} 缓存,通过它异步刷新 fileClientFactory + */ + @Getter + private final LoadingCache clientCache = buildAsyncReloadingCache(Duration.ofSeconds(10L), + new CacheLoader() { + + @Override + public FileClient load(Long id) { + FileConfigDO config = Objects.equals(CACHE_MASTER_ID, id) ? + fileConfigMapper.selectByMaster() : fileConfigMapper.selectById(id); + if (config != null) { + fileClientFactory.createOrUpdateFileClient(id, config.getStorage(), config.getConfig()); + } + return fileClientFactory.getFileClient(id); + } + + }); + + @Resource + private FileClientFactory fileClientFactory; + + @Resource + private FileConfigMapper fileConfigMapper; + + @Resource + private Validator validator; + + @Override + public Long createFileConfig(FileConfigCreateReqVO createReqVO) { + FileConfigDO fileConfig = FileConfigConvert.INSTANCE.convert(createReqVO) + .setConfig(parseClientConfig(createReqVO.getStorage(), createReqVO.getConfig())) + .setMaster(false); // 默认非 master + fileConfigMapper.insert(fileConfig); + return fileConfig.getId(); + } + + @Override + public void updateFileConfig(FileConfigUpdateReqVO updateReqVO) { + // 校验存在 + FileConfigDO config = validateFileConfigExists(updateReqVO.getId()); + // 更新 + FileConfigDO updateObj = FileConfigConvert.INSTANCE.convert(updateReqVO) + .setConfig(parseClientConfig(config.getStorage(), updateReqVO.getConfig())); + fileConfigMapper.updateById(updateObj); + + // 清空缓存 + clearCache(config.getId(), null); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateFileConfigMaster(Long id) { + // 校验存在 + validateFileConfigExists(id); + // 更新其它为非 master + fileConfigMapper.updateBatch(new FileConfigDO().setMaster(false)); + // 更新 + fileConfigMapper.updateById(new FileConfigDO().setId(id).setMaster(true)); + + // 清空缓存 + clearCache(null, true); + } + + private FileClientConfig parseClientConfig(Integer storage, Map config) { + // 获取配置类 + Class configClass = FileStorageEnum.getByStorage(storage) + .getConfigClass(); + FileClientConfig clientConfig = JsonUtils.parseObject2(JsonUtils.toJsonString(config), configClass); + // 参数校验 + ValidationUtils.validate(validator, clientConfig); + // 设置参数 + return clientConfig; + } + + @Override + public void deleteFileConfig(Long id) { + // 校验存在 + FileConfigDO config = validateFileConfigExists(id); + if (Boolean.TRUE.equals(config.getMaster())) { + throw exception(FILE_CONFIG_DELETE_FAIL_MASTER); + } + // 删除 + fileConfigMapper.deleteById(id); + + // 清空缓存 + clearCache(id, null); + } + + /** + * 清空指定文件配置 + * + * @param id 配置编号 + * @param master 是否主配置 + */ + private void clearCache(Long id, Boolean master) { + if (id != null) { + clientCache.invalidate(id); + } + if (Boolean.TRUE.equals(master)) { + clientCache.invalidate(CACHE_MASTER_ID); + } + } + + private FileConfigDO validateFileConfigExists(Long id) { + FileConfigDO config = fileConfigMapper.selectById(id); + if (config == null) { + throw exception(FILE_CONFIG_NOT_EXISTS); + } + return config; + } + + @Override + public FileConfigDO getFileConfig(Long id) { + return fileConfigMapper.selectById(id); + } + + @Override + public PageResult getFileConfigPage(FileConfigPageReqVO pageReqVO) { + return fileConfigMapper.selectPage(pageReqVO); + } + + @Override + public String testFileConfig(Long id) throws Exception { + // 校验存在 + validateFileConfigExists(id); + // 上传文件 + byte[] content = ResourceUtil.readBytes("file/erweima.jpg"); + return getFileClient(id).upload(content, IdUtil.fastSimpleUUID() + ".jpg", "image/jpeg"); + } + + @Override + public FileClient getFileClient(Long id) { + return clientCache.getUnchecked(id); + } + + @Override + public FileClient getMasterFileClient() { + return clientCache.getUnchecked(CACHE_MASTER_ID); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/file/FileService.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/file/FileService.java new file mode 100644 index 0000000..1340c09 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/file/FileService.java @@ -0,0 +1,59 @@ +package com.win.module.infra.service.file; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.infra.controller.file.vo.file.FileListReqVO; +import com.win.module.infra.controller.file.vo.file.FilePageReqVO; +import com.win.module.infra.dal.dataobject.file.FileDO; + +import java.util.List; + +/** + * 文件 Service 接口 + * + * @author 闻荫源码 + */ +public interface FileService { + + /** + * 获得文件分页 + * + * @param pageReqVO 分页查询 + * @return 文件分页 + */ + PageResult getFilePage(FilePageReqVO pageReqVO); + + /** + * 列表查询 + * @param listReqVO + * @return + */ + List getFileList(FileListReqVO listReqVO); + /** + * 保存文件,并返回文件的访问路径 + * + * @param name 文件名称 + * @param path 文件路径 + * @param content 文件内容 + * @param tableName 表名 + * @param tableId 表数据id + * @return 文件路径 + */ + String createFile(String name, String path, byte[] content, String tableName, Long tableId); + + /** + * 删除文件 + * + * @param id 编号 + */ + void deleteFile(Long id) throws Exception; + + /** + * 获得文件内容 + * + * @param configId 配置编号 + * @param path 文件路径 + * @return 文件内容 + */ + byte[] getFileContent(Long configId, String path) throws Exception; + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/file/FileServiceImpl.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/file/FileServiceImpl.java new file mode 100644 index 0000000..c5793d6 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/file/FileServiceImpl.java @@ -0,0 +1,126 @@ +package com.win.module.infra.service.file; + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.io.FileUtils; +import com.win.framework.file.core.client.FileClient; +import com.win.framework.file.core.utils.FileTypeUtils; +import com.win.module.infra.controller.file.vo.file.FileListReqVO; +import com.win.module.infra.controller.file.vo.file.FilePageReqVO; +import com.win.module.infra.dal.dataobject.file.FileDO; +import com.win.module.infra.dal.dataobject.trends.TrendsDO; +import com.win.module.infra.dal.mysql.file.FileMapper; +import com.win.module.infra.dal.mysql.trends.TrendsMapper; +import com.win.module.infra.enums.TrendsTypeEnum; +import lombok.SneakyThrows; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.infra.enums.ErrorCodeConstants.FILE_NOT_EXISTS; + +/** + * 文件 Service 实现类 + * + * @author 闻荫源码 + */ +@Service +public class FileServiceImpl implements FileService { + + @Resource + private FileConfigService fileConfigService; + + @Resource + private FileMapper fileMapper; + + @Resource + private TrendsMapper trendsMapper; + + @Override + public PageResult getFilePage(FilePageReqVO pageReqVO) { + return fileMapper.selectPage(pageReqVO); + } + + @Override + public List getFileList(FileListReqVO listReqVO) { + return fileMapper.selectList(listReqVO); + } + + @Override + @SneakyThrows + public String createFile(String name, String path, byte[] content, String tableName, Long tableId) { + // 计算默认的 path 名 + String type = FileTypeUtils.getMineType(content, name); + if (StrUtil.isEmpty(path)) { + path = FileUtils.generatePath(content, name); + } + // 如果 name 为空,则使用 path 填充 + if (StrUtil.isEmpty(name)) { + name = path; + } + + // 上传到文件存储器 + FileClient client = fileConfigService.getMasterFileClient(); + Assert.notNull(client, "客户端(master) 不能为空"); + String url = client.upload(content, path, type); + + // 保存到数据库 + FileDO file = new FileDO(); + file.setConfigId(client.getId()); + file.setName(name); + file.setPath(path); + file.setUrl(url); + file.setType(type); + file.setSize(content.length); + file.setTableName(tableName); + file.setTableId(tableId); + fileMapper.insert(file); + + TrendsDO trendsDO = new TrendsDO(); + trendsDO.setTableName(tableName); + trendsDO.setTableId(tableId); + trendsDO.setType(TrendsTypeEnum.UPLOAD_ANNEX.getType()); + trendsDO.setContent("上传了" + name); + trendsMapper.insert(trendsDO); + return url; + } + + @Override + public void deleteFile(Long id) throws Exception { + // 校验存在 + FileDO file = validateFileExists(id); + + // 从文件存储器中删除 + FileClient client = fileConfigService.getFileClient(file.getConfigId()); + Assert.notNull(client, "客户端({}) 不能为空", file.getConfigId()); + client.delete(file.getPath()); + + TrendsDO trendsDO = new TrendsDO(); + trendsDO.setTableName(file.getTableName()); + trendsDO.setTableId(file.getTableId()); + trendsDO.setType(TrendsTypeEnum.DELETE_ANNEX.getType()); + trendsDO.setContent("删除了" + file.getName()); + trendsMapper.insert(trendsDO); + // 删除记录 + fileMapper.deleteById(id); + } + + private FileDO validateFileExists(Long id) { + FileDO fileDO = fileMapper.selectById(id); + if (fileDO == null) { + throw exception(FILE_NOT_EXISTS); + } + return fileDO; + } + + @Override + public byte[] getFileContent(Long configId, String path) throws Exception { + FileClient client = fileConfigService.getFileClient(configId); + Assert.notNull(client, "客户端({}) 不能为空", configId); + return client.getContent(path); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/job/JobLogService.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/job/JobLogService.java new file mode 100644 index 0000000..0ef7bd7 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/job/JobLogService.java @@ -0,0 +1,51 @@ +package com.win.module.infra.service.job; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.quartz.core.service.JobLogFrameworkService; +import com.win.module.infra.controller.job.vo.log.JobLogExportReqVO; +import com.win.module.infra.controller.job.vo.log.JobLogPageReqVO; +import com.win.module.infra.dal.dataobject.job.JobLogDO; + +import java.util.Collection; +import java.util.List; + +/** + * Job 日志 Service 接口 + * + * @author 闻荫源码 + */ +public interface JobLogService extends JobLogFrameworkService { + + /** + * 获得定时任务 + * + * @param id 编号 + * @return 定时任务 + */ + JobLogDO getJobLog(Long id); + + /** + * 获得定时任务列表 + * + * @param ids 编号 + * @return 定时任务列表 + */ + List getJobLogList(Collection ids); + + /** + * 获得定时任务分页 + * + * @param pageReqVO 分页查询 + * @return 定时任务分页 + */ + PageResult getJobLogPage(JobLogPageReqVO pageReqVO); + + /** + * 获得定时任务列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 定时任务分页 + */ + List getJobLogList(JobLogExportReqVO exportReqVO); + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/job/JobLogServiceImpl.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/job/JobLogServiceImpl.java new file mode 100644 index 0000000..69a6958 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/job/JobLogServiceImpl.java @@ -0,0 +1,73 @@ +package com.win.module.infra.service.job; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.infra.controller.job.vo.log.JobLogExportReqVO; +import com.win.module.infra.controller.job.vo.log.JobLogPageReqVO; +import com.win.module.infra.dal.dataobject.job.JobLogDO; +import com.win.module.infra.dal.mysql.job.JobLogMapper; +import com.win.module.infra.enums.job.JobLogStatusEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.util.Collection; +import java.util.List; + +/** + * Job 日志 Service 实现类 + * + * @author 闻荫源码 + */ +@Service +@Validated +@Slf4j +public class JobLogServiceImpl implements JobLogService { + + @Resource + private JobLogMapper jobLogMapper; + + @Override + public Long createJobLog(Long jobId, LocalDateTime beginTime, String jobHandlerName, String jobHandlerParam, Integer executeIndex) { + JobLogDO log = JobLogDO.builder().jobId(jobId).handlerName(jobHandlerName).handlerParam(jobHandlerParam).executeIndex(executeIndex) + .beginTime(beginTime).status(JobLogStatusEnum.RUNNING.getStatus()).build(); + jobLogMapper.insert(log); + return log.getId(); + } + + @Override + @Async + public void updateJobLogResultAsync(Long logId, LocalDateTime endTime, Integer duration, boolean success, String result) { + try { + JobLogDO updateObj = JobLogDO.builder().id(logId).endTime(endTime).duration(duration) + .status(success ? JobLogStatusEnum.SUCCESS.getStatus() : JobLogStatusEnum.FAILURE.getStatus()).result(result).build(); + jobLogMapper.updateById(updateObj); + } catch (Exception ex) { + log.error("[updateJobLogResultAsync][logId({}) endTime({}) duration({}) success({}) result({})]", + logId, endTime, duration, success, result); + } + } + + @Override + public JobLogDO getJobLog(Long id) { + return jobLogMapper.selectById(id); + } + + @Override + public List getJobLogList(Collection ids) { + return jobLogMapper.selectBatchIds(ids); + } + + @Override + public PageResult getJobLogPage(JobLogPageReqVO pageReqVO) { + return jobLogMapper.selectPage(pageReqVO); + } + + @Override + public List getJobLogList(JobLogExportReqVO exportReqVO) { + return jobLogMapper.selectList(exportReqVO); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/job/JobService.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/job/JobService.java new file mode 100644 index 0000000..dda54bd --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/job/JobService.java @@ -0,0 +1,91 @@ +package com.win.module.infra.service.job; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.infra.controller.job.vo.job.JobCreateReqVO; +import com.win.module.infra.controller.job.vo.job.JobExportReqVO; +import com.win.module.infra.controller.job.vo.job.JobPageReqVO; +import com.win.module.infra.controller.job.vo.job.JobUpdateReqVO; +import com.win.module.infra.dal.dataobject.job.JobDO; +import org.quartz.SchedulerException; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 定时任务 Service 接口 + * + * @author 闻荫源码 + */ +public interface JobService { + + /** + * 创建定时任务 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createJob(@Valid JobCreateReqVO createReqVO) throws SchedulerException; + + /** + * 更新定时任务 + * + * @param updateReqVO 更新信息 + */ + void updateJob(@Valid JobUpdateReqVO updateReqVO) throws SchedulerException; + + /** + * 更新定时任务的状态 + * + * @param id 任务编号 + * @param status 状态 + */ + void updateJobStatus(Long id, Integer status) throws SchedulerException; + + /** + * 触发定时任务 + * + * @param id 任务编号 + */ + void triggerJob(Long id) throws SchedulerException; + + /** + * 删除定时任务 + * + * @param id 编号 + */ + void deleteJob(Long id) throws SchedulerException; + + /** + * 获得定时任务 + * + * @param id 编号 + * @return 定时任务 + */ + JobDO getJob(Long id); + + /** + * 获得定时任务列表 + * + * @param ids 编号 + * @return 定时任务列表 + */ + List getJobList(Collection ids); + + /** + * 获得定时任务分页 + * + * @param pageReqVO 分页查询 + * @return 定时任务分页 + */ + PageResult getJobPage(JobPageReqVO pageReqVO); + + /** + * 获得定时任务列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 定时任务分页 + */ + List getJobList(JobExportReqVO exportReqVO); + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/job/JobServiceImpl.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/job/JobServiceImpl.java new file mode 100644 index 0000000..2ffe9dd --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/job/JobServiceImpl.java @@ -0,0 +1,173 @@ +package com.win.module.infra.service.job; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.quartz.core.scheduler.SchedulerManager; +import com.win.framework.quartz.core.util.CronUtils; +import com.win.module.infra.controller.job.vo.job.JobCreateReqVO; +import com.win.module.infra.controller.job.vo.job.JobExportReqVO; +import com.win.module.infra.controller.job.vo.job.JobPageReqVO; +import com.win.module.infra.controller.job.vo.job.JobUpdateReqVO; +import com.win.module.infra.convert.job.JobConvert; +import com.win.module.infra.dal.dataobject.job.JobDO; +import com.win.module.infra.dal.mysql.job.JobMapper; +import com.win.module.infra.enums.job.JobStatusEnum; +import org.quartz.SchedulerException; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.List; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.infra.enums.ErrorCodeConstants.*; +import static com.win.framework.common.util.collection.CollectionUtils.containsAny; + +/** + * 定时任务 Service 实现类 + * + * @author 闻荫源码 + */ +@Service +@Validated +public class JobServiceImpl implements JobService { + + @Resource + private JobMapper jobMapper; + + @Resource + private SchedulerManager schedulerManager; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createJob(JobCreateReqVO createReqVO) throws SchedulerException { + validateCronExpression(createReqVO.getCronExpression()); + // 校验唯一性 + if (jobMapper.selectByHandlerName(createReqVO.getHandlerName()) != null) { + throw exception(JOB_HANDLER_EXISTS); + } + // 插入 + JobDO job = JobConvert.INSTANCE.convert(createReqVO); + job.setStatus(JobStatusEnum.INIT.getStatus()); + fillJobMonitorTimeoutEmpty(job); + jobMapper.insert(job); + + // 添加 Job 到 Quartz 中 + schedulerManager.addJob(job.getId(), job.getHandlerName(), job.getHandlerParam(), job.getCronExpression(), + createReqVO.getRetryCount(), createReqVO.getRetryInterval()); + // 更新 + JobDO updateObj = JobDO.builder().id(job.getId()).status(JobStatusEnum.NORMAL.getStatus()).build(); + jobMapper.updateById(updateObj); + + // 返回 + return job.getId(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateJob(JobUpdateReqVO updateReqVO) throws SchedulerException { + validateCronExpression(updateReqVO.getCronExpression()); + // 校验存在 + JobDO job = validateJobExists(updateReqVO.getId()); + // 只有开启状态,才可以修改.原因是,如果出暂停状态,修改 Quartz Job 时,会导致任务又开始执行 + if (!job.getStatus().equals(JobStatusEnum.NORMAL.getStatus())) { + throw exception(JOB_UPDATE_ONLY_NORMAL_STATUS); + } + // 更新 + JobDO updateObj = JobConvert.INSTANCE.convert(updateReqVO); + fillJobMonitorTimeoutEmpty(updateObj); + jobMapper.updateById(updateObj); + + // 更新 Job 到 Quartz 中 + schedulerManager.updateJob(job.getHandlerName(), updateReqVO.getHandlerParam(), updateReqVO.getCronExpression(), + updateReqVO.getRetryCount(), updateReqVO.getRetryInterval()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateJobStatus(Long id, Integer status) throws SchedulerException { + // 校验 status + if (!containsAny(status, JobStatusEnum.NORMAL.getStatus(), JobStatusEnum.STOP.getStatus())) { + throw exception(JOB_CHANGE_STATUS_INVALID); + } + // 校验存在 + JobDO job = validateJobExists(id); + // 校验是否已经为当前状态 + if (job.getStatus().equals(status)) { + throw exception(JOB_CHANGE_STATUS_EQUALS); + } + // 更新 Job 状态 + JobDO updateObj = JobDO.builder().id(id).status(status).build(); + jobMapper.updateById(updateObj); + + // 更新状态 Job 到 Quartz 中 + if (JobStatusEnum.NORMAL.getStatus().equals(status)) { // 开启 + schedulerManager.resumeJob(job.getHandlerName()); + } else { // 暂停 + schedulerManager.pauseJob(job.getHandlerName()); + } + } + + @Override + public void triggerJob(Long id) throws SchedulerException { + // 校验存在 + JobDO job = validateJobExists(id); + + // 触发 Quartz 中的 Job + schedulerManager.triggerJob(job.getId(), job.getHandlerName(), job.getHandlerParam()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteJob(Long id) throws SchedulerException { + // 校验存在 + JobDO job = validateJobExists(id); + // 更新 + jobMapper.deleteById(id); + + // 删除 Job 到 Quartz 中 + schedulerManager.deleteJob(job.getHandlerName()); + } + + private JobDO validateJobExists(Long id) { + JobDO job = jobMapper.selectById(id); + if (job == null) { + throw exception(JOB_NOT_EXISTS); + } + return job; + } + + private void validateCronExpression(String cronExpression) { + if (!CronUtils.isValid(cronExpression)) { + throw exception(JOB_CRON_EXPRESSION_VALID); + } + } + + @Override + public JobDO getJob(Long id) { + return jobMapper.selectById(id); + } + + @Override + public List getJobList(Collection ids) { + return jobMapper.selectBatchIds(ids); + } + + @Override + public PageResult getJobPage(JobPageReqVO pageReqVO) { + return jobMapper.selectPage(pageReqVO); + } + + @Override + public List getJobList(JobExportReqVO exportReqVO) { + return jobMapper.selectList(exportReqVO); + } + + private static void fillJobMonitorTimeoutEmpty(JobDO job) { + if (job.getMonitorTimeout() == null) { + job.setMonitorTimeout(0); + } + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/logger/ApiAccessLogService.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/logger/ApiAccessLogService.java new file mode 100644 index 0000000..18149b7 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/logger/ApiAccessLogService.java @@ -0,0 +1,41 @@ +package com.win.module.infra.service.logger; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.infra.api.logger.dto.ApiAccessLogCreateReqDTO; +import com.win.module.infra.controller.logger.vo.apiaccesslog.ApiAccessLogExportReqVO; +import com.win.module.infra.controller.logger.vo.apiaccesslog.ApiAccessLogPageReqVO; +import com.win.module.infra.dal.dataobject.logger.ApiAccessLogDO; + +import java.util.List; + +/** + * API 访问日志 Service 接口 + * + * @author 闻荫源码 + */ +public interface ApiAccessLogService { + + /** + * 创建 API 访问日志 + * + * @param createReqDTO API 访问日志 + */ + void createApiAccessLog(ApiAccessLogCreateReqDTO createReqDTO); + + /** + * 获得 API 访问日志分页 + * + * @param pageReqVO 分页查询 + * @return API 访问日志分页 + */ + PageResult getApiAccessLogPage(ApiAccessLogPageReqVO pageReqVO); + + /** + * 获得 API 访问日志列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return API 访问日志分页 + */ + List getApiAccessLogList(ApiAccessLogExportReqVO exportReqVO); + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/logger/ApiAccessLogServiceImpl.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/logger/ApiAccessLogServiceImpl.java new file mode 100644 index 0000000..2b9c43a --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/logger/ApiAccessLogServiceImpl.java @@ -0,0 +1,44 @@ +package com.win.module.infra.service.logger; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.infra.api.logger.dto.ApiAccessLogCreateReqDTO; +import com.win.module.infra.controller.logger.vo.apiaccesslog.ApiAccessLogExportReqVO; +import com.win.module.infra.controller.logger.vo.apiaccesslog.ApiAccessLogPageReqVO; +import com.win.module.infra.convert.logger.ApiAccessLogConvert; +import com.win.module.infra.dal.dataobject.logger.ApiAccessLogDO; +import com.win.module.infra.dal.mysql.logger.ApiAccessLogMapper; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; + +/** + * API 访问日志 Service 实现类 + * + * @author 闻荫源码 + */ +@Service +@Validated +public class ApiAccessLogServiceImpl implements ApiAccessLogService { + + @Resource + private ApiAccessLogMapper apiAccessLogMapper; + + @Override + public void createApiAccessLog(ApiAccessLogCreateReqDTO createDTO) { + ApiAccessLogDO apiAccessLog = ApiAccessLogConvert.INSTANCE.convert(createDTO); + apiAccessLogMapper.insert(apiAccessLog); + } + + @Override + public PageResult getApiAccessLogPage(ApiAccessLogPageReqVO pageReqVO) { + return apiAccessLogMapper.selectPage(pageReqVO); + } + + @Override + public List getApiAccessLogList(ApiAccessLogExportReqVO exportReqVO) { + return apiAccessLogMapper.selectList(exportReqVO); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/logger/ApiErrorLogService.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/logger/ApiErrorLogService.java new file mode 100644 index 0000000..ca0042f --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/logger/ApiErrorLogService.java @@ -0,0 +1,50 @@ +package com.win.module.infra.service.logger; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.infra.api.logger.dto.ApiErrorLogCreateReqDTO; +import com.win.module.infra.controller.logger.vo.apierrorlog.ApiErrorLogExportReqVO; +import com.win.module.infra.controller.logger.vo.apierrorlog.ApiErrorLogPageReqVO; +import com.win.module.infra.dal.dataobject.logger.ApiErrorLogDO; + +import java.util.List; + +/** + * API 错误日志 Service 接口 + * + * @author 闻荫源码 + */ +public interface ApiErrorLogService { + + /** + * 创建 API 错误日志 + * + * @param createReqDTO API 错误日志 + */ + void createApiErrorLog(ApiErrorLogCreateReqDTO createReqDTO); + + /** + * 获得 API 错误日志分页 + * + * @param pageReqVO 分页查询 + * @return API 错误日志分页 + */ + PageResult getApiErrorLogPage(ApiErrorLogPageReqVO pageReqVO); + + /** + * 获得 API 错误日志列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return API 错误日志分页 + */ + List getApiErrorLogList(ApiErrorLogExportReqVO exportReqVO); + + /** + * 更新 API 错误日志已处理 + * + * @param id API 日志编号 + * @param processStatus 处理结果 + * @param processUserId 处理人 + */ + void updateApiErrorLogProcess(Long id, Integer processStatus, Long processUserId); + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/logger/ApiErrorLogServiceImpl.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/logger/ApiErrorLogServiceImpl.java new file mode 100644 index 0000000..29a7924 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/logger/ApiErrorLogServiceImpl.java @@ -0,0 +1,65 @@ +package com.win.module.infra.service.logger; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.infra.api.logger.dto.ApiErrorLogCreateReqDTO; +import com.win.module.infra.controller.logger.vo.apierrorlog.ApiErrorLogExportReqVO; +import com.win.module.infra.controller.logger.vo.apierrorlog.ApiErrorLogPageReqVO; +import com.win.module.infra.convert.logger.ApiErrorLogConvert; +import com.win.module.infra.dal.dataobject.logger.ApiErrorLogDO; +import com.win.module.infra.dal.mysql.logger.ApiErrorLogMapper; +import com.win.module.infra.enums.logger.ApiErrorLogProcessStatusEnum; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.util.List; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.infra.enums.ErrorCodeConstants.API_ERROR_LOG_NOT_FOUND; +import static com.win.module.infra.enums.ErrorCodeConstants.API_ERROR_LOG_PROCESSED; + +/** + * API 错误日志 Service 实现类 + * + * @author 闻荫源码 + */ +@Service +@Validated +public class ApiErrorLogServiceImpl implements ApiErrorLogService { + + @Resource + private ApiErrorLogMapper apiErrorLogMapper; + + @Override + public void createApiErrorLog(ApiErrorLogCreateReqDTO createDTO) { + ApiErrorLogDO apiErrorLog = ApiErrorLogConvert.INSTANCE.convert(createDTO) + .setProcessStatus(ApiErrorLogProcessStatusEnum.INIT.getStatus()); + apiErrorLogMapper.insert(apiErrorLog); + } + + @Override + public PageResult getApiErrorLogPage(ApiErrorLogPageReqVO pageReqVO) { + return apiErrorLogMapper.selectPage(pageReqVO); + } + + @Override + public List getApiErrorLogList(ApiErrorLogExportReqVO exportReqVO) { + return apiErrorLogMapper.selectList(exportReqVO); + } + + @Override + public void updateApiErrorLogProcess(Long id, Integer processStatus, Long processUserId) { + ApiErrorLogDO errorLog = apiErrorLogMapper.selectById(id); + if (errorLog == null) { + throw exception(API_ERROR_LOG_NOT_FOUND); + } + if (!ApiErrorLogProcessStatusEnum.INIT.getStatus().equals(errorLog.getProcessStatus())) { + throw exception(API_ERROR_LOG_PROCESSED); + } + // 标记处理 + apiErrorLogMapper.updateById(ApiErrorLogDO.builder().id(id).processStatus(processStatus) + .processUserId(processUserId).processTime(LocalDateTime.now()).build()); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/remark/RemarkService.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/remark/RemarkService.java new file mode 100644 index 0000000..1bc9ceb --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/remark/RemarkService.java @@ -0,0 +1,41 @@ +package com.win.module.infra.service.remark; + +import com.win.module.infra.controller.remark.vo.RemarkCreateReqVO; +import com.win.module.infra.controller.remark.vo.RemarkListReqVO; +import com.win.module.infra.dal.dataobject.remark.RemarkDO; + +import javax.validation.Valid; +import java.util.List; + +/** + * 备注 Service 接口 + * + * @author 超级管理员 + */ +public interface RemarkService { + + /** + * 创建备注 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createRemark(@Valid RemarkCreateReqVO createReqVO); + + /** + * 获得备注 + * + * @param id 编号 + * @return 备注 + */ + RemarkDO getRemark(Long id); + + /** + * 获得备注列表, 用于 Excel 导出 + * + * @param listReqVO 查询条件 + * @return 备注列表 + */ + List getRemarkList(RemarkListReqVO listReqVO); + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/remark/RemarkServiceImpl.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/remark/RemarkServiceImpl.java new file mode 100644 index 0000000..e7ce285 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/remark/RemarkServiceImpl.java @@ -0,0 +1,57 @@ +package com.win.module.infra.service.remark; + +import com.win.module.infra.controller.remark.vo.RemarkCreateReqVO; +import com.win.module.infra.controller.remark.vo.RemarkListReqVO; +import com.win.module.infra.convert.remark.RemarkConvert; +import com.win.module.infra.dal.dataobject.remark.RemarkDO; +import com.win.module.infra.dal.dataobject.trends.TrendsDO; +import com.win.module.infra.dal.mysql.remark.RemarkMapper; +import com.win.module.infra.dal.mysql.trends.TrendsMapper; +import com.win.module.infra.enums.TrendsTypeEnum; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 备注 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class RemarkServiceImpl implements RemarkService { + + @Resource + private RemarkMapper remarkMapper; + + @Resource + private TrendsMapper trendsMapper; + + @Override + public Long createRemark(RemarkCreateReqVO createReqVO) { + // 插入 + RemarkDO remark = RemarkConvert.INSTANCE.convert(createReqVO); + remarkMapper.insert(remark); + TrendsDO trendsDO = new TrendsDO(); + trendsDO.setTableName(createReqVO.getTableName()); + trendsDO.setTableId(createReqVO.getTableId()); + trendsDO.setType(TrendsTypeEnum.CREATE_REMARK.getType()); + trendsDO.setContent("增加了备注"); + trendsMapper.insert(trendsDO); + // 返回 + return remark.getId(); + } + + @Override + public RemarkDO getRemark(Long id) { + return remarkMapper.selectById(id); + } + + @Override + public List getRemarkList(RemarkListReqVO listReqVO) { + return remarkMapper.selectList(listReqVO); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/test/TestDemoService.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/test/TestDemoService.java new file mode 100644 index 0000000..6c7a333 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/test/TestDemoService.java @@ -0,0 +1,75 @@ +package com.win.module.infra.service.test; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.infra.controller.test.vo.TestDemoCreateReqVO; +import com.win.module.infra.controller.test.vo.TestDemoExportReqVO; +import com.win.module.infra.controller.test.vo.TestDemoPageReqVO; +import com.win.module.infra.controller.test.vo.TestDemoUpdateReqVO; +import com.win.module.infra.dal.dataobject.test.TestDemoDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 字典类型 Service 接口 + * + * @author 闻荫源码 + */ +public interface TestDemoService { + + /** + * 创建字典类型 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createTestDemo(@Valid TestDemoCreateReqVO createReqVO); + + /** + * 更新字典类型 + * + * @param updateReqVO 更新信息 + */ + void updateTestDemo(@Valid TestDemoUpdateReqVO updateReqVO); + + /** + * 删除字典类型 + * + * @param id 编号 + */ + void deleteTestDemo(Long id); + + /** + * 获得字典类型 + * + * @param id 编号 + * @return 字典类型 + */ + TestDemoDO getTestDemo(Long id); + + /** + * 获得字典类型列表 + * + * @param ids 编号 + * @return 字典类型列表 + */ + List getTestDemoList(Collection ids); + + /** + * 获得字典类型分页 + * + * @param pageReqVO 分页查询 + * @return 字典类型分页 + */ + PageResult getTestDemoPage(TestDemoPageReqVO pageReqVO); + + /** + * 获得字典类型列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 字典类型列表 + */ + List getTestDemoList(TestDemoExportReqVO exportReqVO); + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/test/TestDemoServiceImpl.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/test/TestDemoServiceImpl.java new file mode 100644 index 0000000..bf5aff2 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/test/TestDemoServiceImpl.java @@ -0,0 +1,91 @@ +package com.win.module.infra.service.test; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.infra.controller.test.vo.TestDemoCreateReqVO; +import com.win.module.infra.controller.test.vo.TestDemoExportReqVO; +import com.win.module.infra.controller.test.vo.TestDemoPageReqVO; +import com.win.module.infra.controller.test.vo.TestDemoUpdateReqVO; +import com.win.module.infra.convert.test.TestDemoConvert; +import com.win.module.infra.dal.dataobject.test.TestDemoDO; +import com.win.module.infra.dal.mysql.test.TestDemoMapper; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.List; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.infra.enums.ErrorCodeConstants.TEST_DEMO_NOT_EXISTS; + +/** + * 字典类型 Service 实现类 + * + * @author 闻荫源码 + */ +@Service +@Validated +public class TestDemoServiceImpl implements TestDemoService { + + @Resource + private TestDemoMapper testDemoMapper; + + @Override + public Long createTestDemo(TestDemoCreateReqVO createReqVO) { + // 插入 + TestDemoDO testDemo = TestDemoConvert.INSTANCE.convert(createReqVO); + testDemoMapper.insert(testDemo); + // 返回 + return testDemo.getId(); + } + + @Override + @CacheEvict(value = "test", key = "#updateReqVO.id") + public void updateTestDemo(TestDemoUpdateReqVO updateReqVO) { + // 校验存在 + validateTestDemoExists(updateReqVO.getId()); + // 更新 + TestDemoDO updateObj = TestDemoConvert.INSTANCE.convert(updateReqVO); + testDemoMapper.updateById(updateObj); + } + + @Override + @CacheEvict(value = "test", key = "#id") + public void deleteTestDemo(Long id) { + // 校验存在 + validateTestDemoExists(id); + // 删除 + testDemoMapper.deleteById(id); + } + + private void validateTestDemoExists(Long id) { + if (testDemoMapper.selectById(id) == null) { + throw exception(TEST_DEMO_NOT_EXISTS); + } + } + + @Override + @Cacheable(cacheNames = "test", key = "#id") + public TestDemoDO getTestDemo(Long id) { + return testDemoMapper.selectById(id); + } + + @Override + public List getTestDemoList(Collection ids) { + return testDemoMapper.selectBatchIds(ids); + } + + @Override + public PageResult getTestDemoPage(TestDemoPageReqVO pageReqVO) { +// testDemoMapper.selectList2(); + return testDemoMapper.selectPage(pageReqVO); + } + + @Override + public List getTestDemoList(TestDemoExportReqVO exportReqVO) { + return testDemoMapper.selectList(exportReqVO); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/trends/TrendsService.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/trends/TrendsService.java new file mode 100644 index 0000000..4bb108e --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/trends/TrendsService.java @@ -0,0 +1,59 @@ +package com.win.module.infra.service.trends; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.infra.api.trends.dto.TrendsCreateReqDTO; +import com.win.module.infra.controller.trends.vo.TrendsExportReqVO; +import com.win.module.infra.controller.trends.vo.TrendsPageReqVO; +import com.win.module.infra.dal.dataobject.trends.TrendsDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 动态记录 Service 接口 + * + * @author 超级管理员 + */ +public interface TrendsService { + + /** + * 创建动态记录 + * + * @param createReqVO 创建信息 + */ + void createTrends(@Valid TrendsCreateReqDTO createReqVO); + + /** + * 获得动态记录 + * + * @param id 编号 + * @return 动态记录 + */ + TrendsDO getTrends(Long id); + + /** + * 获得动态记录列表 + * + * @param ids 编号 + * @return 动态记录列表 + */ + List getTrendsList(Collection ids); + + /** + * 获得动态记录分页 + * + * @param pageReqVO 分页查询 + * @return 动态记录分页 + */ + PageResult getTrendsPage(TrendsPageReqVO pageReqVO); + + /** + * 获得动态记录列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 动态记录列表 + */ + List getTrendsList(TrendsExportReqVO exportReqVO); + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/trends/TrendsServiceImpl.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/trends/TrendsServiceImpl.java new file mode 100644 index 0000000..b3ac0da --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/trends/TrendsServiceImpl.java @@ -0,0 +1,55 @@ +package com.win.module.infra.service.trends; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.infra.api.trends.dto.TrendsCreateReqDTO; +import com.win.module.infra.controller.trends.vo.TrendsExportReqVO; +import com.win.module.infra.controller.trends.vo.TrendsPageReqVO; +import com.win.module.infra.convert.trends.TrendsConvert; +import com.win.module.infra.dal.dataobject.trends.TrendsDO; +import com.win.module.infra.dal.mysql.trends.TrendsMapper; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.List; + +/** + * 动态记录 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class TrendsServiceImpl implements TrendsService { + + @Resource + private TrendsMapper trendsMapper; + + @Override + public void createTrends(TrendsCreateReqDTO createReqDTO) { + TrendsDO trends = TrendsConvert.INSTANCE.convert(createReqDTO); + trendsMapper.insert(trends); + } + + @Override + public TrendsDO getTrends(Long id) { + return trendsMapper.selectById(id); + } + + @Override + public List getTrendsList(Collection ids) { + return trendsMapper.selectBatchIds(ids); + } + + @Override + public PageResult getTrendsPage(TrendsPageReqVO pageReqVO) { + return trendsMapper.selectPage(pageReqVO); + } + + @Override + public List getTrendsList(TrendsExportReqVO exportReqVO) { + return trendsMapper.selectList(exportReqVO); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/websocket/SemaphoreUtils.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/websocket/SemaphoreUtils.java new file mode 100644 index 0000000..f19363e --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/websocket/SemaphoreUtils.java @@ -0,0 +1,45 @@ +package com.win.module.infra.websocket; + +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.Semaphore; + +/** + * 信号量相关处理 + * + */ +@Slf4j +public class SemaphoreUtils { + + /** + * 获取信号量 + * + * @param semaphore + * @return + */ + public static boolean tryAcquire(Semaphore semaphore) { + boolean flag = false; + + try { + flag = semaphore.tryAcquire(); + } catch (Exception e) { + log.error("获取信号量异常", e); + } + + return flag; + } + + /** + * 释放信号量 + * + * @param semaphore + */ + public static void release(Semaphore semaphore) { + + try { + semaphore.release(); + } catch (Exception e) { + log.error("释放信号量异常", e); + } + } +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/websocket/WebSocketConfig.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/websocket/WebSocketConfig.java new file mode 100644 index 0000000..eb024e7 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/websocket/WebSocketConfig.java @@ -0,0 +1,16 @@ +package com.win.module.infra.websocket; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +/** + * websocket 配置 + */ +@Configuration +public class WebSocketConfig { + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/websocket/WebSocketServer.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/websocket/WebSocketServer.java new file mode 100644 index 0000000..cbb3516 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/websocket/WebSocketServer.java @@ -0,0 +1,86 @@ +package com.win.module.infra.websocket; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.websocket.*; +import javax.websocket.server.ServerEndpoint; +import java.util.concurrent.Semaphore; + +/** + * websocket 消息处理 + */ +@Component +@ServerEndpoint("/websocket/message") +@Slf4j +public class WebSocketServer { + + /** + * 默认最多允许同时在线用户数100 + */ + public static int socketMaxOnlineCount = 100; + + private static final Semaphore SOCKET_SEMAPHORE = new Semaphore(socketMaxOnlineCount); + + /** + * 连接建立成功调用的方法 + */ + @OnOpen + public void onOpen(Session session) throws Exception { + // 尝试获取信号量 + boolean semaphoreFlag = SemaphoreUtils.tryAcquire(SOCKET_SEMAPHORE); + if (!semaphoreFlag) { + // 未获取到信号量 + log.error("当前在线人数超过限制数:{}", socketMaxOnlineCount); + WebSocketUsers.sendMessage(session, "当前在线人数超过限制数:" + socketMaxOnlineCount); + session.close(); + } else { + String userId = WebSocketUsers.getParam("userId", session); + if (userId != null) { + // 添加用户 + WebSocketUsers.addSession(userId, session); + log.info("用户【userId={}】建立连接,当前连接用户总数:{}", userId, WebSocketUsers.getUsers().size()); + WebSocketUsers.sendMessage(session, "接收内容:连接成功"); + } else { + WebSocketUsers.sendMessage(session, "接收内容:连接失败"); + } + } + } + + /** + * 连接关闭时处理 + */ + @OnClose + public void onClose(Session session) { + log.info("用户【sessionId={}】关闭连接!", session.getId()); + // 移除用户 + WebSocketUsers.removeSession(session); + // 获取到信号量则需释放 + SemaphoreUtils.release(SOCKET_SEMAPHORE); + } + + /** + * 抛出异常时处理 + */ + @OnError + public void onError(Session session, Throwable exception) throws Exception { + if (session.isOpen()) { + // 关闭连接 + session.close(); + } + String sessionId = session.getId(); + log.info("用户【sessionId={}】连接异常!异常信息:{}", sessionId, exception); + // 移出用户 + WebSocketUsers.removeSession(session); + // 获取到信号量则需释放 + SemaphoreUtils.release(SOCKET_SEMAPHORE); + } + + /** + * 收到客户端消息时调用的方法 + */ + @OnMessage + public void onMessage(Session session, String message) { + WebSocketUsers.sendMessage(session, "接收内容:" + message); + } +} diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/websocket/WebSocketUsers.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/websocket/WebSocketUsers.java new file mode 100644 index 0000000..9a54871 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/websocket/WebSocketUsers.java @@ -0,0 +1,178 @@ +package com.win.module.infra.websocket; + +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; +import lombok.extern.slf4j.Slf4j; +import org.bouncycastle.util.Strings; + +import javax.validation.constraints.NotNull; +import javax.websocket.Session; +import java.io.IOException; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +/** + * websocket 客户端用户 + */ +@Slf4j +public class WebSocketUsers { + + /** + * 用户集 + * TODO 需要登录用户的session? + */ + private static final Map SESSION_MAP = new ConcurrentHashMap<>(); + + /** + * 存储用户 + * + * @param userId 唯一键 + * @param session 用户信息 + */ + public static void addSession(String userId, Session session) { + SESSION_MAP.put(userId, session); + } + + /** + * 移除用户 + * + * @param session 用户信息 + * @return 移除结果 + */ + public static boolean removeSession(Session session) { + String key = null; + boolean flag = SESSION_MAP.containsValue(session); + if (flag) { + Set> entries = SESSION_MAP.entrySet(); + for (Map.Entry entry : entries) { + Session value = entry.getValue(); + if (value.equals(session)) { + key = entry.getKey(); + break; + } + } + } else { + return true; + } + return removeSession(key); + } + + /** + * 移出用户 + * + * @param userId 用户id + */ + public static boolean removeSession(String userId) { + log.info("用户【userId={}】退出", userId); + Session remove = SESSION_MAP.remove(userId); + if (remove != null) { + boolean containsValue = SESSION_MAP.containsValue(remove); + log.info("用户【userId={}】退出{},当前连接用户总数:{}", userId, containsValue ? "失败" : "成功", SESSION_MAP.size()); + return containsValue; + } else { + return true; + } + } + + /** + * 获取在线用户列表 + * + * @return 返回用户集合 + */ + public static Map getUsers() { + return SESSION_MAP; + } + + /** + * 向所有在线人发送消息 + * + * @param message 消息内容 + */ + public static void sendMessageToAll(String message) { + SESSION_MAP.forEach((userId, session) -> { + if (session.isOpen()) { + sendMessage(session, message); + } + }); + } + + /** + * 异步发送文本消息 + * + * @param session 用户session + * @param message 消息内容 + */ + public static void sendMessageAsync(Session session, String message) { + if (session.isOpen()) { + // TODO 需要加synchronized锁(synchronized(session))?单个session创建线程? + session.getAsyncRemote().sendText(message); + } else { + log.warn("用户【session={}】不在线", session.getId()); + } + } + + /** + * 同步发送文本消息 + * + * @param session 用户session + * @param message 消息内容 + */ + public static void sendMessage(Session session, String message) { + try { + if (session.isOpen()) { + // TODO 需要加synchronized锁(synchronized(session))?单个session创建线程? + session.getBasicRemote().sendText(message); + } else { + log.warn("用户【session={}】不在线", session.getId()); + } + } catch (IOException e) { + log.error("发送消息异常", e); + } + + } + + /** + * 根据用户id发送消息 + * + * @param userId 用户id + * @param message 消息内容 + */ + public static void sendMessage(String userId, String message) { + Session session = SESSION_MAP.get(userId); + //判断是否存在该用户的session,并且是否在线 + if (session == null || !session.isOpen()) { + return; + } + sendMessage(session, message); + } + + + /** + * 获取session中的指定参数值 + * + * @param key 参数key + * @param session 用户session + */ + public static String getParam(@NotNull String key, Session session) { + //TODO 目前只针对获取一个key的值,后期根据情况拓展多个 或者直接在onClose onOpen上获取参数? + String value = null; + Map> parameters = session.getRequestParameterMap(); + if (MapUtil.isNotEmpty(parameters)) { + value = parameters.get(key).get(0); + } else { + String queryString = session.getQueryString(); + if (!StrUtil.isEmpty(queryString)) { + String[] params = Strings.split(queryString, '&'); + for (String paramPair : params) { + String[] nameValues = Strings.split(paramPair, '='); + if (key.equals(nameValues[0])) { + value = nameValues[1]; + } + } + } + } + return value; + } +} diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/controller.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/controller.vm new file mode 100644 index 0000000..11f2666 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/controller.vm @@ -0,0 +1,146 @@ +package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +#if ($sceneEnum.scene == 1)import org.springframework.security.access.prepost.PreAuthorize;#end + +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import ${PageResultClassName}; +import ${CommonResultClassName}; +import static ${CommonResultClassName}.success; + +import ${ExcelUtilsClassName}; + +import ${OperateLogClassName}; +import static ${OperateTypeEnumClassName}.*; + +import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*; +import ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; +import ${basePackage}.module.${table.moduleName}.convert.${table.businessName}.${table.className}Convert; +import ${basePackage}.module.${table.moduleName}.service.${table.businessName}.${table.className}Service; + +@Tag(name = "${sceneEnum.name} - ${table.classComment}") +@RestController +##二级的 businessName 暂时不算在 HTTP 路径上,可以根据需要写 +@RequestMapping("/${table.moduleName}/${simpleClassName_strikeCase}") +@Validated +public class ${sceneEnum.prefixClass}${table.className}Controller { + + @Resource + private ${table.className}Service ${classNameVar}Service; + + @PostMapping("/create") + @Operation(summary = "创建${table.classComment}") +#if ($sceneEnum.scene == 1) @PreAuthorize("@ss.hasPermission('${permissionPrefix}:create')")#end + + public CommonResult<${primaryColumn.javaType}> create${simpleClassName}(@Valid @RequestBody ${sceneEnum.prefixClass}${table.className}CreateReqVO createReqVO) { + return success(${classNameVar}Service.create${simpleClassName}(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新${table.classComment}") +#if ($sceneEnum.scene == 1) @PreAuthorize("@ss.hasPermission('${permissionPrefix}:update')")#end + + public CommonResult update${simpleClassName}(@Valid @RequestBody ${sceneEnum.prefixClass}${table.className}UpdateReqVO updateReqVO) { + ${classNameVar}Service.update${simpleClassName}(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除${table.classComment}") + @Parameter(name = "id", description = "编号", required = true) +#if ($sceneEnum.scene == 1) @PreAuthorize("@ss.hasPermission('${permissionPrefix}:delete')")#end + + public CommonResult delete${simpleClassName}(@RequestParam("id") ${primaryColumn.javaType} id) { + ${classNameVar}Service.delete${simpleClassName}(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得${table.classComment}") + @Parameter(name = "id", description = "编号", required = true, example = "1024") +#if ($sceneEnum.scene == 1) @PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')")#end + + public CommonResult<${sceneEnum.prefixClass}${table.className}RespVO> get${simpleClassName}(@RequestParam("id") ${primaryColumn.javaType} id) { + ${table.className}DO ${classNameVar} = ${classNameVar}Service.get${simpleClassName}(id); + return success(${table.className}Convert.INSTANCE.convert(${classNameVar})); + } + +## @GetMapping("/list") +## @Operation(summary = "获得${table.classComment}列表") +## @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") +###if ($sceneEnum.scene == 1) @PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')")#end +## +## public CommonResult> get${simpleClassName}List(@RequestParam("ids") Collection<${primaryColumn.javaType}> ids) { +## List<${table.className}DO> list = ${classNameVar}Service.get${simpleClassName}List(ids); +## return success(${table.className}Convert.INSTANCE.convertList(list)); +## } + + @GetMapping("/page") + @Operation(summary = "获得${table.classComment}分页") +#if ($sceneEnum.scene == 1) @PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')")#end + + public CommonResult> get${simpleClassName}Page(@Valid ${sceneEnum.prefixClass}${table.className}PageReqVO pageVO) { + PageResult<${table.className}DO> pageResult = ${classNameVar}Service.get${simpleClassName}Page(pageVO); + return success(${table.className}Convert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出${table.classComment} Excel") +#if ($sceneEnum.scene == 1) @PreAuthorize("@ss.hasPermission('${permissionPrefix}:export')")#end + + @OperateLog(type = EXPORT) + public void export${simpleClassName}Excel(@Valid ${sceneEnum.prefixClass}${table.className}ExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List<${table.className}DO> list = ${classNameVar}Service.get${simpleClassName}List(exportReqVO); + // 导出 Excel + List<${sceneEnum.prefixClass}${table.className}ExcelVO> datas = ${table.className}Convert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "${table.classComment}.xls", "数据", ${sceneEnum.prefixClass}${table.className}ExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入${table.classComment}模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List<${table.className}ExcelVO> list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "${table.classComment}基本信息导入模板.xls", "${table.classComment}基本信息列表", ${table.className}ExcelVo.class, list); + } + + @PostMapping("/import") + @Operation(summary = "导入${table.classComment}基本信息") + @Parameters({ + @Parameter(name = "file", description = "Excel 文件", required = true), + @Parameter(name = "mode", description = "导入模式1更新2追加3覆盖", example = "1"), + @Parameter(name = "updatePart", description = "部分更新,默认为 true", example = "true") + }) +#if ($sceneEnum.scene == 1) @PreAuthorize("@ss.hasPermission('${permissionPrefix}:import')")#end + + public CommonResult> importExcel(HttpServletResponse response, + @RequestParam("file") MultipartFile file, + @RequestParam(value = "mode") Integer mode, + @RequestParam(value = "updatePart", required = false, defaultValue = "false") Boolean updatePart) throws Exception { + + List<${table.className}ExcelVO> list = ExcelUtils.read(file, ${table.className}ExcelVO.class); + List<${table.className}ExcelVO> errorList = ${classNameVar}Service.import${table.className}List(list, mode, updatePart); + + Map returnMap = new HashMap<>(); + returnMap.put("errorCount", errorList.size()); + if(!errorList.isEmpty()) { + String url = ExcelUtils.writeLocalFile("${table.classComment}基本信息导入错误数据" + LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + + return success(returnMap); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/vo/_column.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/vo/_column.vm new file mode 100644 index 0000000..98b09f2 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/vo/_column.vm @@ -0,0 +1,13 @@ +## 提供给 baseVO、createVO、updateVO 生成字段 + @Schema(description = "${column.columnComment}"#if (!${column.nullable}), requiredMode = Schema.RequiredMode.REQUIRED#end#if ("$!column.example" != ""), example = "${column.example}"#end) +#if (!${column.nullable})## 判断 @NotEmpty 和 @NotNull 注解 +#if (${field.fieldType} == 'String') + @NotEmpty(message = "${column.columnComment}不能为空") +#else + @NotNull(message = "${column.columnComment}不能为空") +#end +#end +#if (${column.javaType} == "LocalDateTime")## 时间类型 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) +#end + private ${column.javaType} ${column.javaField}; diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/vo/baseVO.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/vo/baseVO.vm new file mode 100644 index 0000000..cc612e3 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/vo/baseVO.vm @@ -0,0 +1,39 @@ +package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +#foreach ($column in $columns) +#if (${column.javaType} == "BigDecimal") +import java.math.BigDecimal; +#end +#if (${column.javaType} == "LocalDateTime") +import java.time.LocalDateTime; +#end +#end +import javax.validation.constraints.*; +## 处理 Date 字段的引入 +#foreach ($column in $columns) +#if (${column.createOperation} && ${column.updateOperation} && ${column.listOperationResult} + && ${column.javaType} == "LocalDateTime")## 时间类型 +import org.springframework.format.annotation.DateTimeFormat; + +import static ${DateUtilsClassName}.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; +#break +#end +#end + +/** + * ${table.classComment} Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class ${sceneEnum.prefixClass}${table.className}BaseVO { + +#foreach ($column in $columns) +#if (${column.createOperation} && ${column.updateOperation} && ${column.listOperationResult})##通用操作 + #parse("codegen/java/controller/vo/_column.vm") + +#end +#end +} diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/vo/createReqVO.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/vo/createReqVO.vm new file mode 100644 index 0000000..d4f6f8e --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/vo/createReqVO.vm @@ -0,0 +1,30 @@ +package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; +## 处理 Date 字段的引入 +#foreach ($column in $columns) +#if (${column.createOperation} && (!${column.updateOperation} || !${column.listOperationResult}) + && ${column.javaType} == "LocalDateTime")## 时间类型 +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import static ${DateUtilsClassName}.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; +#break +#end +#end + +@Schema(description = "${sceneEnum.name} - ${table.classComment}创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ${sceneEnum.prefixClass}${table.className}CreateReqVO extends ${sceneEnum.prefixClass}${table.className}BaseVO { + +#foreach ($column in $columns) +#if (${column.createOperation} && (!${column.updateOperation} || !${column.listOperationResult}))##不是通用字段 + #parse("codegen/java/controller/vo/_column.vm") + +#end +#end +} diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/vo/excelVO.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/vo/excelVO.vm new file mode 100644 index 0000000..15c6660 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/vo/excelVO.vm @@ -0,0 +1,45 @@ +package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +#foreach ($column in $columns) +#if (${column.javaType} == "BigDecimal") +import java.math.BigDecimal; +#end +#if (${column.javaType} == "LocalDateTime") +import java.time.LocalDateTime; +#end +#end + +import com.alibaba.excel.annotation.ExcelProperty; +#foreach ($column in $columns) +#if ("$!column.dictType" != "")## 有设置数据字典 +import ${DictFormatClassName}; +import ${DictConvertClassName}; + +#break +#end +#end + +/** + * ${table.classComment} Excel VO + * + * @author ${table.author} + */ +@Data +public class ${sceneEnum.prefixClass}${table.className}ExcelVO { + +#foreach ($column in $columns) + #if (${column.listOperationResult})##返回字段 + #if ("$!column.dictType" != "")##处理枚举值 + @ExcelProperty(value = "${column.columnComment}", converter = DictConvert.class) + @DictFormat("${column.dictType}") // TODO 代码优化:建议设置到对应的 XXXDictTypeConstants 枚举类中 + #else + @ExcelProperty("${column.columnComment}") + #end + private ${column.javaType} ${column.javaField}; + + #end +#end +} diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/vo/exportReqVO.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/vo/exportReqVO.vm new file mode 100644 index 0000000..d3ef4aa --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/vo/exportReqVO.vm @@ -0,0 +1,39 @@ +package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import ${PageParamClassName}; +## 处理 Date 字段的引入 +#foreach ($column in $columns) +#if (${column.listOperation} && ${column.javaType} == "LocalDateTime")## 时间类型 +import java.time.LocalDateTime; +import org.springframework.format.annotation.DateTimeFormat; + +import static ${DateUtilsClassName}.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; +#break +#end +#end +## 字段模板 +#macro(columnTpl $prefix $prefixStr) + @Schema(description = "${prefixStr}${column.columnComment}"#if ("$!column.example" != ""), example = "${column.example}"#end) + private ${column.javaType}#if ("$!prefix" != "") ${prefix}${JavaField}#else ${column.javaField}#end; +#end + +@Schema(description = "${sceneEnum.name} - ${table.classComment} Excel 导出 Request VO,参数和 ${table.className}PageReqVO 是一致的") +@Data +public class ${sceneEnum.prefixClass}${table.className}ExportReqVO { + +#foreach ($column in $columns) +#if (${column.listOperation})##查询操作 +#if (${column.listOperationCondition} == "BETWEEN")## 情况一,Between 的时候 + @Schema(description = "${column.columnComment}"#if ("$!column.example" != ""), example = "${column.example}"#end) + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private ${column.javaType}[] ${column.javaField}; +#else##情况二,非 Between 的时间 + #columnTpl('', '') +#end + +#end +#end +} diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/vo/pageReqVO.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/vo/pageReqVO.vm new file mode 100644 index 0000000..6f9868d --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/vo/pageReqVO.vm @@ -0,0 +1,41 @@ +package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import ${PageParamClassName}; +## 处理 Date 字段的引入 +#foreach ($column in $columns) +#if (${column.listOperation} && ${column.javaType} == "LocalDateTime")## 时间类型 +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static ${DateUtilsClassName}.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; +#break +#end +#end +## 字段模板 +#macro(columnTpl $prefix $prefixStr) + @Schema(description = "${prefixStr}${column.columnComment}"#if ("$!column.example" != ""), example = "${column.example}"#end) + private ${column.javaType}#if ("$!prefix" != "") ${prefix}${JavaField}#else ${column.javaField}#end; +#end + +@Schema(description = "${sceneEnum.name} - ${table.classComment}分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ${sceneEnum.prefixClass}${table.className}PageReqVO extends PageParam { + +#foreach ($column in $columns) +#if (${column.listOperation})##查询操作 +#if (${column.listOperationCondition} == "BETWEEN")## 情况一,Between 的时候 + @Schema(description = "${column.columnComment}"#if ("$!column.example" != ""), example = "${column.example}"#end) + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private ${column.javaType}[] ${column.javaField}; +#else##情况二,非 Between 的时间 + #columnTpl('', '') +#end + +#end +#end +} diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/vo/respVO.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/vo/respVO.vm new file mode 100644 index 0000000..517d8bc --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/vo/respVO.vm @@ -0,0 +1,25 @@ +package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +#foreach ($column in $columns) +#if (${column.javaType} == "LocalDateTime") +import java.time.LocalDateTime; +#break +#end +#end + +@Schema(description = "${sceneEnum.name} - ${table.classComment} Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ${sceneEnum.prefixClass}${table.className}RespVO extends ${sceneEnum.prefixClass}${table.className}BaseVO { + +#foreach ($column in $columns) +#if (${column.listOperationResult} && (!${column.createOperation} || !${column.updateOperation}))##不是通用字段 + @Schema(description = "${column.columnComment}"#if (!${column.nullable}), requiredMode = Schema.RequiredMode.REQUIRED#end#if ("$!column.example" != ""), example = "${column.example}"#end) + private ${column.javaType} ${column.javaField}; + +#end +#end +} diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/vo/updateReqVO.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/vo/updateReqVO.vm new file mode 100644 index 0000000..48d7432 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/vo/updateReqVO.vm @@ -0,0 +1,30 @@ +package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; +## 处理 Date 字段的引入 +#foreach ($column in $columns) +#if (${column.updateOperation} && (!${column.createOperation} || !${column.listOperationResult}) + && ${column.javaType} == "LocalDateTime")## 时间类型 +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import static ${DateUtilsClassName}.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; +#break +#end +#end + +@Schema(description = "${sceneEnum.name} - ${table.classComment}更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ${sceneEnum.prefixClass}${table.className}UpdateReqVO extends ${sceneEnum.prefixClass}${table.className}BaseVO { + +#foreach ($column in $columns) +#if (${column.updateOperation} && (!${column.createOperation} || !${column.listOperationResult}))##不是通用字段 + #parse("codegen/java/controller/vo/_column.vm") + +#end +#end +} diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/convert/convert.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/convert/convert.vm new file mode 100644 index 0000000..6176e0f --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/convert/convert.vm @@ -0,0 +1,34 @@ +package ${basePackage}.module.${table.moduleName}.convert.${table.businessName}; + +import java.util.*; + +import ${PageResultClassName}; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*; +import ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; + +/** + * ${table.classComment} Convert + * + * @author ${table.author} + */ +@Mapper +public interface ${table.className}Convert { + + ${table.className}Convert INSTANCE = Mappers.getMapper(${table.className}Convert.class); + + ${table.className}DO convert(${sceneEnum.prefixClass}${table.className}CreateReqVO bean); + + ${table.className}DO convert(${sceneEnum.prefixClass}${table.className}UpdateReqVO bean); + + ${sceneEnum.prefixClass}${table.className}RespVO convert(${table.className}DO bean); + + List<${sceneEnum.prefixClass}${table.className}RespVO> convertList(List<${table.className}DO> list); + + PageResult<${sceneEnum.prefixClass}${table.className}RespVO> convertPage(PageResult<${table.className}DO> page); + + List<${sceneEnum.prefixClass}${table.className}ExcelVO> convertList02(List<${table.className}DO> list); + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/dal/do.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/dal/do.vm new file mode 100644 index 0000000..4f88da6 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/dal/do.vm @@ -0,0 +1,46 @@ +package ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}; + +import lombok.*; +import java.util.*; +#foreach ($column in $columns) +#if (${column.javaType} == "BigDecimal") +import java.math.BigDecimal; +#end +#if (${column.javaType} == "LocalDateTime") +import java.time.LocalDateTime; +#end +#end +import com.baomidou.mybatisplus.annotation.*; +import ${BaseDOClassName}; + +/** + * ${table.classComment} DO + * + * @author ${table.author} + */ +@TableName("${table.tableName.toLowerCase()}") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ${table.className}DO extends BaseDO { + +#foreach ($column in $columns) +#if (!${baseDOFields.contains(${column.javaField})})##排除 BaseDO 的字段 + /** + * ${column.columnComment} + #if ("$!column.dictType" != "")##处理枚举值 + * + * 枚举 {@link TODO ${column.dictType} 对应的类} + #end + */ + #if (${column.primaryKey})##处理主键 + @TableId#if (${column.javaType} == 'String')(type = IdType.INPUT)#end + #end + private ${column.javaType} ${column.javaField}; +#end +#end + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/dal/mapper.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/dal/mapper.vm new file mode 100644 index 0000000..615ae33 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/dal/mapper.vm @@ -0,0 +1,66 @@ +package ${basePackage}.module.${table.moduleName}.dal.mysql.${table.businessName}; + +import java.util.*; + +import ${PageResultClassName}; +import ${QueryWrapperClassName}; +import ${BaseMapperClassName}; +import ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; +import org.apache.ibatis.annotations.Mapper; +import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*; + +## 字段模板 +#macro(listCondition) +#foreach ($column in $columns) +#if (${column.listOperation}) +#set ($JavaField = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})##首字母大写 +#if (${column.listOperationCondition} == "=")##情况一,= 的时候 + .eqIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}()) +#end +#if (${column.listOperationCondition} == "!=")##情况二,!= 的时候 + .neIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}()) +#end +#if (${column.listOperationCondition} == ">")##情况三,> 的时候 + .gtIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}()) +#end +#if (${column.listOperationCondition} == ">=")##情况四,>= 的时候 + .geIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}()) +#end +#if (${column.listOperationCondition} == "<")##情况五,< 的时候 + .ltIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}()) +#end +#if (${column.listOperationCondition} == "<=")##情况五,<= 的时候 + .leIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}()) +#end +#if (${column.listOperationCondition} == "LIKE")##情况七,Like 的时候 + .likeIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}()) +#end +#if (${column.listOperationCondition} == "BETWEEN")##情况八,Between 的时候 + .betweenIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}()) +#end +#end +#end +#end +/** + * ${table.classComment} Mapper + * + * @author ${table.author} + */ +@Mapper +public interface ${table.className}Mapper extends BaseMapperX<${table.className}DO> { + + default PageResult<${table.className}DO> selectPage(${sceneEnum.prefixClass}${table.className}PageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX<${table.className}DO>() + #listCondition() + .orderByDesc(${table.className}DO::getId));## 大多数情况下,id 倒序 + + } + + default List<${table.className}DO> selectList(${sceneEnum.prefixClass}${table.className}ExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX<${table.className}DO>() + #listCondition() + .orderByDesc(${table.className}DO::getId));## 大多数情况下,id 倒序 + + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/dal/mapper.xml.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/dal/mapper.xml.vm new file mode 100644 index 0000000..d930db9 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/dal/mapper.xml.vm @@ -0,0 +1,12 @@ + + + + + + + diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/enums/errorcode.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/enums/errorcode.vm new file mode 100644 index 0000000..b6555a7 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/enums/errorcode.vm @@ -0,0 +1,5 @@ +// TODO 待办:请将下面的错误码复制到 win-module-${table.moduleName}-api 模块的 ErrorCodeConstants 类中。注意,请给“TODO 补充编号”设置一个错误码编号!!! +// ========== ${table.classComment} TODO 补充编号 ========== +ErrorCode ${simpleClassName_underlineCase.toUpperCase()}_NOT_EXISTS = new ErrorCode(TODO 补充编号, "${table.classComment}不存在"); + +ErrorCode ${simpleClassName_underlineCase.toUpperCase()}_IMPORT_LIST_IS_EMPTY = new ErrorCode(TODO 补充编号, "导入${table.classComment}不能为空"); \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/service/service.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/service/service.vm new file mode 100644 index 0000000..0d41403 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/service/service.vm @@ -0,0 +1,79 @@ +package ${basePackage}.module.${table.moduleName}.service.${table.businessName}; + +import java.util.*; +import javax.validation.*; +import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*; +import ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; +import ${PageResultClassName}; + +/** + * ${table.classComment} Service 接口 + * + * @author ${table.author} + */ +public interface ${table.className}Service { + + /** + * 创建${table.classComment} + * + * @param createReqVO 创建信息 + * @return 编号 + */ + ${primaryColumn.javaType} create${simpleClassName}(@Valid ${sceneEnum.prefixClass}${table.className}CreateReqVO createReqVO); + + /** + * 更新${table.classComment} + * + * @param updateReqVO 更新信息 + */ + void update${simpleClassName}(@Valid ${sceneEnum.prefixClass}${table.className}UpdateReqVO updateReqVO); + + /** + * 删除${table.classComment} + * + * @param id 编号 + */ + void delete${simpleClassName}(${primaryColumn.javaType} id); + + /** + * 获得${table.classComment} + * + * @param id 编号 + * @return ${table.classComment} + */ + ${table.className}DO get${simpleClassName}(${primaryColumn.javaType} id); + + /** + * 获得${table.classComment}列表 + * + * @param ids 编号 + * @return ${table.classComment}列表 + */ + List<${table.className}DO> get${simpleClassName}List(Collection<${primaryColumn.javaType}> ids); + + /** + * 获得${table.classComment}分页 + * + * @param pageReqVO 分页查询 + * @return ${table.classComment}分页 + */ + PageResult<${table.className}DO> get${simpleClassName}Page(${sceneEnum.prefixClass}${table.className}PageReqVO pageReqVO); + + /** + * 获得${table.classComment}列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return ${table.classComment}列表 + */ + List<${table.className}DO> get${simpleClassName}List(${sceneEnum.prefixClass}${table.className}ExportReqVO exportReqVO); + + /** + * 导入${table.classComment}主信息 + * + * @param datas 导入${table.classComment}主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List<${table.className}ExcelVO> import${table.className}List(List<${table.className}ExcelVO> datas, Integer mode, boolean updatePart); +} diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/service/serviceImpl.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/service/serviceImpl.vm new file mode 100644 index 0000000..d033469 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/service/serviceImpl.vm @@ -0,0 +1,106 @@ +package ${basePackage}.module.${table.moduleName}.service.${table.businessName}; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*; +import ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; +import ${PageResultClassName}; + +import ${basePackage}.module.${table.moduleName}.convert.${table.businessName}.${table.className}Convert; +import ${basePackage}.module.${table.moduleName}.dal.mysql.${table.businessName}.${table.className}Mapper; + +import static ${ServiceExceptionUtilClassName}.exception; +import static ${basePackage}.module.${table.moduleName}.enums.ErrorCodeConstants.*; + +/** + * ${table.classComment} Service 实现类 + * + * @author ${table.author} + */ +@Service +@Validated +public class ${table.className}ServiceImpl implements ${table.className}Service { + + @Resource + private ${table.className}Mapper ${classNameVar}Mapper; + + @Override + public ${primaryColumn.javaType} create${simpleClassName}(${sceneEnum.prefixClass}${table.className}CreateReqVO createReqVO) { + // 插入 + ${table.className}DO ${classNameVar} = ${table.className}Convert.INSTANCE.convert(createReqVO); + ${classNameVar}Mapper.insert(${classNameVar}); + // 返回 + return ${classNameVar}.getId(); + } + + @Override + public void update${simpleClassName}(${sceneEnum.prefixClass}${table.className}UpdateReqVO updateReqVO) { + // 校验存在 + validate${simpleClassName}Exists(updateReqVO.getId()); + // 更新 + ${table.className}DO updateObj = ${table.className}Convert.INSTANCE.convert(updateReqVO); + ${classNameVar}Mapper.updateById(updateObj); + } + + @Override + public void delete${simpleClassName}(${primaryColumn.javaType} id) { + // 校验存在 + validate${simpleClassName}Exists(id); + // 删除 + ${classNameVar}Mapper.deleteById(id); + } + + private void validate${simpleClassName}Exists(${primaryColumn.javaType} id) { + if (${classNameVar}Mapper.selectById(id) == null) { + throw exception(${simpleClassName_underlineCase.toUpperCase()}_NOT_EXISTS); + } + } + + @Override + public ${table.className}DO get${simpleClassName}(${primaryColumn.javaType} id) { + return ${classNameVar}Mapper.selectById(id); + } + + @Override + public List<${table.className}DO> get${simpleClassName}List(Collection<${primaryColumn.javaType}> ids) { + return ${classNameVar}Mapper.selectBatchIds(ids); + } + + @Override + public PageResult<${table.className}DO> get${simpleClassName}Page(${sceneEnum.prefixClass}${table.className}PageReqVO pageReqVO) { + return ${classNameVar}Mapper.selectPage(pageReqVO); + } + + @Override + public List<${table.className}DO> get${simpleClassName}List(${sceneEnum.prefixClass}${table.className}ExportReqVO exportReqVO) { + return ${classNameVar}Mapper.selectList(exportReqVO); + } + + @Override + public List<${table.className}ExcelVO> import${table.className}List(List<${table.className}ExcelVO> datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + throw exception(${simpleClassName_underlineCase.toUpperCase()}_IMPORT_LIST_IS_EMPTY); + } + + List<${table.className}ExcelVO> errorList = new ArrayList<>(); + datas.forEach(item -> { + if(errorList == null){ + // 判断如果不存在,在进行插入 + ${table.className}DO obj = ${classNameVar}Mapper.selectByCode(item.getCode()); + if (obj == null&& mode != 3) { + ${classNameVar}Mapper.insert(${table.className}Convert.INSTANCE.convert(item)); + } + else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 + ${table.className}DO ${classNameVar}DO = ${table.className}Convert.INSTANCE.convert(item); + ${classNameVar}DO.setId(obj.getId()); + ${classNameVar}Mapper.updateById(obj); + } + } + }); + + return errorList; + } +} diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/test/serviceTest.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/test/serviceTest.vm new file mode 100644 index 0000000..ec1b45a --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/test/serviceTest.vm @@ -0,0 +1,165 @@ +package ${basePackage}.module.${table.moduleName}.service.${table.businessName}; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; + +import javax.annotation.Resource; + +import ${baseFrameworkPackage}.test.core.ut.BaseDbUnitTest; + +import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*; +import ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; +import ${basePackage}.module.${table.moduleName}.dal.mysql.${table.businessName}.${table.className}Mapper; +import ${PageResultClassName}; + +import javax.annotation.Resource; +import org.springframework.context.annotation.Import; +import java.util.*; +import java.time.LocalDateTime; + +import static cn.hutool.core.util.RandomUtil.*; +import static ${basePackage}.module.${table.moduleName}.enums.ErrorCodeConstants.*; +import static ${baseFrameworkPackage}.test.core.util.AssertUtils.*; +import static ${baseFrameworkPackage}.test.core.util.RandomUtils.*; +import static ${LocalDateTimeUtilsClassName}.*; +import static ${ObjectUtilsClassName}.*; +import static ${DateUtilsClassName}.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +## 字段模板 +#macro(getPageCondition $VO) + // mock 数据 + ${table.className}DO db${simpleClassName} = randomPojo(${table.className}DO.class, o -> { // 等会查询到 + #foreach ($column in $columns) + #if (${column.listOperation}) + #set ($JavaField = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})##首字母大写 + o.set$JavaField(null); + #end + #end + }); + ${classNameVar}Mapper.insert(db${simpleClassName}); + #foreach ($column in $columns) + #if (${column.listOperation}) + #set ($JavaField = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})##首字母大写 + // 测试 ${column.javaField} 不匹配 + ${classNameVar}Mapper.insert(cloneIgnoreId(db${simpleClassName}, o -> o.set$JavaField(null))); + #end + #end + // 准备参数 + ${sceneEnum.prefixClass}${table.className}${VO} reqVO = new ${sceneEnum.prefixClass}${table.className}${VO}(); + #foreach ($column in $columns) + #if (${column.listOperation}) + #set ($JavaField = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})##首字母大写 + #if (${column.listOperationCondition} == "BETWEEN")## BETWEEN 的情况 + reqVO.set${JavaField}(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + #else + reqVO.set$JavaField(null); + #end + #end + #end +#end +/** + * {@link ${table.className}ServiceImpl} 的单元测试类 + * + * @author ${table.author} + */ +@Import(${table.className}ServiceImpl.class) +public class ${table.className}ServiceImplTest extends BaseDbUnitTest { + + @Resource + private ${table.className}ServiceImpl ${classNameVar}Service; + + @Resource + private ${table.className}Mapper ${classNameVar}Mapper; + + @Test + public void testCreate${simpleClassName}_success() { + // 准备参数 + ${sceneEnum.prefixClass}${table.className}CreateReqVO reqVO = randomPojo(${sceneEnum.prefixClass}${table.className}CreateReqVO.class); + + // 调用 + ${primaryColumn.javaType} ${classNameVar}Id = ${classNameVar}Service.create${simpleClassName}(reqVO); + // 断言 + assertNotNull(${classNameVar}Id); + // 校验记录的属性是否正确 + ${table.className}DO ${classNameVar} = ${classNameVar}Mapper.selectById(${classNameVar}Id); + assertPojoEquals(reqVO, ${classNameVar}); + } + + @Test + public void testUpdate${simpleClassName}_success() { + // mock 数据 + ${table.className}DO db${simpleClassName} = randomPojo(${table.className}DO.class); + ${classNameVar}Mapper.insert(db${simpleClassName});// @Sql: 先插入出一条存在的数据 + // 准备参数 + ${sceneEnum.prefixClass}${table.className}UpdateReqVO reqVO = randomPojo(${sceneEnum.prefixClass}${table.className}UpdateReqVO.class, o -> { + o.setId(db${simpleClassName}.getId()); // 设置更新的 ID + }); + + // 调用 + ${classNameVar}Service.update${simpleClassName}(reqVO); + // 校验是否更新正确 + ${table.className}DO ${classNameVar} = ${classNameVar}Mapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, ${classNameVar}); + } + + @Test + public void testUpdate${simpleClassName}_notExists() { + // 准备参数 + ${sceneEnum.prefixClass}${table.className}UpdateReqVO reqVO = randomPojo(${sceneEnum.prefixClass}${table.className}UpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> ${classNameVar}Service.update${simpleClassName}(reqVO), ${simpleClassName_underlineCase.toUpperCase()}_NOT_EXISTS); + } + + @Test + public void testDelete${simpleClassName}_success() { + // mock 数据 + ${table.className}DO db${simpleClassName} = randomPojo(${table.className}DO.class); + ${classNameVar}Mapper.insert(db${simpleClassName});// @Sql: 先插入出一条存在的数据 + // 准备参数 + ${primaryColumn.javaType} id = db${simpleClassName}.getId(); + + // 调用 + ${classNameVar}Service.delete${simpleClassName}(id); + // 校验数据不存在了 + assertNull(${classNameVar}Mapper.selectById(id)); + } + + @Test + public void testDelete${simpleClassName}_notExists() { + // 准备参数 + ${primaryColumn.javaType} id = random${primaryColumn.javaType}Id(); + + // 调用, 并断言异常 + assertServiceException(() -> ${classNameVar}Service.delete${simpleClassName}(id), ${simpleClassName_underlineCase.toUpperCase()}_NOT_EXISTS); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGet${simpleClassName}Page() { + #getPageCondition("PageReqVO") + + // 调用 + PageResult<${table.className}DO> pageResult = ${classNameVar}Service.get${simpleClassName}Page(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(db${simpleClassName}, pageResult.getList().get(0)); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGet${simpleClassName}List() { + #getPageCondition("ExportReqVO") + + // 调用 + List<${table.className}DO> list = ${classNameVar}Service.get${simpleClassName}List(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(db${simpleClassName}, list.get(0)); + } + +} diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/sql/h2.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/sql/h2.vm new file mode 100644 index 0000000..9d785de --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/sql/h2.vm @@ -0,0 +1,35 @@ +-- 将该建表 SQL 语句,添加到 win-module-${table.moduleName}-biz 模块的 test/resources/sql/create_tables.sql 文件里 +CREATE TABLE IF NOT EXISTS "${table.tableName.toLowerCase()}" ( +#foreach ($column in $columns) +#if (${column.javaType} == 'Long') + #set ($dataType='bigint') +#elseif (${column.javaType} == 'Integer') + #set ($dataType='int') +#elseif (${column.javaType} == 'Boolean') + #set ($dataType='bit') +#elseif (${column.javaType} == 'Date') + #set ($dataType='datetime') +#else + #set ($dataType='varchar') +#end + #if (${column.primaryKey})##处理主键 + "${column.javaField}"#if (${column.javaType} == 'String') ${dataType} NOT NULL#else ${dataType} NOT NULL GENERATED BY DEFAULT AS IDENTITY#end, + #else + #if (${column.columnName} == 'create_time') + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + #elseif (${column.columnName} == 'update_time') + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + #elseif (${column.columnName} == 'creator' || ${column.columnName} == 'updater') + "${column.columnName}" ${dataType} DEFAULT '', + #elseif (${column.columnName} == 'deleted') + "deleted" bit NOT NULL DEFAULT FALSE, + #else + "${column.columnName.toLowerCase()}" ${dataType}#if (${column.nullable} == false) NOT NULL#end, + #end + #end +#end + PRIMARY KEY ("${primaryColumn.columnName.toLowerCase()}") +) COMMENT '${table.tableComment}'; + +-- 将该删表 SQL 语句,添加到 win-module-${table.moduleName}-biz 模块的 test/resources/sql/clean.sql 文件里 +DELETE FROM "${table.tableName}"; diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/sql/sql.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/sql/sql.vm new file mode 100644 index 0000000..902ca74 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/sql/sql.vm @@ -0,0 +1,28 @@ +-- 菜单 SQL +INSERT INTO system_menu( + name, permission, type, sort, parent_id, + path, icon, component, status, component_name +) +VALUES ( + '${table.classComment}管理', '', 2, 0, ${table.parentMenuId}, + '${simpleClassName_strikeCase}', '', '${table.moduleName}/${classNameVar}/index', 0, '${table.className}' +); + +-- 按钮父菜单ID +-- 暂时只支持 MySQL。如果你是 Oracle、PostgreSQL、SQLServer 的话,需要手动修改 @parentId 的部分的代码 +SELECT @parentId := LAST_INSERT_ID(); + +-- 按钮 SQL +#set ($functionNames = ['查询', '创建', '更新', '删除', '导出']) +#set ($functionOps = ['query', 'create', 'update', 'delete', 'export']) +#foreach ($functionName in $functionNames) +#set ($index = $foreach.count - 1) +INSERT INTO system_menu( + name, permission, type, sort, parent_id, + path, icon, component, status +) +VALUES ( + '${table.classComment}${functionName}', '${permissionPrefix}:${functionOps.get($index)}', 3, $foreach.count, @parentId, + '', '', '', 0 +); +#end diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue/api/api.js.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue/api/api.js.vm new file mode 100644 index 0000000..5e9da32 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue/api/api.js.vm @@ -0,0 +1,55 @@ +import request from '@/utils/request' +#set ($baseURL = "/${table.moduleName}/${simpleClassName_strikeCase}") + +// 创建${table.classComment} +export function create${simpleClassName}(data) { + return request({ + url: '${baseURL}/create', + method: 'post', + data: data + }) +} + +// 更新${table.classComment} +export function update${simpleClassName}(data) { + return request({ + url: '${baseURL}/update', + method: 'put', + data: data + }) +} + +// 删除${table.classComment} +export function delete${simpleClassName}(id) { + return request({ + url: '${baseURL}/delete?id=' + id, + method: 'delete' + }) +} + +// 获得${table.classComment} +export function get${simpleClassName}(id) { + return request({ + url: '${baseURL}/get?id=' + id, + method: 'get' + }) +} + +// 获得${table.classComment}分页 +export function get${simpleClassName}Page(query) { + return request({ + url: '${baseURL}/page', + method: 'get', + params: query + }) +} + +// 导出${table.classComment} Excel +export function export${simpleClassName}Excel(query) { + return request({ + url: '${baseURL}/export-excel', + method: 'get', + params: query, + responseType: 'blob' + }) +} diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue/views/index.vue.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue/views/index.vue.vm new file mode 100644 index 0000000..7a6add6 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue/views/index.vue.vm @@ -0,0 +1,369 @@ + + + diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3/api/api.ts.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3/api/api.ts.vm new file mode 100644 index 0000000..c1a489c --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3/api/api.ts.vm @@ -0,0 +1,57 @@ +import request from '@/config/axios' +#set ($baseURL = "/${table.moduleName}/${simpleClassName_strikeCase}") + +export interface ${simpleClassName}VO { +#foreach ($column in $columns) +#if ($column.createOperation || $column.updateOperation) +#if(${column.javaType.toLowerCase()} == "long" || ${column.javaType.toLowerCase()} == "integer" || ${column.javaType.toLowerCase()} == "short" || ${column.javaType.toLowerCase()} == "double" || ${column.javaType.toLowerCase()} == "bigdecimal") + ${column.javaField}: number +#elseif(${column.javaType.toLowerCase()} == "date" || ${column.javaType.toLowerCase()} == "localdatetime") + ${column.javaField}: Date +#else + ${column.javaField}: ${column.javaType.toLowerCase()} +#end +#end +#end +} + +// 查询${table.classComment}列表 +export const get${simpleClassName}Page = async (params) => { + if (params.isSearch) { + delete params.isSearch + const data = {...params} + return await request.post({ url: '${baseURL}/senior', data }) + } else { + return await request.get({ url: `${baseURL}/page`, params }) + } +} + +// 查询${table.classComment}详情 +export const get${simpleClassName} = async (id: number) => { + return await request.get({ url: `${baseURL}/get?id=` + id }) +} + +// 新增${table.classComment} +export const create${simpleClassName} = async (data: ${simpleClassName}VO) => { + return await request.post({ url: `${baseURL}/create`, data }) +} + +// 修改${table.classComment} +export const update${simpleClassName} = async (data: ${simpleClassName}VO) => { + return await request.put({ url: `${baseURL}/update`, data }) +} + +// 删除${table.classComment} +export const delete${simpleClassName} = async (id: number) => { + return await request.delete({ url: `${baseURL}/delete?id=` + id }) +} + +// 导出${table.classComment} Excel +export const export${simpleClassName} = async (params) => { + return await request.download({ url: `${baseURL}/export-excel`, params }) +} + +// 下载导入模板 +export const importTemplate = () => { + return request.download({ url: '${baseURL}/get-import-template' }) +} \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3/views/data.ts.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3/views/data.ts.vm new file mode 100644 index 0000000..575616b --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3/views/data.ts.vm @@ -0,0 +1,138 @@ +import type { CrudSchema } from '@/hooks/web/useCrudSchemas' +#foreach ($column in $columns) + #if ($column.listOperationResult && $column.htmlType == "datetime") +import { dateFormatter } from '@/utils/formatTime' + #break + #end +#end + +// 表单校验 +export const ${simpleClassName}Rules = reactive({ +#foreach ($column in $columns) +#if (($column.createOperation || $column.updateOperation) && !$column.nullable && !${column.primaryKey})## 创建或者更新操作 && 要求非空 && 非主键 +#set($comment=$column.columnComment) + $column.javaField: [required], +#end +#end +}) + +export const ${simpleClassName} = useCrudSchemas(reactive([ +#foreach($column in $columns) +#if ($column.listOperation || $column.listOperationResult || $column.createOperation || $column.updateOperation) +#set ($dictType = $column.dictType) +#set ($javaField = $column.javaField) +#set ($javaType = $column.javaType) + { + label: '${column.columnComment}', + field: '${column.javaField}', +## ========= 排序部分 ========= + sort: 'custom', +## ========= 字典部分 ========= + #if ("" != $dictType)## 有数据字典 + dictType: DICT_TYPE.$dictType.toUpperCase(), + dictClass: 'string', // 默认都是字符串类型其他暂不考虑 + #end +## ========= Table 表格部分 ========= + #if (!$column.listOperationResult) + isTable: false, + #else + #if ($column.htmlType == "datetime") + formatter: dateFormatter, + #end + #end +## ========= Search 表格部分 ========= + #if ($column.listOperation) + isSearch: true, + #if ($column.htmlType == "datetime") + search: { + component: 'DatePicker', + componentProps: { + valueFormat: 'YYYY-MM-DD HH:mm:ss', + type: 'daterange', + defaultTime: [new Date('1 00:00:00'), new Date('1 23:59:59')] + } + }, + #end + #end +## ========= Form 表单部分 ========= + #if ((!$column.createOperation && !$column.updateOperation) || $column.primaryKey) + isForm: false, + #else + #if($column.htmlType == "imageUpload")## 图片上传 + form: { + component: 'UploadImg' + }, + #elseif($column.htmlType == "fileUpload")## 文件上传 + form: { + component: 'UploadFile' + }, + #elseif($column.htmlType == "editor")## 文本编辑器 + form: { + component: 'Editor', + componentProps: { + valueHtml: '', + height: 200 + } + }, + #elseif($column.htmlType == "select")## 下拉框 + #if($dictType.toUpperCase() == "TRUE_FALSE")## Switch开关 + form: { + component: 'Switch', + value: 'TRUE', + componentProps: { + inactiveValue: 'FALSE', + activeValue: 'TRUE' + } + }, + #else + form: { + component: 'SelectV2' + }, + #end + #elseif($column.htmlType == "checkbox")## 多选框 + form: { + component: 'Checkbox' + }, + #elseif($column.htmlType == "radio")## 单选框 + form: { + component: 'Radio' + }, + #elseif($column.htmlType == "datetime")## 时间框 + form: { + component: 'DatePicker', + componentProps: { + type: 'datetime', + valueFormat: 'x' + } + }, + #elseif($column.htmlType == "textarea")## 文本框 + form: { + component: 'Input', + componentProps: { + type: 'textarea', + rows: 4 + }, + colProps: { + span: 24 + } + }, + #elseif(${javaType.toLowerCase()} == "long" || ${javaType.toLowerCase()} == "integer")## 文本框 + form: { + component: 'InputNumber', + value: 0 + }, + #end + #end + }, +#end +#end + { + label: '操作', + field: 'action', + isForm: false, + table: { + width: 150, + fixed: 'right' + } + } +])) diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3/views/index.vue.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3/views/index.vue.vm new file mode 100644 index 0000000..8a67c97 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3/views/index.vue.vm @@ -0,0 +1,231 @@ + + + diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_back/api/api.ts.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_back/api/api.ts.vm new file mode 100644 index 0000000..401796d --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_back/api/api.ts.vm @@ -0,0 +1,46 @@ +import request from '@/config/axios' +#set ($baseURL = "/${table.moduleName}/${simpleClassName_strikeCase}") + +export interface ${simpleClassName}VO { +#foreach ($column in $columns) +#if ($column.createOperation || $column.updateOperation) +#if(${column.javaType.toLowerCase()} == "long" || ${column.javaType.toLowerCase()} == "integer" || ${column.javaType.toLowerCase()} == "short" || ${column.javaType.toLowerCase()} == "double" || ${column.javaType.toLowerCase()} == "bigdecimal") + ${column.javaField}: number +#elseif(${column.javaType.toLowerCase()} == "date" || ${column.javaType.toLowerCase()} == "localdatetime") + ${column.javaField}: Date +#else + ${column.javaField}: ${column.javaType.toLowerCase()} +#end +#end +#end +} + +// 查询${table.classComment}列表 +export const get${simpleClassName}Page = async (params) => { + return await request.get({ url: `${baseURL}/page`, params }) +} + +// 查询${table.classComment}详情 +export const get${simpleClassName} = async (id: number) => { + return await request.get({ url: `${baseURL}/get?id=` + id }) +} + +// 新增${table.classComment} +export const create${simpleClassName} = async (data: ${simpleClassName}VO) => { + return await request.post({ url: `${baseURL}/create`, data }) +} + +// 修改${table.classComment} +export const update${simpleClassName} = async (data: ${simpleClassName}VO) => { + return await request.put({ url: `${baseURL}/update`, data }) +} + +// 删除${table.classComment} +export const delete${simpleClassName} = async (id: number) => { + return await request.delete({ url: `${baseURL}/delete?id=` + id }) +} + +// 导出${table.classComment} Excel +export const export${simpleClassName} = async (params) => { + return await request.download({ url: `${baseURL}/export-excel`, params }) +} diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_back/views/form.vue.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_back/views/form.vue.vm new file mode 100644 index 0000000..946ddae --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_back/views/form.vue.vm @@ -0,0 +1,241 @@ + + diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_back/views/index.vue.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_back/views/index.vue.vm new file mode 100644 index 0000000..e7eef8d --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_back/views/index.vue.vm @@ -0,0 +1,287 @@ + + + diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_schema/api/api.ts.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_schema/api/api.ts.vm new file mode 100644 index 0000000..48cd542 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_schema/api/api.ts.vm @@ -0,0 +1,46 @@ +import request from '@/config/axios' +#set ($baseURL = "/${table.moduleName}/${simpleClassName_strikeCase}") + +export interface ${simpleClassName}VO { + #foreach ($column in $columns) + #if ($column.createOperation || $column.updateOperation) + #if(${column.javaType.toLowerCase()} == "long" || ${column.javaType.toLowerCase()} == "integer" || ${column.javaType.toLowerCase()} == "double" || ${column.javaType.toLowerCase()} == "bigdecimal") + ${column.javaField}: number + #elseif(${column.javaType.toLowerCase()} == "date" || ${column.javaType.toLowerCase()} == "localdatetime") + ${column.javaField}: Date + #else + ${column.javaField}: ${column.javaType.toLowerCase()} + #end + #end + #end +} + +// 查询${table.classComment}列表 +export const get${simpleClassName}Page = async (params) => { + return await request.get({ url: '${baseURL}/page', params }) +} + +// 查询${table.classComment}详情 +export const get${simpleClassName} = async (id: number) => { + return await request.get({ url: '${baseURL}/get?id=' + id }) +} + +// 新增${table.classComment} +export const create${simpleClassName} = async (data: ${simpleClassName}VO) => { + return await request.post({ url: '${baseURL}/create', data }) +} + +// 修改${table.classComment} +export const update${simpleClassName} = async (data: ${simpleClassName}VO) => { + return await request.put({ url: '${baseURL}/update', data }) +} + +// 删除${table.classComment} +export const delete${simpleClassName} = async (id: number) => { + return await request.delete({ url: '${baseURL}/delete?id=' + id }) +} + +// 导出${table.classComment} Excel +export const export${simpleClassName}Api = async (params) => { + return await request.download({ url: '${baseURL}/export-excel', params }) +} diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_schema/views/data.ts.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_schema/views/data.ts.vm new file mode 100644 index 0000000..cbc6a17 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_schema/views/data.ts.vm @@ -0,0 +1,129 @@ +import type { CrudSchema } from '@/hooks/web/useCrudSchemas' +#foreach ($column in $columns) + #if ($column.listOperationResult && $column.htmlType == "datetime") +import { dateFormatter } from '@/utils/formatTime' + #break + #end +#end + +// 表单校验 +export const rules = reactive({ +#foreach ($column in $columns) +#if (($column.createOperation || $column.updateOperation) && !$column.nullable && !${column.primaryKey})## 创建或者更新操作 && 要求非空 && 非主键 +#set($comment=$column.columnComment) + $column.javaField: [required], +#end +#end +}) + +// CrudSchema https://doc.iocoder.cn/vue3/crud-schema/ +const crudSchemas = reactive([ +#foreach($column in $columns) +#if ($column.listOperation || $column.listOperationResult || $column.createOperation || $column.updateOperation) +#set ($dictType = $column.dictType) +#set ($javaField = $column.javaField) +#set ($javaType = $column.javaType) + { + label: '${column.columnComment}', + field: '${column.javaField}', +## ========= 字典部分 ========= + #if ("" != $dictType)## 有数据字典 + dictType: DICT_TYPE.$dictType.toUpperCase(), + #if ($javaType == "Integer" || $javaType == "Long" || $javaType == "Byte" || $javaType == "Short") + dictClass: 'number', + #elseif ($javaType == "String") + dictClass: 'string', + #elseif ($javaType == "Boolean") + dictClass: 'boolean', + #end + #end +## ========= Table 表格部分 ========= + #if (!$column.listOperationResult) + isTable: false, + #else + #if ($column.htmlType == "datetime") + formatter: dateFormatter, + #end + #end +## ========= Search 表格部分 ========= + #if ($column.listOperation) + isSearch: true, + #if ($column.htmlType == "datetime") + search: { + component: 'DatePicker', + componentProps: { + valueFormat: 'YYYY-MM-DD HH:mm:ss', + type: 'daterange', + defaultTime: [new Date('1 00:00:00'), new Date('1 23:59:59')] + } + }, + #end + #end +## ========= Form 表单部分 ========= + #if ((!$column.createOperation && !$column.updateOperation) || $column.primaryKey) + isForm: false, + #else + #if($column.htmlType == "imageUpload")## 图片上传 + form: { + component: 'UploadImg' + }, + #elseif($column.htmlType == "fileUpload")## 文件上传 + form: { + component: 'UploadFile' + }, + #elseif($column.htmlType == "editor")## 文本编辑器 + form: { + component: 'Editor', + componentProps: { + valueHtml: '', + height: 200 + } + }, + #elseif($column.htmlType == "select")## 下拉框 + form: { + component: 'SelectV2' + }, + #elseif($column.htmlType == "checkbox")## 多选框 + form: { + component: 'Checkbox' + }, + #elseif($column.htmlType == "radio")## 单选框 + form: { + component: 'Radio' + }, + #elseif($column.htmlType == "datetime")## 时间框 + form: { + component: 'DatePicker', + componentProps: { + type: 'datetime', + valueFormat: 'x' + } + }, + #elseif($column.htmlType == "textarea")## 文本框 + form: { + component: 'Input', + componentProps: { + type: 'textarea', + rows: 4 + }, + colProps: { + span: 24 + } + }, + #elseif(${javaType.toLowerCase()} == "long" || ${javaType.toLowerCase()} == "integer")## 文本框 + form: { + component: 'InputNumber', + value: 0 + }, + #end + #end + }, +#end +#end + { + label: '操作', + field: 'action', + isForm: false + } +]) +export const { allSchemas } = useCrudSchemas(crudSchemas) diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_schema/views/form.vue.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_schema/views/form.vue.vm new file mode 100644 index 0000000..45b8aa2 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_schema/views/form.vue.vm @@ -0,0 +1,65 @@ + + diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_schema/views/index.vue.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_schema/views/index.vue.vm new file mode 100644 index 0000000..5cceec1 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_schema/views/index.vue.vm @@ -0,0 +1,84 @@ + + diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_vben/api/api.ts.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_vben/api/api.ts.vm new file mode 100644 index 0000000..c7283a1 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_vben/api/api.ts.vm @@ -0,0 +1,32 @@ +import { defHttp } from '@/utils/http/axios' +#set ($baseURL = "/${table.moduleName}/${simpleClassName_strikeCase}") + +// 查询${table.classComment}列表 +export function get${simpleClassName}Page(params) { + return defHttp.get({ url: '${baseURL}/page', params }) +} + +// 查询${table.classComment}详情 +export function get${simpleClassName}(id: number) { + return defHttp.get({ url: `${baseURL}/get?id=${id}` }) +} + +// 新增${table.classComment} +export function create${simpleClassName}(data) { + return defHttp.post({ url: '${baseURL}/create', data }) +} + +// 修改${table.classComment} +export function update${simpleClassName}(data) { + return defHttp.put({ url: '${baseURL}/update', data }) +} + +// 删除${table.classComment} +export function delete${simpleClassName}(id: number) { + return defHttp.delete({ url: `${baseURL}/delete?id=${id}` }) +} + +// 导出${table.classComment} Excel +export function export${simpleClassName}(params) { + return defHttp.download({ url: '${baseURL}/export-excel', params }, '${table.classComment}.xls') +} diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_vben/views/data.ts.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_vben/views/data.ts.vm new file mode 100644 index 0000000..5557b38 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_vben/views/data.ts.vm @@ -0,0 +1,226 @@ +import type { BasicColumn, FormSchema } from '@/components/Table' +import { useRender } from '@/components/Table' +import { DICT_TYPE, getDictOptions } from '@/utils/dict' + +export const columns: BasicColumn[] = [ +#foreach($column in $columns) +#if ($column.listOperationResult) + #set ($dictType=$column.dictType) + #set ($javaField = $column.javaField) + #set ($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) + #set ($comment=$column.columnComment) +#if ($column.javaType == "LocalDateTime")## 时间类型 + { + title: '${comment}', + dataIndex: '${javaField}', + width: 180, + customRender: ({ text }) => { + return useRender.renderDate(text) + }, + }, +#elseif("" != $column.dictType)## 数据字典 + { + title: '${comment}', + dataIndex: '${javaField}', + width: 180, + customRender: ({ text }) => { + return useRender.renderDict(text, DICT_TYPE.$dictType.toUpperCase()) + }, + }, +#else + { + title: '${comment}', + dataIndex: '${javaField}', + width: 160, + }, +#end +#end +#end +] + +export const searchFormSchema: FormSchema[] = [ +#foreach($column in $columns) +#if ($column.listOperation) + #set ($dictType=$column.dictType) + #set ($javaField = $column.javaField) + #set ($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) + #set ($comment=$column.columnComment) + { + label: '${comment}', + field: '${javaField}', + #if ($column.htmlType == "input") + component: 'Input', + #elseif ($column.htmlType == "select" || $column.htmlType == "radio") + component: 'Select', + componentProps: { + #if ("" != $dictType)## 设置了 dictType 数据字典的情况 + options: getDictOptions(DICT_TYPE.$dictType.toUpperCase()), + #else## 未设置 dictType 数据字典的情况 + options: [], + #end + }, + #elseif($column.htmlType == "datetime") + component: 'RangePicker', + #end + colProps: { span: 8 }, + }, +#end +#end +] + +export const createFormSchema: FormSchema[] = [ + { + label: '编号', + field: 'id', + show: false, + component: 'Input', + }, +#foreach($column in $columns) +#if ($column.createOperation) + #set ($dictType = $column.dictType) + #set ($javaField = $column.javaField) + #set ($AttrName = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) + #set ($comment = $column.columnComment) +#if (!$column.primaryKey)## 忽略主键,不用在表单里 + { + label: '${comment}', + field: '${javaField}', + #if (($column.createOperation || $column.updateOperation) && !$column.nullable && !${column.primaryKey})## 创建或者更新操作 && 要求非空 && 非主键 + required: true, + #end + #if ($column.htmlType == "input") + component: 'Input', + #elseif($column.htmlType == "imageUpload")## 图片上传 + component: 'FileUpload', + componentProps: { + fileType: 'image', + maxCount: 1, + }, + #elseif($column.htmlType == "fileUpload")## 文件上传 + component: 'FileUpload', + componentProps: { + fileType: 'file', + maxCount: 1, + }, + #elseif($column.htmlType == "editor")## 文本编辑器 + component: 'Editor', + #elseif($column.htmlType == "select")## 下拉框 + component: 'Select', + componentProps: { + #if ("" != $dictType)## 有数据字典 + options: getDictOptions(DICT_TYPE.$dictType.toUpperCase(), 'number'), + #else##没数据字典 + options:[], + #end + }, + #elseif($column.htmlType == "checkbox")## 多选框 + component: 'Checkbox', + componentProps: { + #if ("" != $dictType)## 有数据字典 + options: getDictOptions(DICT_TYPE.$dictType.toUpperCase(), 'number'), + #else##没数据字典 + options:[], + #end + }, + #elseif($column.htmlType == "radio")## 单选框 + component: 'RadioButtonGroup', + componentProps: { + #if ("" != $dictType)## 有数据字典 + options: getDictOptions(DICT_TYPE.$dictType.toUpperCase(), 'number'), + #else##没数据字典 + options:[], + #end + }, + #elseif($column.htmlType == "datetime")## 时间框 + component: 'DatePicker', + componentProps: { + showTime: true, + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'x', + }, + #elseif($column.htmlType == "textarea")## 文本域 + component: 'InputTextArea', + #end + }, +#end +#end +#end +] + +export const updateFormSchema: FormSchema[] = [ + { + label: '编号', + field: 'id', + show: false, + component: 'Input', + }, +#foreach($column in $columns) +#if ($column.updateOperation) +#set ($dictType = $column.dictType) +#set ($javaField = $column.javaField) +#set ($AttrName = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#set ($comment = $column.columnComment) + #if (!$column.primaryKey)## 忽略主键,不用在表单里 + { + label: '${comment}', + field: '${javaField}', + #if (($column.createOperation || $column.updateOperation) && !$column.nullable && !${column.primaryKey})## 创建或者更新操作 && 要求非空 && 非主键 + required: true, + #end + #if ($column.htmlType == "input") + component: 'Input', + #elseif($column.htmlType == "imageUpload")## 图片上传 + component: 'FileUpload', + componentProps: { + fileType: 'image', + maxCount: 1, + }, + #elseif($column.htmlType == "fileUpload")## 文件上传 + component: 'FileUpload', + componentProps: { + fileType: 'file', + maxCount: 1, + }, + #elseif($column.htmlType == "editor")## 文本编辑器component: 'Editor', + #elseif($column.htmlType == "select")## 下拉框 + component: 'Select', + componentProps: { + #if ("" != $dictType)## 有数据字典 + options: getDictOptions(DICT_TYPE.$dictType.toUpperCase(), 'number'), + #else##没数据字典 + options:[], + #end + }, + #elseif($column.htmlType == "checkbox")## 多选框 + component: 'Checkbox', + componentProps: { + #if ("" != $dictType)## 有数据字典 + options: getDictOptions(DICT_TYPE.$dictType.toUpperCase(), 'number'), + #else##没数据字典 + options:[], + #end + }, + #elseif($column.htmlType == "radio")## 单选框 + component: 'RadioButtonGroup', + componentProps: { + #if ("" != $dictType)## 有数据字典 + options: getDictOptions(DICT_TYPE.$dictType.toUpperCase(), 'number'), + #else##没数据字典 + options:[], + #end + }, + #elseif($column.htmlType == "datetime")## 时间框 + component: 'DatePicker', + componentProps: { + showTime: true, + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'x', + }, + #elseif($column.htmlType == "textarea")## 文本域 + component: 'InputTextArea', + #end + }, + #end +#end +#end +] \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_vben/views/form.vue.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_vben/views/form.vue.vm new file mode 100644 index 0000000..6c8b6d3 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_vben/views/form.vue.vm @@ -0,0 +1,58 @@ + + \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_vben/views/index.vue.vm b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_vben/views/index.vue.vm new file mode 100644 index 0000000..07f3285 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_vben/views/index.vue.vm @@ -0,0 +1,92 @@ + + diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/file/erweima.jpg b/win-module-infra/win-module-infra-biz/src/main/resources/file/erweima.jpg new file mode 100644 index 0000000..1447283 Binary files /dev/null and b/win-module-infra/win-module-infra-biz/src/main/resources/file/erweima.jpg differ diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/i18n/infra.properties b/win-module-infra/win-module-infra-biz/src/main/resources/i18n/infra.properties new file mode 100644 index 0000000..6882c29 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/i18n/infra.properties @@ -0,0 +1 @@ +#\u6B64\u6587\u4EF6\u4E0D\u9700\u8981\u586B\u5199 \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/i18n/infra_en_US.properties b/win-module-infra/win-module-infra-biz/src/main/resources/i18n/infra_en_US.properties new file mode 100644 index 0000000..e69de29 diff --git a/win-module-infra/win-module-infra-biz/src/main/resources/i18n/infra_zh_CN.properties b/win-module-infra/win-module-infra-biz/src/main/resources/i18n/infra_zh_CN.properties new file mode 100644 index 0000000..e69de29 diff --git a/win-module-infra/win-module-infra-biz/src/test/resources/application-unit-test.yaml b/win-module-infra/win-module-infra-biz/src/test/resources/application-unit-test.yaml new file mode 100644 index 0000000..0d06d58 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/test/resources/application-unit-test.yaml @@ -0,0 +1,50 @@ +spring: + main: + lazy-initialization: true # 开启懒加载,加快速度 + banner-mode: off # 单元测试,禁用 Banner + +--- #################### 数据库相关配置 #################### + +spring: + # 数据源配置项 + datasource: + name: ruoyi-vue-pro + url: jdbc:h2:mem:testdb;MODE=MYSQL;DATABASE_TO_UPPER=false;NON_KEYWORDS=value; # MODE 使用 MySQL 模式;DATABASE_TO_UPPER 配置表和字段使用小写 + driver-class-name: org.h2.Driver + username: sa + password: + druid: + async-init: true # 单元测试,异步初始化 Druid 连接池,提升启动速度 + initial-size: 1 # 单元测试,配置为 1,提升启动速度 + sql: + init: + schema-locations: classpath:/sql/create_tables.sql + + # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 + redis: + host: 127.0.0.1 # 地址 + port: 16379 # 端口(单元测试,使用 16379 端口) + database: 0 # 数据库索引 + +mybatis-plus: + lazy-initialization: true # 单元测试,设置 MyBatis Mapper 延迟加载,加速每个单元测试 + type-aliases-package: ${win.info.base-package}.module.*.dal.dataobject + +--- #################### 定时任务相关配置 #################### + +--- #################### 配置中心相关配置 #################### + +--- #################### 服务保障相关配置 #################### + +# Lock4j 配置项(单元测试,禁用 Lock4j) + +# Resilience4j 配置项 + +--- #################### 监控相关配置 #################### + +--- #################### 闻荫相关配置 #################### + +# 闻荫配置项,设置当前项目所有自定义的配置 +win: + info: + base-package: com.win diff --git a/win-module-infra/win-module-infra-biz/src/test/resources/logback.xml b/win-module-infra/win-module-infra-biz/src/test/resources/logback.xml new file mode 100644 index 0000000..daf756b --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/test/resources/logback.xml @@ -0,0 +1,4 @@ + + + + diff --git a/win-module-infra/win-module-infra-biz/src/test/resources/sql/clean.sql b/win-module-infra/win-module-infra-biz/src/test/resources/sql/clean.sql new file mode 100644 index 0000000..3dc20f7 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/test/resources/sql/clean.sql @@ -0,0 +1,10 @@ +DELETE FROM "infra_config"; +DELETE FROM "infra_file_config"; +DELETE FROM "infra_file"; +DELETE FROM "infra_job"; +DELETE FROM "infra_job_log"; +DELETE FROM "infra_api_access_log"; +DELETE FROM "infra_api_error_log"; +DELETE FROM "infra_file_config"; +DELETE FROM "infra_test_demo"; +DELETE FROM "infra_data_source_config"; diff --git a/win-module-infra/win-module-infra-biz/src/test/resources/sql/create_tables.sql b/win-module-infra/win-module-infra-biz/src/test/resources/sql/create_tables.sql new file mode 100644 index 0000000..e076ca8 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/test/resources/sql/create_tables.sql @@ -0,0 +1,172 @@ + +CREATE TABLE IF NOT EXISTS "infra_config" ( + "id" bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY COMMENT '编号', + "category" varchar(50) NOT NULL, + "type" tinyint NOT NULL, + "name" varchar(100) NOT NULL DEFAULT '' COMMENT '名字', + "config_key" varchar(100) NOT NULL DEFAULT '', + "value" varchar(500) NOT NULL DEFAULT '', + "visible" bit NOT NULL, + "remark" varchar(500) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '参数配置表'; + +CREATE TABLE IF NOT EXISTS "infra_file_config" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(63) NOT NULL, + "storage" tinyint NOT NULL, + "remark" varchar(255), + "master" bit(1) NOT NULL, + "config" varchar(4096) NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '文件配置表'; + +CREATE TABLE IF NOT EXISTS "infra_file" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "config_id" bigint NOT NULL, + "name" varchar(256), + "path" varchar(512), + "url" varchar(1024), + "type" varchar(63) DEFAULT NULL, + "size" bigint NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint not null default '0', + PRIMARY KEY ("id") +) COMMENT '文件表'; + +CREATE TABLE IF NOT EXISTS "infra_job" ( + "id" bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY COMMENT '任务编号', + "name" varchar(32) NOT NULL COMMENT '任务名称', + "status" tinyint(4) NOT NULL COMMENT '任务状态', + "handler_name" varchar(64) NOT NULL COMMENT '处理器的名字', + "handler_param" varchar(255) DEFAULT NULL COMMENT '处理器的参数', + "cron_expression" varchar(32) NOT NULL COMMENT 'CRON 表达式', + "retry_count" int(11) NOT NULL DEFAULT '0' COMMENT '重试次数', + "retry_interval" int(11) NOT NULL DEFAULT '0' COMMENT '重试间隔', + "monitor_timeout" int(11) NOT NULL DEFAULT '0' COMMENT '监控超时时间', + "creator" varchar(64) DEFAULT '' COMMENT '创建者', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + "updater" varchar(64) DEFAULT '' COMMENT '更新者', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + "deleted" bit NOT NULL DEFAULT FALSE COMMENT '是否删除', + PRIMARY KEY ("id") +) COMMENT='定时任务表'; + +CREATE TABLE IF NOT EXISTS "infra_job_log" ( + "id" bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY COMMENT '日志编号', + "job_id" bigint(20) NOT NULL COMMENT '任务编号', + "handler_name" varchar(64) NOT NULL COMMENT '处理器的名字', + "handler_param" varchar(255) DEFAULT NULL COMMENT '处理器的参数', + "execute_index" tinyint(4) NOT NULL DEFAULT '1' COMMENT '第几次执行', + "begin_time" datetime NOT NULL COMMENT '开始执行时间', + "end_time" datetime DEFAULT NULL COMMENT '结束执行时间', + "duration" int(11) DEFAULT NULL COMMENT '执行时长', + "status" tinyint(4) NOT NULL COMMENT '任务状态', + "result" varchar(4000) DEFAULT '' COMMENT '结果数据', + "creator" varchar(64) DEFAULT '' COMMENT '创建者', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + "updater" varchar(64) DEFAULT '' COMMENT '更新者', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + "deleted" bit(1) NOT NULL DEFAULT FALSE COMMENT '是否删除', + PRIMARY KEY ("id") +)COMMENT='定时任务日志表'; + +CREATE TABLE IF NOT EXISTS "infra_api_access_log" ( + "id" bigint not null GENERATED BY DEFAULT AS IDENTITY, + "trace_id" varchar(64) not null default '', + "user_id" bigint not null default '0', + "user_type" tinyint not null default '0', + "application_name" varchar(50) not null, + "request_method" varchar(16) not null default '', + "request_url" varchar(255) not null default '', + "request_params" varchar(8000) not null default '', + "user_ip" varchar(50) not null, + "user_agent" varchar(512) not null, + "begin_time" timestamp not null, + "end_time" timestamp not null, + "duration" integer not null, + "result_code" integer not null default '0', + "result_msg" varchar(512) default '', + "creator" varchar(64) default '', + "create_time" timestamp not null default current_timestamp, + "updater" varchar(64) default '', + "update_time" timestamp not null default current_timestamp, + "deleted" bit not null default false, + "tenant_id" bigint not null default '0', + primary key ("id") + ) COMMENT 'API 访问日志表'; + +CREATE TABLE IF NOT EXISTS "infra_api_error_log" ( + "id" bigint not null GENERATED BY DEFAULT AS IDENTITY, + "trace_id" varchar(64) not null, + "user_id" bigint not null default '0', + "user_type" tinyint not null default '0', + "application_name" varchar(50) not null, + "request_method" varchar(16) not null, + "request_url" varchar(255) not null, + "request_params" varchar(8000) not null, + "user_ip" varchar(50) not null, + "user_agent" varchar(512) not null, + "exception_time" timestamp not null, + "exception_name" varchar(128) not null default '', + "exception_message" clob not null, + "exception_root_cause_message" clob not null, + "exception_stack_trace" clob not null, + "exception_class_name" varchar(512) not null, + "exception_file_name" varchar(512) not null, + "exception_method_name" varchar(512) not null, + "exception_line_number" integer not null, + "process_status" tinyint not null, + "process_time" timestamp default null, + "process_user_id" bigint default '0', + "creator" varchar(64) default '', + "create_time" timestamp not null default current_timestamp, + "updater" varchar(64) default '', + "update_time" timestamp not null default current_timestamp, + "deleted" bit not null default false, + "tenant_id" bigint not null default '0', + primary key ("id") +) COMMENT '系统异常日志'; + +CREATE TABLE IF NOT EXISTS "infra_test_demo" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(100) NOT NULL, + "status" tinyint NOT NULL, + "type" tinyint NOT NULL, + "category" tinyint NOT NULL, + "remark" varchar(500), + "creator" varchar(64) DEFAULT '''', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '''', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '字典类型表'; + +CREATE TABLE IF NOT EXISTS "infra_data_source_config" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(100) NOT NULL, + "url" varchar(1024) NOT NULL, + "username" varchar(255) NOT NULL, + "password" varchar(255) NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '数据源配置表'; diff --git a/win-module-report/pom.xml b/win-module-report/pom.xml new file mode 100644 index 0000000..ec84c4c --- /dev/null +++ b/win-module-report/pom.xml @@ -0,0 +1,23 @@ + + + + com.win + win + ${revision} + + 4.0.0 + + win-module-report-api + win-module-report-biz + + win-module-report + pom + + ${project.artifactId} + + report 模块,主要实现数据可视化报表等功能。 + + + diff --git a/win-module-report/win-module-report-api/pom.xml b/win-module-report/win-module-report-api/pom.xml new file mode 100644 index 0000000..6a78699 --- /dev/null +++ b/win-module-report/win-module-report-api/pom.xml @@ -0,0 +1,26 @@ + + + + com.win + win-module-report + ${revision} + + 4.0.0 + + win-module-report-api + jar + + ${project.artifactId} + + report 模块 API,暴露给其它模块调用 + + + + + com.win + win-common + + + diff --git a/win-module-report/win-module-report-api/src/main/java/com/win/module/report/api/package-info.java b/win-module-report/win-module-report-api/src/main/java/com/win/module/report/api/package-info.java new file mode 100644 index 0000000..152552f --- /dev/null +++ b/win-module-report/win-module-report-api/src/main/java/com/win/module/report/api/package-info.java @@ -0,0 +1,4 @@ +/** + * 占位,避免 api 目录无文件时,git 无法提交 + */ +package com.win.module.report.api; diff --git a/win-module-report/win-module-report-api/src/main/java/com/win/module/report/enums/ErrorCodeConstants.java b/win-module-report/win-module-report-api/src/main/java/com/win/module/report/enums/ErrorCodeConstants.java new file mode 100644 index 0000000..7231c79 --- /dev/null +++ b/win-module-report/win-module-report-api/src/main/java/com/win/module/report/enums/ErrorCodeConstants.java @@ -0,0 +1,15 @@ +package com.win.module.report.enums; + +import com.win.framework.common.exception.ErrorCode; + +/** + * Report 错误码枚举类 + * + * report 系统,使用 1-003-000-000 段 + */ +public interface ErrorCodeConstants { + + // ========== AUTH 模块 1-003-000-000 ========== + ErrorCode GO_VIEW_PROJECT_NOT_EXISTS = new ErrorCode(1_003_000_000, "GoView 项目不存在"); + +} diff --git a/win-module-report/win-module-report-biz/pom.xml b/win-module-report/win-module-report-biz/pom.xml new file mode 100644 index 0000000..af420b1 --- /dev/null +++ b/win-module-report/win-module-report-biz/pom.xml @@ -0,0 +1,78 @@ + + + + com.win + win-module-report + ${revision} + + 4.0.0 + + win-module-report-biz + jar + + ${project.artifactId} + + report 模块,主要实现数据可视化报表等功能: + 1. 基于「积木报表」实现,打印设计、报表设计、图形设计、大屏设计等。 + + + + com.win + win-module-report-api + ${revision} + + + + com.win + win-module-system-api + ${revision} + + + + + com.win + win-spring-boot-starter-biz-operatelog + + + com.win + win-spring-boot-starter-biz-tenant + + + + + com.win + win-spring-boot-starter-web + + + + com.win + win-spring-boot-starter-security + + + + + com.win + win-spring-boot-starter-mybatis + + + + + com.win + win-spring-boot-starter-test + + + + + org.jeecgframework.jimureport + jimureport-spring-boot-starter + + + + xerces + xercesImpl + + + + diff --git a/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/controller/ajreport/package-info.java b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/controller/ajreport/package-info.java new file mode 100644 index 0000000..97ef74b --- /dev/null +++ b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/controller/ajreport/package-info.java @@ -0,0 +1 @@ +package com.win.module.report.controller.ajreport; diff --git a/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/controller/goview/GoViewDataController.java b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/controller/goview/GoViewDataController.java new file mode 100644 index 0000000..95cd81f --- /dev/null +++ b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/controller/goview/GoViewDataController.java @@ -0,0 +1,66 @@ +package com.win.module.report.controller.goview; + +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.RandomUtil; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.operatelog.core.annotations.OperateLog; +import com.win.module.report.controller.goview.vo.data.GoViewDataGetBySqlReqVO; +import com.win.module.report.controller.goview.vo.data.GoViewDataRespVO; +import com.win.module.report.service.goview.GoViewDataService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.validation.Valid; + +import java.util.*; + +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - GoView 数据", description = "提供 SQL、HTTP 等数据查询的能力") +@RestController +@RequestMapping("/report/go-view/data") +@Validated +public class GoViewDataController { + + @Resource + private GoViewDataService goViewDataService; + + @RequestMapping("/get-by-sql") + @Operation(summary = "使用 SQL 查询数据") + @PreAuthorize("@ss.hasPermission('report:go-view-data:get-by-sql')") + @OperateLog(enable = false) // 不记录操作日志,因为不需要 + public CommonResult getDataBySQL(@Valid @RequestBody GoViewDataGetBySqlReqVO reqVO) { + return success(goViewDataService.getDataBySQL(reqVO.getSql())); + } + + @RequestMapping("/get-by-http") + @Operation(summary = "使用 HTTP 查询数据", description = "这个只是示例接口,实际应该每个查询,都要写一个接口") + @PreAuthorize("@ss.hasPermission('report:go-view-data:get-by-http')") + @OperateLog(enable = false) // 不记录操作日志,因为不需要 + public CommonResult getDataByHttp( + @RequestParam(required = false) Map params, + @RequestBody(required = false) String body) { // params、body 按照需要去接收,这里仅仅是示例 + GoViewDataRespVO respVO = new GoViewDataRespVO(); + // 1. 数据维度 + respVO.setDimensions(Arrays.asList("日期", "PV", "UV")); // PV 是每天访问次数;UV 是每天访问人数 + // 2. 明细数据列表 + // 目前通过随机的方式生成。一般来说,这里你可以写逻辑来实现数据的返回 + respVO.setSource(new LinkedList<>()); + for (int i = 1; i <= 12; i++) { + String date = "2021-" + (i < 10 ? "0" + i : i); + Integer pv = RandomUtil.randomInt(1000, 10000); + Integer uv = RandomUtil.randomInt(100, 1000); + respVO.getSource().add(MapUtil.builder().put("日期", date) + .put("PV", pv).put("UV", uv).build()); + } + return success(respVO); + } + +} diff --git a/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/controller/goview/GoViewProjectController.java b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/controller/goview/GoViewProjectController.java new file mode 100644 index 0000000..cb24efa --- /dev/null +++ b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/controller/goview/GoViewProjectController.java @@ -0,0 +1,76 @@ +package com.win.module.report.controller.goview; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageParam; +import com.win.framework.common.pojo.PageResult; +import com.win.module.report.controller.goview.vo.project.GoViewProjectCreateReqVO; +import com.win.module.report.controller.goview.vo.project.GoViewProjectRespVO; +import com.win.module.report.controller.goview.vo.project.GoViewProjectUpdateReqVO; +import com.win.module.report.convert.goview.GoViewProjectConvert; +import com.win.module.report.dal.dataobject.goview.GoViewProjectDO; +import com.win.module.report.service.goview.GoViewProjectService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; + +import static com.win.framework.common.pojo.CommonResult.success; +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + +@Tag(name = "管理后台 - GoView 项目") +@RestController +@RequestMapping("/report/go-view/project") +@Validated +public class GoViewProjectController { + + @Resource + private GoViewProjectService goViewProjectService; + + @PostMapping("/create") + @Operation(summary = "创建项目") + @PreAuthorize("@ss.hasPermission('report:go-view-project:create')") + public CommonResult createProject(@Valid @RequestBody GoViewProjectCreateReqVO createReqVO) { + return success(goViewProjectService.createProject(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新项目") + @PreAuthorize("@ss.hasPermission('report:go-view-project:update')") + public CommonResult updateProject(@Valid @RequestBody GoViewProjectUpdateReqVO updateReqVO) { + goViewProjectService.updateProject(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除 GoView 项目") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('report:go-view-project:delete')") + public CommonResult deleteProject(@RequestParam("id") Long id) { + goViewProjectService.deleteProject(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得项目") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('report:go-view-project:query')") + public CommonResult getProject(@RequestParam("id") Long id) { + GoViewProjectDO project = goViewProjectService.getProject(id); + return success(GoViewProjectConvert.INSTANCE.convert(project)); + } + + @GetMapping("/my-page") + @Operation(summary = "获得我的项目分页") + @PreAuthorize("@ss.hasPermission('report:go-view-project:query')") + public CommonResult> getMyProjectPage(@Valid PageParam pageVO) { + PageResult pageResult = goViewProjectService.getMyProjectPage( + pageVO, getLoginUserId()); + return success(GoViewProjectConvert.INSTANCE.convertPage(pageResult)); + } + +} diff --git a/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/controller/goview/vo/data/GoViewDataGetBySqlReqVO.java b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/controller/goview/vo/data/GoViewDataGetBySqlReqVO.java new file mode 100644 index 0000000..96e7f50 --- /dev/null +++ b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/controller/goview/vo/data/GoViewDataGetBySqlReqVO.java @@ -0,0 +1,16 @@ +package com.win.module.report.controller.goview.vo.data; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; + +@Schema(description = "管理后台 - GoView 使用 SQL 查询数据 Request VO") +@Data +public class GoViewDataGetBySqlReqVO { + + @Schema(description = "SQL 语句", requiredMode = Schema.RequiredMode.REQUIRED, example = "SELECT * FROM user") + @NotEmpty(message = "SQL 语句不能为空") + private String sql; + +} diff --git a/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/controller/goview/vo/data/GoViewDataRespVO.java b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/controller/goview/vo/data/GoViewDataRespVO.java new file mode 100644 index 0000000..dcd0196 --- /dev/null +++ b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/controller/goview/vo/data/GoViewDataRespVO.java @@ -0,0 +1,19 @@ +package com.win.module.report.controller.goview.vo.data; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +@Schema(description = "管理后台 - GoView 数据 Response VO") +@Data +public class GoViewDataRespVO { + + @Schema(description = "数据维度", requiredMode = Schema.RequiredMode.REQUIRED, example = "['product', 'data1', 'data2']") + private List dimensions; + + @Schema(description = "数据明细列表", requiredMode = Schema.RequiredMode.REQUIRED) + private List> source; + +} diff --git a/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/controller/goview/vo/project/GoViewProjectCreateReqVO.java b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/controller/goview/vo/project/GoViewProjectCreateReqVO.java new file mode 100644 index 0000000..96427a1 --- /dev/null +++ b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/controller/goview/vo/project/GoViewProjectCreateReqVO.java @@ -0,0 +1,15 @@ +package com.win.module.report.controller.goview.vo.project; + +import lombok.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - GoView 项目创建 Request VO") +@Data +public class GoViewProjectCreateReqVO { + + @Schema(description = "项目名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五") + @NotEmpty(message = "项目名称不能为空") + private String name; + +} diff --git a/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/controller/goview/vo/project/GoViewProjectRespVO.java b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/controller/goview/vo/project/GoViewProjectRespVO.java new file mode 100644 index 0000000..8179811 --- /dev/null +++ b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/controller/goview/vo/project/GoViewProjectRespVO.java @@ -0,0 +1,36 @@ +package com.win.module.report.controller.goview.vo.project; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - GoView 项目 Response VO") +@Data +public class GoViewProjectRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "18993") + private Long id; + + @Schema(description = "项目名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五") + private String name; + + @Schema(description = "发布状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer status; + + @Schema(description = "报表内容") // JSON 格式 + private String content; + + @Schema(description = "预览图片 URL", example = "https://www.iocoder.cn") + private String picUrl; + + @Schema(description = "项目备注", example = "你猜") + private String remark; + + @Schema(description = "创建人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private String creator; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/controller/goview/vo/project/GoViewProjectUpdateReqVO.java b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/controller/goview/vo/project/GoViewProjectUpdateReqVO.java new file mode 100644 index 0000000..066f1da --- /dev/null +++ b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/controller/goview/vo/project/GoViewProjectUpdateReqVO.java @@ -0,0 +1,34 @@ +package com.win.module.report.controller.goview.vo.project; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.validation.InEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - GoView 项目更新 Request VO") +@Data +public class GoViewProjectUpdateReqVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "18993") + @NotNull(message = "编号不能为空") + private Long id; + + @Schema(description = "项目名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五") + private String name; + + @Schema(description = "发布状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @InEnum(value = CommonStatusEnum.class, message = "发布状态必须是 {value}") + private Integer status; + + @Schema(description = "报表内容") // JSON 格式 + private String content; + + @Schema(description = "预览图片 URL", example = "https://www.iocoder.cn") + private String picUrl; + + @Schema(description = "项目备注", example = "你猜") + private String remark; + +} diff --git a/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/convert/ajreport/package-info.java b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/convert/ajreport/package-info.java new file mode 100644 index 0000000..3f73468 --- /dev/null +++ b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/convert/ajreport/package-info.java @@ -0,0 +1,4 @@ +/** + * TODO 占位,后续删除 + */ +package com.win.module.report.convert.ajreport; diff --git a/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/convert/goview/GoViewProjectConvert.java b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/convert/goview/GoViewProjectConvert.java new file mode 100644 index 0000000..9c902d6 --- /dev/null +++ b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/convert/goview/GoViewProjectConvert.java @@ -0,0 +1,24 @@ +package com.win.module.report.convert.goview; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.report.controller.goview.vo.project.GoViewProjectCreateReqVO; +import com.win.module.report.controller.goview.vo.project.GoViewProjectRespVO; +import com.win.module.report.controller.goview.vo.project.GoViewProjectUpdateReqVO; +import com.win.module.report.dal.dataobject.goview.GoViewProjectDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +@Mapper +public interface GoViewProjectConvert { + + GoViewProjectConvert INSTANCE = Mappers.getMapper(GoViewProjectConvert.class); + + GoViewProjectDO convert(GoViewProjectCreateReqVO bean); + + GoViewProjectDO convert(GoViewProjectUpdateReqVO bean); + + GoViewProjectRespVO convert(GoViewProjectDO bean); + + PageResult convertPage(PageResult page); + +} diff --git a/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/dal/dataobject/ajreport/package-info.java b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/dal/dataobject/ajreport/package-info.java new file mode 100644 index 0000000..b807c4d --- /dev/null +++ b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/dal/dataobject/ajreport/package-info.java @@ -0,0 +1,4 @@ +/** + * TODO 芋艿:占位,待删除 + */ +package com.win.module.report.dal.dataobject.ajreport; diff --git a/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/dal/dataobject/goview/GoViewProjectDO.java b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/dal/dataobject/goview/GoViewProjectDO.java new file mode 100644 index 0000000..a040016 --- /dev/null +++ b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/dal/dataobject/goview/GoViewProjectDO.java @@ -0,0 +1,57 @@ +package com.win.module.report.dal.dataobject.goview; + +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +/** + * GoView 项目表 + * + * 每个大屏图标,对应一个项目 + * + * @author 闻荫源码 + */ +@TableName(value = "report_go_view_project", autoResultMap = true) // 由于 SQL Server 的 system_user 是关键字,所以使用 system_users +@KeySequence("report_go_view_project_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class GoViewProjectDO extends BaseDO { + + /** + * 编号,数据库自增 + */ + @TableId + private Long id; + /** + * 项目名称 + */ + private String name; + /** + * 预览图片 URL + */ + private String picUrl; + /** + * 报表内容 + * + * JSON 配置,使用字符串存储 + */ + private String content; + /** + * 发布状态 + * + * 0 - 已发布 + * 1 - 未发布 + * + * 枚举 {@link com.win.framework.common.enums.CommonStatusEnum} + */ + private Integer status; + /** + * 项目备注 + */ + private String remark; +} diff --git a/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/dal/mysql/ajreport/package-info.java b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/dal/mysql/ajreport/package-info.java new file mode 100644 index 0000000..be8b06c --- /dev/null +++ b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/dal/mysql/ajreport/package-info.java @@ -0,0 +1,4 @@ +/** + * TODO 芋艿:占位,待删除 + */ +package com.win.module.report.dal.mysql.ajreport; diff --git a/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/dal/mysql/goview/GoViewProjectMapper.java b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/dal/mysql/goview/GoViewProjectMapper.java new file mode 100644 index 0000000..bebfa58 --- /dev/null +++ b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/dal/mysql/goview/GoViewProjectMapper.java @@ -0,0 +1,19 @@ +package com.win.module.report.dal.mysql.goview; + +import com.win.framework.common.pojo.PageParam; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.report.dal.dataobject.goview.GoViewProjectDO; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface GoViewProjectMapper extends BaseMapperX { + + default PageResult selectPage(PageParam reqVO, Long userId) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eq(GoViewProjectDO::getCreator, userId) + .orderByDesc(GoViewProjectDO::getId)); + } + +} diff --git a/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/framework/jmreport/config/JmReportConfiguration.java b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/framework/jmreport/config/JmReportConfiguration.java new file mode 100644 index 0000000..96ea58c --- /dev/null +++ b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/framework/jmreport/config/JmReportConfiguration.java @@ -0,0 +1,26 @@ +package com.win.module.report.framework.jmreport.config; + +import com.win.framework.security.config.SecurityProperties; +import com.win.module.system.api.oauth2.OAuth2TokenApi; +import com.win.module.report.framework.jmreport.core.service.JmReportTokenServiceImpl; +import org.jeecg.modules.jmreport.api.JmReportTokenServiceI; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +/** + * 积木报表的配置类 + * + * @author 闻荫源码 + */ +@Configuration(proxyBeanMethods = false) +@ComponentScan(basePackages = "org.jeecg.modules.jmreport") // 扫描积木报表的包 +public class JmReportConfiguration { + + @Bean + @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection") + public JmReportTokenServiceI jmReportTokenService(OAuth2TokenApi oAuth2TokenApi, SecurityProperties securityProperties) { + return new JmReportTokenServiceImpl(oAuth2TokenApi, securityProperties); + } + +} diff --git a/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/framework/jmreport/core/service/JmReportTokenServiceImpl.java b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/framework/jmreport/core/service/JmReportTokenServiceImpl.java new file mode 100644 index 0000000..13bf563 --- /dev/null +++ b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/framework/jmreport/core/service/JmReportTokenServiceImpl.java @@ -0,0 +1,130 @@ +package com.win.module.report.framework.jmreport.core.service; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.exception.ServiceException; +import com.win.framework.common.util.servlet.ServletUtils; +import com.win.framework.security.config.SecurityProperties; +import com.win.framework.security.core.LoginUser; +import com.win.framework.security.core.util.SecurityFrameworkUtils; +import com.win.framework.tenant.core.context.TenantContextHolder; +import com.win.framework.web.core.util.WebFrameworkUtils; +import com.win.module.system.api.oauth2.OAuth2TokenApi; +import com.win.module.system.api.oauth2.dto.OAuth2AccessTokenCheckRespDTO; +import lombok.RequiredArgsConstructor; +import org.jeecg.modules.jmreport.api.JmReportTokenServiceI; +import org.springframework.http.HttpHeaders; + +import javax.servlet.http.HttpServletRequest; +import java.util.Objects; + +/** + * {@link JmReportTokenServiceI} 实现类,提供积木报表的 Token 校验、用户信息的查询等功能 + * + * @author 随心 + */ +@RequiredArgsConstructor +public class JmReportTokenServiceImpl implements JmReportTokenServiceI { + + /** + * 积木 token head 头 + */ + private static final String JM_TOKEN_HEADER = "X-Access-Token"; + /** + * auth 相关格式 + */ + private static final String AUTHORIZATION_FORMAT = SecurityFrameworkUtils.AUTHORIZATION_BEARER + " %s"; + + private final OAuth2TokenApi oauth2TokenApi; + + private final SecurityProperties securityProperties; + + /** + * 自定义 API 数据集appian自定义 Header,解决 Token 传递。 + * 参考 api数据集token机制详解 文档 + * + * @return 新 head + */ + @Override + public HttpHeaders customApiHeader() { + // 读取积木标标系统的 token + HttpServletRequest request = ServletUtils.getRequest(); + String token = request.getHeader(JM_TOKEN_HEADER); + + // 设置到 win 系统的 token + HttpHeaders headers = new HttpHeaders(); + headers.add(securityProperties.getTokenHeader(), String.format(AUTHORIZATION_FORMAT, token)); + return headers; + } + + /** + * 校验 Token 是否有效,即验证通过 + * + * @param token JmReport 前端传递的 token + * @return 是否认证通过 + */ + @Override + public Boolean verifyToken(String token) { + Long userId = SecurityFrameworkUtils.getLoginUserId(); + if (!Objects.isNull(userId)) { + return true; + } + return buildLoginUserByToken(token) != null; + } + + /** + * 获得用户编号 + *

+ * 虽然方法名获得的是 username,实际对应到项目中是用户编号 + * + * @param token JmReport 前端传递的 token + * @return 用户编号 + */ + @Override + public String getUsername(String token) { + Long userId = SecurityFrameworkUtils.getLoginUserId(); + if (ObjectUtil.isNotNull(userId)) { + return String.valueOf(userId); + } + LoginUser user = buildLoginUserByToken(token); + return user == null ? null : String.valueOf(user.getId()); + } + + /** + * 基于 token 构建登录用户 + * + * @param token token + * @return 返回 token 对应的用户信息 + */ + private LoginUser buildLoginUserByToken(String token) { + if (StrUtil.isEmpty(token)) { + return null; + } + // TODO 如下的实现不算特别优雅,主要咱是不想搞的太复杂,所以参考对应的 Filter 先实现了 + + // ① 参考 TokenAuthenticationFilter 的认证逻辑(Security 的上下文清理,交给 Spring Security 完成) + // 目的:实现基于 JmReport 前端传递的 token,实现认证 + TenantContextHolder.setIgnore(true); // 忽略租户,保证可查询到 token 信息 + LoginUser user = null; + try { + OAuth2AccessTokenCheckRespDTO accessToken = oauth2TokenApi.checkAccessToken(token); + if (accessToken == null) { + return null; + } + user = new LoginUser().setId(accessToken.getUserId()).setTenantId(accessToken.getTenantId()).setScopes(accessToken.getScopes()); + } catch (ServiceException ignored) { + // do nothing:如果报错,说明认证失败,则返回 false 即可 + } + if (user == null) { + return null; + } + SecurityFrameworkUtils.setLoginUser(user, WebFrameworkUtils.getRequest()); + + // ② 参考 TenantContextWebFilter 实现(Tenant 的上下文清理,交给 TenantContextWebFilter 完成) + // 目的:基于 LoginUser 获得到的租户编号,设置到 Tenant 上下文,避免查询数据库时的报错 + TenantContextHolder.setIgnore(false); + TenantContextHolder.setTenantId(user.getTenantId()); + return user; + } + +} diff --git a/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/framework/jmreport/core/web/package-info.java b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/framework/jmreport/core/web/package-info.java new file mode 100644 index 0000000..d062126 --- /dev/null +++ b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/framework/jmreport/core/web/package-info.java @@ -0,0 +1,4 @@ +/** + * 占位,后续会基于 Filter 实现积木报表的认证等功能,替代 {@link com.win.module.report.framework.jmreport.core.service.JmReportTokenServiceImpl} + */ +package com.win.module.report.framework.jmreport.core.web; diff --git a/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/framework/package-info.java b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/framework/package-info.java new file mode 100644 index 0000000..80d976c --- /dev/null +++ b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/framework/package-info.java @@ -0,0 +1,6 @@ +/** + * 属于 report 模块的 framework 封装 + * + * @author 闻荫源码 + */ +package com.win.module.report.framework; diff --git a/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/framework/security/config/SecurityConfiguration.java b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/framework/security/config/SecurityConfiguration.java new file mode 100644 index 0000000..40ca090 --- /dev/null +++ b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/framework/security/config/SecurityConfiguration.java @@ -0,0 +1,28 @@ +package com.win.module.report.framework.security.config; + +import com.win.framework.security.config.AuthorizeRequestsCustomizer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer; + +/** + * Report 模块的 Security 配置 + */ +@Configuration("reportSecurityConfiguration") +public class SecurityConfiguration { + + @Bean("reportAuthorizeRequestsCustomizer") + public AuthorizeRequestsCustomizer authorizeRequestsCustomizer() { + return new AuthorizeRequestsCustomizer() { + + @Override + public void customize(ExpressionUrlAuthorizationConfigurer.ExpressionInterceptUrlRegistry registry) { + //积木报表 + registry.antMatchers("/jmreport/**").permitAll(); + } + + }; + } + +} diff --git a/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/framework/security/core/package-info.java b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/framework/security/core/package-info.java new file mode 100644 index 0000000..32d8202 --- /dev/null +++ b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/framework/security/core/package-info.java @@ -0,0 +1,4 @@ +/** + * 占位 + */ +package com.win.module.report.framework.security.core; diff --git a/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/framework/ureport/package-info.java b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/framework/ureport/package-info.java new file mode 100644 index 0000000..514b518 --- /dev/null +++ b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/framework/ureport/package-info.java @@ -0,0 +1,7 @@ +/** + * ureport2:https://github.com/youseries/ureport + * + * ureport2 和 jimurepot 是相同类型的产品,不过停更了,最好发布时间是 2018 年。 + * 它们之间的功能对比,可见 https://juejin.cn/post/6939836480269320200 地址 + */ +package com.win.module.report.framework.ureport; diff --git a/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/package-info.java b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/package-info.java new file mode 100644 index 0000000..3eb95eb --- /dev/null +++ b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/package-info.java @@ -0,0 +1,9 @@ +/** + * report 模块,主要实现数据可视化报表等功能: + * 1. 基于「积木报表」实现,打印设计、报表设计、图形设计、大屏设计等。URL 前缀是 /jmreport,表名前缀是 jimu_ + * + * 由于「积木报表」的大屏设计器需要收费,后续会自研,对应的是: + * 1. Controller URL:以 /report/ 开头,避免和其它 Module 冲突 + * 2. DataObject 表名:以 report_ 开头,方便在数据库中区分 + */ +package com.win.module.report; diff --git a/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/service/ajreport/package-info.java b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/service/ajreport/package-info.java new file mode 100644 index 0000000..450b595 --- /dev/null +++ b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/service/ajreport/package-info.java @@ -0,0 +1,4 @@ +/** + * TODO 芋艿:占位,待删除 + */ +package com.win.module.report.service.ajreport; diff --git a/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/service/goview/GoViewDataService.java b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/service/goview/GoViewDataService.java new file mode 100644 index 0000000..f6e17e9 --- /dev/null +++ b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/service/goview/GoViewDataService.java @@ -0,0 +1,20 @@ +package com.win.module.report.service.goview; + +import com.win.module.report.controller.goview.vo.data.GoViewDataRespVO; + +/** + * GoView 数据 Service 接口 + * + * @author 闻荫源码 + */ +public interface GoViewDataService { + + /** + * 使用 SQL 查询数据 + * + * @param sql SQL 语句 + * @return 数据 + */ + GoViewDataRespVO getDataBySQL(String sql); + +} diff --git a/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/service/goview/GoViewDataServiceImpl.java b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/service/goview/GoViewDataServiceImpl.java new file mode 100644 index 0000000..7fbb489 --- /dev/null +++ b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/service/goview/GoViewDataServiceImpl.java @@ -0,0 +1,55 @@ +package com.win.module.report.service.goview; + +import com.win.module.report.controller.goview.vo.data.GoViewDataRespVO; +import com.google.common.collect.Maps; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.support.rowset.SqlRowSet; +import org.springframework.jdbc.support.rowset.SqlRowSetMetaData; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.Arrays; +import java.util.LinkedList; +import java.util.Map; + +/** + * GoView 数据 Service 实现类 + * + * 补充说明: + * 1. 目前默认使用 jdbcTemplate 查询项目配置的数据源。如果你想查询其它数据源,可以新建对应数据源的 jdbcTemplate 来实现。 + * 2. 默认数据源是 MySQL 关系数据源,可能数据量比较大的情况下,会比较慢,可以考虑后续使用 Click House 等等。 + * + * @author 闻荫源码 + */ +@Service +@Validated +public class GoViewDataServiceImpl implements GoViewDataService { + + @Resource + private JdbcTemplate jdbcTemplate; + + @Override + public GoViewDataRespVO getDataBySQL(String sql) { + // 1. 执行查询 + SqlRowSet sqlRowSet = jdbcTemplate.queryForRowSet(sql); + + // 2. 构建返回结果 + GoViewDataRespVO respVO = new GoViewDataRespVO(); + // 2.1 解析元数据 + SqlRowSetMetaData metaData = sqlRowSet.getMetaData(); + String[] columnNames = metaData.getColumnNames(); + respVO.setDimensions(Arrays.asList(columnNames)); + // 2.2 解析数据明细 + respVO.setSource(new LinkedList<>()); // 由于数据量不确认,使用 LinkedList 虽然内存占用大一点,但是不存在扩容复制的问题 + while (sqlRowSet.next()) { + Map data = Maps.newHashMapWithExpectedSize(columnNames.length); + for (String columnName : columnNames) { + data.put(columnName, sqlRowSet.getObject(columnName)); + } + respVO.getSource().add(data); + } + return respVO; + } + +} diff --git a/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/service/goview/GoViewProjectService.java b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/service/goview/GoViewProjectService.java new file mode 100644 index 0000000..0684d34 --- /dev/null +++ b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/service/goview/GoViewProjectService.java @@ -0,0 +1,57 @@ +package com.win.module.report.service.goview; + +import com.win.framework.common.pojo.PageParam; +import com.win.framework.common.pojo.PageResult; +import com.win.module.report.controller.goview.vo.project.GoViewProjectCreateReqVO; +import com.win.module.report.controller.goview.vo.project.GoViewProjectUpdateReqVO; +import com.win.module.report.dal.dataobject.goview.GoViewProjectDO; + +import javax.validation.Valid; + +/** + * GoView 项目 Service 接口 + * + * @author 闻荫源码 + */ +public interface GoViewProjectService { + + /** + * 创建项目 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createProject(@Valid GoViewProjectCreateReqVO createReqVO); + + /** + * 更新项目 + * + * @param updateReqVO 更新信息 + */ + void updateProject(@Valid GoViewProjectUpdateReqVO updateReqVO); + + /** + * 删除项目 + * + * @param id 编号 + */ + void deleteProject(Long id); + + /** + * 获得项目 + * + * @param id 编号 + * @return 项目 + */ + GoViewProjectDO getProject(Long id); + + /** + * 获得我的项目分页 + * + * @param pageReqVO 分页查询 + * @param userId 用户编号 + * @return GoView 项目分页 + */ + PageResult getMyProjectPage(PageParam pageReqVO, Long userId); + +} diff --git a/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/service/goview/GoViewProjectServiceImpl.java b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/service/goview/GoViewProjectServiceImpl.java new file mode 100644 index 0000000..07449ee --- /dev/null +++ b/win-module-report/win-module-report-biz/src/main/java/com/win/module/report/service/goview/GoViewProjectServiceImpl.java @@ -0,0 +1,74 @@ +package com.win.module.report.service.goview; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.pojo.PageParam; +import com.win.framework.common.pojo.PageResult; +import com.win.module.report.controller.goview.vo.project.GoViewProjectCreateReqVO; +import com.win.module.report.controller.goview.vo.project.GoViewProjectUpdateReqVO; +import com.win.module.report.convert.goview.GoViewProjectConvert; +import com.win.module.report.dal.dataobject.goview.GoViewProjectDO; +import com.win.module.report.dal.mysql.goview.GoViewProjectMapper; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.report.enums.ErrorCodeConstants.GO_VIEW_PROJECT_NOT_EXISTS; + +/** + * GoView 项目 Service 实现类 + * + * @author 闻荫源码 + */ +@Service +@Validated +public class GoViewProjectServiceImpl implements GoViewProjectService { + + @Resource + private GoViewProjectMapper goViewProjectMapper; + + @Override + public Long createProject(GoViewProjectCreateReqVO createReqVO) { + // 插入 + GoViewProjectDO goViewProject = GoViewProjectConvert.INSTANCE.convert(createReqVO) + .setStatus(CommonStatusEnum.DISABLE.getStatus()); + goViewProjectMapper.insert(goViewProject); + // 返回 + return goViewProject.getId(); + } + + @Override + public void updateProject(GoViewProjectUpdateReqVO updateReqVO) { + // 校验存在 + validateProjectExists(updateReqVO.getId()); + // 更新 + GoViewProjectDO updateObj = GoViewProjectConvert.INSTANCE.convert(updateReqVO); + goViewProjectMapper.updateById(updateObj); + } + + @Override + public void deleteProject(Long id) { + // 校验存在 + validateProjectExists(id); + // 删除 + goViewProjectMapper.deleteById(id); + } + + private void validateProjectExists(Long id) { + if (goViewProjectMapper.selectById(id) == null) { + throw exception(GO_VIEW_PROJECT_NOT_EXISTS); + } + } + + @Override + public GoViewProjectDO getProject(Long id) { + return goViewProjectMapper.selectById(id); + } + + @Override + public PageResult getMyProjectPage(PageParam pageReqVO, Long userId) { + return goViewProjectMapper.selectPage(pageReqVO, userId); + } + +} diff --git a/win-module-report/win-module-report-biz/src/main/resources/i18n/report.properties b/win-module-report/win-module-report-biz/src/main/resources/i18n/report.properties new file mode 100644 index 0000000..6882c29 --- /dev/null +++ b/win-module-report/win-module-report-biz/src/main/resources/i18n/report.properties @@ -0,0 +1 @@ +#\u6B64\u6587\u4EF6\u4E0D\u9700\u8981\u586B\u5199 \ No newline at end of file diff --git a/win-module-report/win-module-report-biz/src/main/resources/i18n/report_en_US.properties b/win-module-report/win-module-report-biz/src/main/resources/i18n/report_en_US.properties new file mode 100644 index 0000000..e69de29 diff --git a/win-module-report/win-module-report-biz/src/main/resources/i18n/report_zh_CN.properties b/win-module-report/win-module-report-biz/src/main/resources/i18n/report_zh_CN.properties new file mode 100644 index 0000000..e69de29 diff --git a/win-module-report/win-module-report-biz/src/test/resources/application-unit-test.yaml b/win-module-report/win-module-report-biz/src/test/resources/application-unit-test.yaml new file mode 100644 index 0000000..f61ada0 --- /dev/null +++ b/win-module-report/win-module-report-biz/src/test/resources/application-unit-test.yaml @@ -0,0 +1,55 @@ +spring: + main: + lazy-initialization: true # 开启懒加载,加快速度 + banner-mode: off # 单元测试,禁用 Banner + +--- #################### 数据库相关配置 #################### + +spring: + # 数据源配置项 + datasource: + name: ruoyi-vue-pro + url: jdbc:h2:mem:testdb;MODE=MYSQL;DATABASE_TO_UPPER=false;NON_KEYWORDS=value; # MODE 使用 MySQL 模式;DATABASE_TO_UPPER 配置表和字段使用小写 + driver-class-name: org.h2.Driver + username: sa + password: + druid: + async-init: true # 单元测试,异步初始化 Druid 连接池,提升启动速度 + initial-size: 1 # 单元测试,配置为 1,提升启动速度 + sql: + init: + schema-locations: classpath:/sql/create_tables.sql + + # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 + redis: + host: 127.0.0.1 # 地址 + port: 16379 # 端口(单元测试,使用 16379 端口) + database: 0 # 数据库索引 + + +mybatis: + lazy-initialization: true # 单元测试,设置 MyBatis Mapper 延迟加载,加速每个单元测试 + +--- #################### 定时任务相关配置 #################### + +--- #################### 配置中心相关配置 #################### + +--- #################### 服务保障相关配置 #################### + +# Lock4j 配置项(单元测试,禁用 Lock4j) + +# Resilience4j 配置项 + +--- #################### 监控相关配置 #################### + +--- #################### 闻荫相关配置 #################### + +# 闻荫配置项,设置当前项目所有自定义的配置 +win: + info: + base-package: com.win.module + captcha: + timeout: 5m + width: 160 + height: 60 + enable: true diff --git a/win-module-report/win-module-report-biz/src/test/resources/logback.xml b/win-module-report/win-module-report-biz/src/test/resources/logback.xml new file mode 100644 index 0000000..daf756b --- /dev/null +++ b/win-module-report/win-module-report-biz/src/test/resources/logback.xml @@ -0,0 +1,4 @@ + + + + diff --git a/win-module-report/win-module-report-biz/src/test/resources/sql/clean.sql b/win-module-report/win-module-report-biz/src/test/resources/sql/clean.sql new file mode 100644 index 0000000..4a0268a --- /dev/null +++ b/win-module-report/win-module-report-biz/src/test/resources/sql/clean.sql @@ -0,0 +1 @@ +DELETE FROM "report_go_view_project"; diff --git a/win-module-report/win-module-report-biz/src/test/resources/sql/create_tables.sql b/win-module-report/win-module-report-biz/src/test/resources/sql/create_tables.sql new file mode 100644 index 0000000..a77397f --- /dev/null +++ b/win-module-report/win-module-report-biz/src/test/resources/sql/create_tables.sql @@ -0,0 +1,14 @@ +CREATE TABLE IF NOT EXISTS "report_go_view_project" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar NOT NULL, + "pic_url" varchar, + "content" varchar, + "status" varchar NOT NULL, + "remark" varchar, + "creator" varchar DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT 'GoView 项目表'; diff --git a/win-module-system/pom.xml b/win-module-system/pom.xml new file mode 100644 index 0000000..99ca127 --- /dev/null +++ b/win-module-system/pom.xml @@ -0,0 +1,24 @@ + + + + com.win + win + ${revision} + + 4.0.0 + + win-module-system-api + win-module-system-biz + + win-module-system + pom + + ${project.artifactId} + + system 模块下,我们放通用业务,支撑上层的核心业务。 + 例如说:用户、部门、权限、数据字典等等 + + + diff --git a/win-module-system/win-module-system-api/pom.xml b/win-module-system/win-module-system-api/pom.xml new file mode 100644 index 0000000..e824ac5 --- /dev/null +++ b/win-module-system/win-module-system-api/pom.xml @@ -0,0 +1,34 @@ + + + + com.win + win-module-system + ${revision} + + 4.0.0 + win-module-system-api + jar + + ${project.artifactId} + + system 模块 API,暴露给其它模块调用 + + + + + com.win + win-common + + + + + org.springframework.boot + spring-boot-starter-validation + true + + + + + diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/dept/DeptApi.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/dept/DeptApi.java new file mode 100644 index 0000000..25bf235 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/dept/DeptApi.java @@ -0,0 +1,54 @@ +package com.win.module.system.api.dept; + +import com.win.framework.common.util.collection.CollectionUtils; +import com.win.module.system.api.dept.dto.DeptRespDTO; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * 部门 API 接口 + * + * @author 闻荫源码 + */ +public interface DeptApi { + + /** + * 获得部门信息 + * + * @param id 部门编号 + * @return 部门信息 + */ + DeptRespDTO getDept(Long id); + + /** + * 获得部门信息数组 + * + * @param ids 部门编号数组 + * @return 部门信息数组 + */ + List getDeptList(Collection ids); + + /** + * 校验部门们是否有效。如下情况,视为无效: + * 1. 部门编号不存在 + * 2. 部门被禁用 + * + * @param ids 角色编号数组 + */ + void validateDeptList(Collection ids); + + /** + * 获得指定编号的部门 Map + * + * @param ids 部门编号数组 + * @return 部门 Map + */ + default Map getDeptMap(Set ids) { + List list = getDeptList(ids); + return CollectionUtils.convertMap(list, DeptRespDTO::getId); + } + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/dept/PostApi.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/dept/PostApi.java new file mode 100644 index 0000000..f7ce156 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/dept/PostApi.java @@ -0,0 +1,21 @@ +package com.win.module.system.api.dept; + +import java.util.Collection; + +/** + * 岗位 API 接口 + * + * @author 闻荫源码 + */ +public interface PostApi { + + /** + * 校验岗位们是否有效。如下情况,视为无效: + * 1. 岗位编号不存在 + * 2. 岗位被禁用 + * + * @param ids 岗位编号数组 + */ + void validPostList(Collection ids); + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/dept/dto/DeptRespDTO.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/dept/dto/DeptRespDTO.java new file mode 100644 index 0000000..f092ac0 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/dept/dto/DeptRespDTO.java @@ -0,0 +1,37 @@ +package com.win.module.system.api.dept.dto; + +import com.win.framework.common.enums.CommonStatusEnum; +import lombok.Data; + +/** + * 部门 Response DTO + * + * @author 闻荫源码 + */ +@Data +public class DeptRespDTO { + + /** + * 部门编号 + */ + private Long id; + /** + * 部门名称 + */ + private String name; + /** + * 父部门编号 + */ + private Long parentId; + /** + * 负责人的用户编号 + */ + private Long leaderUserId; + /** + * 部门状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/dict/DictDataApi.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/dict/DictDataApi.java new file mode 100644 index 0000000..2ac2801 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/dict/DictDataApi.java @@ -0,0 +1,59 @@ +package com.win.module.system.api.dict; + +import com.win.module.system.api.dict.dto.DictDataRespDTO; + +import java.util.Collection; + +/** + * 字典数据 API 接口 + * + * @author 闻荫源码 + */ +public interface DictDataApi { + + /** + * 校验字典数据们是否有效。如下情况,视为无效: + * 1. 字典数据不存在 + * 2. 字典数据被禁用 + * + * @param dictType 字典类型 + * @param values 字典数据值的数组 + */ + void validateDictDataList(String dictType, Collection values); + + /** + * 获得指定的字典数据,从缓存中 + * + * @param type 字典类型 + * @param value 字典数据值 + * @return 字典数据 + */ + DictDataRespDTO getDictData(String type, String value); + + /** + * 解析获得指定的字典数据,从缓存中 + * + * @param type 字典类型 + * @param label 字典数据标签 + * @return 字典数据 + */ + DictDataRespDTO parseDictData(String type, String label); + + /** + * 解析获得指定的字典数据,从缓存中 + * + * @param type 字典类型 + * @return 字典数据 + */ + String[] getDictDataByType(String type); + + /** + * BQ---QD + * 查询字典项 + * @author chenfang + * @param ptype 字典类型 + * @param plabel 字典标签 + * @return + */ + DictDataRespDTO selectDictTypeAndLabel(String ptype, String plabel); +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/dict/dto/DictDataRespDTO.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/dict/dto/DictDataRespDTO.java new file mode 100644 index 0000000..cc8514b --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/dict/dto/DictDataRespDTO.java @@ -0,0 +1,33 @@ +package com.win.module.system.api.dict.dto; + +import com.win.framework.common.enums.CommonStatusEnum; +import lombok.Data; + +/** + * 字典数据 Response DTO + * + * @author 闻荫源码 + */ +@Data +public class DictDataRespDTO { + + /** + * 字典标签 + */ + private String label; + /** + * 字典值 + */ + private String value; + /** + * 字典类型 + */ + private String dictType; + /** + * 状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/errorcode/ErrorCodeApi.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/errorcode/ErrorCodeApi.java new file mode 100644 index 0000000..6c1a9d7 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/errorcode/ErrorCodeApi.java @@ -0,0 +1,35 @@ +package com.win.module.system.api.errorcode; + +import com.win.module.system.api.errorcode.dto.ErrorCodeAutoGenerateReqDTO; +import com.win.module.system.api.errorcode.dto.ErrorCodeRespDTO; + +import javax.validation.Valid; +import java.time.LocalDateTime; +import java.util.List; + +/** + * 错误码 Api 接口 + * + * @author 闻荫源码 + */ +public interface ErrorCodeApi { + + /** + * 自动创建错误码 + * + * @param autoGenerateDTOs 错误码信息 + */ + void autoGenerateErrorCodeList(@Valid List autoGenerateDTOs); + + /** + * 增量获得错误码数组 + * + * 如果 minUpdateTime 为空时,则获取所有错误码 + * + * @param applicationName 应用名 + * @param minUpdateTime 最小更新时间 + * @return 错误码数组 + */ + List getErrorCodeList(String applicationName, LocalDateTime minUpdateTime); + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/errorcode/dto/ErrorCodeAutoGenerateReqDTO.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/errorcode/dto/ErrorCodeAutoGenerateReqDTO.java new file mode 100644 index 0000000..2beb4ab --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/errorcode/dto/ErrorCodeAutoGenerateReqDTO.java @@ -0,0 +1,34 @@ +package com.win.module.system.api.errorcode.dto; + +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +/** + * 错误码自动生成 DTO + * + * @author dylan + */ +@Data +@Accessors(chain = true) +public class ErrorCodeAutoGenerateReqDTO { + + /** + * 应用名 + */ + @NotNull(message = "应用名不能为空") + private String applicationName; + /** + * 错误码编码 + */ + @NotNull(message = "错误码编码不能为空") + private Integer code; + /** + * 错误码错误提示 + */ + @NotEmpty(message = "错误码错误提示不能为空") + private String message; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/errorcode/dto/ErrorCodeRespDTO.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/errorcode/dto/ErrorCodeRespDTO.java new file mode 100644 index 0000000..afd2f4a --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/errorcode/dto/ErrorCodeRespDTO.java @@ -0,0 +1,28 @@ +package com.win.module.system.api.errorcode.dto; + +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 错误码的 Response DTO + * + * @author 闻荫源码 + */ +@Data +public class ErrorCodeRespDTO { + + /** + * 错误码编码 + */ + private Integer code; + /** + * 错误码错误提示 + */ + private String message; + /** + * 更新时间 + */ + private LocalDateTime updateTime; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/logger/LoginLogApi.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/logger/LoginLogApi.java new file mode 100644 index 0000000..2ee714b --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/logger/LoginLogApi.java @@ -0,0 +1,21 @@ +package com.win.module.system.api.logger; + +import com.win.module.system.api.logger.dto.LoginLogCreateReqDTO; + +import javax.validation.Valid; + +/** + * 登录日志的 API 接口 + * + * @author 闻荫源码 + */ +public interface LoginLogApi { + + /** + * 创建登录日志 + * + * @param reqDTO 日志信息 + */ + void createLoginLog(@Valid LoginLogCreateReqDTO reqDTO); + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/logger/OperateLogApi.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/logger/OperateLogApi.java new file mode 100644 index 0000000..20dacb0 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/logger/OperateLogApi.java @@ -0,0 +1,21 @@ +package com.win.module.system.api.logger; + +import com.win.module.system.api.logger.dto.OperateLogCreateReqDTO; + +import javax.validation.Valid; + +/** + * 操作日志 API 接口 + * + * @author 闻荫源码 + */ +public interface OperateLogApi { + + /** + * 创建操作日志 + * + * @param createReqDTO 请求 + */ + void createOperateLog(@Valid OperateLogCreateReqDTO createReqDTO); + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/logger/dto/LoginLogCreateReqDTO.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/logger/dto/LoginLogCreateReqDTO.java new file mode 100644 index 0000000..a5c3584 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/logger/dto/LoginLogCreateReqDTO.java @@ -0,0 +1,57 @@ +package com.win.module.system.api.logger.dto; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +/** + * 登录日志创建 Request DTO + * + * @author 闻荫源码 + */ +@Data +public class LoginLogCreateReqDTO { + + /** + * 日志类型 + */ + @NotNull(message = "日志类型不能为空") + private Integer logType; + /** + * 链路追踪编号 + */ + private String traceId; + + /** + * 用户编号 + */ + private Long userId; + /** + * 用户账号 + */ + @NotBlank(message = "用户账号不能为空") + @Size(max = 30, message = "用户账号长度不能超过30个字符") + private String username; + + /** + * 登录结果 + */ + @NotNull(message = "登录结果不能为空") + private Integer result; + + /** + * 用户 IP + */ + @NotEmpty(message = "用户 IP 不能为空") + private String userIp; + /** + * 浏览器 UserAgent + * + * 允许空,原因:Job 过期登出时,是无法传递 UserAgent 的 + */ + private String userAgent; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/logger/dto/OperateLogCreateReqDTO.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/logger/dto/OperateLogCreateReqDTO.java new file mode 100644 index 0000000..48aae24 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/logger/dto/OperateLogCreateReqDTO.java @@ -0,0 +1,117 @@ +package com.win.module.system.api.logger.dto; + +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; +import java.util.Map; + +/** + * 操作日志创建 Request DTO + */ +@Data +public class OperateLogCreateReqDTO { + + /** + * 链路追踪编号 + */ + private String traceId; + + /** + * 用户编号 + */ + @NotNull(message = "用户编号不能为空") + private Long userId; + /** + * 操作模块 + */ + @NotEmpty(message = "操作模块不能为空") + private String module; + + /** + * 操作名 + */ + @NotEmpty(message = "操作名") + private String name; + + /** + * 操作分类 + */ + @NotNull(message = "操作分类不能为空") + private Integer type; + + /** + * 操作明细 + */ + private String content; + + /** + * 拓展字段 + */ + private Map exts; + + /** + * 请求方法名 + */ + @NotEmpty(message = "请求方法名不能为空") + private String requestMethod; + + /** + * 请求地址 + */ + @NotEmpty(message = "请求地址不能为空") + private String requestUrl; + + /** + * 用户 IP + */ + @NotEmpty(message = "用户 IP 不能为空") + private String userIp; + + /** + * 浏览器 UserAgent + */ + @NotEmpty(message = "浏览器 UserAgent 不能为空") + private String userAgent; + + /** + * Java 方法名 + */ + @NotEmpty(message = "Java 方法名不能为空") + private String javaMethod; + + /** + * Java 方法的参数 + */ + private String javaMethodArgs; + + /** + * 开始时间 + */ + @NotNull(message = "开始时间不能为空") + private LocalDateTime startTime; + + /** + * 执行时长,单位:毫秒 + */ + @NotNull(message = "执行时长不能为空") + private Integer duration; + + /** + * 结果码 + */ + @NotNull(message = "结果码不能为空") + private Integer resultCode; + + /** + * 结果提示 + */ + private String resultMsg; + + /** + * 结果数据 + */ + private String resultData; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/mail/MailSendApi.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/mail/MailSendApi.java new file mode 100644 index 0000000..f64896c --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/mail/MailSendApi.java @@ -0,0 +1,24 @@ +package com.win.module.system.api.mail; + +import com.win.module.system.api.mail.dto.MailSendSingleToUserReqDTO; + +import javax.validation.Valid; + +/** + * 邮箱发送 API 接口 + * + * @author 闻荫源码 + */ +public interface MailSendApi { + + /** + * 发送单条邮箱给 Admin 用户 + * + * 在 mail 为空时,使用 userId 加载对应 Admin 的邮箱 + * + * @param reqDTO 发送请求 + * @return 发送日志编号 + */ + Long sendSingleMailToAdmin(@Valid MailSendSingleToUserReqDTO reqDTO); + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/mail/dto/MailSendSingleToUserReqDTO.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/mail/dto/MailSendSingleToUserReqDTO.java new file mode 100644 index 0000000..cfb0ae0 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/mail/dto/MailSendSingleToUserReqDTO.java @@ -0,0 +1,37 @@ +package com.win.module.system.api.mail.dto; + +import lombok.Data; + +import javax.validation.constraints.Email; +import javax.validation.constraints.NotNull; +import java.util.Map; + +/** + * 邮件发送 Request DTO + * + * @author wangjingqi + */ +@Data +public class MailSendSingleToUserReqDTO { + + /** + * 用户编号 + */ + private Long userId; + /** + * 邮箱 + */ + @Email + private String mail; + + /** + * 邮件模板编号 + */ + @NotNull(message = "邮件模板编号不能为空") + private String templateCode; + /** + * 邮件模板参数 + */ + private Map templateParams; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/notify/NotifyMessageSendApi.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/notify/NotifyMessageSendApi.java new file mode 100644 index 0000000..b721774 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/notify/NotifyMessageSendApi.java @@ -0,0 +1,30 @@ +package com.win.module.system.api.notify; + +import com.win.module.system.api.notify.dto.NotifySendSingleToUserReqDTO; + +import javax.validation.Valid; + +/** + * 站内信发送 API 接口 + * + * @author xrcoder + */ +public interface NotifyMessageSendApi { + + /** + * 发送单条站内信给 Admin 用户 + * + * @param reqDTO 发送请求 + * @return 发送消息 ID + */ + Long sendSingleMessageToAdmin(@Valid NotifySendSingleToUserReqDTO reqDTO); + + /** + * 发送单条站内信给 Member 用户 + * + * @param reqDTO 发送请求 + * @return 发送消息 ID + */ + Long sendSingleMessageToMember(@Valid NotifySendSingleToUserReqDTO reqDTO); + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/notify/dto/NotifySendSingleToUserReqDTO.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/notify/dto/NotifySendSingleToUserReqDTO.java new file mode 100644 index 0000000..93d8eb2 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/notify/dto/NotifySendSingleToUserReqDTO.java @@ -0,0 +1,33 @@ +package com.win.module.system.api.notify.dto; + +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.Map; + +/** + * 站内信发送给 Admin 或者 Member 用户 + * + * @author xrcoder + */ +@Data +public class NotifySendSingleToUserReqDTO { + + /** + * 用户编号 + */ + @NotNull(message = "用户编号不能为空") + private Long userId; + + /** + * 站内信模板编号 + */ + @NotEmpty(message = "站内信模板编号不能为空") + private String templateCode; + + /** + * 站内信模板参数 + */ + private Map templateParams; +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/notify/dto/NotifyTemplateReqDTO.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/notify/dto/NotifyTemplateReqDTO.java new file mode 100644 index 0000000..d7c59a7 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/notify/dto/NotifyTemplateReqDTO.java @@ -0,0 +1,34 @@ +package com.win.module.system.api.notify.dto; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.validation.InEnum; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +@Data +public class NotifyTemplateReqDTO { + + @NotEmpty(message = "模版名称不能为空") + private String name; + + @NotNull(message = "模版编码不能为空") + private String code; + + @NotNull(message = "模版类型不能为空") + private Integer type; + + @NotEmpty(message = "发送人名称不能为空") + private String nickname; + + @NotEmpty(message = "模版内容不能为空") + private String content; + + @NotNull(message = "状态不能为空") + @InEnum(value = CommonStatusEnum.class, message = "状态必须是 {value}") + private Integer status; + + private String remark; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/oauth2/OAuth2TokenApi.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/oauth2/OAuth2TokenApi.java new file mode 100644 index 0000000..0fd068a --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/oauth2/OAuth2TokenApi.java @@ -0,0 +1,49 @@ +package com.win.module.system.api.oauth2; + +import com.win.module.system.api.oauth2.dto.OAuth2AccessTokenCheckRespDTO; +import com.win.module.system.api.oauth2.dto.OAuth2AccessTokenCreateReqDTO; +import com.win.module.system.api.oauth2.dto.OAuth2AccessTokenRespDTO; + +import javax.validation.Valid; + +/** + * OAuth2.0 Token API 接口 + * + * @author 闻荫源码 + */ +public interface OAuth2TokenApi { + + /** + * 创建访问令牌 + * + * @param reqDTO 访问令牌的创建信息 + * @return 访问令牌的信息 + */ + OAuth2AccessTokenRespDTO createAccessToken(@Valid OAuth2AccessTokenCreateReqDTO reqDTO); + + /** + * 校验访问令牌 + * + * @param accessToken 访问令牌 + * @return 访问令牌的信息 + */ + OAuth2AccessTokenCheckRespDTO checkAccessToken(String accessToken); + + /** + * 移除访问令牌 + * + * @param accessToken 访问令牌 + * @return 访问令牌的信息 + */ + OAuth2AccessTokenRespDTO removeAccessToken(String accessToken); + + /** + * 刷新访问令牌 + * + * @param refreshToken 刷新令牌 + * @param clientId 客户端编号 + * @return 访问令牌的信息 + */ + OAuth2AccessTokenRespDTO refreshAccessToken(String refreshToken, String clientId); + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/oauth2/dto/OAuth2AccessTokenCheckRespDTO.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/oauth2/dto/OAuth2AccessTokenCheckRespDTO.java new file mode 100644 index 0000000..9a67c91 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/oauth2/dto/OAuth2AccessTokenCheckRespDTO.java @@ -0,0 +1,29 @@ +package com.win.module.system.api.oauth2.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * OAuth2.0 访问令牌的校验 Response DTO + * + * @author 闻荫源码 + */ +@Data +public class OAuth2AccessTokenCheckRespDTO implements Serializable { + + /** + * 用户编号 + */ + private Long userId; + /** + * 租户编号 + */ + private Long tenantId; + /** + * 授权范围的数组 + */ + private List scopes; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/oauth2/dto/OAuth2AccessTokenCreateReqDTO.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/oauth2/dto/OAuth2AccessTokenCreateReqDTO.java new file mode 100644 index 0000000..148c58b --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/oauth2/dto/OAuth2AccessTokenCreateReqDTO.java @@ -0,0 +1,32 @@ +package com.win.module.system.api.oauth2.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.List; + +/** + * OAuth2.0 访问令牌创建 Request DTO + * + * @author 闻荫源码 + */ +@Data +public class OAuth2AccessTokenCreateReqDTO implements Serializable { + + /** + * 用户编号 + */ + @NotNull(message = "用户编号不能为空") + private Long userId; + /** + * 客户端编号 + */ + @NotNull(message = "客户端编号不能为空") + private String clientId; + /** + * 授权范围 + */ + private List scopes; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/oauth2/dto/OAuth2AccessTokenRespDTO.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/oauth2/dto/OAuth2AccessTokenRespDTO.java new file mode 100644 index 0000000..2f07512 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/oauth2/dto/OAuth2AccessTokenRespDTO.java @@ -0,0 +1,35 @@ +package com.win.module.system.api.oauth2.dto; + +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * OAuth2.0 访问令牌的信息 Response DTO + * + * @author 闻荫源码 + */ +@Data +@Accessors(chain = true) +public class OAuth2AccessTokenRespDTO implements Serializable { + + /** + * 访问令牌 + */ + private String accessToken; + /** + * 刷新令牌 + */ + private String refreshToken; + /** + * 用户编号 + */ + private Long userId; + /** + * 过期时间 + */ + private LocalDateTime expiresTime; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/permission/PermissionApi.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/permission/PermissionApi.java new file mode 100644 index 0000000..39331dd --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/permission/PermissionApi.java @@ -0,0 +1,49 @@ +package com.win.module.system.api.permission; + +import com.win.module.system.api.permission.dto.DeptDataPermissionRespDTO; + +import java.util.Collection; +import java.util.Set; + +/** + * 权限 API 接口 + * + * @author 闻荫源码 + */ +public interface PermissionApi { + + /** + * 获得拥有多个角色的用户编号集合 + * + * @param roleIds 角色编号集合 + * @return 用户编号集合 + */ + Set getUserRoleIdListByRoleIds(Collection roleIds); + + /** + * 判断是否有权限,任一一个即可 + * + * @param userId 用户编号 + * @param permissions 权限 + * @return 是否 + */ + boolean hasAnyPermissions(Long userId, String... permissions); + + /** + * 判断是否有角色,任一一个即可 + * + * @param userId 用户编号 + * @param roles 角色数组 + * @return 是否 + */ + boolean hasAnyRoles(Long userId, String... roles); + + /** + * 获得登陆用户的部门数据权限 + * + * @param userId 用户编号 + * @return 部门数据权限 + */ + DeptDataPermissionRespDTO getDeptDataPermission(Long userId); + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/permission/RoleApi.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/permission/RoleApi.java new file mode 100644 index 0000000..17fb67f --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/permission/RoleApi.java @@ -0,0 +1,21 @@ +package com.win.module.system.api.permission; + +import java.util.Collection; + +/** + * 角色 API 接口 + * + * @author 闻荫源码 + */ +public interface RoleApi { + + /** + * 校验角色们是否有效。如下情况,视为无效: + * 1. 角色编号不存在 + * 2. 角色被禁用 + * + * @param ids 角色编号数组 + */ + void validRoleList(Collection ids); + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/permission/dto/DeptDataPermissionRespDTO.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/permission/dto/DeptDataPermissionRespDTO.java new file mode 100644 index 0000000..cc3fc9d --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/permission/dto/DeptDataPermissionRespDTO.java @@ -0,0 +1,35 @@ +package com.win.module.system.api.permission.dto; + +import lombok.Data; + +import java.util.HashSet; +import java.util.Set; + +/** + * 部门的数据权限 Response DTO + * + * @author 闻荫源码 + */ +@Data +public class DeptDataPermissionRespDTO { + + /** + * 是否可查看全部数据 + */ + private Boolean all; + /** + * 是否可查看自己的数据 + */ + private Boolean self; + /** + * 可查看的部门编号数组 + */ + private Set deptIds; + + public DeptDataPermissionRespDTO() { + this.all = false; + this.self = false; + this.deptIds = new HashSet<>(); + } + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sensitiveword/SensitiveWordApi.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sensitiveword/SensitiveWordApi.java new file mode 100644 index 0000000..df9a9cb --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sensitiveword/SensitiveWordApi.java @@ -0,0 +1,30 @@ +package com.win.module.system.api.sensitiveword; + +import java.util.List; + +/** + * 敏感词 API 接口 + * + * @author 永不言败 + */ +public interface SensitiveWordApi { + + /** + * 获得文本所包含的不合法的敏感词数组 + * + * @param text 文本 + * @param tags 标签数组 + * @return 不合法的敏感词数组 + */ + List validateText(String text, List tags); + + /** + * 判断文本是否包含敏感词 + * + * @param text 文本 + * @param tags 表述数组 + * @return 是否包含 + */ + boolean isTextValid(String text, List tags); + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/serialnumber/SerialNumberApi.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/serialnumber/SerialNumberApi.java new file mode 100644 index 0000000..202c093 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/serialnumber/SerialNumberApi.java @@ -0,0 +1,13 @@ +package com.win.module.system.api.serialnumber; + +public interface SerialNumberApi { + + /** + * 根据编码规则生成编码 + * + * @param ruleCode + * @return + */ + String generateCode(String ruleCode); + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sms/SmsCodeApi.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sms/SmsCodeApi.java new file mode 100644 index 0000000..bc1b9da --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sms/SmsCodeApi.java @@ -0,0 +1,40 @@ +package com.win.module.system.api.sms; + +import com.win.framework.common.exception.ServiceException; +import com.win.module.system.api.sms.dto.code.SmsCodeValidateReqDTO; +import com.win.module.system.api.sms.dto.code.SmsCodeSendReqDTO; +import com.win.module.system.api.sms.dto.code.SmsCodeUseReqDTO; + +import javax.validation.Valid; + +/** + * 短信验证码 API 接口 + * + * @author 闻荫源码 + */ +public interface SmsCodeApi { + + /** + * 创建短信验证码,并进行发送 + * + * @param reqDTO 发送请求 + */ + void sendSmsCode(@Valid SmsCodeSendReqDTO reqDTO); + + /** + * 验证短信验证码,并进行使用 + * 如果正确,则将验证码标记成已使用 + * 如果错误,则抛出 {@link ServiceException} 异常 + * + * @param reqDTO 使用请求 + */ + void useSmsCode(@Valid SmsCodeUseReqDTO reqDTO); + + /** + * 检查验证码是否有效 + * + * @param reqDTO 校验请求 + */ + void validateSmsCode(@Valid SmsCodeValidateReqDTO reqDTO); + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sms/SmsSendApi.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sms/SmsSendApi.java new file mode 100644 index 0000000..9d9b05b --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sms/SmsSendApi.java @@ -0,0 +1,24 @@ +package com.win.module.system.api.sms; + +import com.win.module.system.api.sms.dto.send.SmsSendSingleToUserReqDTO; + +import javax.validation.Valid; + +/** + * 短信发送 API 接口 + * + * @author 闻荫源码 + */ +public interface SmsSendApi { + + /** + * 发送单条短信给 Admin 用户 + * + * 在 mobile 为空时,使用 userId 加载对应 Admin 的手机号 + * + * @param reqDTO 发送请求 + * @return 发送日志编号 + */ + Long sendSingleSmsToAdmin(@Valid SmsSendSingleToUserReqDTO reqDTO); + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sms/dto/code/SmsCodeSendReqDTO.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sms/dto/code/SmsCodeSendReqDTO.java new file mode 100644 index 0000000..38d976b --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sms/dto/code/SmsCodeSendReqDTO.java @@ -0,0 +1,37 @@ +package com.win.module.system.api.sms.dto.code; + +import com.win.framework.common.validation.InEnum; +import com.win.framework.common.validation.Mobile; +import com.win.module.system.enums.sms.SmsSceneEnum; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +/** + * 短信验证码的发送 Request DTO + * + * @author 闻荫源码 + */ +@Data +public class SmsCodeSendReqDTO { + + /** + * 手机号 + */ + @Mobile + @NotEmpty(message = "手机号不能为空") + private String mobile; + /** + * 发送场景 + */ + @NotNull(message = "发送场景不能为空") + @InEnum(SmsSceneEnum.class) + private Integer scene; + /** + * 发送 IP + */ + @NotEmpty(message = "发送 IP 不能为空") + private String createIp; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sms/dto/code/SmsCodeUseReqDTO.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sms/dto/code/SmsCodeUseReqDTO.java new file mode 100644 index 0000000..b7ad661 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sms/dto/code/SmsCodeUseReqDTO.java @@ -0,0 +1,42 @@ +package com.win.module.system.api.sms.dto.code; + +import com.win.framework.common.validation.InEnum; +import com.win.framework.common.validation.Mobile; +import com.win.module.system.enums.sms.SmsSceneEnum; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +/** + * 短信验证码的使用 Request DTO + * + * @author 闻荫源码 + */ +@Data +public class SmsCodeUseReqDTO { + + /** + * 手机号 + */ + @Mobile + @NotEmpty(message = "手机号不能为空") + private String mobile; + /** + * 发送场景 + */ + @NotNull(message = "发送场景不能为空") + @InEnum(SmsSceneEnum.class) + private Integer scene; + /** + * 验证码 + */ + @NotEmpty(message = "验证码") + private String code; + /** + * 使用 IP + */ + @NotEmpty(message = "使用 IP 不能为空") + private String usedIp; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sms/dto/code/SmsCodeValidateReqDTO.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sms/dto/code/SmsCodeValidateReqDTO.java new file mode 100644 index 0000000..1e2665e --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sms/dto/code/SmsCodeValidateReqDTO.java @@ -0,0 +1,37 @@ +package com.win.module.system.api.sms.dto.code; + +import com.win.framework.common.validation.InEnum; +import com.win.framework.common.validation.Mobile; +import com.win.module.system.enums.sms.SmsSceneEnum; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +/** + * 短信验证码的校验 Request DTO + * + * @author 闻荫源码 + */ +@Data +public class SmsCodeValidateReqDTO { + + /** + * 手机号 + */ + @Mobile + @NotEmpty(message = "手机号不能为空") + private String mobile; + /** + * 发送场景 + */ + @NotNull(message = "发送场景不能为空") + @InEnum(SmsSceneEnum.class) + private Integer scene; + /** + * 验证码 + */ + @NotEmpty(message = "验证码") + private String code; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sms/dto/send/SmsSendSingleToUserReqDTO.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sms/dto/send/SmsSendSingleToUserReqDTO.java new file mode 100644 index 0000000..c4a08a4 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sms/dto/send/SmsSendSingleToUserReqDTO.java @@ -0,0 +1,36 @@ +package com.win.module.system.api.sms.dto.send; + +import com.win.framework.common.validation.Mobile; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import java.util.Map; + +/** + * 短信发送给 Admin 或者 Member 用户 + * + * @author 闻荫源码 + */ +@Data +public class SmsSendSingleToUserReqDTO { + + /** + * 用户编号 + */ + private Long userId; + /** + * 手机号 + */ + @Mobile + private String mobile; + /** + * 短信模板编号 + */ + @NotEmpty(message = "短信模板编号不能为空") + private String templateCode; + /** + * 短信模板参数 + */ + private Map templateParams; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/tenant/TenantApi.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/tenant/TenantApi.java new file mode 100644 index 0000000..4abb51b --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/tenant/TenantApi.java @@ -0,0 +1,26 @@ +package com.win.module.system.api.tenant; + +import java.util.List; + +/** + * 多租户的 API 接口 + * + * @author 闻荫源码 + */ +public interface TenantApi { + + /** + * 获得所有租户 + * + * @return 租户编号数组 + */ + List getTenantIdList(); + + /** + * 校验租户是否合法 + * + * @param id 租户编号 + */ + void validateTenant(Long id); + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/user/AdminUserApi.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/user/AdminUserApi.java new file mode 100644 index 0000000..8f1be9f --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/user/AdminUserApi.java @@ -0,0 +1,69 @@ +package com.win.module.system.api.user; + +import com.win.framework.common.util.collection.CollectionUtils; +import com.win.module.system.api.user.dto.AdminUserRespDTO; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * Admin 用户 API 接口 + * + * @author 闻荫源码 + */ +public interface AdminUserApi { + + /** + * 通过用户 ID 查询用户 + * + * @param id 用户ID + * @return 用户对象信息 + */ + AdminUserRespDTO getUser(Long id); + + /** + * 通过用户 ID 查询用户们 + * + * @param ids 用户 ID 们 + * @return 用户对象信息 + */ + List getUserList(Collection ids); + + /** + * 获得指定部门的用户数组 + * + * @param deptIds 部门数组 + * @return 用户数组 + */ + List getUserListByDeptIds(Collection deptIds); + + /** + * 获得指定岗位的用户数组 + * + * @param postIds 岗位数组 + * @return 用户数组 + */ + List getUserListByPostIds(Collection postIds); + + /** + * 获得用户 Map + * + * @param ids 用户编号数组 + * @return 用户 Map + */ + default Map getUserMap(Collection ids) { + List users = getUserList(ids); + return CollectionUtils.convertMap(users, AdminUserRespDTO::getId); + } + + /** + * 校验用户们是否有效。如下情况,视为无效: + * 1. 用户编号不存在 + * 2. 用户被禁用 + * + * @param ids 用户编号数组 + */ + void validateUserList(Collection ids); + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/user/dto/AdminUserRespDTO.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/user/dto/AdminUserRespDTO.java new file mode 100644 index 0000000..d0378f6 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/user/dto/AdminUserRespDTO.java @@ -0,0 +1,47 @@ +package com.win.module.system.api.user.dto; + +import com.win.framework.common.enums.CommonStatusEnum; +import lombok.Data; + +import java.util.Set; + +/** + * Admin 用户 Response DTO + * + * @author 闻荫源码 + */ +@Data +public class AdminUserRespDTO { + + /** + * 用户ID + */ + private Long id; + /** + * 用户昵称 + */ + private String nickname; + /** + * 帐号状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + + /** + * 部门ID + */ + private Long deptId; + /** + * 岗位编号数组 + */ + private Set postIds; + /** + * 手机号码 + */ + private String mobile; + /** + * 用户头像 + */ + private String avatar; +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/DictTypeConstants.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/DictTypeConstants.java new file mode 100644 index 0000000..59f71c0 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/DictTypeConstants.java @@ -0,0 +1,29 @@ +package com.win.module.system.enums; + +/** + * System 字典类型的枚举类 + * + * @author 闻荫源码 + */ +public interface DictTypeConstants { + + String USER_TYPE = "user_type"; // 用户类型 + String COMMON_STATUS = "common_status"; // 系统状态 + + // ========== SYSTEM 模块 ========== + + String USER_SEX = "system_user_sex"; // 用户性别 + + String OPERATE_TYPE = "system_operate_type"; // 操作类型 + + String LOGIN_TYPE = "system_login_type"; // 登录日志的类型 + String LOGIN_RESULT = "system_login_result"; // 登录结果 + + String ERROR_CODE_TYPE = "system_error_code_type"; // 错误码的类型枚举 + + String SMS_CHANNEL_CODE = "system_sms_channel_code"; // 短信渠道编码 + String SMS_TEMPLATE_TYPE = "system_sms_template_type"; // 短信模板类型 + String SMS_SEND_STATUS = "system_sms_send_status"; // 短信发送状态 + String SMS_RECEIVE_STATUS = "system_sms_receive_status"; // 短信接收状态 + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/ErrorCodeConstants.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/ErrorCodeConstants.java new file mode 100644 index 0000000..2d2218e --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/ErrorCodeConstants.java @@ -0,0 +1,168 @@ +package com.win.module.system.enums; + +import com.win.framework.common.exception.ErrorCode; + +/** + * System 错误码枚举类 + * + * system 系统,使用 1-002-000-000 段 + */ +public interface ErrorCodeConstants { + + // ========== AUTH 模块 1-002-000-000 ========== + ErrorCode AUTH_LOGIN_BAD_CREDENTIALS = new ErrorCode(1_002_000_000, "登录失败,账号密码不正确"); + ErrorCode AUTH_LOGIN_USER_DISABLED = new ErrorCode(1_002_000_001, "登录失败,账号被禁用"); + ErrorCode AUTH_LOGIN_CAPTCHA_CODE_ERROR = new ErrorCode(1_002_000_004, "验证码不正确,原因:{}"); + ErrorCode AUTH_THIRD_LOGIN_NOT_BIND = new ErrorCode(1_002_000_005, "未绑定账号,需要进行绑定"); + ErrorCode AUTH_TOKEN_EXPIRED = new ErrorCode(1_002_000_006, "Token 已经过期"); + ErrorCode AUTH_MOBILE_NOT_EXISTS = new ErrorCode(1_002_000_007, "手机号不存在"); + + // ========== 菜单模块 1-002-001-000 ========== + ErrorCode MENU_NAME_DUPLICATE = new ErrorCode(1_002_001_000, "已经存在该名字的菜单"); + ErrorCode MENU_PARENT_NOT_EXISTS = new ErrorCode(1_002_001_001, "父菜单不存在"); + ErrorCode MENU_PARENT_ERROR = new ErrorCode(1_002_001_002, "不能设置自己为父菜单"); + ErrorCode MENU_NOT_EXISTS = new ErrorCode(1_002_001_003, "菜单不存在"); + ErrorCode MENU_EXISTS_CHILDREN = new ErrorCode(1_002_001_004, "存在子菜单,无法删除"); + ErrorCode MENU_PARENT_NOT_DIR_OR_MENU = new ErrorCode(1_002_001_005, "父菜单的类型必须是目录或者菜单"); + + // ========== 角色模块 1-002-002-000 ========== + ErrorCode ROLE_NOT_EXISTS = new ErrorCode(1_002_002_000, "角色不存在"); + ErrorCode ROLE_NAME_DUPLICATE = new ErrorCode(1_002_002_001, "已经存在名为【{}】的角色"); + ErrorCode ROLE_CODE_DUPLICATE = new ErrorCode(1_002_002_002, "已经存在编码为【{}】的角色"); + ErrorCode ROLE_CAN_NOT_UPDATE_SYSTEM_TYPE_ROLE = new ErrorCode(1_002_002_003, "不能操作类型为系统内置的角色"); + ErrorCode ROLE_IS_DISABLE = new ErrorCode(1_002_002_004, "名字为【{}】的角色已被禁用"); + ErrorCode ROLE_ADMIN_CODE_ERROR = new ErrorCode(1_002_002_005, "编码【{}】不能使用"); + + // ========== 用户模块 1-002-003-000 ========== + ErrorCode USER_USERNAME_EXISTS = new ErrorCode(1_002_003_000, "用户账号已经存在"); + ErrorCode USER_MOBILE_EXISTS = new ErrorCode(1_002_003_001, "手机号已经存在"); + ErrorCode USER_EMAIL_EXISTS = new ErrorCode(1_002_003_002, "邮箱已经存在"); + ErrorCode USER_NOT_EXISTS = new ErrorCode(1_002_003_003, "用户不存在"); + ErrorCode USER_IMPORT_LIST_IS_EMPTY = new ErrorCode(1_002_003_004, "导入用户数据不能为空!"); + ErrorCode USER_PASSWORD_FAILED = new ErrorCode(1_002_003_005, "用户密码校验失败"); + ErrorCode USER_IS_DISABLE = new ErrorCode(1_002_003_006, "名字为【{}】的用户已被禁用"); + ErrorCode USER_COUNT_MAX = new ErrorCode(1_002_003_008, "创建用户失败,原因:超过租户最大租户配额({})!"); + + // ========== 部门模块 1-002-004-000 ========== + ErrorCode DEPT_NAME_DUPLICATE = new ErrorCode(1_002_004_000, "已经存在该名字的部门"); + ErrorCode DEPT_PARENT_NOT_EXITS = new ErrorCode(1_002_004_001,"父级部门不存在"); + ErrorCode DEPT_NOT_FOUND = new ErrorCode(1_002_004_002, "当前部门不存在"); + ErrorCode DEPT_EXITS_CHILDREN = new ErrorCode(1_002_004_003, "存在子部门,无法删除"); + ErrorCode DEPT_PARENT_ERROR = new ErrorCode(1_002_004_004, "不能设置自己为父部门"); + ErrorCode DEPT_EXISTS_USER = new ErrorCode(1_002_004_005, "部门中存在员工,无法删除"); + ErrorCode DEPT_NOT_ENABLE = new ErrorCode(1_002_004_006, "部门({})不处于开启状态,不允许选择"); + ErrorCode DEPT_PARENT_IS_CHILD = new ErrorCode(1_002_004_007, "不能设置自己的子部门为父部门"); + + // ========== 岗位模块 1-002-005-000 ========== + ErrorCode POST_NOT_FOUND = new ErrorCode(1_002_005_000, "当前岗位不存在"); + ErrorCode POST_NOT_ENABLE = new ErrorCode(1_002_005_001, "岗位({}) 不处于开启状态,不允许选择"); + ErrorCode POST_NAME_DUPLICATE = new ErrorCode(1_002_005_002, "已经存在该名字的岗位"); + ErrorCode POST_CODE_DUPLICATE = new ErrorCode(1_002_005_003, "已经存在该标识的岗位"); + + // ========== 字典类型 1-002-006-000 ========== + ErrorCode DICT_TYPE_NOT_EXISTS = new ErrorCode(1_002_006_001, "当前字典类型不存在"); + ErrorCode DICT_TYPE_NOT_ENABLE = new ErrorCode(1_002_006_002, "字典类型不处于开启状态,不允许选择"); + ErrorCode DICT_TYPE_NAME_DUPLICATE = new ErrorCode(1_002_006_003, "已经存在该名字的字典类型"); + ErrorCode DICT_TYPE_TYPE_DUPLICATE = new ErrorCode(1_002_006_004, "已经存在该类型的字典类型"); + ErrorCode DICT_TYPE_HAS_CHILDREN = new ErrorCode(1_002_006_005, "无法删除,该字典类型还有字典数据"); + // ========== 字典数据 1-002-007-000 ========== + ErrorCode DICT_DATA_NOT_EXISTS = new ErrorCode(1_002_007_001, "当前字典数据不存在"); + ErrorCode DICT_DATA_NOT_ENABLE = new ErrorCode(1_002_007_002, "字典数据({})不处于开启状态,不允许选择"); + ErrorCode DICT_DATA_VALUE_DUPLICATE = new ErrorCode(1_002_007_003, "已经存在该值的字典数据"); + + // ========== 通知公告 1-002-008-000 ========== + ErrorCode NOTICE_NOT_FOUND = new ErrorCode(1_002_008_001, "当前通知公告不存在"); + + // ========== 登陆 1-002-009-000 ========== + ErrorCode GENERATE_IMAGE_ERROR = new ErrorCode(1_002_008_001, "生成图片错误"); + + // ========== 短信渠道 1-002-011-000 ========== + ErrorCode SMS_CHANNEL_NOT_EXISTS = new ErrorCode(1_002_011_000, "短信渠道不存在"); + ErrorCode SMS_CHANNEL_DISABLE = new ErrorCode(1_002_011_001, "短信渠道不处于开启状态,不允许选择"); + ErrorCode SMS_CHANNEL_HAS_CHILDREN = new ErrorCode(1_002_011_002, "无法删除,该短信渠道还有短信模板"); + + // ========== 短信模板 1-002-012-000 ========== + ErrorCode SMS_TEMPLATE_NOT_EXISTS = new ErrorCode(1_002_012_000, "短信模板不存在"); + ErrorCode SMS_TEMPLATE_CODE_DUPLICATE = new ErrorCode(1_002_012_001, "已经存在编码为【{}】的短信模板"); + + // ========== 短信发送 1-002-013-000 ========== + ErrorCode SMS_SEND_MOBILE_NOT_EXISTS = new ErrorCode(1_002_013_000, "手机号不存在"); + ErrorCode SMS_SEND_MOBILE_TEMPLATE_PARAM_MISS = new ErrorCode(1_002_013_001, "模板参数({})缺失"); + ErrorCode SMS_SEND_TEMPLATE_NOT_EXISTS = new ErrorCode(1_002_013_002, "短信模板不存在"); + + // ========== 短信验证码 1-002-014-000 ========== + ErrorCode SMS_CODE_NOT_FOUND = new ErrorCode(1_002_014_000, "验证码不存在"); + ErrorCode SMS_CODE_EXPIRED = new ErrorCode(1_002_014_001, "验证码已过期"); + ErrorCode SMS_CODE_USED = new ErrorCode(1_002_014_002, "验证码已使用"); + ErrorCode SMS_CODE_NOT_CORRECT = new ErrorCode(1_002_014_003, "验证码不正确"); + ErrorCode SMS_CODE_EXCEED_SEND_MAXIMUM_QUANTITY_PER_DAY = new ErrorCode(1_002_014_004, "超过每日短信发送数量"); + ErrorCode SMS_CODE_SEND_TOO_FAST = new ErrorCode(1_002_014_005, "短信发送过于频率"); + ErrorCode SMS_CODE_IS_EXISTS = new ErrorCode(1_002_014_006, "手机号已被使用"); + ErrorCode SMS_CODE_IS_UNUSED = new ErrorCode(1_002_014_007, "验证码未被使用"); + + // ========== 租户信息 1-002-015-000 ========== + ErrorCode TENANT_NOT_EXISTS = new ErrorCode(1_002_015_000, "租户不存在"); + ErrorCode TENANT_DISABLE = new ErrorCode(1_002_015_001, "名字为【{}】的租户已被禁用"); + ErrorCode TENANT_EXPIRE = new ErrorCode(1_002_015_002, "名字为【{}】的租户已过期"); + ErrorCode TENANT_CAN_NOT_UPDATE_SYSTEM = new ErrorCode(1_002_015_003, "系统租户不能进行修改、删除等操作!"); + ErrorCode TENANT_NAME_DUPLICATE = new ErrorCode(1_002_015_004, "名字为【{}】的租户已存在"); + + // ========== 租户套餐 1-002-016-000 ========== + ErrorCode TENANT_PACKAGE_NOT_EXISTS = new ErrorCode(1_002_016_000, "租户套餐不存在"); + ErrorCode TENANT_PACKAGE_USED = new ErrorCode(1_002_016_001, "租户正在使用该套餐,请给租户重新设置套餐后再尝试删除"); + ErrorCode TENANT_PACKAGE_DISABLE = new ErrorCode(1_002_016_002, "名字为【{}】的租户套餐已被禁用"); + + // ========== 错误码模块 1-002-017-000 ========== + ErrorCode ERROR_CODE_NOT_EXISTS = new ErrorCode(1_002_017_000, "错误码不存在"); + ErrorCode ERROR_CODE_DUPLICATE = new ErrorCode(1_002_017_001, "已经存在编码为【{}】的错误码"); + + // ========== 系统敏感词 1-002-019-000 ========= + ErrorCode SENSITIVE_WORD_NOT_EXISTS = new ErrorCode(1_002_019_000, "系统敏感词在所有标签中都不存在"); + ErrorCode SENSITIVE_WORD_EXISTS = new ErrorCode(1_002_019_001, "系统敏感词已在标签中存在"); + + // ========== OAuth2 客户端 1-002-020-000 ========= + ErrorCode OAUTH2_CLIENT_NOT_EXISTS = new ErrorCode(1_002_020_000, "OAuth2 客户端不存在"); + ErrorCode OAUTH2_CLIENT_EXISTS = new ErrorCode(1_002_020_001, "OAuth2 客户端编号已存在"); + ErrorCode OAUTH2_CLIENT_DISABLE = new ErrorCode(1_002_020_002, "OAuth2 客户端已禁用"); + ErrorCode OAUTH2_CLIENT_AUTHORIZED_GRANT_TYPE_NOT_EXISTS = new ErrorCode(1_002_020_003, "不支持该授权类型"); + ErrorCode OAUTH2_CLIENT_SCOPE_OVER = new ErrorCode(1_002_020_004, "授权范围过大"); + ErrorCode OAUTH2_CLIENT_REDIRECT_URI_NOT_MATCH = new ErrorCode(1_002_020_005, "无效 redirect_uri: {}"); + ErrorCode OAUTH2_CLIENT_CLIENT_SECRET_ERROR = new ErrorCode(1_002_020_006, "无效 client_secret: {}"); + + // ========== OAuth2 授权 1-002-021-000 ========= + ErrorCode OAUTH2_GRANT_CLIENT_ID_MISMATCH = new ErrorCode(1_002_021_000, "client_id 不匹配"); + ErrorCode OAUTH2_GRANT_REDIRECT_URI_MISMATCH = new ErrorCode(1_002_021_001, "redirect_uri 不匹配"); + ErrorCode OAUTH2_GRANT_STATE_MISMATCH = new ErrorCode(1_002_021_002, "state 不匹配"); + ErrorCode OAUTH2_GRANT_CODE_NOT_EXISTS = new ErrorCode(1_002_021_003, "code 不存在"); + + // ========== OAuth2 授权 1-002-022-000 ========= + ErrorCode OAUTH2_CODE_NOT_EXISTS = new ErrorCode(1_002_022_000, "code 不存在"); + ErrorCode OAUTH2_CODE_EXPIRE = new ErrorCode(1_002_022_001, "code 已过期"); + + // ========== 邮箱账号 1-002-023-000 ========== + ErrorCode MAIL_ACCOUNT_NOT_EXISTS = new ErrorCode(1_002_023_000, "邮箱账号不存在"); + ErrorCode MAIL_ACCOUNT_RELATE_TEMPLATE_EXISTS = new ErrorCode(1_002_023_001, "无法删除,该邮箱账号还有邮件模板"); + + // ========== 邮件模版 1-002-024-000 ========== + ErrorCode MAIL_TEMPLATE_NOT_EXISTS = new ErrorCode(1_002_024_000, "邮件模版不存在"); + ErrorCode MAIL_TEMPLATE_CODE_EXISTS = new ErrorCode(1_002_024_001, "邮件模版 code({}) 已存在"); + + // ========== 邮件发送 1-002-025-000 ========== + ErrorCode MAIL_SEND_TEMPLATE_PARAM_MISS = new ErrorCode(1_002_025_000, "模板参数({})缺失"); + ErrorCode MAIL_SEND_MAIL_NOT_EXISTS = new ErrorCode(1_002_025_001, "邮箱不存在"); + + // ========== 站内信模版 1-002-026-000 ========== + ErrorCode NOTIFY_TEMPLATE_NOT_EXISTS = new ErrorCode(1_002_026_000, "站内信模版不存在"); + ErrorCode NOTIFY_TEMPLATE_CODE_DUPLICATE = new ErrorCode(1_002_026_001, "已经存在编码为【{}】的站内信模板"); + + // ========== 站内信模版 1-002-027-000 ========== + + // ========== 站内信发送 1-002-028-000 ========== + ErrorCode NOTIFY_SEND_TEMPLATE_PARAM_MISS = new ErrorCode(1_002_028_000, "模板参数({})缺失"); + + // ========== 流水号编码规则 1-002-029-000 ========== + ErrorCode SERIAL_NUMBER_NOT_EXISTS = new ErrorCode(1_002_029_000, "流水号规则不存在"); + ErrorCode SERIAL_NUMBER_EXISTS = new ErrorCode(1_002_029_001, "流水号规则已存在"); + ErrorCode SERIAL_NUMBER_NOT_ENOUGH = new ErrorCode(1_002_029_002, "流水号规则长度不足"); + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/common/SexEnum.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/common/SexEnum.java new file mode 100644 index 0000000..b75125b --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/common/SexEnum.java @@ -0,0 +1,27 @@ +package com.win.module.system.enums.common; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 性别的枚举值 + * + * @author 闻荫源码 + */ +@Getter +@AllArgsConstructor +public enum SexEnum { + + /** 男 */ + MALE(1), + /** 女 */ + FEMALE(2), + /* 未知 */ + UNKNOWN(3); + + /** + * 性别 + */ + private final Integer sex; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/dept/DeptIdEnum.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/dept/DeptIdEnum.java new file mode 100644 index 0000000..fb847d4 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/dept/DeptIdEnum.java @@ -0,0 +1,20 @@ +package com.win.module.system.enums.dept; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 部门编号枚举 + */ +@Getter +@AllArgsConstructor +public enum DeptIdEnum { + + /** + * 根节点 + */ + ROOT(0L); + + private final Long id; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/errorcode/ErrorCodeTypeEnum.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/errorcode/ErrorCodeTypeEnum.java new file mode 100644 index 0000000..108a289 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/errorcode/ErrorCodeTypeEnum.java @@ -0,0 +1,39 @@ +package com.win.module.system.enums.errorcode; + +import com.win.framework.common.core.IntArrayValuable; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 错误码的类型枚举 + * + * @author dylan + */ +@AllArgsConstructor +@Getter +public enum ErrorCodeTypeEnum implements IntArrayValuable { + + /** + * 自动生成 + */ + AUTO_GENERATION(1), + /** + * 手动编辑 + */ + MANUAL_OPERATION(2); + + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(ErrorCodeTypeEnum::getType).toArray(); + + /** + * 类型 + */ + private final Integer type; + + @Override + public int[] array() { + return ARRAYS; + } + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/logger/LoginLogTypeEnum.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/logger/LoginLogTypeEnum.java new file mode 100644 index 0000000..cd041ef --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/logger/LoginLogTypeEnum.java @@ -0,0 +1,27 @@ +package com.win.module.system.enums.logger; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 登录日志的类型枚举 + */ +@Getter +@AllArgsConstructor +public enum LoginLogTypeEnum { + + LOGIN_USERNAME(100), // 使用账号登录 + LOGIN_SOCIAL(101), // 使用社交登录 + LOGIN_MOBILE(103), // 使用手机登陆 + LOGIN_SMS(104), // 使用短信登陆 + + LOGOUT_SELF(200), // 自己主动登出 + LOGOUT_DELETE(202), // 强制退出 + ; + + /** + * 日志类型 + */ + private final Integer type; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/logger/LoginResultEnum.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/logger/LoginResultEnum.java new file mode 100644 index 0000000..d237a06 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/logger/LoginResultEnum.java @@ -0,0 +1,26 @@ +package com.win.module.system.enums.logger; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 登录结果的枚举类 + */ +@Getter +@AllArgsConstructor +public enum LoginResultEnum { + + SUCCESS(0), // 成功 + BAD_CREDENTIALS(10), // 账号或密码不正确 + USER_DISABLED(20), // 用户被禁用 + CAPTCHA_EXPIRE(30), // 验证码超期 + CAPTCHA_CODE_ERROR(31), // 图片验证码不正确 + + ; + + /** + * 结果 + */ + private final Integer result; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/mail/MailSendStatusEnum.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/mail/MailSendStatusEnum.java new file mode 100644 index 0000000..8dad6a4 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/mail/MailSendStatusEnum.java @@ -0,0 +1,24 @@ +package com.win.module.system.enums.mail; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 邮件的发送状态枚举 + * + * @author wangjingyi + * @since 2022/4/10 13:39 + */ +@Getter +@AllArgsConstructor +public enum MailSendStatusEnum { + + INIT(0), // 初始化 + SUCCESS(10), // 发送成功 + FAILURE(20), // 发送失败 + IGNORE(30), // 忽略,即不发送 + ; + + private final int status; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/notice/NoticeTypeEnum.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/notice/NoticeTypeEnum.java new file mode 100644 index 0000000..48b74ac --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/notice/NoticeTypeEnum.java @@ -0,0 +1,23 @@ +package com.win.module.system.enums.notice; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 通知类型 + * + * @author 闻荫源码 + */ +@Getter +@AllArgsConstructor +public enum NoticeTypeEnum { + + NOTICE(1), + ANNOUNCEMENT(2); + + /** + * 类型 + */ + private final Integer type; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/notify/NotifyTemplateTypeEnum.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/notify/NotifyTemplateTypeEnum.java new file mode 100644 index 0000000..50fcb96 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/notify/NotifyTemplateTypeEnum.java @@ -0,0 +1,26 @@ +package com.win.module.system.enums.notify; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 通知模板类型枚举 + * + * @author HUIHUI + */ +@Getter +@AllArgsConstructor +public enum NotifyTemplateTypeEnum { + + /** + * 系统消息 + */ + SYSTEM_MESSAGE(2), + /** + * 通知消息 + */ + NOTIFICATION_MESSAGE(1); + + private final Integer type; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/oauth2/OAuth2ClientConstants.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/oauth2/OAuth2ClientConstants.java new file mode 100644 index 0000000..0f4b054 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/oauth2/OAuth2ClientConstants.java @@ -0,0 +1,12 @@ +package com.win.module.system.enums.oauth2; + +/** + * OAuth2.0 客户端的通用枚举 + * + * @author 闻荫源码 + */ +public interface OAuth2ClientConstants { + + String CLIENT_ID_DEFAULT = "default"; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/oauth2/OAuth2GrantTypeEnum.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/oauth2/OAuth2GrantTypeEnum.java new file mode 100644 index 0000000..92f836f --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/oauth2/OAuth2GrantTypeEnum.java @@ -0,0 +1,29 @@ +package com.win.module.system.enums.oauth2; + +import cn.hutool.core.util.ArrayUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * OAuth2 授权类型(模式)的枚举 + * + * @author 闻荫源码 + */ +@AllArgsConstructor +@Getter +public enum OAuth2GrantTypeEnum { + + PASSWORD("password"), // 密码模式 + AUTHORIZATION_CODE("authorization_code"), // 授权码模式 + IMPLICIT("implicit"), // 简化模式 + CLIENT_CREDENTIALS("client_credentials"), // 客户端模式 + REFRESH_TOKEN("refresh_token"), // 刷新模式 + ; + + private final String grantType; + + public static OAuth2GrantTypeEnum getByGranType(String grantType) { + return ArrayUtil.firstMatch(o -> o.getGrantType().equals(grantType), values()); + } + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/permission/DataScopeEnum.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/permission/DataScopeEnum.java new file mode 100644 index 0000000..80c851c --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/permission/DataScopeEnum.java @@ -0,0 +1,30 @@ +package com.win.module.system.enums.permission; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 数据范围枚举类 + * + * 用于实现数据级别的权限 + * + * @author 闻荫源码 + */ +@Getter +@AllArgsConstructor +public enum DataScopeEnum { + + ALL(1), // 全部数据权限 + + DEPT_CUSTOM(2), // 指定部门数据权限 + DEPT_ONLY(3), // 部门数据权限 + DEPT_AND_CHILD(4), // 部门及以下数据权限 + + SELF(5); // 仅本人数据权限 + + /** + * 范围 + */ + private final Integer scope; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/permission/MenuTypeEnum.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/permission/MenuTypeEnum.java new file mode 100644 index 0000000..0acf28e --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/permission/MenuTypeEnum.java @@ -0,0 +1,25 @@ +package com.win.module.system.enums.permission; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 菜单类型枚举类 + * + * @author 闻荫源码 + */ +@Getter +@AllArgsConstructor +public enum MenuTypeEnum { + + DIR(1), // 目录 + MENU(2), // 菜单 + BUTTON(3) // 按钮 + ; + + /** + * 类型 + */ + private final Integer type; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/permission/RoleCodeEnum.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/permission/RoleCodeEnum.java new file mode 100644 index 0000000..f1aaa9b --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/permission/RoleCodeEnum.java @@ -0,0 +1,31 @@ +package com.win.module.system.enums.permission; + +import com.win.framework.common.util.object.ObjectUtils; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 角色标识枚举 + */ +@Getter +@AllArgsConstructor +public enum RoleCodeEnum { + + SUPER_ADMIN("super_admin", "超级管理员"), + TENANT_ADMIN("tenant_admin", "租户管理员"), + ; + + /** + * 角色编码 + */ + private final String code; + /** + * 名字 + */ + private final String name; + + public static boolean isSuperAdmin(String code) { + return ObjectUtils.equalsAny(code, SUPER_ADMIN.getCode()); + } + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/permission/RoleTypeEnum.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/permission/RoleTypeEnum.java new file mode 100644 index 0000000..9636cf7 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/permission/RoleTypeEnum.java @@ -0,0 +1,21 @@ +package com.win.module.system.enums.permission; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum RoleTypeEnum { + + /** + * 内置角色 + */ + SYSTEM(1), + /** + * 自定义角色 + */ + CUSTOM(2); + + private final Integer type; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/serialNumber/RuleCodeEnum.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/serialNumber/RuleCodeEnum.java new file mode 100644 index 0000000..03fa7b2 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/serialNumber/RuleCodeEnum.java @@ -0,0 +1,150 @@ +package com.win.module.system.enums.serialNumber; + +public enum RuleCodeEnum { + + PURCHASE_CLAIM_RECORD("PurchaseClaimRecord"), + PURCHASE_ORDER("PurchaseOrder"), + WORK_ORDER("WorkOrder"), + SALE_ORDER("SaleOrder"), + PURCHASE_PLAN("PurchasePlan"), + WORK_PLAN("WorkPlan"), + MATERIAL_PREPARE_PLAN("MaterialPreparePlan"), + DELIVER_PLAN("DeliverPlan"), + PRODUCT_PREPARE_PLAN("ProductPreparePlan"), + COUNT_PLAN("CountPlan"), + PURCHASE_PREDICTION("PurchasePrediction"), + SUPPLIER_EVALUATION("SupplierEvaluation"), + SUPPLIER_DELIVER_REQUEST("SupplierDeliverRequest"), + PURCHASE_RECEIPT_REQUEST("PurchaseReceiptRequest"), + PURCHASE_RETURN_REQUEST("PurchaseReturnRequest"), + PURCHASE_CLAIM_REQUEST("PurchaseClaimRequest"), + SUPPLIER_INVOICE_REQUEST("SupplierInvoiceRequest"), + INSPECT_REQUEST("InspectRequest"), + PURCHASE_PUTAWAY_REQUEST("PurchasePutawayRequest"), + REPLEINMENT_REQUEST("RepleinmentRequest"), + PICK_REQUEST("PickRequest"), + ISSUE_REQUEST("IssueRequest"), + RETURN_TO_STORE_REQUEST("ReturnToStoreRequest"), + RETURN_TO_HOLD("ReturnToHOld"), + PRODUCT_RECEIPT_REQUEST("ProductReceiptRequest"), + PRODUCT_PUTAWAY_REQUEST("ProductPutawayRequest"), + PRODUCT_DISASSEMBLE_REQUEST("ProductDisassembleRequest"), + PRODUCT_REPAIR_REQUEST("ProductRepairRequest"), + PRODUCT_SCRAP_REQUEST("ProductScrapRequest"), + DELIVER_REQUEST("DeliverRequest"), + CUSTOMER_REJECT_REQUEST("CustomerRejectRequest"), + CUSTOMER_SETTLE_REQUEST("CustomerSettleRequest"), + INVENTORY_INITIAL_REQUEST("InventoryInitialRequest"), + MOVE_REQUEST("MoveRequest"), + OK_TO_HOLD_REQUEST("OkToHoldRequest"), + HOLD_TO_OK_REQUEST("HoldToOkRequest"), + HOLD_TO_SCRAP_REQUEST("HoldToScrapRequest"), + OK_TO_SCRAP_REQUEST("OktoScrapRequest"), + SCRAP_TO_HOLD_REQUEST("ScrapToHoldRequest"), + TRANSFER_REQUEST("TransferRequest"), + UNPLANNED_RECEIPT_REQUEST("UnplannedReceiptRequest"), + UNPLANNED_DELIVER_REQUEST("UnplannedDeliverRequest"), + SCRAP_REQUEST("ScrapRequest"), + COUNT_REQUEST("CountRequest"), + COUNT_ADJUST_REQUEST("CountAdjustRequest"), + QTY_ADJUST_REQUEST("QtyAdjustRequest"), + OFFLINE_SETTLEMENT_REQUEST("OfflineSettlementRequest"), + ONLINE_SETTLEMENT_REQUEST("OnlineSettlementRequest"), + INVENTORY_MOVE_REQUEST("InventoryMoveRequest"), + INVENTORY_CHANGE_REQUEST("InventoryChangeRequest"), + PRODUCTION_RETURN_REQUEST("ProductionReturnRequest"), + CUSTOMER_RECEIPT_REQUEST("CustomerReceiptRequest"), + CHECK_RE_REQUEST("CheckReRequest"), + PURCHASE_RECEIPT_JOB("PurchaseReceiptJob"), + PURCHASE_RETURN_JOB("PurchaseReturnJob"), + INSPECT_JOB("InspectJob"), + PURCHASE_PUTAWAY_JOB("PurchasePutawayJob"), + PICK_JOB("PickJob"), + ISSUE_JOB("IssueJob"), + ISSUE_RECEIPT_JOB("IssueReceiptJob"), + REPLEINMENT_JOB("RepleinmentJob"), + RETURN_TO_STORE_JOB("ReturnToStoreJob"), + RETURN_TO_HOLD_JOB("ReturnToHoldJob"), + MOVE_JOB("MoveJob"), + OK_TO_HOLD_JOB("OkToHoldJob"), + HOLD_TO_OK_JOB("HoldToOkJob"), + HOLD_TO_SCRAP_JOB("HoldToScrapJob"), + OK_TO_SCRAP_JOB("OkToScrapJob"), + SCRAP_TO_HOLD_JOB("ScrapToHoldJob"), + TRANSFER_DELIVER_JOB("TransferDeliverJob"), + TRANSFER_RECEIPT_JOB("TransferReceiptJob"), + UNPLANNED_RECEIPT_JOB("UnplannedReceiptJob"), + UNPLANNED_DELIVER_JOB("UnplannedDeliverJob"), + SCRAP_JOB("ScrapJob"), + PRODUCT_RECEIPT_JOB("ProductReceiptJob"), + PRODUCT_PUTAWAY_JOB("ProductPutawayJob"), + PRODUCT_SCRAP_JOB("ProductScrapJob"), + DELIVER_JOB("DeliverJob"), + CUSTOMER_REJECT_JOB("CustomerRejectJob"), + COUNT_JOB("CountJob"), + INVENTORY_MOVE_JOB("InventoryMoveJob"), + PRODUCTION_RETURN_JOB("ProductionReturnJob"), + PRODUCTION_RECEIPT_JOB("ProductionReceiptJob"), + CHECK_JOB("CheckJob"), + PRODUCT_DISMANTLE_JOB("ProductDismantleJob"), + SUPPLIER_DELIVER_RECORD("SupplierDeliverRecord"), + PURCHASE_RECEIPT_RECORD("PurchaseReceiptRecord"), + PURCHASE_RETURN_RECORD("PurchaseReturnRecord"), + SUPPLIER_CLAIM_RECORD("SupplierClaimRecord"), + SUPPLIER_INVOICE_RECORD("SupplierInvoiceRecord"), + INSPECT_RECORD("InspectRecord"), + PURCHASE_PUTAWAY_RECORD("PurchasePutawayRecord"), + ISSUE_RECORD("IssueRecord"), + ISSUE_RECEIPT_RECORD("IssueReceiptRecord"), + PICK_RECORD("PickRecord"), + REPLEINMENT_RECORD("RepleinmentRecord"), + PRODUCT_RECEIPT_RECORD("ProductReceiptRecord"), + PRODUCT_PUTAWAY_RECORD("ProductPutawayRecord"), + RETURN_TO_STORE_RECORD("ReturnToStoreRecord"), + RETURN_TO_HOLD_RECORD("ReturnToHoldRecord"), + PRODUCT_DISASSEMBLE_RECORD("ProductDisassembleRecord"), + PRODUCT_REPAIR_RECORD("ProductRepairRecord"), + PRODUCT_SCRAP_RECORD("ProductScrapRecord"), + DELIVER_RECORD("DeliverRecord"), + CHECK_RECORD("CheckRecord"), + CUSTOMER_REJECT_RECORD("CustomerRejectRecord"), + INVENTORY_INITIAL_RECORD("InventoryInitialRecord"), + MOVE_RECORD("MoveRecord"), + OK_TO_HOLD_RECORD("OkToHoldRecord"), + HOLD_TO_OK_RECORD("HoldToOkRecord"), + HOLD_TO_SCRAP_RECORD("HoldToScrapRecord"), + OK_TO_SCRAP_RECORD("OktoScrapRecord"), + SCRAP_TO_HOLD_RECORD("ScrapToHoldRecord"), + TRANSFER_DELIVER_RECORD("TransferDeliverRecord"), + TRANSFER_RECEIPT_RECORD("TransferReceiptRecord"), + UNPLANNED_RECEIPT_RECORD("UnplannedReceiptRecord"), + UNPLANNED_DELIVER_RECORD("UnplannedDeliverRecord"), + SCRAP_RECORD("ScrapRecord"), + COUNT_RECORD("CountRecord"), + COUNT_ADJUST_RECORD("CountAdjustRecord"), + QTY_ADJUST_RECORD("QtyAdjustRecord"), + SPLIT_PACKAGE_RECORD("SplitPackageRecord"), + MERGE_PACKAGE_RECORD("MergePackageRecord"), + OVER_PACKAGE_RECORD("OverPackageRecord"), + CONTAINER_BIND_RECORD("ContainerBindRecord"), + CONTAINER_UNBIND_RECORD("ContainerUnbindRecord"), + OFFLINE_SETTLEMENT_RECORD("OfflineSettlementRecord"), + ONLINE_SETTLEMENT_RECORD("OnlineSettlementRecord"), + CUSTOMER_RECEIPT_RECORD("CustomerReceiptRecord"), + PRODUCTION_RECEIPT_RECORD("ProductionReceiptRecord"), + CUSTOMER_SETTLE_RECORD("CustomerSettleRecord"), + INVENTORY_CHANGE_RECORD("InventoryChangeRecord"), + INVENTORY_MOVE_RECORD("InventoryMoveRecord"), + ASN_NUMBER("AsnNumber"); + + private final String code; + + RuleCodeEnum(String code) { + this.code = code; + } + + public String getCode() { + return code; + } + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/sms/SmsReceiveStatusEnum.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/sms/SmsReceiveStatusEnum.java new file mode 100644 index 0000000..66a0740 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/sms/SmsReceiveStatusEnum.java @@ -0,0 +1,23 @@ +package com.win.module.system.enums.sms; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 短信的接收状态枚举 + * + * @author 闻荫源码 + * @date 2021/2/1 13:39 + */ +@Getter +@AllArgsConstructor +public enum SmsReceiveStatusEnum { + + INIT(0), // 初始化 + SUCCESS(10), // 接收成功 + FAILURE(20), // 接收失败 + ; + + private final int status; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/sms/SmsSceneEnum.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/sms/SmsSceneEnum.java new file mode 100644 index 0000000..4b9f1e5 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/sms/SmsSceneEnum.java @@ -0,0 +1,51 @@ +package com.win.module.system.enums.sms; + +import cn.hutool.core.util.ArrayUtil; +import com.win.framework.common.core.IntArrayValuable; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 用户短信验证码发送场景的枚举 + * + * @author 闻荫源码 + */ +@Getter +@AllArgsConstructor +public enum SmsSceneEnum implements IntArrayValuable { + + MEMBER_LOGIN(1, "user-sms-login", "会员用户 - 手机号登陆"), + MEMBER_UPDATE_MOBILE(2, "user-update-mobile", "会员用户 - 修改手机"), + MEMBER_UPDATE_PASSWORD(3, "user-update-mobile", "会员用户 - 修改密码"), + MEMBER_RESET_PASSWORD(4, "user-reset-password", "会员用户 - 忘记密码"), + + ADMIN_MEMBER_LOGIN(21, "admin-sms-login", "后台用户 - 手机号登录"); + + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(SmsSceneEnum::getScene).toArray(); + + /** + * 验证场景的编号 + */ + private final Integer scene; + /** + * 模版编码 + */ + private final String templateCode; + /** + * 描述 + */ + private final String description; + + @Override + public int[] array() { + return ARRAYS; + } + + public static SmsSceneEnum getCodeByScene(Integer scene) { + return ArrayUtil.firstMatch(sceneEnum -> sceneEnum.getScene().equals(scene), + values()); + } + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/sms/SmsSendStatusEnum.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/sms/SmsSendStatusEnum.java new file mode 100644 index 0000000..d09c6c2 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/sms/SmsSendStatusEnum.java @@ -0,0 +1,24 @@ +package com.win.module.system.enums.sms; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 短信的发送状态枚举 + * + * @author zzf + * @date 2021/2/1 13:39 + */ +@Getter +@AllArgsConstructor +public enum SmsSendStatusEnum { + + INIT(0), // 初始化 + SUCCESS(10), // 发送成功 + FAILURE(20), // 发送失败 + IGNORE(30), // 忽略,即不发送 + ; + + private final int status; + +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/sms/SmsTemplateTypeEnum.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/sms/SmsTemplateTypeEnum.java new file mode 100644 index 0000000..7673072 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/sms/SmsTemplateTypeEnum.java @@ -0,0 +1,25 @@ +package com.win.module.system.enums.sms; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 短信的模板类型枚举 + * + * @author 闻荫源码 + */ +@Getter +@AllArgsConstructor +public enum SmsTemplateTypeEnum { + + VERIFICATION_CODE(1), // 验证码 + NOTICE(2), // 通知 + PROMOTION(3), // 营销 + ; + + /** + * 类型 + */ + private final int type; + +} diff --git a/win-module-system/win-module-system-biz/pom.xml b/win-module-system/win-module-system-biz/pom.xml new file mode 100644 index 0000000..e59ebf1 --- /dev/null +++ b/win-module-system/win-module-system-biz/pom.xml @@ -0,0 +1,116 @@ + + + + com.win + win-module-system + ${revision} + + 4.0.0 + win-module-system-biz + jar + + ${project.artifactId} + + system 模块下,我们放通用业务,支撑上层的核心业务。 + 例如说:用户、部门、权限、数据字典等等 + + + + + com.win + win-module-system-api + ${revision} + + + com.win + win-module-infra-api + ${revision} + + + + + com.win + win-spring-boot-starter-biz-operatelog + + + com.win + win-spring-boot-starter-biz-sms + + + com.win + win-spring-boot-starter-biz-dict + + + com.win + win-spring-boot-starter-biz-data-permission + + + com.win + win-spring-boot-starter-biz-tenant + + + com.win + win-spring-boot-starter-biz-ip + + + + + com.win + win-spring-boot-starter-security + + + + org.springframework.boot + spring-boot-starter-validation + + + + + com.win + win-spring-boot-starter-mybatis + + + + com.win + win-spring-boot-starter-redis + + + + + com.win + win-spring-boot-starter-job + + + + + com.win + win-spring-boot-starter-mq + + + + + com.win + win-spring-boot-starter-test + test + + + + + com.win + win-spring-boot-starter-excel + + + + com.win + win-spring-boot-starter-captcha + + + + org.springframework.boot + spring-boot-starter-mail + + + + diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/dept/DeptApiImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/dept/DeptApiImpl.java new file mode 100644 index 0000000..eacb123 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/dept/DeptApiImpl.java @@ -0,0 +1,41 @@ +package com.win.module.system.api.dept; + +import com.win.module.system.api.dept.dto.DeptRespDTO; +import com.win.module.system.convert.dept.DeptConvert; +import com.win.module.system.dal.dataobject.dept.DeptDO; +import com.win.module.system.service.dept.DeptService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.List; + +/** + * 部门 API 实现类 + * + * @author 闻荫源码 + */ +@Service +public class DeptApiImpl implements DeptApi { + + @Resource + private DeptService deptService; + + @Override + public DeptRespDTO getDept(Long id) { + DeptDO dept = deptService.getDept(id); + return DeptConvert.INSTANCE.convert03(dept); + } + + @Override + public List getDeptList(Collection ids) { + List depts = deptService.getDeptList(ids); + return DeptConvert.INSTANCE.convertList03(depts); + } + + @Override + public void validateDeptList(Collection ids) { + deptService.validateDeptList(ids); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/dept/PostApiImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/dept/PostApiImpl.java new file mode 100644 index 0000000..93c10f8 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/dept/PostApiImpl.java @@ -0,0 +1,25 @@ +package com.win.module.system.api.dept; + +import com.win.module.system.service.dept.PostService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Collection; + +/** + * 岗位 API 实现类 + * + * @author 闻荫源码 + */ +@Service +public class PostApiImpl implements PostApi { + + @Resource + private PostService postService; + + @Override + public void validPostList(Collection ids) { + postService.validatePostList(ids); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/dict/DictDataApiImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/dict/DictDataApiImpl.java new file mode 100644 index 0000000..758b576 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/dict/DictDataApiImpl.java @@ -0,0 +1,58 @@ +package com.win.module.system.api.dict; + +import com.win.module.system.api.dict.dto.DictDataRespDTO; +import com.win.module.system.controller.dict.vo.data.DictDataExportReqVO; +import com.win.module.system.convert.dict.DictDataConvert; +import com.win.module.system.dal.dataobject.dict.DictDataDO; +import com.win.module.system.service.dict.DictDataService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 字典数据 API 实现类 + * + * @author 闻荫源码 + */ +@Service +public class DictDataApiImpl implements DictDataApi { + + @Resource + private DictDataService dictDataService; + + @Override + public void validateDictDataList(String dictType, Collection values) { + dictDataService.validateDictDataList(dictType, values); + } + + @Override + public DictDataRespDTO getDictData(String dictType, String value) { + DictDataDO dictData = dictDataService.getDictData(dictType, value); + return DictDataConvert.INSTANCE.convert02(dictData); + } + + @Override + public DictDataRespDTO parseDictData(String dictType, String label) { + DictDataDO dictData = dictDataService.parseDictData(dictType, label); + return DictDataConvert.INSTANCE.convert02(dictData); + } + + @Override + public String[] getDictDataByType(String type) { + List dataDOList = dictDataService.getDictDataList(new DictDataExportReqVO().setDictType(type)); + String[] result = new String[dataDOList.size()]; + List labels = dataDOList.stream().map(DictDataDO::getLabel).collect(Collectors.toList()); + if(!labels.isEmpty()) { + labels.toArray(result); + } + return result; + } + @Override + public DictDataRespDTO selectDictTypeAndLabel(String ptype, String plabel) { + DictDataDO dictDataDO = dictDataService.selectDictTypeAndLabel(ptype, plabel); + return DictDataConvert.INSTANCE.convert02(dictDataDO); + } +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/errorcode/ErrorCodeApiImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/errorcode/ErrorCodeApiImpl.java new file mode 100644 index 0000000..fffe393 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/errorcode/ErrorCodeApiImpl.java @@ -0,0 +1,33 @@ +package com.win.module.system.api.errorcode; + +import com.win.module.system.api.errorcode.dto.ErrorCodeAutoGenerateReqDTO; +import com.win.module.system.api.errorcode.dto.ErrorCodeRespDTO; +import com.win.module.system.service.errorcode.ErrorCodeService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.util.List; + +/** + * 错误码 Api 实现类 + * + * @author 闻荫源码 + */ +@Service +public class ErrorCodeApiImpl implements ErrorCodeApi { + + @Resource + private ErrorCodeService errorCodeService; + + @Override + public void autoGenerateErrorCodeList(List autoGenerateDTOs) { + errorCodeService.autoGenerateErrorCodes(autoGenerateDTOs); + } + + @Override + public List getErrorCodeList(String applicationName, LocalDateTime minUpdateTime) { + return errorCodeService.getErrorCodeList(applicationName, minUpdateTime); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/logger/LoginLogApiImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/logger/LoginLogApiImpl.java new file mode 100644 index 0000000..e25eafe --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/logger/LoginLogApiImpl.java @@ -0,0 +1,27 @@ +package com.win.module.system.api.logger; + +import com.win.module.system.api.logger.dto.LoginLogCreateReqDTO; +import com.win.module.system.service.logger.LoginLogService; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; + +/** + * 登录日志的 API 实现类 + * + * @author 闻荫源码 + */ +@Service +@Validated +public class LoginLogApiImpl implements LoginLogApi { + + @Resource + private LoginLogService loginLogService; + + @Override + public void createLoginLog(LoginLogCreateReqDTO reqDTO) { + loginLogService.createLoginLog(reqDTO); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/logger/OperateLogApiImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/logger/OperateLogApiImpl.java new file mode 100644 index 0000000..4945a70 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/logger/OperateLogApiImpl.java @@ -0,0 +1,27 @@ +package com.win.module.system.api.logger; + +import com.win.module.system.api.logger.dto.OperateLogCreateReqDTO; +import com.win.module.system.service.logger.OperateLogService; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; + +/** + * 操作日志 API 实现类 + * + * @author 闻荫源码 + */ +@Service +@Validated +public class OperateLogApiImpl implements OperateLogApi { + + @Resource + private OperateLogService operateLogService; + + @Override + public void createOperateLog(OperateLogCreateReqDTO createReqDTO) { + operateLogService.createOperateLog(createReqDTO); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/mail/MailSendApiImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/mail/MailSendApiImpl.java new file mode 100644 index 0000000..e901e24 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/mail/MailSendApiImpl.java @@ -0,0 +1,28 @@ +package com.win.module.system.api.mail; + +import com.win.module.system.api.mail.dto.MailSendSingleToUserReqDTO; +import com.win.module.system.service.mail.MailSendService; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; + +/** + * 邮件发送 API 实现类 + * + * @author wangjingyi + */ +@Service +@Validated +public class MailSendApiImpl implements MailSendApi { + + @Resource + private MailSendService mailSendService; + + @Override + public Long sendSingleMailToAdmin(MailSendSingleToUserReqDTO reqDTO) { + return mailSendService.sendSingleMailToAdmin(reqDTO.getMail(), reqDTO.getUserId(), + reqDTO.getTemplateCode(), reqDTO.getTemplateParams()); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/notify/NotifyMessageSendApiImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/notify/NotifyMessageSendApiImpl.java new file mode 100644 index 0000000..cdd1f3e --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/notify/NotifyMessageSendApiImpl.java @@ -0,0 +1,32 @@ +package com.win.module.system.api.notify; + +import com.win.module.system.api.notify.dto.NotifySendSingleToUserReqDTO; +import com.win.module.system.service.notify.NotifySendService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * 站内信发送 API 实现类 + * + * @author xrcoder + */ +@Service +public class NotifyMessageSendApiImpl implements NotifyMessageSendApi { + + @Resource + private NotifySendService notifySendService; + + @Override + public Long sendSingleMessageToAdmin(NotifySendSingleToUserReqDTO reqDTO) { + return notifySendService.sendSingleNotifyToAdmin(reqDTO.getUserId(), + reqDTO.getTemplateCode(), reqDTO.getTemplateParams()); + } + + @Override + public Long sendSingleMessageToMember(NotifySendSingleToUserReqDTO reqDTO) { + return notifySendService.sendSingleNotifyToMember(reqDTO.getUserId(), + reqDTO.getTemplateCode(), reqDTO.getTemplateParams()); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/oauth2/OAuth2TokenApiImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/oauth2/OAuth2TokenApiImpl.java new file mode 100644 index 0000000..a9f29ff --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/oauth2/OAuth2TokenApiImpl.java @@ -0,0 +1,47 @@ +package com.win.module.system.api.oauth2; + +import com.win.module.system.api.oauth2.dto.OAuth2AccessTokenCheckRespDTO; +import com.win.module.system.api.oauth2.dto.OAuth2AccessTokenCreateReqDTO; +import com.win.module.system.api.oauth2.dto.OAuth2AccessTokenRespDTO; +import com.win.module.system.convert.auth.OAuth2TokenConvert; +import com.win.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; +import com.win.module.system.service.oauth2.OAuth2TokenService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * OAuth2.0 Token API 实现类 + * + * @author 闻荫源码 + */ +@Service +public class OAuth2TokenApiImpl implements OAuth2TokenApi { + + @Resource + private OAuth2TokenService oauth2TokenService; + + @Override + public OAuth2AccessTokenRespDTO createAccessToken(OAuth2AccessTokenCreateReqDTO reqDTO) { + OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.createAccessToken(reqDTO.getUserId(), reqDTO.getClientId(), reqDTO.getScopes()); + return OAuth2TokenConvert.INSTANCE.convert2(accessTokenDO); + } + + @Override + public OAuth2AccessTokenCheckRespDTO checkAccessToken(String accessToken) { + return OAuth2TokenConvert.INSTANCE.convert(oauth2TokenService.checkAccessToken(accessToken)); + } + + @Override + public OAuth2AccessTokenRespDTO removeAccessToken(String accessToken) { + OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.removeAccessToken(accessToken); + return OAuth2TokenConvert.INSTANCE.convert2(accessTokenDO); + } + + @Override + public OAuth2AccessTokenRespDTO refreshAccessToken(String refreshToken, String clientId) { + OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.refreshAccessToken(refreshToken, clientId); + return OAuth2TokenConvert.INSTANCE.convert2(accessTokenDO); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/permission/PermissionApiImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/permission/PermissionApiImpl.java new file mode 100644 index 0000000..a7433c7 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/permission/PermissionApiImpl.java @@ -0,0 +1,42 @@ +package com.win.module.system.api.permission; + +import com.win.module.system.api.permission.dto.DeptDataPermissionRespDTO; +import com.win.module.system.service.permission.PermissionService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.Set; + +/** + * 权限 API 实现类 + * + * @author 闻荫源码 + */ +@Service +public class PermissionApiImpl implements PermissionApi { + + @Resource + private PermissionService permissionService; + + @Override + public Set getUserRoleIdListByRoleIds(Collection roleIds) { + return permissionService.getUserRoleIdListByRoleId(roleIds); + } + + @Override + public boolean hasAnyPermissions(Long userId, String... permissions) { + return permissionService.hasAnyPermissions(userId, permissions); + } + + @Override + public boolean hasAnyRoles(Long userId, String... roles) { + return permissionService.hasAnyRoles(userId, roles); + } + + @Override + public DeptDataPermissionRespDTO getDeptDataPermission(Long userId) { + return permissionService.getDeptDataPermission(userId); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/permission/RoleApiImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/permission/RoleApiImpl.java new file mode 100644 index 0000000..587ecf3 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/permission/RoleApiImpl.java @@ -0,0 +1,24 @@ +package com.win.module.system.api.permission; + +import com.win.module.system.service.permission.RoleService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Collection; + +/** + * 角色 API 实现类 + * + * @author 闻荫源码 + */ +@Service +public class RoleApiImpl implements RoleApi { + + @Resource + private RoleService roleService; + + @Override + public void validRoleList(Collection ids) { + roleService.validateRoleList(ids); + } +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/sensitiveword/SensitiveWordApiImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/sensitiveword/SensitiveWordApiImpl.java new file mode 100644 index 0000000..41cb839 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/sensitiveword/SensitiveWordApiImpl.java @@ -0,0 +1,29 @@ +package com.win.module.system.api.sensitiveword; + +import com.win.module.system.service.sensitiveword.SensitiveWordService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 敏感词 API 实现类 + * + * @author 永不言败 + */ +@Service +public class SensitiveWordApiImpl implements SensitiveWordApi { + + @Resource + private SensitiveWordService sensitiveWordService; + + @Override + public List validateText(String text, List tags) { + return sensitiveWordService.validateText(text, tags); + } + + @Override + public boolean isTextValid(String text, List tags) { + return sensitiveWordService.isTextValid(text, tags); + } +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/serialnumber/SerialNumberApiImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/serialnumber/SerialNumberApiImpl.java new file mode 100644 index 0000000..4a2ff20 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/serialnumber/SerialNumberApiImpl.java @@ -0,0 +1,18 @@ +package com.win.module.system.api.serialnumber; + +import com.win.module.system.service.serialnumber.SerialNumberService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +@Service +public class SerialNumberApiImpl implements SerialNumberApi { + + @Resource + private SerialNumberService smsCodeService; + + @Override + public String generateCode(String ruleCode) { + return smsCodeService.generateCode(ruleCode); + } +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/sms/SmsCodeApiImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/sms/SmsCodeApiImpl.java new file mode 100644 index 0000000..53bc738 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/sms/SmsCodeApiImpl.java @@ -0,0 +1,39 @@ +package com.win.module.system.api.sms; + +import com.win.module.system.api.sms.dto.code.SmsCodeValidateReqDTO; +import com.win.module.system.api.sms.dto.code.SmsCodeSendReqDTO; +import com.win.module.system.api.sms.dto.code.SmsCodeUseReqDTO; +import com.win.module.system.service.sms.SmsCodeService; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; + +/** + * 短信验证码 API 实现类 + * + * @author 闻荫源码 + */ +@Service +@Validated +public class SmsCodeApiImpl implements SmsCodeApi { + + @Resource + private SmsCodeService smsCodeService; + + @Override + public void sendSmsCode(SmsCodeSendReqDTO reqDTO) { + smsCodeService.sendSmsCode(reqDTO); + } + + @Override + public void useSmsCode(SmsCodeUseReqDTO reqDTO) { + smsCodeService.useSmsCode(reqDTO); + } + + @Override + public void validateSmsCode(SmsCodeValidateReqDTO reqDTO) { + smsCodeService.validateSmsCode(reqDTO); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/sms/SmsSendApiImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/sms/SmsSendApiImpl.java new file mode 100644 index 0000000..5efab16 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/sms/SmsSendApiImpl.java @@ -0,0 +1,28 @@ +package com.win.module.system.api.sms; + +import com.win.module.system.api.sms.dto.send.SmsSendSingleToUserReqDTO; +import com.win.module.system.service.sms.SmsSendService; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; + +/** + * 短信发送 API 接口 + * + * @author 闻荫源码 + */ +@Service +@Validated +public class SmsSendApiImpl implements SmsSendApi { + + @Resource + private SmsSendService smsSendService; + + @Override + public Long sendSingleSmsToAdmin(SmsSendSingleToUserReqDTO reqDTO) { + return smsSendService.sendSingleSmsToAdmin(reqDTO.getMobile(), reqDTO.getUserId(), + reqDTO.getTemplateCode(), reqDTO.getTemplateParams()); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/tenant/TenantApiImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/tenant/TenantApiImpl.java new file mode 100644 index 0000000..db39709 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/tenant/TenantApiImpl.java @@ -0,0 +1,30 @@ +package com.win.module.system.api.tenant; + +import com.win.module.system.service.tenant.TenantService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 多租户的 API 实现类 + * + * @author 闻荫源码 + */ +@Service +public class TenantApiImpl implements TenantApi { + + @Resource + private TenantService tenantService; + + @Override + public List getTenantIdList() { + return tenantService.getTenantIdList(); + } + + @Override + public void validateTenant(Long id) { + tenantService.validTenant(id); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/user/AdminUserApiImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/user/AdminUserApiImpl.java new file mode 100644 index 0000000..39e8ebe --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/user/AdminUserApiImpl.java @@ -0,0 +1,53 @@ +package com.win.module.system.api.user; + +import com.win.module.system.api.user.dto.AdminUserRespDTO; +import com.win.module.system.convert.user.UserConvert; +import com.win.module.system.dal.dataobject.user.AdminUserDO; +import com.win.module.system.service.user.AdminUserService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.List; + +/** + * Admin 用户 API 实现类 + * + * @author 闻荫源码 + */ +@Service +public class AdminUserApiImpl implements AdminUserApi { + + @Resource + private AdminUserService userService; + + @Override + public AdminUserRespDTO getUser(Long id) { + AdminUserDO user = userService.getUser(id); + return UserConvert.INSTANCE.convert4(user); + } + + @Override + public List getUserList(Collection ids) { + List users = userService.getUserList(ids); + return UserConvert.INSTANCE.convertList4(users); + } + + @Override + public List getUserListByDeptIds(Collection deptIds) { + List users = userService.getUserListByDeptIds(deptIds); + return UserConvert.INSTANCE.convertList4(users); + } + + @Override + public List getUserListByPostIds(Collection postIds) { + List users = userService.getUserListByPostIds(postIds); + return UserConvert.INSTANCE.convertList4(users); + } + + @Override + public void validateUserList(Collection ids) { + userService.validateUserList(ids); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/auth/AuthController.http b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/auth/AuthController.http new file mode 100644 index 0000000..00ae2ba --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/auth/AuthController.http @@ -0,0 +1,33 @@ +### 请求 /login 接口 => 成功 +POST {{baseUrl}}/system/auth/login +Content-Type: application/json +tenant-id: {{adminTenentId}} +tag: Yunai.local + +{ + "username": "admin", + "password": "admin123", + "uuid": "3acd87a09a4f48fb9118333780e94883", + "code": "1024" +} + +### 请求 /login 接口 => 成功(无验证码) +POST {{baseUrl}}/system/auth/login +Content-Type: application/json +tenant-id: {{adminTenentId}} + +{ + "username": "admin", + "password": "admin123" +} + +### 请求 /get-permission-info 接口 => 成功 +GET {{baseUrl}}/system/auth/get-permission-info +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} + +### 请求 /list-menus 接口 => 成功 +GET {{baseUrl}}/system/list-menus +Authorization: Bearer {{token}} +#Authorization: Bearer a6aa7714a2e44c95aaa8a2c5adc2a67a +tenant-id: {{adminTenentId}} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/auth/AuthController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/auth/AuthController.java new file mode 100644 index 0000000..a761a9c --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/auth/AuthController.java @@ -0,0 +1,113 @@ +package com.win.module.system.controller.auth; + +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.operatelog.core.annotations.OperateLog; +import com.win.framework.security.config.SecurityProperties; +import com.win.module.system.controller.auth.vo.AuthLoginReqVO; +import com.win.module.system.controller.auth.vo.AuthLoginRespVO; +import com.win.module.system.controller.auth.vo.AuthPermissionInfoRespVO; +import com.win.module.system.convert.auth.AuthConvert; +import com.win.module.system.dal.dataobject.permission.MenuDO; +import com.win.module.system.dal.dataobject.permission.RoleDO; +import com.win.module.system.dal.dataobject.user.AdminUserDO; +import com.win.module.system.enums.logger.LoginLogTypeEnum; +import com.win.module.system.service.auth.AdminAuthService; +import com.win.module.system.service.permission.MenuService; +import com.win.module.system.service.permission.PermissionService; +import com.win.module.system.service.permission.RoleService; +import com.win.module.system.service.user.AdminUserService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.annotation.security.PermitAll; +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; +import java.util.List; +import java.util.Set; + +import static com.win.framework.common.pojo.CommonResult.success; +import static com.win.framework.common.util.collection.CollectionUtils.convertSet; +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; +import static com.win.framework.security.core.util.SecurityFrameworkUtils.obtainAuthorization; + +@Tag(name = "管理后台 - 认证") +@RestController +@RequestMapping("/system/auth") +@Validated +@Slf4j +public class AuthController { + + @Resource + private AdminAuthService authService; + @Resource + private AdminUserService userService; + @Resource + private RoleService roleService; + @Resource + private MenuService menuService; + @Resource + private PermissionService permissionService; + + @Resource + private SecurityProperties securityProperties; + + @PostMapping("/login") + @PermitAll + @Operation(summary = "使用账号密码登录") + @OperateLog(enable = false) // 避免 Post 请求被记录操作日志 + public CommonResult login(@RequestBody @Valid AuthLoginReqVO reqVO) { + return success(authService.login(reqVO)); + } + + @PostMapping("/logout") + @PermitAll + @Operation(summary = "登出系统") + @OperateLog(enable = false) // 避免 Post 请求被记录操作日志 + public CommonResult logout(HttpServletRequest request) { + String token = obtainAuthorization(request, securityProperties.getTokenHeader()); + if (StrUtil.isNotBlank(token)) { + authService.logout(token, LoginLogTypeEnum.LOGOUT_SELF.getType()); + } + return success(true); + } + + @PostMapping("/refresh-token") + @PermitAll + @Operation(summary = "刷新令牌") + @Parameter(name = "refreshToken", description = "刷新令牌", required = true) + @OperateLog(enable = false) // 避免 Post 请求被记录操作日志 + public CommonResult refreshToken(@RequestParam("refreshToken") String refreshToken) { + return success(authService.refreshToken(refreshToken)); + } + + @GetMapping("/get-permission-info") + @Operation(summary = "获取登录用户的权限信息") + public CommonResult getPermissionInfo() { + // 1.1 获得用户信息 + AdminUserDO user = userService.getUser(getLoginUserId()); + if (user == null) { + return null; + } + + // 1.2 获得角色列表 + Set roleIds = permissionService.getUserRoleIdListByUserId(getLoginUserId()); + List roles = roleService.getRoleList(roleIds); + roles.removeIf(role -> !CommonStatusEnum.ENABLE.getStatus().equals(role.getStatus())); // 移除禁用的角色 + + // 1.3 获得菜单列表 + Set menuIds = permissionService.getRoleMenuListByRoleId(convertSet(roles, RoleDO::getId)); + List menuList = menuService.getMenuList(menuIds); + menuList.removeIf(menu -> !CommonStatusEnum.ENABLE.getStatus().equals(menu.getStatus())); // 移除禁用的菜单 + + // 2. 拼接结果返回 + return success(AuthConvert.INSTANCE.convert(user, roles, menuList)); + } + +} \ No newline at end of file diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/auth/vo/AuthLoginReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/auth/vo/AuthLoginReqVO.java new file mode 100644 index 0000000..9b5c589 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/auth/vo/AuthLoginReqVO.java @@ -0,0 +1,46 @@ +package com.win.module.system.controller.auth.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.Pattern; + +@Schema(description = "管理后台 - 账号密码登录 Request VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class AuthLoginReqVO { + + @Schema(description = "账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "winyuanma") + @NotEmpty(message = "登录账号不能为空") + @Length(min = 4, max = 16, message = "账号长度为 4-16 位") + @Pattern(regexp = "^[A-Za-z0-9]+$", message = "账号格式为数字以及字母") + private String username; + + @Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "buzhidao") + @NotEmpty(message = "密码不能为空") + @Length(min = 4, max = 16, message = "密码长度为 4-16 位") + private String password; + + // ========== 验证码相关 ========== + + /** + * 验证码 + */ + @Schema(description = "验证码", requiredMode = Schema.RequiredMode.REQUIRED, example = "12") + @NotEmpty(message = "验证码不能为空") + private String code; + + /** + * 唯一标识 + */ + @NotEmpty(message = "uuid不能为空") + private String uuid; + +} \ No newline at end of file diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/auth/vo/AuthLoginRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/auth/vo/AuthLoginRespVO.java new file mode 100644 index 0000000..cbafb14 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/auth/vo/AuthLoginRespVO.java @@ -0,0 +1,30 @@ +package com.win.module.system.controller.auth.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 登录 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class AuthLoginRespVO { + + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long userId; + + @Schema(description = "访问令牌", requiredMode = Schema.RequiredMode.REQUIRED, example = "happy") + private String accessToken; + + @Schema(description = "刷新令牌", requiredMode = Schema.RequiredMode.REQUIRED, example = "nice") + private String refreshToken; + + @Schema(description = "过期时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime expiresTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/auth/vo/AuthMenuRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/auth/vo/AuthMenuRespVO.java new file mode 100644 index 0000000..5843032 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/auth/vo/AuthMenuRespVO.java @@ -0,0 +1,53 @@ +package com.win.module.system.controller.auth.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Schema(description = "管理后台 - 登录用户的菜单信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class AuthMenuRespVO { + + @Schema(description = "菜单名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "闻荫") + private Long id; + + @Schema(description = "父菜单 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long parentId; + + @Schema(description = "菜单名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "闻荫") + private String name; + + @Schema(description = "路由地址,仅菜单类型为菜单或者目录时,才需要传", example = "post") + private String path; + + @Schema(description = "组件路径,仅菜单类型为菜单时,才需要传", example = "system/post/index") + private String component; + + @Schema(description = "组件名", example = "SystemUser") + private String componentName; + + @Schema(description = "菜单图标,仅菜单类型为菜单或者目录时,才需要传", example = "/menu/list") + private String icon; + + @Schema(description = "是否可见", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") + private Boolean visible; + + @Schema(description = "是否缓存", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") + private Boolean keepAlive; + + @Schema(description = "是否总是显示", example = "false") + private Boolean alwaysShow; + + /** + * 子路由 + */ + private List children; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/auth/vo/AuthPermissionInfoRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/auth/vo/AuthPermissionInfoRespVO.java new file mode 100644 index 0000000..5e5921d --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/auth/vo/AuthPermissionInfoRespVO.java @@ -0,0 +1,93 @@ +package com.win.module.system.controller.auth.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; +import java.util.Set; + +@Schema(description = "管理后台 - 登录用户的权限信息 Response VO,额外包括用户信息和角色列表") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class AuthPermissionInfoRespVO { + + @Schema(description = "用户信息", requiredMode = Schema.RequiredMode.REQUIRED) + private UserVO user; + + @Schema(description = "角色标识数组", requiredMode = Schema.RequiredMode.REQUIRED) + private Set roles; + + @Schema(description = "操作权限数组", requiredMode = Schema.RequiredMode.REQUIRED) + private Set permissions; + + @Schema(description = "菜单树", requiredMode = Schema.RequiredMode.REQUIRED) + private List menus; + + @Schema(description = "用户信息 VO") + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + public static class UserVO { + + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "闻荫源码") + private String nickname; + + @Schema(description = "用户头像", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/xx.jpg") + private String avatar; + + } + + @Schema(description = "管理后台 - 登录用户的菜单信息 Response VO") + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + public static class MenuVO { + + @Schema(description = "菜单名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "闻荫") + private Long id; + + @Schema(description = "父菜单 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long parentId; + + @Schema(description = "菜单名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "闻荫") + private String name; + + @Schema(description = "路由地址,仅菜单类型为菜单或者目录时,才需要传", example = "post") + private String path; + + @Schema(description = "组件路径,仅菜单类型为菜单时,才需要传", example = "system/post/index") + private String component; + + @Schema(description = "组件名", example = "SystemUser") + private String componentName; + + @Schema(description = "菜单图标,仅菜单类型为菜单或者目录时,才需要传", example = "/menu/list") + private String icon; + + @Schema(description = "是否可见", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") + private Boolean visible; + + @Schema(description = "是否缓存", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") + private Boolean keepAlive; + + @Schema(description = "是否总是显示", example = "false") + private Boolean alwaysShow; + + /** + * 子路由 + */ + private List children; + + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/auth/vo/AuthSmsLoginReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/auth/vo/AuthSmsLoginReqVO.java new file mode 100644 index 0000000..1962d55 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/auth/vo/AuthSmsLoginReqVO.java @@ -0,0 +1,28 @@ +package com.win.module.system.controller.auth.vo; + +import com.win.framework.common.validation.Mobile; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotEmpty; + +@Schema(description = "管理后台 - 短信验证码的登录 Request VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class AuthSmsLoginReqVO { + + @Schema(description = "手机号", requiredMode = Schema.RequiredMode.REQUIRED, example = "winyuanma") + @NotEmpty(message = "手机号不能为空") + @Mobile + private String mobile; + + @Schema(description = "短信验证码", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotEmpty(message = "验证码不能为空") + private String code; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/auth/vo/AuthSmsSendReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/auth/vo/AuthSmsSendReqVO.java new file mode 100644 index 0000000..0d1317b --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/auth/vo/AuthSmsSendReqVO.java @@ -0,0 +1,32 @@ +package com.win.module.system.controller.auth.vo; + +import com.win.framework.common.validation.InEnum; +import com.win.framework.common.validation.Mobile; +import com.win.module.system.enums.sms.SmsSceneEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 发送手机验证码 Request VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class AuthSmsSendReqVO { + + @Schema(description = "手机号", requiredMode = Schema.RequiredMode.REQUIRED, example = "winyuanma") + @NotEmpty(message = "手机号不能为空") + @Mobile + private String mobile; + + @Schema(description = "短信场景", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "发送场景不能为空") + @InEnum(SmsSceneEnum.class) + private Integer scene; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/captcha/CaptchaController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/captcha/CaptchaController.java new file mode 100644 index 0000000..aff90d9 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/captcha/CaptchaController.java @@ -0,0 +1,87 @@ +package com.win.module.system.controller.captcha; + +import cn.hutool.core.codec.Base64; +import cn.hutool.core.util.IdUtil; +import com.google.code.kaptcha.Producer; +import com.win.framework.captcha.config.CaptchaProperties; +import com.win.framework.captcha.enums.CaptchaRedisKeyConstants; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.redis.util.RedisCache; +import com.win.module.system.enums.ErrorCodeConstants; +import org.springframework.util.FastByteArrayOutputStream; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.annotation.security.PermitAll; +import javax.imageio.ImageIO; +import javax.servlet.http.HttpServletResponse; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +import static com.win.framework.common.pojo.CommonResult.error; +import static com.win.framework.common.pojo.CommonResult.success; + +/** + * 验证码操作处理 + * + * @author win + */ +@RestController +@RequestMapping("/system/captcha") +public class CaptchaController { + @Resource(name = "captchaProducer") + private Producer captchaProducer; + @Resource + private RedisCache redisCache; + @Resource(name = "captchaProducerMath") + private Producer captchaProducerMath; + @Resource + private CaptchaProperties captchaProperties; + + /** + * 生成验证码 + */ + @PermitAll + @GetMapping("/captchaImage") + public CommonResult getCode(HttpServletResponse response) throws IOException { + Map data = new HashMap<>(); + boolean captchaEnabled = captchaProperties.getEnable(); + data.put("captchaEnabled", captchaEnabled); + if (!captchaEnabled) { + return success(data); + } + // 保存验证码信息 + String uuid = IdUtil.simpleUUID(); + String verifyKey = CaptchaRedisKeyConstants.CAPTCHA_CODE_KEY + uuid; + String capStr; + String code = null; + BufferedImage image = null; + // 生成验证码 + String captchaType = captchaProperties.getCaptchaType(); + if ("math".equals(captchaType)) { + String capText = captchaProducerMath.createText(); + capStr = capText.substring(0, capText.lastIndexOf("@")); + code = capText.substring(capText.lastIndexOf("@") + 1); + image = captchaProducerMath.createImage(capStr); + } else if ("char".equals(captchaType)) { + capStr = code = captchaProducer.createText(); + image = captchaProducer.createImage(capStr); + } + redisCache.setCacheObject(verifyKey, code, captchaProperties.getCaptchaExpiration(), TimeUnit.MINUTES); + // 转换流信息写出 + FastByteArrayOutputStream os = new FastByteArrayOutputStream(); + try { + ImageIO.write(image, "jpg", os); + } catch (IOException e) { + return error(ErrorCodeConstants.GENERATE_IMAGE_ERROR); + } + data.put("uuid", uuid); + data.put("img", Base64.encode(os.toByteArray())); + return success(data); + } +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/DeptController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/DeptController.java new file mode 100644 index 0000000..1465646 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/DeptController.java @@ -0,0 +1,86 @@ +package com.win.module.system.controller.dept; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.pojo.CommonResult; +import com.win.module.system.controller.dept.vo.dept.*; +import com.win.module.system.convert.dept.DeptConvert; +import com.win.module.system.dal.dataobject.dept.DeptDO; +import com.win.module.system.service.dept.DeptService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.Comparator; +import java.util.List; + +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 部门") +@RestController +@RequestMapping("/system/dept") +@Validated +public class DeptController { + + @Resource + private DeptService deptService; + + @PostMapping("create") + @Operation(summary = "创建部门") + @PreAuthorize("@ss.hasPermission('system:dept:create')") + public CommonResult createDept(@Valid @RequestBody DeptCreateReqVO reqVO) { + Long deptId = deptService.createDept(reqVO); + return success(deptId); + } + + @PutMapping("update") + @Operation(summary = "更新部门") + @PreAuthorize("@ss.hasPermission('system:dept:update')") + public CommonResult updateDept(@Valid @RequestBody DeptUpdateReqVO reqVO) { + deptService.updateDept(reqVO); + return success(true); + } + + @DeleteMapping("delete") + @Operation(summary = "删除部门") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:dept:delete')") + public CommonResult deleteDept(@RequestParam("id") Long id) { + deptService.deleteDept(id); + return success(true); + } + + @GetMapping("/list") + @Operation(summary = "获取部门列表") + @PreAuthorize("@ss.hasPermission('system:dept:query')") + public CommonResult> getDeptList(DeptListReqVO reqVO) { + List list = deptService.getDeptList(reqVO); + list.sort(Comparator.comparing(DeptDO::getSort)); + return success(DeptConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/list-all-simple") + @Operation(summary = "获取部门精简信息列表", description = "只包含被开启的部门,主要用于前端的下拉选项") + public CommonResult> getSimpleDeptList() { + // 获得部门列表,只要开启状态的 + DeptListReqVO reqVO = new DeptListReqVO(); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + List list = deptService.getDeptList(reqVO); + // 排序后,返回给前端 + list.sort(Comparator.comparing(DeptDO::getSort)); + return success(DeptConvert.INSTANCE.convertList02(list)); + } + + @GetMapping("/get") + @Operation(summary = "获得部门信息") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:dept:query')") + public CommonResult getDept(@RequestParam("id") Long id) { + return success(DeptConvert.INSTANCE.convert(deptService.getDept(id))); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/PostController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/PostController.java new file mode 100644 index 0000000..c307f30 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/PostController.java @@ -0,0 +1,99 @@ +package com.win.module.system.controller.dept; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.excel.core.util.ExcelUtils; +import com.win.framework.operatelog.core.annotations.OperateLog; +import com.win.module.system.controller.dept.vo.post.*; +import com.win.module.system.convert.dept.PostConvert; +import com.win.module.system.dal.dataobject.dept.PostDO; +import com.win.module.system.service.dept.PostService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +import static com.win.framework.common.pojo.CommonResult.success; +import static com.win.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 岗位") +@RestController +@RequestMapping("/system/post") +@Validated +public class PostController { + + @Resource + private PostService postService; + + @PostMapping("/create") + @Operation(summary = "创建岗位") + @PreAuthorize("@ss.hasPermission('system:post:create')") + public CommonResult createPost(@Valid @RequestBody PostCreateReqVO reqVO) { + Long postId = postService.createPost(reqVO); + return success(postId); + } + + @PutMapping("/update") + @Operation(summary = "修改岗位") + @PreAuthorize("@ss.hasPermission('system:post:update')") + public CommonResult updatePost(@Valid @RequestBody PostUpdateReqVO reqVO) { + postService.updatePost(reqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除岗位") + @PreAuthorize("@ss.hasPermission('system:post:delete')") + public CommonResult deletePost(@RequestParam("id") Long id) { + postService.deletePost(id); + return success(true); + } + + @GetMapping(value = "/get") + @Operation(summary = "获得岗位信息") + @Parameter(name = "id", description = "岗位编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:post:query')") + public CommonResult getPost(@RequestParam("id") Long id) { + return success(PostConvert.INSTANCE.convert(postService.getPost(id))); + } + + @GetMapping("/list-all-simple") + @Operation(summary = "获取岗位精简信息列表", description = "只包含被开启的岗位,主要用于前端的下拉选项") + public CommonResult> getSimplePostList() { + // 获得岗位列表,只要开启状态的 + List list = postService.getPostList(null, Collections.singleton(CommonStatusEnum.ENABLE.getStatus())); + // 排序后,返回给前端 + list.sort(Comparator.comparing(PostDO::getSort)); + return success(PostConvert.INSTANCE.convertList02(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得岗位分页列表") + @PreAuthorize("@ss.hasPermission('system:post:query')") + public CommonResult> getPostPage(@Validated PostPageReqVO reqVO) { + return success(PostConvert.INSTANCE.convertPage(postService.getPostPage(reqVO))); + } + + @GetMapping("/export") + @Operation(summary = "岗位管理") + @PreAuthorize("@ss.hasPermission('system:post:export')") + @OperateLog(type = EXPORT) + public void export(HttpServletResponse response, @Validated PostExportReqVO reqVO) throws IOException { + List posts = postService.getPostList(reqVO); + List data = PostConvert.INSTANCE.convertList03(posts); + // 输出 + ExcelUtils.write(response, "岗位数据.xls", "岗位列表", PostExcelVO.class, data); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/dept/DeptBaseVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/dept/DeptBaseVO.java new file mode 100644 index 0000000..d91abbe --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/dept/DeptBaseVO.java @@ -0,0 +1,47 @@ +package com.win.module.system.controller.dept.vo.dept; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.Email; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +/** + * 部门 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class DeptBaseVO { + + @Schema(description = "菜单名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "闻荫") + @NotBlank(message = "部门名称不能为空") + @Size(max = 30, message = "部门名称长度不能超过30个字符") + private String name; + + @Schema(description = "父菜单 ID", example = "1024") + private Long parentId; + + @Schema(description = "显示顺序不能为空", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "显示顺序不能为空") + private Integer sort; + + @Schema(description = "负责人的用户编号", example = "2048") + private Long leaderUserId; + + @Schema(description = "联系电话", example = "15601691000") + @Size(max = 11, message = "联系电话长度不能超过11个字符") + private String phone; + + @Schema(description = "邮箱", example = "win@iocoder.cn") + @Email(message = "邮箱格式不正确") + @Size(max = 50, message = "邮箱长度不能超过50个字符") + private String email; + + @Schema(description = "状态,见 CommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "状态不能为空") +// @InEnum(value = CommonStatusEnum.class, message = "修改状态必须是 {value}") + private Integer status; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/dept/DeptCreateReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/dept/DeptCreateReqVO.java new file mode 100644 index 0000000..a9237b3 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/dept/DeptCreateReqVO.java @@ -0,0 +1,12 @@ +package com.win.module.system.controller.dept.vo.dept; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Schema(description = "管理后台 - 部门创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeptCreateReqVO extends DeptBaseVO { +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/dept/DeptListReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/dept/DeptListReqVO.java new file mode 100644 index 0000000..7cd2f10 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/dept/DeptListReqVO.java @@ -0,0 +1,16 @@ +package com.win.module.system.controller.dept.vo.dept; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 部门列表 Request VO") +@Data +public class DeptListReqVO { + + @Schema(description = "部门名称,模糊匹配", example = "闻荫") + private String name; + + @Schema(description = "展示状态,参见 CommonStatusEnum 枚举类", example = "1") + private Integer status; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/dept/DeptRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/dept/DeptRespVO.java new file mode 100644 index 0000000..dfa16b2 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/dept/DeptRespVO.java @@ -0,0 +1,23 @@ +package com.win.module.system.controller.dept.vo.dept; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 部门信息 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class DeptRespVO extends DeptBaseVO { + + @Schema(description = "部门编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "状态,参见 CommonStatusEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer status; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "时间戳格式") + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/dept/DeptSimpleRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/dept/DeptSimpleRespVO.java new file mode 100644 index 0000000..18e753f --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/dept/DeptSimpleRespVO.java @@ -0,0 +1,23 @@ +package com.win.module.system.controller.dept.vo.dept; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Schema(description = "管理后台 - 部门精简信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class DeptSimpleRespVO { + + @Schema(description = "部门编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "部门名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "闻荫") + private String name; + + @Schema(description = "父部门 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long parentId; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/dept/DeptUpdateReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/dept/DeptUpdateReqVO.java new file mode 100644 index 0000000..b3d53a1 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/dept/DeptUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.win.module.system.controller.dept.vo.dept; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 部门更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class DeptUpdateReqVO extends DeptBaseVO { + + @Schema(description = "部门编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "部门编号不能为空") + private Long id; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/post/PostBaseVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/post/PostBaseVO.java new file mode 100644 index 0000000..3537106 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/post/PostBaseVO.java @@ -0,0 +1,36 @@ +package com.win.module.system.controller.dept.vo.post; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +/** + * 岗位 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class PostBaseVO { + + @Schema(description = "岗位名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "小博主") + @NotBlank(message = "岗位名称不能为空") + @Size(max = 50, message = "岗位名称长度不能超过50个字符") + private String name; + + @Schema(description = "岗位编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "win") + @NotBlank(message = "岗位编码不能为空") + @Size(max = 64, message = "岗位编码长度不能超过64个字符") + private String code; + + @Schema(description = "显示顺序不能为空", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "显示顺序不能为空") + private Integer sort; + + @Schema(description = "状态,参见 CommonStatusEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer status; + + @Schema(description = "备注", example = "快乐的备注") + private String remark; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/post/PostCreateReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/post/PostCreateReqVO.java new file mode 100644 index 0000000..15bc36b --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/post/PostCreateReqVO.java @@ -0,0 +1,11 @@ +package com.win.module.system.controller.dept.vo.post; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Schema(description = "管理后台 - 岗位创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class PostCreateReqVO extends PostBaseVO { +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/post/PostExcelVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/post/PostExcelVO.java new file mode 100644 index 0000000..ad77481 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/post/PostExcelVO.java @@ -0,0 +1,31 @@ +package com.win.module.system.controller.dept.vo.post; + +import com.win.framework.excel.core.annotations.DictFormat; +import com.win.framework.excel.core.convert.DictConvert; +import com.win.module.system.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +/** + * 岗位 Excel 导出响应 VO + */ +@Data +public class PostExcelVO { + + @ExcelProperty("岗位序号") + private Long id; + + @ExcelProperty("岗位编码") + private String code; + + @ExcelProperty("岗位名称") + private String name; + + @ExcelProperty("岗位排序") + private Integer sort; + + @ExcelProperty(value = "状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.COMMON_STATUS) + private String status; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/post/PostExportReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/post/PostExportReqVO.java new file mode 100644 index 0000000..9bdd98b --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/post/PostExportReqVO.java @@ -0,0 +1,19 @@ +package com.win.module.system.controller.dept.vo.post; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 岗位导出 Request VO,参数和 PostExcelVO 是一致的") +@Data +public class PostExportReqVO { + + @Schema(description = "岗位编码,模糊匹配", example = "win") + private String code; + + @Schema(description = "岗位名称,模糊匹配", example = "闻荫") + private String name; + + @Schema(description = "展示状态,参见 CommonStatusEnum 枚举类", example = "1") + private Integer status; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/post/PostListReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/post/PostListReqVO.java new file mode 100644 index 0000000..58ea2bc --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/post/PostListReqVO.java @@ -0,0 +1,18 @@ +package com.win.module.system.controller.dept.vo.post; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Schema(description = "管理后台 - 岗位列表 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class PostListReqVO extends PostBaseVO { + + @Schema(description = "岗位名称,模糊匹配", example = "闻荫") + private String name; + + @Schema(description = "展示状态,参见 CommonStatusEnum 枚举类", example = "1") + private Integer status; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/post/PostPageReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/post/PostPageReqVO.java new file mode 100644 index 0000000..b58c240 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/post/PostPageReqVO.java @@ -0,0 +1,22 @@ +package com.win.module.system.controller.dept.vo.post; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Schema(description = "管理后台 - 岗位分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class PostPageReqVO extends PageParam { + + @Schema(description = "岗位编码,模糊匹配", example = "win") + private String code; + + @Schema(description = "岗位名称,模糊匹配", example = "闻荫") + private String name; + + @Schema(description = "展示状态,参见 CommonStatusEnum 枚举类", example = "1") + private Integer status; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/post/PostRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/post/PostRespVO.java new file mode 100644 index 0000000..2798a35 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/post/PostRespVO.java @@ -0,0 +1,20 @@ +package com.win.module.system.controller.dept.vo.post; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 岗位信息 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class PostRespVO extends PostBaseVO { + + @Schema(description = "岗位序号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "时间戳格式") + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/post/PostSimpleRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/post/PostSimpleRespVO.java new file mode 100644 index 0000000..98ce3a9 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/post/PostSimpleRespVO.java @@ -0,0 +1,20 @@ +package com.win.module.system.controller.dept.vo.post; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Schema(description = "管理后台 - 岗位精简信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class PostSimpleRespVO { + + @Schema(description = "岗位编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "岗位名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "闻荫") + private String name; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/post/PostUpdateReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/post/PostUpdateReqVO.java new file mode 100644 index 0000000..5b1c487 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/post/PostUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.win.module.system.controller.dept.vo.post; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 岗位更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class PostUpdateReqVO extends PostBaseVO { + + @Schema(description = "岗位编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "岗位编号不能为空") + private Long id; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/DictDataController.http b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/DictDataController.http new file mode 100644 index 0000000..f524315 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/DictDataController.http @@ -0,0 +1,4 @@ +### 请求 /menu/list 接口 => 成功 +GET {{baseUrl}}/system/dict-data/list-all-simple +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/DictDataController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/DictDataController.java new file mode 100644 index 0000000..84768ea --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/DictDataController.java @@ -0,0 +1,95 @@ +package com.win.module.system.controller.dict; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.excel.core.util.ExcelUtils; +import com.win.framework.operatelog.core.annotations.OperateLog; +import com.win.module.system.controller.dict.vo.data.*; +import com.win.module.system.convert.dict.DictDataConvert; +import com.win.module.system.dal.dataobject.dict.DictDataDO; +import com.win.module.system.service.dict.DictDataService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static com.win.framework.common.pojo.CommonResult.success; +import static com.win.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 字典数据") +@RestController +@RequestMapping("/system/dict-data") +@Validated +public class DictDataController { + + @Resource + private DictDataService dictDataService; + + @PostMapping("/create") + @Operation(summary = "新增字典数据") + @PreAuthorize("@ss.hasPermission('system:dict:create')") + public CommonResult createDictData(@Valid @RequestBody DictDataCreateReqVO reqVO) { + Long dictDataId = dictDataService.createDictData(reqVO); + return success(dictDataId); + } + + @PutMapping("/update") + @Operation(summary = "修改字典数据") + @PreAuthorize("@ss.hasPermission('system:dict:update')") + public CommonResult updateDictData(@Valid @RequestBody DictDataUpdateReqVO reqVO) { + dictDataService.updateDictData(reqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除字典数据") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:dict:delete')") + public CommonResult deleteDictData(Long id) { + dictDataService.deleteDictData(id); + return success(true); + } + + @GetMapping("/list-all-simple") + @Operation(summary = "获得全部字典数据列表", description = "一般用于管理后台缓存字典数据在本地") + // 无需添加权限认证,因为前端全局都需要 + public CommonResult> getSimpleDictDataList() { + List list = dictDataService.getDictDataList(); + return success(DictDataConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "/获得字典类型的分页列表") + @PreAuthorize("@ss.hasPermission('system:dict:query')") + public CommonResult> getDictTypePage(@Valid DictDataPageReqVO reqVO) { + return success(DictDataConvert.INSTANCE.convertPage(dictDataService.getDictDataPage(reqVO))); + } + + @GetMapping(value = "/get") + @Operation(summary = "/查询字典数据详细") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:dict:query')") + public CommonResult getDictData(@RequestParam("id") Long id) { + return success(DictDataConvert.INSTANCE.convert(dictDataService.getDictData(id))); + } + + @GetMapping("/export") + @Operation(summary = "导出字典数据") + @PreAuthorize("@ss.hasPermission('system:dict:export')") + @OperateLog(type = EXPORT) + public void export(HttpServletResponse response, @Valid DictDataExportReqVO reqVO) throws IOException { + List list = dictDataService.getDictDataList(reqVO); + List data = DictDataConvert.INSTANCE.convertList02(list); + // 输出 + ExcelUtils.write(response, "字典数据.xls", "数据列表", DictDataExcelVO.class, data); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/DictTypeController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/DictTypeController.java new file mode 100644 index 0000000..1581af2 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/DictTypeController.java @@ -0,0 +1,95 @@ +package com.win.module.system.controller.dict; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.excel.core.util.ExcelUtils; +import com.win.framework.operatelog.core.annotations.OperateLog; +import com.win.module.system.controller.dict.vo.type.*; +import com.win.module.system.convert.dict.DictTypeConvert; +import com.win.module.system.dal.dataobject.dict.DictTypeDO; +import com.win.module.system.service.dict.DictTypeService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static com.win.framework.common.pojo.CommonResult.success; +import static com.win.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 字典类型") +@RestController +@RequestMapping("/system/dict-type") +@Validated +public class DictTypeController { + + @Resource + private DictTypeService dictTypeService; + + @PostMapping("/create") + @Operation(summary = "创建字典类型") + @PreAuthorize("@ss.hasPermission('system:dict:create')") + public CommonResult createDictType(@Valid @RequestBody DictTypeCreateReqVO reqVO) { + Long dictTypeId = dictTypeService.createDictType(reqVO); + return success(dictTypeId); + } + + @PutMapping("/update") + @Operation(summary = "修改字典类型") + @PreAuthorize("@ss.hasPermission('system:dict:update')") + public CommonResult updateDictType(@Valid @RequestBody DictTypeUpdateReqVO reqVO) { + dictTypeService.updateDictType(reqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除字典类型") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:dict:delete')") + public CommonResult deleteDictType(Long id) { + dictTypeService.deleteDictType(id); + return success(true); + } + + @Operation(summary = "/获得字典类型的分页列表") + @GetMapping("/page") + @PreAuthorize("@ss.hasPermission('system:dict:query')") + public CommonResult> pageDictTypes(@Valid DictTypePageReqVO reqVO) { + return success(DictTypeConvert.INSTANCE.convertPage(dictTypeService.getDictTypePage(reqVO))); + } + + @Operation(summary = "/查询字典类型详细") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @GetMapping(value = "/get") + @PreAuthorize("@ss.hasPermission('system:dict:query')") + public CommonResult getDictType(@RequestParam("id") Long id) { + return success(DictTypeConvert.INSTANCE.convert(dictTypeService.getDictType(id))); + } + + @GetMapping("/list-all-simple") + @Operation(summary = "获得全部字典类型列表", description = "包括开启 + 禁用的字典类型,主要用于前端的下拉选项") + // 无需添加权限认证,因为前端全局都需要 + public CommonResult> getSimpleDictTypeList() { + List list = dictTypeService.getDictTypeList(); + return success(DictTypeConvert.INSTANCE.convertList(list)); + } + + @Operation(summary = "导出数据类型") + @GetMapping("/export") + @PreAuthorize("@ss.hasPermission('system:dict:query')") + @OperateLog(type = EXPORT) + public void export(HttpServletResponse response, @Valid DictTypeExportReqVO reqVO) throws IOException { + List list = dictTypeService.getDictTypeList(reqVO); + List data = DictTypeConvert.INSTANCE.convertList02(list); + // 输出 + ExcelUtils.write(response, "字典类型.xls", "类型列表", DictTypeExcelVO.class, data); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/data/DictDataBaseVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/data/DictDataBaseVO.java new file mode 100644 index 0000000..ff888e8 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/data/DictDataBaseVO.java @@ -0,0 +1,49 @@ +package com.win.module.system.controller.dict.vo.data; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +/** + * 字典数据 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class DictDataBaseVO { + + @Schema(description = "显示顺序不能为空", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "显示顺序不能为空") + private Integer sort; + + @Schema(description = "字典标签", requiredMode = Schema.RequiredMode.REQUIRED, example = "闻荫") + @NotBlank(message = "字典标签不能为空") + @Size(max = 100, message = "字典标签长度不能超过100个字符") + private String label; + + @Schema(description = "字典值", requiredMode = Schema.RequiredMode.REQUIRED, example = "iocoder") + @NotBlank(message = "字典键值不能为空") + @Size(max = 100, message = "字典键值长度不能超过100个字符") + private String value; + + @Schema(description = "字典类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "sys_common_sex") + @NotBlank(message = "字典类型不能为空") + @Size(max = 100, message = "字典类型长度不能超过100个字符") + private String dictType; + + @Schema(description = "状态,见 CommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "状态不能为空") +// @InEnum(value = CommonStatusEnum.class, message = "修改状态必须是 {value}") + private Integer status; + + @Schema(description = "颜色类型,default、primary、success、info、warning、danger", example = "default") + private String colorType; + @Schema(description = "css 样式", example = "btn-visible") + private String cssClass; + + @Schema(description = "备注", example = "我是一个角色") + private String remark; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/data/DictDataCreateReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/data/DictDataCreateReqVO.java new file mode 100644 index 0000000..e58e43a --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/data/DictDataCreateReqVO.java @@ -0,0 +1,12 @@ +package com.win.module.system.controller.dict.vo.data; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Schema(description = "管理后台 - 字典数据创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class DictDataCreateReqVO extends DictDataBaseVO { + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/data/DictDataExcelVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/data/DictDataExcelVO.java new file mode 100644 index 0000000..a84dcae --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/data/DictDataExcelVO.java @@ -0,0 +1,34 @@ +package com.win.module.system.controller.dict.vo.data; + +import com.win.framework.excel.core.annotations.DictFormat; +import com.win.framework.excel.core.convert.DictConvert; +import com.win.module.system.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +/** + * 字典数据 Excel 导出响应 VO + */ +@Data +public class DictDataExcelVO { + + @ExcelProperty("字典编码") + private Long id; + + @ExcelProperty("字典排序") + private Integer sort; + + @ExcelProperty("字典标签") + private String label; + + @ExcelProperty("字典键值") + private String value; + + @ExcelProperty("字典类型") + private String dictType; + + @ExcelProperty(value = "状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.COMMON_STATUS) + private Integer status; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/data/DictDataExportReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/data/DictDataExportReqVO.java new file mode 100644 index 0000000..8c621f4 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/data/DictDataExportReqVO.java @@ -0,0 +1,23 @@ +package com.win.module.system.controller.dict.vo.data; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.Size; + +@Schema(description = "管理后台 - 字典类型导出 Request VO") +@Data +public class DictDataExportReqVO { + + @Schema(description = "字典标签", example = "闻荫") + @Size(max = 100, message = "字典标签长度不能超过100个字符") + private String label; + + @Schema(description = "字典类型,模糊匹配", example = "sys_common_sex") + @Size(max = 100, message = "字典类型类型长度不能超过100个字符") + private String dictType; + + @Schema(description = "展示状态,参见 CommonStatusEnum 枚举类", example = "1") + private Integer status; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/data/DictDataPageReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/data/DictDataPageReqVO.java new file mode 100644 index 0000000..e67a52d --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/data/DictDataPageReqVO.java @@ -0,0 +1,26 @@ +package com.win.module.system.controller.dict.vo.data; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.Size; + +@Schema(description = "管理后台 - 字典类型分页列表 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class DictDataPageReqVO extends PageParam { + + @Schema(description = "字典标签", example = "闻荫") + @Size(max = 100, message = "字典标签长度不能超过100个字符") + private String label; + + @Schema(description = "字典类型,模糊匹配", example = "sys_common_sex") + @Size(max = 100, message = "字典类型类型长度不能超过100个字符") + private String dictType; + + @Schema(description = "展示状态,参见 CommonStatusEnum 枚举类", example = "1") + private Integer status; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/data/DictDataRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/data/DictDataRespVO.java new file mode 100644 index 0000000..85cec29 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/data/DictDataRespVO.java @@ -0,0 +1,24 @@ +package com.win.module.system.controller.dict.vo.data; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 字典数据信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class DictDataRespVO extends DictDataBaseVO { + + @Schema(description = "字典数据编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "时间戳格式") + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/data/DictDataSimpleRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/data/DictDataSimpleRespVO.java new file mode 100644 index 0000000..4b3b8bb --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/data/DictDataSimpleRespVO.java @@ -0,0 +1,25 @@ +package com.win.module.system.controller.dict.vo.data; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 数据字典精简 Response VO") +@Data +public class DictDataSimpleRespVO { + + @Schema(description = "字典类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "gender") + private String dictType; + + @Schema(description = "字典键值", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private String value; + + @Schema(description = "字典标签", requiredMode = Schema.RequiredMode.REQUIRED, example = "男") + private String label; + + @Schema(description = "颜色类型,default、primary、success、info、warning、danger", example = "default") + private String colorType; + + @Schema(description = "css 样式", example = "btn-visible") + private String cssClass; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/data/DictDataUpdateReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/data/DictDataUpdateReqVO.java new file mode 100644 index 0000000..188f039 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/data/DictDataUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.win.module.system.controller.dict.vo.data; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 字典数据更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class DictDataUpdateReqVO extends DictDataBaseVO { + + @Schema(description = "字典数据编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "字典数据编号不能为空") + private Long id; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/type/DictTypeBaseVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/type/DictTypeBaseVO.java new file mode 100644 index 0000000..4576eb3 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/type/DictTypeBaseVO.java @@ -0,0 +1,29 @@ +package com.win.module.system.controller.dict.vo.type; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +/** + * 字典类型 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class DictTypeBaseVO { + + @Schema(description = "字典名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "性别") + @NotBlank(message = "字典名称不能为空") + @Size(max = 100, message = "字典类型名称长度不能超过100个字符") + private String name; + + @Schema(description = "状态,参见 CommonStatusEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "状态不能为空") + private Integer status; + + @Schema(description = "备注", example = "快乐的备注") + private String remark; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/type/DictTypeCreateReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/type/DictTypeCreateReqVO.java new file mode 100644 index 0000000..6f346d0 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/type/DictTypeCreateReqVO.java @@ -0,0 +1,20 @@ +package com.win.module.system.controller.dict.vo.type; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +@Schema(description = "管理后台 - 字典类型创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class DictTypeCreateReqVO extends DictTypeBaseVO { + + @Schema(description = "字典类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "sys_common_sex") + @NotNull(message = "字典类型不能为空") + @Size(max = 100, message = "字典类型类型长度不能超过100个字符") + private String type; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/type/DictTypeExcelVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/type/DictTypeExcelVO.java new file mode 100644 index 0000000..3203a43 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/type/DictTypeExcelVO.java @@ -0,0 +1,28 @@ +package com.win.module.system.controller.dict.vo.type; + +import com.win.framework.excel.core.annotations.DictFormat; +import com.win.framework.excel.core.convert.DictConvert; +import com.win.module.system.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +/** + * 字典类型 Excel 导出响应 VO + */ +@Data +public class DictTypeExcelVO { + + @ExcelProperty("字典主键") + private Long id; + + @ExcelProperty("字典名称") + private String name; + + @ExcelProperty("字典类型") + private String type; + + @ExcelProperty(value = "状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.COMMON_STATUS) + private Integer status; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/type/DictTypeExportReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/type/DictTypeExportReqVO.java new file mode 100644 index 0000000..134d940 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/type/DictTypeExportReqVO.java @@ -0,0 +1,28 @@ +package com.win.module.system.controller.dict.vo.type; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 字典类型分页列表 Request VO") +@Data +public class DictTypeExportReqVO { + + @Schema(description = "字典类型名称,模糊匹配", example = "闻荫") + private String name; + + @Schema(description = "字典类型,模糊匹配", example = "sys_common_sex") + private String type; + + @Schema(description = "展示状态,参见 CommonStatusEnum 枚举类", example = "1") + private Integer status; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @Schema(description = "创建时间") + private LocalDateTime[] createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/type/DictTypePageReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/type/DictTypePageReqVO.java new file mode 100644 index 0000000..39fc03d --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/type/DictTypePageReqVO.java @@ -0,0 +1,33 @@ +package com.win.module.system.controller.dict.vo.type; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.Size; +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 字典类型分页列表 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class DictTypePageReqVO extends PageParam { + + @Schema(description = "字典类型名称,模糊匹配", example = "闻荫") + private String name; + + @Schema(description = "字典类型,模糊匹配", example = "sys_common_sex") + @Size(max = 100, message = "字典类型类型长度不能超过100个字符") + private String type; + + @Schema(description = "展示状态,参见 CommonStatusEnum 枚举类", example = "1") + private Integer status; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @Schema(description = "创建时间") + private LocalDateTime[] createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/type/DictTypeRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/type/DictTypeRespVO.java new file mode 100644 index 0000000..81a5b02 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/type/DictTypeRespVO.java @@ -0,0 +1,27 @@ +package com.win.module.system.controller.dict.vo.type; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 字典类型信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class DictTypeRespVO extends DictTypeBaseVO { + + @Schema(description = "字典类型编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "字典类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "sys_common_sex") + private String type; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "时间戳格式") + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/type/DictTypeSimpleRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/type/DictTypeSimpleRespVO.java new file mode 100644 index 0000000..b481b1f --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/type/DictTypeSimpleRespVO.java @@ -0,0 +1,23 @@ +package com.win.module.system.controller.dict.vo.type; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Schema(description = "管理后台 - 字典类型精简信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class DictTypeSimpleRespVO { + + @Schema(description = "字典类型编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "字典类型名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "闻荫") + private String name; + + @Schema(description = "字典类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "sys_common_sex") + private String type; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/type/DictTypeUpdateReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/type/DictTypeUpdateReqVO.java new file mode 100644 index 0000000..4764cea --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/type/DictTypeUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.win.module.system.controller.dict.vo.type; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 字典类型更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class DictTypeUpdateReqVO extends DictTypeBaseVO { + + @Schema(description = "字典类型编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "字典类型编号不能为空") + private Long id; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/errorcode/ErrorCodeController.http b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/errorcode/ErrorCodeController.http new file mode 100644 index 0000000..06b8723 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/errorcode/ErrorCodeController.http @@ -0,0 +1,13 @@ +### 创建错误码 +POST {{baseUrl}}/inra/error-code/create +Authorization: Bearer {{token}} +Content-Type: application/json +tenant-id: {{adminTenentId}} + +{ + "code": 200, + "message": "成功", + "group": "test", + "type": 1 +} + diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/errorcode/ErrorCodeController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/errorcode/ErrorCodeController.java new file mode 100644 index 0000000..264cb12 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/errorcode/ErrorCodeController.java @@ -0,0 +1,89 @@ +package com.win.module.system.controller.errorcode; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.excel.core.util.ExcelUtils; +import com.win.framework.operatelog.core.annotations.OperateLog; +import com.win.module.system.controller.errorcode.vo.*; +import com.win.module.system.convert.errorcode.ErrorCodeConvert; +import com.win.module.system.dal.dataobject.errorcode.ErrorCodeDO; +import com.win.module.system.service.errorcode.ErrorCodeService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static com.win.framework.common.pojo.CommonResult.success; +import static com.win.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 错误码") +@RestController +@RequestMapping("/system/error-code") +@Validated +public class ErrorCodeController { + + @Resource + private ErrorCodeService errorCodeService; + + @PostMapping("/create") + @Operation(summary = "创建错误码") + @PreAuthorize("@ss.hasPermission('system:error-code:create')") + public CommonResult createErrorCode(@Valid @RequestBody ErrorCodeCreateReqVO createReqVO) { + return success(errorCodeService.createErrorCode(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新错误码") + @PreAuthorize("@ss.hasPermission('system:error-code:update')") + public CommonResult updateErrorCode(@Valid @RequestBody ErrorCodeUpdateReqVO updateReqVO) { + errorCodeService.updateErrorCode(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除错误码") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('system:error-code:delete')") + public CommonResult deleteErrorCode(@RequestParam("id") Long id) { + errorCodeService.deleteErrorCode(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得错误码") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:error-code:query')") + public CommonResult getErrorCode(@RequestParam("id") Long id) { + ErrorCodeDO errorCode = errorCodeService.getErrorCode(id); + return success(ErrorCodeConvert.INSTANCE.convert(errorCode)); + } + + @GetMapping("/page") + @Operation(summary = "获得错误码分页") + @PreAuthorize("@ss.hasPermission('system:error-code:query')") + public CommonResult> getErrorCodePage(@Valid ErrorCodePageReqVO pageVO) { + PageResult pageResult = errorCodeService.getErrorCodePage(pageVO); + return success(ErrorCodeConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出错误码 Excel") + @PreAuthorize("@ss.hasPermission('system:error-code:export')") + @OperateLog(type = EXPORT) + public void exportErrorCodeExcel(@Valid ErrorCodeExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = errorCodeService.getErrorCodeList(exportReqVO); + // 导出 Excel + List datas = ErrorCodeConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "错误码.xls", "数据", ErrorCodeExcelVO.class, datas); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/errorcode/vo/ErrorCodeBaseVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/errorcode/vo/ErrorCodeBaseVO.java new file mode 100644 index 0000000..3453685 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/errorcode/vo/ErrorCodeBaseVO.java @@ -0,0 +1,30 @@ +package com.win.module.system.controller.errorcode.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** +* 错误码 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class ErrorCodeBaseVO { + + @Schema(description = "应用名", requiredMode = Schema.RequiredMode.REQUIRED, example = "dashboard") + @NotNull(message = "应用名不能为空") + private String applicationName; + + @Schema(description = "错误码编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "1234") + @NotNull(message = "错误码编码不能为空") + private Integer code; + + @Schema(description = "错误码错误提示", requiredMode = Schema.RequiredMode.REQUIRED, example = "帅气") + @NotNull(message = "错误码错误提示不能为空") + private String message; + + @Schema(description = "备注", example = "哈哈哈") + private String memo; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/errorcode/vo/ErrorCodeCreateReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/errorcode/vo/ErrorCodeCreateReqVO.java new file mode 100644 index 0000000..4dbfc44 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/errorcode/vo/ErrorCodeCreateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.system.controller.errorcode.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Schema(description = "管理后台 - 错误码创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ErrorCodeCreateReqVO extends ErrorCodeBaseVO { + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/errorcode/vo/ErrorCodeExcelVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/errorcode/vo/ErrorCodeExcelVO.java new file mode 100644 index 0000000..a2df9b3 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/errorcode/vo/ErrorCodeExcelVO.java @@ -0,0 +1,40 @@ +package com.win.module.system.controller.errorcode.vo; + +import com.win.framework.excel.core.annotations.DictFormat; +import com.win.framework.excel.core.convert.DictConvert; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 错误码 Excel VO + * + * @author 闻荫源码 + */ +@Data +public class ErrorCodeExcelVO { + + @ExcelProperty("错误码编号") + private Long id; + + @ExcelProperty(value = "错误码类型", converter = DictConvert.class) + @DictFormat("inf_error_code_type") // TODO 芋艿:得思考下杂解决枚举值 + private Integer type; + + @ExcelProperty("应用名") + private String applicationName; + + @ExcelProperty("错误码编码") + private Integer code; + + @ExcelProperty("错误码错误提示") + private String message; + + @ExcelProperty("备注") + private String memo; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/errorcode/vo/ErrorCodeExportReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/errorcode/vo/ErrorCodeExportReqVO.java new file mode 100644 index 0000000..82a09c1 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/errorcode/vo/ErrorCodeExportReqVO.java @@ -0,0 +1,31 @@ +package com.win.module.system.controller.errorcode.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 错误码 Excel 导出 Request VO,参数和 InfErrorCodePageReqVO 是一致的") +@Data +public class ErrorCodeExportReqVO { + + @Schema(description = "错误码类型", example = "1") + private Integer type; + + @Schema(description = "应用名", example = "dashboard") + private String applicationName; + + @Schema(description = "错误码编码", example = "1234") + private Integer code; + + @Schema(description = "错误码错误提示", example = "帅气") + private String message; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @Schema(description = "创建时间") + private LocalDateTime[] createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/errorcode/vo/ErrorCodePageReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/errorcode/vo/ErrorCodePageReqVO.java new file mode 100644 index 0000000..be2e4bc --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/errorcode/vo/ErrorCodePageReqVO.java @@ -0,0 +1,36 @@ +package com.win.module.system.controller.errorcode.vo; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 错误码分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ErrorCodePageReqVO extends PageParam { + + @Schema(description = "错误码类型,参见 ErrorCodeTypeEnum 枚举类", example = "1") + private Integer type; + + @Schema(description = "应用名", example = "dashboard") + private String applicationName; + + @Schema(description = "错误码编码", example = "1234") + private Integer code; + + @Schema(description = "错误码错误提示", example = "帅气") + private String message; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @Schema(description = "创建时间") + private LocalDateTime[] createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/errorcode/vo/ErrorCodeRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/errorcode/vo/ErrorCodeRespVO.java new file mode 100644 index 0000000..edc1f31 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/errorcode/vo/ErrorCodeRespVO.java @@ -0,0 +1,25 @@ +package com.win.module.system.controller.errorcode.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 错误码 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ErrorCodeRespVO extends ErrorCodeBaseVO { + + @Schema(description = "错误码编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "错误码类型,参见 ErrorCodeTypeEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer type; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/errorcode/vo/ErrorCodeUpdateReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/errorcode/vo/ErrorCodeUpdateReqVO.java new file mode 100644 index 0000000..1153e1f --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/errorcode/vo/ErrorCodeUpdateReqVO.java @@ -0,0 +1,20 @@ +package com.win.module.system.controller.errorcode.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 错误码更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ErrorCodeUpdateReqVO extends ErrorCodeBaseVO { + + @Schema(description = "错误码编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "错误码编号不能为空") + private Long id; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/ip/AreaController.http b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/ip/AreaController.http new file mode 100644 index 0000000..f1b893d --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/ip/AreaController.http @@ -0,0 +1,5 @@ +### 获得地区树 +GET {{baseUrl}}/system/area/tree +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} + diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/ip/AreaController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/ip/AreaController.java new file mode 100644 index 0000000..5c32a1b --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/ip/AreaController.java @@ -0,0 +1,72 @@ +package com.win.module.system.controller.ip; + +import cn.hutool.core.lang.Assert; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.ip.core.Area; +import com.win.framework.ip.core.utils.AreaUtils; +import com.win.framework.ip.core.utils.IPUtils; +import com.win.module.system.controller.ip.vo.AreaNodeRespVO; +import com.win.module.system.controller.ip.vo.AreaNodeSimpleRespVO; +import com.win.module.system.convert.ip.AreaConvert; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 地区") +@RestController +@RequestMapping("/system/area") +@Validated +public class AreaController { + + @GetMapping("/tree") + @Operation(summary = "获得地区树") + public CommonResult> getAreaTree() { + Area area = AreaUtils.getArea(Area.ID_CHINA); + Assert.notNull(area, "获取不到中国"); + return success(AreaConvert.INSTANCE.convertList(area.getChildren())); + } + + @GetMapping("/get-children") + @Operation(summary = "获得地区的下级区域") + @Parameter(name = "id", description = "区域编号", required = true, example = "150000") + public CommonResult> getChildren(@RequestParam("id") Integer id) { + Area area = AreaUtils.getArea(id); + Assert.notNull(area, String.format("获取不到 id : %d 的区域", id)); + return success(AreaConvert.INSTANCE.convertList2(area.getChildren())); + } + + // 4)方法改成 getAreaChildrenList 获得子节点们;5)url 可以已改成 children-list + //@芋艿 是不是叫 getAreaListByIds 更合适。 因为不一定是子节点。 用于前端树选择获取缓存数据。 见 + @GetMapping("/get-by-ids") + @Operation(summary = "通过区域 ids 获得地区列表") + @Parameter(name = "ids", description = "区域编号 ids", required = true, example = "1,150000") + public CommonResult> getAreaListByIds(@RequestParam("ids") Set ids) { + List areaList = new ArrayList<>(ids.size()); + for (Integer areaId : ids) { + areaList.add(AreaUtils.getArea(areaId)); + } + return success(AreaConvert.INSTANCE.convertList2(areaList)); + } + + @GetMapping("/get-by-ip") + @Operation(summary = "获得 IP 对应的地区名") + @Parameter(name = "ip", description = "IP", required = true) + public CommonResult getAreaByIp(@RequestParam("ip") String ip) { + // 获得城市 + Area area = IPUtils.getArea(ip); + if (area == null) { + return success("未知"); + } + // 格式化返回 + return success(AreaUtils.format(area.getId())); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/ip/vo/AreaNodeRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/ip/vo/AreaNodeRespVO.java new file mode 100644 index 0000000..6baf9b3 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/ip/vo/AreaNodeRespVO.java @@ -0,0 +1,23 @@ +package com.win.module.system.controller.ip.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +@Schema(description = "管理后台 - 地区节点 Response VO") +@Data +public class AreaNodeRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "110000") + private Integer id; + + @Schema(description = "名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "北京") + private String name; + + /** + * 子节点 + */ + private List children; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/ip/vo/AreaNodeSimpleRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/ip/vo/AreaNodeSimpleRespVO.java new file mode 100644 index 0000000..02cf5e1 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/ip/vo/AreaNodeSimpleRespVO.java @@ -0,0 +1,19 @@ +package com.win.module.system.controller.ip.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 简洁的地区节点 Response VO") +@Data +public class AreaNodeSimpleRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "110000") + private Integer id; + + @Schema(description = "名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "北京") + private String name; + + @Schema(description = "是否叶子节点", example = "false") + private Boolean leaf; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/LoginLogController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/LoginLogController.java new file mode 100644 index 0000000..ef55856 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/LoginLogController.java @@ -0,0 +1,59 @@ +package com.win.module.system.controller.logger; + +import com.win.module.system.controller.logger.vo.loginlog.LoginLogExcelVO; +import com.win.module.system.controller.logger.vo.loginlog.LoginLogExportReqVO; +import com.win.module.system.controller.logger.vo.loginlog.LoginLogPageReqVO; +import com.win.module.system.controller.logger.vo.loginlog.LoginLogRespVO; +import com.win.module.system.dal.dataobject.logger.LoginLogDO; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.excel.core.util.ExcelUtils; +import com.win.framework.operatelog.core.annotations.OperateLog; +import com.win.module.system.convert.logger.LoginLogConvert; +import com.win.module.system.service.logger.LoginLogService; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static com.win.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 登录日志") +@RestController +@RequestMapping("/system/login-log") +@Validated +public class LoginLogController { + + @Resource + private LoginLogService loginLogService; + + @GetMapping("/page") + @Operation(summary = "获得登录日志分页列表") + @PreAuthorize("@ss.hasPermission('system:login-log:query')") + public CommonResult> getLoginLogPage(@Valid LoginLogPageReqVO reqVO) { + PageResult page = loginLogService.getLoginLogPage(reqVO); + return CommonResult.success(LoginLogConvert.INSTANCE.convertPage(page)); + } + + @GetMapping("/export") + @Operation(summary = "导出登录日志 Excel") + @PreAuthorize("@ss.hasPermission('system:login-log:export')") + @OperateLog(type = EXPORT) + public void exportLoginLog(HttpServletResponse response, @Valid LoginLogExportReqVO reqVO) throws IOException { + List list = loginLogService.getLoginLogList(reqVO); + // 拼接数据 + List data = LoginLogConvert.INSTANCE.convertList(list); + // 输出 + ExcelUtils.write(response, "登录日志.xls", "数据列表", LoginLogExcelVO.class, data); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/OperateLogController.http b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/OperateLogController.http new file mode 100644 index 0000000..f667482 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/OperateLogController.http @@ -0,0 +1,4 @@ +### 请求 /system/operate-log/demo 接口 => 成功 +GET {{baseUrl}}/system/operate-log/demo +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/OperateLogController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/OperateLogController.java new file mode 100644 index 0000000..4c3c6d8 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/OperateLogController.java @@ -0,0 +1,85 @@ +package com.win.module.system.controller.logger; + +import com.win.module.system.controller.logger.vo.operatelog.OperateLogExcelVO; +import com.win.module.system.controller.logger.vo.operatelog.OperateLogExportReqVO; +import com.win.module.system.controller.logger.vo.operatelog.OperateLogPageReqVO; +import com.win.module.system.controller.logger.vo.operatelog.OperateLogRespVO; +import com.win.module.system.convert.logger.OperateLogConvert; +import com.win.module.system.dal.dataobject.logger.OperateLogDO; +import com.win.module.system.dal.dataobject.user.AdminUserDO; +import com.win.module.system.service.logger.OperateLogService; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.collection.CollectionUtils; +import com.win.framework.common.util.collection.MapUtils; +import com.win.framework.excel.core.util.ExcelUtils; +import com.win.framework.operatelog.core.annotations.OperateLog; +import com.win.module.system.service.user.AdminUserService; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +import static com.win.framework.common.pojo.CommonResult.success; +import static com.win.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 操作日志") +@RestController +@RequestMapping("/system/operate-log") +@Validated +public class OperateLogController { + + @Resource + private OperateLogService operateLogService; + @Resource + private AdminUserService userService; + + @GetMapping("/page") + @Operation(summary = "查看操作日志分页列表") + @PreAuthorize("@ss.hasPermission('system:operate-log:query')") + public CommonResult> pageOperateLog(@Valid OperateLogPageReqVO reqVO) { + PageResult pageResult = operateLogService.getOperateLogPage(reqVO); + + // 获得拼接需要的数据 + Collection userIds = CollectionUtils.convertList(pageResult.getList(), OperateLogDO::getUserId); + Map userMap = userService.getUserMap(userIds); + // 拼接数据 + List list = new ArrayList<>(pageResult.getList().size()); + pageResult.getList().forEach(operateLog -> { + OperateLogRespVO respVO = OperateLogConvert.INSTANCE.convert(operateLog); + list.add(respVO); + // 拼接用户信息 + MapUtils.findAndThen(userMap, operateLog.getUserId(), user -> respVO.setUserNickname(user.getNickname())); + }); + return success(new PageResult<>(list, pageResult.getTotal())); + } + + @Operation(summary = "导出操作日志") + @GetMapping("/export") + @PreAuthorize("@ss.hasPermission('system:operate-log:export')") + @OperateLog(type = EXPORT) + public void exportOperateLog(HttpServletResponse response, @Valid OperateLogExportReqVO reqVO) throws IOException { + List list = operateLogService.getOperateLogList(reqVO); + + // 获得拼接需要的数据 + Collection userIds = CollectionUtils.convertList(list, OperateLogDO::getUserId); + Map userMap = userService.getUserMap(userIds); + // 拼接数据 + List excelDataList = OperateLogConvert.INSTANCE.convertList(list, userMap); + // 输出 + ExcelUtils.write(response, "操作日志.xls", "数据列表", OperateLogExcelVO.class, excelDataList); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/vo/loginlog/LoginLogBaseVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/vo/loginlog/LoginLogBaseVO.java new file mode 100644 index 0000000..2c3ef5f --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/vo/loginlog/LoginLogBaseVO.java @@ -0,0 +1,42 @@ +package com.win.module.system.controller.logger.vo.loginlog; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +/** + * 登录日志 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class LoginLogBaseVO { + + @Schema(description = "日志类型,参见 LoginLogTypeEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "日志类型不能为空") + private Integer logType; + + @Schema(description = "链路追踪编号", example = "89aca178-a370-411c-ae02-3f0d672be4ab") + @NotEmpty(message = "链路追踪编号不能为空") + private String traceId; + + @Schema(description = "用户账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "win") + @NotBlank(message = "用户账号不能为空") + @Size(max = 30, message = "用户账号长度不能超过30个字符") + private String username; + + @Schema(description = "登录结果,参见 LoginResultEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "登录结果不能为空") + private Integer result; + + @Schema(description = "用户 IP", requiredMode = Schema.RequiredMode.REQUIRED, example = "127.0.0.1") + @NotEmpty(message = "用户 IP 不能为空") + private String userIp; + + @Schema(description = "浏览器 UserAgent", example = "Mozilla/5.0") + private String userAgent; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/vo/loginlog/LoginLogExcelVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/vo/loginlog/LoginLogExcelVO.java new file mode 100644 index 0000000..c64ffb3 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/vo/loginlog/LoginLogExcelVO.java @@ -0,0 +1,40 @@ +package com.win.module.system.controller.logger.vo.loginlog; + +import com.win.framework.excel.core.annotations.DictFormat; +import com.win.framework.excel.core.convert.DictConvert; +import com.win.module.system.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 登录日志 Excel 导出响应 VO + */ +@Data +public class LoginLogExcelVO { + + @ExcelProperty("日志主键") + private Long id; + + @ExcelProperty("用户账号") + private String username; + + @ExcelProperty(value = "日志类型", converter = DictConvert.class) + @DictFormat(DictTypeConstants.LOGIN_TYPE) + private Integer logType; + + @ExcelProperty(value = "登录结果", converter = DictConvert.class) + @DictFormat(DictTypeConstants.LOGIN_RESULT) + private Integer result; + + @ExcelProperty("登录 IP") + private String userIp; + + @ExcelProperty("浏览器 UA") + private String userAgent; + + @ExcelProperty("登录时间") + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/vo/loginlog/LoginLogExportReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/vo/loginlog/LoginLogExportReqVO.java new file mode 100644 index 0000000..95887f3 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/vo/loginlog/LoginLogExportReqVO.java @@ -0,0 +1,28 @@ +package com.win.module.system.controller.logger.vo.loginlog; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 登录日志分页列表 Request VO") +@Data +public class LoginLogExportReqVO { + + @Schema(description = "用户 IP,模拟匹配", example = "127.0.0.1") + private String userIp; + + @Schema(description = "用户账号,模拟匹配", example = "闻荫") + private String username; + + @Schema(description = "操作状态", example = "true") + private Boolean status; + + @Schema(description = "登录时间", example = "[2022-07-01 00:00:00,2022-07-01 23:59:59]") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/vo/loginlog/LoginLogPageReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/vo/loginlog/LoginLogPageReqVO.java new file mode 100644 index 0000000..0cd8aca --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/vo/loginlog/LoginLogPageReqVO.java @@ -0,0 +1,31 @@ +package com.win.module.system.controller.logger.vo.loginlog; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 登录日志分页列表 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class LoginLogPageReqVO extends PageParam { + + @Schema(description = "用户 IP,模拟匹配", example = "127.0.0.1") + private String userIp; + + @Schema(description = "用户账号,模拟匹配", example = "闻荫") + private String username; + + @Schema(description = "操作状态", example = "true") + private Boolean status; + + @Schema(description = "登录时间", example = "[2022-07-01 00:00:00,2022-07-01 23:59:59]") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/vo/loginlog/LoginLogRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/vo/loginlog/LoginLogRespVO.java new file mode 100644 index 0000000..0670a76 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/vo/loginlog/LoginLogRespVO.java @@ -0,0 +1,25 @@ +package com.win.module.system.controller.logger.vo.loginlog; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 登录日志 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class LoginLogRespVO extends LoginLogBaseVO { + + @Schema(description = "日志编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "用户编号", example = "666") + private Long userId; + + @Schema(description = "登录时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/vo/operatelog/OperateLogBaseVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/vo/operatelog/OperateLogBaseVO.java new file mode 100644 index 0000000..b972434 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/vo/operatelog/OperateLogBaseVO.java @@ -0,0 +1,85 @@ +package com.win.module.system.controller.logger.vo.operatelog; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; +import java.util.Map; + +/** + * 操作日志 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class OperateLogBaseVO { + + @Schema(description = "链路追踪编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "89aca178-a370-411c-ae02-3f0d672be4ab") + @NotEmpty(message = "链路追踪编号不能为空") + private String traceId; + + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "用户编号不能为空") + private Long userId; + + @Schema(description = "操作模块", requiredMode = Schema.RequiredMode.REQUIRED, example = "订单") + @NotEmpty(message = "操作模块不能为空") + private String module; + + @Schema(description = "操作名", requiredMode = Schema.RequiredMode.REQUIRED, example = "创建订单") + @NotEmpty(message = "操作名") + private String name; + + @Schema(description = "操作分类,参见 OperateLogTypeEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "操作分类不能为空") + private Integer type; + + @Schema(description = "操作明细", example = "修改编号为 1 的用户信息,将性别从男改成女,将姓名从闻荫改成源码。") + private String content; + + @Schema(description = "拓展字段", example = "{'orderId': 1}") + private Map exts; + + @Schema(description = "请求方法名", requiredMode = Schema.RequiredMode.REQUIRED, example = "GET") + @NotEmpty(message = "请求方法名不能为空") + private String requestMethod; + + @Schema(description = "请求地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "/xxx/yyy") + @NotEmpty(message = "请求地址不能为空") + private String requestUrl; + + @Schema(description = "用户 IP", requiredMode = Schema.RequiredMode.REQUIRED, example = "127.0.0.1") + @NotEmpty(message = "用户 IP 不能为空") + private String userIp; + + @Schema(description = "浏览器 UserAgent", requiredMode = Schema.RequiredMode.REQUIRED, example = "Mozilla/5.0") + @NotEmpty(message = "浏览器 UserAgent 不能为空") + private String userAgent; + + @Schema(description = "Java 方法名", requiredMode = Schema.RequiredMode.REQUIRED, example = "com.win.adminserver.UserController.save(...)") + @NotEmpty(message = "Java 方法名不能为空") + private String javaMethod; + + @Schema(description = "Java 方法的参数") + private String javaMethodArgs; + + @Schema(description = "开始时间", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "开始时间不能为空") + private LocalDateTime startTime; + + @Schema(description = "执行时长,单位:毫秒", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "执行时长不能为空") + private Integer duration; + + @Schema(description = "结果码", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "结果码不能为空") + private Integer resultCode; + + @Schema(description = "结果提示") + private String resultMsg; + + @Schema(description = "结果数据") + private String resultData; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/vo/operatelog/OperateLogExcelVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/vo/operatelog/OperateLogExcelVO.java new file mode 100644 index 0000000..5e1d94a --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/vo/operatelog/OperateLogExcelVO.java @@ -0,0 +1,42 @@ +package com.win.module.system.controller.logger.vo.operatelog; + +import com.win.framework.excel.core.annotations.DictFormat; +import com.win.framework.excel.core.convert.DictConvert; +import com.win.module.system.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 操作日志 Excel 导出响应 VO + */ +@Data +public class OperateLogExcelVO { + + @ExcelProperty("日志编号") + private Long id; + + @ExcelProperty("操作模块") + private String module; + + @ExcelProperty("操作名") + private String name; + + @ExcelProperty(value = "操作类型", converter = DictConvert.class) + @DictFormat(DictTypeConstants.OPERATE_TYPE) + private String type; + + @ExcelProperty("操作人") + private String userNickname; + + @ExcelProperty(value = "操作结果") // 成功 or 失败 + private String successStr; + + @ExcelProperty("操作日志") + private LocalDateTime startTime; + + @ExcelProperty("执行时长") + private Integer duration; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/vo/operatelog/OperateLogExportReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/vo/operatelog/OperateLogExportReqVO.java new file mode 100644 index 0000000..cd461f4 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/vo/operatelog/OperateLogExportReqVO.java @@ -0,0 +1,31 @@ +package com.win.module.system.controller.logger.vo.operatelog; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 操作日志分页列表 Request VO") +@Data +public class OperateLogExportReqVO { + + @Schema(description = "操作模块,模拟匹配", example = "订单") + private String module; + + @Schema(description = "用户昵称,模拟匹配", example = "闻荫") + private String userNickname; + + @Schema(description = "操作分类,参见 OperateLogTypeEnum 枚举类", example = "1") + private Integer type; + + @Schema(description = "操作状态", example = "true") + private Boolean success; + + @Schema(description = "开始时间", example = "[2022-07-01 00:00:00,2022-07-01 23:59:59]") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] startTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/vo/operatelog/OperateLogPageReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/vo/operatelog/OperateLogPageReqVO.java new file mode 100644 index 0000000..7fd7254 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/vo/operatelog/OperateLogPageReqVO.java @@ -0,0 +1,32 @@ +package com.win.module.system.controller.logger.vo.operatelog; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 操作日志分页列表 Request VO") +@Data +public class OperateLogPageReqVO extends PageParam { + + @Schema(description = "操作模块,模拟匹配", example = "订单") + private String module; + + @Schema(description = "用户昵称,模拟匹配", example = "闻荫") + private String userNickname; + + @Schema(description = "操作分类,参见 OperateLogTypeEnum 枚举类", example = "1") + private Integer type; + + @Schema(description = "操作状态", example = "true") + private Boolean success; + + @Schema(description = "开始时间", example = "[2022-07-01 00:00:00,2022-07-01 23:59:59]") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] startTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/vo/operatelog/OperateLogRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/vo/operatelog/OperateLogRespVO.java new file mode 100644 index 0000000..a96f9ec --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/vo/operatelog/OperateLogRespVO.java @@ -0,0 +1,20 @@ +package com.win.module.system.controller.logger.vo.operatelog; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Schema(description = "管理后台 - 操作日志 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class OperateLogRespVO extends OperateLogBaseVO { + + @Schema(description = "日志编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + private String userNickname; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/MailAccountController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/MailAccountController.java new file mode 100644 index 0000000..cbcff9b --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/MailAccountController.java @@ -0,0 +1,78 @@ +package com.win.module.system.controller.mail; + + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.mail.vo.account.*; +import com.win.module.system.convert.mail.MailAccountConvert; +import com.win.module.system.dal.dataobject.mail.MailAccountDO; +import com.win.module.system.service.mail.MailAccountService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.List; + +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 邮箱账号") +@RestController +@RequestMapping("/system/mail-account") +public class MailAccountController { + + @Resource + private MailAccountService mailAccountService; + + @PostMapping("/create") + @Operation(summary = "创建邮箱账号") + @PreAuthorize("@ss.hasPermission('system:mail-account:create')") + public CommonResult createMailAccount(@Valid @RequestBody MailAccountCreateReqVO createReqVO) { + return success(mailAccountService.createMailAccount(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "修改邮箱账号") + @PreAuthorize("@ss.hasPermission('system:mail-account:update')") + public CommonResult updateMailAccount(@Valid @RequestBody MailAccountUpdateReqVO updateReqVO) { + mailAccountService.updateMailAccount(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除邮箱账号") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('system:mail-account:delete')") + public CommonResult deleteMailAccount(@RequestParam Long id) { + mailAccountService.deleteMailAccount(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得邮箱账号") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:mail-account:get')") + public CommonResult getMailAccount(@RequestParam("id") Long id) { + MailAccountDO mailAccountDO = mailAccountService.getMailAccount(id); + return success(MailAccountConvert.INSTANCE.convert(mailAccountDO)); + } + + @GetMapping("/page") + @Operation(summary = "获得邮箱账号分页") + @PreAuthorize("@ss.hasPermission('system:mail-account:query')") + public CommonResult> getMailAccountPage(@Valid MailAccountPageReqVO pageReqVO) { + PageResult pageResult = mailAccountService.getMailAccountPage(pageReqVO); + return success(MailAccountConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/list-all-simple") + @Operation(summary = "获得邮箱账号精简列表") + public CommonResult> getSimpleMailAccountList() { + List list = mailAccountService.getMailAccountList(); + return success(MailAccountConvert.INSTANCE.convertList02(list)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/MailLogController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/MailLogController.java new file mode 100644 index 0000000..ef49eb3 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/MailLogController.java @@ -0,0 +1,49 @@ +package com.win.module.system.controller.mail; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.mail.vo.log.MailLogPageReqVO; +import com.win.module.system.controller.mail.vo.log.MailLogRespVO; +import com.win.module.system.convert.mail.MailLogConvert; +import com.win.module.system.dal.dataobject.mail.MailLogDO; +import com.win.module.system.service.mail.MailLogService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.validation.Valid; + +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 邮件日志") +@RestController +@RequestMapping("/system/mail-log") +public class MailLogController { + + @Resource + private MailLogService mailLogService; + + @GetMapping("/page") + @Operation(summary = "获得邮箱日志分页") + @PreAuthorize("@ss.hasPermission('system:mail-log:query')") + public CommonResult> getMailLogPage(@Valid MailLogPageReqVO pageVO) { + PageResult pageResult = mailLogService.getMailLogPage(pageVO); + return success(MailLogConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/get") + @Operation(summary = "获得邮箱日志") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:mail-log:query')") + public CommonResult getMailTemplate(@RequestParam("id") Long id) { + MailLogDO mailLogDO = mailLogService.getMailLog(id); + return success(MailLogConvert.INSTANCE.convert(mailLogDO)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/MailTemplateController.http b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/MailTemplateController.http new file mode 100644 index 0000000..f3c47f5 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/MailTemplateController.http @@ -0,0 +1,14 @@ +### 请求 /system/mail-template/send-mail 接口 => 成功 +POST {{baseUrl}}/system/mail-template/send-mail +Authorization: Bearer {{token}} +Content-Type: application/json +tenant-id: {{adminTenentId}} + +{ + "templateCode": "test_01", + "mail": "7685413@qq.com", + "templateParams": { + "key01": "value01", + "key02": "value02" + } +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/MailTemplateController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/MailTemplateController.java new file mode 100644 index 0000000..d5d31b4 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/MailTemplateController.java @@ -0,0 +1,89 @@ +package com.win.module.system.controller.mail; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.mail.vo.template.*; +import com.win.module.system.convert.mail.MailTemplateConvert; +import com.win.module.system.dal.dataobject.mail.MailTemplateDO; +import com.win.module.system.service.mail.MailSendService; +import com.win.module.system.service.mail.MailTemplateService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.List; + +import static com.win.framework.common.pojo.CommonResult.success; +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + +@Tag(name = "管理后台 - 邮件模版") +@RestController +@RequestMapping("/system/mail-template") +public class MailTemplateController { + + @Resource + private MailTemplateService mailTempleService; + @Resource + private MailSendService mailSendService; + + @PostMapping("/create") + @Operation(summary = "创建邮件模版") + @PreAuthorize("@ss.hasPermission('system:mail-template:create')") + public CommonResult createMailTemplate(@Valid @RequestBody MailTemplateCreateReqVO createReqVO){ + return success(mailTempleService.createMailTemplate(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "修改邮件模版") + @PreAuthorize("@ss.hasPermission('system:mail-template:update')") + public CommonResult updateMailTemplate(@Valid @RequestBody MailTemplateUpdateReqVO updateReqVO){ + mailTempleService.updateMailTemplate(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除邮件模版") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:mail-template:delete')") + public CommonResult deleteMailTemplate(@RequestParam("id") Long id) { + mailTempleService.deleteMailTemplate(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得邮件模版") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:mail-template:get')") + public CommonResult getMailTemplate(@RequestParam("id") Long id) { + MailTemplateDO mailTemplateDO = mailTempleService.getMailTemplate(id); + return success(MailTemplateConvert.INSTANCE.convert(mailTemplateDO)); + } + + @GetMapping("/page") + @Operation(summary = "获得邮件模版分页") + @PreAuthorize("@ss.hasPermission('system:mail-template:query')") + public CommonResult> getMailTemplatePage(@Valid MailTemplatePageReqVO pageReqVO) { + PageResult pageResult = mailTempleService.getMailTemplatePage(pageReqVO); + return success(MailTemplateConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/list-all-simple") + @Operation(summary = "获得邮件模版精简列表") + public CommonResult> getSimpleTemplateList() { + List list = mailTempleService.getMailTemplateList(); + return success(MailTemplateConvert.INSTANCE.convertList02(list)); + } + + @PostMapping("/send-mail") + @Operation(summary = "发送短信") + @PreAuthorize("@ss.hasPermission('system:mail-template:send-mail')") + public CommonResult sendMail(@Valid @RequestBody MailTemplateSendReqVO sendReqVO) { + return success(mailSendService.sendSingleMailToAdmin(sendReqVO.getMail(), getLoginUserId(), + sendReqVO.getTemplateCode(), sendReqVO.getTemplateParams())); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/account/MailAccountBaseVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/account/MailAccountBaseVO.java new file mode 100644 index 0000000..2ccf71b --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/account/MailAccountBaseVO.java @@ -0,0 +1,41 @@ +package com.win.module.system.controller.mail.vo.account; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.Email; +import javax.validation.constraints.NotNull; + +/** + * 邮箱账号 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class MailAccountBaseVO { + + @Schema(description = "邮箱", requiredMode = Schema.RequiredMode.REQUIRED, example = "winyuanma@123.com") + @NotNull(message = "邮箱不能为空") + @Email(message = "必须是 Email 格式") + private String mail; + + @Schema(description = "用户名", requiredMode = Schema.RequiredMode.REQUIRED, example = "win") + @NotNull(message = "用户名不能为空") + private String username; + + @Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456") + @NotNull(message = "密码必填") + private String password; + + @Schema(description = "SMTP 服务器域名", requiredMode = Schema.RequiredMode.REQUIRED, example = "www.iocoder.cn") + @NotNull(message = "SMTP 服务器域名不能为空") + private String host; + + @Schema(description = "SMTP 服务器端口", requiredMode = Schema.RequiredMode.REQUIRED, example = "80") + @NotNull(message = "SMTP 服务器端口不能为空") + private Integer port; + + @Schema(description = "是否开启 ssl", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") + @NotNull(message = "是否开启 ssl 必填") + private Boolean sslEnable; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/account/MailAccountCreateReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/account/MailAccountCreateReqVO.java new file mode 100644 index 0000000..89941c2 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/account/MailAccountCreateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.system.controller.mail.vo.account; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Schema(description = "管理后台 - 邮箱账号创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class MailAccountCreateReqVO extends MailAccountBaseVO { + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/account/MailAccountPageReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/account/MailAccountPageReqVO.java new file mode 100644 index 0000000..854f7ce --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/account/MailAccountPageReqVO.java @@ -0,0 +1,21 @@ +package com.win.module.system.controller.mail.vo.account; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Schema(description = "管理后台 - 邮箱账号分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class MailAccountPageReqVO extends PageParam { + + @Schema(description = "邮箱", requiredMode = Schema.RequiredMode.REQUIRED, example = "winyuanma@123.com") + private String mail; + + @Schema(description = "用户名" , requiredMode = Schema.RequiredMode.REQUIRED , example = "win") + private String username; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/account/MailAccountRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/account/MailAccountRespVO.java new file mode 100644 index 0000000..f51937d --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/account/MailAccountRespVO.java @@ -0,0 +1,24 @@ +package com.win.module.system.controller.mail.vo.account; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 邮箱账号 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class MailAccountRespVO extends MailAccountBaseVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "编号不能为空") + private Long id; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/account/MailAccountSimpleRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/account/MailAccountSimpleRespVO.java new file mode 100644 index 0000000..7036882 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/account/MailAccountSimpleRespVO.java @@ -0,0 +1,16 @@ +package com.win.module.system.controller.mail.vo.account; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 邮箱账号的精简 Response VO") +@Data +public class MailAccountSimpleRespVO { + + @Schema(description = "邮箱编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "邮箱", requiredMode = Schema.RequiredMode.REQUIRED, example = "768541388@qq.com") + private String mail; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/account/MailAccountUpdateReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/account/MailAccountUpdateReqVO.java new file mode 100644 index 0000000..26c11a2 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/account/MailAccountUpdateReqVO.java @@ -0,0 +1,20 @@ +package com.win.module.system.controller.mail.vo.account; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 邮箱账号修改 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class MailAccountUpdateReqVO extends MailAccountBaseVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "编号不能为空") + private Long id; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/log/MailLogBaseVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/log/MailLogBaseVO.java new file mode 100644 index 0000000..1253677 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/log/MailLogBaseVO.java @@ -0,0 +1,72 @@ +package com.win.module.system.controller.mail.vo.log; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; +import java.util.Map; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +/** + * 邮件日志 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class MailLogBaseVO { + + @Schema(description = "用户编号", example = "30883") + private Long userId; + + @Schema(description = "接收邮箱地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "76854@qq.com") + @NotNull(message = "接收邮箱地址不能为空") + private String toMail; + + @Schema(description = "邮箱账号编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "18107") + @NotNull(message = "邮箱账号编号不能为空") + private Long accountId; + + @Schema(description = "发送邮箱地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "85757@qq.com") + @NotNull(message = "发送邮箱地址不能为空") + private String fromMail; + + @Schema(description = "模板编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "5678") + @NotNull(message = "模板编号不能为空") + private Long templateId; + + @Schema(description = "模板编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "test_01") + @NotNull(message = "模板编码不能为空") + private String templateCode; + + @Schema(description = "模版发送人名称", example = "李四") + private String templateNickname; + + @Schema(description = "邮件标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "测试标题") + @NotNull(message = "邮件标题不能为空") + private String templateTitle; + + @Schema(description = "邮件内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "测试内容") + @NotNull(message = "邮件内容不能为空") + private String templateContent; + + @Schema(description = "邮件参数", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "邮件参数不能为空") + private Map templateParams; + + @Schema(description = "发送状态,参见 MailSendStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "发送状态不能为空") + private Byte sendStatus; + + @Schema(description = "发送时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime sendTime; + + @Schema(description = "发送返回的消息 ID", example = "28568") + private String sendMessageId; + + @Schema(description = "发送异常") + private String sendException; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/log/MailLogPageReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/log/MailLogPageReqVO.java new file mode 100644 index 0000000..ea88ae6 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/log/MailLogPageReqVO.java @@ -0,0 +1,39 @@ +package com.win.module.system.controller.mail.vo.log; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 邮箱日志分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class MailLogPageReqVO extends PageParam { + + @Schema(description = "用户编号", example = "30883") + private Long userId; + + @Schema(description = "接收邮箱地址,模糊匹配", example = "76854@qq.com") + private String toMail; + + @Schema(description = "邮箱账号编号", example = "18107") + private Long accountId; + + @Schema(description = "模板编号", example = "5678") + private Long templateId; + + @Schema(description = "发送状态,参见 MailSendStatusEnum 枚举", example = "1") + private Integer sendStatus; + + @Schema(description = "发送时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] sendTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/log/MailLogRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/log/MailLogRespVO.java new file mode 100644 index 0000000..647756f --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/log/MailLogRespVO.java @@ -0,0 +1,19 @@ +package com.win.module.system.controller.mail.vo.log; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 邮件日志 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class MailLogRespVO extends MailLogBaseVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "31020") + private Long id; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/template/MailTemplateBaseVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/template/MailTemplateBaseVO.java new file mode 100644 index 0000000..669d379 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/template/MailTemplateBaseVO.java @@ -0,0 +1,46 @@ +package com.win.module.system.controller.mail.vo.template; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +/** + * 邮件模版 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class MailTemplateBaseVO { + + @Schema(description = "模版名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "测试名字") + @NotNull(message = "名称不能为空") + private String name; + + @Schema(description = "模版编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "test") + @NotNull(message = "模版编号不能为空") + private String code; + + @Schema(description = "发送的邮箱账号编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "发送的邮箱账号编号不能为空") + private Long accountId; + + @Schema(description = "发送人名称", example = "芋头") + private String nickname; + + @Schema(description = "标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "注册成功") + @NotEmpty(message = "标题不能为空") + private String title; + + @Schema(description = "内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "你好,注册成功啦") + @NotEmpty(message = "内容不能为空") + private String content; + + @Schema(description = "状态,参见 CommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "状态不能为空") + private Integer status; + + @Schema(description = "备注", example = "奥特曼") + private String remark; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/template/MailTemplateCreateReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/template/MailTemplateCreateReqVO.java new file mode 100644 index 0000000..ff830b1 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/template/MailTemplateCreateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.system.controller.mail.vo.template; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Schema(description = "管理后台 - 邮件模版创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class MailTemplateCreateReqVO extends MailTemplateBaseVO { + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/template/MailTemplatePageReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/template/MailTemplatePageReqVO.java new file mode 100644 index 0000000..6017a6d --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/template/MailTemplatePageReqVO.java @@ -0,0 +1,36 @@ +package com.win.module.system.controller.mail.vo.template; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 邮件模版分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class MailTemplatePageReqVO extends PageParam { + + @Schema(description = "状态,参见 CommonStatusEnum 枚举", example = "1") + private Integer status; + + @Schema(description = "标识,模糊匹配", example = "code_1024") + private String code; + + @Schema(description = "名称,模糊匹配", example = "芋头") + private String name; + + @Schema(description = "账号编号", example = "2048") + private Long accountId; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/template/MailTemplateRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/template/MailTemplateRespVO.java new file mode 100644 index 0000000..2be30aa --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/template/MailTemplateRespVO.java @@ -0,0 +1,26 @@ +package com.win.module.system.controller.mail.vo.template; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.time.LocalDateTime; +import java.util.List; + +@Schema(description = "管理后台 - 邮件末班 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class MailTemplateRespVO extends MailTemplateBaseVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "参数数组", example = "name,code") + private List params; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/template/MailTemplateSendReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/template/MailTemplateSendReqVO.java new file mode 100644 index 0000000..7224eac --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/template/MailTemplateSendReqVO.java @@ -0,0 +1,25 @@ +package com.win.module.system.controller.mail.vo.template; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.Map; + +@Schema(description = "管理后台 - 邮件发送 Req VO") +@Data +public class MailTemplateSendReqVO { + + @Schema(description = "接收邮箱", requiredMode = Schema.RequiredMode.REQUIRED, example = "7685413@qq.com") + @NotEmpty(message = "接收邮箱不能为空") + private String mail; + + @Schema(description = "模板编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "test_01") + @NotNull(message = "模板编码不能为空") + private String templateCode; + + @Schema(description = "模板参数") + private Map templateParams; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/template/MailTemplateSimpleRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/template/MailTemplateSimpleRespVO.java new file mode 100644 index 0000000..cbfa0bd --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/template/MailTemplateSimpleRespVO.java @@ -0,0 +1,16 @@ +package com.win.module.system.controller.mail.vo.template; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 邮件模版的精简 Response VO") +@Data +public class MailTemplateSimpleRespVO { + + @Schema(description = "模版编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "模版名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "哒哒哒") + private String name; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/template/MailTemplateUpdateReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/template/MailTemplateUpdateReqVO.java new file mode 100644 index 0000000..c67c8d8 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/template/MailTemplateUpdateReqVO.java @@ -0,0 +1,20 @@ +package com.win.module.system.controller.mail.vo.template; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 邮件模版修改 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class MailTemplateUpdateReqVO extends MailTemplateBaseVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "编号不能为空") + private Long id; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notice/NoticeController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notice/NoticeController.java new file mode 100644 index 0000000..2222cba --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notice/NoticeController.java @@ -0,0 +1,72 @@ +package com.win.module.system.controller.notice; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.notice.vo.NoticeCreateReqVO; +import com.win.module.system.controller.notice.vo.NoticePageReqVO; +import com.win.module.system.controller.notice.vo.NoticeRespVO; +import com.win.module.system.controller.notice.vo.NoticeUpdateReqVO; +import com.win.module.system.convert.notice.NoticeConvert; +import com.win.module.system.service.notice.NoticeService; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; + +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 通知公告") +@RestController +@RequestMapping("/system/notice") +@Validated +public class NoticeController { + + @Resource + private NoticeService noticeService; + + @PostMapping("/create") + @Operation(summary = "创建通知公告") + @PreAuthorize("@ss.hasPermission('system:notice:create')") + public CommonResult createNotice(@Valid @RequestBody NoticeCreateReqVO reqVO) { + Long noticeId = noticeService.createNotice(reqVO); + return success(noticeId); + } + + @PutMapping("/update") + @Operation(summary = "修改通知公告") + @PreAuthorize("@ss.hasPermission('system:notice:update')") + public CommonResult updateNotice(@Valid @RequestBody NoticeUpdateReqVO reqVO) { + noticeService.updateNotice(reqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除通知公告") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:notice:delete')") + public CommonResult deleteNotice(@RequestParam("id") Long id) { + noticeService.deleteNotice(id); + return success(true); + } + + @GetMapping("/page") + @Operation(summary = "获取通知公告列表") + @PreAuthorize("@ss.hasPermission('system:notice:query')") + public CommonResult> getNoticePage(@Validated NoticePageReqVO reqVO) { + return success(NoticeConvert.INSTANCE.convertPage(noticeService.getNoticePage(reqVO))); + } + + @GetMapping("/get") + @Operation(summary = "获得通知公告") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:notice:query')") + public CommonResult getNotice(@RequestParam("id") Long id) { + return success(NoticeConvert.INSTANCE.convert(noticeService.getNotice(id))); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notice/vo/NoticeBaseVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notice/vo/NoticeBaseVO.java new file mode 100644 index 0000000..68e344a --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notice/vo/NoticeBaseVO.java @@ -0,0 +1,32 @@ +package com.win.module.system.controller.notice.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +/** + * 通知公告 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class NoticeBaseVO { + + @Schema(description = "公告标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "小博主") + @NotBlank(message = "公告标题不能为空") + @Size(max = 50, message = "公告标题不能超过50个字符") + private String title; + + @Schema(description = "公告类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "小博主") + @NotNull(message = "公告类型不能为空") + private Integer type; + + @Schema(description = "公告内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "半生编码") + private String content; + + @Schema(description = "状态,参见 CommonStatusEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer status; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notice/vo/NoticeCreateReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notice/vo/NoticeCreateReqVO.java new file mode 100644 index 0000000..03371b5 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notice/vo/NoticeCreateReqVO.java @@ -0,0 +1,11 @@ +package com.win.module.system.controller.notice.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Schema(description = "管理后台 - 通知公告创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class NoticeCreateReqVO extends NoticeBaseVO { +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notice/vo/NoticePageReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notice/vo/NoticePageReqVO.java new file mode 100644 index 0000000..82e8c8d --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notice/vo/NoticePageReqVO.java @@ -0,0 +1,19 @@ +package com.win.module.system.controller.notice.vo; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Schema(description = "管理后台 - 通知公告分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class NoticePageReqVO extends PageParam { + + @Schema(description = "通知公告名称,模糊匹配", example = "闻荫") + private String title; + + @Schema(description = "展示状态,参见 CommonStatusEnum 枚举类", example = "1") + private Integer status; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notice/vo/NoticeRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notice/vo/NoticeRespVO.java new file mode 100644 index 0000000..ef0df1f --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notice/vo/NoticeRespVO.java @@ -0,0 +1,20 @@ +package com.win.module.system.controller.notice.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 通知公告信息 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class NoticeRespVO extends NoticeBaseVO { + + @Schema(description = "通知公告序号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "时间戳格式") + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notice/vo/NoticeUpdateReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notice/vo/NoticeUpdateReqVO.java new file mode 100644 index 0000000..38ecb8a --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notice/vo/NoticeUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.win.module.system.controller.notice.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 岗位公告更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class NoticeUpdateReqVO extends NoticeBaseVO { + + @Schema(description = "岗位公告编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "岗位公告编号不能为空") + private Long id; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notify/NotifyMessageController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notify/NotifyMessageController.java new file mode 100644 index 0000000..e1a7274 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notify/NotifyMessageController.java @@ -0,0 +1,94 @@ +package com.win.module.system.controller.notify; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.operatelog.core.annotations.OperateLog; +import com.win.module.system.controller.notify.vo.message.NotifyMessageMyPageReqVO; +import com.win.module.system.controller.notify.vo.message.NotifyMessagePageReqVO; +import com.win.module.system.controller.notify.vo.message.NotifyMessageRespVO; +import com.win.module.system.convert.notify.NotifyMessageConvert; +import com.win.module.system.dal.dataobject.notify.NotifyMessageDO; +import com.win.module.system.service.notify.NotifyMessageService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.List; + +import static com.win.framework.common.pojo.CommonResult.success; +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + +@Tag(name = "管理后台 - 我的站内信") +@RestController +@RequestMapping("/system/notify-message") +@Validated +public class NotifyMessageController { + + @Resource + private NotifyMessageService notifyMessageService; + + // ========== 管理所有的站内信 ========== + + @GetMapping("/get") + @Operation(summary = "获得站内信") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:notify-message:query')") + public CommonResult getNotifyMessage(@RequestParam("id") Long id) { + NotifyMessageDO notifyMessage = notifyMessageService.getNotifyMessage(id); + return success(NotifyMessageConvert.INSTANCE.convert(notifyMessage)); + } + + @GetMapping("/page") + @Operation(summary = "获得站内信分页") + @PreAuthorize("@ss.hasPermission('system:notify-message:query')") + public CommonResult> getNotifyMessagePage(@Valid NotifyMessagePageReqVO pageVO) { + PageResult pageResult = notifyMessageService.getNotifyMessagePage(pageVO); + return success(NotifyMessageConvert.INSTANCE.convertPage(pageResult)); + } + + // ========== 查看自己的站内信 ========== + + @GetMapping("/my-page") + @Operation(summary = "获得我的站内信分页") + public CommonResult> getMyMyNotifyMessagePage(@Valid NotifyMessageMyPageReqVO pageVO) { + PageResult pageResult = notifyMessageService.getMyMyNotifyMessagePage(pageVO, getLoginUserId()); + return success(NotifyMessageConvert.INSTANCE.convertPage(pageResult)); + } + + @PutMapping("/update-read") + @Operation(summary = "标记站内信为已读") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + public CommonResult updateNotifyMessageRead(@RequestParam("ids") List ids) { + notifyMessageService.updateNotifyMessageRead(ids, getLoginUserId()); + return success(Boolean.TRUE); + } + + @PutMapping("/update-all-read") + @Operation(summary = "标记所有站内信为已读") + public CommonResult updateAllNotifyMessageRead() { + notifyMessageService.updateAllNotifyMessageRead(getLoginUserId()); + return success(Boolean.TRUE); + } + + @GetMapping("/get-unread-list") + @Operation(summary = "获取当前用户的最新站内信列表,默认 10 条") + @Parameter(name = "size", description = "10") + public CommonResult> getUnreadNotifyMessageList( + @RequestParam(name = "size", defaultValue = "10") Integer size) { + List list = notifyMessageService.getUnreadNotifyMessageList(getLoginUserId(), size); + return success(NotifyMessageConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/get-unread-count") + @Operation(summary = "获得当前用户的未读站内信数量") + @OperateLog(enable = false) + public CommonResult getUnreadNotifyMessageCount() { + return success(notifyMessageService.getUnreadNotifyMessageCount(getLoginUserId())); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notify/NotifyTemplateController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notify/NotifyTemplateController.java new file mode 100644 index 0000000..ca85366 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notify/NotifyTemplateController.java @@ -0,0 +1,83 @@ +package com.win.module.system.controller.notify; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.notify.vo.template.*; +import com.win.module.system.convert.notify.NotifyTemplateConvert; +import com.win.module.system.dal.dataobject.notify.NotifyTemplateDO; +import com.win.module.system.service.notify.NotifySendService; +import com.win.module.system.service.notify.NotifyTemplateService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; + +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 站内信模版") +@RestController +@RequestMapping("/system/notify-template") +@Validated +public class NotifyTemplateController { + + @Resource + private NotifyTemplateService notifyTemplateService; + + @Resource + private NotifySendService notifySendService; + + @PostMapping("/create") + @Operation(summary = "创建站内信模版") + @PreAuthorize("@ss.hasPermission('system:notify-template:create')") + public CommonResult createNotifyTemplate(@Valid @RequestBody NotifyTemplateCreateReqVO createReqVO) { + return success(notifyTemplateService.createNotifyTemplate(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新站内信模版") + @PreAuthorize("@ss.hasPermission('system:notify-template:update')") + public CommonResult updateNotifyTemplate(@Valid @RequestBody NotifyTemplateUpdateReqVO updateReqVO) { + notifyTemplateService.updateNotifyTemplate(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除站内信模版") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('system:notify-template:delete')") + public CommonResult deleteNotifyTemplate(@RequestParam("id") Long id) { + notifyTemplateService.deleteNotifyTemplate(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得站内信模版") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:notify-template:query')") + public CommonResult getNotifyTemplate(@RequestParam("id") Long id) { + NotifyTemplateDO notifyTemplate = notifyTemplateService.getNotifyTemplate(id); + return success(NotifyTemplateConvert.INSTANCE.convert(notifyTemplate)); + } + + @GetMapping("/page") + @Operation(summary = "获得站内信模版分页") + @PreAuthorize("@ss.hasPermission('system:notify-template:query')") + public CommonResult> getNotifyTemplatePage(@Valid NotifyTemplatePageReqVO pageVO) { + PageResult pageResult = notifyTemplateService.getNotifyTemplatePage(pageVO); + return success(NotifyTemplateConvert.INSTANCE.convertPage(pageResult)); + } + + @PostMapping("/send-notify") + @Operation(summary = "发送站内信") + @PreAuthorize("@ss.hasPermission('system:notify-template:send-notify')") + public CommonResult sendNotify(@Valid @RequestBody NotifyTemplateSendReqVO sendReqVO) { + return success(notifySendService.sendSingleNotifyToAdmin(sendReqVO.getUserId(), + sendReqVO.getTemplateCode(), sendReqVO.getTemplateParams())); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notify/vo/message/NotifyMessageBaseVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notify/vo/message/NotifyMessageBaseVO.java new file mode 100644 index 0000000..a08d067 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notify/vo/message/NotifyMessageBaseVO.java @@ -0,0 +1,56 @@ +package com.win.module.system.controller.notify.vo.message; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; +import java.util.Map; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +/** + * 站内信消息 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class NotifyMessageBaseVO { + + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "25025") + @NotNull(message = "用户编号不能为空") + private Long userId; + + @Schema(description = "模版编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "13013") + @NotNull(message = "模版编号不能为空") + private Long templateId; + + @Schema(description = "模板编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "test_01") + @NotNull(message = "模板编码不能为空") + private String templateCode; + + @Schema(description = "模版发送人名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + @NotNull(message = "模版发送人名称不能为空") + private String templateNickname; + + @Schema(description = "模版内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "测试内容") + @NotNull(message = "模版内容不能为空") + private String templateContent; + + @Schema(description = "模版类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @NotNull(message = "模版类型不能为空") + private Integer templateType; + + @Schema(description = "模版参数", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "模版参数不能为空") + private Map templateParams; + + @Schema(description = "是否已读", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") + @NotNull(message = "是否已读不能为空") + private Boolean readStatus; + + @Schema(description = "阅读时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime readTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notify/vo/message/NotifyMessageMyPageReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notify/vo/message/NotifyMessageMyPageReqVO.java new file mode 100644 index 0000000..ae10473 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notify/vo/message/NotifyMessageMyPageReqVO.java @@ -0,0 +1,27 @@ +package com.win.module.system.controller.notify.vo.message; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 站内信分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class NotifyMessageMyPageReqVO extends PageParam { + + @Schema(description = "是否已读", example = "true") + private Boolean readStatus; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notify/vo/message/NotifyMessagePageReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notify/vo/message/NotifyMessagePageReqVO.java new file mode 100644 index 0000000..7d16ab7 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notify/vo/message/NotifyMessagePageReqVO.java @@ -0,0 +1,33 @@ +package com.win.module.system.controller.notify.vo.message; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 站内信分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class NotifyMessagePageReqVO extends PageParam { + + @Schema(description = "用户编号", example = "25025") + private Long userId; + + @Schema(description = "模板编码", example = "test_01") + private String templateCode; + + @Schema(description = "模版类型", example = "2") + private Integer templateType; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notify/vo/message/NotifyMessageRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notify/vo/message/NotifyMessageRespVO.java new file mode 100644 index 0000000..aada909 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notify/vo/message/NotifyMessageRespVO.java @@ -0,0 +1,22 @@ +package com.win.module.system.controller.notify.vo.message; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 站内信 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class NotifyMessageRespVO extends NotifyMessageBaseVO { + + @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notify/vo/template/NotifyTemplateBaseVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notify/vo/template/NotifyTemplateBaseVO.java new file mode 100644 index 0000000..7575848 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notify/vo/template/NotifyTemplateBaseVO.java @@ -0,0 +1,46 @@ +package com.win.module.system.controller.notify.vo.template; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.validation.InEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +/** + * 站内信模版 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class NotifyTemplateBaseVO { + + @Schema(description = "模版名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "测试模版") + @NotEmpty(message = "模版名称不能为空") + private String name; + + @Schema(description = "模版编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "SEND_TEST") + @NotNull(message = "模版编码不能为空") + private String code; + + @Schema(description = "模版类型,对应 system_notify_template_type 字典", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "模版类型不能为空") + private Integer type; + + @Schema(description = "发送人名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "土豆") + @NotEmpty(message = "发送人名称不能为空") + private String nickname; + + @Schema(description = "模版内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "我是模版内容") + @NotEmpty(message = "模版内容不能为空") + private String content; + + @Schema(description = "状态,参见 CommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "状态不能为空") + @InEnum(value = CommonStatusEnum.class, message = "状态必须是 {value}") + private Integer status; + + @Schema(description = "备注", example = "我是备注") + private String remark; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notify/vo/template/NotifyTemplateCreateReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notify/vo/template/NotifyTemplateCreateReqVO.java new file mode 100644 index 0000000..3b476fb --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notify/vo/template/NotifyTemplateCreateReqVO.java @@ -0,0 +1,11 @@ +package com.win.module.system.controller.notify.vo.template; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +@Schema(description = "管理后台 - 站内信模版创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class NotifyTemplateCreateReqVO extends NotifyTemplateBaseVO { +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notify/vo/template/NotifyTemplatePageReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notify/vo/template/NotifyTemplatePageReqVO.java new file mode 100644 index 0000000..ad8f986 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notify/vo/template/NotifyTemplatePageReqVO.java @@ -0,0 +1,33 @@ +package com.win.module.system.controller.notify.vo.template; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 站内信模版分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class NotifyTemplatePageReqVO extends PageParam { + + @Schema(description = "模版编码", example = "test_01") + private String code; + + @Schema(description = "模版名称", example = "我是名称") + private String name; + + @Schema(description = "状态,参见 CommonStatusEnum 枚举类", example = "1") + private Integer status; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notify/vo/template/NotifyTemplateRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notify/vo/template/NotifyTemplateRespVO.java new file mode 100644 index 0000000..cf7d547 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notify/vo/template/NotifyTemplateRespVO.java @@ -0,0 +1,24 @@ +package com.win.module.system.controller.notify.vo.template; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import java.time.LocalDateTime; +import java.util.*; + +@Schema(description = "管理后台 - 站内信模版 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class NotifyTemplateRespVO extends NotifyTemplateBaseVO { + + @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "参数数组", example = "name,code") + private List params; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notify/vo/template/NotifyTemplateSendReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notify/vo/template/NotifyTemplateSendReqVO.java new file mode 100644 index 0000000..2aec7ca --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notify/vo/template/NotifyTemplateSendReqVO.java @@ -0,0 +1,24 @@ +package com.win.module.system.controller.notify.vo.template; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.Map; + +@Schema(description = "管理后台 - 站内信模板的发送 Request VO") +@Data +public class NotifyTemplateSendReqVO { + + @Schema(description = "用户id", requiredMode = Schema.RequiredMode.REQUIRED, example = "01") + @NotNull(message = "用户id不能为空") + private Long userId; + + @Schema(description = "模板编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "01") + @NotEmpty(message = "模板编码不能为空") + private String templateCode; + + @Schema(description = "模板参数") + private Map templateParams; +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notify/vo/template/NotifyTemplateUpdateReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notify/vo/template/NotifyTemplateUpdateReqVO.java new file mode 100644 index 0000000..ba26fad --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notify/vo/template/NotifyTemplateUpdateReqVO.java @@ -0,0 +1,17 @@ +package com.win.module.system.controller.notify.vo.template; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 站内信模版更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class NotifyTemplateUpdateReqVO extends NotifyTemplateBaseVO { + + @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "ID 不能为空") + private Long id; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/OAuth2ClientController.http b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/OAuth2ClientController.http new file mode 100644 index 0000000..3fe7c15 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/OAuth2ClientController.http @@ -0,0 +1,23 @@ +### 请求 /login 接口 => 成功 +POST {{baseUrl}}/system/oauth2-client/create +Content-Type: application/json +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} + +{ + "id": "1", + "secret": "admin123", + "name": "闻荫源码", + "logo": "https://www.iocoder.cn/images/favicon.ico", + "description": "我是描述", + "status": 0, + "accessTokenValiditySeconds": 180, + "refreshTokenValiditySeconds": 8640, + "redirectUris": ["https://www.iocoder.cn"], + "autoApprove": true, + "authorizedGrantTypes": ["password"], + "scopes": ["user_info"], + "authorities": ["system:user:query"], + "resource_ids": ["1024"], + "additionalInformation": "{}" +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/OAuth2ClientController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/OAuth2ClientController.java new file mode 100644 index 0000000..30cdd34 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/OAuth2ClientController.java @@ -0,0 +1,74 @@ +package com.win.module.system.controller.oauth2; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.oauth2.vo.client.OAuth2ClientCreateReqVO; +import com.win.module.system.controller.oauth2.vo.client.OAuth2ClientPageReqVO; +import com.win.module.system.controller.oauth2.vo.client.OAuth2ClientRespVO; +import com.win.module.system.controller.oauth2.vo.client.OAuth2ClientUpdateReqVO; +import com.win.module.system.convert.auth.OAuth2ClientConvert; +import com.win.module.system.dal.dataobject.oauth2.OAuth2ClientDO; +import com.win.module.system.service.oauth2.OAuth2ClientService; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; + +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - OAuth2 客户端") +@RestController +@RequestMapping("/system/oauth2-client") +@Validated +public class OAuth2ClientController { + + @Resource + private OAuth2ClientService oAuth2ClientService; + + @PostMapping("/create") + @Operation(summary = "创建 OAuth2 客户端") + @PreAuthorize("@ss.hasPermission('system:oauth2-client:create')") + public CommonResult createOAuth2Client(@Valid @RequestBody OAuth2ClientCreateReqVO createReqVO) { + return success(oAuth2ClientService.createOAuth2Client(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新 OAuth2 客户端") + @PreAuthorize("@ss.hasPermission('system:oauth2-client:update')") + public CommonResult updateOAuth2Client(@Valid @RequestBody OAuth2ClientUpdateReqVO updateReqVO) { + oAuth2ClientService.updateOAuth2Client(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除 OAuth2 客户端") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('system:oauth2-client:delete')") + public CommonResult deleteOAuth2Client(@RequestParam("id") Long id) { + oAuth2ClientService.deleteOAuth2Client(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得 OAuth2 客户端") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:oauth2-client:query')") + public CommonResult getOAuth2Client(@RequestParam("id") Long id) { + OAuth2ClientDO oAuth2Client = oAuth2ClientService.getOAuth2Client(id); + return success(OAuth2ClientConvert.INSTANCE.convert(oAuth2Client)); + } + + @GetMapping("/page") + @Operation(summary = "获得OAuth2 客户端分页") + @PreAuthorize("@ss.hasPermission('system:oauth2-client:query')") + public CommonResult> getOAuth2ClientPage(@Valid OAuth2ClientPageReqVO pageVO) { + PageResult pageResult = oAuth2ClientService.getOAuth2ClientPage(pageVO); + return success(OAuth2ClientConvert.INSTANCE.convertPage(pageResult)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/OAuth2OpenController.http b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/OAuth2OpenController.http new file mode 100644 index 0000000..725a5d4 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/OAuth2OpenController.http @@ -0,0 +1,54 @@ +### 请求 /system/oauth2/authorize 接口 => 成功 +GET {{baseUrl}}/system/oauth2/authorize?clientId=default +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} + +### 请求 /system/oauth2/authorize + token 接口 => 成功 +POST {{baseUrl}}/system/oauth2/authorize +Content-Type: application/x-www-form-urlencoded +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} + +response_type=token&client_id=default&scope={"user.read": true}&redirect_uri=https://www.iocoder.cn&auto_approve=true + +### 请求 /system/oauth2/authorize + code 接口 => 成功 +POST {{baseUrl}}/system/oauth2/authorize +Content-Type: application/x-www-form-urlencoded +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} + +response_type=code&client_id=default&scope={"user.read": true}&redirect_uri=https://www.iocoder.cn&auto_approve=false + +### 请求 /system/oauth2/token + code 接口 => 成功 +POST {{baseUrl}}/system/oauth2/token +Content-Type: application/x-www-form-urlencoded +Authorization: Basic ZGVmYXVsdDphZG1pbjEyMw== +tenant-id: {{adminTenentId}} + +grant_type=authorization_code&redirect_uri=https://www.iocoder.cn&code=189956c07a174588a97157eabef2f93a + +### 请求 /system/oauth2/token + password 接口 => 成功 +POST {{baseUrl}}/system/oauth2/token +Content-Type: application/x-www-form-urlencoded +Authorization: Basic ZGVmYXVsdDphZG1pbjEyMw== +tenant-id: {{adminTenentId}} + +grant_type=password&username=admin&password=admin123&scope=user.read + +### 请求 /system/oauth2/token + refresh_token 接口 => 成功 +POST {{baseUrl}}/system/oauth2/token +Content-Type: application/x-www-form-urlencoded +Authorization: Basic ZGVmYXVsdDphZG1pbjEyMw== +tenant-id: {{adminTenentId}} + +grant_type=refresh_token&refresh_token=00895465d6994f72a9d926ceeed0f588 + +### 请求 /system/oauth2/token + DELETE 接口 => 成功 +DELETE {{baseUrl}}/system/oauth2/token?token=ca8a188f464441d6949c51493a2b7596 +Authorization: Basic ZGVmYXVsdDphZG1pbjEyMw== +tenant-id: {{adminTenentId}} + +### 请求 /system/oauth2/check-token 接口 => 成功 +POST {{baseUrl}}/system/oauth2/check-token?token=620d307c5b4148df8a98dd6c6c547106 +Authorization: Basic ZGVmYXVsdDphZG1pbjEyMw== +tenant-id: {{adminTenentId}} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/OAuth2OpenController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/OAuth2OpenController.java new file mode 100644 index 0000000..7ee67bb --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/OAuth2OpenController.java @@ -0,0 +1,296 @@ +package com.win.module.system.controller.oauth2; + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.util.http.HttpUtils; +import com.win.framework.common.util.json.JsonUtils; +import com.win.framework.operatelog.core.annotations.OperateLog; +import com.win.module.system.controller.oauth2.vo.open.OAuth2OpenAccessTokenRespVO; +import com.win.module.system.controller.oauth2.vo.open.OAuth2OpenAuthorizeInfoRespVO; +import com.win.module.system.controller.oauth2.vo.open.OAuth2OpenCheckTokenRespVO; +import com.win.module.system.convert.oauth2.OAuth2OpenConvert; +import com.win.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; +import com.win.module.system.dal.dataobject.oauth2.OAuth2ApproveDO; +import com.win.module.system.dal.dataobject.oauth2.OAuth2ClientDO; +import com.win.module.system.enums.oauth2.OAuth2GrantTypeEnum; +import com.win.module.system.service.oauth2.OAuth2ApproveService; +import com.win.module.system.service.oauth2.OAuth2ClientService; +import com.win.module.system.service.oauth2.OAuth2GrantService; +import com.win.module.system.service.oauth2.OAuth2TokenService; +import com.win.module.system.util.oauth2.OAuth2Utils; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.Operation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.annotation.security.PermitAll; +import javax.servlet.http.HttpServletRequest; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import static com.win.framework.common.exception.enums.GlobalErrorCodeConstants.BAD_REQUEST; +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception0; +import static com.win.framework.common.pojo.CommonResult.success; +import static com.win.framework.common.util.collection.CollectionUtils.convertList; +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + +/** + * 提供给外部应用调用为主 + * + * 一般来说,管理后台的 /system-api/* 是不直接提供给外部应用使用,主要是外部应用能够访问的数据与接口是有限的,而管理后台的 RBAC 无法很好的控制。 + * 参考大量的开放平台,都是独立的一套 OpenAPI,对应到【本系统】就是在 Controller 下新建 open 包,实现 /open-api/* 接口,然后通过 scope 进行控制。 + * 另外,一个公司如果有多个管理后台,它们 client_id 产生的 access token 相互之间是无法互通的,即无法访问它们系统的 API 接口,直到两个 client_id 产生信任授权。 + * + * 考虑到【本系统】暂时不想做的过于复杂,默认只有获取到 access token 之后,可以访问【本系统】管理后台的 /system-api/* 所有接口,除非手动添加 scope 控制。 + * scope 的使用示例,可见 {@link OAuth2UserController} 类 + * + * @author 闻荫源码 + */ +@Tag(name = "管理后台 - OAuth2.0 授权") +@RestController +@RequestMapping("/system/oauth2") +@Validated +@Slf4j +public class OAuth2OpenController { + + @Resource + private OAuth2GrantService oauth2GrantService; + @Resource + private OAuth2ClientService oauth2ClientService; + @Resource + private OAuth2ApproveService oauth2ApproveService; + @Resource + private OAuth2TokenService oauth2TokenService; + + /** + * 对应 Spring Security OAuth 的 TokenEndpoint 类的 postAccessToken 方法 + * + * 授权码 authorization_code 模式时:code + redirectUri + state 参数 + * 密码 password 模式时:username + password + scope 参数 + * 刷新 refresh_token 模式时:refreshToken 参数 + * 客户端 client_credentials 模式:scope 参数 + * 简化 implicit 模式时:不支持 + * + * 注意,默认需要传递 client_id + client_secret 参数 + */ + @PostMapping("/token") + @PermitAll + @Operation(summary = "获得访问令牌", description = "适合 code 授权码模式,或者 implicit 简化模式;在 sso.vue 单点登录界面被【获取】调用") + @Parameters({ + @Parameter(name = "grant_type", required = true, description = "授权类型", example = "code"), + @Parameter(name = "code", description = "授权范围", example = "userinfo.read"), + @Parameter(name = "redirect_uri", description = "重定向 URI", example = "https://www.iocoder.cn"), + @Parameter(name = "state", description = "状态", example = "1"), + @Parameter(name = "username", example = "tudou"), + @Parameter(name = "password", example = "cai"), // 多个使用空格分隔 + @Parameter(name = "scope", example = "user_info"), + @Parameter(name = "refresh_token", example = "123424233"), + }) + @OperateLog(enable = false) // 避免 Post 请求被记录操作日志 + public CommonResult postAccessToken(HttpServletRequest request, + @RequestParam("grant_type") String grantType, + @RequestParam(value = "code", required = false) String code, // 授权码模式 + @RequestParam(value = "redirect_uri", required = false) String redirectUri, // 授权码模式 + @RequestParam(value = "state", required = false) String state, // 授权码模式 + @RequestParam(value = "username", required = false) String username, // 密码模式 + @RequestParam(value = "password", required = false) String password, // 密码模式 + @RequestParam(value = "scope", required = false) String scope, // 密码模式 + @RequestParam(value = "refresh_token", required = false) String refreshToken) { // 刷新模式 + List scopes = OAuth2Utils.buildScopes(scope); + // 1.1 校验授权类型 + OAuth2GrantTypeEnum grantTypeEnum = OAuth2GrantTypeEnum.getByGranType(grantType); + if (grantTypeEnum == null) { + throw exception0(BAD_REQUEST.getCode(), StrUtil.format("未知授权类型({})", grantType)); + } + if (grantTypeEnum == OAuth2GrantTypeEnum.IMPLICIT) { + throw exception0(BAD_REQUEST.getCode(), "Token 接口不支持 implicit 授权模式"); + } + + // 1.2 校验客户端 + String[] clientIdAndSecret = obtainBasicAuthorization(request); + OAuth2ClientDO client = oauth2ClientService.validOAuthClientFromCache(clientIdAndSecret[0], clientIdAndSecret[1], + grantType, scopes, redirectUri); + + // 2. 根据授权模式,获取访问令牌 + OAuth2AccessTokenDO accessTokenDO; + switch (grantTypeEnum) { + case AUTHORIZATION_CODE: + accessTokenDO = oauth2GrantService.grantAuthorizationCodeForAccessToken(client.getClientId(), code, redirectUri, state); + break; + case PASSWORD: + accessTokenDO = oauth2GrantService.grantPassword(username, password, client.getClientId(), scopes); + break; + case CLIENT_CREDENTIALS: + accessTokenDO = oauth2GrantService.grantClientCredentials(client.getClientId(), scopes); + break; + case REFRESH_TOKEN: + accessTokenDO = oauth2GrantService.grantRefreshToken(refreshToken, client.getClientId()); + break; + default: + throw new IllegalArgumentException("未知授权类型:" + grantType); + } + Assert.notNull(accessTokenDO, "访问令牌不能为空"); // 防御性检查 + return success(OAuth2OpenConvert.INSTANCE.convert(accessTokenDO)); + } + + @DeleteMapping("/token") + @PermitAll + @Operation(summary = "删除访问令牌") + @Parameter(name = "token", required = true, description = "访问令牌", example = "biu") + @OperateLog(enable = false) // 避免 Post 请求被记录操作日志 + public CommonResult revokeToken(HttpServletRequest request, + @RequestParam("token") String token) { + // 校验客户端 + String[] clientIdAndSecret = obtainBasicAuthorization(request); + OAuth2ClientDO client = oauth2ClientService.validOAuthClientFromCache(clientIdAndSecret[0], clientIdAndSecret[1], + null, null, null); + + // 删除访问令牌 + return success(oauth2GrantService.revokeToken(client.getClientId(), token)); + } + + /** + * 对应 Spring Security OAuth 的 CheckTokenEndpoint 类的 checkToken 方法 + */ + @PostMapping("/check-token") + @PermitAll + @Operation(summary = "校验访问令牌") + @Parameter(name = "token", required = true, description = "访问令牌", example = "biu") + @OperateLog(enable = false) // 避免 Post 请求被记录操作日志 + public CommonResult checkToken(HttpServletRequest request, + @RequestParam("token") String token) { + // 校验客户端 + String[] clientIdAndSecret = obtainBasicAuthorization(request); + oauth2ClientService.validOAuthClientFromCache(clientIdAndSecret[0], clientIdAndSecret[1], + null, null, null); + + // 校验令牌 + OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.checkAccessToken(token); + Assert.notNull(accessTokenDO, "访问令牌不能为空"); // 防御性检查 + return success(OAuth2OpenConvert.INSTANCE.convert2(accessTokenDO)); + } + + /** + * 对应 Spring Security OAuth 的 AuthorizationEndpoint 类的 authorize 方法 + */ + @GetMapping("/authorize") + @Operation(summary = "获得授权信息", description = "适合 code 授权码模式,或者 implicit 简化模式;在 sso.vue 单点登录界面被【获取】调用") + @Parameter(name = "clientId", required = true, description = "客户端编号", example = "tudou") + public CommonResult authorize(@RequestParam("clientId") String clientId) { + // 0. 校验用户已经登录。通过 Spring Security 实现 + + // 1. 获得 Client 客户端的信息 + OAuth2ClientDO client = oauth2ClientService.validOAuthClientFromCache(clientId); + // 2. 获得用户已经授权的信息 + List approves = oauth2ApproveService.getApproveList(getLoginUserId(), clientId); + // 拼接返回 + return success(OAuth2OpenConvert.INSTANCE.convert(client, approves)); + } + + /** + * 对应 Spring Security OAuth 的 AuthorizationEndpoint 类的 approveOrDeny 方法 + * + * 场景一:【自动授权 autoApprove = true】 + * 刚进入 sso.vue 界面,调用该接口,用户历史已经给该应用做过对应的授权,或者 OAuth2Client 支持该 scope 的自动授权 + * 场景二:【手动授权 autoApprove = false】 + * 在 sso.vue 界面,用户选择好 scope 授权范围,调用该接口,进行授权。此时,approved 为 true 或者 false + * + * 因为前后端分离,Axios 无法很好的处理 302 重定向,所以和 Spring Security OAuth 略有不同,返回结果是重定向的 URL,剩余交给前端处理 + */ + @PostMapping("/authorize") + @Operation(summary = "申请授权", description = "适合 code 授权码模式,或者 implicit 简化模式;在 sso.vue 单点登录界面被【提交】调用") + @Parameters({ + @Parameter(name = "response_type", required = true, description = "响应类型", example = "code"), + @Parameter(name = "client_id", required = true, description = "客户端编号", example = "tudou"), + @Parameter(name = "scope", description = "授权范围", example = "userinfo.read"), // 使用 Map 格式,Spring MVC 暂时不支持这么接收参数 + @Parameter(name = "redirect_uri", required = true, description = "重定向 URI", example = "https://www.iocoder.cn"), + @Parameter(name = "auto_approve", required = true, description = "用户是否接受", example = "true"), + @Parameter(name = "state", example = "1") + }) + @OperateLog(enable = false) // 避免 Post 请求被记录操作日志 + public CommonResult approveOrDeny(@RequestParam("response_type") String responseType, + @RequestParam("client_id") String clientId, + @RequestParam(value = "scope", required = false) String scope, + @RequestParam("redirect_uri") String redirectUri, + @RequestParam(value = "auto_approve") Boolean autoApprove, + @RequestParam(value = "state", required = false) String state) { + @SuppressWarnings("unchecked") + Map scopes = JsonUtils.parseObject(scope, Map.class); + scopes = ObjectUtil.defaultIfNull(scopes, Collections.emptyMap()); + // 0. 校验用户已经登录。通过 Spring Security 实现 + + // 1.1 校验 responseType 是否满足 code 或者 token 值 + OAuth2GrantTypeEnum grantTypeEnum = getGrantTypeEnum(responseType); + // 1.2 校验 redirectUri 重定向域名是否合法 + 校验 scope 是否在 Client 授权范围内 + OAuth2ClientDO client = oauth2ClientService.validOAuthClientFromCache(clientId, null, + grantTypeEnum.getGrantType(), scopes.keySet(), redirectUri); + + // 2.1 假设 approved 为 null,说明是场景一 + if (Boolean.TRUE.equals(autoApprove)) { + // 如果无法自动授权通过,则返回空 url,前端不进行跳转 + if (!oauth2ApproveService.checkForPreApproval(getLoginUserId(), clientId, scopes.keySet())) { + return success(null); + } + } else { // 2.2 假设 approved 非 null,说明是场景二 + // 如果计算后不通过,则跳转一个错误链接 + if (!oauth2ApproveService.updateAfterApproval(getLoginUserId(), clientId, scopes)) { + return success(OAuth2Utils.buildUnsuccessfulRedirect(redirectUri, responseType, state, + "access_denied", "User denied access")); + } + } + + // 3.1 如果是 code 授权码模式,则发放 code 授权码,并重定向 + List approveScopes = convertList(scopes.entrySet(), Map.Entry::getKey, Map.Entry::getValue); + if (grantTypeEnum == OAuth2GrantTypeEnum.AUTHORIZATION_CODE) { + return success(getAuthorizationCodeRedirect(getLoginUserId(), client, approveScopes, redirectUri, state)); + } + // 3.2 如果是 token 则是 implicit 简化模式,则发送 accessToken 访问令牌,并重定向 + return success(getImplicitGrantRedirect(getLoginUserId(), client, approveScopes, redirectUri, state)); + } + + private static OAuth2GrantTypeEnum getGrantTypeEnum(String responseType) { + if (StrUtil.equals(responseType, "code")) { + return OAuth2GrantTypeEnum.AUTHORIZATION_CODE; + } + if (StrUtil.equalsAny(responseType, "token")) { + return OAuth2GrantTypeEnum.IMPLICIT; + } + throw exception0(BAD_REQUEST.getCode(), "response_type 参数值只允许 code 和 token"); + } + + private String getImplicitGrantRedirect(Long userId, OAuth2ClientDO client, + List scopes, String redirectUri, String state) { + // 1. 创建 access token 访问令牌 + OAuth2AccessTokenDO accessTokenDO = oauth2GrantService.grantImplicit(userId, client.getClientId(), scopes); + Assert.notNull(accessTokenDO, "访问令牌不能为空"); // 防御性检查 + // 2. 拼接重定向的 URL + // noinspection unchecked + return OAuth2Utils.buildImplicitRedirectUri(redirectUri, accessTokenDO.getAccessToken(), state, accessTokenDO.getExpiresTime(), + scopes, JsonUtils.parseObject(client.getAdditionalInformation(), Map.class)); + } + + private String getAuthorizationCodeRedirect(Long userId, OAuth2ClientDO client, + List scopes, String redirectUri, String state) { + // 1. 创建 code 授权码 + String authorizationCode = oauth2GrantService.grantAuthorizationCodeForCode(userId, client.getClientId(), scopes, redirectUri, state); + // 2. 拼接重定向的 URL + return OAuth2Utils.buildAuthorizationCodeRedirectUri(redirectUri, authorizationCode, state); + } + + private String[] obtainBasicAuthorization(HttpServletRequest request) { + String[] clientIdAndSecret = HttpUtils.obtainBasicAuthorization(request); + if (ArrayUtil.isEmpty(clientIdAndSecret) || clientIdAndSecret.length != 2) { + throw exception0(BAD_REQUEST.getCode(), "client_id 或 client_secret 未正确传递"); + } + return clientIdAndSecret; + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/OAuth2TokenController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/OAuth2TokenController.java new file mode 100644 index 0000000..c16c297 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/OAuth2TokenController.java @@ -0,0 +1,50 @@ +package com.win.module.system.controller.oauth2; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.oauth2.vo.token.OAuth2AccessTokenPageReqVO; +import com.win.module.system.controller.oauth2.vo.token.OAuth2AccessTokenRespVO; +import com.win.module.system.convert.auth.OAuth2TokenConvert; +import com.win.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; +import com.win.module.system.enums.logger.LoginLogTypeEnum; +import com.win.module.system.service.auth.AdminAuthService; +import com.win.module.system.service.oauth2.OAuth2TokenService; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; + +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - OAuth2.0 令牌") +@RestController +@RequestMapping("/system/oauth2-token") +public class OAuth2TokenController { + + @Resource + private OAuth2TokenService oauth2TokenService; + @Resource + private AdminAuthService authService; + + @GetMapping("/page") + @Operation(summary = "获得访问令牌分页", description = "只返回有效期内的") + @PreAuthorize("@ss.hasPermission('system:oauth2-token:page')") + public CommonResult> getAccessTokenPage(@Valid OAuth2AccessTokenPageReqVO reqVO) { + PageResult pageResult = oauth2TokenService.getAccessTokenPage(reqVO); + return success(OAuth2TokenConvert.INSTANCE.convert(pageResult)); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除访问令牌") + @Parameter(name = "accessToken", description = "访问令牌", required = true, example = "tudou") + @PreAuthorize("@ss.hasPermission('system:oauth2-token:delete')") + public CommonResult deleteAccessToken(@RequestParam("accessToken") String accessToken) { + authService.logout(accessToken, LoginLogTypeEnum.LOGOUT_DELETE.getType()); + return success(true); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/OAuth2UserController.http b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/OAuth2UserController.http new file mode 100644 index 0000000..b2cd247 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/OAuth2UserController.http @@ -0,0 +1,14 @@ +### 请求 /system/oauth2/user/get 接口 => 成功 +GET {{baseUrl}}/system/oauth2/user/get +Authorization: Bearer 47f9c74ec11041f193b777ebb95c3b0d +tenant-id: {{adminTenentId}} + +### 请求 /system/oauth2/user/update 接口 => 成功 +PUT {{baseUrl}}/system/oauth2/user/update +Content-Type: application/json +Authorization: Bearer 47f9c74ec11041f193b777ebb95c3b0d +tenant-id: {{adminTenentId}} + +{ + "nickname": "闻荫源码" +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/OAuth2UserController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/OAuth2UserController.java new file mode 100644 index 0000000..101c968 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/OAuth2UserController.java @@ -0,0 +1,80 @@ +package com.win.module.system.controller.oauth2; + +import cn.hutool.core.collection.CollUtil; +import com.win.framework.common.pojo.CommonResult; +import com.win.module.system.controller.oauth2.vo.user.OAuth2UserInfoRespVO; +import com.win.module.system.controller.oauth2.vo.user.OAuth2UserUpdateReqVO; +import com.win.module.system.convert.oauth2.OAuth2UserConvert; +import com.win.module.system.dal.dataobject.dept.DeptDO; +import com.win.module.system.dal.dataobject.dept.PostDO; +import com.win.module.system.dal.dataobject.user.AdminUserDO; +import com.win.module.system.service.dept.DeptService; +import com.win.module.system.service.dept.PostService; +import com.win.module.system.service.user.AdminUserService; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.List; + +import static com.win.framework.common.pojo.CommonResult.success; +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + +/** + * 提供给外部应用调用为主 + * + * 1. 在 getUserInfo 方法上,添加 @PreAuthorize("@ss.hasScope('user.read')") 注解,声明需要满足 scope = user.read + * 2. 在 updateUserInfo 方法上,添加 @PreAuthorize("@ss.hasScope('user.write')") 注解,声明需要满足 scope = user.write + * + * @author 闻荫源码 + */ +@Tag(name = "管理后台 - OAuth2.0 用户") +@RestController +@RequestMapping("/system/oauth2/user") +@Validated +@Slf4j +public class OAuth2UserController { + + @Resource + private AdminUserService userService; + @Resource + private DeptService deptService; + @Resource + private PostService postService; + + @GetMapping("/get") + @Operation(summary = "获得用户基本信息") + @PreAuthorize("@ss.hasScope('user.read')") // + public CommonResult getUserInfo() { + // 获得用户基本信息 + AdminUserDO user = userService.getUser(getLoginUserId()); + OAuth2UserInfoRespVO resp = OAuth2UserConvert.INSTANCE.convert(user); + // 获得部门信息 + if (user.getDeptId() != null) { + DeptDO dept = deptService.getDept(user.getDeptId()); + resp.setDept(OAuth2UserConvert.INSTANCE.convert(dept)); + } + // 获得岗位信息 + if (CollUtil.isNotEmpty(user.getPostIds())) { + List posts = postService.getPostList(user.getPostIds()); + resp.setPosts(OAuth2UserConvert.INSTANCE.convertList(posts)); + } + return success(resp); + } + + @PutMapping("/update") + @Operation(summary = "更新用户基本信息") + @PreAuthorize("@ss.hasScope('user.write')") + public CommonResult updateUserInfo(@Valid @RequestBody OAuth2UserUpdateReqVO reqVO) { + // 这里将 UserProfileUpdateReqVO =》UserProfileUpdateReqVO 对象,实现接口的复用。 + // 主要是,AdminUserService 没有自己的 BO 对象,所以复用只能这么做 + userService.updateUserProfile(getLoginUserId(), OAuth2UserConvert.INSTANCE.convert(reqVO)); + return success(true); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/vo/client/OAuth2ClientBaseVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/vo/client/OAuth2ClientBaseVO.java new file mode 100644 index 0000000..a2a4194 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/vo/client/OAuth2ClientBaseVO.java @@ -0,0 +1,82 @@ +package com.win.module.system.controller.oauth2.vo.client; + +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.util.json.JsonUtils; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.hibernate.validator.constraints.URL; + +import javax.validation.constraints.AssertTrue; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** +* OAuth2 客户端 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class OAuth2ClientBaseVO { + + @Schema(description = "客户端编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "tudou") + @NotNull(message = "客户端编号不能为空") + private String clientId; + + @Schema(description = "客户端密钥", requiredMode = Schema.RequiredMode.REQUIRED, example = "fan") + @NotNull(message = "客户端密钥不能为空") + private String secret; + + @Schema(description = "应用名", requiredMode = Schema.RequiredMode.REQUIRED, example = "土豆") + @NotNull(message = "应用名不能为空") + private String name; + + @Schema(description = "应用图标", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/xx.png") + @NotNull(message = "应用图标不能为空") + @URL(message = "应用图标的地址不正确") + private String logo; + + @Schema(description = "应用描述", example = "我是一个应用") + private String description; + + @Schema(description = "状态,参见 CommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "状态不能为空") + private Integer status; + + @Schema(description = "访问令牌的有效期", requiredMode = Schema.RequiredMode.REQUIRED, example = "8640") + @NotNull(message = "访问令牌的有效期不能为空") + private Integer accessTokenValiditySeconds; + + @Schema(description = "刷新令牌的有效期", requiredMode = Schema.RequiredMode.REQUIRED, example = "8640000") + @NotNull(message = "刷新令牌的有效期不能为空") + private Integer refreshTokenValiditySeconds; + + @Schema(description = "可重定向的 URI 地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn") + @NotNull(message = "可重定向的 URI 地址不能为空") + private List<@NotEmpty(message = "重定向的 URI 不能为空") + @URL(message = "重定向的 URI 格式不正确") String> redirectUris; + + @Schema(description = "授权类型,参见 OAuth2GrantTypeEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "password") + @NotNull(message = "授权类型不能为空") + private List authorizedGrantTypes; + + @Schema(description = "授权范围", example = "user_info") + private List scopes; + + @Schema(description = "自动通过的授权范围", example = "user_info") + private List autoApproveScopes; + + @Schema(description = "权限", example = "system:user:query") + private List authorities; + + @Schema(description = "资源", example = "1024") + private List resourceIds; + + @Schema(description = "附加信息", example = "{yunai: true}") + private String additionalInformation; + + @AssertTrue(message = "附加信息必须是 JSON 格式") + public boolean isAdditionalInformationJson() { + return StrUtil.isEmpty(additionalInformation) || JsonUtils.isJson(additionalInformation); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/vo/client/OAuth2ClientCreateReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/vo/client/OAuth2ClientCreateReqVO.java new file mode 100644 index 0000000..9813a56 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/vo/client/OAuth2ClientCreateReqVO.java @@ -0,0 +1,12 @@ +package com.win.module.system.controller.oauth2.vo.client; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +@Schema(description = "管理后台 - OAuth2 客户端创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class OAuth2ClientCreateReqVO extends OAuth2ClientBaseVO { + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/vo/client/OAuth2ClientPageReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/vo/client/OAuth2ClientPageReqVO.java new file mode 100644 index 0000000..0f8ed2d --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/vo/client/OAuth2ClientPageReqVO.java @@ -0,0 +1,19 @@ +package com.win.module.system.controller.oauth2.vo.client; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import com.win.framework.common.pojo.PageParam; + +@Schema(description = "管理后台 - OAuth2 客户端分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class OAuth2ClientPageReqVO extends PageParam { + + @Schema(description = "应用名,模糊匹配", example = "土豆") + private String name; + + @Schema(description = "状态,参见 CommonStatusEnum 枚举", example = "1") + private Integer status; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/vo/client/OAuth2ClientRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/vo/client/OAuth2ClientRespVO.java new file mode 100644 index 0000000..2d04e3c --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/vo/client/OAuth2ClientRespVO.java @@ -0,0 +1,22 @@ +package com.win.module.system.controller.oauth2.vo.client; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - OAuth2 客户端 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class OAuth2ClientRespVO extends OAuth2ClientBaseVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/vo/client/OAuth2ClientUpdateReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/vo/client/OAuth2ClientUpdateReqVO.java new file mode 100644 index 0000000..6e07e65 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/vo/client/OAuth2ClientUpdateReqVO.java @@ -0,0 +1,20 @@ +package com.win.module.system.controller.oauth2.vo.client; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - OAuth2 客户端更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class OAuth2ClientUpdateReqVO extends OAuth2ClientBaseVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "编号不能为空") + private Long id; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/vo/open/OAuth2OpenAccessTokenRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/vo/open/OAuth2OpenAccessTokenRespVO.java new file mode 100644 index 0000000..53ad464 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/vo/open/OAuth2OpenAccessTokenRespVO.java @@ -0,0 +1,34 @@ +package com.win.module.system.controller.oauth2.vo.open; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Schema(description = "管理后台 - 【开放接口】访问令牌 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class OAuth2OpenAccessTokenRespVO { + + @Schema(description = "访问令牌", requiredMode = Schema.RequiredMode.REQUIRED, example = "tudou") + @JsonProperty("access_token") + private String accessToken; + + @Schema(description = "刷新令牌", requiredMode = Schema.RequiredMode.REQUIRED, example = "nice") + @JsonProperty("refresh_token") + private String refreshToken; + + @Schema(description = "令牌类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "bearer") + @JsonProperty("token_type") + private String tokenType; + + @Schema(description = "过期时间,单位:秒", requiredMode = Schema.RequiredMode.REQUIRED, example = "42430") + @JsonProperty("expires_in") + private Long expiresIn; + + @Schema(description = "授权范围,如果多个授权范围,使用空格分隔", example = "user_info") + private String scope; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/vo/open/OAuth2OpenAuthorizeInfoRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/vo/open/OAuth2OpenAuthorizeInfoRespVO.java new file mode 100644 index 0000000..b798299 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/vo/open/OAuth2OpenAuthorizeInfoRespVO.java @@ -0,0 +1,38 @@ +package com.win.module.system.controller.oauth2.vo.open; + +import com.win.framework.common.core.KeyValue; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Schema(description = "管理后台 - 授权页的信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class OAuth2OpenAuthorizeInfoRespVO { + + /** + * 客户端 + */ + private Client client; + + @Schema(description = "scope 的选中信息,使用 List 保证有序性,Key 是 scope,Value 为是否选中", requiredMode = Schema.RequiredMode.REQUIRED) + private List> scopes; + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class Client { + + @Schema(description = "应用名", requiredMode = Schema.RequiredMode.REQUIRED, example = "土豆") + private String name; + + @Schema(description = "应用图标", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/xx.png") + private String logo; + + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/vo/open/OAuth2OpenCheckTokenRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/vo/open/OAuth2OpenCheckTokenRespVO.java new file mode 100644 index 0000000..9e36b2e --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/vo/open/OAuth2OpenCheckTokenRespVO.java @@ -0,0 +1,37 @@ +package com.win.module.system.controller.oauth2.vo.open; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Schema(description = "管理后台 - 【开放接口】校验令牌 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class OAuth2OpenCheckTokenRespVO { + + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "666") + @JsonProperty("user_id") + private Long userId; + @Schema(description = "租户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @JsonProperty("tenant_id") + private Long tenantId; + + @Schema(description = "客户端编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "car") + @JsonProperty("client_id") + private String clientId; + @Schema(description = "授权范围", requiredMode = Schema.RequiredMode.REQUIRED, example = "user_info") + private List scopes; + + @Schema(description = "访问令牌", requiredMode = Schema.RequiredMode.REQUIRED, example = "tudou") + @JsonProperty("access_token") + private String accessToken; + + @Schema(description = "过期时间,时间戳 / 1000,即单位:秒", requiredMode = Schema.RequiredMode.REQUIRED, example = "1593092157") + private Long exp; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/vo/token/OAuth2AccessTokenPageReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/vo/token/OAuth2AccessTokenPageReqVO.java new file mode 100644 index 0000000..987fe79 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/vo/token/OAuth2AccessTokenPageReqVO.java @@ -0,0 +1,19 @@ +package com.win.module.system.controller.oauth2.vo.token; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Schema(description = "管理后台 - 访问令牌分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class OAuth2AccessTokenPageReqVO extends PageParam { + + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "666") + private Long userId; + + @Schema(description = "客户端编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + private String clientId; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/vo/token/OAuth2AccessTokenRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/vo/token/OAuth2AccessTokenRespVO.java new file mode 100644 index 0000000..465354c --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/vo/token/OAuth2AccessTokenRespVO.java @@ -0,0 +1,37 @@ +package com.win.module.system.controller.oauth2.vo.token; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 访问令牌 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class OAuth2AccessTokenRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "访问令牌", requiredMode = Schema.RequiredMode.REQUIRED, example = "tudou") + private String accessToken; + + @Schema(description = "刷新令牌", requiredMode = Schema.RequiredMode.REQUIRED, example = "nice") + private String refreshToken; + + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "666") + private Long userId; + + @Schema(description = "客户端编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + private String clientId; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + + @Schema(description = "过期时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime expiresTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/vo/user/OAuth2UserInfoRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/vo/user/OAuth2UserInfoRespVO.java new file mode 100644 index 0000000..999ff55 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/vo/user/OAuth2UserInfoRespVO.java @@ -0,0 +1,70 @@ +package com.win.module.system.controller.oauth2.vo.user; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Schema(description = "管理后台 - OAuth2 获得用户基本信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class OAuth2UserInfoRespVO { + + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long id; + + @Schema(description = "用户账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + private String username; + + @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "闻荫") + private String nickname; + + @Schema(description = "用户邮箱", example = "win@iocoder.cn") + private String email; + @Schema(description = "手机号码", example = "15601691300") + private String mobile; + + @Schema(description = "用户性别,参见 SexEnum 枚举类", example = "1") + private Integer sex; + + @Schema(description = "用户头像", example = "https://www.iocoder.cn/xxx.png") + private String avatar; + + /** + * 所在部门 + */ + private Dept dept; + + /** + * 所属岗位数组 + */ + private List posts; + + @Schema(description = "部门") + @Data + public static class Dept { + + @Schema(description = "部门编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long id; + + @Schema(description = "部门名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "研发部") + private String name; + + } + + @Schema(description = "岗位") + @Data + public static class Post { + + @Schema(description = "岗位编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long id; + + @Schema(description = "岗位名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "开发") + private String name; + + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/vo/user/OAuth2UserUpdateReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/vo/user/OAuth2UserUpdateReqVO.java new file mode 100644 index 0000000..c16bb8d --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/vo/user/OAuth2UserUpdateReqVO.java @@ -0,0 +1,34 @@ +package com.win.module.system.controller.oauth2.vo.user; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.Email; +import javax.validation.constraints.Size; + +@Schema(description = "管理后台 - OAuth2 更新用户基本信息 Request VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class OAuth2UserUpdateReqVO { + + @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + @Size(max = 30, message = "用户昵称长度不能超过 30 个字符") + private String nickname; + + @Schema(description = "用户邮箱", example = "win@iocoder.cn") + @Email(message = "邮箱格式不正确") + @Size(max = 50, message = "邮箱长度不能超过 50 个字符") + private String email; + + @Schema(description = "手机号码", example = "15601691300") + @Length(min = 11, max = 11, message = "手机号长度必须 11 位") + private String mobile; + + @Schema(description = "用户性别,参见 SexEnum 枚举类", example = "1") + private Integer sex; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/MenuController.http b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/MenuController.http new file mode 100644 index 0000000..a90d8b8 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/MenuController.http @@ -0,0 +1,4 @@ +### 请求 /menu/list 接口 => 成功 +GET {{baseUrl}}/system/menu/list +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/MenuController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/MenuController.java new file mode 100644 index 0000000..d11d822 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/MenuController.java @@ -0,0 +1,87 @@ +package com.win.module.system.controller.permission; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.pojo.CommonResult; +import com.win.module.system.controller.permission.vo.menu.*; +import com.win.module.system.convert.permission.MenuConvert; +import com.win.module.system.dal.dataobject.permission.MenuDO; +import com.win.module.system.service.permission.MenuService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.Comparator; +import java.util.List; + +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 菜单") +@RestController +@RequestMapping("/system/menu") +@Validated +public class MenuController { + + @Resource + private MenuService menuService; + + @PostMapping("/create") + @Operation(summary = "创建菜单") + @PreAuthorize("@ss.hasPermission('system:menu:create')") + public CommonResult createMenu(@Valid @RequestBody MenuCreateReqVO reqVO) { + Long menuId = menuService.createMenu(reqVO); + return success(menuId); + } + + @PutMapping("/update") + @Operation(summary = "修改菜单") + @PreAuthorize("@ss.hasPermission('system:menu:update')") + public CommonResult updateMenu(@Valid @RequestBody MenuUpdateReqVO reqVO) { + menuService.updateMenu(reqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除菜单") + @Parameter(name = "id", description = "角色编号", required= true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:menu:delete')") + public CommonResult deleteMenu(@RequestParam("id") Long id) { + menuService.deleteMenu(id); + return success(true); + } + + @GetMapping("/list") + @Operation(summary = "获取菜单列表", description = "用于【菜单管理】界面") + @PreAuthorize("@ss.hasPermission('system:menu:query')") + public CommonResult> getMenuList(MenuListReqVO reqVO) { + List list = menuService.getMenuList(reqVO); + list.sort(Comparator.comparing(MenuDO::getSort)); + return success(MenuConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/list-all-simple") + @Operation(summary = "获取菜单精简信息列表", description = "只包含被开启的菜单,用于【角色分配菜单】功能的选项。" + + "在多租户的场景下,会只返回租户所在套餐有的菜单") + public CommonResult> getSimpleMenuList() { + // 获得菜单列表,只要开启状态的 + MenuListReqVO reqVO = new MenuListReqVO(); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + List list = menuService.getMenuListByTenant(reqVO); + // 排序后,返回给前端 + list.sort(Comparator.comparing(MenuDO::getSort)); + return success(MenuConvert.INSTANCE.convertList02(list)); + } + + @GetMapping("/get") + @Operation(summary = "获取菜单信息") + @PreAuthorize("@ss.hasPermission('system:menu:query')") + public CommonResult getMenu(Long id) { + MenuDO menu = menuService.getMenu(id); + return success(MenuConvert.INSTANCE.convert(menu)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/PermissionController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/PermissionController.java new file mode 100644 index 0000000..8fea308 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/PermissionController.java @@ -0,0 +1,82 @@ +package com.win.module.system.controller.permission; + +import cn.hutool.core.collection.CollUtil; +import com.win.framework.common.pojo.CommonResult; +import com.win.module.system.controller.permission.vo.permission.PermissionAssignRoleDataScopeReqVO; +import com.win.module.system.controller.permission.vo.permission.PermissionAssignRoleMenuReqVO; +import com.win.module.system.controller.permission.vo.permission.PermissionAssignUserRoleReqVO; +import com.win.module.system.service.permission.PermissionService; +import com.win.module.system.service.tenant.TenantService; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.Set; + +import static com.win.framework.common.pojo.CommonResult.success; + +/** + * 权限 Controller,提供赋予用户、角色的权限的 API 接口 + * + * @author 闻荫源码 + */ +@Tag(name = "管理后台 - 权限") +@RestController +@RequestMapping("/system/permission") +public class PermissionController { + + @Resource + private PermissionService permissionService; + @Resource + private TenantService tenantService; + + @Operation(summary = "获得角色拥有的菜单编号") + @Parameter(name = "roleId", description = "角色编号", required = true) + @GetMapping("/list-role-menus") + @PreAuthorize("@ss.hasPermission('system:permission:assign-role-menu')") + public CommonResult> getRoleMenuList(Long roleId) { + return success(permissionService.getRoleMenuListByRoleId(roleId)); + } + + @PostMapping("/assign-role-menu") + @Operation(summary = "赋予角色菜单") + @PreAuthorize("@ss.hasPermission('system:permission:assign-role-menu')") + public CommonResult assignRoleMenu(@Validated @RequestBody PermissionAssignRoleMenuReqVO reqVO) { + // 开启多租户的情况下,需要过滤掉未开通的菜单 + tenantService.handleTenantMenu(menuIds -> reqVO.getMenuIds().removeIf(menuId -> !CollUtil.contains(menuIds, menuId))); + + // 执行菜单的分配 + permissionService.assignRoleMenu(reqVO.getRoleId(), reqVO.getMenuIds()); + return success(true); + } + + @PostMapping("/assign-role-data-scope") + @Operation(summary = "赋予角色数据权限") + @PreAuthorize("@ss.hasPermission('system:permission:assign-role-data-scope')") + public CommonResult assignRoleDataScope(@Valid @RequestBody PermissionAssignRoleDataScopeReqVO reqVO) { + permissionService.assignRoleDataScope(reqVO.getRoleId(), reqVO.getDataScope(), reqVO.getDataScopeDeptIds()); + return success(true); + } + + @Operation(summary = "获得管理员拥有的角色编号列表") + @Parameter(name = "userId", description = "用户编号", required = true) + @GetMapping("/list-user-roles") + @PreAuthorize("@ss.hasPermission('system:permission:assign-user-role')") + public CommonResult> listAdminRoles(@RequestParam("userId") Long userId) { + return success(permissionService.getUserRoleIdListByUserId(userId)); + } + + @Operation(summary = "赋予用户角色") + @PostMapping("/assign-user-role") + @PreAuthorize("@ss.hasPermission('system:permission:assign-user-role')") + public CommonResult assignUserRole(@Validated @RequestBody PermissionAssignUserRoleReqVO reqVO) { + permissionService.assignUserRole(reqVO.getUserId(), reqVO.getRoleIds()); + return success(true); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/RoleController.http b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/RoleController.http new file mode 100644 index 0000000..c68b86b --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/RoleController.http @@ -0,0 +1,42 @@ +### /role/create 成功 +POST {{baseUrl}}/system/role/create +Authorization: Bearer {{token}} +Content-Type: application/json +tenant-id: {{adminTenentId}} + +{ + "name": "测试角色", + "code": "test", + "sort": 0 +} + +### /role/update 成功 +POST {{baseUrl}}/system/role/update +Authorization: Bearer {{token}} +Content-Type: application/json +tenant-id: {{adminTenentId}} + +{ + "id": 100, + "name": "测试角色", + "code": "test", + "sort": 10 +} +### /resource/delete 成功 +POST {{baseUrl}}/system/role/delete +Content-Type: application/x-www-form-urlencoded +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} + +roleId=14 + +### /role/get 成功 +GET {{baseUrl}}/system/role/get?id=100 +Content-Type: application/x-www-form-urlencoded +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} + +### /role/page 成功 +GET {{baseUrl}}/system/role/page?pageNo=1&pageSize=10 +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/RoleController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/RoleController.java new file mode 100644 index 0000000..eb606f7 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/RoleController.java @@ -0,0 +1,106 @@ +package com.win.module.system.controller.permission; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.excel.core.util.ExcelUtils; +import com.win.framework.operatelog.core.annotations.OperateLog; +import com.win.module.system.controller.permission.vo.role.*; +import com.win.module.system.convert.permission.RoleConvert; +import com.win.module.system.dal.dataobject.permission.RoleDO; +import com.win.module.system.service.permission.RoleService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.Comparator; +import java.util.List; + +import static com.win.framework.common.pojo.CommonResult.success; +import static com.win.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; +import static java.util.Collections.singleton; + +@Tag(name = "管理后台 - 角色") +@RestController +@RequestMapping("/system/role") +@Validated +public class RoleController { + + @Resource + private RoleService roleService; + + @PostMapping("/create") + @Operation(summary = "创建角色") + @PreAuthorize("@ss.hasPermission('system:role:create')") + public CommonResult createRole(@Valid @RequestBody RoleCreateReqVO reqVO) { + return success(roleService.createRole(reqVO, null)); + } + + @PutMapping("/update") + @Operation(summary = "修改角色") + @PreAuthorize("@ss.hasPermission('system:role:update')") + public CommonResult updateRole(@Valid @RequestBody RoleUpdateReqVO reqVO) { + roleService.updateRole(reqVO); + return success(true); + } + + @PutMapping("/update-status") + @Operation(summary = "修改角色状态") + @PreAuthorize("@ss.hasPermission('system:role:update')") + public CommonResult updateRoleStatus(@Valid @RequestBody RoleUpdateStatusReqVO reqVO) { + roleService.updateRoleStatus(reqVO.getId(), reqVO.getStatus()); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除角色") + @Parameter(name = "id", description = "角色编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:role:delete')") + public CommonResult deleteRole(@RequestParam("id") Long id) { + roleService.deleteRole(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得角色信息") + @PreAuthorize("@ss.hasPermission('system:role:query')") + public CommonResult getRole(@RequestParam("id") Long id) { + RoleDO role = roleService.getRole(id); + return success(RoleConvert.INSTANCE.convert(role)); + } + + @GetMapping("/page") + @Operation(summary = "获得角色分页") + @PreAuthorize("@ss.hasPermission('system:role:query')") + public CommonResult> getRolePage(RolePageReqVO reqVO) { + return success(roleService.getRolePage(reqVO)); + } + + @GetMapping("/list-all-simple") + @Operation(summary = "获取角色精简信息列表", description = "只包含被开启的角色,主要用于前端的下拉选项") + public CommonResult> getSimpleRoleList() { + // 获得角色列表,只要开启状态的 + List list = roleService.getRoleListByStatus(singleton(CommonStatusEnum.ENABLE.getStatus())); + // 排序后,返回给前端 + list.sort(Comparator.comparing(RoleDO::getSort)); + return success(RoleConvert.INSTANCE.convertList02(list)); + } + + @GetMapping("/export") + @OperateLog(type = EXPORT) + @PreAuthorize("@ss.hasPermission('system:role:export')") + public void export(HttpServletResponse response, @Validated RoleExportReqVO reqVO) throws IOException { + List list = roleService.getRoleList(reqVO); + List data = RoleConvert.INSTANCE.convertList03(list); + // 输出 + ExcelUtils.write(response, "角色数据.xls", "角色列表", RoleExcelVO.class, data); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/menu/MenuBaseVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/menu/MenuBaseVO.java new file mode 100644 index 0000000..d9c0054 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/menu/MenuBaseVO.java @@ -0,0 +1,65 @@ +package com.win.module.system.controller.permission.vo.menu; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +/** + * 菜单 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class MenuBaseVO { + + @Schema(description = "菜单名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "闻荫") + @NotBlank(message = "菜单名称不能为空") + @Size(max = 50, message = "菜单名称长度不能超过50个字符") + private String name; + + @Schema(description = "权限标识,仅菜单类型为按钮时,才需要传递", example = "sys:menu:add") + @Size(max = 100) + private String permission; + + @Schema(description = "类型,参见 MenuTypeEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "菜单类型不能为空") + private Integer type; + + @Schema(description = "显示顺序不能为空", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "显示顺序不能为空") + private Integer sort; + + @Schema(description = "父菜单 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "父菜单 ID 不能为空") + private Long parentId; + + @Schema(description = "路由地址,仅菜单类型为菜单或者目录时,才需要传", example = "post") + @Size(max = 200, message = "路由地址不能超过200个字符") + private String path; + + @Schema(description = "菜单图标,仅菜单类型为菜单或者目录时,才需要传", example = "/menu/list") + private String icon; + + @Schema(description = "组件路径,仅菜单类型为菜单时,才需要传", example = "system/post/index") + @Size(max = 200, message = "组件路径不能超过255个字符") + private String component; + + @Schema(description = "组件名", example = "SystemUser") + private String componentName; + + @Schema(description = "状态,见 CommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "状态不能为空") + private Integer status; + + @Schema(description = "是否可见", example = "false") + private Boolean visible; + + @Schema(description = "是否缓存", example = "false") + private Boolean keepAlive; + + @Schema(description = "是否总是显示", example = "false") + private Boolean alwaysShow; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/menu/MenuCreateReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/menu/MenuCreateReqVO.java new file mode 100644 index 0000000..9b7a791 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/menu/MenuCreateReqVO.java @@ -0,0 +1,10 @@ +package com.win.module.system.controller.permission.vo.menu; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +@Schema(description = "管理后台 - 菜单创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class MenuCreateReqVO extends MenuBaseVO { +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/menu/MenuListReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/menu/MenuListReqVO.java new file mode 100644 index 0000000..f781f63 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/menu/MenuListReqVO.java @@ -0,0 +1,16 @@ +package com.win.module.system.controller.permission.vo.menu; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 菜单列表 Request VO") +@Data +public class MenuListReqVO { + + @Schema(description = "菜单名称,模糊匹配", example = "闻荫") + private String name; + + @Schema(description = "展示状态,参见 CommonStatusEnum 枚举类", example = "1") + private Integer status; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/menu/MenuRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/menu/MenuRespVO.java new file mode 100644 index 0000000..7cc98c6 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/menu/MenuRespVO.java @@ -0,0 +1,27 @@ +package com.win.module.system.controller.permission.vo.menu; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 菜单信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class MenuRespVO extends MenuBaseVO { + + @Schema(description = "菜单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "状态,参见 CommonStatusEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer status; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "时间戳格式") + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/menu/MenuSimpleRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/menu/MenuSimpleRespVO.java new file mode 100644 index 0000000..ff6ad20 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/menu/MenuSimpleRespVO.java @@ -0,0 +1,28 @@ +package com.win.module.system.controller.permission.vo.menu; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 菜单精简信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class MenuSimpleRespVO { + + @Schema(description = "菜单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "菜单名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "闻荫") + private String name; + + @Schema(description = "父菜单 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long parentId; + + @Schema(description = "类型,参见 MenuTypeEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer type; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/menu/MenuUpdateReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/menu/MenuUpdateReqVO.java new file mode 100644 index 0000000..b0fb1f2 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/menu/MenuUpdateReqVO.java @@ -0,0 +1,17 @@ +package com.win.module.system.controller.permission.vo.menu; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 菜单更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class MenuUpdateReqVO extends MenuBaseVO { + + @Schema(description = "菜单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "菜单编号不能为空") + private Long id; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/permission/PermissionAssignRoleDataScopeReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/permission/PermissionAssignRoleDataScopeReqVO.java new file mode 100644 index 0000000..d968e84 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/permission/PermissionAssignRoleDataScopeReqVO.java @@ -0,0 +1,26 @@ +package com.win.module.system.controller.permission.vo.permission; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.Collections; +import java.util.Set; + +@Schema(description = "管理后台 - 赋予角色数据权限 Request VO") +@Data +public class PermissionAssignRoleDataScopeReqVO { + + @Schema(description = "角色编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "角色编号不能为空") + private Long roleId; + + @Schema(description = "数据范围,参见 DataScopeEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "数据范围不能为空") +// TODO 这里要多一个枚举校验 + private Integer dataScope; + + @Schema(description = "部门编号列表,只有范围类型为 DEPT_CUSTOM 时,该字段才需要", example = "1,3,5") + private Set dataScopeDeptIds = Collections.emptySet(); // 兜底 + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/permission/PermissionAssignRoleMenuReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/permission/PermissionAssignRoleMenuReqVO.java new file mode 100644 index 0000000..85a492c --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/permission/PermissionAssignRoleMenuReqVO.java @@ -0,0 +1,21 @@ +package com.win.module.system.controller.permission.vo.permission; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.Collections; +import java.util.Set; + +@Schema(description = "管理后台 - 赋予角色菜单 Request VO") +@Data +public class PermissionAssignRoleMenuReqVO { + + @Schema(description = "角色编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "角色编号不能为空") + private Long roleId; + + @Schema(description = "菜单编号列表", example = "1,3,5") + private Set menuIds = Collections.emptySet(); // 兜底 + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/permission/PermissionAssignUserRoleReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/permission/PermissionAssignUserRoleReqVO.java new file mode 100644 index 0000000..9212068 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/permission/PermissionAssignUserRoleReqVO.java @@ -0,0 +1,21 @@ +package com.win.module.system.controller.permission.vo.permission; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.Collections; +import java.util.Set; + +@Schema(description = "管理后台 - 赋予用户角色 Request VO") +@Data +public class PermissionAssignUserRoleReqVO { + + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "用户编号不能为空") + private Long userId; + + @Schema(description = "角色编号列表", example = "1,3,5") + private Set roleIds = Collections.emptySet(); // 兜底 + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/role/RoleBaseVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/role/RoleBaseVO.java new file mode 100644 index 0000000..6c75f5d --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/role/RoleBaseVO.java @@ -0,0 +1,34 @@ +package com.win.module.system.controller.permission.vo.role; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +/** + * 角色 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class RoleBaseVO { + + @Schema(description = "角色名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "管理员") + @NotBlank(message = "角色名称不能为空") + @Size(max = 30, message = "角色名称长度不能超过30个字符") + private String name; + + @NotBlank(message = "角色标志不能为空") + @Size(max = 100, message = "角色标志长度不能超过100个字符") + @Schema(description = "角色编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "ADMIN") + private String code; + + @Schema(description = "显示顺序不能为空", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "显示顺序不能为空") + private Integer sort; + + @Schema(description = "备注", example = "我是一个角色") + private String remark; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/role/RoleCreateReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/role/RoleCreateReqVO.java new file mode 100644 index 0000000..746dc73 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/role/RoleCreateReqVO.java @@ -0,0 +1,12 @@ +package com.win.module.system.controller.permission.vo.role; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Schema(description = "管理后台 - 角色创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class RoleCreateReqVO extends RoleBaseVO { + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/role/RoleExcelVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/role/RoleExcelVO.java new file mode 100644 index 0000000..978ac8c --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/role/RoleExcelVO.java @@ -0,0 +1,34 @@ +package com.win.module.system.controller.permission.vo.role; + +import com.win.framework.excel.core.annotations.DictFormat; +import com.win.framework.excel.core.convert.DictConvert; +import com.win.module.system.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +/** + * 角色 Excel 导出响应 VO + */ +@Data +public class RoleExcelVO { + + @ExcelProperty("角色序号") + private Long id; + + @ExcelProperty("角色名称") + private String name; + + @ExcelProperty("角色标志") + private String code; + + @ExcelProperty("角色排序") + private Integer sort; + + @ExcelProperty("数据范围") + private Integer dataScope; + + @ExcelProperty(value = "角色状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.COMMON_STATUS) + private String status; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/role/RoleExportReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/role/RoleExportReqVO.java new file mode 100644 index 0000000..44f2fdc --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/role/RoleExportReqVO.java @@ -0,0 +1,28 @@ +package com.win.module.system.controller.permission.vo.role; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 角色分页 Request VO") +@Data +public class RoleExportReqVO { + + @Schema(description = "角色名称,模糊匹配", example = "闻荫") + private String name; + + @Schema(description = "角色标识,模糊匹配", example = "win") + private String code; + + @Schema(description = "展示状态,参见 CommonStatusEnum 枚举类", example = "1") + private Integer status; + + @Schema(description = "开始时间", example = "[2022-07-01 00:00:00,2022-07-01 23:59:59]") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/role/RolePageReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/role/RolePageReqVO.java new file mode 100644 index 0000000..435544a --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/role/RolePageReqVO.java @@ -0,0 +1,31 @@ +package com.win.module.system.controller.permission.vo.role; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 角色分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class RolePageReqVO extends PageParam { + + @Schema(description = "角色名称,模糊匹配", example = "闻荫") + private String name; + + @Schema(description = "角色标识,模糊匹配", example = "win") + private String code; + + @Schema(description = "展示状态,参见 CommonStatusEnum 枚举类", example = "1") + private Integer status; + + @Schema(description = "创建时间", example = "[2022-07-01 00:00:00,2022-07-01 23:59:59]") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/role/RoleRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/role/RoleRespVO.java new file mode 100644 index 0000000..6073361 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/role/RoleRespVO.java @@ -0,0 +1,37 @@ +package com.win.module.system.controller.permission.vo.role; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; +import java.util.Set; + +@Schema(description = "管理后台 - 角色信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class RoleRespVO extends RoleBaseVO { + + @Schema(description = "角色编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long id; + + @Schema(description = "数据范围,参见 DataScopeEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer dataScope; + + @Schema(description = "数据范围(指定部门数组)", example = "1") + private Set dataScopeDeptIds; + + @Schema(description = "状态,参见 CommonStatusEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer status; + + @Schema(description = "角色类型,参见 RoleTypeEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer type; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "时间戳格式") + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/role/RoleSimpleRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/role/RoleSimpleRespVO.java new file mode 100644 index 0000000..acecedf --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/role/RoleSimpleRespVO.java @@ -0,0 +1,20 @@ +package com.win.module.system.controller.permission.vo.role; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Schema(description = "管理后台 - 角色精简信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class RoleSimpleRespVO { + + @Schema(description = "角色编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "角色名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "闻荫") + private String name; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/role/RoleUpdateReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/role/RoleUpdateReqVO.java new file mode 100644 index 0000000..547f783 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/role/RoleUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.win.module.system.controller.permission.vo.role; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 角色更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class RoleUpdateReqVO extends RoleBaseVO { + + @Schema(description = "角色编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "角色编号不能为空") + private Long id; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/role/RoleUpdateStatusReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/role/RoleUpdateStatusReqVO.java new file mode 100644 index 0000000..e57f630 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/role/RoleUpdateStatusReqVO.java @@ -0,0 +1,23 @@ +package com.win.module.system.controller.permission.vo.role; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.validation.InEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 角色更新状态 Request VO") +@Data +public class RoleUpdateStatusReqVO { + + @Schema(description = "角色编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "角色编号不能为空") + private Long id; + + @Schema(description = "状态,见 CommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "状态不能为空") + @InEnum(value = CommonStatusEnum.class, message = "修改状态必须是 {value}") + private Integer status; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sensitiveword/SensitiveWordController.http b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sensitiveword/SensitiveWordController.http new file mode 100644 index 0000000..cd97d2d --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sensitiveword/SensitiveWordController.http @@ -0,0 +1,4 @@ +### 请求 /system/sensitive-word/validate-text 接口 => 成功 +GET {{baseUrl}}/system/sensitive-word/validate-text?text=XXX&tags=短信&tags=蔬菜 +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sensitiveword/SensitiveWordController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sensitiveword/SensitiveWordController.java new file mode 100644 index 0000000..b29de20 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sensitiveword/SensitiveWordController.java @@ -0,0 +1,104 @@ +package com.win.module.system.controller.sensitiveword; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.excel.core.util.ExcelUtils; +import com.win.framework.operatelog.core.annotations.OperateLog; +import com.win.module.system.controller.sensitiveword.vo.*; +import com.win.module.system.convert.sensitiveword.SensitiveWordConvert; +import com.win.module.system.dal.dataobject.sensitiveword.SensitiveWordDO; +import com.win.module.system.service.sensitiveword.SensitiveWordService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; +import java.util.Set; + +import static com.win.framework.common.pojo.CommonResult.success; +import static com.win.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 敏感词") +@RestController +@RequestMapping("/system/sensitive-word") +@Validated +public class SensitiveWordController { + + @Resource + private SensitiveWordService sensitiveWordService; + + @PostMapping("/create") + @Operation(summary = "创建敏感词") + @PreAuthorize("@ss.hasPermission('system:sensitive-word:create')") + public CommonResult createSensitiveWord(@Valid @RequestBody SensitiveWordCreateReqVO createReqVO) { + return success(sensitiveWordService.createSensitiveWord(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新敏感词") + @PreAuthorize("@ss.hasPermission('system:sensitive-word:update')") + public CommonResult updateSensitiveWord(@Valid @RequestBody SensitiveWordUpdateReqVO updateReqVO) { + sensitiveWordService.updateSensitiveWord(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除敏感词") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('system:sensitive-word:delete')") + public CommonResult deleteSensitiveWord(@RequestParam("id") Long id) { + sensitiveWordService.deleteSensitiveWord(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得敏感词") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:sensitive-word:query')") + public CommonResult getSensitiveWord(@RequestParam("id") Long id) { + SensitiveWordDO sensitiveWord = sensitiveWordService.getSensitiveWord(id); + return success(SensitiveWordConvert.INSTANCE.convert(sensitiveWord)); + } + + @GetMapping("/page") + @Operation(summary = "获得敏感词分页") + @PreAuthorize("@ss.hasPermission('system:sensitive-word:query')") + public CommonResult> getSensitiveWordPage(@Valid SensitiveWordPageReqVO pageVO) { + PageResult pageResult = sensitiveWordService.getSensitiveWordPage(pageVO); + return success(SensitiveWordConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出敏感词 Excel") + @PreAuthorize("@ss.hasPermission('system:sensitive-word:export')") + @OperateLog(type = EXPORT) + public void exportSensitiveWordExcel(@Valid SensitiveWordExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = sensitiveWordService.getSensitiveWordList(exportReqVO); + // 导出 Excel + List datas = SensitiveWordConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "敏感词.xls", "数据", SensitiveWordExcelVO.class, datas); + } + + @GetMapping("/get-tags") + @Operation(summary = "获取所有敏感词的标签数组") + @PreAuthorize("@ss.hasPermission('system:sensitive-word:query')") + public CommonResult> getSensitiveWordTagSet() { + return success(sensitiveWordService.getSensitiveWordTagSet()); + } + + @GetMapping("/validate-text") + @Operation(summary = "获得文本所包含的不合法的敏感词数组") + public CommonResult> validateText(@RequestParam("text") String text, + @RequestParam(value = "tags", required = false) List tags) { + return success(sensitiveWordService.validateText(text, tags)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sensitiveword/vo/SensitiveWordBaseVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sensitiveword/vo/SensitiveWordBaseVO.java new file mode 100644 index 0000000..dfa93fa --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sensitiveword/vo/SensitiveWordBaseVO.java @@ -0,0 +1,31 @@ +package com.win.module.system.controller.sensitiveword.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * 敏感词 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class SensitiveWordBaseVO { + + @Schema(description = "敏感词", requiredMode = Schema.RequiredMode.REQUIRED, example = "敏感词") + @NotNull(message = "敏感词不能为空") + private String name; + + @Schema(description = "标签", requiredMode = Schema.RequiredMode.REQUIRED, example = "短信,评论") + @NotNull(message = "标签不能为空") + private List tags; + + @Schema(description = "状态,参见 CommonStatusEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "状态不能为空") + private Integer status; + + @Schema(description = "描述", example = "污言秽语") + private String description; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sensitiveword/vo/SensitiveWordCreateReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sensitiveword/vo/SensitiveWordCreateReqVO.java new file mode 100644 index 0000000..2ff8a55 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sensitiveword/vo/SensitiveWordCreateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.system.controller.sensitiveword.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Schema(description = "管理后台 - 敏感词创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SensitiveWordCreateReqVO extends SensitiveWordBaseVO { + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sensitiveword/vo/SensitiveWordExcelVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sensitiveword/vo/SensitiveWordExcelVO.java new file mode 100644 index 0000000..8148e1c --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sensitiveword/vo/SensitiveWordExcelVO.java @@ -0,0 +1,40 @@ +package com.win.module.system.controller.sensitiveword.vo; + +import com.win.framework.excel.core.annotations.DictFormat; +import com.win.framework.excel.core.convert.DictConvert; +import com.win.framework.excel.core.convert.JsonConvert; +import com.win.module.system.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * 敏感词 Excel VO + * + * @author 永不言败 + */ +@Data +public class SensitiveWordExcelVO { + + @ExcelProperty("编号") + private Long id; + + @ExcelProperty("敏感词") + private String name; + + @ExcelProperty(value = "标签", converter = JsonConvert.class) + private List tags; + + @ExcelProperty(value = "状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.COMMON_STATUS) + private Integer status; + + @ExcelProperty("描述") + private String description; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sensitiveword/vo/SensitiveWordExportReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sensitiveword/vo/SensitiveWordExportReqVO.java new file mode 100644 index 0000000..9812cdd --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sensitiveword/vo/SensitiveWordExportReqVO.java @@ -0,0 +1,28 @@ +package com.win.module.system.controller.sensitiveword.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 敏感词 Excel 导出 Request VO,参数和 SensitiveWordPageReqVO 是一致的") +@Data +public class SensitiveWordExportReqVO { + + @Schema(description = "敏感词", example = "敏感词") + private String name; + + @Schema(description = "标签", example = "短信,评论") + private String tag; + + @Schema(description = "状态,参见 CommonStatusEnum 枚举类", example = "1") + private Integer status; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @Schema(description = "创建时间") + private LocalDateTime[] createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sensitiveword/vo/SensitiveWordPageReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sensitiveword/vo/SensitiveWordPageReqVO.java new file mode 100644 index 0000000..3fa51be --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sensitiveword/vo/SensitiveWordPageReqVO.java @@ -0,0 +1,33 @@ +package com.win.module.system.controller.sensitiveword.vo; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 敏感词分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SensitiveWordPageReqVO extends PageParam { + + @Schema(description = "敏感词", example = "敏感词") + private String name; + + @Schema(description = "标签", example = "短信,评论") + private String tag; + + @Schema(description = "状态,参见 CommonStatusEnum 枚举类", example = "1") + private Integer status; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @Schema(description = "创建时间") + private LocalDateTime[] createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sensitiveword/vo/SensitiveWordRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sensitiveword/vo/SensitiveWordRespVO.java new file mode 100644 index 0000000..dd76e5e --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sensitiveword/vo/SensitiveWordRespVO.java @@ -0,0 +1,22 @@ +package com.win.module.system.controller.sensitiveword.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 敏感词 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SensitiveWordRespVO extends SensitiveWordBaseVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long id; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sensitiveword/vo/SensitiveWordUpdateReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sensitiveword/vo/SensitiveWordUpdateReqVO.java new file mode 100644 index 0000000..d15143c --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sensitiveword/vo/SensitiveWordUpdateReqVO.java @@ -0,0 +1,20 @@ +package com.win.module.system.controller.sensitiveword.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 敏感词更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SensitiveWordUpdateReqVO extends SensitiveWordBaseVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "编号不能为空") + private Long id; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/serialnumber/SerialNumberController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/serialnumber/SerialNumberController.java new file mode 100644 index 0000000..11d21ec --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/serialnumber/SerialNumberController.java @@ -0,0 +1,99 @@ +package com.win.module.system.controller.serialnumber; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.excel.core.util.ExcelUtils; +import com.win.framework.operatelog.core.annotations.OperateLog; +import com.win.module.system.controller.serialnumber.vo.*; +import com.win.module.system.convert.serialnumber.SerialNumberConvert; +import com.win.module.system.dal.dataobject.serialnumber.SerialNumberDO; +import com.win.module.system.service.serialnumber.SerialNumberService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.Collection; +import java.util.List; + +import static com.win.framework.common.pojo.CommonResult.success; +import static com.win.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 流水号规则") +@RestController +@RequestMapping("/system/serial-number") +@Validated +public class SerialNumberController { + + @Resource + private SerialNumberService serialNumberService; + + @PostMapping("/create") + @Operation(summary = "创建流水号规则") + @PreAuthorize("@ss.hasPermission('system:serial-number:create')") + public CommonResult createSerialNumber(@Valid @RequestBody SerialNumberCreateReqVO createReqVO) { + return success(serialNumberService.createSerialNumber(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新流水号规则") + @PreAuthorize("@ss.hasPermission('system:serial-number:update')") + public CommonResult updateSerialNumber(@Valid @RequestBody SerialNumberUpdateReqVO updateReqVO) { + serialNumberService.updateSerialNumber(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除流水号规则") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('system:serial-number:delete')") + public CommonResult deleteSerialNumber(@RequestParam("id") Long id) { + serialNumberService.deleteSerialNumber(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得流水号规则") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:serial-number:query')") + public CommonResult getSerialNumber(@RequestParam("id") Long id) { + SerialNumberDO serialNumber = serialNumberService.getSerialNumber(id); + return success(SerialNumberConvert.INSTANCE.convert(serialNumber)); + } + + @GetMapping("/list") + @Operation(summary = "获得流水号规则列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + @PreAuthorize("@ss.hasPermission('system:serial-number:query')") + public CommonResult> getSerialNumberList(@RequestParam("ids") Collection ids) { + List list = serialNumberService.getSerialNumberList(ids); + return success(SerialNumberConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得流水号规则分页") + @PreAuthorize("@ss.hasPermission('system:serial-number:query')") + public CommonResult> getSerialNumberPage(@Valid SerialNumberPageReqVO pageVO) { + PageResult pageResult = serialNumberService.getSerialNumberPage(pageVO); + return success(SerialNumberConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出流水号规则 Excel") + @PreAuthorize("@ss.hasPermission('system:serial-number:export')") + @OperateLog(type = EXPORT) + public void exportSerialNumberExcel(@Valid SerialNumberExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = serialNumberService.getSerialNumberList(exportReqVO); + // 导出 Excel + List datas = SerialNumberConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "流水号规则.xls", "数据", SerialNumberExcelVO.class, datas); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/serialnumber/vo/SerialNumberBaseVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/serialnumber/vo/SerialNumberBaseVO.java new file mode 100644 index 0000000..75696cd --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/serialnumber/vo/SerialNumberBaseVO.java @@ -0,0 +1,44 @@ +package com.win.module.system.controller.serialnumber.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import javax.validation.constraints.*; + +/** + * 流水号规则 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class SerialNumberBaseVO { + + @Schema(description = "规则编码", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "规则编码不能为空") + private String ruleCode; + + @Schema(description = "规则名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五") + @NotNull(message = "规则名称不能为空") + private String ruleName; + + @Schema(description = "编码前缀", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "编码前缀不能为空") + private String prefix; + + @Schema(description = "单据格式", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "单据格式不能为空") + private String pattern; + + @Schema(description = "单据流水长度", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "单据流水长度不能为空") + private Byte length; + + @Schema(description = "单据分隔符", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "单据分隔符不能为空") + private String separator; + + @Schema(description = "备注", example = "你说的对") + private String remark; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/serialnumber/vo/SerialNumberCreateReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/serialnumber/vo/SerialNumberCreateReqVO.java new file mode 100644 index 0000000..8201b8e --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/serialnumber/vo/SerialNumberCreateReqVO.java @@ -0,0 +1,12 @@ +package com.win.module.system.controller.serialnumber.vo; + +import lombok.*; +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(description = "管理后台 - 流水号规则创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SerialNumberCreateReqVO extends SerialNumberBaseVO { + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/serialnumber/vo/SerialNumberExcelVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/serialnumber/vo/SerialNumberExcelVO.java new file mode 100644 index 0000000..45554a4 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/serialnumber/vo/SerialNumberExcelVO.java @@ -0,0 +1,43 @@ +package com.win.module.system.controller.serialnumber.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 流水号规则 Excel VO + * + * @author 超级管理员 + */ +@Data +public class SerialNumberExcelVO { + + @ExcelProperty("主键") + private Long id; + + @ExcelProperty("规则编码") + private String ruleCode; + + @ExcelProperty("规则名称") + private String ruleName; + + @ExcelProperty("编码前缀") + private String prefix; + + @ExcelProperty("单据格式") + private String pattern; + + @ExcelProperty("单据流水长度") + private Byte length; + + @ExcelProperty("单据分隔符") + private String separator; + + @ExcelProperty("备注") + private String remark; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/serialnumber/vo/SerialNumberExportReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/serialnumber/vo/SerialNumberExportReqVO.java new file mode 100644 index 0000000..02561f1 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/serialnumber/vo/SerialNumberExportReqVO.java @@ -0,0 +1,18 @@ +package com.win.module.system.controller.serialnumber.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import com.win.framework.common.pojo.PageParam; + +@Schema(description = "管理后台 - 流水号规则 Excel 导出 Request VO,参数和 SerialNumberPageReqVO 是一致的") +@Data +public class SerialNumberExportReqVO { + + @Schema(description = "规则编码") + private String ruleCode; + + @Schema(description = "规则名称", example = "王五") + private String ruleName; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/serialnumber/vo/SerialNumberPageReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/serialnumber/vo/SerialNumberPageReqVO.java new file mode 100644 index 0000000..8e6c300 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/serialnumber/vo/SerialNumberPageReqVO.java @@ -0,0 +1,20 @@ +package com.win.module.system.controller.serialnumber.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import com.win.framework.common.pojo.PageParam; + +@Schema(description = "管理后台 - 流水号规则分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SerialNumberPageReqVO extends PageParam { + + @Schema(description = "规则编码") + private String ruleCode; + + @Schema(description = "规则名称", example = "王五") + private String ruleName; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/serialnumber/vo/SerialNumberRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/serialnumber/vo/SerialNumberRespVO.java new file mode 100644 index 0000000..56f07c6 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/serialnumber/vo/SerialNumberRespVO.java @@ -0,0 +1,15 @@ +package com.win.module.system.controller.serialnumber.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +@Schema(description = "管理后台 - 流水号规则 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SerialNumberRespVO extends SerialNumberBaseVO { + + @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "19961") + private Long id; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/serialnumber/vo/SerialNumberUpdateReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/serialnumber/vo/SerialNumberUpdateReqVO.java new file mode 100644 index 0000000..8b7a9d3 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/serialnumber/vo/SerialNumberUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.win.module.system.controller.serialnumber.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 流水号规则更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SerialNumberUpdateReqVO extends SerialNumberBaseVO { + + @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "19961") + @NotNull(message = "主键不能为空") + private Long id; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/SmsCallbackController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/SmsCallbackController.java new file mode 100644 index 0000000..beffa6b --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/SmsCallbackController.java @@ -0,0 +1,48 @@ +package com.win.module.system.controller.sms; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.util.servlet.ServletUtils; +import com.win.framework.operatelog.core.annotations.OperateLog; +import com.win.framework.sms.core.enums.SmsChannelEnum; +import com.win.module.system.service.sms.SmsSendService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.annotation.security.PermitAll; +import javax.servlet.http.HttpServletRequest; + +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 短信回调") +@RestController +@RequestMapping("/system/sms/callback") +public class SmsCallbackController { + + @Resource + private SmsSendService smsSendService; + + @PostMapping("/aliyun") + @PermitAll + @Operation(summary = "阿里云短信的回调", description = "参见 https://help.aliyun.com/document_detail/120998.html 文档") + @OperateLog(enable = false) + public CommonResult receiveAliyunSmsStatus(HttpServletRequest request) throws Throwable { + String text = ServletUtils.getBody(request); + smsSendService.receiveSmsStatus(SmsChannelEnum.ALIYUN.getCode(), text); + return success(true); + } + + @PostMapping("/tencent") + @PermitAll + @Operation(summary = "腾讯云短信的回调", description = "参见 https://cloud.tencent.com/document/product/382/52077 文档") + @OperateLog(enable = false) + public CommonResult receiveTencentSmsStatus(HttpServletRequest request) throws Throwable { + String text = ServletUtils.getBody(request); + smsSendService.receiveSmsStatus(SmsChannelEnum.TENCENT.getCode(), text); + return success(true); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/SmsChannelController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/SmsChannelController.java new file mode 100644 index 0000000..7e9f243 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/SmsChannelController.java @@ -0,0 +1,80 @@ +package com.win.module.system.controller.sms; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.sms.vo.channel.*; +import com.win.module.system.convert.sms.SmsChannelConvert; +import com.win.module.system.dal.dataobject.sms.SmsChannelDO; +import com.win.module.system.service.sms.SmsChannelService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.Comparator; +import java.util.List; + +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 短信渠道") +@RestController +@RequestMapping("system/sms-channel") +public class SmsChannelController { + + @Resource + private SmsChannelService smsChannelService; + + @PostMapping("/create") + @Operation(summary = "创建短信渠道") + @PreAuthorize("@ss.hasPermission('system:sms-channel:create')") + public CommonResult createSmsChannel(@Valid @RequestBody SmsChannelCreateReqVO createReqVO) { + return success(smsChannelService.createSmsChannel(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新短信渠道") + @PreAuthorize("@ss.hasPermission('system:sms-channel:update')") + public CommonResult updateSmsChannel(@Valid @RequestBody SmsChannelUpdateReqVO updateReqVO) { + smsChannelService.updateSmsChannel(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除短信渠道") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('system:sms-channel:delete')") + public CommonResult deleteSmsChannel(@RequestParam("id") Long id) { + smsChannelService.deleteSmsChannel(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得短信渠道") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:sms-channel:query')") + public CommonResult getSmsChannel(@RequestParam("id") Long id) { + SmsChannelDO smsChannel = smsChannelService.getSmsChannel(id); + return success(SmsChannelConvert.INSTANCE.convert(smsChannel)); + } + + @GetMapping("/page") + @Operation(summary = "获得短信渠道分页") + @PreAuthorize("@ss.hasPermission('system:sms-channel:query')") + public CommonResult> getSmsChannelPage(@Valid SmsChannelPageReqVO pageVO) { + PageResult pageResult = smsChannelService.getSmsChannelPage(pageVO); + return success(SmsChannelConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/list-all-simple") + @Operation(summary = "获得短信渠道精简列表", description = "包含被禁用的短信渠道") + public CommonResult> getSimpleSmsChannelList() { + List list = smsChannelService.getSmsChannelList(); + // 排序后,返回给前端 + list.sort(Comparator.comparing(SmsChannelDO::getId)); + return success(SmsChannelConvert.INSTANCE.convertList03(list)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/SmsLogController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/SmsLogController.java new file mode 100644 index 0000000..3d53b9b --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/SmsLogController.java @@ -0,0 +1,60 @@ +package com.win.module.system.controller.sms; + +import com.win.module.system.controller.sms.vo.log.SmsLogExcelVO; +import com.win.module.system.controller.sms.vo.log.SmsLogExportReqVO; +import com.win.module.system.controller.sms.vo.log.SmsLogPageReqVO; +import com.win.module.system.controller.sms.vo.log.SmsLogRespVO; +import com.win.module.system.convert.sms.SmsLogConvert; +import com.win.module.system.dal.dataobject.sms.SmsLogDO; +import com.win.module.system.service.sms.SmsLogService; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.excel.core.util.ExcelUtils; +import com.win.framework.operatelog.core.annotations.OperateLog; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static com.win.framework.common.pojo.CommonResult.success; +import static com.win.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 短信日志") +@RestController +@RequestMapping("/system/sms-log") +@Validated +public class SmsLogController { + + @Resource + private SmsLogService smsLogService; + + @GetMapping("/page") + @Operation(summary = "获得短信日志分页") + @PreAuthorize("@ss.hasPermission('system:sms-log:query')") + public CommonResult> getSmsLogPage(@Valid SmsLogPageReqVO pageVO) { + PageResult pageResult = smsLogService.getSmsLogPage(pageVO); + return success(SmsLogConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出短信日志 Excel") + @PreAuthorize("@ss.hasPermission('system:sms-log:export')") + @OperateLog(type = EXPORT) + public void exportSmsLogExcel(@Valid SmsLogExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = smsLogService.getSmsLogList(exportReqVO); + // 导出 Excel + List datas = SmsLogConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "短信日志.xls", "数据", SmsLogExcelVO.class, datas); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/SmsTemplateController.http b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/SmsTemplateController.http new file mode 100644 index 0000000..e8213e5 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/SmsTemplateController.http @@ -0,0 +1,14 @@ +### 请求 /system/sms-template/send-sms 接口 => 成功 +POST {{baseUrl}}/system/sms-template/send-sms +Authorization: Bearer {{token}} +Content-Type: application/json +tenant-id: {{adminTenentId}} + +{ + "templateCode": "test_01", + "mobile": "156016913900", + "params": { + "key01": "value01", + "key02": "value02" + } +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/SmsTemplateController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/SmsTemplateController.java new file mode 100644 index 0000000..d609fd4 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/SmsTemplateController.java @@ -0,0 +1,98 @@ +package com.win.module.system.controller.sms; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.excel.core.util.ExcelUtils; +import com.win.framework.operatelog.core.annotations.OperateLog; +import com.win.module.system.controller.sms.vo.template.*; +import com.win.module.system.convert.sms.SmsTemplateConvert; +import com.win.module.system.dal.dataobject.sms.SmsTemplateDO; +import com.win.module.system.service.sms.SmsSendService; +import com.win.module.system.service.sms.SmsTemplateService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static com.win.framework.common.pojo.CommonResult.success; +import static com.win.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 短信模板") +@RestController +@RequestMapping("/system/sms-template") +public class SmsTemplateController { + + @Resource + private SmsTemplateService smsTemplateService; + @Resource + private SmsSendService smsSendService; + + @PostMapping("/create") + @Operation(summary = "创建短信模板") + @PreAuthorize("@ss.hasPermission('system:sms-template:create')") + public CommonResult createSmsTemplate(@Valid @RequestBody SmsTemplateCreateReqVO createReqVO) { + return success(smsTemplateService.createSmsTemplate(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新短信模板") + @PreAuthorize("@ss.hasPermission('system:sms-template:update')") + public CommonResult updateSmsTemplate(@Valid @RequestBody SmsTemplateUpdateReqVO updateReqVO) { + smsTemplateService.updateSmsTemplate(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除短信模板") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('system:sms-template:delete')") + public CommonResult deleteSmsTemplate(@RequestParam("id") Long id) { + smsTemplateService.deleteSmsTemplate(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得短信模板") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:sms-template:query')") + public CommonResult getSmsTemplate(@RequestParam("id") Long id) { + SmsTemplateDO smsTemplate = smsTemplateService.getSmsTemplate(id); + return success(SmsTemplateConvert.INSTANCE.convert(smsTemplate)); + } + + @GetMapping("/page") + @Operation(summary = "获得短信模板分页") + @PreAuthorize("@ss.hasPermission('system:sms-template:query')") + public CommonResult> getSmsTemplatePage(@Valid SmsTemplatePageReqVO pageVO) { + PageResult pageResult = smsTemplateService.getSmsTemplatePage(pageVO); + return success(SmsTemplateConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出短信模板 Excel") + @PreAuthorize("@ss.hasPermission('system:sms-template:export')") + @OperateLog(type = EXPORT) + public void exportSmsTemplateExcel(@Valid SmsTemplateExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = smsTemplateService.getSmsTemplateList(exportReqVO); + // 导出 Excel + List datas = SmsTemplateConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "短信模板.xls", "数据", SmsTemplateExcelVO.class, datas); + } + + @PostMapping("/send-sms") + @Operation(summary = "发送短信") + @PreAuthorize("@ss.hasPermission('system:sms-template:send-sms')") + public CommonResult sendSms(@Valid @RequestBody SmsTemplateSendReqVO sendReqVO) { + return success(smsSendService.sendSingleSmsToAdmin(sendReqVO.getMobile(), null, + sendReqVO.getTemplateCode(), sendReqVO.getTemplateParams())); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/channel/SmsChannelBaseVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/channel/SmsChannelBaseVO.java new file mode 100644 index 0000000..273f3e7 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/channel/SmsChannelBaseVO.java @@ -0,0 +1,37 @@ +package com.win.module.system.controller.sms.vo.channel; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.hibernate.validator.constraints.URL; + +import javax.validation.constraints.NotNull; + +/** +* 短信渠道 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class SmsChannelBaseVO { + + @Schema(description = "短信签名", requiredMode = Schema.RequiredMode.REQUIRED, example = "闻荫源码") + @NotNull(message = "短信签名不能为空") + private String signature; + + @Schema(description = "启用状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "启用状态不能为空") + private Integer status; + + @Schema(description = "备注", example = "好吃!") + private String remark; + + @Schema(description = "短信 API 的账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "win") + @NotNull(message = "短信 API 的账号不能为空") + private String apiKey; + + @Schema(description = "短信 API 的密钥", example = "yuanma") + private String apiSecret; + + @Schema(description = "短信发送回调 URL", example = "http://www.iocoder.cn") + @URL(message = "回调 URL 格式不正确") + private String callbackUrl; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/channel/SmsChannelCreateReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/channel/SmsChannelCreateReqVO.java new file mode 100644 index 0000000..1572cc8 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/channel/SmsChannelCreateReqVO.java @@ -0,0 +1,20 @@ +package com.win.module.system.controller.sms.vo.channel; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 短信渠道创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SmsChannelCreateReqVO extends SmsChannelBaseVO { + + @Schema(description = "渠道编码,参见 SmsChannelEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "YUN_PIAN") + @NotNull(message = "渠道编码不能为空") + private String code; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/channel/SmsChannelPageReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/channel/SmsChannelPageReqVO.java new file mode 100644 index 0000000..c023af4 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/channel/SmsChannelPageReqVO.java @@ -0,0 +1,30 @@ +package com.win.module.system.controller.sms.vo.channel; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 短信渠道分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SmsChannelPageReqVO extends PageParam { + + @Schema(description = "任务状态", example = "1") + private Integer status; + + @Schema(description = "短信签名,模糊匹配", example = "闻荫源码") + private String signature; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @Schema(description = "创建时间") + private LocalDateTime[] createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/channel/SmsChannelRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/channel/SmsChannelRespVO.java new file mode 100644 index 0000000..238d934 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/channel/SmsChannelRespVO.java @@ -0,0 +1,25 @@ +package com.win.module.system.controller.sms.vo.channel; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 短信渠道 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SmsChannelRespVO extends SmsChannelBaseVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "渠道编码,参见 SmsChannelEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "YUN_PIAN") + private String code; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/channel/SmsChannelSimpleRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/channel/SmsChannelSimpleRespVO.java new file mode 100644 index 0000000..05cc5ed --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/channel/SmsChannelSimpleRespVO.java @@ -0,0 +1,23 @@ +package com.win.module.system.controller.sms.vo.channel; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 短信渠道精简 Response VO") +@Data +public class SmsChannelSimpleRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "编号不能为空") + private Long id; + + @Schema(description = "短信签名", requiredMode = Schema.RequiredMode.REQUIRED, example = "闻荫源码") + @NotNull(message = "短信签名不能为空") + private String signature; + + @Schema(description = "渠道编码,参见 SmsChannelEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "YUN_PIAN") + private String code; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/channel/SmsChannelUpdateReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/channel/SmsChannelUpdateReqVO.java new file mode 100644 index 0000000..6e16945 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/channel/SmsChannelUpdateReqVO.java @@ -0,0 +1,20 @@ +package com.win.module.system.controller.sms.vo.channel; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 短信渠道更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SmsChannelUpdateReqVO extends SmsChannelBaseVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "编号不能为空") + private Long id; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/log/SmsLogExcelVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/log/SmsLogExcelVO.java new file mode 100644 index 0000000..d8deeb5 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/log/SmsLogExcelVO.java @@ -0,0 +1,96 @@ +package com.win.module.system.controller.sms.vo.log; + +import com.win.framework.excel.core.annotations.DictFormat; +import com.win.framework.excel.core.convert.DictConvert; +import com.win.framework.excel.core.convert.JsonConvert; +import com.win.module.system.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.Map; + +/** + * 短信日志 Excel VO + * + * @author 闻荫源码 + */ +@Data +public class SmsLogExcelVO { + + @ExcelProperty("编号") + private Long id; + + @ExcelProperty("短信渠道编号") + private Long channelId; + + @ExcelProperty("短信渠道编码") + private String channelCode; + + @ExcelProperty("模板编号") + private Long templateId; + + @ExcelProperty("模板编码") + private String templateCode; + + @ExcelProperty(value = "短信类型", converter = DictConvert.class) + @DictFormat(DictTypeConstants.SMS_TEMPLATE_TYPE) + private Integer templateType; + + @ExcelProperty("短信内容") + private String templateContent; + + @ExcelProperty(value = "短信参数", converter = JsonConvert.class) + private Map templateParams; + + @ExcelProperty("短信 API 的模板编号") + private String apiTemplateId; + + @ExcelProperty("手机号") + private String mobile; + + @ExcelProperty("用户编号") + private Long userId; + + @ExcelProperty(value = "发送状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.SMS_SEND_STATUS) + private Integer sendStatus; + + @ExcelProperty("发送时间") + private LocalDateTime sendTime; + + @ExcelProperty("发送结果的编码") + private Integer sendCode; + + @ExcelProperty("发送结果的提示") + private String sendMsg; + + @ExcelProperty("短信 API 发送结果的编码") + private String apiSendCode; + + @ExcelProperty("短信 API 发送失败的提示") + private String apiSendMsg; + + @ExcelProperty("短信 API 发送返回的唯一请求 ID") + private String apiRequestId; + + @ExcelProperty("短信 API 发送返回的序号") + private String apiSerialNo; + + @ExcelProperty(value = "接收状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.SMS_RECEIVE_STATUS) + private Integer receiveStatus; + + @ExcelProperty("接收时间") + private LocalDateTime receiveTime; + + @ExcelProperty("API 接收结果的编码") + private String apiReceiveCode; + + @ExcelProperty("API 接收结果的说明") + private String apiReceiveMsg; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/log/SmsLogExportReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/log/SmsLogExportReqVO.java new file mode 100644 index 0000000..3fdde2a --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/log/SmsLogExportReqVO.java @@ -0,0 +1,38 @@ +package com.win.module.system.controller.sms.vo.log; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 短信日志 Excel 导出 Request VO,参数和 SmsLogPageReqVO 是一致的") +@Data +public class SmsLogExportReqVO { + + @Schema(description = "短信渠道编号", example = "10") + private Long channelId; + + @Schema(description = "模板编号", example = "20") + private Long templateId; + + @Schema(description = "手机号", example = "15601691300") + private String mobile; + + @Schema(description = "发送状态", example = "1") + private Integer sendStatus; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @Schema(description = "开始发送时间") + private LocalDateTime[] sendTime; + + @Schema(description = "接收状态", example = "0") + private Integer receiveStatus; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @Schema(description = "开始接收时间") + private LocalDateTime[] receiveTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/log/SmsLogPageReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/log/SmsLogPageReqVO.java new file mode 100644 index 0000000..a637c1c --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/log/SmsLogPageReqVO.java @@ -0,0 +1,43 @@ +package com.win.module.system.controller.sms.vo.log; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 短信日志分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SmsLogPageReqVO extends PageParam { + + @Schema(description = "短信渠道编号", example = "10") + private Long channelId; + + @Schema(description = "模板编号", example = "20") + private Long templateId; + + @Schema(description = "手机号", example = "15601691300") + private String mobile; + + @Schema(description = "发送状态,参见 SmsSendStatusEnum 枚举类", example = "1") + private Integer sendStatus; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @Schema(description = "发送时间") + private LocalDateTime[] sendTime; + + @Schema(description = "接收状态,参见 SmsReceiveStatusEnum 枚举类", example = "0") + private Integer receiveStatus; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @Schema(description = "接收时间") + private LocalDateTime[] receiveTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/log/SmsLogRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/log/SmsLogRespVO.java new file mode 100644 index 0000000..18be5b7 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/log/SmsLogRespVO.java @@ -0,0 +1,85 @@ +package com.win.module.system.controller.sms.vo.log; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.Map; + +@Schema(description = "管理后台 - 短信日志 Response VO") +@Data +public class SmsLogRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "短信渠道编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") + private Long channelId; + + @Schema(description = "短信渠道编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "ALIYUN") + private String channelCode; + + @Schema(description = "模板编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "20") + private Long templateId; + + @Schema(description = "模板编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "test-01") + private String templateCode; + + @Schema(description = "短信类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer templateType; + + @Schema(description = "短信内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "你好,你的验证码是 1024") + private String templateContent; + + @Schema(description = "短信参数", requiredMode = Schema.RequiredMode.REQUIRED, example = "name,code") + private Map templateParams; + + @Schema(description = "短信 API 的模板编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "SMS_207945135") + private String apiTemplateId; + + @Schema(description = "手机号", requiredMode = Schema.RequiredMode.REQUIRED, example = "15601691300") + private String mobile; + + @Schema(description = "用户编号", example = "10") + private Long userId; + + @Schema(description = "发送状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer sendStatus; + + @Schema(description = "发送时间") + private LocalDateTime sendTime; + + @Schema(description = "发送结果的编码", example = "0") + private Integer sendCode; + + @Schema(description = "发送结果的提示", example = "成功") + private String sendMsg; + + @Schema(description = "短信 API 发送结果的编码", example = "SUCCESS") + private String apiSendCode; + + @Schema(description = "短信 API 发送失败的提示", example = "成功") + private String apiSendMsg; + + @Schema(description = "短信 API 发送返回的唯一请求 ID", example = "3837C6D3-B96F-428C-BBB2-86135D4B5B99") + private String apiRequestId; + + @Schema(description = "短信 API 发送返回的序号", example = "62923244790") + private String apiSerialNo; + + @Schema(description = "接收状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") + private Integer receiveStatus; + + @Schema(description = "接收时间") + private LocalDateTime receiveTime; + + @Schema(description = "API 接收结果的编码", example = "DELIVRD") + private String apiReceiveCode; + + @Schema(description = "API 接收结果的说明", example = "用户接收成功") + private String apiReceiveMsg; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/template/SmsTemplateBaseVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/template/SmsTemplateBaseVO.java new file mode 100644 index 0000000..e46436e --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/template/SmsTemplateBaseVO.java @@ -0,0 +1,45 @@ +package com.win.module.system.controller.sms.vo.template; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** +* 短信模板 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class SmsTemplateBaseVO { + + @Schema(description = "短信类型,参见 SmsTemplateTypeEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "短信类型不能为空") + private Integer type; + + @Schema(description = "开启状态,参见 CommonStatusEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "开启状态不能为空") + private Integer status; + + @Schema(description = "模板编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "test_01") + @NotNull(message = "模板编码不能为空") + private String code; + + @Schema(description = "模板名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "win") + @NotNull(message = "模板名称不能为空") + private String name; + + @Schema(description = "模板内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "你好,{name}。你长的太{like}啦!") + @NotNull(message = "模板内容不能为空") + private String content; + + @Schema(description = "备注", example = "哈哈哈") + private String remark; + + @Schema(description = "短信 API 的模板编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "4383920") + @NotNull(message = "短信 API 的模板编号不能为空") + private String apiTemplateId; + + @Schema(description = "短信渠道编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") + @NotNull(message = "短信渠道编号不能为空") + private Long channelId; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/template/SmsTemplateCreateReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/template/SmsTemplateCreateReqVO.java new file mode 100644 index 0000000..8a78a6e --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/template/SmsTemplateCreateReqVO.java @@ -0,0 +1,13 @@ +package com.win.module.system.controller.sms.vo.template; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Schema(description = "管理后台 - 短信模板创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SmsTemplateCreateReqVO extends SmsTemplateBaseVO { + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/template/SmsTemplateExcelVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/template/SmsTemplateExcelVO.java new file mode 100644 index 0000000..8b6bb6b --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/template/SmsTemplateExcelVO.java @@ -0,0 +1,55 @@ +package com.win.module.system.controller.sms.vo.template; + +import com.win.framework.excel.core.annotations.DictFormat; +import com.win.framework.excel.core.convert.DictConvert; +import com.win.module.system.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 短信模板 Excel VO + * + * @author 闻荫源码 + */ +@Data +public class SmsTemplateExcelVO { + + @ExcelProperty("编号") + private Long id; + + @ExcelProperty(value = "短信签名", converter = DictConvert.class) + @DictFormat(DictTypeConstants.SMS_TEMPLATE_TYPE) + private Integer type; + + @ExcelProperty(value = "开启状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.COMMON_STATUS) + private Integer status; + + @ExcelProperty("模板编码") + private String code; + + @ExcelProperty("模板名称") + private String name; + + @ExcelProperty("模板内容") + private String content; + + @ExcelProperty("备注") + private String remark; + + @ExcelProperty("短信 API 的模板编号") + private String apiTemplateId; + + @ExcelProperty("短信渠道编号") + private Long channelId; + + @ExcelProperty(value = "短信渠道编码", converter = DictConvert.class) + @DictFormat(DictTypeConstants.SMS_CHANNEL_CODE) + private String channelCode; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/template/SmsTemplateExportReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/template/SmsTemplateExportReqVO.java new file mode 100644 index 0000000..47158a3 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/template/SmsTemplateExportReqVO.java @@ -0,0 +1,37 @@ +package com.win.module.system.controller.sms.vo.template; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 短信模板 Excel 导出 Request VO,参数和 SmsTemplatePageReqVO 是一致的") +@Data +public class SmsTemplateExportReqVO { + + @Schema(description = "短信签名", example = "1") + private Integer type; + + @Schema(description = "开启状态", example = "1") + private Integer status; + + @Schema(description = "模板编码,模糊匹配", example = "test_01") + private String code; + + @Schema(description = "模板内容,模糊匹配", example = "你好,{name}。你长的太{like}啦!") + private String content; + + @Schema(description = "短信 API 的模板编号,模糊匹配", example = "4383920") + private String apiTemplateId; + + @Schema(description = "短信渠道编号", example = "10") + private Long channelId; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @Schema(description = "创建时间") + private LocalDateTime[] createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/template/SmsTemplatePageReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/template/SmsTemplatePageReqVO.java new file mode 100644 index 0000000..11a4383 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/template/SmsTemplatePageReqVO.java @@ -0,0 +1,42 @@ +package com.win.module.system.controller.sms.vo.template; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 短信模板分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SmsTemplatePageReqVO extends PageParam { + + @Schema(description = "短信签名", example = "1") + private Integer type; + + @Schema(description = "开启状态", example = "1") + private Integer status; + + @Schema(description = "模板编码,模糊匹配", example = "test_01") + private String code; + + @Schema(description = "模板内容,模糊匹配", example = "你好,{name}。你长的太{like}啦!") + private String content; + + @Schema(description = "短信 API 的模板编号,模糊匹配", example = "4383920") + private String apiTemplateId; + + @Schema(description = "短信渠道编号", example = "10") + private Long channelId; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @Schema(description = "创建时间") + private LocalDateTime[] createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/template/SmsTemplateRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/template/SmsTemplateRespVO.java new file mode 100644 index 0000000..b82abba --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/template/SmsTemplateRespVO.java @@ -0,0 +1,29 @@ +package com.win.module.system.controller.sms.vo.template; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.time.LocalDateTime; +import java.util.List; + +@Schema(description = "管理后台 - 短信模板 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SmsTemplateRespVO extends SmsTemplateBaseVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "短信渠道编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "ALIYUN") + private String channelCode; + + @Schema(description = "参数数组", example = "name,code") + private List params; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/template/SmsTemplateSendReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/template/SmsTemplateSendReqVO.java new file mode 100644 index 0000000..1228fd8 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/template/SmsTemplateSendReqVO.java @@ -0,0 +1,24 @@ +package com.win.module.system.controller.sms.vo.template; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.Map; + +@Schema(description = "管理后台 - 短信模板的发送 Request VO") +@Data +public class SmsTemplateSendReqVO { + + @Schema(description = "手机号", requiredMode = Schema.RequiredMode.REQUIRED, example = "15601691300") + @NotNull(message = "手机号不能为空") + private String mobile; + + @Schema(description = "模板编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "test_01") + @NotNull(message = "模板编码不能为空") + private String templateCode; + + @Schema(description = "模板参数") + private Map templateParams; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/template/SmsTemplateUpdateReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/template/SmsTemplateUpdateReqVO.java new file mode 100644 index 0000000..f70c95f --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/template/SmsTemplateUpdateReqVO.java @@ -0,0 +1,20 @@ +package com.win.module.system.controller.sms.vo.template; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 短信模板更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SmsTemplateUpdateReqVO extends SmsTemplateBaseVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "编号不能为空") + private Long id; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/TenantController.http b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/TenantController.http new file mode 100644 index 0000000..457c2bf --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/TenantController.http @@ -0,0 +1,21 @@ +### 获取租户编号 /admin-api/system/get-id-by-name +GET {{baseUrl}}/system/tenant/get-id-by-name?name=闻荫源码 + +### 创建租户 /admin-api/system/tenant/create +POST {{baseUrl}}/system/tenant/create +Content-Type: application/json +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} + +{ + "name": "闻荫", + "contactName": "芋艿", + "contactMobile": "15601691300", + "status": 0, + "domain": "https://www.iocoder.cn", + "packageId": 110, + "expireTime": 1699545600000, + "accountCount": 20, + "username": "admin", + "password": "123321" +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/TenantController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/TenantController.java new file mode 100644 index 0000000..b9a177a --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/TenantController.java @@ -0,0 +1,98 @@ +package com.win.module.system.controller.tenant; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.excel.core.util.ExcelUtils; +import com.win.framework.operatelog.core.annotations.OperateLog; +import com.win.module.system.controller.tenant.vo.tenant.*; +import com.win.module.system.convert.tenant.TenantConvert; +import com.win.module.system.dal.dataobject.tenant.TenantDO; +import com.win.module.system.service.tenant.TenantService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.annotation.security.PermitAll; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static com.win.framework.common.pojo.CommonResult.success; +import static com.win.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 租户") +@RestController +@RequestMapping("/system/tenant") +public class TenantController { + + @Resource + private TenantService tenantService; + + @GetMapping("/get-id-by-name") + @PermitAll + @Operation(summary = "使用租户名,获得租户编号", description = "登录界面,根据用户的租户名,获得租户编号") + @Parameter(name = "name", description = "租户名", required = true, example = "1024") + public CommonResult getTenantIdByName(@RequestParam("name") String name) { + TenantDO tenantDO = tenantService.getTenantByName(name); + return success(tenantDO != null ? tenantDO.getId() : null); + } + + @PostMapping("/create") + @Operation(summary = "创建租户") + @PreAuthorize("@ss.hasPermission('system:tenant:create')") + public CommonResult createTenant(@Valid @RequestBody TenantCreateReqVO createReqVO) { + return success(tenantService.createTenant(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新租户") + @PreAuthorize("@ss.hasPermission('system:tenant:update')") + public CommonResult updateTenant(@Valid @RequestBody TenantUpdateReqVO updateReqVO) { + tenantService.updateTenant(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除租户") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:tenant:delete')") + public CommonResult deleteTenant(@RequestParam("id") Long id) { + tenantService.deleteTenant(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得租户") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:tenant:query')") + public CommonResult getTenant(@RequestParam("id") Long id) { + TenantDO tenant = tenantService.getTenant(id); + return success(TenantConvert.INSTANCE.convert(tenant)); + } + + @GetMapping("/page") + @Operation(summary = "获得租户分页") + @PreAuthorize("@ss.hasPermission('system:tenant:query')") + public CommonResult> getTenantPage(@Valid TenantPageReqVO pageVO) { + PageResult pageResult = tenantService.getTenantPage(pageVO); + return success(TenantConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出租户 Excel") + @PreAuthorize("@ss.hasPermission('system:tenant:export')") + @OperateLog(type = EXPORT) + public void exportTenantExcel(@Valid TenantExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = tenantService.getTenantList(exportReqVO); + // 导出 Excel + List datas = TenantConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "租户.xls", "数据", TenantExcelVO.class, datas); + } + + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/TenantPackageController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/TenantPackageController.java new file mode 100644 index 0000000..ff642c8 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/TenantPackageController.java @@ -0,0 +1,81 @@ +package com.win.module.system.controller.tenant; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.tenant.vo.packages.*; +import com.win.module.system.convert.tenant.TenantPackageConvert; +import com.win.module.system.dal.dataobject.tenant.TenantPackageDO; +import com.win.module.system.service.tenant.TenantPackageService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.List; + +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 租户套餐") +@RestController +@RequestMapping("/system/tenant-package") +@Validated +public class TenantPackageController { + + @Resource + private TenantPackageService tenantPackageService; + + @PostMapping("/create") + @Operation(summary = "创建租户套餐") + @PreAuthorize("@ss.hasPermission('system:tenant-package:create')") + public CommonResult createTenantPackage(@Valid @RequestBody TenantPackageCreateReqVO createReqVO) { + return success(tenantPackageService.createTenantPackage(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新租户套餐") + @PreAuthorize("@ss.hasPermission('system:tenant-package:update')") + public CommonResult updateTenantPackage(@Valid @RequestBody TenantPackageUpdateReqVO updateReqVO) { + tenantPackageService.updateTenantPackage(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除租户套餐") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('system:tenant-package:delete')") + public CommonResult deleteTenantPackage(@RequestParam("id") Long id) { + tenantPackageService.deleteTenantPackage(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得租户套餐") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:tenant-package:query')") + public CommonResult getTenantPackage(@RequestParam("id") Long id) { + TenantPackageDO tenantPackage = tenantPackageService.getTenantPackage(id); + return success(TenantPackageConvert.INSTANCE.convert(tenantPackage)); + } + + @GetMapping("/page") + @Operation(summary = "获得租户套餐分页") + @PreAuthorize("@ss.hasPermission('system:tenant-package:query')") + public CommonResult> getTenantPackagePage(@Valid TenantPackagePageReqVO pageVO) { + PageResult pageResult = tenantPackageService.getTenantPackagePage(pageVO); + return success(TenantPackageConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/get-simple-list") + @Operation(summary = "获取租户套餐精简信息列表", description = "只包含被开启的租户套餐,主要用于前端的下拉选项") + public CommonResult> getTenantPackageList() { + // 获得角色列表,只要开启状态的 + List list = tenantPackageService.getTenantPackageListByStatus(CommonStatusEnum.ENABLE.getStatus()); + return success(TenantPackageConvert.INSTANCE.convertList02(list)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/packages/TenantPackageBaseVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/packages/TenantPackageBaseVO.java new file mode 100644 index 0000000..a8f81b2 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/packages/TenantPackageBaseVO.java @@ -0,0 +1,31 @@ +package com.win.module.system.controller.tenant.vo.packages; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.Set; + +/** + * 租户套餐 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class TenantPackageBaseVO { + + @Schema(description = "套餐名", requiredMode = Schema.RequiredMode.REQUIRED, example = "VIP") + @NotNull(message = "套餐名不能为空") + private String name; + + @Schema(description = "状态,参见 CommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "状态不能为空") + private Integer status; + + @Schema(description = "备注", example = "好") + private String remark; + + @Schema(description = "关联的菜单编号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "关联的菜单编号不能为空") + private Set menuIds; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/packages/TenantPackageCreateReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/packages/TenantPackageCreateReqVO.java new file mode 100644 index 0000000..7c8bbaf --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/packages/TenantPackageCreateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.system.controller.tenant.vo.packages; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Schema(description = "管理后台 - 租户套餐创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class TenantPackageCreateReqVO extends TenantPackageBaseVO { + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/packages/TenantPackagePageReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/packages/TenantPackagePageReqVO.java new file mode 100644 index 0000000..1930d2e --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/packages/TenantPackagePageReqVO.java @@ -0,0 +1,32 @@ +package com.win.module.system.controller.tenant.vo.packages; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 租户套餐分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class TenantPackagePageReqVO extends PageParam { + + @Schema(description = "套餐名", example = "VIP") + private String name; + + @Schema(description = "状态", example = "1") + private Integer status; + + @Schema(description = "备注", example = "好") + private String remark; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @Schema(description = "创建时间") + private LocalDateTime[] createTime; +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/packages/TenantPackageRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/packages/TenantPackageRespVO.java new file mode 100644 index 0000000..49aa749 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/packages/TenantPackageRespVO.java @@ -0,0 +1,22 @@ +package com.win.module.system.controller.tenant.vo.packages; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 租户套餐 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class TenantPackageRespVO extends TenantPackageBaseVO { + + @Schema(description = "套餐编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/packages/TenantPackageSimpleRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/packages/TenantPackageSimpleRespVO.java new file mode 100644 index 0000000..a7076e7 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/packages/TenantPackageSimpleRespVO.java @@ -0,0 +1,20 @@ +package com.win.module.system.controller.tenant.vo.packages; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 租户套餐精简 Response VO") +@Data +public class TenantPackageSimpleRespVO { + + @Schema(description = "套餐编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "套餐编号不能为空") + private Long id; + + @Schema(description = "套餐名", requiredMode = Schema.RequiredMode.REQUIRED, example = "VIP") + @NotNull(message = "套餐名不能为空") + private String name; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/packages/TenantPackageUpdateReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/packages/TenantPackageUpdateReqVO.java new file mode 100644 index 0000000..1cdadd8 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/packages/TenantPackageUpdateReqVO.java @@ -0,0 +1,17 @@ +package com.win.module.system.controller.tenant.vo.packages; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 租户套餐更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class TenantPackageUpdateReqVO extends TenantPackageBaseVO { + + @Schema(description = "套餐编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "套餐编号不能为空") + private Long id; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/tenant/TenantBaseVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/tenant/TenantBaseVO.java new file mode 100644 index 0000000..6194519 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/tenant/TenantBaseVO.java @@ -0,0 +1,46 @@ +package com.win.module.system.controller.tenant.vo.tenant; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import javax.validation.constraints.*; +import java.time.LocalDateTime; + +/** + * 租户 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class TenantBaseVO { + + @Schema(description = "租户名", requiredMode = Schema.RequiredMode.REQUIRED, example = "闻荫") + @NotNull(message = "租户名不能为空") + private String name; + + @Schema(description = "联系人", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + @NotNull(message = "联系人不能为空") + private String contactName; + + @Schema(description = "联系手机", example = "15601691300") + private String contactMobile; + + @Schema(description = "租户状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "租户状态") + private Integer status; + + @Schema(description = "绑定域名", example = "https://www.iocoder.cn") + private String domain; + + @Schema(description = "租户套餐编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "租户套餐编号不能为空") + private Long packageId; + + @Schema(description = "过期时间", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "过期时间不能为空") + private LocalDateTime expireTime; + + @Schema(description = "账号数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "账号数量不能为空") + private Integer accountCount; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/tenant/TenantCreateReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/tenant/TenantCreateReqVO.java new file mode 100644 index 0000000..502f7fc --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/tenant/TenantCreateReqVO.java @@ -0,0 +1,29 @@ +package com.win.module.system.controller.tenant.vo.tenant; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; + +@Schema(description = "管理后台 - 租户创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class TenantCreateReqVO extends TenantBaseVO { + + @Schema(description = "用户账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "win") + @NotBlank(message = "用户账号不能为空") + @Pattern(regexp = "^[a-zA-Z0-9]{4,30}$", message = "用户账号由 数字、字母 组成") + @Size(min = 4, max = 30, message = "用户账号长度为 4-30 个字符") + private String username; + + @Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456") + @NotEmpty(message = "密码不能为空") + @Length(min = 4, max = 16, message = "密码长度为 4-16 位") + private String password; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/tenant/TenantExcelVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/tenant/TenantExcelVO.java new file mode 100644 index 0000000..d002679 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/tenant/TenantExcelVO.java @@ -0,0 +1,39 @@ +package com.win.module.system.controller.tenant.vo.tenant; + +import com.win.module.system.enums.DictTypeConstants; +import lombok.*; +import java.time.LocalDateTime; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.win.framework.excel.core.annotations.DictFormat; +import com.win.framework.excel.core.convert.DictConvert; + + +/** + * 租户 Excel VO + * + * @author 闻荫源码 + */ +@Data +public class TenantExcelVO { + + @ExcelProperty("租户编号") + private Long id; + + @ExcelProperty("租户名") + private String name; + + @ExcelProperty("联系人") + private String contactName; + + @ExcelProperty("联系手机") + private String contactMobile; + + @ExcelProperty(value = "状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.COMMON_STATUS) + private Integer status; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/tenant/TenantExportReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/tenant/TenantExportReqVO.java new file mode 100644 index 0000000..87ac26c --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/tenant/TenantExportReqVO.java @@ -0,0 +1,31 @@ +package com.win.module.system.controller.tenant.vo.tenant; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 租户 Excel 导出 Request VO,参数和 TenantPageReqVO 是一致的") +@Data +public class TenantExportReqVO { + + @Schema(description = "租户名", example = "闻荫") + private String name; + + @Schema(description = "联系人", example = "芋艿") + private String contactName; + + @Schema(description = "联系手机", example = "15601691300") + private String contactMobile; + + @Schema(description = "租户状态(0正常 1停用)", example = "1") + private Integer status; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/tenant/TenantPageReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/tenant/TenantPageReqVO.java new file mode 100644 index 0000000..fe1ce67 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/tenant/TenantPageReqVO.java @@ -0,0 +1,36 @@ +package com.win.module.system.controller.tenant.vo.tenant; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 租户分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class TenantPageReqVO extends PageParam { + + @Schema(description = "租户名", example = "闻荫") + private String name; + + @Schema(description = "联系人", example = "芋艿") + private String contactName; + + @Schema(description = "联系手机", example = "15601691300") + private String contactMobile; + + @Schema(description = "租户状态(0正常 1停用)", example = "1") + private Integer status; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @Schema(description = "创建时间") + private LocalDateTime[] createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/tenant/TenantRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/tenant/TenantRespVO.java new file mode 100644 index 0000000..3842a13 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/tenant/TenantRespVO.java @@ -0,0 +1,20 @@ +package com.win.module.system.controller.tenant.vo.tenant; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 租户 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class TenantRespVO extends TenantBaseVO { + + @Schema(description = "租户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/tenant/TenantUpdateReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/tenant/TenantUpdateReqVO.java new file mode 100644 index 0000000..d0b6bd7 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/tenant/TenantUpdateReqVO.java @@ -0,0 +1,17 @@ +package com.win.module.system.controller.tenant.vo.tenant; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 租户更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class TenantUpdateReqVO extends TenantBaseVO { + + @Schema(description = "租户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "租户编号不能为空") + private Long id; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/UserController.http b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/UserController.http new file mode 100644 index 0000000..6d9cea8 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/UserController.http @@ -0,0 +1,4 @@ +### 请求 /system/user/page 接口 => 没有权限 +GET {{baseUrl}}/system/user/page?pageNo=1&pageSize=10 +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/UserController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/UserController.java new file mode 100644 index 0000000..dc36e15 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/UserController.java @@ -0,0 +1,207 @@ +package com.win.module.system.controller.user; + +import cn.hutool.core.collection.CollUtil; +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.collection.MapUtils; +import com.win.framework.dict.core.util.DictFrameworkUtils; +import com.win.framework.excel.core.util.ExcelUtils; +import com.win.framework.operatelog.core.annotations.OperateLog; +import com.win.module.system.controller.user.vo.user.*; +import com.win.module.system.convert.user.UserConvert; +import com.win.module.system.dal.dataobject.dept.DeptDO; +import com.win.module.system.dal.dataobject.user.AdminUserDO; +import com.win.module.system.enums.DictTypeConstants; +import com.win.module.system.enums.common.SexEnum; +import com.win.module.system.service.dept.DeptService; +import com.win.module.system.service.user.AdminUserService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.time.LocalDateTime; +import java.time.ZoneOffset; +import java.util.*; + +import static com.win.framework.common.pojo.CommonResult.success; +import static com.win.framework.common.util.collection.CollectionUtils.convertList; +import static com.win.framework.common.util.collection.CollectionUtils.convertSet; +import static com.win.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 用户") +@RestController +@RequestMapping("/system/user") +@Validated +public class UserController { + + @Resource + private AdminUserService userService; + @Resource + private DeptService deptService; + + @PostMapping("/create") + @Operation(summary = "新增用户") + @PreAuthorize("@ss.hasPermission('system:user:create')") + public CommonResult createUser(@Valid @RequestBody UserCreateReqVO reqVO) { + Long id = userService.createUser(reqVO); + return success(id); + } + + @PutMapping("update") + @Operation(summary = "修改用户") + @PreAuthorize("@ss.hasPermission('system:user:update')") + public CommonResult updateUser(@Valid @RequestBody UserUpdateReqVO reqVO) { + userService.updateUser(reqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除用户") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:user:delete')") + public CommonResult deleteUser(@RequestParam("id") Long id) { + userService.deleteUser(id); + return success(true); + } + + @PutMapping("/update-password") + @Operation(summary = "重置用户密码") + @PreAuthorize("@ss.hasPermission('system:user:update-password')") + public CommonResult updateUserPassword(@Valid @RequestBody UserUpdatePasswordReqVO reqVO) { + userService.updateUserPassword(reqVO.getId(), reqVO.getPassword()); + return success(true); + } + + @PutMapping("/update-status") + @Operation(summary = "修改用户状态") + @PreAuthorize("@ss.hasPermission('system:user:update')") + public CommonResult updateUserStatus(@Valid @RequestBody UserUpdateStatusReqVO reqVO) { + userService.updateUserStatus(reqVO.getId(), reqVO.getStatus()); + return success(true); + } + + @GetMapping("/page") + @Operation(summary = "获得用户分页列表") + @PreAuthorize("@ss.hasPermission('system:user:list')") + public CommonResult> getUserPage(@Valid UserPageReqVO reqVO) { + // 获得用户分页列表 + PageResult pageResult = userService.getUserPage(reqVO); + if (CollUtil.isEmpty(pageResult.getList())) { + return success(new PageResult<>(pageResult.getTotal())); // 返回空 + } + + // 获得拼接需要的数据 + Collection deptIds = convertList(pageResult.getList(), AdminUserDO::getDeptId); + Map deptMap = deptService.getDeptMap(deptIds); + // 拼接结果返回 + List userList = new ArrayList<>(pageResult.getList().size()); + pageResult.getList().forEach(user -> { + UserPageItemRespVO respVO = UserConvert.INSTANCE.convert(user); + respVO.setDept(UserConvert.INSTANCE.convert(deptMap.get(user.getDeptId()))); + userList.add(respVO); + }); + return success(new PageResult<>(userList, pageResult.getTotal())); + } + + @GetMapping("/list-all-simple") + @Operation(summary = "获取用户精简信息列表", description = "只包含被开启的用户,主要用于前端的下拉选项") + public CommonResult> getSimpleUserList() { + // 获用户列表,只要开启状态的 + List list = userService.getUserListByStatus(CommonStatusEnum.ENABLE.getStatus()); + // 排序后,返回给前端 + return success(UserConvert.INSTANCE.convertList04(list)); + } + + @GetMapping("/get") + @Operation(summary = "获得用户详情") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:user:query')") + public CommonResult getUser(@RequestParam("id") Long id) { + AdminUserDO user = userService.getUser(id); + // 获得部门数据 + DeptDO dept = deptService.getDept(user.getDeptId()); + return success(UserConvert.INSTANCE.convert(user).setDept(UserConvert.INSTANCE.convert(dept))); + } + + @GetMapping("/export") + @Operation(summary = "导出用户") + @PreAuthorize("@ss.hasPermission('system:user:export')") + @OperateLog(type = EXPORT) + public void exportUserList(@Validated UserExportReqVO reqVO, HttpServletResponse response) throws IOException { + // 获得用户列表 + List users = userService.getUserList(reqVO); + // 获得拼接需要的数据 + Collection deptIds = convertList(users, AdminUserDO::getDeptId); + Map deptMap = deptService.getDeptMap(deptIds); + Map deptLeaderUserMap = userService.getUserMap( + convertSet(deptMap.values(), DeptDO::getLeaderUserId)); + // 拼接数据 + List excelUsers = new ArrayList<>(users.size()); + users.forEach(user -> { + UserExcelVO excelVO = UserConvert.INSTANCE.convert02(user); + // 设置部门 + MapUtils.findAndThen(deptMap, user.getDeptId(), dept -> { + excelVO.setDeptName(dept.getName()); + // 设置部门负责人的名字 + MapUtils.findAndThen(deptLeaderUserMap, dept.getLeaderUserId(), + deptLeaderUser -> excelVO.setDeptLeaderNickname(deptLeaderUser.getNickname())); + }); + excelUsers.add(excelVO); + }); + Map mapDropDown = new HashMap<>(); + String[] statusNameArray = CommonStatusEnum.getStatusNameArray(); + mapDropDown.put(6, statusNameArray); + // 输出 + ExcelUtils.write(response, "用户数据.xlsx", "用户列表", UserExcelVO.class, excelUsers, mapDropDown); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入用户模板") + public void importTemplate(HttpServletResponse response) throws IOException { + // 手动创建导出 demo + List list = Arrays.asList( + UserImportExcelVO.builder().username("yunai").deptId(1L).email("yunai@iocoder.cn").mobile("15601691300") + .nickname("闻荫").status(CommonStatusEnum.ENABLE.getStatus()).sex(SexEnum.MALE.getSex()).build(), + UserImportExcelVO.builder().username("yuanma").deptId(2L).email("yuanma@iocoder.cn").mobile("15601701300") + .nickname("源码").status(CommonStatusEnum.DISABLE.getStatus()).sex(SexEnum.FEMALE.getSex()).build() + ); + Map mapDropDown = new HashMap<>(); + String[] sex = DictFrameworkUtils.dictTypeDictDataValue(DictTypeConstants.USER_SEX); + mapDropDown.put(5, sex); + String[] status = DictFrameworkUtils.dictTypeDictDataValue(DictTypeConstants.COMMON_STATUS); + mapDropDown.put(6, status); + // 输出 + ExcelUtils.write(response, "用户导入模板.xlsx", "用户列表", UserImportExcelVO.class, list, mapDropDown); + } + + @PostMapping("/import") + @Operation(summary = "导入用户") + @Parameters({ + @Parameter(name = "file", description = "Excel 文件", required = true), + @Parameter(name = "mode", description = "导入模式1更新2追加3覆盖", example = "1"), + @Parameter(name = "updatePart", description = "部分更新,默认为 true", example = "true") + }) + @PreAuthorize("@ss.hasPermission('system:user:import')") + public CommonResult> importExcel(HttpServletResponse response, @RequestParam("file") MultipartFile file, @RequestParam(value = "mode") Integer mode, @RequestParam(value = "updatePart") Boolean updatePart) throws Exception { + List list = ExcelUtils.read(file, UserImportExcelVO.class); + List errorList = userService.importUserList(list, mode, updatePart); + Map returnMap = new HashMap<>(); + returnMap.put("errorCount", errorList.size()); + if(!errorList.isEmpty()) { + String url = ExcelUtils.writeLocalFile("用户导入错误数据" + LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8")) + ".xls", "错误列表", errorList); + returnMap.put("errorFile", url); + } + return success(returnMap); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/UserProfileController.http b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/UserProfileController.http new file mode 100644 index 0000000..f06037b --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/UserProfileController.http @@ -0,0 +1,4 @@ +### 请求 /system/user/profile/get 接口 => 没有权限 +GET {{baseUrl}}/system/user/profile/get +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/UserProfileController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/UserProfileController.java new file mode 100644 index 0000000..9c64bba --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/UserProfileController.java @@ -0,0 +1,100 @@ +package com.win.module.system.controller.user; + +import cn.hutool.core.collection.CollUtil; +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.datapermission.core.annotation.DataPermission; +import com.win.module.system.controller.user.vo.profile.UserProfileRespVO; +import com.win.module.system.controller.user.vo.profile.UserProfileUpdatePasswordReqVO; +import com.win.module.system.controller.user.vo.profile.UserProfileUpdateReqVO; +import com.win.module.system.convert.user.UserConvert; +import com.win.module.system.dal.dataobject.dept.DeptDO; +import com.win.module.system.dal.dataobject.dept.PostDO; +import com.win.module.system.dal.dataobject.permission.RoleDO; +import com.win.module.system.dal.dataobject.user.AdminUserDO; +import com.win.module.system.service.dept.DeptService; +import com.win.module.system.service.dept.PostService; +import com.win.module.system.service.permission.PermissionService; +import com.win.module.system.service.permission.RoleService; +import com.win.module.system.service.user.AdminUserService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.List; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.framework.common.pojo.CommonResult.success; +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; +import static com.win.module.infra.enums.ErrorCodeConstants.FILE_IS_EMPTY; + +@Tag(name = "管理后台 - 用户个人中心") +@RestController +@RequestMapping("/system/user/profile") +@Validated +@Slf4j +public class UserProfileController { + + @Resource + private AdminUserService userService; + @Resource + private DeptService deptService; + @Resource + private PostService postService; + @Resource + private PermissionService permissionService; + @Resource + private RoleService roleService; + + @GetMapping("/get") + @Operation(summary = "获得登录用户信息") + @DataPermission(enable = false) // 关闭数据权限,避免只查看自己时,查询不到部门。 + public CommonResult profile() { + // 获得用户基本信息 + AdminUserDO user = userService.getUser(getLoginUserId()); + UserProfileRespVO resp = UserConvert.INSTANCE.convert03(user); + // 获得用户角色 + List userRoles = roleService.getRoleListFromCache(permissionService.getUserRoleIdListByUserId(user.getId())); + resp.setRoles(UserConvert.INSTANCE.convertList(userRoles)); + // 获得部门信息 + if (user.getDeptId() != null) { + DeptDO dept = deptService.getDept(user.getDeptId()); + resp.setDept(UserConvert.INSTANCE.convert02(dept)); + } + // 获得岗位信息 + if (CollUtil.isNotEmpty(user.getPostIds())) { + List posts = postService.getPostList(user.getPostIds()); + resp.setPosts(UserConvert.INSTANCE.convertList02(posts)); + } + return success(resp); + } + + @PutMapping("/update") + @Operation(summary = "修改用户个人信息") + public CommonResult updateUserProfile(@Valid @RequestBody UserProfileUpdateReqVO reqVO) { + userService.updateUserProfile(getLoginUserId(), reqVO); + return success(true); + } + + @PutMapping("/update-password") + @Operation(summary = "修改用户个人密码") + public CommonResult updateUserProfilePassword(@Valid @RequestBody UserProfileUpdatePasswordReqVO reqVO) { + userService.updateUserPassword(getLoginUserId(), reqVO); + return success(true); + } + + @RequestMapping(value = "/update-avatar", method = {RequestMethod.POST, RequestMethod.PUT}) // 解决 uni-app 不支持 Put 上传文件的问题 + @Operation(summary = "上传用户个人头像") + public CommonResult updateUserAvatar(@RequestParam("avatarFile") MultipartFile file) throws Exception { + if (file.isEmpty()) { + throw exception(FILE_IS_EMPTY); + } + String avatar = userService.updateUserAvatar(getLoginUserId(), file.getInputStream()); + return success(avatar); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/profile/UserProfileRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/profile/UserProfileRespVO.java new file mode 100644 index 0000000..ec32730 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/profile/UserProfileRespVO.java @@ -0,0 +1,103 @@ +package com.win.module.system.controller.user.vo.profile; + +import com.win.module.system.controller.user.vo.user.UserBaseVO; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; +import java.util.List; + + +@Data +@EqualsAndHashCode(callSuper = true) +@NoArgsConstructor +@AllArgsConstructor +@Schema(description = "管理后台 - 用户个人中心信息 Response VO") +public class UserProfileRespVO extends UserBaseVO { + + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long id; + + @Schema(description = "状态,参见 CommonStatusEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer status; + + @Schema(description = "最后登录 IP", requiredMode = Schema.RequiredMode.REQUIRED, example = "192.168.1.1") + private String loginIp; + + @Schema(description = "最后登录时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "时间戳格式") + private LocalDateTime loginDate; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "时间戳格式") + private LocalDateTime createTime; + + /** + * 所属角色 + */ + private List roles; + + /** + * 所在部门 + */ + private Dept dept; + + /** + * 所属岗位数组 + */ + private List posts; + /** + * 社交用户数组 + */ + private List socialUsers; + + @Schema(description = "角色") + @Data + public static class Role { + + @Schema(description = "角色编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long id; + + @Schema(description = "角色名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "普通角色") + private String name; + + } + + @Schema(description = "部门") + @Data + public static class Dept { + + @Schema(description = "部门编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long id; + + @Schema(description = "部门名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "研发部") + private String name; + + } + + @Schema(description = "岗位") + @Data + public static class Post { + + @Schema(description = "岗位编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long id; + + @Schema(description = "岗位名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "开发") + private String name; + + } + + @Schema(description = "社交用户") + @Data + public static class SocialUser { + + @Schema(description = "社交平台的类型,参见 SocialTypeEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") + private Integer type; + + @Schema(description = "社交用户的 openid", requiredMode = Schema.RequiredMode.REQUIRED, example = "IPRmJ0wvBptiPIlGEZiPewGwiEiE") + private String openid; + + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/profile/UserProfileUpdatePasswordReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/profile/UserProfileUpdatePasswordReqVO.java new file mode 100644 index 0000000..4fbeb27 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/profile/UserProfileUpdatePasswordReqVO.java @@ -0,0 +1,23 @@ +package com.win.module.system.controller.user.vo.profile; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotEmpty; + +@Schema(description = "管理后台 - 用户个人中心更新密码 Request VO") +@Data +public class UserProfileUpdatePasswordReqVO { + + @Schema(description = "旧密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456") + @NotEmpty(message = "旧密码不能为空") + @Length(min = 4, max = 16, message = "密码长度为 4-16 位") + private String oldPassword; + + @Schema(description = "新密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "654321") + @NotEmpty(message = "新密码不能为空") + @Length(min = 4, max = 16, message = "密码长度为 4-16 位") + private String newPassword; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/profile/UserProfileUpdateReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/profile/UserProfileUpdateReqVO.java new file mode 100644 index 0000000..6d5f5a2 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/profile/UserProfileUpdateReqVO.java @@ -0,0 +1,31 @@ +package com.win.module.system.controller.user.vo.profile; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.Email; +import javax.validation.constraints.Size; + + +@Schema(description = "管理后台 - 用户个人信息更新 Request VO") +@Data +public class UserProfileUpdateReqVO { + + @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + @Size(max = 30, message = "用户昵称长度不能超过 30 个字符") + private String nickname; + + @Schema(description = "用户邮箱", example = "win@iocoder.cn") + @Email(message = "邮箱格式不正确") + @Size(max = 50, message = "邮箱长度不能超过 50 个字符") + private String email; + + @Schema(description = "手机号码", example = "15601691300") + @Length(min = 11, max = 11, message = "手机号长度必须 11 位") + private String mobile; + + @Schema(description = "用户性别,参见 SexEnum 枚举类", example = "1") + private Integer sex; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/user/UserBaseVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/user/UserBaseVO.java new file mode 100644 index 0000000..09fb881 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/user/UserBaseVO.java @@ -0,0 +1,54 @@ +package com.win.module.system.controller.user.vo.user; + +import com.win.framework.common.validation.Mobile; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.Email; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; +import java.util.Set; + +/** + * 用户 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class UserBaseVO { + + @Schema(description = "用户账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "win") + @NotBlank(message = "用户账号不能为空") + @Pattern(regexp = "^[a-zA-Z0-9]{4,30}$", message = "用户账号由 数字、字母 组成") + @Size(min = 4, max = 30, message = "用户账号长度为 4-30 个字符") + private String username; + + @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + @Size(max = 30, message = "用户昵称长度不能超过30个字符") + private String nickname; + + @Schema(description = "备注", example = "我是一个用户") + private String remark; + + @Schema(description = "部门ID", example = "我是一个用户") + private Long deptId; + + @Schema(description = "岗位编号数组", example = "1") + private Set postIds; + + @Schema(description = "用户邮箱", example = "win@iocoder.cn") + @Email(message = "邮箱格式不正确") + @Size(max = 50, message = "邮箱长度不能超过 50 个字符") + private String email; + + @Schema(description = "手机号码", example = "15601691300") + @Mobile + private String mobile; + + @Schema(description = "用户性别,参见 SexEnum 枚举类", example = "1") + private Integer sex; + + @Schema(description = "用户头像", example = "https://www.iocoder.cn/xxx.png") + private String avatar; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/user/UserCreateReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/user/UserCreateReqVO.java new file mode 100644 index 0000000..cba8a75 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/user/UserCreateReqVO.java @@ -0,0 +1,20 @@ +package com.win.module.system.controller.user.vo.user; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotEmpty; + +@Schema(description = "管理后台 - 用户创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class UserCreateReqVO extends UserBaseVO { + + @Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456") + @NotEmpty(message = "密码不能为空") + @Length(min = 4, max = 16, message = "密码长度为 4-16 位") + private String password; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/user/UserExcelVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/user/UserExcelVO.java new file mode 100644 index 0000000..8bb51b2 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/user/UserExcelVO.java @@ -0,0 +1,53 @@ +package com.win.module.system.controller.user.vo.user; + +import com.win.framework.excel.core.annotations.DictFormat; +import com.win.framework.excel.core.convert.CommonStatusConverter; +import com.win.framework.excel.core.convert.DictConvert; +import com.win.module.system.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 用户 Excel 导出 VO + */ +@Data +public class UserExcelVO { + + @ExcelProperty("用户编号") + private Long id; + + @ExcelProperty("用户名称") + private String username; + + @ExcelProperty("用户昵称") + private String nickname; + + @ExcelProperty("用户邮箱") + private String email; + + @ExcelProperty("手机号码") + private String mobile; + + @ExcelProperty(value = "用户性别", converter = DictConvert.class) + @DictFormat(DictTypeConstants.USER_SEX) + private Integer sex; + + @ExcelProperty(value = "帐号状态", converter = CommonStatusConverter.class) + //@DictFormat(DictTypeConstants.COMMON_STATUS) + private Integer status; + + @ExcelProperty("最后登录IP") + private String loginIp; + + @ExcelProperty("最后登录时间") + private LocalDateTime loginDate; + + @ExcelProperty("部门名称") + private String deptName; + + @ExcelProperty("部门负责人") + private String deptLeaderNickname; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/user/UserExportReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/user/UserExportReqVO.java new file mode 100644 index 0000000..c319025 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/user/UserExportReqVO.java @@ -0,0 +1,35 @@ +package com.win.module.system.controller.user.vo.user; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 用户导出 Request VO,参数和 UserPageReqVO 是一致的") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class UserExportReqVO { + + @Schema(description = "用户账号,模糊匹配", example = "win") + private String username; + + @Schema(description = "手机号码,模糊匹配", example = "win") + private String mobile; + + @Schema(description = "展示状态,参见 CommonStatusEnum 枚举类", example = "1") + private Integer status; + + @Schema(description = "创建时间", example = "[2022-07-01 00:00:00,2022-07-01 23:59:59]") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "部门编号,同时筛选子部门", example = "1024") + private Long deptId; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/user/UserImportExcelVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/user/UserImportExcelVO.java new file mode 100644 index 0000000..50d0708 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/user/UserImportExcelVO.java @@ -0,0 +1,46 @@ +package com.win.module.system.controller.user.vo.user; + +import com.win.framework.excel.core.annotations.DictFormat; +import com.win.framework.excel.core.convert.DictConvert; +import com.win.module.system.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +/** + * 用户 Excel 导入 VO + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Accessors(chain = false) // 设置 chain = false,避免用户导入有问题 +public class UserImportExcelVO { + + @ExcelProperty("登录名称") + private String username; + + @ExcelProperty("用户名称") + private String nickname; + + @ExcelProperty("部门编号") + private Long deptId; + + @ExcelProperty("用户邮箱") + private String email; + + @ExcelProperty("手机号码") + private String mobile; + + @ExcelProperty(value = "用户性别", converter = DictConvert.class) + @DictFormat(DictTypeConstants.USER_SEX) + private Integer sex; + + @ExcelProperty(value = "账号状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.COMMON_STATUS) + private Integer status; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/user/UserPageItemRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/user/UserPageItemRespVO.java new file mode 100644 index 0000000..02855cf --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/user/UserPageItemRespVO.java @@ -0,0 +1,33 @@ +package com.win.module.system.controller.user.vo.user; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +@Schema(description = "管理后台 - 用户分页时的信息 Response VO,相比用户基本信息来说,会多部门信息") +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class UserPageItemRespVO extends UserRespVO { + + /** + * 所在部门 + */ + private Dept dept; + + @Schema(description = "部门") + @Data + public static class Dept { + + @Schema(description = "部门编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long id; + + @Schema(description = "部门名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "研发部") + private String name; + + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/user/UserPageReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/user/UserPageReqVO.java new file mode 100644 index 0000000..7bc9357 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/user/UserPageReqVO.java @@ -0,0 +1,38 @@ +package com.win.module.system.controller.user.vo.user; + +import com.win.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 用户分页 Request VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class UserPageReqVO extends PageParam { + + @Schema(description = "用户账号,模糊匹配", example = "win") + private String username; + + @Schema(description = "手机号码,模糊匹配", example = "win") + private String mobile; + + @Schema(description = "展示状态,参见 CommonStatusEnum 枚举类", example = "1") + private Integer status; + + @Schema(description = "创建时间", example = "[2022-07-01 00:00:00, 2022-07-01 23:59:59]") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "部门编号,同时筛选子部门", example = "1024") + private Long deptId; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/user/UserRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/user/UserRespVO.java new file mode 100644 index 0000000..ebd863f --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/user/UserRespVO.java @@ -0,0 +1,31 @@ +package com.win.module.system.controller.user.vo.user; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import java.time.LocalDateTime; + + +@Schema(description = "管理后台 - 用户信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class UserRespVO extends UserBaseVO { + + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long id; + + @Schema(description = "状态,参见 CommonStatusEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer status; + + @Schema(description = "最后登录 IP", requiredMode = Schema.RequiredMode.REQUIRED, example = "192.168.1.1") + private String loginIp; + + @Schema(description = "最后登录时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "时间戳格式") + private LocalDateTime loginDate; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "时间戳格式") + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/user/UserSimpleRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/user/UserSimpleRespVO.java new file mode 100644 index 0000000..7e9da66 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/user/UserSimpleRespVO.java @@ -0,0 +1,20 @@ +package com.win.module.system.controller.user.vo.user; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Schema(description = "管理后台 - 用户精简信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class UserSimpleRespVO { + + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "闻荫") + private String nickname; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/user/UserUpdatePasswordReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/user/UserUpdatePasswordReqVO.java new file mode 100644 index 0000000..f607e9a --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/user/UserUpdatePasswordReqVO.java @@ -0,0 +1,23 @@ +package com.win.module.system.controller.user.vo.user; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 用户更新密码 Request VO") +@Data +public class UserUpdatePasswordReqVO { + + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "用户编号不能为空") + private Long id; + + @Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456") + @NotEmpty(message = "密码不能为空") + @Length(min = 4, max = 16, message = "密码长度为 4-16 位") + private String password; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/user/UserUpdateReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/user/UserUpdateReqVO.java new file mode 100644 index 0000000..88c77d6 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/user/UserUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.win.module.system.controller.user.vo.user; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 用户更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class UserUpdateReqVO extends UserBaseVO { + + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "用户编号不能为空") + private Long id; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/user/UserUpdateStatusReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/user/UserUpdateStatusReqVO.java new file mode 100644 index 0000000..68c38c9 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/user/UserUpdateStatusReqVO.java @@ -0,0 +1,23 @@ +package com.win.module.system.controller.user.vo.user; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.validation.InEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 用户更新状态 Request VO") +@Data +public class UserUpdateStatusReqVO { + + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "角色编号不能为空") + private Long id; + + @Schema(description = "状态,见 CommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "状态不能为空") + @InEnum(value = CommonStatusEnum.class, message = "修改状态必须是 {value}") + private Integer status; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/auth/AuthConvert.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/auth/AuthConvert.java new file mode 100644 index 0000000..23f2579 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/auth/AuthConvert.java @@ -0,0 +1,75 @@ +package com.win.module.system.convert.auth; + +import com.win.module.system.controller.auth.vo.AuthLoginRespVO; +import com.win.module.system.controller.auth.vo.AuthPermissionInfoRespVO; +import com.win.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; +import com.win.module.system.dal.dataobject.permission.MenuDO; +import com.win.module.system.dal.dataobject.permission.RoleDO; +import com.win.module.system.dal.dataobject.user.AdminUserDO; +import com.win.module.system.enums.permission.MenuTypeEnum; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import org.slf4j.LoggerFactory; + +import java.util.*; + +import static com.win.framework.common.util.collection.CollectionUtils.convertSet; +import static com.win.framework.common.util.collection.CollectionUtils.filterList; +import static com.win.module.system.dal.dataobject.permission.MenuDO.ID_ROOT; + +@Mapper +public interface AuthConvert { + + AuthConvert INSTANCE = Mappers.getMapper(AuthConvert.class); + + AuthLoginRespVO convert(OAuth2AccessTokenDO bean); + + default AuthPermissionInfoRespVO convert(AdminUserDO user, List roleList, List menuList) { + return AuthPermissionInfoRespVO.builder() + .user(AuthPermissionInfoRespVO.UserVO.builder().id(user.getId()).nickname(user.getNickname()).avatar(user.getAvatar()).build()) + .roles(convertSet(roleList, RoleDO::getCode)) + // 权限标识信息 + .permissions(convertSet(menuList, MenuDO::getPermission)) + // 菜单树 + .menus(buildMenuTree(menuList)) + .build(); + } + + AuthPermissionInfoRespVO.MenuVO convertTreeNode(MenuDO menu); + + /** + * 将菜单列表,构建成菜单树 + * + * @param menuList 菜单列表 + * @return 菜单树 + */ + default List buildMenuTree(List menuList) { + // 移除按钮 + menuList.removeIf(menu -> menu.getType().equals(MenuTypeEnum.BUTTON.getType())); + // 排序,保证菜单的有序性 + menuList.sort(Comparator.comparing(MenuDO::getSort)); + + // 构建菜单树 + // 使用 LinkedHashMap 的原因,是为了排序 。实际也可以用 Stream API ,就是太丑了。 + Map treeNodeMap = new LinkedHashMap<>(); + menuList.forEach(menu -> treeNodeMap.put(menu.getId(), AuthConvert.INSTANCE.convertTreeNode(menu))); + // 处理父子关系 + treeNodeMap.values().stream().filter(node -> !node.getParentId().equals(ID_ROOT)).forEach(childNode -> { + // 获得父节点 + AuthPermissionInfoRespVO.MenuVO parentNode = treeNodeMap.get(childNode.getParentId()); + if (parentNode == null) { + LoggerFactory.getLogger(getClass()).error("[buildRouterTree][resource({}) 找不到父资源({})]", + childNode.getId(), childNode.getParentId()); + return; + } + // 将自己添加到父节点中 + if (parentNode.getChildren() == null) { + parentNode.setChildren(new ArrayList<>()); + } + parentNode.getChildren().add(childNode); + }); + // 获得到所有的根节点 + return filterList(treeNodeMap.values(), node -> ID_ROOT.equals(node.getParentId())); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/auth/OAuth2ClientConvert.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/auth/OAuth2ClientConvert.java new file mode 100644 index 0000000..d51bb47 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/auth/OAuth2ClientConvert.java @@ -0,0 +1,33 @@ +package com.win.module.system.convert.auth; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.oauth2.vo.client.OAuth2ClientCreateReqVO; +import com.win.module.system.controller.oauth2.vo.client.OAuth2ClientRespVO; +import com.win.module.system.controller.oauth2.vo.client.OAuth2ClientUpdateReqVO; +import com.win.module.system.dal.dataobject.oauth2.OAuth2ClientDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * OAuth2 客户端 Convert + * + * @author 闻荫源码 + */ +@Mapper +public interface OAuth2ClientConvert { + + OAuth2ClientConvert INSTANCE = Mappers.getMapper(OAuth2ClientConvert.class); + + OAuth2ClientDO convert(OAuth2ClientCreateReqVO bean); + + OAuth2ClientDO convert(OAuth2ClientUpdateReqVO bean); + + OAuth2ClientRespVO convert(OAuth2ClientDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/auth/OAuth2TokenConvert.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/auth/OAuth2TokenConvert.java new file mode 100644 index 0000000..74d9ea7 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/auth/OAuth2TokenConvert.java @@ -0,0 +1,22 @@ +package com.win.module.system.convert.auth; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.api.oauth2.dto.OAuth2AccessTokenCheckRespDTO; +import com.win.module.system.api.oauth2.dto.OAuth2AccessTokenRespDTO; +import com.win.module.system.controller.oauth2.vo.token.OAuth2AccessTokenRespVO; +import com.win.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +@Mapper +public interface OAuth2TokenConvert { + + OAuth2TokenConvert INSTANCE = Mappers.getMapper(OAuth2TokenConvert.class); + + OAuth2AccessTokenCheckRespDTO convert(OAuth2AccessTokenDO bean); + + PageResult convert(PageResult page); + + OAuth2AccessTokenRespDTO convert2(OAuth2AccessTokenDO bean); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/dept/DeptConvert.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/dept/DeptConvert.java new file mode 100644 index 0000000..9817152 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/dept/DeptConvert.java @@ -0,0 +1,33 @@ +package com.win.module.system.convert.dept; + +import com.win.module.system.api.dept.dto.DeptRespDTO; +import com.win.module.system.controller.dept.vo.dept.DeptCreateReqVO; +import com.win.module.system.controller.dept.vo.dept.DeptRespVO; +import com.win.module.system.controller.dept.vo.dept.DeptSimpleRespVO; +import com.win.module.system.controller.dept.vo.dept.DeptUpdateReqVO; +import com.win.module.system.dal.dataobject.dept.DeptDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface DeptConvert { + + DeptConvert INSTANCE = Mappers.getMapper(DeptConvert.class); + + List convertList(List list); + + List convertList02(List list); + + DeptRespVO convert(DeptDO bean); + + DeptDO convert(DeptCreateReqVO bean); + + DeptDO convert(DeptUpdateReqVO bean); + + List convertList03(List list); + + DeptRespDTO convert03(DeptDO bean); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/dept/PostConvert.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/dept/PostConvert.java new file mode 100644 index 0000000..cab9d73 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/dept/PostConvert.java @@ -0,0 +1,28 @@ +package com.win.module.system.convert.dept; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.dept.vo.post.*; +import com.win.module.system.dal.dataobject.dept.PostDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface PostConvert { + + PostConvert INSTANCE = Mappers.getMapper(PostConvert.class); + + List convertList02(List list); + + PageResult convertPage(PageResult page); + + PostRespVO convert(PostDO id); + + PostDO convert(PostCreateReqVO bean); + + PostDO convert(PostUpdateReqVO reqVO); + + List convertList03(List list); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/dict/DictDataConvert.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/dict/DictDataConvert.java new file mode 100644 index 0000000..2c22561 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/dict/DictDataConvert.java @@ -0,0 +1,31 @@ +package com.win.module.system.convert.dict; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.api.dict.dto.DictDataRespDTO; +import com.win.module.system.controller.dict.vo.data.*; +import com.win.module.system.dal.dataobject.dict.DictDataDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface DictDataConvert { + + DictDataConvert INSTANCE = Mappers.getMapper(DictDataConvert.class); + + List convertList(List list); + + DictDataRespVO convert(DictDataDO bean); + + PageResult convertPage(PageResult page); + + DictDataDO convert(DictDataUpdateReqVO bean); + + DictDataDO convert(DictDataCreateReqVO bean); + + List convertList02(List bean); + + DictDataRespDTO convert02(DictDataDO bean); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/dict/DictTypeConvert.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/dict/DictTypeConvert.java new file mode 100644 index 0000000..a59217c --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/dict/DictTypeConvert.java @@ -0,0 +1,28 @@ +package com.win.module.system.convert.dict; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.dict.vo.type.*; +import com.win.module.system.dal.dataobject.dict.DictTypeDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface DictTypeConvert { + + DictTypeConvert INSTANCE = Mappers.getMapper(DictTypeConvert.class); + + PageResult convertPage(PageResult bean); + + DictTypeRespVO convert(DictTypeDO bean); + + DictTypeDO convert(DictTypeCreateReqVO bean); + + DictTypeDO convert(DictTypeUpdateReqVO bean); + + List convertList(List list); + + List convertList02(List list); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/errorcode/ErrorCodeConvert.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/errorcode/ErrorCodeConvert.java new file mode 100644 index 0000000..99ff6c1 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/errorcode/ErrorCodeConvert.java @@ -0,0 +1,42 @@ +package com.win.module.system.convert.errorcode; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.api.errorcode.dto.ErrorCodeAutoGenerateReqDTO; +import com.win.module.system.api.errorcode.dto.ErrorCodeRespDTO; +import com.win.module.system.controller.errorcode.vo.ErrorCodeCreateReqVO; +import com.win.module.system.controller.errorcode.vo.ErrorCodeExcelVO; +import com.win.module.system.controller.errorcode.vo.ErrorCodeRespVO; +import com.win.module.system.controller.errorcode.vo.ErrorCodeUpdateReqVO; +import com.win.module.system.dal.dataobject.errorcode.ErrorCodeDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 错误码 Convert + * + * @author 闻荫源码 + */ +@Mapper +public interface ErrorCodeConvert { + + ErrorCodeConvert INSTANCE = Mappers.getMapper(ErrorCodeConvert.class); + + ErrorCodeDO convert(ErrorCodeCreateReqVO bean); + + ErrorCodeDO convert(ErrorCodeUpdateReqVO bean); + + ErrorCodeRespVO convert(ErrorCodeDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + + ErrorCodeDO convert(ErrorCodeAutoGenerateReqDTO bean); + + List convertList03(List list); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/ip/AreaConvert.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/ip/AreaConvert.java new file mode 100644 index 0000000..24ffeb4 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/ip/AreaConvert.java @@ -0,0 +1,30 @@ +package com.win.module.system.convert.ip; + +import com.win.framework.ip.core.Area; +import com.win.framework.ip.core.enums.AreaTypeEnum; +import com.win.module.system.controller.ip.vo.AreaNodeRespVO; +import com.win.module.system.controller.ip.vo.AreaNodeSimpleRespVO; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.factory.Mappers; + +import java.util.List; +import java.util.Objects; + +@Mapper +public interface AreaConvert { + + AreaConvert INSTANCE = Mappers.getMapper(AreaConvert.class); + + List convertList(List list); + + List convertList2(List list); + + @Mapping(source = "type", target = "leaf") + AreaNodeSimpleRespVO convert(Area area); + + default Boolean convertAreaType(Integer type) { + return Objects.equals(AreaTypeEnum.DISTRICT.getType(), type); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/logger/LoginLogConvert.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/logger/LoginLogConvert.java new file mode 100644 index 0000000..8c6303d --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/logger/LoginLogConvert.java @@ -0,0 +1,24 @@ +package com.win.module.system.convert.logger; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.api.logger.dto.LoginLogCreateReqDTO; +import com.win.module.system.controller.logger.vo.loginlog.LoginLogExcelVO; +import com.win.module.system.controller.logger.vo.loginlog.LoginLogRespVO; +import com.win.module.system.dal.dataobject.logger.LoginLogDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface LoginLogConvert { + + LoginLogConvert INSTANCE = Mappers.getMapper(LoginLogConvert.class); + + PageResult convertPage(PageResult page); + + List convertList(List list); + + LoginLogDO convert(LoginLogCreateReqDTO bean); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/logger/OperateLogConvert.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/logger/OperateLogConvert.java new file mode 100644 index 0000000..824c214 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/logger/OperateLogConvert.java @@ -0,0 +1,41 @@ +package com.win.module.system.convert.logger; + +import com.win.module.system.controller.logger.vo.operatelog.OperateLogExcelVO; +import com.win.module.system.controller.logger.vo.operatelog.OperateLogRespVO; +import com.win.module.system.dal.dataobject.logger.OperateLogDO; +import com.win.module.system.dal.dataobject.user.AdminUserDO; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.collection.MapUtils; +import com.win.module.system.api.logger.dto.OperateLogCreateReqDTO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import static com.win.framework.common.exception.enums.GlobalErrorCodeConstants.SUCCESS; + +@Mapper +public interface OperateLogConvert { + + OperateLogConvert INSTANCE = Mappers.getMapper(OperateLogConvert.class); + + OperateLogDO convert(OperateLogCreateReqDTO bean); + + PageResult convertPage(PageResult page); + + OperateLogRespVO convert(OperateLogDO bean); + + default List convertList(List list, Map userMap) { + return list.stream().map(operateLog -> { + OperateLogExcelVO excelVO = convert02(operateLog); + MapUtils.findAndThen(userMap, operateLog.getUserId(), user -> excelVO.setUserNickname(user.getNickname())); + excelVO.setSuccessStr(SUCCESS.getCode().equals(operateLog.getResultCode()) ? "成功" : "失败"); + return excelVO; + }).collect(Collectors.toList()); + } + + OperateLogExcelVO convert02(OperateLogDO bean); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/mail/MailAccountConvert.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/mail/MailAccountConvert.java new file mode 100644 index 0000000..e0964e1 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/mail/MailAccountConvert.java @@ -0,0 +1,35 @@ +package com.win.module.system.convert.mail; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.mail.MailAccount; +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.mail.vo.account.*; +import com.win.module.system.dal.dataobject.mail.MailAccountDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface MailAccountConvert { + + MailAccountConvert INSTANCE = Mappers.getMapper(MailAccountConvert.class); + + MailAccountDO convert(MailAccountCreateReqVO bean); + + MailAccountDO convert(MailAccountUpdateReqVO bean); + + MailAccountRespVO convert(MailAccountDO bean); + + PageResult convertPage(PageResult pageResult); + + List convertList02(List list); + + default MailAccount convert(MailAccountDO account, String nickname) { + String from = StrUtil.isNotEmpty(nickname) ? nickname + " <" + account.getMail() + ">" : account.getMail(); + return new MailAccount().setFrom(from).setAuth(true) + .setUser(account.getUsername()).setPass(account.getPassword()) + .setHost(account.getHost()).setPort(account.getPort()).setSslEnable(account.getSslEnable()); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/mail/MailLogConvert.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/mail/MailLogConvert.java new file mode 100644 index 0000000..be58107 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/mail/MailLogConvert.java @@ -0,0 +1,18 @@ +package com.win.module.system.convert.mail; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.mail.vo.log.MailLogRespVO; +import com.win.module.system.dal.dataobject.mail.MailLogDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +@Mapper +public interface MailLogConvert { + + MailLogConvert INSTANCE = Mappers.getMapper(MailLogConvert.class); + + PageResult convertPage(PageResult pageResult); + + MailLogRespVO convert(MailLogDO bean); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/mail/MailTemplateConvert.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/mail/MailTemplateConvert.java new file mode 100644 index 0000000..1e5e052 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/mail/MailTemplateConvert.java @@ -0,0 +1,29 @@ +package com.win.module.system.convert.mail; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.mail.vo.template.MailTemplateCreateReqVO; +import com.win.module.system.controller.mail.vo.template.MailTemplateRespVO; +import com.win.module.system.controller.mail.vo.template.MailTemplateSimpleRespVO; +import com.win.module.system.controller.mail.vo.template.MailTemplateUpdateReqVO; +import com.win.module.system.dal.dataobject.mail.MailTemplateDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface MailTemplateConvert { + + MailTemplateConvert INSTANCE = Mappers.getMapper(MailTemplateConvert.class); + + MailTemplateDO convert(MailTemplateUpdateReqVO bean); + + MailTemplateDO convert(MailTemplateCreateReqVO bean); + + MailTemplateRespVO convert(MailTemplateDO bean); + + PageResult convertPage(PageResult pageResult); + + List convertList02(List list); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/notice/NoticeConvert.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/notice/NoticeConvert.java new file mode 100644 index 0000000..64e8ddb --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/notice/NoticeConvert.java @@ -0,0 +1,24 @@ +package com.win.module.system.convert.notice; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.notice.vo.NoticeCreateReqVO; +import com.win.module.system.controller.notice.vo.NoticeRespVO; +import com.win.module.system.controller.notice.vo.NoticeUpdateReqVO; +import com.win.module.system.dal.dataobject.notice.NoticeDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +@Mapper +public interface NoticeConvert { + + NoticeConvert INSTANCE = Mappers.getMapper(NoticeConvert.class); + + PageResult convertPage(PageResult page); + + NoticeRespVO convert(NoticeDO bean); + + NoticeDO convert(NoticeUpdateReqVO bean); + + NoticeDO convert(NoticeCreateReqVO bean); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/notify/NotifyMessageConvert.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/notify/NotifyMessageConvert.java new file mode 100644 index 0000000..d3c7ece --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/notify/NotifyMessageConvert.java @@ -0,0 +1,27 @@ +package com.win.module.system.convert.notify; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.notify.vo.message.NotifyMessageRespVO; +import com.win.module.system.dal.dataobject.notify.NotifyMessageDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 站内信 Convert + * + * @author xrcoder + */ +@Mapper +public interface NotifyMessageConvert { + + NotifyMessageConvert INSTANCE = Mappers.getMapper(NotifyMessageConvert.class); + + NotifyMessageRespVO convert(NotifyMessageDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/notify/NotifyTemplateConvert.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/notify/NotifyTemplateConvert.java new file mode 100644 index 0000000..a9d05a4 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/notify/NotifyTemplateConvert.java @@ -0,0 +1,35 @@ +package com.win.module.system.convert.notify; + +import java.util.*; + +import com.win.framework.common.pojo.PageResult; + +import com.win.framework.common.util.date.DateUtils; +import com.win.module.system.controller.notify.vo.template.NotifyTemplateCreateReqVO; +import com.win.module.system.controller.notify.vo.template.NotifyTemplateRespVO; +import com.win.module.system.controller.notify.vo.template.NotifyTemplateUpdateReqVO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.win.module.system.dal.dataobject.notify.NotifyTemplateDO; + +/** + * 站内信模版 Convert + * + * @author xrcoder + */ +@Mapper(uses = DateUtils.class) +public interface NotifyTemplateConvert { + + NotifyTemplateConvert INSTANCE = Mappers.getMapper(NotifyTemplateConvert.class); + + NotifyTemplateDO convert(NotifyTemplateCreateReqVO bean); + + NotifyTemplateDO convert(NotifyTemplateUpdateReqVO bean); + + NotifyTemplateRespVO convert(NotifyTemplateDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/oauth2/OAuth2OpenConvert.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/oauth2/OAuth2OpenConvert.java new file mode 100644 index 0000000..f285be4 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/oauth2/OAuth2OpenConvert.java @@ -0,0 +1,55 @@ +package com.win.module.system.convert.oauth2; + +import cn.hutool.core.date.LocalDateTimeUtil; +import com.win.framework.common.core.KeyValue; +import com.win.framework.common.util.collection.CollectionUtils; +import com.win.framework.security.core.util.SecurityFrameworkUtils; +import com.win.module.system.controller.oauth2.vo.open.OAuth2OpenAccessTokenRespVO; +import com.win.module.system.controller.oauth2.vo.open.OAuth2OpenAuthorizeInfoRespVO; +import com.win.module.system.controller.oauth2.vo.open.OAuth2OpenCheckTokenRespVO; +import com.win.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; +import com.win.module.system.dal.dataobject.oauth2.OAuth2ApproveDO; +import com.win.module.system.dal.dataobject.oauth2.OAuth2ClientDO; +import com.win.module.system.util.oauth2.OAuth2Utils; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Mapper +public interface OAuth2OpenConvert { + + OAuth2OpenConvert INSTANCE = Mappers.getMapper(OAuth2OpenConvert.class); + + default OAuth2OpenAccessTokenRespVO convert(OAuth2AccessTokenDO bean) { + OAuth2OpenAccessTokenRespVO respVO = convert0(bean); + respVO.setTokenType(SecurityFrameworkUtils.AUTHORIZATION_BEARER.toLowerCase()); + respVO.setExpiresIn(OAuth2Utils.getExpiresIn(bean.getExpiresTime())); + respVO.setScope(OAuth2Utils.buildScopeStr(bean.getScopes())); + return respVO; + } + OAuth2OpenAccessTokenRespVO convert0(OAuth2AccessTokenDO bean); + + default OAuth2OpenCheckTokenRespVO convert2(OAuth2AccessTokenDO bean) { + OAuth2OpenCheckTokenRespVO respVO = convert3(bean); + respVO.setExp(LocalDateTimeUtil.toEpochMilli(bean.getExpiresTime()) / 1000L); + return respVO; + } + OAuth2OpenCheckTokenRespVO convert3(OAuth2AccessTokenDO bean); + + default OAuth2OpenAuthorizeInfoRespVO convert(OAuth2ClientDO client, List approves) { + // 构建 scopes + List> scopes = new ArrayList<>(client.getScopes().size()); + Map approveMap = CollectionUtils.convertMap(approves, OAuth2ApproveDO::getScope); + client.getScopes().forEach(scope -> { + OAuth2ApproveDO approve = approveMap.get(scope); + scopes.add(new KeyValue<>(scope, approve != null ? approve.getApproved() : false)); + }); + // 拼接返回 + return new OAuth2OpenAuthorizeInfoRespVO( + new OAuth2OpenAuthorizeInfoRespVO.Client(client.getName(), client.getLogo()), scopes); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/oauth2/OAuth2UserConvert.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/oauth2/OAuth2UserConvert.java new file mode 100644 index 0000000..b782dff --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/oauth2/OAuth2UserConvert.java @@ -0,0 +1,25 @@ +package com.win.module.system.convert.oauth2; + +import com.win.module.system.controller.oauth2.vo.user.OAuth2UserInfoRespVO; +import com.win.module.system.controller.oauth2.vo.user.OAuth2UserUpdateReqVO; +import com.win.module.system.controller.user.vo.profile.UserProfileUpdateReqVO; +import com.win.module.system.dal.dataobject.dept.DeptDO; +import com.win.module.system.dal.dataobject.dept.PostDO; +import com.win.module.system.dal.dataobject.user.AdminUserDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface OAuth2UserConvert { + + OAuth2UserConvert INSTANCE = Mappers.getMapper(OAuth2UserConvert.class); + + OAuth2UserInfoRespVO convert(AdminUserDO bean); + OAuth2UserInfoRespVO.Dept convert(DeptDO dept); + List convertList(List list); + + UserProfileUpdateReqVO convert(OAuth2UserUpdateReqVO bean); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/package-info.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/package-info.java new file mode 100644 index 0000000..5baeb0b --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/package-info.java @@ -0,0 +1,6 @@ +/** + * 提供 POJO 类的实体转换 + * + * 目前使用 MapStruct 框架 + */ +package com.win.module.system.convert; diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/permission/MenuConvert.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/permission/MenuConvert.java new file mode 100644 index 0000000..4fd688f --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/permission/MenuConvert.java @@ -0,0 +1,28 @@ +package com.win.module.system.convert.permission; + +import com.win.module.system.controller.permission.vo.menu.MenuCreateReqVO; +import com.win.module.system.controller.permission.vo.menu.MenuRespVO; +import com.win.module.system.controller.permission.vo.menu.MenuSimpleRespVO; +import com.win.module.system.controller.permission.vo.menu.MenuUpdateReqVO; +import com.win.module.system.dal.dataobject.permission.MenuDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface MenuConvert { + + MenuConvert INSTANCE = Mappers.getMapper(MenuConvert.class); + + List convertList(List list); + + MenuDO convert(MenuCreateReqVO bean); + + MenuDO convert(MenuUpdateReqVO bean); + + MenuRespVO convert(MenuDO bean); + + List convertList02(List list); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/permission/RoleConvert.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/permission/RoleConvert.java new file mode 100644 index 0000000..a2a978f --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/permission/RoleConvert.java @@ -0,0 +1,28 @@ +package com.win.module.system.convert.permission; + +import com.win.module.system.controller.permission.vo.role.*; +import com.win.module.system.dal.dataobject.permission.RoleDO; +import com.win.module.system.service.permission.bo.RoleCreateReqBO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface RoleConvert { + + RoleConvert INSTANCE = Mappers.getMapper(RoleConvert.class); + + RoleDO convert(RoleUpdateReqVO bean); + + RoleRespVO convert(RoleDO bean); + + RoleDO convert(RoleCreateReqVO bean); + + List convertList02(List list); + + List convertList03(List list); + + RoleDO convert(RoleCreateReqBO bean); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/sensitiveword/SensitiveWordConvert.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/sensitiveword/SensitiveWordConvert.java new file mode 100644 index 0000000..7924bcb --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/sensitiveword/SensitiveWordConvert.java @@ -0,0 +1,36 @@ +package com.win.module.system.convert.sensitiveword; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.sensitiveword.vo.SensitiveWordCreateReqVO; +import com.win.module.system.controller.sensitiveword.vo.SensitiveWordExcelVO; +import com.win.module.system.controller.sensitiveword.vo.SensitiveWordRespVO; +import com.win.module.system.controller.sensitiveword.vo.SensitiveWordUpdateReqVO; +import com.win.module.system.dal.dataobject.sensitiveword.SensitiveWordDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 敏感词 Convert + * + * @author 永不言败 + */ +@Mapper +public interface SensitiveWordConvert { + + SensitiveWordConvert INSTANCE = Mappers.getMapper(SensitiveWordConvert.class); + + SensitiveWordDO convert(SensitiveWordCreateReqVO bean); + + SensitiveWordDO convert(SensitiveWordUpdateReqVO bean); + + SensitiveWordRespVO convert(SensitiveWordDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/serialnumber/SerialNumberConvert.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/serialnumber/SerialNumberConvert.java new file mode 100644 index 0000000..61abc21 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/serialnumber/SerialNumberConvert.java @@ -0,0 +1,37 @@ +package com.win.module.system.convert.serialnumber; + +import java.util.*; + +import com.win.framework.common.pojo.PageResult; + +import com.win.module.system.controller.serialnumber.vo.SerialNumberCreateReqVO; +import com.win.module.system.controller.serialnumber.vo.SerialNumberExcelVO; +import com.win.module.system.controller.serialnumber.vo.SerialNumberRespVO; +import com.win.module.system.controller.serialnumber.vo.SerialNumberUpdateReqVO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.win.module.system.dal.dataobject.serialnumber.SerialNumberDO; + +/** + * 流水号规则 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface SerialNumberConvert { + + SerialNumberConvert INSTANCE = Mappers.getMapper(SerialNumberConvert.class); + + SerialNumberDO convert(SerialNumberCreateReqVO bean); + + SerialNumberDO convert(SerialNumberUpdateReqVO bean); + + SerialNumberRespVO convert(SerialNumberDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/sms/SmsChannelConvert.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/sms/SmsChannelConvert.java new file mode 100644 index 0000000..39ca4e1 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/sms/SmsChannelConvert.java @@ -0,0 +1,39 @@ +package com.win.module.system.convert.sms; + +import com.win.module.system.controller.sms.vo.channel.SmsChannelCreateReqVO; +import com.win.module.system.controller.sms.vo.channel.SmsChannelRespVO; +import com.win.module.system.controller.sms.vo.channel.SmsChannelSimpleRespVO; +import com.win.module.system.controller.sms.vo.channel.SmsChannelUpdateReqVO; +import com.win.module.system.dal.dataobject.sms.SmsChannelDO; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.sms.core.property.SmsChannelProperties; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 短信渠道 Convert + * + * @author 闻荫源码 + */ +@Mapper +public interface SmsChannelConvert { + + SmsChannelConvert INSTANCE = Mappers.getMapper(SmsChannelConvert.class); + + SmsChannelDO convert(SmsChannelCreateReqVO bean); + + SmsChannelDO convert(SmsChannelUpdateReqVO bean); + + SmsChannelRespVO convert(SmsChannelDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList03(List list); + + SmsChannelProperties convert02(SmsChannelDO channel); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/sms/SmsLogConvert.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/sms/SmsLogConvert.java new file mode 100644 index 0000000..888ae41 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/sms/SmsLogConvert.java @@ -0,0 +1,30 @@ +package com.win.module.system.convert.sms; + +import com.win.module.system.controller.sms.vo.log.SmsLogExcelVO; +import com.win.module.system.controller.sms.vo.log.SmsLogRespVO; +import com.win.module.system.dal.dataobject.sms.SmsLogDO; +import com.win.framework.common.pojo.PageResult; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 短信日志 Convert + * + * @author 闻荫源码 + */ +@Mapper +public interface SmsLogConvert { + + SmsLogConvert INSTANCE = Mappers.getMapper(SmsLogConvert.class); + + SmsLogRespVO convert(SmsLogDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/sms/SmsTemplateConvert.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/sms/SmsTemplateConvert.java new file mode 100644 index 0000000..03dfd75 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/sms/SmsTemplateConvert.java @@ -0,0 +1,31 @@ +package com.win.module.system.convert.sms; + +import com.win.module.system.controller.sms.vo.template.SmsTemplateCreateReqVO; +import com.win.module.system.controller.sms.vo.template.SmsTemplateExcelVO; +import com.win.module.system.controller.sms.vo.template.SmsTemplateRespVO; +import com.win.module.system.controller.sms.vo.template.SmsTemplateUpdateReqVO; +import com.win.module.system.dal.dataobject.sms.SmsTemplateDO; +import com.win.framework.common.pojo.PageResult; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface SmsTemplateConvert { + + SmsTemplateConvert INSTANCE = Mappers.getMapper(SmsTemplateConvert.class); + + SmsTemplateDO convert(SmsTemplateCreateReqVO bean); + + SmsTemplateDO convert(SmsTemplateUpdateReqVO bean); + + SmsTemplateRespVO convert(SmsTemplateDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/tenant/TenantConvert.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/tenant/TenantConvert.java new file mode 100644 index 0000000..ceee80a --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/tenant/TenantConvert.java @@ -0,0 +1,45 @@ +package com.win.module.system.convert.tenant; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.tenant.vo.tenant.TenantCreateReqVO; +import com.win.module.system.controller.tenant.vo.tenant.TenantExcelVO; +import com.win.module.system.controller.tenant.vo.tenant.TenantRespVO; +import com.win.module.system.controller.tenant.vo.tenant.TenantUpdateReqVO; +import com.win.module.system.controller.user.vo.user.UserCreateReqVO; +import com.win.module.system.dal.dataobject.tenant.TenantDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 租户 Convert + * + * @author 闻荫源码 + */ +@Mapper +public interface TenantConvert { + + TenantConvert INSTANCE = Mappers.getMapper(TenantConvert.class); + + TenantDO convert(TenantCreateReqVO bean); + + TenantDO convert(TenantUpdateReqVO bean); + + TenantRespVO convert(TenantDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + + default UserCreateReqVO convert02(TenantCreateReqVO bean) { + UserCreateReqVO reqVO = new UserCreateReqVO(); + reqVO.setUsername(bean.getUsername()); + reqVO.setPassword(bean.getPassword()); + reqVO.setNickname(bean.getContactName()).setMobile(bean.getContactMobile()); + return reqVO; + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/tenant/TenantPackageConvert.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/tenant/TenantPackageConvert.java new file mode 100644 index 0000000..6fa0351 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/tenant/TenantPackageConvert.java @@ -0,0 +1,36 @@ +package com.win.module.system.convert.tenant; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.tenant.vo.packages.TenantPackageCreateReqVO; +import com.win.module.system.controller.tenant.vo.packages.TenantPackageRespVO; +import com.win.module.system.controller.tenant.vo.packages.TenantPackageSimpleRespVO; +import com.win.module.system.controller.tenant.vo.packages.TenantPackageUpdateReqVO; +import com.win.module.system.dal.dataobject.tenant.TenantPackageDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 租户套餐 Convert + * + * @author 闻荫源码 + */ +@Mapper +public interface TenantPackageConvert { + + TenantPackageConvert INSTANCE = Mappers.getMapper(TenantPackageConvert.class); + + TenantPackageDO convert(TenantPackageCreateReqVO bean); + + TenantPackageDO convert(TenantPackageUpdateReqVO bean); + + TenantPackageRespVO convert(TenantPackageDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/user/UserConvert.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/user/UserConvert.java new file mode 100644 index 0000000..b61c1a9 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/user/UserConvert.java @@ -0,0 +1,52 @@ +package com.win.module.system.convert.user; + +import com.win.module.system.api.user.dto.AdminUserRespDTO; +import com.win.module.system.controller.user.vo.profile.UserProfileRespVO; +import com.win.module.system.controller.user.vo.profile.UserProfileUpdatePasswordReqVO; +import com.win.module.system.controller.user.vo.profile.UserProfileUpdateReqVO; +import com.win.module.system.controller.user.vo.user.*; +import com.win.module.system.dal.dataobject.dept.DeptDO; +import com.win.module.system.dal.dataobject.dept.PostDO; +import com.win.module.system.dal.dataobject.permission.RoleDO; +import com.win.module.system.dal.dataobject.user.AdminUserDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface UserConvert { + + UserConvert INSTANCE = Mappers.getMapper(UserConvert.class); + + UserPageItemRespVO convert(AdminUserDO bean); + + UserPageItemRespVO.Dept convert(DeptDO bean); + + AdminUserDO convert(UserCreateReqVO bean); + + AdminUserDO convert(UserUpdateReqVO bean); + + UserExcelVO convert02(AdminUserDO bean); + + AdminUserDO convert(UserImportExcelVO bean); + + UserProfileRespVO convert03(AdminUserDO bean); + + List convertList(List list); + + UserProfileRespVO.Dept convert02(DeptDO bean); + + AdminUserDO convert(UserProfileUpdateReqVO bean); + + AdminUserDO convert(UserProfileUpdatePasswordReqVO bean); + + List convertList02(List list); + + List convertList04(List list); + + AdminUserRespDTO convert4(AdminUserDO bean); + + List convertList4(List users); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/dept/DeptDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/dept/DeptDO.java new file mode 100644 index 0000000..429c868 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/dept/DeptDO.java @@ -0,0 +1,64 @@ +package com.win.module.system.dal.dataobject.dept; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.tenant.core.db.TenantBaseDO; +import com.win.module.system.dal.dataobject.user.AdminUserDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 部门表 + * + * @author ruoyi + * @author 闻荫源码 + */ +@TableName("system_dept") +@KeySequence("system_dept_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +public class DeptDO extends TenantBaseDO { + + /** + * 部门ID + */ + @TableId + private Long id; + /** + * 部门名称 + */ + private String name; + /** + * 父部门ID + * + * 关联 {@link #id} + */ + private Long parentId; + /** + * 显示顺序 + */ + private Integer sort; + /** + * 负责人 + * + * 关联 {@link AdminUserDO#getId()} + */ + private Long leaderUserId; + /** + * 联系电话 + */ + private String phone; + /** + * 邮箱 + */ + private String email; + /** + * 部门状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/dept/PostDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/dept/PostDO.java new file mode 100644 index 0000000..3efe1c5 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/dept/PostDO.java @@ -0,0 +1,50 @@ +package com.win.module.system.dal.dataobject.dept; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 岗位表 + * + * @author ruoyi + */ +@TableName("system_post") +@KeySequence("system_post_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +public class PostDO extends BaseDO { + + /** + * 岗位序号 + */ + @TableId + private Long id; + /** + * 岗位名称 + */ + private String name; + /** + * 岗位编码 + */ + private String code; + /** + * 岗位排序 + */ + private Integer sort; + /** + * 状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 备注 + */ + private String remark; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/dept/UserPostDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/dept/UserPostDO.java new file mode 100644 index 0000000..974c919 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/dept/UserPostDO.java @@ -0,0 +1,40 @@ +package com.win.module.system.dal.dataobject.dept; + +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.module.system.dal.dataobject.user.AdminUserDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 用户和岗位关联 + * + * @author ruoyi + */ +@TableName("system_user_post") +@KeySequence("system_user_post_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +public class UserPostDO extends BaseDO { + + /** + * 自增主键 + */ + @TableId + private Long id; + /** + * 用户 ID + * + * 关联 {@link AdminUserDO#getId()} + */ + private Long userId; + /** + * 角色 ID + * + * 关联 {@link PostDO#getId()} + */ + private Long postId; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/dict/DictDataDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/dict/DictDataDO.java new file mode 100644 index 0000000..0baf05e --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/dict/DictDataDO.java @@ -0,0 +1,65 @@ +package com.win.module.system.dal.dataobject.dict; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 字典数据表 + * + * @author ruoyi + */ +@TableName("system_dict_data") +@KeySequence("system_dict_data_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +public class DictDataDO extends BaseDO { + + /** + * 字典数据编号 + */ + @TableId + private Long id; + /** + * 字典排序 + */ + private Integer sort; + /** + * 字典标签 + */ + private String label; + /** + * 字典值 + */ + private String value; + /** + * 字典类型 + * + * 冗余 {@link DictDataDO#getDictType()} + */ + private String dictType; + /** + * 状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 颜色类型 + * + * 对应到 element-ui 为 default、primary、success、info、warning、danger + */ + private String colorType; + /** + * css 样式 + */ + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private String cssClass; + /** + * 备注 + */ + private String remark; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/dict/DictTypeDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/dict/DictTypeDO.java new file mode 100644 index 0000000..6e343c3 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/dict/DictTypeDO.java @@ -0,0 +1,57 @@ +package com.win.module.system.dal.dataobject.dict; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.time.LocalDateTime; + +/** + * 字典类型表 + * + * @author ruoyi + */ +@TableName("system_dict_type") +@KeySequence("system_dict_type_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DictTypeDO extends BaseDO { + + /** + * 字典主键 + */ + @TableId + private Long id; + /** + * 字典名称 + */ + private String name; + /** + * 字典类型 + */ + private String type; + /** + * 状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 备注 + */ + private String remark; + + /** + * 删除时间 + */ + private LocalDateTime deletedTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/errorcode/ErrorCodeDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/errorcode/ErrorCodeDO.java new file mode 100644 index 0000000..d89b62a --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/errorcode/ErrorCodeDO.java @@ -0,0 +1,52 @@ +package com.win.module.system.dal.dataobject.errorcode; + +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.module.system.enums.errorcode.ErrorCodeTypeEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +/** + * 错误码表 + * + * @author 闻荫源码 + */ +@TableName(value = "system_error_code") +@KeySequence("system_error_code_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ErrorCodeDO extends BaseDO { + + /** + * 错误码编号,自增 + */ + @TableId + private Long id; + /** + * 错误码类型 + * + * 枚举 {@link ErrorCodeTypeEnum} + */ + private Integer type; + /** + * 应用名 + */ + private String applicationName; + /** + * 错误码编码 + */ + private Integer code; + /** + * 错误码错误提示 + */ + private String message; + /** + * 错误码备注 + */ + private String memo; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/logger/LoginLogDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/logger/LoginLogDO.java new file mode 100644 index 0000000..1d60e84 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/logger/LoginLogDO.java @@ -0,0 +1,65 @@ +package com.win.module.system.dal.dataobject.logger; + +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.module.system.enums.logger.LoginLogTypeEnum; +import com.win.module.system.enums.logger.LoginResultEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +/** + * 登录日志表 + * + * 注意,包括登录和登出两种行为 + * + * @author 闻荫源码 + */ +@TableName("system_login_log") +@KeySequence("system_login_log_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class LoginLogDO extends BaseDO { + + /** + * 日志主键 + */ + private Long id; + /** + * 日志类型 + * + * 枚举 {@link LoginLogTypeEnum} + */ + private Integer logType; + /** + * 链路追踪编号 + */ + private String traceId; + /** + * 用户编号 + */ + private Long userId; + /** + * 用户账号 + * + * 冗余,因为账号可以变更 + */ + private String username; + /** + * 登录结果 + * + * 枚举 {@link LoginResultEnum} + */ + private Integer result; + /** + * 用户 IP + */ + private String userIp; + /** + * 浏览器 UA + */ + private String userAgent; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/logger/OperateLogDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/logger/OperateLogDO.java new file mode 100644 index 0000000..4599993 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/logger/OperateLogDO.java @@ -0,0 +1,137 @@ +package com.win.module.system.dal.dataobject.logger; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.framework.operatelog.core.enums.OperateTypeEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; +import java.util.Map; + +/** + * 操作日志表 + * + * @author 闻荫源码 + */ +@TableName(value = "system_operate_log", autoResultMap = true) +@KeySequence("system_operate_log_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +public class OperateLogDO extends BaseDO { + + /** + * {@link #javaMethodArgs} 的最大长度 + */ + public static final Integer JAVA_METHOD_ARGS_MAX_LENGTH = 8000; + + /** + * {@link #resultData} 的最大长度 + */ + public static final Integer RESULT_MAX_LENGTH = 4000; + + /** + * 日志主键 + */ + @TableId + private Long id; + /** + * 链路追踪编号 + * + * 一般来说,通过链路追踪编号,可以将访问日志,错误日志,链路追踪日志,logger 打印日志等,结合在一起,从而进行排错。 + */ + private String traceId; + /** + * 用户编号 + * + * 关联 MemberUserDO 的 id 属性,或者 AdminUserDO 的 id 属性 + */ + private Long userId; + /** + * 操作模块 + */ + private String module; + /** + * 操作名 + */ + private String name; + /** + * 操作分类 + * + * 枚举 {@link OperateTypeEnum} + */ + private Integer type; + /** + * 操作内容,记录整个操作的明细 + * 例如说,修改编号为 1 的用户信息,将性别从男改成女,将姓名从闻荫改成源码。 + */ + private String content; + /** + * 拓展字段,有些复杂的业务,需要记录一些字段 + * 例如说,记录订单编号,则可以添加 key 为 "orderId",value 为订单编号 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private Map exts; + + /** + * 请求方法名 + */ + private String requestMethod; + /** + * 请求地址 + */ + private String requestUrl; + /** + * 用户 IP + */ + private String userIp; + /** + * 浏览器 UA + */ + private String userAgent; + + /** + * Java 方法名 + */ + private String javaMethod; + /** + * Java 方法的参数 + * + * 实际格式为 Map + * 不使用 @TableField(typeHandler = FastjsonTypeHandler.class) 注解的原因是,数据库存储有长度限制,会进行裁剪,会导致 JSON 反序列化失败 + * 其中,key 为参数名,value 为参数值 + */ + private String javaMethodArgs; + /** + * 开始时间 + */ + private LocalDateTime startTime; + /** + * 执行时长,单位:毫秒 + */ + private Integer duration; + /** + * 结果码 + * + * 目前使用的 {@link CommonResult#getCode()} 属性 + */ + private Integer resultCode; + /** + * 结果提示 + * + * 目前使用的 {@link CommonResult#getMsg()} 属性 + */ + private String resultMsg; + /** + * 结果数据 + * + * 如果是对象,则使用 JSON 格式化 + */ + private String resultData; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/mail/MailAccountDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/mail/MailAccountDO.java new file mode 100644 index 0000000..30d6ea2 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/mail/MailAccountDO.java @@ -0,0 +1,53 @@ +package com.win.module.system.dal.dataobject.mail; + +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 邮箱账号 DO + * + * 用途:配置发送邮箱的账号 + * + * @author wangjingyi + * @since 2022-03-21 + */ +@TableName(value = "system_mail_account", autoResultMap = true) +@Data +@EqualsAndHashCode(callSuper = true) +public class MailAccountDO extends BaseDO { + + /** + * 主键 + */ + @TableId + private Long id; + /** + * 邮箱 + */ + private String mail; + + /** + * 用户名 + */ + private String username; + /** + * 密码 + */ + private String password; + /** + * SMTP 服务器域名 + */ + private String host; + /** + * SMTP 服务器端口 + */ + private Integer port; + /** + * 是否开启 SSL + */ + private Boolean sslEnable; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/mail/MailLogDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/mail/MailLogDO.java new file mode 100644 index 0000000..e9f901f --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/mail/MailLogDO.java @@ -0,0 +1,114 @@ +package com.win.module.system.dal.dataobject.mail; + +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.module.system.enums.mail.MailSendStatusEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.*; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Map; + +/** + * 邮箱日志 DO + * 记录每一次邮件的发送 + * + * @author wangjingyi + * @since 2022-03-21 + */ +@TableName(value = "system_mail_log", autoResultMap = true) +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class MailLogDO extends BaseDO implements Serializable { + + /** + * 日志编号,自增 + */ + private Long id; + + /** + * 用户编码 + */ + private Long userId; + /** + * 接收邮箱地址 + */ + private String toMail; + + /** + * 邮箱账号编号 + * + * 关联 {@link MailAccountDO#getId()} + */ + private Long accountId; + /** + * 发送邮箱地址 + * + * 冗余 {@link MailAccountDO#getMail()} + */ + private String fromMail; + + // ========= 模板相关字段 ========= + /** + * 模版编号 + * + * 关联 {@link MailTemplateDO#getId()} + */ + private Long templateId; + /** + * 模版编码 + * + * 冗余 {@link MailTemplateDO#getCode()} + */ + private String templateCode; + /** + * 模版发送人名称 + * + * 冗余 {@link MailTemplateDO#getNickname()} + */ + private String templateNickname; + /** + * 模版标题 + */ + private String templateTitle; + /** + * 模版内容 + * + * 基于 {@link MailTemplateDO#getContent()} 格式化后的内容 + */ + private String templateContent; + /** + * 模版参数 + * + * 基于 {@link MailTemplateDO#getParams()} 输入后的参数 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private Map templateParams; + + // ========= 发送相关字段 ========= + /** + * 发送状态 + * + * 枚举 {@link MailSendStatusEnum} + */ + private Integer sendStatus; + /** + * 发送时间 + */ + private LocalDateTime sendTime; + /** + * 发送返回的消息 ID + */ + private String sendMessageId; + /** + * 发送异常 + */ + private String sendException; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/mail/MailTemplateDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/mail/MailTemplateDO.java new file mode 100644 index 0000000..6da6966 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/mail/MailTemplateDO.java @@ -0,0 +1,71 @@ +package com.win.module.system.dal.dataobject.mail; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +/** + * 邮件模版 DO + * + * @author wangjingyi + * @since 2022-03-21 + */ +@TableName(value = "system_mail_template", autoResultMap = true) +@Data +@EqualsAndHashCode(callSuper = true) +public class MailTemplateDO extends BaseDO { + + /** + * 主键 + */ + private Long id; + /** + * 模版名称 + */ + private String name; + /** + * 模版编号 + */ + private String code; + /** + * 发送的邮箱账号编号 + * + * 关联 {@link MailAccountDO#getId()} + */ + private Long accountId; + + /** + * 发送人名称 + */ + private String nickname; + /** + * 标题 + */ + private String title; + /** + * 内容 + */ + private String content; + /** + * 参数数组(自动根据内容生成) + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List params; + /** + * 状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 备注 + */ + private String remark; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/notice/NoticeDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/notice/NoticeDO.java new file mode 100644 index 0000000..7950a0c --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/notice/NoticeDO.java @@ -0,0 +1,47 @@ +package com.win.module.system.dal.dataobject.notice; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.module.system.enums.notice.NoticeTypeEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 通知公告表 + * + * @author ruoyi + */ +@TableName("system_notice") +@KeySequence("system_notice_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +public class NoticeDO extends BaseDO { + + /** + * 公告ID + */ + private Long id; + /** + * 公告标题 + */ + private String title; + /** + * 公告类型 + * + * 枚举 {@link NoticeTypeEnum} + */ + private Integer type; + /** + * 公告内容 + */ + private String content; + /** + * 公告状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/notify/NotifyMessageDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/notify/NotifyMessageDO.java new file mode 100644 index 0000000..f1be7ed --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/notify/NotifyMessageDO.java @@ -0,0 +1,92 @@ +package com.win.module.system.dal.dataobject.notify; + +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.*; + +import java.time.LocalDateTime; +import java.util.Map; + +/** + * 站内信 DO + * + * @author xrcoder + */ +@TableName(value = "system_notify_message", autoResultMap = true) +@KeySequence("system_notify_message_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class NotifyMessageDO extends BaseDO { + + /** + * 站内信编号,自增 + */ + @TableId + private Long id; + /** + * 用户编号 + * + * 关联 MemberUserDO 的 id 字段、或者 AdminUserDO 的 id 字段 + */ + private Long userId; + + // ========= 模板相关字段 ========= + + /** + * 模版编号 + * + * 关联 {@link NotifyTemplateDO#getId()} + */ + private Long templateId; + /** + * 模版编码 + * + * 关联 {@link NotifyTemplateDO#getCode()} + */ + private String templateCode; + /** + * 模版类型 + * + * 冗余 {@link NotifyTemplateDO#getType()} + */ + private Integer templateType; + /** + * 模版发送人名称 + * + * 冗余 {@link NotifyTemplateDO#getNickname()} + */ + private String templateNickname; + /** + * 模版内容 + * + * 基于 {@link NotifyTemplateDO#getContent()} 格式化后的内容 + */ + private String templateContent; + /** + * 模版参数 + * + * 基于 {@link NotifyTemplateDO#getParams()} 输入后的参数 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private Map templateParams; + + // ========= 读取相关字段 ========= + + /** + * 是否已读 + */ + private Boolean readStatus; + /** + * 阅读时间 + */ + private LocalDateTime readTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/notify/NotifyTemplateDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/notify/NotifyTemplateDO.java new file mode 100644 index 0000000..5fa6909 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/notify/NotifyTemplateDO.java @@ -0,0 +1,72 @@ +package com.win.module.system.dal.dataobject.notify; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.*; + +import java.util.List; + +/** + * 站内信模版 DO + * + * @author xrcoder + */ +@TableName(value = "system_notify_template", autoResultMap = true) +@KeySequence("system_notify_template_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class NotifyTemplateDO extends BaseDO { + + /** + * ID + */ + @TableId + private Long id; + /** + * 模版名称 + */ + private String name; + /** + * 模版编码 + */ + private String code; + /** + * 模版类型 + * + * 对应 system_notify_template_type 字典 + */ + private Integer type; + /** + * 发送人名称 + */ + private String nickname; + /** + * 模版内容 + */ + private String content; + /** + * 参数数组 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List params; + /** + * 状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 备注 + */ + private String remark; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/oauth2/OAuth2AccessTokenDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/oauth2/OAuth2AccessTokenDO.java new file mode 100644 index 0000000..f275911 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/oauth2/OAuth2AccessTokenDO.java @@ -0,0 +1,62 @@ +package com.win.module.system.dal.dataobject.oauth2; + +import com.win.framework.tenant.core.db.TenantBaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * OAuth2 访问令牌 DO + * + * 如下字段,暂时未使用,暂时不支持: + * user_name、authentication(用户信息) + * + * @author 闻荫源码 + */ +@TableName(value = "system_oauth2_access_token", autoResultMap = true) +@KeySequence("system_oauth2_access_token_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +public class OAuth2AccessTokenDO extends TenantBaseDO { + + /** + * 编号,数据库递增 + */ + @TableId + private Long id; + /** + * 访问令牌 + */ + private String accessToken; + /** + * 刷新令牌 + */ + private String refreshToken; + /** + * 用户编号 + */ + private Long userId; + /** + * 客户端编号 + * + * 关联 {@link OAuth2ClientDO#getId()} + */ + private String clientId; + /** + * 授权范围 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List scopes; + /** + * 过期时间 + */ + private LocalDateTime expiresTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/oauth2/OAuth2ApproveDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/oauth2/OAuth2ApproveDO.java new file mode 100644 index 0000000..e8a47bd --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/oauth2/OAuth2ApproveDO.java @@ -0,0 +1,56 @@ +package com.win.module.system.dal.dataobject.oauth2; + +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; + +/** + * OAuth2 批准 DO + * + * 用户在 sso.vue 界面时,记录接受的 scope 列表 + * + * @author 闻荫源码 + */ +@TableName(value = "system_oauth2_approve", autoResultMap = true) +@KeySequence("system_oauth2_approve_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +public class OAuth2ApproveDO extends BaseDO { + + /** + * 编号,数据库自增 + */ + @TableId + private Long id; + /** + * 用户编号 + */ + private Long userId; + /** + * 客户端编号 + * + * 关联 {@link OAuth2ClientDO#getId()} + */ + private String clientId; + /** + * 授权范围 + */ + private String scope; + /** + * 是否接受 + * + * true - 接受 + * false - 拒绝 + */ + private Boolean approved; + /** + * 过期时间 + */ + private LocalDateTime expiresTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/oauth2/OAuth2ClientDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/oauth2/OAuth2ClientDO.java new file mode 100644 index 0000000..edb563a --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/oauth2/OAuth2ClientDO.java @@ -0,0 +1,107 @@ +package com.win.module.system.dal.dataobject.oauth2; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.module.system.enums.oauth2.OAuth2GrantTypeEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +/** + * OAuth2 客户端 DO + * + * @author 闻荫源码 + */ +@TableName(value = "system_oauth2_client", autoResultMap = true) +@KeySequence("system_oauth2_client_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +public class OAuth2ClientDO extends BaseDO { + + /** + * 编号,数据库自增 + * + * 由于 SQL Server 在存储 String 主键有点问题,所以暂时使用 Long 类型 + */ + @TableId + private Long id; + /** + * 客户端编号 + */ + private String clientId; + /** + * 客户端密钥 + */ + private String secret; + /** + * 应用名 + */ + private String name; + /** + * 应用图标 + */ + private String logo; + /** + * 应用描述 + */ + private String description; + /** + * 状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 访问令牌的有效期 + */ + private Integer accessTokenValiditySeconds; + /** + * 刷新令牌的有效期 + */ + private Integer refreshTokenValiditySeconds; + /** + * 可重定向的 URI 地址 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List redirectUris; + /** + * 授权类型(模式) + * + * 枚举 {@link OAuth2GrantTypeEnum} + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List authorizedGrantTypes; + /** + * 授权范围 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List scopes; + /** + * 自动授权的 Scope + * + * code 授权时,如果 scope 在这个范围内,则自动通过 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List autoApproveScopes; + /** + * 权限 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List authorities; + /** + * 资源 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List resourceIds; + /** + * 附加信息,JSON 格式 + */ + private String additionalInformation; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/oauth2/OAuth2CodeDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/oauth2/OAuth2CodeDO.java new file mode 100644 index 0000000..3ec4750 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/oauth2/OAuth2CodeDO.java @@ -0,0 +1,61 @@ +package com.win.module.system.dal.dataobject.oauth2; + +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * OAuth2 授权码 DO + * + * @author 闻荫源码 + */ +@TableName(value = "system_oauth2_code", autoResultMap = true) +@KeySequence("system_oauth2_code_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +public class OAuth2CodeDO extends BaseDO { + + /** + * 编号,数据库递增 + */ + private Long id; + /** + * 授权码 + */ + private String code; + /** + * 用户编号 + */ + private Long userId; + /** + * 客户端编号 + * + * 关联 {@link OAuth2ClientDO#getClientId()} + */ + private String clientId; + /** + * 授权范围 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List scopes; + /** + * 重定向地址 + */ + private String redirectUri; + /** + * 状态 + */ + private String state; + /** + * 过期时间 + */ + private LocalDateTime expiresTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/oauth2/OAuth2RefreshTokenDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/oauth2/OAuth2RefreshTokenDO.java new file mode 100644 index 0000000..099adfd --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/oauth2/OAuth2RefreshTokenDO.java @@ -0,0 +1,56 @@ +package com.win.module.system.dal.dataobject.oauth2; + +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * OAuth2 刷新令牌 + * + * @author 闻荫源码 + */ +@TableName(value = "system_oauth2_refresh_token", autoResultMap = true) +// 由于 Oracle 的 SEQ 的名字长度有限制,所以就先用 system_oauth2_access_token_seq 吧,反正也没啥问题 +@KeySequence("system_oauth2_access_token_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +public class OAuth2RefreshTokenDO extends BaseDO { + + /** + * 编号,数据库字典 + */ + private Long id; + /** + * 刷新令牌 + */ + private String refreshToken; + /** + * 用户编号 + */ + private Long userId; + /** + * 客户端编号 + * + * 关联 {@link OAuth2ClientDO#getId()} + */ + private String clientId; + /** + * 授权范围 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List scopes; + /** + * 过期时间 + */ + private LocalDateTime expiresTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/permission/MenuDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/permission/MenuDO.java new file mode 100644 index 0000000..943722d --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/permission/MenuDO.java @@ -0,0 +1,107 @@ +package com.win.module.system.dal.dataobject.permission; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.module.system.enums.permission.MenuTypeEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 菜单 DO + * + * @author ruoyi + */ +@TableName("system_menu") +@KeySequence("system_menu_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +public class MenuDO extends BaseDO { + + /** + * 菜单编号 - 根节点 + */ + public static final Long ID_ROOT = 0L; + + /** + * 菜单编号 + */ + @TableId + private Long id; + /** + * 菜单名称 + */ + private String name; + /** + * 权限标识 + * + * 一般格式为:${系统}:${模块}:${操作} + * 例如说:system:admin:add,即 system 服务的添加管理员。 + * + * 当我们把该 MenuDO 赋予给角色后,意味着该角色有该资源: + * - 对于后端,配合 @PreAuthorize 注解,配置 API 接口需要该权限,从而对 API 接口进行权限控制。 + * - 对于前端,配合前端标签,配置按钮是否展示,避免用户没有该权限时,结果可以看到该操作。 + */ + private String permission; + /** + * 菜单类型 + * + * 枚举 {@link MenuTypeEnum} + */ + private Integer type; + /** + * 显示顺序 + */ + private Integer sort; + /** + * 父菜单ID + */ + private Long parentId; + /** + * 路由地址 + * + * 如果 path 为 http(s) 时,则它是外链 + */ + private String path; + /** + * 菜单图标 + */ + private String icon; + /** + * 组件路径 + */ + private String component; + /** + * 组件名 + */ + private String componentName; + /** + * 状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 是否可见 + * + * 只有菜单、目录使用 + * 当设置为 true 时,该菜单不会展示在侧边栏,但是路由还是存在。例如说,一些独立的编辑页面 /edit/1024 等等 + */ + private Boolean visible; + /** + * 是否缓存 + * + * 只有菜单、目录使用,否使用 Vue 路由的 keep-alive 特性 + * 注意:如果开启缓存,则必须填写 {@link #componentName} 属性,否则无法缓存 + */ + private Boolean keepAlive; + /** + * 是否总是显示 + * + * 如果为 false 时,当该菜单只有一个子菜单时,不展示自己,直接展示子菜单 + */ + private Boolean alwaysShow; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/permission/RoleDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/permission/RoleDO.java new file mode 100644 index 0000000..978658d --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/permission/RoleDO.java @@ -0,0 +1,78 @@ +package com.win.module.system.dal.dataobject.permission; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.mybatis.core.type.JsonLongSetTypeHandler; +import com.win.module.system.enums.permission.DataScopeEnum; +import com.win.framework.tenant.core.db.TenantBaseDO; +import com.win.module.system.enums.permission.RoleTypeEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Set; + +/** + * 角色 DO + * + * @author ruoyi + */ +@TableName(value = "system_role", autoResultMap = true) +@KeySequence("system_role_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +public class RoleDO extends TenantBaseDO { + + /** + * 角色ID + */ + @TableId + private Long id; + /** + * 角色名称 + */ + private String name; + /** + * 角色标识 + * + * 枚举 + */ + private String code; + /** + * 角色排序 + */ + private Integer sort; + /** + * 角色状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 角色类型 + * + * 枚举 {@link RoleTypeEnum} + */ + private Integer type; + /** + * 备注 + */ + private String remark; + + /** + * 数据范围 + * + * 枚举 {@link DataScopeEnum} + */ + private Integer dataScope; + /** + * 数据范围(指定部门数组) + * + * 适用于 {@link #dataScope} 的值为 {@link DataScopeEnum#DEPT_CUSTOM} 时 + */ + @TableField(typeHandler = JsonLongSetTypeHandler.class) + private Set dataScopeDeptIds; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/permission/RoleMenuDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/permission/RoleMenuDO.java new file mode 100644 index 0000000..068d87c --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/permission/RoleMenuDO.java @@ -0,0 +1,35 @@ +package com.win.module.system.dal.dataobject.permission; + +import com.win.framework.tenant.core.db.TenantBaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 角色和菜单关联 + * + * @author ruoyi + */ +@TableName("system_role_menu") +@KeySequence("system_role_menu_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +public class RoleMenuDO extends TenantBaseDO { + + /** + * 自增主键 + */ + @TableId + private Long id; + /** + * 角色ID + */ + private Long roleId; + /** + * 菜单ID + */ + private Long menuId; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/permission/UserRoleDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/permission/UserRoleDO.java new file mode 100644 index 0000000..ea9a950 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/permission/UserRoleDO.java @@ -0,0 +1,35 @@ +package com.win.module.system.dal.dataobject.permission; + +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 用户和角色关联 + * + * @author ruoyi + */ +@TableName("system_user_role") +@KeySequence("system_user_role_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +public class UserRoleDO extends BaseDO { + + /** + * 自增主键 + */ + @TableId + private Long id; + /** + * 用户 ID + */ + private Long userId; + /** + * 角色 ID + */ + private Long roleId; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/sensitiveword/SensitiveWordDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/sensitiveword/SensitiveWordDO.java new file mode 100644 index 0000000..92bae08 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/sensitiveword/SensitiveWordDO.java @@ -0,0 +1,58 @@ +package com.win.module.system.dal.dataobject.sensitiveword; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.framework.mybatis.core.type.StringListTypeHandler; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.util.List; + +/** + * 敏感词 DO + * + * @author 永不言败 + */ +@TableName(value = "system_sensitive_word", autoResultMap = true) +@KeySequence("system_sensitive_word_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SensitiveWordDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 敏感词 + */ + private String name; + /** + * 描述 + */ + private String description; + /** + * 标签数组 + * + * 用于实现不同的业务场景下,需要使用不同标签的敏感词。 + * 例如说,tag 有短信、论坛两种,敏感词 "推广" 在短信下是敏感词,在论坛下不是敏感词。 + * 此时,我们会存储一条敏感词记录,它的 name 为"推广",tag 为短信。 + */ + @TableField(typeHandler = StringListTypeHandler.class) + private List tags; + /** + * 状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/serialnumber/SerialNumberDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/serialnumber/SerialNumberDO.java new file mode 100644 index 0000000..20caee5 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/serialnumber/SerialNumberDO.java @@ -0,0 +1,60 @@ +package com.win.module.system.dal.dataobject.serialnumber; + +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; + +/** + * 流水号规则 DO + * + * @author 超级管理员 + */ +@TableName("system_serial_number") +@KeySequence("system_serial_number_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SerialNumberDO extends BaseDO { + + /** + * 主键 + */ + @TableId + private Long id; + /** + * 规则编码 + */ + private String ruleCode; + /** + * 规则名称 + */ + private String ruleName; + /** + * 编码前缀 + */ + private String prefix; + /** + * 单据格式 + */ + private String pattern; + /** + * 单据流水长度 + */ + private Byte length; + /** + * 单据分隔符 + */ + @TableField(value = "`separator`") + private String separator; + /** + * 备注 + */ + private String remark; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/sms/SmsChannelDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/sms/SmsChannelDO.java new file mode 100644 index 0000000..b037e66 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/sms/SmsChannelDO.java @@ -0,0 +1,62 @@ +package com.win.module.system.dal.dataobject.sms; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.framework.sms.core.enums.SmsChannelEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +/** + * 短信渠道 DO + * + * @author zzf + * @since 2021-01-25 + */ +@TableName(value = "system_sms_channel", autoResultMap = true) +@KeySequence("system_sms_channel_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SmsChannelDO extends BaseDO { + + /** + * 渠道编号 + */ + private Long id; + /** + * 短信签名 + */ + private String signature; + /** + * 渠道编码 + * + * 枚举 {@link SmsChannelEnum} + */ + private String code; + /** + * 启用状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 备注 + */ + private String remark; + /** + * 短信 API 的账号 + */ + private String apiKey; + /** + * 短信 API 的密钥 + */ + private String apiSecret; + /** + * 短信发送回调 URL + */ + private String callbackUrl; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/sms/SmsCodeDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/sms/SmsCodeDO.java new file mode 100644 index 0000000..27ab148 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/sms/SmsCodeDO.java @@ -0,0 +1,65 @@ +package com.win.module.system.dal.dataobject.sms; + +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.time.LocalDateTime; + +/** + * 手机验证码 DO + * + * idx_mobile 索引:基于 {@link #mobile} 字段 + * + * @author 闻荫源码 + */ +@TableName("system_sms_code") +@KeySequence("system_sms_code_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SmsCodeDO extends BaseDO { + + /** + * 编号 + */ + private Long id; + /** + * 手机号 + */ + private String mobile; + /** + * 验证码 + */ + private String code; + /** + * 发送场景 + * + * 枚举 {@link SmsCodeDO} + */ + private Integer scene; + /** + * 创建 IP + */ + private String createIp; + /** + * 今日发送的第几条 + */ + private Integer todayIndex; + /** + * 是否使用 + */ + private Boolean used; + /** + * 使用时间 + */ + private LocalDateTime usedTime; + /** + * 使用 IP + */ + private String usedIp; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/sms/SmsLogDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/sms/SmsLogDO.java new file mode 100644 index 0000000..2472fff --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/sms/SmsLogDO.java @@ -0,0 +1,168 @@ +package com.win.module.system.dal.dataobject.sms; + +import com.win.module.system.enums.sms.SmsReceiveStatusEnum; +import com.win.module.system.enums.sms.SmsSendStatusEnum; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.framework.sms.core.enums.SmsFrameworkErrorCodeConstants; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.*; + +import java.time.LocalDateTime; +import java.util.Map; + +/** + * 短信日志 DO + * + * @author zzf + * @since 2021-01-25 + */ +@TableName(value = "system_sms_log", autoResultMap = true) +@KeySequence("system_sms_log_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class SmsLogDO extends BaseDO { + + /** + * 自增编号 + */ + private Long id; + + // ========= 渠道相关字段 ========= + + /** + * 短信渠道编号 + * + * 关联 {@link SmsChannelDO#getId()} + */ + private Long channelId; + /** + * 短信渠道编码 + * + * 冗余 {@link SmsChannelDO#getCode()} + */ + private String channelCode; + + // ========= 模板相关字段 ========= + + /** + * 模板编号 + * + * 关联 {@link SmsTemplateDO#getId()} + */ + private Long templateId; + /** + * 模板编码 + * + * 冗余 {@link SmsTemplateDO#getCode()} + */ + private String templateCode; + /** + * 短信类型 + * + * 冗余 {@link SmsTemplateDO#getType()} + */ + private Integer templateType; + /** + * 基于 {@link SmsTemplateDO#getContent()} 格式化后的内容 + */ + private String templateContent; + /** + * 基于 {@link SmsTemplateDO#getParams()} 输入后的参数 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private Map templateParams; + /** + * 短信 API 的模板编号 + * + * 冗余 {@link SmsTemplateDO#getApiTemplateId()} + */ + private String apiTemplateId; + + // ========= 手机相关字段 ========= + + /** + * 手机号 + */ + private String mobile; + /** + * 用户编号 + */ + private Long userId; + + // ========= 发送相关字段 ========= + + /** + * 发送状态 + * + * 枚举 {@link SmsSendStatusEnum} + */ + private Integer sendStatus; + /** + * 发送时间 + */ + private LocalDateTime sendTime; + /** + * 发送结果的编码 + * + * 枚举 {@link SmsFrameworkErrorCodeConstants} + */ + private Integer sendCode; + /** + * 发送结果的提示 + * + * 一般情况下,使用 {@link SmsFrameworkErrorCodeConstants} + * 异常情况下,通过格式化 Exception 的提示存储 + */ + private String sendMsg; + /** + * 短信 API 发送结果的编码 + * + * 由于第三方的错误码可能是字符串,所以使用 String 类型 + */ + private String apiSendCode; + /** + * 短信 API 发送失败的提示 + */ + private String apiSendMsg; + /** + * 短信 API 发送返回的唯一请求 ID + * + * 用于和短信 API 进行定位于排错 + */ + private String apiRequestId; + /** + * 短信 API 发送返回的序号 + * + * 用于和短信 API 平台的发送记录关联 + */ + private String apiSerialNo; + + // ========= 接收相关字段 ========= + + /** + * 接收状态 + * + * 枚举 {@link SmsReceiveStatusEnum} + */ + private Integer receiveStatus; + /** + * 接收时间 + */ + private LocalDateTime receiveTime; + /** + * 短信 API 接收结果的编码 + */ + private String apiReceiveCode; + /** + * 短信 API 接收结果的提示 + */ + private String apiReceiveMsg; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/sms/SmsTemplateDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/sms/SmsTemplateDO.java new file mode 100644 index 0000000..8cac6da --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/sms/SmsTemplateDO.java @@ -0,0 +1,91 @@ +package com.win.module.system.dal.dataobject.sms; + +import com.win.module.system.enums.sms.SmsTemplateTypeEnum; +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.List; + +/** + * 短信模板 DO + * + * @author zzf + * @since 2021-01-25 + */ +@TableName(value = "system_sms_template", autoResultMap = true) +@KeySequence("system_sms_template_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SmsTemplateDO extends BaseDO { + + /** + * 自增编号 + */ + private Long id; + + // ========= 模板相关字段 ========= + + /** + * 短信类型 + * + * 枚举 {@link SmsTemplateTypeEnum} + */ + private Integer type; + /** + * 启用状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 模板编码,保证唯一 + */ + private String code; + /** + * 模板名称 + */ + private String name; + /** + * 模板内容 + * + * 内容的参数,使用 {} 包括,例如说 {name} + */ + private String content; + /** + * 参数数组(自动根据内容生成) + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List params; + /** + * 备注 + */ + private String remark; + /** + * 短信 API 的模板编号 + */ + private String apiTemplateId; + + // ========= 渠道相关字段 ========= + + /** + * 短信渠道编号 + * + * 关联 {@link SmsChannelDO#getId()} + */ + private Long channelId; + /** + * 短信渠道编码 + * + * 冗余 {@link SmsChannelDO#getCode()} + */ + private String channelCode; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/tenant/TenantDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/tenant/TenantDO.java new file mode 100644 index 0000000..f7efab0 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/tenant/TenantDO.java @@ -0,0 +1,82 @@ +package com.win.module.system.dal.dataobject.tenant; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.module.system.dal.dataobject.user.AdminUserDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.time.LocalDateTime; + +/** + * 租户 DO + * + * @author 闻荫源码 + */ +@TableName(value = "system_tenant", autoResultMap = true) +@KeySequence("system_tenant_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class TenantDO extends BaseDO { + + /** + * 套餐编号 - 系统 + */ + public static final Long PACKAGE_ID_SYSTEM = 0L; + + /** + * 租户编号,自增 + */ + private Long id; + /** + * 租户名,唯一 + */ + private String name; + /** + * 联系人的用户编号 + * + * 关联 {@link AdminUserDO#getId()} + */ + private Long contactUserId; + /** + * 联系人 + */ + private String contactName; + /** + * 联系手机 + */ + private String contactMobile; + /** + * 租户状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 绑定域名 + * + * TODO 芋艿:目前是预留字段,未来会支持根据域名,自动查询到对应的租户。等等 + */ + private String domain; + /** + * 租户套餐编号 + * + * 关联 {@link TenantPackageDO#getId()} + * 特殊逻辑:系统内置租户,不使用套餐,暂时使用 {@link #PACKAGE_ID_SYSTEM} 标识 + */ + private Long packageId; + /** + * 过期时间 + */ + private LocalDateTime expireTime; + /** + * 账号数量 + */ + private Integer accountCount; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/tenant/TenantPackageDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/tenant/TenantPackageDO.java new file mode 100644 index 0000000..fad362f --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/tenant/TenantPackageDO.java @@ -0,0 +1,52 @@ +package com.win.module.system.dal.dataobject.tenant; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.framework.mybatis.core.type.JsonLongSetTypeHandler; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.util.Set; + +/** + * 租户套餐 DO + * + * @author 闻荫源码 + */ +@TableName(value = "system_tenant_package", autoResultMap = true) +@KeySequence("system_tenant_package_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class TenantPackageDO extends BaseDO { + + /** + * 套餐编号,自增 + */ + private Long id; + /** + * 套餐名,唯一 + */ + private String name; + /** + * 租户套餐状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 备注 + */ + private String remark; + /** + * 关联的菜单编号 + */ + @TableField(typeHandler = JsonLongSetTypeHandler.class) + private Set menuIds; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/user/AdminUserDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/user/AdminUserDO.java new file mode 100644 index 0000000..e114b4e --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/user/AdminUserDO.java @@ -0,0 +1,96 @@ +package com.win.module.system.dal.dataobject.user; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.mybatis.core.type.JsonLongSetTypeHandler; +import com.win.framework.tenant.core.db.TenantBaseDO; +import com.win.module.system.enums.common.SexEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; + +import java.time.LocalDateTime; +import java.util.Set; + +/** + * 管理后台的用户 DO + * + * @author 闻荫源码 + */ +@TableName(value = "system_users", autoResultMap = true) // 由于 SQL Server 的 system_user 是关键字,所以使用 system_users +@KeySequence("system_user_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class AdminUserDO extends TenantBaseDO { + + /** + * 用户ID + */ + @TableId + private Long id; + /** + * 用户账号 + */ + private String username; + /** + * 加密后的密码 + * + * 因为目前使用 {@link BCryptPasswordEncoder} 加密器,所以无需自己处理 salt 盐 + */ + private String password; + /** + * 用户昵称 + */ + private String nickname; + /** + * 备注 + */ + private String remark; + /** + * 部门 ID + */ + private Long deptId; + /** + * 岗位编号数组 + */ + @TableField(typeHandler = JsonLongSetTypeHandler.class) + private Set postIds; + /** + * 用户邮箱 + */ + private String email; + /** + * 手机号码 + */ + private String mobile; + /** + * 用户性别 + * + * 枚举类 {@link SexEnum} + */ + private Integer sex; + /** + * 用户头像 + */ + private String avatar; + /** + * 帐号状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 最后登录IP + */ + private String loginIp; + /** + * 最后登录时间 + */ + private LocalDateTime loginDate; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/dept/DeptMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/dept/DeptMapper.java new file mode 100644 index 0000000..92dd0fc --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/dept/DeptMapper.java @@ -0,0 +1,33 @@ +package com.win.module.system.dal.mysql.dept; + +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.controller.dept.vo.dept.DeptListReqVO; +import com.win.module.system.dal.dataobject.dept.DeptDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Collection; +import java.util.List; + +@Mapper +public interface DeptMapper extends BaseMapperX { + + default List selectList(DeptListReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(DeptDO::getName, reqVO.getName()) + .eqIfPresent(DeptDO::getStatus, reqVO.getStatus())); + } + + default DeptDO selectByParentIdAndName(Long parentId, String name) { + return selectOne(DeptDO::getParentId, parentId, DeptDO::getName, name); + } + + default Long selectCountByParentId(Long parentId) { + return selectCount(DeptDO::getParentId, parentId); + } + + default List selectListByParentId(Collection parentIds) { + return selectList(DeptDO::getParentId, parentIds); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/dept/PostMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/dept/PostMapper.java new file mode 100644 index 0000000..fbecc81 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/dept/PostMapper.java @@ -0,0 +1,46 @@ +package com.win.module.system.dal.mysql.dept; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.controller.dept.vo.post.PostExportReqVO; +import com.win.module.system.controller.dept.vo.post.PostPageReqVO; +import com.win.module.system.dal.dataobject.dept.PostDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Collection; +import java.util.List; + +@Mapper +public interface PostMapper extends BaseMapperX { + + default List selectList(Collection ids, Collection statuses) { + return selectList(new LambdaQueryWrapperX() + .inIfPresent(PostDO::getId, ids) + .inIfPresent(PostDO::getStatus, statuses)); + } + + default PageResult selectPage(PostPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(PostDO::getCode, reqVO.getCode()) + .likeIfPresent(PostDO::getName, reqVO.getName()) + .eqIfPresent(PostDO::getStatus, reqVO.getStatus()) + .orderByDesc(PostDO::getId)); + } + + default List selectList(PostExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(PostDO::getCode, reqVO.getCode()) + .likeIfPresent(PostDO::getName, reqVO.getName()) + .eqIfPresent(PostDO::getStatus, reqVO.getStatus())); + } + + default PostDO selectByName(String name) { + return selectOne(PostDO::getName, name); + } + + default PostDO selectByCode(String code) { + return selectOne(PostDO::getCode, code); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/dept/UserPostMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/dept/UserPostMapper.java new file mode 100644 index 0000000..bf64f77 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/dept/UserPostMapper.java @@ -0,0 +1,32 @@ +package com.win.module.system.dal.mysql.dept; + +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.dal.dataobject.dept.UserPostDO; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Collection; +import java.util.List; + +@Mapper +public interface UserPostMapper extends BaseMapperX { + + default List selectListByUserId(Long userId) { + return selectList(UserPostDO::getUserId, userId); + } + + default void deleteByUserIdAndPostId(Long userId, Collection postIds) { + delete(new LambdaQueryWrapperX() + .eq(UserPostDO::getUserId, userId) + .in(UserPostDO::getPostId, postIds)); + } + + default List selectListByPostIds(Collection postIds) { + return selectList(UserPostDO::getPostId, postIds); + } + + default void deleteByUserId(Long userId) { + delete(Wrappers.lambdaUpdate(UserPostDO.class).eq(UserPostDO::getUserId, userId)); + } +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/dict/DictDataMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/dict/DictDataMapper.java new file mode 100644 index 0000000..657720b --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/dict/DictDataMapper.java @@ -0,0 +1,51 @@ +package com.win.module.system.dal.mysql.dict; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.controller.dict.vo.data.DictDataExportReqVO; +import com.win.module.system.controller.dict.vo.data.DictDataPageReqVO; +import com.win.module.system.dal.dataobject.dict.DictDataDO; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + +@Mapper +public interface DictDataMapper extends BaseMapperX { + + default DictDataDO selectByDictTypeAndValue(String dictType, String value) { + return selectOne(DictDataDO::getDictType, dictType, DictDataDO::getValue, value); + } + + default DictDataDO selectByDictTypeAndLabel(String dictType, String label) { + return selectOne(DictDataDO::getDictType, dictType, DictDataDO::getLabel, label); + } + + default List selectByDictTypeAndValues(String dictType, Collection values) { + return selectList(new LambdaQueryWrapper().eq(DictDataDO::getDictType, dictType) + .in(DictDataDO::getValue, values)); + } + + default long selectCountByDictType(String dictType) { + return selectCount(DictDataDO::getDictType, dictType); + } + + default PageResult selectPage(DictDataPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(DictDataDO::getLabel, reqVO.getLabel()) + .eqIfPresent(DictDataDO::getDictType, reqVO.getDictType()) + .eqIfPresent(DictDataDO::getStatus, reqVO.getStatus()) + .orderByDesc(Arrays.asList(DictDataDO::getDictType, DictDataDO::getSort))); + } + + default List selectList(DictDataExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(DictDataDO::getLabel, reqVO.getLabel()) + .eqIfPresent(DictDataDO::getDictType, reqVO.getDictType()) + .eqIfPresent(DictDataDO::getStatus, reqVO.getStatus())); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/dict/DictTypeMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/dict/DictTypeMapper.java new file mode 100644 index 0000000..c160611 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/dict/DictTypeMapper.java @@ -0,0 +1,48 @@ +package com.win.module.system.dal.mysql.dict; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.controller.dict.vo.type.DictTypeExportReqVO; +import com.win.module.system.controller.dict.vo.type.DictTypePageReqVO; +import com.win.module.system.dal.dataobject.dict.DictTypeDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Update; + +import java.time.LocalDateTime; +import java.util.List; + +@Mapper +public interface DictTypeMapper extends BaseMapperX { + + default PageResult selectPage(DictTypePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(DictTypeDO::getName, reqVO.getName()) + .likeIfPresent(DictTypeDO::getType, reqVO.getType()) + .eqIfPresent(DictTypeDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(DictTypeDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(DictTypeDO::getId)); + } + + default List selectList(DictTypeExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(DictTypeDO::getName, reqVO.getName()) + .likeIfPresent(DictTypeDO::getType, reqVO.getType()) + .eqIfPresent(DictTypeDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(DictTypeDO::getCreateTime, reqVO.getCreateTime())); + } + + default DictTypeDO selectByType(String type) { + return selectOne(DictTypeDO::getType, type); + } + + default DictTypeDO selectByName(String name) { + return selectOne(DictTypeDO::getName, name); + } + + int deleteById(@Param("id") Long id, @Param("deletedTime") LocalDateTime deletedTime); + + @Update("UPDATE system_dict_type SET deleted = 1, deleted_time = #{deletedTime} WHERE id = #{id}") + void updateToDelete(@Param("id") Long id, @Param("deletedTime") LocalDateTime deletedTime); +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/errorcode/ErrorCodeMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/errorcode/ErrorCodeMapper.java new file mode 100644 index 0000000..99884f2 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/errorcode/ErrorCodeMapper.java @@ -0,0 +1,51 @@ +package com.win.module.system.dal.mysql.errorcode; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.controller.errorcode.vo.ErrorCodeExportReqVO; +import com.win.module.system.controller.errorcode.vo.ErrorCodePageReqVO; +import com.win.module.system.dal.dataobject.errorcode.ErrorCodeDO; +import org.apache.ibatis.annotations.Mapper; + +import java.time.LocalDateTime; +import java.util.Collection; +import java.util.List; + +@Mapper +public interface ErrorCodeMapper extends BaseMapperX { + + default PageResult selectPage(ErrorCodePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(ErrorCodeDO::getType, reqVO.getType()) + .likeIfPresent(ErrorCodeDO::getApplicationName, reqVO.getApplicationName()) + .eqIfPresent(ErrorCodeDO::getCode, reqVO.getCode()) + .likeIfPresent(ErrorCodeDO::getMessage, reqVO.getMessage()) + .betweenIfPresent(ErrorCodeDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(ErrorCodeDO::getCode)); + } + + default List selectList(ErrorCodeExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(ErrorCodeDO::getType, reqVO.getType()) + .likeIfPresent(ErrorCodeDO::getApplicationName, reqVO.getApplicationName()) + .eqIfPresent(ErrorCodeDO::getCode, reqVO.getCode()) + .likeIfPresent(ErrorCodeDO::getMessage, reqVO.getMessage()) + .betweenIfPresent(ErrorCodeDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(ErrorCodeDO::getCode)); + } + + default List selectListByCodes(Collection codes) { + return selectList(ErrorCodeDO::getCode, codes); + } + + default ErrorCodeDO selectByCode(Integer code) { + return selectOne(ErrorCodeDO::getCode, code); + } + + default List selectListByApplicationNameAndUpdateTimeGt(String applicationName, LocalDateTime minUpdateTime) { + return selectList(new LambdaQueryWrapperX().eq(ErrorCodeDO::getApplicationName, applicationName) + .gtIfPresent(ErrorCodeDO::getUpdateTime, minUpdateTime)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/logger/LoginLogMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/logger/LoginLogMapper.java new file mode 100644 index 0000000..105f055 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/logger/LoginLogMapper.java @@ -0,0 +1,45 @@ +package com.win.module.system.dal.mysql.logger; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.controller.logger.vo.loginlog.LoginLogExportReqVO; +import com.win.module.system.controller.logger.vo.loginlog.LoginLogPageReqVO; +import com.win.module.system.dal.dataobject.logger.LoginLogDO; +import com.win.module.system.enums.logger.LoginResultEnum; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface LoginLogMapper extends BaseMapperX { + + default PageResult selectPage(LoginLogPageReqVO reqVO) { + LambdaQueryWrapperX query = new LambdaQueryWrapperX() + .likeIfPresent(LoginLogDO::getUserIp, reqVO.getUserIp()) + .likeIfPresent(LoginLogDO::getUsername, reqVO.getUsername()) + .betweenIfPresent(LoginLogDO::getCreateTime, reqVO.getCreateTime()); + if (Boolean.TRUE.equals(reqVO.getStatus())) { + query.eq(LoginLogDO::getResult, LoginResultEnum.SUCCESS.getResult()); + } else if (Boolean.FALSE.equals(reqVO.getStatus())) { + query.gt(LoginLogDO::getResult, LoginResultEnum.SUCCESS.getResult()); + } + query.orderByDesc(LoginLogDO::getId); // 降序 + return selectPage(reqVO, query); + } + + default List selectList(LoginLogExportReqVO reqVO) { + LambdaQueryWrapperX query = new LambdaQueryWrapperX() + .likeIfPresent(LoginLogDO::getUserIp, reqVO.getUserIp()) + .likeIfPresent(LoginLogDO::getUsername, reqVO.getUsername()) + .betweenIfPresent(LoginLogDO::getCreateTime, reqVO.getCreateTime()); + if (Boolean.TRUE.equals(reqVO.getStatus())) { + query.eq(LoginLogDO::getResult, LoginResultEnum.SUCCESS.getResult()); + } else if (Boolean.FALSE.equals(reqVO.getStatus())) { + query.gt(LoginLogDO::getResult, LoginResultEnum.SUCCESS.getResult()); + } + query.orderByDesc(LoginLogDO::getId); // 降序 + return selectList(query); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/logger/OperateLogMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/logger/OperateLogMapper.java new file mode 100644 index 0000000..fad8189 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/logger/OperateLogMapper.java @@ -0,0 +1,48 @@ +package com.win.module.system.dal.mysql.logger; + +import com.win.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.controller.logger.vo.operatelog.OperateLogExportReqVO; +import com.win.module.system.controller.logger.vo.operatelog.OperateLogPageReqVO; +import com.win.module.system.dal.dataobject.logger.OperateLogDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Collection; +import java.util.List; + +@Mapper +public interface OperateLogMapper extends BaseMapperX { + + default PageResult selectPage(OperateLogPageReqVO reqVO, Collection userIds) { + LambdaQueryWrapperX query = new LambdaQueryWrapperX() + .likeIfPresent(OperateLogDO::getModule, reqVO.getModule()) + .inIfPresent(OperateLogDO::getUserId, userIds) + .eqIfPresent(OperateLogDO::getType, reqVO.getType()) + .betweenIfPresent(OperateLogDO::getStartTime, reqVO.getStartTime()); + if (Boolean.TRUE.equals(reqVO.getSuccess())) { + query.eq(OperateLogDO::getResultCode, GlobalErrorCodeConstants.SUCCESS.getCode()); + } else if (Boolean.FALSE.equals(reqVO.getSuccess())) { + query.gt(OperateLogDO::getResultCode, GlobalErrorCodeConstants.SUCCESS.getCode()); + } + query.orderByDesc(OperateLogDO::getId); // 降序 + return selectPage(reqVO, query); + } + + default List selectList(OperateLogExportReqVO reqVO, Collection userIds) { + LambdaQueryWrapperX query = new LambdaQueryWrapperX() + .likeIfPresent(OperateLogDO::getModule, reqVO.getModule()) + .inIfPresent(OperateLogDO::getUserId, userIds) + .eqIfPresent(OperateLogDO::getType, reqVO.getType()) + .betweenIfPresent(OperateLogDO::getStartTime, reqVO.getStartTime()); + if (Boolean.TRUE.equals(reqVO.getSuccess())) { + query.eq(OperateLogDO::getResultCode, GlobalErrorCodeConstants.SUCCESS.getCode()); + } else if (Boolean.FALSE.equals(reqVO.getSuccess())) { + query.gt(OperateLogDO::getResultCode, GlobalErrorCodeConstants.SUCCESS.getCode()); + } + query.orderByDesc(OperateLogDO::getId); // 降序 + return selectList(query); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/mail/MailAccountMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/mail/MailAccountMapper.java new file mode 100644 index 0000000..7501b06 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/mail/MailAccountMapper.java @@ -0,0 +1,19 @@ +package com.win.module.system.dal.mysql.mail; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.controller.mail.vo.account.MailAccountPageReqVO; +import com.win.module.system.dal.dataobject.mail.MailAccountDO; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface MailAccountMapper extends BaseMapperX { + + default PageResult selectPage(MailAccountPageReqVO pageReqVO) { + return selectPage(pageReqVO, new LambdaQueryWrapperX() + .likeIfPresent(MailAccountDO::getMail, pageReqVO.getMail()) + .likeIfPresent(MailAccountDO::getUsername , pageReqVO.getUsername())); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/mail/MailLogMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/mail/MailLogMapper.java new file mode 100644 index 0000000..29f4689 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/mail/MailLogMapper.java @@ -0,0 +1,24 @@ +package com.win.module.system.dal.mysql.mail; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.controller.mail.vo.log.MailLogPageReqVO; +import com.win.module.system.dal.dataobject.mail.MailLogDO; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface MailLogMapper extends BaseMapperX { + + default PageResult selectPage(MailLogPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(MailLogDO::getUserId, reqVO.getUserId()) + .likeIfPresent(MailLogDO::getToMail, reqVO.getToMail()) + .eqIfPresent(MailLogDO::getAccountId, reqVO.getAccountId()) + .eqIfPresent(MailLogDO::getTemplateId, reqVO.getTemplateId()) + .eqIfPresent(MailLogDO::getSendStatus, reqVO.getSendStatus()) + .betweenIfPresent(MailLogDO::getSendTime, reqVO.getSendTime()) + .orderByDesc(MailLogDO::getId)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/mail/MailTemplateMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/mail/MailTemplateMapper.java new file mode 100644 index 0000000..b5622aa --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/mail/MailTemplateMapper.java @@ -0,0 +1,30 @@ +package com.win.module.system.dal.mysql.mail; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.controller.mail.vo.template.MailTemplatePageReqVO; +import com.win.module.system.dal.dataobject.mail.MailTemplateDO; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface MailTemplateMapper extends BaseMapperX { + + default PageResult selectPage(MailTemplatePageReqVO pageReqVO){ + return selectPage(pageReqVO , new LambdaQueryWrapperX() + .eqIfPresent(MailTemplateDO::getStatus, pageReqVO.getStatus()) + .likeIfPresent(MailTemplateDO::getCode, pageReqVO.getCode()) + .likeIfPresent(MailTemplateDO::getName, pageReqVO.getName()) + .eqIfPresent(MailTemplateDO::getAccountId, pageReqVO.getAccountId()) + .betweenIfPresent(MailTemplateDO::getCreateTime, pageReqVO.getCreateTime())); + } + + default Long selectCountByAccountId(Long accountId) { + return selectCount(MailTemplateDO::getAccountId, accountId); + } + + default MailTemplateDO selectByCode(String code) { + return selectOne(MailTemplateDO::getCode, code); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/notice/NoticeMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/notice/NoticeMapper.java new file mode 100644 index 0000000..50805fe --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/notice/NoticeMapper.java @@ -0,0 +1,20 @@ +package com.win.module.system.dal.mysql.notice; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.controller.notice.vo.NoticePageReqVO; +import com.win.module.system.dal.dataobject.notice.NoticeDO; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface NoticeMapper extends BaseMapperX { + + default PageResult selectPage(NoticePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(NoticeDO::getTitle, reqVO.getTitle()) + .eqIfPresent(NoticeDO::getStatus, reqVO.getStatus()) + .orderByDesc(NoticeDO::getId)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/notify/NotifyMessageMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/notify/NotifyMessageMapper.java new file mode 100644 index 0000000..4ce4245 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/notify/NotifyMessageMapper.java @@ -0,0 +1,64 @@ +package com.win.module.system.dal.mysql.notify; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.framework.mybatis.core.query.QueryWrapperX; +import com.win.module.system.controller.notify.vo.message.NotifyMessageMyPageReqVO; +import com.win.module.system.controller.notify.vo.message.NotifyMessagePageReqVO; +import com.win.module.system.dal.dataobject.notify.NotifyMessageDO; +import org.apache.ibatis.annotations.Mapper; + +import java.time.LocalDateTime; +import java.util.Collection; +import java.util.List; + +@Mapper +public interface NotifyMessageMapper extends BaseMapperX { + + default PageResult selectPage(NotifyMessagePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(NotifyMessageDO::getUserId, reqVO.getUserId()) + .likeIfPresent(NotifyMessageDO::getTemplateCode, reqVO.getTemplateCode()) + .eqIfPresent(NotifyMessageDO::getTemplateType, reqVO.getTemplateType()) + .betweenIfPresent(NotifyMessageDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(NotifyMessageDO::getId)); + } + + default PageResult selectPage(NotifyMessageMyPageReqVO reqVO, Long userId) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(NotifyMessageDO::getReadStatus, reqVO.getReadStatus()) + .betweenIfPresent(NotifyMessageDO::getCreateTime, reqVO.getCreateTime()) + .eq(NotifyMessageDO::getUserId, userId) + .orderByDesc(NotifyMessageDO::getId)); + } + + default int updateListRead(Collection ids, Long userId) { + return update(new NotifyMessageDO().setReadStatus(true).setReadTime(LocalDateTime.now()), + new LambdaQueryWrapperX() + .in(NotifyMessageDO::getId, ids) + .eq(NotifyMessageDO::getUserId, userId) + .eq(NotifyMessageDO::getReadStatus, false)); + } + + default int updateListRead(Long userId) { + return update(new NotifyMessageDO().setReadStatus(true).setReadTime(LocalDateTime.now()), + new LambdaQueryWrapperX() + .eq(NotifyMessageDO::getUserId, userId) + .eq(NotifyMessageDO::getReadStatus, false)); + } + + default List selectUnreadListByUserId(Long userId, Integer size) { + return selectList(new QueryWrapperX() // 由于要使用 limitN 语句,所以只能用 QueryWrapperX + .eq("user_id", userId) + .eq("read_status", false) + .orderByDesc("id").limitN(size)); + } + + default Long selectUnreadCountByUserId(Long userId) { + return selectCount(new LambdaQueryWrapperX() + .eq(NotifyMessageDO::getReadStatus, false) + .eq(NotifyMessageDO::getUserId, userId)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/notify/NotifyTemplateMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/notify/NotifyTemplateMapper.java new file mode 100644 index 0000000..a86df48 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/notify/NotifyTemplateMapper.java @@ -0,0 +1,26 @@ +package com.win.module.system.dal.mysql.notify; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.controller.notify.vo.template.NotifyTemplatePageReqVO; +import com.win.module.system.dal.dataobject.notify.NotifyTemplateDO; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface NotifyTemplateMapper extends BaseMapperX { + + default NotifyTemplateDO selectByCode(String code) { + return selectOne(NotifyTemplateDO::getCode, code); + } + + default PageResult selectPage(NotifyTemplatePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(NotifyTemplateDO::getCode, reqVO.getCode()) + .likeIfPresent(NotifyTemplateDO::getName, reqVO.getName()) + .eqIfPresent(NotifyTemplateDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(NotifyTemplateDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(NotifyTemplateDO::getId)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/oauth2/OAuth2AccessTokenMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/oauth2/OAuth2AccessTokenMapper.java new file mode 100644 index 0000000..541c898 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/oauth2/OAuth2AccessTokenMapper.java @@ -0,0 +1,32 @@ +package com.win.module.system.dal.mysql.oauth2; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.controller.oauth2.vo.token.OAuth2AccessTokenPageReqVO; +import com.win.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; +import org.apache.ibatis.annotations.Mapper; + +import java.time.LocalDateTime; +import java.util.List; + +@Mapper +public interface OAuth2AccessTokenMapper extends BaseMapperX { + + default OAuth2AccessTokenDO selectByAccessToken(String accessToken) { + return selectOne(OAuth2AccessTokenDO::getAccessToken, accessToken); + } + + default List selectListByRefreshToken(String refreshToken) { + return selectList(OAuth2AccessTokenDO::getRefreshToken, refreshToken); + } + + default PageResult selectPage(OAuth2AccessTokenPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(OAuth2AccessTokenDO::getUserId, reqVO.getUserId()) + .likeIfPresent(OAuth2AccessTokenDO::getClientId, reqVO.getClientId()) + .gt(OAuth2AccessTokenDO::getExpiresTime, LocalDateTime.now()) + .orderByDesc(OAuth2AccessTokenDO::getId)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/oauth2/OAuth2ApproveMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/oauth2/OAuth2ApproveMapper.java new file mode 100644 index 0000000..a444de8 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/oauth2/OAuth2ApproveMapper.java @@ -0,0 +1,26 @@ +package com.win.module.system.dal.mysql.oauth2; + +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.dal.dataobject.oauth2.OAuth2ApproveDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface OAuth2ApproveMapper extends BaseMapperX { + + default int update(OAuth2ApproveDO updateObj) { + return update(updateObj, new LambdaQueryWrapperX() + .eq(OAuth2ApproveDO::getUserId, updateObj.getUserId()) + .eq(OAuth2ApproveDO::getClientId, updateObj.getClientId()) + .eq(OAuth2ApproveDO::getScope, updateObj.getScope())); + } + + default List selectListByUserIdAndClientId(Long userId, String clientId) { + return selectList(new LambdaQueryWrapperX() + .eq(OAuth2ApproveDO::getUserId, userId) + .eq(OAuth2ApproveDO::getClientId, clientId)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/oauth2/OAuth2ClientMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/oauth2/OAuth2ClientMapper.java new file mode 100644 index 0000000..259b0bf --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/oauth2/OAuth2ClientMapper.java @@ -0,0 +1,30 @@ +package com.win.module.system.dal.mysql.oauth2; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.controller.oauth2.vo.client.OAuth2ClientPageReqVO; +import com.win.module.system.dal.dataobject.oauth2.OAuth2ClientDO; +import org.apache.ibatis.annotations.Mapper; + + +/** + * OAuth2 客户端 Mapper + * + * @author 闻荫源码 + */ +@Mapper +public interface OAuth2ClientMapper extends BaseMapperX { + + default PageResult selectPage(OAuth2ClientPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(OAuth2ClientDO::getName, reqVO.getName()) + .eqIfPresent(OAuth2ClientDO::getStatus, reqVO.getStatus()) + .orderByDesc(OAuth2ClientDO::getId)); + } + + default OAuth2ClientDO selectByClientId(String clientId) { + return selectOne(OAuth2ClientDO::getClientId, clientId); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/oauth2/OAuth2CodeMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/oauth2/OAuth2CodeMapper.java new file mode 100644 index 0000000..3e3fa07 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/oauth2/OAuth2CodeMapper.java @@ -0,0 +1,14 @@ +package com.win.module.system.dal.mysql.oauth2; + +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.module.system.dal.dataobject.oauth2.OAuth2CodeDO; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface OAuth2CodeMapper extends BaseMapperX { + + default OAuth2CodeDO selectByCode(String code) { + return selectOne(OAuth2CodeDO::getCode, code); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/oauth2/OAuth2RefreshTokenMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/oauth2/OAuth2RefreshTokenMapper.java new file mode 100644 index 0000000..ce335ac --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/oauth2/OAuth2RefreshTokenMapper.java @@ -0,0 +1,20 @@ +package com.win.module.system.dal.mysql.oauth2; + +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.dal.dataobject.oauth2.OAuth2RefreshTokenDO; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface OAuth2RefreshTokenMapper extends BaseMapperX { + + default int deleteByRefreshToken(String refreshToken) { + return delete(new LambdaQueryWrapperX() + .eq(OAuth2RefreshTokenDO::getRefreshToken, refreshToken)); + } + + default OAuth2RefreshTokenDO selectByRefreshToken(String refreshToken) { + return selectOne(OAuth2RefreshTokenDO::getRefreshToken, refreshToken); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/package-info.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/package-info.java new file mode 100644 index 0000000..e42d8a5 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/package-info.java @@ -0,0 +1,9 @@ +/** + * DAL = Data Access Layer 数据访问层 + * 1. data object:数据对象 + * 2. redis:Redis 的 CRUD 操作 + * 3. mysql:MySQL 的 CRUD 操作 + * + * 其中,MySQL 的表以 system_ 作为前缀 + */ +package com.win.module.system.dal.mysql; diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/permission/MenuMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/permission/MenuMapper.java new file mode 100644 index 0000000..76874b5 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/permission/MenuMapper.java @@ -0,0 +1,31 @@ +package com.win.module.system.dal.mysql.permission; + +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.controller.permission.vo.menu.MenuListReqVO; +import com.win.module.system.dal.dataobject.permission.MenuDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface MenuMapper extends BaseMapperX { + + default MenuDO selectByParentIdAndName(Long parentId, String name) { + return selectOne(MenuDO::getParentId, parentId, MenuDO::getName, name); + } + + default Long selectCountByParentId(Long parentId) { + return selectCount(MenuDO::getParentId, parentId); + } + + default List selectList(MenuListReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(MenuDO::getName, reqVO.getName()) + .eqIfPresent(MenuDO::getStatus, reqVO.getStatus())); + } + + default List selectListByPermission(String permission) { + return selectList(MenuDO::getPermission, permission); + } +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/permission/RoleMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/permission/RoleMapper.java new file mode 100644 index 0000000..beb91e7 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/permission/RoleMapper.java @@ -0,0 +1,48 @@ +package com.win.module.system.dal.mysql.permission; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.controller.permission.vo.role.RoleExportReqVO; +import com.win.module.system.controller.permission.vo.role.RolePageReqVO; +import com.win.module.system.dal.dataobject.permission.RoleDO; +import org.apache.ibatis.annotations.Mapper; +import org.springframework.lang.Nullable; + +import java.util.Collection; +import java.util.List; + +@Mapper +public interface RoleMapper extends BaseMapperX { + + default PageResult selectPage(RolePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(RoleDO::getName, reqVO.getName()) + .likeIfPresent(RoleDO::getCode, reqVO.getCode()) + .eqIfPresent(RoleDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(BaseDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(RoleDO::getId)); + } + + default List selectList(RoleExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(RoleDO::getName, reqVO.getName()) + .likeIfPresent(RoleDO::getCode, reqVO.getCode()) + .eqIfPresent(RoleDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(BaseDO::getCreateTime, reqVO.getCreateTime())); + } + + default RoleDO selectByName(String name) { + return selectOne(RoleDO::getName, name); + } + + default RoleDO selectByCode(String code) { + return selectOne(RoleDO::getCode, code); + } + + default List selectListByStatus(@Nullable Collection statuses) { + return selectList(RoleDO::getStatus, statuses); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/permission/RoleMenuMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/permission/RoleMenuMapper.java new file mode 100644 index 0000000..b665d89 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/permission/RoleMenuMapper.java @@ -0,0 +1,40 @@ +package com.win.module.system.dal.mysql.permission; + +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.module.system.dal.dataobject.permission.RoleMenuDO; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Collection; +import java.util.List; + +@Mapper +public interface RoleMenuMapper extends BaseMapperX { + + default List selectListByRoleId(Long roleId) { + return selectList(RoleMenuDO::getRoleId, roleId); + } + + default List selectListByRoleId(Collection roleIds) { + return selectList(RoleMenuDO::getRoleId, roleIds); + } + + default List selectListByMenuId(Long menuId) { + return selectList(RoleMenuDO::getMenuId, menuId); + } + + default void deleteListByRoleIdAndMenuIds(Long roleId, Collection menuIds) { + delete(new LambdaQueryWrapper() + .eq(RoleMenuDO::getRoleId, roleId) + .in(RoleMenuDO::getMenuId, menuIds)); + } + + default void deleteListByMenuId(Long menuId) { + delete(new LambdaQueryWrapper().eq(RoleMenuDO::getMenuId, menuId)); + } + + default void deleteListByRoleId(Long roleId) { + delete(new LambdaQueryWrapper().eq(RoleMenuDO::getRoleId, roleId)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/permission/UserRoleMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/permission/UserRoleMapper.java new file mode 100644 index 0000000..3be1519 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/permission/UserRoleMapper.java @@ -0,0 +1,36 @@ +package com.win.module.system.dal.mysql.permission; + +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.module.system.dal.dataobject.permission.UserRoleDO; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Collection; +import java.util.List; + +@Mapper +public interface UserRoleMapper extends BaseMapperX { + + default List selectListByUserId(Long userId) { + return selectList(UserRoleDO::getUserId, userId); + } + + default void deleteListByUserIdAndRoleIdIds(Long userId, Collection roleIds) { + delete(new LambdaQueryWrapper() + .eq(UserRoleDO::getUserId, userId) + .in(UserRoleDO::getRoleId, roleIds)); + } + + default void deleteListByUserId(Long userId) { + delete(new LambdaQueryWrapper().eq(UserRoleDO::getUserId, userId)); + } + + default void deleteListByRoleId(Long roleId) { + delete(new LambdaQueryWrapper().eq(UserRoleDO::getRoleId, roleId)); + } + + default List selectListByRoleIds(Collection roleIds) { + return selectList(UserRoleDO::getRoleId, roleIds); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/sensitiveword/SensitiveWordMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/sensitiveword/SensitiveWordMapper.java new file mode 100644 index 0000000..490f740 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/sensitiveword/SensitiveWordMapper.java @@ -0,0 +1,48 @@ +package com.win.module.system.dal.mysql.sensitiveword; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.controller.sensitiveword.vo.SensitiveWordExportReqVO; +import com.win.module.system.controller.sensitiveword.vo.SensitiveWordPageReqVO; +import com.win.module.system.dal.dataobject.sensitiveword.SensitiveWordDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * 敏感词 Mapper + * + * @author 永不言败 + */ +@Mapper +public interface SensitiveWordMapper extends BaseMapperX { + + default PageResult selectPage(SensitiveWordPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(SensitiveWordDO::getName, reqVO.getName()) + .likeIfPresent(SensitiveWordDO::getTags, reqVO.getTag()) + .eqIfPresent(SensitiveWordDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(SensitiveWordDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(SensitiveWordDO::getId)); + } + + default List selectList(SensitiveWordExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(SensitiveWordDO::getName, reqVO.getName()) + .likeIfPresent(SensitiveWordDO::getTags, reqVO.getTag()) + .eqIfPresent(SensitiveWordDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(SensitiveWordDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(SensitiveWordDO::getId)); + } + + default SensitiveWordDO selectByName(String name) { + return selectOne(SensitiveWordDO::getName, name); + } + + @Select("SELECT COUNT(*) FROM system_sensitive_word WHERE update_time > #{maxUpdateTime}") + Long selectCountByUpdateTimeGt(LocalDateTime maxTime); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/serialnumber/SerialNumberMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/serialnumber/SerialNumberMapper.java new file mode 100644 index 0000000..1c7113e --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/serialnumber/SerialNumberMapper.java @@ -0,0 +1,35 @@ +package com.win.module.system.dal.mysql.serialnumber; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.controller.serialnumber.vo.SerialNumberExportReqVO; +import com.win.module.system.controller.serialnumber.vo.SerialNumberPageReqVO; +import com.win.module.system.dal.dataobject.serialnumber.SerialNumberDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 流水号规则 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface SerialNumberMapper extends BaseMapperX { + + default PageResult selectPage(SerialNumberPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(SerialNumberDO::getRuleCode, reqVO.getRuleCode()) + .likeIfPresent(SerialNumberDO::getRuleName, reqVO.getRuleName()) + .orderByDesc(SerialNumberDO::getId)); + } + + default List selectList(SerialNumberExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(SerialNumberDO::getRuleCode, reqVO.getRuleCode()) + .likeIfPresent(SerialNumberDO::getRuleName, reqVO.getRuleName()) + .orderByDesc(SerialNumberDO::getId)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/sms/SmsChannelMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/sms/SmsChannelMapper.java new file mode 100644 index 0000000..85beba2 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/sms/SmsChannelMapper.java @@ -0,0 +1,25 @@ +package com.win.module.system.dal.mysql.sms; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.controller.sms.vo.channel.SmsChannelPageReqVO; +import com.win.module.system.dal.dataobject.sms.SmsChannelDO; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface SmsChannelMapper extends BaseMapperX { + + default PageResult selectPage(SmsChannelPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(SmsChannelDO::getSignature, reqVO.getSignature()) + .eqIfPresent(SmsChannelDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(SmsChannelDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(SmsChannelDO::getId)); + } + + default SmsChannelDO selectByCode(String code) { + return selectOne(SmsChannelDO::getCode, code); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/sms/SmsCodeMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/sms/SmsCodeMapper.java new file mode 100644 index 0000000..8bbcd1f --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/sms/SmsCodeMapper.java @@ -0,0 +1,28 @@ +package com.win.module.system.dal.mysql.sms; + +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.QueryWrapperX; +import com.win.module.system.dal.dataobject.sms.SmsCodeDO; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface SmsCodeMapper extends BaseMapperX { + + /** + * 获得手机号的最后一个手机验证码 + * + * @param mobile 手机号 + * @param scene 发送场景,选填 + * @param code 验证码 选填 + * @return 手机验证码 + */ + default SmsCodeDO selectLastByMobile(String mobile, String code, Integer scene) { + return selectOne(new QueryWrapperX() + .eq("mobile", mobile) + .eqIfPresent("scene", scene) + .eqIfPresent("code", code) + .orderByDesc("id") + .limitN(1)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/sms/SmsLogMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/sms/SmsLogMapper.java new file mode 100644 index 0000000..f972ec9 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/sms/SmsLogMapper.java @@ -0,0 +1,40 @@ +package com.win.module.system.dal.mysql.sms; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.controller.sms.vo.log.SmsLogExportReqVO; +import com.win.module.system.controller.sms.vo.log.SmsLogPageReqVO; +import com.win.module.system.dal.dataobject.sms.SmsLogDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface SmsLogMapper extends BaseMapperX { + + default PageResult selectPage(SmsLogPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(SmsLogDO::getChannelId, reqVO.getChannelId()) + .eqIfPresent(SmsLogDO::getTemplateId, reqVO.getTemplateId()) + .likeIfPresent(SmsLogDO::getMobile, reqVO.getMobile()) + .eqIfPresent(SmsLogDO::getSendStatus, reqVO.getSendStatus()) + .betweenIfPresent(SmsLogDO::getSendTime, reqVO.getSendTime()) + .eqIfPresent(SmsLogDO::getReceiveStatus, reqVO.getReceiveStatus()) + .betweenIfPresent(SmsLogDO::getReceiveTime, reqVO.getReceiveTime()) + .orderByDesc(SmsLogDO::getId)); + } + + default List selectList(SmsLogExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(SmsLogDO::getChannelId, reqVO.getChannelId()) + .eqIfPresent(SmsLogDO::getTemplateId, reqVO.getTemplateId()) + .likeIfPresent(SmsLogDO::getMobile, reqVO.getMobile()) + .eqIfPresent(SmsLogDO::getSendStatus, reqVO.getSendStatus()) + .betweenIfPresent(SmsLogDO::getSendTime, reqVO.getSendTime()) + .eqIfPresent(SmsLogDO::getReceiveStatus, reqVO.getReceiveStatus()) + .betweenIfPresent(SmsLogDO::getReceiveTime, reqVO.getReceiveTime()) + .orderByDesc(SmsLogDO::getId)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/sms/SmsTemplateMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/sms/SmsTemplateMapper.java new file mode 100644 index 0000000..4b97836 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/sms/SmsTemplateMapper.java @@ -0,0 +1,48 @@ +package com.win.module.system.dal.mysql.sms; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.controller.sms.vo.template.SmsTemplateExportReqVO; +import com.win.module.system.controller.sms.vo.template.SmsTemplatePageReqVO; +import com.win.module.system.dal.dataobject.sms.SmsTemplateDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface SmsTemplateMapper extends BaseMapperX { + + default SmsTemplateDO selectByCode(String code) { + return selectOne(SmsTemplateDO::getCode, code); + } + + default PageResult selectPage(SmsTemplatePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(SmsTemplateDO::getType, reqVO.getType()) + .eqIfPresent(SmsTemplateDO::getStatus, reqVO.getStatus()) + .likeIfPresent(SmsTemplateDO::getCode, reqVO.getCode()) + .likeIfPresent(SmsTemplateDO::getContent, reqVO.getContent()) + .likeIfPresent(SmsTemplateDO::getApiTemplateId, reqVO.getApiTemplateId()) + .eqIfPresent(SmsTemplateDO::getChannelId, reqVO.getChannelId()) + .betweenIfPresent(SmsTemplateDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(SmsTemplateDO::getId)); + } + + default List selectList(SmsTemplateExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(SmsTemplateDO::getType, reqVO.getType()) + .eqIfPresent(SmsTemplateDO::getStatus, reqVO.getStatus()) + .likeIfPresent(SmsTemplateDO::getCode, reqVO.getCode()) + .likeIfPresent(SmsTemplateDO::getContent, reqVO.getContent()) + .likeIfPresent(SmsTemplateDO::getApiTemplateId, reqVO.getApiTemplateId()) + .eqIfPresent(SmsTemplateDO::getChannelId, reqVO.getChannelId()) + .betweenIfPresent(SmsTemplateDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(SmsTemplateDO::getId)); + } + + default Long selectCountByChannelId(Long channelId) { + return selectCount(SmsTemplateDO::getChannelId, channelId); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/tenant/TenantMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/tenant/TenantMapper.java new file mode 100644 index 0000000..47ccfb3 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/tenant/TenantMapper.java @@ -0,0 +1,53 @@ +package com.win.module.system.dal.mysql.tenant; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.controller.tenant.vo.tenant.TenantExportReqVO; +import com.win.module.system.controller.tenant.vo.tenant.TenantPageReqVO; +import com.win.module.system.dal.dataobject.tenant.TenantDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 租户 Mapper + * + * @author 闻荫源码 + */ +@Mapper +public interface TenantMapper extends BaseMapperX { + + default PageResult selectPage(TenantPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(TenantDO::getName, reqVO.getName()) + .likeIfPresent(TenantDO::getContactName, reqVO.getContactName()) + .likeIfPresent(TenantDO::getContactMobile, reqVO.getContactMobile()) + .eqIfPresent(TenantDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(TenantDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(TenantDO::getId)); + } + + default List selectList(TenantExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(TenantDO::getName, reqVO.getName()) + .likeIfPresent(TenantDO::getContactName, reqVO.getContactName()) + .likeIfPresent(TenantDO::getContactMobile, reqVO.getContactMobile()) + .eqIfPresent(TenantDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(TenantDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(TenantDO::getId)); + } + + default TenantDO selectByName(String name) { + return selectOne(TenantDO::getName, name); + } + + default Long selectCountByPackageId(Long packageId) { + return selectCount(TenantDO::getPackageId, packageId); + } + + default List selectListByPackageId(Long packageId) { + return selectList(TenantDO::getPackageId, packageId); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/tenant/TenantPackageMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/tenant/TenantPackageMapper.java new file mode 100644 index 0000000..9a77627 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/tenant/TenantPackageMapper.java @@ -0,0 +1,32 @@ +package com.win.module.system.dal.mysql.tenant; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.controller.tenant.vo.packages.TenantPackagePageReqVO; +import com.win.module.system.dal.dataobject.tenant.TenantPackageDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 租户套餐 Mapper + * + * @author 闻荫源码 + */ +@Mapper +public interface TenantPackageMapper extends BaseMapperX { + + default PageResult selectPage(TenantPackagePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(TenantPackageDO::getName, reqVO.getName()) + .eqIfPresent(TenantPackageDO::getStatus, reqVO.getStatus()) + .likeIfPresent(TenantPackageDO::getRemark, reqVO.getRemark()) + .betweenIfPresent(TenantPackageDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(TenantPackageDO::getId)); + } + + default List selectListByStatus(Integer status) { + return selectList(TenantPackageDO::getStatus, status); + } +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/user/AdminUserMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/user/AdminUserMapper.java new file mode 100644 index 0000000..e147b57 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/user/AdminUserMapper.java @@ -0,0 +1,60 @@ +package com.win.module.system.dal.mysql.user; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.system.controller.user.vo.user.UserExportReqVO; +import com.win.module.system.controller.user.vo.user.UserPageReqVO; +import com.win.module.system.dal.dataobject.user.AdminUserDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Collection; +import java.util.List; + +@Mapper +public interface AdminUserMapper extends BaseMapperX { + + default AdminUserDO selectByUsername(String username) { + return selectOne(AdminUserDO::getUsername, username); + } + + default AdminUserDO selectByEmail(String email) { + return selectOne(AdminUserDO::getEmail, email); + } + + default AdminUserDO selectByMobile(String mobile) { + return selectOne(AdminUserDO::getMobile, mobile); + } + + default PageResult selectPage(UserPageReqVO reqVO, Collection deptIds) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(AdminUserDO::getUsername, reqVO.getUsername()) + .likeIfPresent(AdminUserDO::getMobile, reqVO.getMobile()) + .eqIfPresent(AdminUserDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(AdminUserDO::getCreateTime, reqVO.getCreateTime()) + .inIfPresent(AdminUserDO::getDeptId, deptIds) + .orderByDesc(AdminUserDO::getId)); + } + + default List selectList(UserExportReqVO reqVO, Collection deptIds) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(AdminUserDO::getUsername, reqVO.getUsername()) + .likeIfPresent(AdminUserDO::getMobile, reqVO.getMobile()) + .eqIfPresent(AdminUserDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(AdminUserDO::getCreateTime, reqVO.getCreateTime()) + .inIfPresent(AdminUserDO::getDeptId, deptIds)); + } + + default List selectListByNickname(String nickname) { + return selectList(new LambdaQueryWrapperX().like(AdminUserDO::getNickname, nickname)); + } + + default List selectListByStatus(Integer status) { + return selectList(AdminUserDO::getStatus, status); + } + + default List selectListByDeptIds(Collection deptIds) { + return selectList(AdminUserDO::getDeptId, deptIds); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/redis/RedisKeyConstants.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/redis/RedisKeyConstants.java new file mode 100644 index 0000000..5a9425d --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/redis/RedisKeyConstants.java @@ -0,0 +1,101 @@ +package com.win.module.system.dal.redis; + +import com.win.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; + +/** + * System Redis Key 枚举类 + * + * @author 闻荫源码 + */ +public interface RedisKeyConstants { + + /** + * 指定部门的所有子部门编号数组的缓存 + *

+ * KEY 格式:dept_children_ids:{id} + * VALUE 数据类型:String 子部门编号集合 + */ + String DEPT_CHILDREN_ID_LIST = "dept_children_ids"; + + /** + * 角色的缓存 + *

+ * KEY 格式:role:{id} + * VALUE 数据类型:String 角色信息 + */ + String ROLE = "role"; + + /** + * 用户拥有的角色编号的缓存 + *

+ * KEY 格式:user_role_ids:{userId} + * VALUE 数据类型:String 角色编号集合 + */ + String USER_ROLE_ID_LIST = "user_role_ids"; + + /** + * 拥有指定菜单的角色编号的缓存 + *

+ * KEY 格式:user_role_ids:{menuId} + * VALUE 数据类型:String 角色编号集合 + */ + String MENU_ROLE_ID_LIST = "menu_role_ids"; + + /** + * 拥有权限对应的菜单编号数组的缓存 + *

+ * KEY 格式:permission_menu_ids:{permission} + * VALUE 数据类型:String 菜单编号数组 + */ + String PERMISSION_MENU_ID_LIST = "permission_menu_ids"; + + /** + * OAuth2 客户端的缓存 + *

+ * KEY 格式:user:{id} + * VALUE 数据类型:String 客户端信息 + */ + String OAUTH_CLIENT = "oauth_client"; + + /** + * 访问令牌的缓存 + *

+ * KEY 格式:oauth2_access_token:{token} + * VALUE 数据类型:String 访问令牌信息 {@link OAuth2AccessTokenDO} + *

+ * 由于动态过期时间,使用 RedisTemplate 操作 + */ + String OAUTH2_ACCESS_TOKEN = "oauth2_access_token:%s"; + + /** + * 站内信模版的缓存 + *

+ * KEY 格式:notify_template:{code} + * VALUE 数据格式:String 模版信息 + */ + String NOTIFY_TEMPLATE = "notify_template"; + + /** + * 邮件账号的缓存 + *

+ * KEY 格式:sms_template:{id} + * VALUE 数据格式:String 账号信息 + */ + String MAIL_ACCOUNT = "mail_account"; + + /** + * 邮件模版的缓存 + *

+ * KEY 格式:mail_template:{code} + * VALUE 数据格式:String 模版信息 + */ + String MAIL_TEMPLATE = "mail_template"; + + /** + * 短信模版的缓存 + *

+ * KEY 格式:sms_template:{id} + * VALUE 数据格式:String 模版信息 + */ + String SMS_TEMPLATE = "sms_template"; +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/redis/oauth2/OAuth2AccessTokenRedisDAO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/redis/oauth2/OAuth2AccessTokenRedisDAO.java new file mode 100644 index 0000000..5110d0b --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/redis/oauth2/OAuth2AccessTokenRedisDAO.java @@ -0,0 +1,59 @@ +package com.win.module.system.dal.redis.oauth2; + +import cn.hutool.core.date.LocalDateTimeUtil; +import com.win.framework.common.util.collection.CollectionUtils; +import com.win.framework.common.util.json.JsonUtils; +import com.win.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Repository; + +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; +import java.util.Collection; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import static com.win.module.system.dal.redis.RedisKeyConstants.OAUTH2_ACCESS_TOKEN; + +/** + * {@link OAuth2AccessTokenDO} 的 RedisDAO + * + * @author 闻荫源码 + */ +@Repository +public class OAuth2AccessTokenRedisDAO { + + @Resource + private StringRedisTemplate stringRedisTemplate; + + public OAuth2AccessTokenDO get(String accessToken) { + String redisKey = formatKey(accessToken); + return JsonUtils.parseObject(stringRedisTemplate.opsForValue().get(redisKey), OAuth2AccessTokenDO.class); + } + + public void set(OAuth2AccessTokenDO accessTokenDO) { + String redisKey = formatKey(accessTokenDO.getAccessToken()); + // 清理多余字段,避免缓存 + accessTokenDO.setUpdater(null).setUpdateTime(null).setCreateTime(null).setCreator(null).setDeleted(null); + long time = LocalDateTimeUtil.between(LocalDateTime.now(), accessTokenDO.getExpiresTime(), ChronoUnit.SECONDS); + if (time > 0) { + stringRedisTemplate.opsForValue().set(redisKey, JsonUtils.toJsonString(accessTokenDO), time, TimeUnit.SECONDS); + } + } + + public void delete(String accessToken) { + String redisKey = formatKey(accessToken); + stringRedisTemplate.delete(redisKey); + } + + public void deleteList(Collection accessTokens) { + List redisKeys = CollectionUtils.convertList(accessTokens, OAuth2AccessTokenRedisDAO::formatKey); + stringRedisTemplate.delete(redisKeys); + } + + private static String formatKey(String accessToken) { + return String.format(OAUTH2_ACCESS_TOKEN, accessToken); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/datapermission/config/DataPermissionConfiguration.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/datapermission/config/DataPermissionConfiguration.java new file mode 100644 index 0000000..51c6565 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/datapermission/config/DataPermissionConfiguration.java @@ -0,0 +1,28 @@ +package com.win.module.system.framework.datapermission.config; + +import com.win.module.system.dal.dataobject.dept.DeptDO; +import com.win.module.system.dal.dataobject.user.AdminUserDO; +import com.win.framework.datapermission.core.rule.dept.DeptDataPermissionRuleCustomizer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * system 模块的数据权限 Configuration + * + * @author 闻荫源码 + */ +@Configuration(proxyBeanMethods = false) +public class DataPermissionConfiguration { + + @Bean + public DeptDataPermissionRuleCustomizer sysDeptDataPermissionRuleCustomizer() { + return rule -> { + // dept + rule.addDeptColumn(AdminUserDO.class); + rule.addDeptColumn(DeptDO.class, "id"); + // user + rule.addUserColumn(AdminUserDO.class, "id"); + }; + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/datapermission/package-info.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/datapermission/package-info.java new file mode 100644 index 0000000..a3670cd --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/datapermission/package-info.java @@ -0,0 +1,4 @@ +/** + * system 模块的数据权限配置 + */ +package com.win.module.system.framework.datapermission; diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/package-info.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/package-info.java new file mode 100644 index 0000000..8a9aee8 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/package-info.java @@ -0,0 +1,6 @@ +/** + * 属于 system 模块的 framework 封装 + * + * @author 闻荫源码 + */ +package com.win.module.system.framework; diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/SmsCodeConfiguration.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/SmsCodeConfiguration.java new file mode 100644 index 0000000..6ab1e2e --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/SmsCodeConfiguration.java @@ -0,0 +1,9 @@ +package com.win.module.system.framework.sms; + +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Configuration(proxyBeanMethods = false) +@EnableConfigurationProperties(SmsCodeProperties.class) +public class SmsCodeConfiguration { +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/SmsCodeProperties.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/SmsCodeProperties.java new file mode 100644 index 0000000..a54a040 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/SmsCodeProperties.java @@ -0,0 +1,41 @@ +package com.win.module.system.framework.sms; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.validation.annotation.Validated; + +import javax.validation.constraints.NotNull; +import java.time.Duration; + +@ConfigurationProperties(prefix = "win.sms-code") +@Validated +@Data +public class SmsCodeProperties { + + /** + * 过期时间 + */ + @NotNull(message = "过期时间不能为空") + private Duration expireTimes; + /** + * 短信发送频率 + */ + @NotNull(message = "短信发送频率不能为空") + private Duration sendFrequency; + /** + * 每日发送最大数量 + */ + @NotNull(message = "每日发送最大数量不能为空") + private Integer sendMaximumQuantityPerDay; + /** + * 验证码最小值 + */ + @NotNull(message = "验证码最小值不能为空") + private Integer beginCode; + /** + * 验证码最大值 + */ + @NotNull(message = "验证码最大值不能为空") + private Integer endCode; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/web/config/SystemWebConfiguration.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/web/config/SystemWebConfiguration.java new file mode 100644 index 0000000..895f238 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/web/config/SystemWebConfiguration.java @@ -0,0 +1,24 @@ +package com.win.module.system.framework.web.config; + +import com.win.framework.swagger.config.WinSwaggerAutoConfiguration; +import org.springdoc.core.GroupedOpenApi; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * system 模块的 web 组件的 Configuration + * + * @author 闻荫源码 + */ +@Configuration(proxyBeanMethods = false) +public class SystemWebConfiguration { + + /** + * system 模块的 API 分组 + */ + @Bean + public GroupedOpenApi systemGroupedOpenApi() { + return WinSwaggerAutoConfiguration.buildGroupedOpenApi("system"); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/web/package-info.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/web/package-info.java new file mode 100644 index 0000000..dc75f70 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/web/package-info.java @@ -0,0 +1,4 @@ +/** + * system 模块的 web 配置 + */ +package com.win.module.system.framework.web; diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/job/DemoJob.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/job/DemoJob.java new file mode 100644 index 0000000..a1e8536 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/job/DemoJob.java @@ -0,0 +1,27 @@ +package com.win.module.system.job; + +import com.win.framework.quartz.core.handler.JobHandler; +import com.win.framework.tenant.core.context.TenantContextHolder; +import com.win.framework.tenant.core.job.TenantJob; +import com.win.module.system.dal.dataobject.user.AdminUserDO; +import com.win.module.system.dal.mysql.user.AdminUserMapper; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.List; + +@Component +public class DemoJob implements JobHandler { + + @Resource + private AdminUserMapper adminUserMapper; + + @Override + @TenantJob // 标记多租户 + public String execute(String param) { + System.out.println("当前租户:" + TenantContextHolder.getTenantId()); + List users = adminUserMapper.selectList(); + return "用户数量:" + users.size(); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/job/package-info.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/job/package-info.java new file mode 100644 index 0000000..0621269 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/job/package-info.java @@ -0,0 +1 @@ +package com.win.module.system.job; diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/mq/consumer/mail/MailSendConsumer.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/mq/consumer/mail/MailSendConsumer.java new file mode 100644 index 0000000..d4c72ce --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/mq/consumer/mail/MailSendConsumer.java @@ -0,0 +1,30 @@ +package com.win.module.system.mq.consumer.mail; + +import com.win.framework.mq.core.stream.AbstractStreamMessageListener; +import com.win.module.system.mq.message.mail.MailSendMessage; +import com.win.module.system.mq.message.sms.SmsSendMessage; +import com.win.module.system.service.mail.MailSendService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * 针对 {@link MailSendMessage} 的消费者 + * + * @author 闻荫源码 + */ +@Component +@Slf4j +public class MailSendConsumer extends AbstractStreamMessageListener { + + @Resource + private MailSendService mailSendService; + + @Override + public void onMessage(MailSendMessage message) { + log.info("[onMessage][消息内容({})]", message); + mailSendService.doSendMail(message); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/mq/consumer/sms/SmsSendConsumer.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/mq/consumer/sms/SmsSendConsumer.java new file mode 100644 index 0000000..0ee3e00 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/mq/consumer/sms/SmsSendConsumer.java @@ -0,0 +1,29 @@ +package com.win.module.system.mq.consumer.sms; + +import com.win.module.system.mq.message.sms.SmsSendMessage; +import com.win.module.system.service.sms.SmsSendService; +import com.win.framework.mq.core.stream.AbstractStreamMessageListener; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * 针对 {@link SmsSendMessage} 的消费者 + * + * @author zzf + */ +@Component +@Slf4j +public class SmsSendConsumer extends AbstractStreamMessageListener { + + @Resource + private SmsSendService smsSendService; + + @Override + public void onMessage(SmsSendMessage message) { + log.info("[onMessage][消息内容({})]", message); + smsSendService.doSendSms(message); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/mq/message/mail/MailSendMessage.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/mq/message/mail/MailSendMessage.java new file mode 100644 index 0000000..34d0853 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/mq/message/mail/MailSendMessage.java @@ -0,0 +1,55 @@ +package com.win.module.system.mq.message.mail; + +import com.win.framework.mq.core.stream.AbstractStreamMessage; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +/** + * 邮箱发送消息 + * + * @author 闻荫源码 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class MailSendMessage extends AbstractStreamMessage { + + /** + * 邮件日志编号 + */ + @NotNull(message = "邮件日志编号不能为空") + private Long logId; + /** + * 接收邮件地址 + */ + @NotNull(message = "接收邮件地址不能为空") + private String mail; + /** + * 邮件账号编号 + */ + @NotNull(message = "邮件账号编号不能为空") + private Long accountId; + + /** + * 邮件发件人 + */ + private String nickname; + /** + * 邮件标题 + */ + @NotEmpty(message = "邮件标题不能为空") + private String title; + /** + * 邮件内容 + */ + @NotEmpty(message = "邮件内容不能为空") + private String content; + + @Override + public String getStreamKey() { + return "system.mail.send"; + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/mq/message/sms/SmsSendMessage.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/mq/message/sms/SmsSendMessage.java new file mode 100644 index 0000000..ffab85b --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/mq/message/sms/SmsSendMessage.java @@ -0,0 +1,50 @@ +package com.win.module.system.mq.message.sms; + +import com.win.framework.common.core.KeyValue; +import com.win.framework.mq.core.stream.AbstractStreamMessage; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * 短信发送消息 + * + * @author 闻荫源码 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class SmsSendMessage extends AbstractStreamMessage { + + /** + * 短信日志编号 + */ + @NotNull(message = "短信日志编号不能为空") + private Long logId; + /** + * 手机号 + */ + @NotNull(message = "手机号不能为空") + private String mobile; + /** + * 短信渠道编号 + */ + @NotNull(message = "短信渠道编号不能为空") + private Long channelId; + /** + * 短信 API 的模板编号 + */ + @NotNull(message = "短信 API 的模板编号不能为空") + private String apiTemplateId; + /** + * 短信模板参数 + */ + private List> templateParams; + + @Override + public String getStreamKey() { + return "system.sms.send"; + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/mq/producer/mail/MailProducer.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/mq/producer/mail/MailProducer.java new file mode 100644 index 0000000..2fa8bb5 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/mq/producer/mail/MailProducer.java @@ -0,0 +1,41 @@ +package com.win.module.system.mq.producer.mail; + +import com.win.framework.mq.core.RedisMQTemplate; +import com.win.module.system.mq.message.mail.MailSendMessage; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * Mail 邮件相关消息的 Producer + * + * @author wangjingyi + * @since 2021/4/19 13:33 + */ +@Slf4j +@Component +public class MailProducer { + + @Resource + private RedisMQTemplate redisMQTemplate; + + /** + * 发送 {@link MailSendMessage} 消息 + * + * @param sendLogId 发送日志编码 + * @param mail 接收邮件地址 + * @param accountId 邮件账号编号 + * @param nickname 邮件发件人 + * @param title 邮件标题 + * @param content 邮件内容 + */ + public void sendMessage(Long sendLogId, String mail, Long accountId, + String nickname, String title, String content) { + MailSendMessage message = new MailSendMessage() + .setLogId(sendLogId).setMail(mail).setAccountId(accountId) + .setNickname(nickname).setTitle(title).setContent(content); + redisMQTemplate.send(message); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/mq/producer/sms/SmsProducer.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/mq/producer/sms/SmsProducer.java new file mode 100644 index 0000000..f0e130a --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/mq/producer/sms/SmsProducer.java @@ -0,0 +1,41 @@ +package com.win.module.system.mq.producer.sms; + +import com.win.framework.common.core.KeyValue; +import com.win.framework.mq.core.RedisMQTemplate; +import com.win.module.system.mq.message.sms.SmsSendMessage; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.List; + +/** + * Sms 短信相关消息的 Producer + * + * @author zzf + * @since 2021/3/9 16:35 + */ +@Slf4j +@Component +public class SmsProducer { + + @Resource + private RedisMQTemplate redisMQTemplate; + + /** + * 发送 {@link SmsSendMessage} 消息 + * + * @param logId 短信日志编号 + * @param mobile 手机号 + * @param channelId 渠道编号 + * @param apiTemplateId 短信模板编号 + * @param templateParams 短信模板参数 + */ + public void sendMessage(Long logId, String mobile, + Long channelId, String apiTemplateId, List> templateParams) { + SmsSendMessage message = new SmsSendMessage().setLogId(logId).setMobile(mobile); + message.setChannelId(channelId).setApiTemplateId(apiTemplateId).setTemplateParams(templateParams); + redisMQTemplate.send(message); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/auth/AdminAuthService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/auth/AdminAuthService.java new file mode 100644 index 0000000..15f4595 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/auth/AdminAuthService.java @@ -0,0 +1,51 @@ +package com.win.module.system.service.auth; + +import com.win.module.system.controller.auth.vo.AuthLoginReqVO; +import com.win.module.system.controller.auth.vo.AuthLoginRespVO; +import com.win.module.system.dal.dataobject.user.AdminUserDO; + +import javax.validation.Valid; + +/** + * 管理后台的认证 Service 接口 + * + * 提供用户的登录、登出的能力 + * + * @author 闻荫源码 + */ +public interface AdminAuthService { + + /** + * 验证账号 + 密码。如果通过,则返回用户 + * + * @param username 账号 + * @param password 密码 + * @return 用户 + */ + AdminUserDO authenticate(String username, String password); + + /** + * 账号登录 + * + * @param reqVO 登录信息 + * @return 登录结果 + */ + AuthLoginRespVO login(@Valid AuthLoginReqVO reqVO); + + /** + * 基于 token 退出登录 + * + * @param token token + * @param logType 登出类型 + */ + void logout(String token, Integer logType); + + /** + * 刷新访问令牌 + * + * @param refreshToken 刷新令牌 + * @return 登录结果 + */ + AuthLoginRespVO refreshToken(String refreshToken); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/auth/AdminAuthServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/auth/AdminAuthServiceImpl.java new file mode 100644 index 0000000..9a84bca --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/auth/AdminAuthServiceImpl.java @@ -0,0 +1,181 @@ +package com.win.module.system.service.auth; + +import cn.hutool.core.util.ObjectUtil; +import com.win.framework.captcha.config.CaptchaProperties; +import com.win.framework.captcha.enums.CaptchaRedisKeyConstants; +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.util.monitor.TracerUtils; +import com.win.framework.common.util.servlet.ServletUtils; +import com.win.framework.redis.util.RedisCache; +import com.win.module.system.api.logger.dto.LoginLogCreateReqDTO; +import com.win.module.system.api.sms.SmsCodeApi; +import com.win.module.system.controller.auth.vo.AuthLoginReqVO; +import com.win.module.system.controller.auth.vo.AuthLoginRespVO; +import com.win.module.system.convert.auth.AuthConvert; +import com.win.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; +import com.win.module.system.dal.dataobject.user.AdminUserDO; +import com.win.module.system.enums.logger.LoginLogTypeEnum; +import com.win.module.system.enums.logger.LoginResultEnum; +import com.win.module.system.enums.oauth2.OAuth2ClientConstants; +import com.win.module.system.service.logger.LoginLogService; +import com.win.module.system.service.oauth2.OAuth2TokenService; +import com.win.module.system.service.user.AdminUserService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import javax.validation.Validator; +import java.util.Objects; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.system.enums.ErrorCodeConstants.*; + +/** + * Auth Service 实现类 + * + * @author 闻荫源码 + */ +@Service +@Slf4j +public class AdminAuthServiceImpl implements AdminAuthService { + + @Resource + private AdminUserService userService; + @Resource + private LoginLogService loginLogService; + @Resource + private OAuth2TokenService oauth2TokenService; + @Resource + private Validator validator; + @Resource + private SmsCodeApi smsCodeApi; + @Resource + private CaptchaProperties captchaProperties; + @Resource + private RedisCache redisCache; + + /** + * 验证码的开关,默认为 true + */ + @Value("${win.captcha.enable:true}") + private Boolean captchaEnable; + + @Override + public AdminUserDO authenticate(String username, String password) { + final LoginLogTypeEnum logTypeEnum = LoginLogTypeEnum.LOGIN_USERNAME; + // 校验账号是否存在 + AdminUserDO user = userService.getUserByUsername(username); + if (user == null) { + createLoginLog(null, username, logTypeEnum, LoginResultEnum.BAD_CREDENTIALS); + throw exception(AUTH_LOGIN_BAD_CREDENTIALS); + } + if (!userService.isPasswordMatch(password, user.getPassword())) { + createLoginLog(user.getId(), username, logTypeEnum, LoginResultEnum.BAD_CREDENTIALS); + throw exception(AUTH_LOGIN_BAD_CREDENTIALS); + } + // 校验是否禁用 + if (ObjectUtil.notEqual(user.getStatus(), CommonStatusEnum.ENABLE.getStatus())) { + createLoginLog(user.getId(), username, logTypeEnum, LoginResultEnum.USER_DISABLED); + throw exception(AUTH_LOGIN_USER_DISABLED); + } + return user; + } + + @Override + public AuthLoginRespVO login(AuthLoginReqVO reqVO) { + // 校验验证码 + validateCaptcha(reqVO.getUsername(), reqVO.getCode(), reqVO.getUuid()); + // 使用账号密码,进行登录 + AdminUserDO user = authenticate(reqVO.getUsername(), reqVO.getPassword()); + // 创建 Token 令牌,记录登录日志 + return createTokenAfterLoginSuccess(user.getId(), reqVO.getUsername(), LoginLogTypeEnum.LOGIN_USERNAME); + } + + private void createLoginLog(Long userId, String username, LoginLogTypeEnum logTypeEnum, LoginResultEnum loginResult) { + // 插入登录日志 + LoginLogCreateReqDTO reqDTO = new LoginLogCreateReqDTO(); + reqDTO.setLogType(logTypeEnum.getType()); + reqDTO.setTraceId(TracerUtils.getTraceId()); + reqDTO.setUserId(userId); + reqDTO.setUsername(username); + reqDTO.setUserAgent(ServletUtils.getUserAgent()); + reqDTO.setUserIp(ServletUtils.getClientIP()); + reqDTO.setResult(loginResult.getResult()); + loginLogService.createLoginLog(reqDTO); + // 更新最后登录时间 + if (userId != null && Objects.equals(LoginResultEnum.SUCCESS.getResult(), loginResult.getResult())) { + userService.updateUserLogin(userId, ServletUtils.getClientIP()); + } + } + + /** + * 校验验证码 + * + * @param username 用户名 + * @param code 验证码 + * @param uuid 唯一标识 + * @return 结果 + */ + public void validateCaptcha(String username, String code, String uuid) { + String verifyKey = CaptchaRedisKeyConstants.CAPTCHA_CODE_KEY + StringUtils.defaultString(uuid, ""); + String captcha = redisCache.getCacheObject(verifyKey); + redisCache.deleteObject(verifyKey); + if (captcha == null) { + createLoginLog(null, username, LoginLogTypeEnum.LOGIN_USERNAME, LoginResultEnum.CAPTCHA_EXPIRE); + throw exception(AUTH_LOGIN_CAPTCHA_CODE_ERROR); + } + if (!code.equalsIgnoreCase(captcha)) { + createLoginLog(null, username, LoginLogTypeEnum.LOGIN_USERNAME, LoginResultEnum.CAPTCHA_CODE_ERROR); + throw exception(AUTH_LOGIN_CAPTCHA_CODE_ERROR); + } + } + + private AuthLoginRespVO createTokenAfterLoginSuccess(Long userId, String username, LoginLogTypeEnum logType) { + // 插入登陆日志 + createLoginLog(userId, username, logType, LoginResultEnum.SUCCESS); + // 创建访问令牌 + OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.createAccessToken(userId, OAuth2ClientConstants.CLIENT_ID_DEFAULT, null); + // 构建返回结果 + return AuthConvert.INSTANCE.convert(accessTokenDO); + } + + @Override + public AuthLoginRespVO refreshToken(String refreshToken) { + OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.refreshAccessToken(refreshToken, OAuth2ClientConstants.CLIENT_ID_DEFAULT); + return AuthConvert.INSTANCE.convert(accessTokenDO); + } + + @Override + public void logout(String token, Integer logType) { + // 删除访问令牌 + OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.removeAccessToken(token); + if (accessTokenDO == null) { + return; + } + // 删除成功,则记录登出日志 + createLogoutLog(accessTokenDO.getUserId(), logType); + } + + private void createLogoutLog(Long userId, Integer logType) { + LoginLogCreateReqDTO reqDTO = new LoginLogCreateReqDTO(); + reqDTO.setLogType(logType); + reqDTO.setTraceId(TracerUtils.getTraceId()); + reqDTO.setUserId(userId); + reqDTO.setUsername(getUsername(userId)); + reqDTO.setUserAgent(ServletUtils.getUserAgent()); + reqDTO.setUserIp(ServletUtils.getClientIP()); + reqDTO.setResult(LoginResultEnum.SUCCESS.getResult()); + loginLogService.createLoginLog(reqDTO); + } + + private String getUsername(Long userId) { + if (userId == null) { + return null; + } + AdminUserDO user = userService.getUser(userId); + return user != null ? user.getUsername() : null; + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dept/DeptService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dept/DeptService.java new file mode 100644 index 0000000..7bc14b3 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dept/DeptService.java @@ -0,0 +1,104 @@ +package com.win.module.system.service.dept; + +import cn.hutool.core.collection.CollUtil; +import com.win.framework.common.util.collection.CollectionUtils; +import com.win.module.system.controller.dept.vo.dept.DeptCreateReqVO; +import com.win.module.system.controller.dept.vo.dept.DeptListReqVO; +import com.win.module.system.controller.dept.vo.dept.DeptUpdateReqVO; +import com.win.module.system.dal.dataobject.dept.DeptDO; + +import java.util.*; + +/** + * 部门 Service 接口 + * + * @author 闻荫源码 + */ +public interface DeptService { + + /** + * 创建部门 + * + * @param reqVO 部门信息 + * @return 部门编号 + */ + Long createDept(DeptCreateReqVO reqVO); + + /** + * 更新部门 + * + * @param reqVO 部门信息 + */ + void updateDept(DeptUpdateReqVO reqVO); + + /** + * 删除部门 + * + * @param id 部门编号 + */ + void deleteDept(Long id); + + /** + * 获得部门信息 + * + * @param id 部门编号 + * @return 部门信息 + */ + DeptDO getDept(Long id); + + /** + * 获得部门信息数组 + * + * @param ids 部门编号数组 + * @return 部门信息数组 + */ + List getDeptList(Collection ids); + + /** + * 筛选部门列表 + * + * @param reqVO 筛选条件请求 VO + * @return 部门列表 + */ + List getDeptList(DeptListReqVO reqVO); + + /** + * 获得指定编号的部门 Map + * + * @param ids 部门编号数组 + * @return 部门 Map + */ + default Map getDeptMap(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return Collections.emptyMap(); + } + List list = getDeptList(ids); + return CollectionUtils.convertMap(list, DeptDO::getId); + } + + /** + * 获得指定部门的所有子部门 + * + * @param id 部门编号 + * @return 子部门列表 + */ + List getChildDeptList(Long id); + + /** + * 获得所有子部门,从缓存中 + * + * @param id 父部门编号 + * @return 子部门列表 + */ + Set getChildDeptIdListFromCache(Long id); + + /** + * 校验部门们是否有效。如下情况,视为无效: + * 1. 部门编号不存在 + * 2. 部门被禁用 + * + * @param ids 角色编号数组 + */ + void validateDeptList(Collection ids); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dept/DeptServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dept/DeptServiceImpl.java new file mode 100644 index 0000000..0de716e --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dept/DeptServiceImpl.java @@ -0,0 +1,205 @@ +package com.win.module.system.service.dept; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.datapermission.core.annotation.DataPermission; +import com.win.module.system.controller.dept.vo.dept.DeptCreateReqVO; +import com.win.module.system.controller.dept.vo.dept.DeptListReqVO; +import com.win.module.system.controller.dept.vo.dept.DeptUpdateReqVO; +import com.win.module.system.convert.dept.DeptConvert; +import com.win.module.system.dal.dataobject.dept.DeptDO; +import com.win.module.system.dal.mysql.dept.DeptMapper; +import com.win.module.system.dal.redis.RedisKeyConstants; +import com.win.module.system.enums.dept.DeptIdEnum; +import com.google.common.annotations.VisibleForTesting; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.*; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.framework.common.util.collection.CollectionUtils.convertSet; +import static com.win.module.system.enums.ErrorCodeConstants.*; + +/** + * 部门 Service 实现类 + * + * @author 闻荫源码 + */ +@Service +@Validated +@Slf4j +public class DeptServiceImpl implements DeptService { + + @Resource + private DeptMapper deptMapper; + + @Override + @CacheEvict(cacheNames = RedisKeyConstants.DEPT_CHILDREN_ID_LIST, + allEntries = true) // allEntries 清空所有缓存,因为操作一个部门,涉及到多个缓存 + public Long createDept(DeptCreateReqVO reqVO) { + // 校验正确性 + if (reqVO.getParentId() == null) { + reqVO.setParentId(DeptIdEnum.ROOT.getId()); + } + validateForCreateOrUpdate(null, reqVO.getParentId(), reqVO.getName()); + // 插入部门 + DeptDO dept = DeptConvert.INSTANCE.convert(reqVO); + deptMapper.insert(dept); + return dept.getId(); + } + + @Override + @CacheEvict(cacheNames = RedisKeyConstants.DEPT_CHILDREN_ID_LIST, + allEntries = true) // allEntries 清空所有缓存,因为操作一个部门,涉及到多个缓存 + public void updateDept(DeptUpdateReqVO reqVO) { + // 校验正确性 + if (reqVO.getParentId() == null) { + reqVO.setParentId(DeptIdEnum.ROOT.getId()); + } + validateForCreateOrUpdate(reqVO.getId(), reqVO.getParentId(), reqVO.getName()); + // 更新部门 + DeptDO updateObj = DeptConvert.INSTANCE.convert(reqVO); + deptMapper.updateById(updateObj); + } + + @Override + @CacheEvict(cacheNames = RedisKeyConstants.DEPT_CHILDREN_ID_LIST, + allEntries = true) // allEntries 清空所有缓存,因为操作一个部门,涉及到多个缓存 + public void deleteDept(Long id) { + // 校验是否存在 + validateDeptExists(id); + // 校验是否有子部门 + if (deptMapper.selectCountByParentId(id) > 0) { + throw exception(DEPT_EXITS_CHILDREN); + } + // 删除部门 + deptMapper.deleteById(id); + } + + private void validateForCreateOrUpdate(Long id, Long parentId, String name) { + // 校验自己存在 + validateDeptExists(id); + // 校验父部门的有效性 + validateParentDept(id, parentId); + // 校验部门名的唯一性 + validateDeptNameUnique(id, parentId, name); + } + + @VisibleForTesting + void validateDeptExists(Long id) { + if (id == null) { + return; + } + DeptDO dept = deptMapper.selectById(id); + if (dept == null) { + throw exception(DEPT_NOT_FOUND); + } + } + + @VisibleForTesting + void validateParentDept(Long id, Long parentId) { + if (parentId == null || DeptIdEnum.ROOT.getId().equals(parentId)) { + return; + } + // 不能设置自己为父部门 + if (parentId.equals(id)) { + throw exception(DEPT_PARENT_ERROR); + } + // 父岗位不存在 + DeptDO dept = deptMapper.selectById(parentId); + if (dept == null) { + throw exception(DEPT_PARENT_NOT_EXITS); + } + // 父部门不能是原来的子部门 + List children = getChildDeptList(id); + if (children.stream().anyMatch(dept1 -> dept1.getId().equals(parentId))) { + throw exception(DEPT_PARENT_IS_CHILD); + } + } + + @VisibleForTesting + void validateDeptNameUnique(Long id, Long parentId, String name) { + DeptDO dept = deptMapper.selectByParentIdAndName(parentId, name); + if (dept == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的岗位 + if (id == null) { + throw exception(DEPT_NAME_DUPLICATE); + } + if (ObjectUtil.notEqual(dept.getId(), id)) { + throw exception(DEPT_NAME_DUPLICATE); + } + } + + @Override + public DeptDO getDept(Long id) { + return deptMapper.selectById(id); + } + + @Override + public List getDeptList(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return Collections.emptyList(); + } + return deptMapper.selectBatchIds(ids); + } + + @Override + public List getDeptList(DeptListReqVO reqVO) { + return deptMapper.selectList(reqVO); + } + + @Override + public List getChildDeptList(Long id) { + List children = new LinkedList<>(); + // 遍历每一层 + Collection parentIds = Collections.singleton(id); + for (int i = 0; i < Short.MAX_VALUE; i++) { // 使用 Short.MAX_VALUE 避免 bug 场景下,存在死循环 + // 查询当前层,所有的子部门 + List depts = deptMapper.selectListByParentId(parentIds); + // 1. 如果没有子部门,则结束遍历 + if (CollUtil.isEmpty(depts)) { + break; + } + // 2. 如果有子部门,继续遍历 + children.addAll(depts); + parentIds = convertSet(depts, DeptDO::getId); + } + return children; + } + + @Override + @DataPermission(enable = false) // 禁用数据权限,避免简历不正确的缓存 + @Cacheable(cacheNames = RedisKeyConstants.DEPT_CHILDREN_ID_LIST, key = "#id") + public Set getChildDeptIdListFromCache(Long id) { + List children = getChildDeptList(id); + return convertSet(children, DeptDO::getId); + } + + @Override + public void validateDeptList(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return; + } + // 获得科室信息 + Map deptMap = getDeptMap(ids); + // 校验 + ids.forEach(id -> { + DeptDO dept = deptMap.get(id); + if (dept == null) { + throw exception(DEPT_NOT_FOUND); + } + if (!CommonStatusEnum.ENABLE.getStatus().equals(dept.getStatus())) { + throw exception(DEPT_NOT_ENABLE, dept.getName()); + } + }); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dept/PostService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dept/PostService.java new file mode 100644 index 0000000..f10d114 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dept/PostService.java @@ -0,0 +1,98 @@ +package com.win.module.system.service.dept; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.dept.vo.post.PostCreateReqVO; +import com.win.module.system.controller.dept.vo.post.PostExportReqVO; +import com.win.module.system.controller.dept.vo.post.PostPageReqVO; +import com.win.module.system.controller.dept.vo.post.PostUpdateReqVO; +import com.win.module.system.dal.dataobject.dept.PostDO; +import org.springframework.lang.Nullable; + +import java.util.Collection; +import java.util.List; + +import static com.win.framework.common.util.collection.SetUtils.asSet; + +/** + * 岗位 Service 接口 + * + * @author 闻荫源码 + */ +public interface PostService { + + /** + * 创建岗位 + * + * @param reqVO 岗位信息 + * @return 岗位编号 + */ + Long createPost(PostCreateReqVO reqVO); + + /** + * 更新岗位 + * + * @param reqVO 岗位信息 + */ + void updatePost(PostUpdateReqVO reqVO); + + /** + * 删除岗位信息 + * + * @param id 岗位编号 + */ + void deletePost(Long id); + + /** + * 获得岗位列表 + * + * @param ids 岗位编号数组。如果为空,不进行筛选 + * @return 部门列表 + */ + default List getPostList(@Nullable Collection ids) { + return getPostList(ids, asSet(CommonStatusEnum.ENABLE.getStatus(), CommonStatusEnum.DISABLE.getStatus())); + } + + /** + * 获得符合条件的岗位列表 + * + * @param ids 岗位编号数组。如果为空,不进行筛选 + * @param statuses 状态数组。如果为空,不进行筛选 + * @return 部门列表 + */ + List getPostList(@Nullable Collection ids, @Nullable Collection statuses); + + /** + * 获得岗位分页列表 + * + * @param reqVO 分页条件 + * @return 部门分页列表 + */ + PageResult getPostPage(PostPageReqVO reqVO); + + /** + * 获得岗位列表 + * + * @param reqVO 查询条件 + * @return 部门列表 + */ + List getPostList(PostExportReqVO reqVO); + + /** + * 获得岗位信息 + * + * @param id 岗位编号 + * @return 岗位信息 + */ + PostDO getPost(Long id); + + /** + * 校验岗位们是否有效。如下情况,视为无效: + * 1. 岗位编号不存在 + * 2. 岗位被禁用 + * + * @param ids 岗位编号数组 + */ + void validatePostList(Collection ids); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dept/PostServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dept/PostServiceImpl.java new file mode 100644 index 0000000..2055ed3 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dept/PostServiceImpl.java @@ -0,0 +1,151 @@ +package com.win.module.system.service.dept; + +import cn.hutool.core.collection.CollUtil; +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.dept.vo.post.PostCreateReqVO; +import com.win.module.system.controller.dept.vo.post.PostExportReqVO; +import com.win.module.system.controller.dept.vo.post.PostPageReqVO; +import com.win.module.system.controller.dept.vo.post.PostUpdateReqVO; +import com.win.module.system.convert.dept.PostConvert; +import com.win.module.system.dal.dataobject.dept.PostDO; +import com.win.module.system.dal.mysql.dept.PostMapper; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.framework.common.util.collection.CollectionUtils.convertMap; +import static com.win.module.system.enums.ErrorCodeConstants.*; + +/** + * 岗位 Service 实现类 + * + * @author 闻荫源码 + */ +@Service +@Validated +public class PostServiceImpl implements PostService { + + @Resource + private PostMapper postMapper; + + @Override + public Long createPost(PostCreateReqVO reqVO) { + // 校验正确性 + validatePostForCreateOrUpdate(null, reqVO.getName(), reqVO.getCode()); + + // 插入岗位 + PostDO post = PostConvert.INSTANCE.convert(reqVO); + postMapper.insert(post); + return post.getId(); + } + + @Override + public void updatePost(PostUpdateReqVO reqVO) { + // 校验正确性 + validatePostForCreateOrUpdate(reqVO.getId(), reqVO.getName(), reqVO.getCode()); + + // 更新岗位 + PostDO updateObj = PostConvert.INSTANCE.convert(reqVO); + postMapper.updateById(updateObj); + } + + @Override + public void deletePost(Long id) { + // 校验是否存在 + validatePostExists(id); + // 删除部门 + postMapper.deleteById(id); + } + + private void validatePostForCreateOrUpdate(Long id, String name, String code) { + // 校验自己存在 + validatePostExists(id); + // 校验岗位名的唯一性 + validatePostNameUnique(id, name); + // 校验岗位编码的唯一性 + validatePostCodeUnique(id, code); + } + + private void validatePostNameUnique(Long id, String name) { + PostDO post = postMapper.selectByName(name); + if (post == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的岗位 + if (id == null) { + throw exception(POST_NAME_DUPLICATE); + } + if (!post.getId().equals(id)) { + throw exception(POST_NAME_DUPLICATE); + } + } + + private void validatePostCodeUnique(Long id, String code) { + PostDO post = postMapper.selectByCode(code); + if (post == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的岗位 + if (id == null) { + throw exception(POST_CODE_DUPLICATE); + } + if (!post.getId().equals(id)) { + throw exception(POST_CODE_DUPLICATE); + } + } + + private void validatePostExists(Long id) { + if (id == null) { + return; + } + if (postMapper.selectById(id) == null) { + throw exception(POST_NOT_FOUND); + } + } + + @Override + public List getPostList(Collection ids, Collection statuses) { + return postMapper.selectList(ids, statuses); + } + + @Override + public PageResult getPostPage(PostPageReqVO reqVO) { + return postMapper.selectPage(reqVO); + } + + @Override + public List getPostList(PostExportReqVO reqVO) { + return postMapper.selectList(reqVO); + } + + @Override + public PostDO getPost(Long id) { + return postMapper.selectById(id); + } + + @Override + public void validatePostList(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return; + } + // 获得岗位信息 + List posts = postMapper.selectBatchIds(ids); + Map postMap = convertMap(posts, PostDO::getId); + // 校验 + ids.forEach(id -> { + PostDO post = postMap.get(id); + if (post == null) { + throw exception(POST_NOT_FOUND); + } + if (!CommonStatusEnum.ENABLE.getStatus().equals(post.getStatus())) { + throw exception(POST_NOT_ENABLE, post.getName()); + } + }); + } +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dict/DictDataService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dict/DictDataService.java new file mode 100644 index 0000000..2cb0eb6 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dict/DictDataService.java @@ -0,0 +1,110 @@ +package com.win.module.system.service.dict; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.dict.vo.data.DictDataCreateReqVO; +import com.win.module.system.controller.dict.vo.data.DictDataExportReqVO; +import com.win.module.system.controller.dict.vo.data.DictDataPageReqVO; +import com.win.module.system.controller.dict.vo.data.DictDataUpdateReqVO; +import com.win.module.system.dal.dataobject.dict.DictDataDO; + +import java.util.Collection; +import java.util.List; + +/** + * 字典数据 Service 接口 + * + * @author ruoyi + */ +public interface DictDataService { + + /** + * 创建字典数据 + * + * @param reqVO 字典数据信息 + * @return 字典数据编号 + */ + Long createDictData(DictDataCreateReqVO reqVO); + + /** + * 更新字典数据 + * + * @param reqVO 字典数据信息 + */ + void updateDictData(DictDataUpdateReqVO reqVO); + + /** + * 删除字典数据 + * + * @param id 字典数据编号 + */ + void deleteDictData(Long id); + + /** + * 获得字典数据列表 + * + * @return 字典数据全列表 + */ + List getDictDataList(); + + /** + * 获得字典数据分页列表 + * + * @param reqVO 分页请求 + * @return 字典数据分页列表 + */ + PageResult getDictDataPage(DictDataPageReqVO reqVO); + + /** + * 获得字典数据列表 + * + * @param reqVO 列表请求 + * @return 字典数据列表 + */ + List getDictDataList(DictDataExportReqVO reqVO); + + /** + * 获得字典数据详情 + * + * @param id 字典数据编号 + * @return 字典数据 + */ + DictDataDO getDictData(Long id); + + /** + * 获得指定字典类型的数据数量 + * + * @param dictType 字典类型 + * @return 数据数量 + */ + long countByDictType(String dictType); + + /** + * 校验字典数据们是否有效。如下情况,视为无效: + * 1. 字典数据不存在 + * 2. 字典数据被禁用 + * + * @param dictType 字典类型 + * @param values 字典数据值的数组 + */ + void validateDictDataList(String dictType, Collection values); + + /** + * 获得指定的字典数据 + * + * @param dictType 字典类型 + * @param value 字典数据值 + * @return 字典数据 + */ + DictDataDO getDictData(String dictType, String value); + + /** + * 解析获得指定的字典数据,从缓存中 + * + * @param dictType 字典类型 + * @param label 字典数据标签 + * @return 字典数据 + */ + DictDataDO parseDictData(String dictType, String label); + + DictDataDO selectDictTypeAndLabel(String ptype, String plabel); +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dict/DictDataServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dict/DictDataServiceImpl.java new file mode 100644 index 0000000..843c819 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dict/DictDataServiceImpl.java @@ -0,0 +1,209 @@ +package com.win.module.system.service.dict; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.exceptions.UtilException; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.collection.CollectionUtils; +import com.win.module.system.controller.dict.vo.data.DictDataCreateReqVO; +import com.win.module.system.controller.dict.vo.data.DictDataExportReqVO; +import com.win.module.system.controller.dict.vo.data.DictDataPageReqVO; +import com.win.module.system.controller.dict.vo.data.DictDataUpdateReqVO; +import com.win.module.system.convert.dict.DictDataConvert; +import com.win.module.system.dal.dataobject.dict.DictDataDO; +import com.win.module.system.dal.dataobject.dict.DictTypeDO; +import com.win.module.system.dal.mysql.dict.DictDataMapper; +import com.google.common.annotations.VisibleForTesting; +import com.win.module.system.dal.mysql.dict.DictTypeMapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.Comparator; +import java.util.List; +import java.util.Map; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.system.enums.ErrorCodeConstants.*; + +/** + * 字典数据 Service 实现类 + * + * @author ruoyi + */ +@Service +@Slf4j +public class DictDataServiceImpl implements DictDataService { + + @Resource + private DictTypeMapper dictTypeMapper; + + /** + * 排序 dictType > sort + */ + private static final Comparator COMPARATOR_TYPE_AND_SORT = Comparator + .comparing(DictDataDO::getDictType) + .thenComparingInt(DictDataDO::getSort); + + @Resource + private DictTypeService dictTypeService; + + @Resource + private DictDataMapper dictDataMapper; + + @Override + public List getDictDataList() { + List list = dictDataMapper.selectList(); + list.sort(COMPARATOR_TYPE_AND_SORT); + return list; + } + + @Override + public PageResult getDictDataPage(DictDataPageReqVO reqVO) { + return dictDataMapper.selectPage(reqVO); + } + + @Override + public List getDictDataList(DictDataExportReqVO reqVO) { + List list = dictDataMapper.selectList(reqVO); + list.sort(COMPARATOR_TYPE_AND_SORT); + return list; + } + + @Override + public DictDataDO getDictData(Long id) { + return dictDataMapper.selectById(id); + } + + @Override + public Long createDictData(DictDataCreateReqVO reqVO) { + // 校验正确性 + validateDictDataForCreateOrUpdate(null, reqVO.getValue(), reqVO.getDictType()); + + // 插入字典类型 + DictDataDO dictData = DictDataConvert.INSTANCE.convert(reqVO); + dictDataMapper.insert(dictData); + return dictData.getId(); + } + + @Override + public void updateDictData(DictDataUpdateReqVO reqVO) { + // 校验正确性 + validateDictDataForCreateOrUpdate(reqVO.getId(), reqVO.getValue(), reqVO.getDictType()); + + // 更新字典类型 + DictDataDO updateObj = DictDataConvert.INSTANCE.convert(reqVO); + dictDataMapper.updateById(updateObj); + } + + @Override + public void deleteDictData(Long id) { + // 校验是否存在 + validateDictDataExists(id); + + // 删除字典数据 + dictDataMapper.deleteById(id); + } + + @Override + public long countByDictType(String dictType) { + return dictDataMapper.selectCountByDictType(dictType); + } + + private void validateDictDataForCreateOrUpdate(Long id, String value, String dictType) { + // 校验自己存在 + validateDictDataExists(id); + // 校验字典类型有效 + validateDictTypeExists(dictType); + // 校验字典数据的值的唯一性 + validateDictDataValueUnique(id, dictType, value); + } + + @VisibleForTesting + public void validateDictDataValueUnique(Long id, String dictType, String value) { + DictDataDO dictData = dictDataMapper.selectByDictTypeAndValue(dictType, value); + if (dictData == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的字典数据 + if (id == null) { + throw exception(DICT_DATA_VALUE_DUPLICATE); + } + if (!dictData.getId().equals(id)) { + throw exception(DICT_DATA_VALUE_DUPLICATE); + } + } + + @VisibleForTesting + public void validateDictDataExists(Long id) { + if (id == null) { + return; + } + DictDataDO dictData = dictDataMapper.selectById(id); + if (dictData == null) { + throw exception(DICT_DATA_NOT_EXISTS); + } + } + + @VisibleForTesting + public void validateDictTypeExists(String type) { + DictTypeDO dictType = dictTypeService.getDictType(type); + if (dictType == null) { + throw exception(DICT_TYPE_NOT_EXISTS); + } + if (!CommonStatusEnum.ENABLE.getStatus().equals(dictType.getStatus())) { + throw exception(DICT_TYPE_NOT_ENABLE); + } + } + + @Override + public void validateDictDataList(String dictType, Collection values) { + if (CollUtil.isEmpty(values)) { + return; + } + Map dictDataMap = CollectionUtils.convertMap( + dictDataMapper.selectByDictTypeAndValues(dictType, values), DictDataDO::getValue); + // 校验 + values.forEach(value -> { + DictDataDO dictData = dictDataMap.get(value); + if (dictData == null) { + throw exception(DICT_DATA_NOT_EXISTS); + } + if (!CommonStatusEnum.ENABLE.getStatus().equals(dictData.getStatus())) { + throw exception(DICT_DATA_NOT_ENABLE, dictData.getLabel()); + } + }); + } + + @Override + public DictDataDO getDictData(String dictType, String value) { + return dictDataMapper.selectByDictTypeAndValue(dictType, value); + } + + @Override + public DictDataDO parseDictData(String dictType, String label) { + return dictDataMapper.selectByDictTypeAndLabel(dictType, label); + } + //调用公共方法 查询字典项 + @Override + public DictDataDO selectDictTypeAndLabel(String ptype,String plabel) { + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("type",ptype); + DictTypeDO dictTypeDO = dictTypeMapper.selectOne(queryWrapper); + if(dictTypeDO != null && 0 == dictTypeDO.getStatus()){ + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("dict_type",ptype); + queryWrapper1.eq("label",plabel); + DictDataDO dictDataDO = dictDataMapper.selectOne(queryWrapper1); + if(dictDataDO != null && 0 == dictDataDO.getStatus()){ + return dictDataDO; + }else { + throw new UtilException( "字典类型" + ptype + "的数据" + plabel + "无效"); + } + }else { + throw new UtilException( "字典类型" + ptype + "无效"); + } + } +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dict/DictTypeService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dict/DictTypeService.java new file mode 100644 index 0000000..d40a427 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dict/DictTypeService.java @@ -0,0 +1,80 @@ +package com.win.module.system.service.dict; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.dict.vo.type.DictTypeCreateReqVO; +import com.win.module.system.controller.dict.vo.type.DictTypeExportReqVO; +import com.win.module.system.controller.dict.vo.type.DictTypePageReqVO; +import com.win.module.system.controller.dict.vo.type.DictTypeUpdateReqVO; +import com.win.module.system.dal.dataobject.dict.DictTypeDO; + +import java.util.List; + +/** + * 字典类型 Service 接口 + * + * @author 闻荫源码 + */ +public interface DictTypeService { + + /** + * 创建字典类型 + * + * @param reqVO 字典类型信息 + * @return 字典类型编号 + */ + Long createDictType(DictTypeCreateReqVO reqVO); + + /** + * 更新字典类型 + * + * @param reqVO 字典类型信息 + */ + void updateDictType(DictTypeUpdateReqVO reqVO); + + /** + * 删除字典类型 + * + * @param id 字典类型编号 + */ + void deleteDictType(Long id); + + /** + * 获得字典类型分页列表 + * + * @param reqVO 分页请求 + * @return 字典类型分页列表 + */ + PageResult getDictTypePage(DictTypePageReqVO reqVO); + + /** + * 获得字典类型列表 + * + * @param reqVO 列表请求 + * @return 字典类型列表 + */ + List getDictTypeList(DictTypeExportReqVO reqVO); + + /** + * 获得字典类型详情 + * + * @param id 字典类型编号 + * @return 字典类型 + */ + DictTypeDO getDictType(Long id); + + /** + * 获得字典类型详情 + * + * @param type 字典类型 + * @return 字典类型详情 + */ + DictTypeDO getDictType(String type); + + /** + * 获得全部字典类型列表 + * + * @return 字典类型列表 + */ + List getDictTypeList(); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dict/DictTypeServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dict/DictTypeServiceImpl.java new file mode 100644 index 0000000..d605e9c --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dict/DictTypeServiceImpl.java @@ -0,0 +1,150 @@ +package com.win.module.system.service.dict; + +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.date.LocalDateTimeUtils; +import com.win.module.system.controller.dict.vo.type.DictTypeCreateReqVO; +import com.win.module.system.controller.dict.vo.type.DictTypeExportReqVO; +import com.win.module.system.controller.dict.vo.type.DictTypePageReqVO; +import com.win.module.system.controller.dict.vo.type.DictTypeUpdateReqVO; +import com.win.module.system.convert.dict.DictTypeConvert; +import com.win.module.system.dal.dataobject.dict.DictTypeDO; +import com.win.module.system.dal.mysql.dict.DictTypeMapper; +import com.google.common.annotations.VisibleForTesting; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.util.List; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.system.enums.ErrorCodeConstants.*; + +/** + * 字典类型 Service 实现类 + * + * @author 闻荫源码 + */ +@Service +public class DictTypeServiceImpl implements DictTypeService { + + @Resource + private DictDataService dictDataService; + + @Resource + private DictTypeMapper dictTypeMapper; + + @Override + public PageResult getDictTypePage(DictTypePageReqVO reqVO) { + return dictTypeMapper.selectPage(reqVO); + } + + @Override + public List getDictTypeList(DictTypeExportReqVO reqVO) { + return dictTypeMapper.selectList(reqVO); + } + + @Override + public DictTypeDO getDictType(Long id) { + return dictTypeMapper.selectById(id); + } + + @Override + public DictTypeDO getDictType(String type) { + return dictTypeMapper.selectByType(type); + } + + @Override + public Long createDictType(DictTypeCreateReqVO reqVO) { + // 校验正确性 + validateDictTypeForCreateOrUpdate(null, reqVO.getName(), reqVO.getType()); + + // 插入字典类型 + DictTypeDO dictType = DictTypeConvert.INSTANCE.convert(reqVO) + .setDeletedTime(LocalDateTimeUtils.EMPTY); // 唯一索引,避免 null 值 + dictTypeMapper.insert(dictType); + return dictType.getId(); + } + + @Override + public void updateDictType(DictTypeUpdateReqVO reqVO) { + // 校验正确性 + validateDictTypeForCreateOrUpdate(reqVO.getId(), reqVO.getName(), null); + + // 更新字典类型 + DictTypeDO updateObj = DictTypeConvert.INSTANCE.convert(reqVO); + dictTypeMapper.updateById(updateObj); + } + + @Override + public void deleteDictType(Long id) { + // 校验是否存在 + DictTypeDO dictType = validateDictTypeExists(id); + // 校验是否有字典数据 + if (dictDataService.countByDictType(dictType.getType()) > 0) { + throw exception(DICT_TYPE_HAS_CHILDREN); + } + // 删除字典类型 + dictTypeMapper.updateToDelete(id, LocalDateTime.now()); + } + + @Override + public List getDictTypeList() { + return dictTypeMapper.selectList(); + } + + private void validateDictTypeForCreateOrUpdate(Long id, String name, String type) { + // 校验自己存在 + validateDictTypeExists(id); + // 校验字典类型的名字的唯一性 + validateDictTypeNameUnique(id, name); + // 校验字典类型的类型的唯一性 + validateDictTypeUnique(id, type); + } + + @VisibleForTesting + void validateDictTypeNameUnique(Long id, String name) { + DictTypeDO dictType = dictTypeMapper.selectByName(name); + if (dictType == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的字典类型 + if (id == null) { + throw exception(DICT_TYPE_NAME_DUPLICATE); + } + if (!dictType.getId().equals(id)) { + throw exception(DICT_TYPE_NAME_DUPLICATE); + } + } + + @VisibleForTesting + void validateDictTypeUnique(Long id, String type) { + if (StrUtil.isEmpty(type)) { + return; + } + DictTypeDO dictType = dictTypeMapper.selectByType(type); + if (dictType == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的字典类型 + if (id == null) { + throw exception(DICT_TYPE_TYPE_DUPLICATE); + } + if (!dictType.getId().equals(id)) { + throw exception(DICT_TYPE_TYPE_DUPLICATE); + } + } + + @VisibleForTesting + DictTypeDO validateDictTypeExists(Long id) { + if (id == null) { + return null; + } + DictTypeDO dictType = dictTypeMapper.selectById(id); + if (dictType == null) { + throw exception(DICT_TYPE_NOT_EXISTS); + } + return dictType; + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/errorcode/ErrorCodeService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/errorcode/ErrorCodeService.java new file mode 100644 index 0000000..721dc36 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/errorcode/ErrorCodeService.java @@ -0,0 +1,87 @@ +package com.win.module.system.service.errorcode; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.api.errorcode.dto.ErrorCodeAutoGenerateReqDTO; +import com.win.module.system.api.errorcode.dto.ErrorCodeRespDTO; +import com.win.module.system.controller.errorcode.vo.ErrorCodeCreateReqVO; +import com.win.module.system.controller.errorcode.vo.ErrorCodeExportReqVO; +import com.win.module.system.controller.errorcode.vo.ErrorCodePageReqVO; +import com.win.module.system.controller.errorcode.vo.ErrorCodeUpdateReqVO; +import com.win.module.system.dal.dataobject.errorcode.ErrorCodeDO; + +import javax.validation.Valid; +import java.time.LocalDateTime; +import java.util.List; + +/** + * 错误码 Service 接口 + * + * @author 闻荫源码 + */ +public interface ErrorCodeService { + + /** + * 自动创建错误码 + * + * @param autoGenerateDTOs 错误码信息 + */ + void autoGenerateErrorCodes(@Valid List autoGenerateDTOs); + + /** + * 增量获得错误码数组 + * + * 如果 minUpdateTime 为空时,则获取所有错误码 + * + * @param applicationName 应用名 + * @param minUpdateTime 最小更新时间 + * @return 错误码数组 + */ + List getErrorCodeList(String applicationName, LocalDateTime minUpdateTime); + + /** + * 创建错误码 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createErrorCode(@Valid ErrorCodeCreateReqVO createReqVO); + + /** + * 更新错误码 + * + * @param updateReqVO 更新信息 + */ + void updateErrorCode(@Valid ErrorCodeUpdateReqVO updateReqVO); + + /** + * 删除错误码 + * + * @param id 编号 + */ + void deleteErrorCode(Long id); + + /** + * 获得错误码 + * + * @param id 编号 + * @return 错误码 + */ + ErrorCodeDO getErrorCode(Long id); + + /** + * 获得错误码分页 + * + * @param pageReqVO 分页查询 + * @return 错误码分页 + */ + PageResult getErrorCodePage(ErrorCodePageReqVO pageReqVO); + + /** + * 获得错误码列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 错误码列表 + */ + List getErrorCodeList(ErrorCodeExportReqVO exportReqVO); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/errorcode/ErrorCodeServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/errorcode/ErrorCodeServiceImpl.java new file mode 100644 index 0000000..d22da1b --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/errorcode/ErrorCodeServiceImpl.java @@ -0,0 +1,174 @@ +package com.win.module.system.service.errorcode; + +import cn.hutool.core.collection.CollUtil; +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.api.errorcode.dto.ErrorCodeAutoGenerateReqDTO; +import com.win.module.system.api.errorcode.dto.ErrorCodeRespDTO; +import com.win.module.system.controller.errorcode.vo.ErrorCodeCreateReqVO; +import com.win.module.system.controller.errorcode.vo.ErrorCodeExportReqVO; +import com.win.module.system.controller.errorcode.vo.ErrorCodePageReqVO; +import com.win.module.system.controller.errorcode.vo.ErrorCodeUpdateReqVO; +import com.win.module.system.convert.errorcode.ErrorCodeConvert; +import com.win.module.system.dal.dataobject.errorcode.ErrorCodeDO; +import com.win.module.system.dal.mysql.errorcode.ErrorCodeMapper; +import com.win.module.system.enums.errorcode.ErrorCodeTypeEnum; +import com.google.common.annotations.VisibleForTesting; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.framework.common.util.collection.CollectionUtils.convertMap; +import static com.win.framework.common.util.collection.CollectionUtils.convertSet; +import static com.win.module.system.enums.ErrorCodeConstants.ERROR_CODE_DUPLICATE; +import static com.win.module.system.enums.ErrorCodeConstants.ERROR_CODE_NOT_EXISTS; + +/** + * 错误码 Service 实现类 + * + * @author dlyan + */ +@Service +@Validated +@Slf4j +public class ErrorCodeServiceImpl implements ErrorCodeService { + + @Resource + private ErrorCodeMapper errorCodeMapper; + + @Override + public Long createErrorCode(ErrorCodeCreateReqVO createReqVO) { + // 校验 code 重复 + validateCodeDuplicate(createReqVO.getCode(), null); + + // 插入 + ErrorCodeDO errorCode = ErrorCodeConvert.INSTANCE.convert(createReqVO) + .setType(ErrorCodeTypeEnum.MANUAL_OPERATION.getType()); + errorCodeMapper.insert(errorCode); + // 返回 + return errorCode.getId(); + } + + @Override + public void updateErrorCode(ErrorCodeUpdateReqVO updateReqVO) { + // 校验存在 + validateErrorCodeExists(updateReqVO.getId()); + // 校验 code 重复 + validateCodeDuplicate(updateReqVO.getCode(), updateReqVO.getId()); + + // 更新 + ErrorCodeDO updateObj = ErrorCodeConvert.INSTANCE.convert(updateReqVO) + .setType(ErrorCodeTypeEnum.MANUAL_OPERATION.getType()); + errorCodeMapper.updateById(updateObj); + } + + @Override + public void deleteErrorCode(Long id) { + // 校验存在 + validateErrorCodeExists(id); + // 删除 + errorCodeMapper.deleteById(id); + } + + /** + * 校验错误码的唯一字段是否重复 + * + * 是否存在相同编码的错误码 + * + * @param code 错误码编码 + * @param id 错误码编号 + */ + @VisibleForTesting + public void validateCodeDuplicate(Integer code, Long id) { + ErrorCodeDO errorCodeDO = errorCodeMapper.selectByCode(code); + if (errorCodeDO == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的错误码 + if (id == null) { + throw exception(ERROR_CODE_DUPLICATE); + } + if (!errorCodeDO.getId().equals(id)) { + throw exception(ERROR_CODE_DUPLICATE); + } + } + + @VisibleForTesting + void validateErrorCodeExists(Long id) { + if (errorCodeMapper.selectById(id) == null) { + throw exception(ERROR_CODE_NOT_EXISTS); + } + } + + @Override + public ErrorCodeDO getErrorCode(Long id) { + return errorCodeMapper.selectById(id); + } + + @Override + public PageResult getErrorCodePage(ErrorCodePageReqVO pageReqVO) { + return errorCodeMapper.selectPage(pageReqVO); + } + + @Override + public List getErrorCodeList(ErrorCodeExportReqVO exportReqVO) { + return errorCodeMapper.selectList(exportReqVO); + } + + @Override + @Transactional + public void autoGenerateErrorCodes(List autoGenerateDTOs) { + if (CollUtil.isEmpty(autoGenerateDTOs)) { + return; + } + // 获得错误码 + List errorCodeDOs = errorCodeMapper.selectListByCodes( + convertSet(autoGenerateDTOs, ErrorCodeAutoGenerateReqDTO::getCode)); + Map errorCodeDOMap = convertMap(errorCodeDOs, ErrorCodeDO::getCode); + + // 遍历 autoGenerateBOs 数组,逐个插入或更新。考虑到每次量级不大,就不走批量了 + autoGenerateDTOs.forEach(autoGenerateDTO -> { + ErrorCodeDO errorCodeDO = errorCodeDOMap.get(autoGenerateDTO.getCode()); + // 不存在,则进行新增 + if (errorCodeDO == null) { + errorCodeDO = ErrorCodeConvert.INSTANCE.convert(autoGenerateDTO) + .setType(ErrorCodeTypeEnum.AUTO_GENERATION.getType()); + errorCodeMapper.insert(errorCodeDO); + return; + } + // 存在,则进行更新。更新有三个前置条件: + // 条件 1. 只更新自动生成的错误码,即 Type 为 ErrorCodeTypeEnum.AUTO_GENERATION + if (!ErrorCodeTypeEnum.AUTO_GENERATION.getType().equals(errorCodeDO.getType())) { + return; + } + // 条件 2. 分组 applicationName 必须匹配,避免存在错误码冲突的情况 + if (!autoGenerateDTO.getApplicationName().equals(errorCodeDO.getApplicationName())) { + log.error("[autoGenerateErrorCodes][自动创建({}/{}) 错误码失败,数据库中已经存在({}/{})]", + autoGenerateDTO.getCode(), autoGenerateDTO.getApplicationName(), + errorCodeDO.getCode(), errorCodeDO.getApplicationName()); + return; + } + // 条件 3. 错误提示语存在差异 + if (autoGenerateDTO.getMessage().equals(errorCodeDO.getMessage())) { + return; + } + // 最终匹配,进行更新 + errorCodeMapper.updateById(new ErrorCodeDO().setId(errorCodeDO.getId()).setMessage(autoGenerateDTO.getMessage())); + }); + } + + @Override + public List getErrorCodeList(String applicationName, LocalDateTime minUpdateTime) { + List errorCodeDOs = errorCodeMapper.selectListByApplicationNameAndUpdateTimeGt( + applicationName, minUpdateTime); + return ErrorCodeConvert.INSTANCE.convertList03(errorCodeDOs); + } + +} + diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/logger/LoginLogService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/logger/LoginLogService.java new file mode 100644 index 0000000..3547c1a --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/logger/LoginLogService.java @@ -0,0 +1,40 @@ +package com.win.module.system.service.logger; + +import com.win.module.system.controller.logger.vo.loginlog.LoginLogExportReqVO; +import com.win.module.system.controller.logger.vo.loginlog.LoginLogPageReqVO; +import com.win.module.system.dal.dataobject.logger.LoginLogDO; +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.api.logger.dto.LoginLogCreateReqDTO; + +import javax.validation.Valid; +import java.util.List; + +/** + * 登录日志 Service 接口 + */ +public interface LoginLogService { + + /** + * 获得登录日志分页 + * + * @param reqVO 分页条件 + * @return 登录日志分页 + */ + PageResult getLoginLogPage(LoginLogPageReqVO reqVO); + + /** + * 获得登录日志列表 + * + * @param reqVO 列表条件 + * @return 登录日志列表 + */ + List getLoginLogList(LoginLogExportReqVO reqVO); + + /** + * 创建登录日志 + * + * @param reqDTO 日志信息 + */ + void createLoginLog(@Valid LoginLogCreateReqDTO reqDTO); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/logger/LoginLogServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/logger/LoginLogServiceImpl.java new file mode 100644 index 0000000..a9dc564 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/logger/LoginLogServiceImpl.java @@ -0,0 +1,42 @@ +package com.win.module.system.service.logger; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.api.logger.dto.LoginLogCreateReqDTO; +import com.win.module.system.controller.logger.vo.loginlog.LoginLogExportReqVO; +import com.win.module.system.controller.logger.vo.loginlog.LoginLogPageReqVO; +import com.win.module.system.convert.logger.LoginLogConvert; +import com.win.module.system.dal.dataobject.logger.LoginLogDO; +import com.win.module.system.dal.mysql.logger.LoginLogMapper; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 登录日志 Service 实现 + */ +@Service +@Validated +public class LoginLogServiceImpl implements LoginLogService { + + @Resource + private LoginLogMapper loginLogMapper; + + @Override + public PageResult getLoginLogPage(LoginLogPageReqVO reqVO) { + return loginLogMapper.selectPage(reqVO); + } + + @Override + public List getLoginLogList(LoginLogExportReqVO reqVO) { + return loginLogMapper.selectList(reqVO); + } + + @Override + public void createLoginLog(LoginLogCreateReqDTO reqDTO) { + LoginLogDO loginLog = LoginLogConvert.INSTANCE.convert(reqDTO); + loginLogMapper.insert(loginLog); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/logger/OperateLogService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/logger/OperateLogService.java new file mode 100644 index 0000000..321327e --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/logger/OperateLogService.java @@ -0,0 +1,41 @@ +package com.win.module.system.service.logger; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.api.logger.dto.OperateLogCreateReqDTO; +import com.win.module.system.controller.logger.vo.operatelog.OperateLogExportReqVO; +import com.win.module.system.controller.logger.vo.operatelog.OperateLogPageReqVO; +import com.win.module.system.dal.dataobject.logger.OperateLogDO; + +import java.util.List; + +/** + * 操作日志 Service 接口 + * + * @author 闻荫源码 + */ +public interface OperateLogService { + + /** + * 记录操作日志 + * + * @param createReqDTO 操作日志请求 + */ + void createOperateLog(OperateLogCreateReqDTO createReqDTO); + + /** + * 获得操作日志分页列表 + * + * @param reqVO 分页条件 + * @return 操作日志分页列表 + */ + PageResult getOperateLogPage(OperateLogPageReqVO reqVO); + + /** + * 获得操作日志列表 + * + * @param reqVO 列表条件 + * @return 日志列表 + */ + List getOperateLogList(OperateLogExportReqVO reqVO); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/logger/OperateLogServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/logger/OperateLogServiceImpl.java new file mode 100644 index 0000000..6ced3bc --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/logger/OperateLogServiceImpl.java @@ -0,0 +1,75 @@ +package com.win.module.system.service.logger; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.string.StrUtils; +import com.win.module.system.api.logger.dto.OperateLogCreateReqDTO; +import com.win.module.system.controller.logger.vo.operatelog.OperateLogExportReqVO; +import com.win.module.system.controller.logger.vo.operatelog.OperateLogPageReqVO; +import com.win.module.system.convert.logger.OperateLogConvert; +import com.win.module.system.dal.dataobject.logger.OperateLogDO; +import com.win.module.system.dal.dataobject.user.AdminUserDO; +import com.win.module.system.dal.mysql.logger.OperateLogMapper; +import com.win.module.system.service.user.AdminUserService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +import static com.win.framework.common.util.collection.CollectionUtils.convertSet; +import static com.win.module.system.dal.dataobject.logger.OperateLogDO.JAVA_METHOD_ARGS_MAX_LENGTH; +import static com.win.module.system.dal.dataobject.logger.OperateLogDO.RESULT_MAX_LENGTH; + +@Service +@Validated +@Slf4j +public class OperateLogServiceImpl implements OperateLogService { + + @Resource + private OperateLogMapper operateLogMapper; + + @Resource + private AdminUserService userService; + + @Override + public void createOperateLog(OperateLogCreateReqDTO createReqDTO) { + OperateLogDO logDO = OperateLogConvert.INSTANCE.convert(createReqDTO); + logDO.setJavaMethodArgs(StrUtils.maxLength(logDO.getJavaMethodArgs(), JAVA_METHOD_ARGS_MAX_LENGTH)); + logDO.setResultData(StrUtils.maxLength(logDO.getResultData(), RESULT_MAX_LENGTH)); + operateLogMapper.insert(logDO); + } + + @Override + public PageResult getOperateLogPage(OperateLogPageReqVO reqVO) { + // 处理基于用户昵称的查询 + Collection userIds = null; + if (StrUtil.isNotEmpty(reqVO.getUserNickname())) { + userIds = convertSet(userService.getUserListByNickname(reqVO.getUserNickname()), AdminUserDO::getId); + if (CollUtil.isEmpty(userIds)) { + return PageResult.empty(); + } + } + // 查询分页 + return operateLogMapper.selectPage(reqVO, userIds); + } + + @Override + public List getOperateLogList(OperateLogExportReqVO reqVO) { + // 处理基于用户昵称的查询 + Collection userIds = null; + if (StrUtil.isNotEmpty(reqVO.getUserNickname())) { + userIds = convertSet(userService.getUserListByNickname(reqVO.getUserNickname()), AdminUserDO::getId); + if (CollUtil.isEmpty(userIds)) { + return Collections.emptyList(); + } + } + // 查询列表 + return operateLogMapper.selectList(reqVO, userIds); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailAccountService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailAccountService.java new file mode 100644 index 0000000..5992bcb --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailAccountService.java @@ -0,0 +1,73 @@ +package com.win.module.system.service.mail; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.mail.vo.account.MailAccountCreateReqVO; +import com.win.module.system.controller.mail.vo.account.MailAccountPageReqVO; +import com.win.module.system.controller.mail.vo.account.MailAccountUpdateReqVO; +import com.win.module.system.dal.dataobject.mail.MailAccountDO; + +import javax.validation.Valid; +import java.util.List; + +/** + * 邮箱账号 Service 接口 + * + * @author wangjingyi + * @since 2022-03-21 + */ +public interface MailAccountService { + + /** + * 创建邮箱账号 + * + * @param createReqVO 邮箱账号信息 + * @return 编号 + */ + Long createMailAccount(@Valid MailAccountCreateReqVO createReqVO); + + /** + * 修改邮箱账号 + * + * @param updateReqVO 邮箱账号信息 + */ + void updateMailAccount(@Valid MailAccountUpdateReqVO updateReqVO); + + /** + * 删除邮箱账号 + * + * @param id 编号 + */ + void deleteMailAccount(Long id); + + /** + * 获取邮箱账号信息 + * + * @param id 编号 + * @return 邮箱账号信息 + */ + MailAccountDO getMailAccount(Long id); + + /** + * 从缓存中获取邮箱账号 + * + * @param id 编号 + * @return 邮箱账号 + */ + MailAccountDO getMailAccountFromCache(Long id); + + /** + * 获取邮箱账号分页信息 + * + * @param pageReqVO 邮箱账号分页参数 + * @return 邮箱账号分页信息 + */ + PageResult getMailAccountPage(MailAccountPageReqVO pageReqVO); + + /** + * 获取邮箱数组信息 + * + * @return 邮箱账号信息数组 + */ + List getMailAccountList(); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailAccountServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailAccountServiceImpl.java new file mode 100644 index 0000000..759cf5d --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailAccountServiceImpl.java @@ -0,0 +1,101 @@ +package com.win.module.system.service.mail; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.mail.vo.account.MailAccountCreateReqVO; +import com.win.module.system.controller.mail.vo.account.MailAccountPageReqVO; +import com.win.module.system.controller.mail.vo.account.MailAccountUpdateReqVO; +import com.win.module.system.convert.mail.MailAccountConvert; +import com.win.module.system.dal.dataobject.mail.MailAccountDO; +import com.win.module.system.dal.mysql.mail.MailAccountMapper; +import com.win.module.system.dal.redis.RedisKeyConstants; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.system.enums.ErrorCodeConstants.MAIL_ACCOUNT_NOT_EXISTS; +import static com.win.module.system.enums.ErrorCodeConstants.MAIL_ACCOUNT_RELATE_TEMPLATE_EXISTS; + +/** + * 邮箱账号 Service 实现类 + * + * @author wangjingyi + * @since 2022-03-21 + */ +@Service +@Validated +@Slf4j +public class MailAccountServiceImpl implements MailAccountService { + + @Resource + private MailAccountMapper mailAccountMapper; + + @Resource + private MailTemplateService mailTemplateService; + + @Override + public Long createMailAccount(MailAccountCreateReqVO createReqVO) { + // 插入 + MailAccountDO account = MailAccountConvert.INSTANCE.convert(createReqVO); + mailAccountMapper.insert(account); + return account.getId(); + } + + @Override + @CacheEvict(value = RedisKeyConstants.MAIL_ACCOUNT, key = "#updateReqVO.id") + public void updateMailAccount(MailAccountUpdateReqVO updateReqVO) { + // 校验是否存在 + validateMailAccountExists(updateReqVO.getId()); + + // 更新 + MailAccountDO updateObj = MailAccountConvert.INSTANCE.convert(updateReqVO); + mailAccountMapper.updateById(updateObj); + } + + @Override + @CacheEvict(value = RedisKeyConstants.MAIL_ACCOUNT, key = "#id") + public void deleteMailAccount(Long id) { + // 校验是否存在账号 + validateMailAccountExists(id); + // 校验是否存在关联模版 + if (mailTemplateService.countByAccountId(id) > 0) { + throw exception(MAIL_ACCOUNT_RELATE_TEMPLATE_EXISTS); + } + + // 删除 + mailAccountMapper.deleteById(id); + } + + private void validateMailAccountExists(Long id) { + if (mailAccountMapper.selectById(id) == null) { + throw exception(MAIL_ACCOUNT_NOT_EXISTS); + } + } + + @Override + public MailAccountDO getMailAccount(Long id) { + return mailAccountMapper.selectById(id); + } + + @Override + @Cacheable(value = RedisKeyConstants.MAIL_ACCOUNT, key = "#id", unless = "#result == null") + public MailAccountDO getMailAccountFromCache(Long id) { + return getMailAccount(id); + } + + @Override + public PageResult getMailAccountPage(MailAccountPageReqVO pageReqVO) { + return mailAccountMapper.selectPage(pageReqVO); + } + + @Override + public List getMailAccountList() { + return mailAccountMapper.selectList(); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailLogService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailLogService.java new file mode 100644 index 0000000..fa0cd27 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailLogService.java @@ -0,0 +1,60 @@ +package com.win.module.system.service.mail; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.mail.vo.log.MailLogPageReqVO; +import com.win.module.system.dal.dataobject.mail.MailAccountDO; +import com.win.module.system.dal.dataobject.mail.MailLogDO; +import com.win.module.system.dal.dataobject.mail.MailTemplateDO; + +import java.util.Map; + +/** + * 邮件日志 Service 接口 + * + * @author wangjingyi + * @since 2022-03-21 + */ +public interface MailLogService { + + /** + * 邮件日志分页 + * + * @param pageVO 分页参数 + * @return 分页结果 + */ + PageResult getMailLogPage(MailLogPageReqVO pageVO); + + /** + * 获得指定编号的邮件日志 + * + * @param id 日志编号 + * @return 邮件日志 + */ + MailLogDO getMailLog(Long id); + + /** + * 创建邮件日志 + * + * @param userId 用户编码 + * @param toMail 收件人邮件 + * @param account 邮件账号信息 + * @param template 模版信息 + * @param templateContent 模版内容 + * @param templateParams 模版参数 + * @param isSend 是否发送成功 + * @return 日志编号 + */ + Long createMailLog(Long userId, String toMail, + MailAccountDO account, MailTemplateDO template , + String templateContent, Map templateParams, Boolean isSend); + + /** + * 更新邮件发送结果 + * + * @param logId 日志编号 + * @param messageId 发送后的消息编号 + * @param exception 发送异常 + */ + void updateMailSendResult(Long logId, String messageId, Exception exception); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailLogServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailLogServiceImpl.java new file mode 100644 index 0000000..cb44ea3 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailLogServiceImpl.java @@ -0,0 +1,78 @@ +package com.win.module.system.service.mail; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.mail.vo.log.MailLogPageReqVO; +import com.win.module.system.dal.dataobject.mail.MailAccountDO; +import com.win.module.system.dal.dataobject.mail.MailLogDO; +import com.win.module.system.dal.dataobject.mail.MailTemplateDO; +import com.win.module.system.dal.mysql.mail.MailLogMapper; +import com.win.module.system.enums.mail.MailSendStatusEnum; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.util.Map; +import java.util.Objects; + +import static cn.hutool.core.exceptions.ExceptionUtil.getRootCauseMessage; + +/** + * 邮件日志 Service 实现类 + * + * @author wangjingyi + * @since 2022-03-21 + */ +@Service +@Validated +public class MailLogServiceImpl implements MailLogService { + + @Resource + private MailLogMapper mailLogMapper; + + @Override + public PageResult getMailLogPage(MailLogPageReqVO pageVO) { + return mailLogMapper.selectPage(pageVO); + } + + @Override + public MailLogDO getMailLog(Long id) { + return mailLogMapper.selectById(id); + } + + @Override + public Long createMailLog(Long userId, String toMail, + MailAccountDO account, MailTemplateDO template, + String templateContent, Map templateParams, Boolean isSend) { + MailLogDO.MailLogDOBuilder logDOBuilder = MailLogDO.builder(); + // 根据是否要发送,设置状态 + logDOBuilder.sendStatus(Objects.equals(isSend, true) ? MailSendStatusEnum.INIT.getStatus() + : MailSendStatusEnum.IGNORE.getStatus()) + // 用户信息 + .userId(userId).toMail(toMail) + .accountId(account.getId()).fromMail(account.getMail()) + // 模板相关字段 + .templateId(template.getId()).templateCode(template.getCode()).templateNickname(template.getNickname()) + .templateTitle(template.getTitle()).templateContent(templateContent).templateParams(templateParams); + + // 插入数据库 + MailLogDO logDO = logDOBuilder.build(); + mailLogMapper.insert(logDO); + return logDO.getId(); + } + + @Override + public void updateMailSendResult(Long logId, String messageId, Exception exception) { + // 1. 成功 + if (exception == null) { + mailLogMapper.updateById(new MailLogDO().setId(logId).setSendTime(LocalDateTime.now()) + .setSendStatus(MailSendStatusEnum.SUCCESS.getStatus()).setSendMessageId(messageId)); + return; + } + // 2. 失败 + mailLogMapper.updateById(new MailLogDO().setId(logId).setSendTime(LocalDateTime.now()) + .setSendStatus(MailSendStatusEnum.FAILURE.getStatus()).setSendException(getRootCauseMessage(exception))); + + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailSendService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailSendService.java new file mode 100644 index 0000000..cf7c44d --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailSendService.java @@ -0,0 +1,46 @@ +package com.win.module.system.service.mail; + +import com.win.module.system.mq.message.mail.MailSendMessage; + +import java.util.Map; + +/** + * 邮件发送 Service 接口 + * + * @author wangjingyi + * @since 2022-03-21 + */ +public interface MailSendService { + + /** + * 发送单条邮件给管理后台的用户 + * + * @param mail 邮箱 + * @param userId 用户编码 + * @param templateCode 邮件模版编码 + * @param templateParams 邮件模版参数 + * @return 发送日志编号 + */ + Long sendSingleMailToAdmin(String mail, Long userId, + String templateCode, Map templateParams); + + /** + * 发送单条邮件给用户 + * + * @param mail 邮箱 + * @param userId 用户编码 + * @param templateCode 邮件模版编码 + * @param templateParams 邮件模版参数 + * @return 发送日志编号 + */ + Long sendSingleMail(String mail, Long userId, String templateCode, Map templateParams); + + /** + * 执行真正的邮件发送 + * 注意,该方法仅仅提供给 MQ Consumer 使用 + * + * @param message 邮件 + */ + void doSendMail(MailSendMessage message); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailSendServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailSendServiceImpl.java new file mode 100644 index 0000000..62d912a --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailSendServiceImpl.java @@ -0,0 +1,151 @@ +package com.win.module.system.service.mail; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.mail.MailAccount; +import cn.hutool.extra.mail.MailUtil; +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.module.system.convert.mail.MailAccountConvert; +import com.win.module.system.dal.dataobject.mail.MailAccountDO; +import com.win.module.system.dal.dataobject.mail.MailTemplateDO; +import com.win.module.system.dal.dataobject.user.AdminUserDO; +import com.win.module.system.mq.message.mail.MailSendMessage; +import com.win.module.system.mq.producer.mail.MailProducer; +import com.win.module.system.service.user.AdminUserService; +import com.google.common.annotations.VisibleForTesting; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.Map; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.system.enums.ErrorCodeConstants.*; + +/** + * 邮箱发送 Service 实现类 + * + * @author wangjingyi + * @since 2022-03-21 + */ +@Service +@Validated +@Slf4j +public class MailSendServiceImpl implements MailSendService { + + @Resource + private AdminUserService adminUserService; + + @Resource + private MailAccountService mailAccountService; + @Resource + private MailTemplateService mailTemplateService; + + @Resource + private MailLogService mailLogService; + @Resource + private MailProducer mailProducer; + + @Override + public Long sendSingleMailToAdmin(String mail, Long userId, + String templateCode, Map templateParams) { + // 如果 mail 为空,则加载用户编号对应的邮箱 + if (StrUtil.isEmpty(mail)) { + AdminUserDO user = adminUserService.getUser(userId); + if (user != null) { + mail = user.getEmail(); + } + } + // 执行发送 + return sendSingleMail(mail, userId, templateCode, templateParams); + } + + @Override + public Long sendSingleMail(String mail, Long userId, String templateCode, Map templateParams) { + // 校验邮箱模版是否合法 + MailTemplateDO template = validateMailTemplate(templateCode); + // 校验邮箱账号是否合法 + MailAccountDO account = validateMailAccount(template.getAccountId()); + + // 校验邮箱是否存在 + mail = validateMail(mail); + validateTemplateParams(template, templateParams); + + // 创建发送日志。如果模板被禁用,则不发送短信,只记录日志 + Boolean isSend = CommonStatusEnum.ENABLE.getStatus().equals(template.getStatus()); + String title = mailTemplateService.formatMailTemplateContent(template.getTitle(), templateParams); + String content = mailTemplateService.formatMailTemplateContent(template.getContent(), templateParams); + Long sendLogId = mailLogService.createMailLog(userId, mail, + account, template, content, templateParams, isSend); + // 发送 MQ 消息,异步执行发送短信 + if (isSend) { + mailProducer.sendMessage(sendLogId, mail, account.getId(), + template.getNickname(), title, content); + } + return sendLogId; + } + + @Override + public void doSendMail(MailSendMessage message) { + // 1. 创建发送账号 + MailAccountDO account = validateMailAccount(message.getAccountId()); + MailAccount mailAccount = MailAccountConvert.INSTANCE.convert(account, message.getNickname()); + // 2. 发送邮件 + try { + String messageId = MailUtil.send(mailAccount, message.getMail(), + message.getTitle(), message.getContent(),true); + // 3. 更新结果(成功) + mailLogService.updateMailSendResult(message.getLogId(), messageId, null); + } catch (Exception e) { + // 3. 更新结果(异常) + mailLogService.updateMailSendResult(message.getLogId(), null, e); + } + } + + @VisibleForTesting + MailTemplateDO validateMailTemplate(String templateCode) { + // 获得邮件模板。考虑到效率,从缓存中获取 + MailTemplateDO template = mailTemplateService.getMailTemplateByCodeFromCache(templateCode); + // 邮件模板不存在 + if (template == null) { + throw exception(MAIL_TEMPLATE_NOT_EXISTS); + } + return template; + } + + @VisibleForTesting + MailAccountDO validateMailAccount(Long accountId) { + // 获得邮箱账号。考虑到效率,从缓存中获取 + MailAccountDO account = mailAccountService.getMailAccountFromCache(accountId); + // 邮箱账号不存在 + if (account == null) { + throw exception(MAIL_ACCOUNT_NOT_EXISTS); + } + return account; + } + + @VisibleForTesting + String validateMail(String mail) { + if (StrUtil.isEmpty(mail)) { + throw exception(MAIL_SEND_MAIL_NOT_EXISTS); + } + return mail; + } + + /** + * 校验邮件参数是否确实 + * + * @param template 邮箱模板 + * @param templateParams 参数列表 + */ + @VisibleForTesting + void validateTemplateParams(MailTemplateDO template, Map templateParams) { + template.getParams().forEach(key -> { + Object value = templateParams.get(key); + if (value == null) { + throw exception(MAIL_SEND_TEMPLATE_PARAM_MISS, key); + } + }); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailTemplateService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailTemplateService.java new file mode 100644 index 0000000..7090e3f --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailTemplateService.java @@ -0,0 +1,91 @@ +package com.win.module.system.service.mail; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.mail.vo.template.MailTemplateCreateReqVO; +import com.win.module.system.controller.mail.vo.template.MailTemplatePageReqVO; +import com.win.module.system.controller.mail.vo.template.MailTemplateUpdateReqVO; +import com.win.module.system.dal.dataobject.mail.MailTemplateDO; + +import javax.validation.Valid; +import java.util.List; +import java.util.Map; + +/** + * 邮件模版 Service 接口 + * + * @author wangjingyi + * @since 2022-03-21 + */ +public interface MailTemplateService { + + /** + * 邮件模版创建 + * + * @param createReqVO 邮件信息 + * @return 编号 + */ + Long createMailTemplate(@Valid MailTemplateCreateReqVO createReqVO); + + /** + * 邮件模版修改 + * + * @param updateReqVO 邮件信息 + */ + void updateMailTemplate(@Valid MailTemplateUpdateReqVO updateReqVO); + + /** + * 邮件模版删除 + * + * @param id 编号 + */ + void deleteMailTemplate(Long id); + + /** + * 获取邮件模版 + * + * @param id 编号 + * @return 邮件模版 + */ + MailTemplateDO getMailTemplate(Long id); + + /** + * 获取邮件模版分页 + * + * @param pageReqVO 模版信息 + * @return 邮件模版分页信息 + */ + PageResult getMailTemplatePage(MailTemplatePageReqVO pageReqVO); + + /** + * 获取邮件模板数组 + * + * @return 模版数组 + */ + List getMailTemplateList(); + + /** + * 从缓存中获取邮件模版 + * + * @param code 模板编码 + * @return 邮件模板 + */ + MailTemplateDO getMailTemplateByCodeFromCache(String code); + + /** + * 邮件模版内容合成 + * + * @param content 邮件模版 + * @param params 合成参数 + * @return 格式化后的内容 + */ + String formatMailTemplateContent(String content, Map params); + + /** + * 获得指定邮件账号下的邮件模板数量 + * + * @param accountId 账号编号 + * @return 数量 + */ + long countByAccountId(Long accountId); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailTemplateServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailTemplateServiceImpl.java new file mode 100644 index 0000000..06fca18 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailTemplateServiceImpl.java @@ -0,0 +1,139 @@ +package com.win.module.system.service.mail; + +import cn.hutool.core.util.ObjUtil; +import cn.hutool.core.util.ReUtil; +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.mail.vo.template.MailTemplateCreateReqVO; +import com.win.module.system.controller.mail.vo.template.MailTemplatePageReqVO; +import com.win.module.system.controller.mail.vo.template.MailTemplateUpdateReqVO; +import com.win.module.system.convert.mail.MailTemplateConvert; +import com.win.module.system.dal.dataobject.mail.MailTemplateDO; +import com.win.module.system.dal.mysql.mail.MailTemplateMapper; +import com.win.module.system.dal.redis.RedisKeyConstants; +import com.google.common.annotations.VisibleForTesting; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.system.enums.ErrorCodeConstants.MAIL_TEMPLATE_CODE_EXISTS; +import static com.win.module.system.enums.ErrorCodeConstants.MAIL_TEMPLATE_NOT_EXISTS; + +/** + * 邮箱模版 Service 实现类 + * + * @author wangjingyi + * @since 2022-03-21 + */ +@Service +@Validated +@Slf4j +public class MailTemplateServiceImpl implements MailTemplateService { + + /** + * 正则表达式,匹配 {} 中的变量 + */ + private static final Pattern PATTERN_PARAMS = Pattern.compile("\\{(.*?)}"); + + @Resource + private MailTemplateMapper mailTemplateMapper; + + @Override + public Long createMailTemplate(MailTemplateCreateReqVO createReqVO) { + // 校验 code 是否唯一 + validateCodeUnique(null, createReqVO.getCode()); + + // 插入 + MailTemplateDO template = MailTemplateConvert.INSTANCE.convert(createReqVO) + .setParams(parseTemplateContentParams(createReqVO.getContent())); + mailTemplateMapper.insert(template); + return template.getId(); + } + + @Override + @CacheEvict(cacheNames = RedisKeyConstants.NOTIFY_TEMPLATE, + allEntries = true) // allEntries 清空所有缓存,因为可能修改到 code 字段,不好清理 + public void updateMailTemplate(@Valid MailTemplateUpdateReqVO updateReqVO) { + // 校验是否存在 + validateMailTemplateExists(updateReqVO.getId()); + // 校验 code 是否唯一 + validateCodeUnique(updateReqVO.getId(),updateReqVO.getCode()); + + // 更新 + MailTemplateDO updateObj = MailTemplateConvert.INSTANCE.convert(updateReqVO) + .setParams(parseTemplateContentParams(updateReqVO.getContent())); + mailTemplateMapper.updateById(updateObj); + } + + @VisibleForTesting + void validateCodeUnique(Long id, String code) { + MailTemplateDO template = mailTemplateMapper.selectByCode(code); + if (template == null) { + return; + } + // 存在 template 记录的情况下 + if (id == null // 新增时,说明重复 + || ObjUtil.notEqual(id, template.getId())) { // 更新时,如果 id 不一致,说明重复 + throw exception(MAIL_TEMPLATE_CODE_EXISTS); + } + } + + @Override + @CacheEvict(cacheNames = RedisKeyConstants.NOTIFY_TEMPLATE, + allEntries = true) // allEntries 清空所有缓存,因为 id 不是直接的缓存 code,不好清理 + public void deleteMailTemplate(Long id) { + // 校验是否存在 + validateMailTemplateExists(id); + + // 删除 + mailTemplateMapper.deleteById(id); + } + + private void validateMailTemplateExists(Long id) { + if (mailTemplateMapper.selectById(id) == null) { + throw exception(MAIL_TEMPLATE_NOT_EXISTS); + } + } + + @Override + public MailTemplateDO getMailTemplate(Long id) {return mailTemplateMapper.selectById(id);} + + @Override + @Cacheable(value = RedisKeyConstants.MAIL_TEMPLATE, key = "#code", unless = "#result == null") + public MailTemplateDO getMailTemplateByCodeFromCache(String code) { + return mailTemplateMapper.selectByCode(code); + } + + @Override + public PageResult getMailTemplatePage(MailTemplatePageReqVO pageReqVO) { + return mailTemplateMapper.selectPage(pageReqVO); + } + + @Override + public List getMailTemplateList() {return mailTemplateMapper.selectList();} + + @Override + public String formatMailTemplateContent(String content, Map params) { + return StrUtil.format(content, params); + } + + @VisibleForTesting + public List parseTemplateContentParams(String content) { + return ReUtil.findAllGroup1(PATTERN_PARAMS, content); + } + + @Override + public long countByAccountId(Long accountId) { + return mailTemplateMapper.selectCountByAccountId(accountId); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notice/NoticeService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notice/NoticeService.java new file mode 100644 index 0000000..7c20efd --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notice/NoticeService.java @@ -0,0 +1,52 @@ +package com.win.module.system.service.notice; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.notice.vo.NoticeCreateReqVO; +import com.win.module.system.controller.notice.vo.NoticePageReqVO; +import com.win.module.system.controller.notice.vo.NoticeUpdateReqVO; +import com.win.module.system.dal.dataobject.notice.NoticeDO; + +/** + * 通知公告 Service 接口 + */ +public interface NoticeService { + + /** + * 创建岗位公告公告 + * + * @param reqVO 岗位公告公告信息 + * @return 岗位公告公告编号 + */ + Long createNotice(NoticeCreateReqVO reqVO); + + /** + * 更新岗位公告公告 + * + * @param reqVO 岗位公告公告信息 + */ + void updateNotice(NoticeUpdateReqVO reqVO); + + /** + * 删除岗位公告公告信息 + * + * @param id 岗位公告公告编号 + */ + void deleteNotice(Long id); + + /** + * 获得岗位公告公告分页列表 + * + * @param reqVO 分页条件 + * @return 部门分页列表 + */ + PageResult getNoticePage(NoticePageReqVO reqVO); + + /** + * 获得岗位公告公告信息 + * + * @param id 岗位公告公告编号 + * @return 岗位公告公告信息 + */ + NoticeDO getNotice(Long id); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notice/NoticeServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notice/NoticeServiceImpl.java new file mode 100644 index 0000000..6e1dec3 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notice/NoticeServiceImpl.java @@ -0,0 +1,74 @@ +package com.win.module.system.service.notice; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.notice.vo.NoticeCreateReqVO; +import com.win.module.system.controller.notice.vo.NoticePageReqVO; +import com.win.module.system.controller.notice.vo.NoticeUpdateReqVO; +import com.win.module.system.convert.notice.NoticeConvert; +import com.win.module.system.dal.dataobject.notice.NoticeDO; +import com.win.module.system.dal.mysql.notice.NoticeMapper; +import com.google.common.annotations.VisibleForTesting; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.system.enums.ErrorCodeConstants.NOTICE_NOT_FOUND; + +/** + * 通知公告 Service 实现类 + * + * @author 闻荫源码 + */ +@Service +public class NoticeServiceImpl implements NoticeService { + + @Resource + private NoticeMapper noticeMapper; + + @Override + public Long createNotice(NoticeCreateReqVO reqVO) { + NoticeDO notice = NoticeConvert.INSTANCE.convert(reqVO); + noticeMapper.insert(notice); + return notice.getId(); + } + + @Override + public void updateNotice(NoticeUpdateReqVO reqVO) { + // 校验是否存在 + validateNoticeExists(reqVO.getId()); + // 更新通知公告 + NoticeDO updateObj = NoticeConvert.INSTANCE.convert(reqVO); + noticeMapper.updateById(updateObj); + } + + @Override + public void deleteNotice(Long id) { + // 校验是否存在 + validateNoticeExists(id); + // 删除通知公告 + noticeMapper.deleteById(id); + } + + @Override + public PageResult getNoticePage(NoticePageReqVO reqVO) { + return noticeMapper.selectPage(reqVO); + } + + @Override + public NoticeDO getNotice(Long id) { + return noticeMapper.selectById(id); + } + + @VisibleForTesting + public void validateNoticeExists(Long id) { + if (id == null) { + return; + } + NoticeDO notice = noticeMapper.selectById(id); + if (notice == null) { + throw exception(NOTICE_NOT_FOUND); + } + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notify/NotifyMessageService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notify/NotifyMessageService.java new file mode 100644 index 0000000..38842f3 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notify/NotifyMessageService.java @@ -0,0 +1,90 @@ +package com.win.module.system.service.notify; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.notify.vo.message.NotifyMessageMyPageReqVO; +import com.win.module.system.controller.notify.vo.message.NotifyMessagePageReqVO; +import com.win.module.system.dal.dataobject.notify.NotifyMessageDO; +import com.win.module.system.dal.dataobject.notify.NotifyTemplateDO; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 站内信 Service 接口 + * + * @author xrcoder + */ +public interface NotifyMessageService { + + /** + * 创建站内信 + * + * @param userId 用户编号 + * @param template 模版信息 + * @param templateContent 模版内容 + * @param templateParams 模版参数 + * @return 站内信编号 + */ + Long createNotifyMessage(Long userId, NotifyTemplateDO template, String templateContent, Map templateParams); + + /** + * 获得站内信分页 + * + * @param pageReqVO 分页查询 + * @return 站内信分页 + */ + PageResult getNotifyMessagePage(NotifyMessagePageReqVO pageReqVO); + + /** + * 获得【我的】站内信分页 + * + * @param pageReqVO 分页查询 + * @param userId 用户编号 + * @return 站内信分页 + */ + PageResult getMyMyNotifyMessagePage(NotifyMessageMyPageReqVO pageReqVO, Long userId); + + /** + * 获得站内信 + * + * @param id 编号 + * @return 站内信 + */ + NotifyMessageDO getNotifyMessage(Long id); + + /** + * 获得【我的】未读站内信列表 + * + * @param userId 用户编号 + * @param size 数量 + * @return 站内信列表 + */ + List getUnreadNotifyMessageList(Long userId, Integer size); + + /** + * 统计用户未读站内信条数 + * + * @param userId 用户编号 + * @return 返回未读站内信条数 + */ + Long getUnreadNotifyMessageCount(Long userId); + + /** + * 标记站内信为已读 + * + * @param ids 站内信编号集合 + * @param userId 用户编号 + * @return 更新到的条数 + */ + int updateNotifyMessageRead(Collection ids, Long userId); + + /** + * 标记所有站内信为已读 + * + * @param userId 用户编号 + * @return 更新到的条数 + */ + int updateAllNotifyMessageRead(Long userId); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notify/NotifyMessageServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notify/NotifyMessageServiceImpl.java new file mode 100644 index 0000000..a550564 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notify/NotifyMessageServiceImpl.java @@ -0,0 +1,74 @@ +package com.win.module.system.service.notify; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.notify.vo.message.NotifyMessageMyPageReqVO; +import com.win.module.system.controller.notify.vo.message.NotifyMessagePageReqVO; +import com.win.module.system.dal.dataobject.notify.NotifyMessageDO; +import com.win.module.system.dal.dataobject.notify.NotifyTemplateDO; +import com.win.module.system.dal.mysql.notify.NotifyMessageMapper; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 站内信 Service 实现类 + * + * @author xrcoder + */ +@Service +@Validated +public class NotifyMessageServiceImpl implements NotifyMessageService { + + @Resource + private NotifyMessageMapper notifyMessageMapper; + + @Override + public Long createNotifyMessage(Long userId, NotifyTemplateDO template, String templateContent, Map templateParams) { + NotifyMessageDO message = new NotifyMessageDO().setUserId(userId) + .setTemplateId(template.getId()).setTemplateCode(template.getCode()) + .setTemplateType(template.getType()).setTemplateNickname(template.getNickname()) + .setTemplateContent(templateContent).setTemplateParams(templateParams).setReadStatus(false); + notifyMessageMapper.insert(message); + return message.getId(); + } + + @Override + public PageResult getNotifyMessagePage(NotifyMessagePageReqVO pageReqVO) { + return notifyMessageMapper.selectPage(pageReqVO); + } + + @Override + public PageResult getMyMyNotifyMessagePage(NotifyMessageMyPageReqVO pageReqVO, Long userId) { + return notifyMessageMapper.selectPage(pageReqVO, userId); + } + + @Override + public NotifyMessageDO getNotifyMessage(Long id) { + return notifyMessageMapper.selectById(id); + } + + @Override + public List getUnreadNotifyMessageList(Long userId, Integer size) { + return notifyMessageMapper.selectUnreadListByUserId(userId, size); + } + + @Override + public Long getUnreadNotifyMessageCount(Long userId) { + return notifyMessageMapper.selectUnreadCountByUserId(userId); + } + + @Override + public int updateNotifyMessageRead(Collection ids, Long userId) { + return notifyMessageMapper.updateListRead(ids, userId); + } + + @Override + public int updateAllNotifyMessageRead(Long userId) { + return notifyMessageMapper.updateListRead(userId); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notify/NotifySendService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notify/NotifySendService.java new file mode 100644 index 0000000..ea1018e --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notify/NotifySendService.java @@ -0,0 +1,52 @@ +package com.win.module.system.service.notify; + +import java.util.List; +import java.util.Map; + +/** + * 站内信发送 Service 接口 + * + * @author xrcoder + */ +public interface NotifySendService { + + /** + * 发送单条站内信给管理后台的用户 + * + * 在 mobile 为空时,使用 userId 加载对应管理员的手机号 + * + * @param userId 用户编号 + * @param templateCode 短信模板编号 + * @param templateParams 短信模板参数 + * @return 发送日志编号 + */ + Long sendSingleNotifyToAdmin(Long userId, + String templateCode, Map templateParams); + /** + * 发送单条站内信给用户 APP 的用户 + * + * 在 mobile 为空时,使用 userId 加载对应会员的手机号 + * + * @param userId 用户编号 + * @param templateCode 站内信模板编号 + * @param templateParams 站内信模板参数 + * @return 发送日志编号 + */ + Long sendSingleNotifyToMember(Long userId, + String templateCode, Map templateParams); + + /** + * 发送单条站内信给用户 + * + * @param userId 用户编号 + * @param templateCode 站内信模板编号 + * @param templateParams 站内信模板参数 + * @return 发送日志编号 + */ + Long sendSingleNotify(Long userId, String templateCode, Map templateParams); + + default void sendBatchNotify(List mobiles, List userIds, String templateCode, Map templateParams) { + throw new UnsupportedOperationException("暂时不支持该操作,感兴趣可以实现该功能哟!"); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notify/NotifySendServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notify/NotifySendServiceImpl.java new file mode 100644 index 0000000..8e0acfe --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notify/NotifySendServiceImpl.java @@ -0,0 +1,85 @@ +package com.win.module.system.service.notify; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.module.system.dal.dataobject.notify.NotifyTemplateDO; +import com.google.common.annotations.VisibleForTesting; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.Map; +import java.util.Objects; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.system.enums.ErrorCodeConstants.*; + +/** + * 站内信发送 Service 实现类 + * + * @author xrcoder + */ +@Service +@Validated +@Slf4j +public class NotifySendServiceImpl implements NotifySendService { + + @Resource + private NotifyTemplateService notifyTemplateService; + + @Resource + private NotifyMessageService notifyMessageService; + + @Override + public Long sendSingleNotifyToAdmin(Long userId, String templateCode, Map templateParams) { + return sendSingleNotify(userId, templateCode, templateParams); + } + + @Override + public Long sendSingleNotifyToMember(Long userId, String templateCode, Map templateParams) { + return sendSingleNotify(userId, templateCode, templateParams); + } + + @Override + public Long sendSingleNotify(Long userId, String templateCode, Map templateParams) { + // 校验模版 + NotifyTemplateDO template = validateNotifyTemplate(templateCode); + if (Objects.equals(template.getStatus(), CommonStatusEnum.DISABLE.getStatus())) { + log.info("[sendSingleNotify][模版({})已经关闭,无法给用户({})发送]", templateCode, userId); + return null; + } + // 校验参数 + validateTemplateParams(template, templateParams); + + // 发送站内信 + String content = notifyTemplateService.formatNotifyTemplateContent(template.getContent(), templateParams); + return notifyMessageService.createNotifyMessage(userId, template, content, templateParams); + } + + @VisibleForTesting + public NotifyTemplateDO validateNotifyTemplate(String templateCode) { + // 获得站内信模板。考虑到效率,从缓存中获取 + NotifyTemplateDO template = notifyTemplateService.getNotifyTemplateByCodeFromCache(templateCode); + // 站内信模板不存在 + if (template == null) { + throw exception(NOTICE_NOT_FOUND); + } + return template; + } + + /** + * 校验站内信模版参数是否确实 + * + * @param template 邮箱模板 + * @param templateParams 参数列表 + */ + @VisibleForTesting + public void validateTemplateParams(NotifyTemplateDO template, Map templateParams) { + template.getParams().forEach(key -> { + Object value = templateParams.get(key); + if (value == null) { + throw exception(NOTIFY_SEND_TEMPLATE_PARAM_MISS, key); + } + }); + } +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notify/NotifyTemplateService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notify/NotifyTemplateService.java new file mode 100644 index 0000000..ff99ae1 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notify/NotifyTemplateService.java @@ -0,0 +1,74 @@ +package com.win.module.system.service.notify; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.notify.vo.template.NotifyTemplateCreateReqVO; +import com.win.module.system.controller.notify.vo.template.NotifyTemplatePageReqVO; +import com.win.module.system.controller.notify.vo.template.NotifyTemplateUpdateReqVO; +import com.win.module.system.dal.dataobject.notify.NotifyTemplateDO; + +import javax.validation.Valid; +import java.util.Map; + +/** + * 站内信模版 Service 接口 + * + * @author xrcoder + */ +public interface NotifyTemplateService { + + /** + * 创建站内信模版 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createNotifyTemplate(@Valid NotifyTemplateCreateReqVO createReqVO); + + /** + * 更新站内信模版 + * + * @param updateReqVO 更新信息 + */ + void updateNotifyTemplate(@Valid NotifyTemplateUpdateReqVO updateReqVO); + + /** + * 删除站内信模版 + * + * @param id 编号 + */ + void deleteNotifyTemplate(Long id); + + /** + * 获得站内信模版 + * + * @param id 编号 + * @return 站内信模版 + */ + NotifyTemplateDO getNotifyTemplate(Long id); + + /** + * 获得站内信模板,从缓存中 + * + * @param code 模板编码 + * @return 站内信模板 + */ + NotifyTemplateDO getNotifyTemplateByCodeFromCache(String code); + + /** + * 获得站内信模版分页 + * + * @param pageReqVO 分页查询 + * @return 站内信模版分页 + */ + PageResult getNotifyTemplatePage(NotifyTemplatePageReqVO pageReqVO); + + /** + * 格式化站内信内容 + * + * @param content 站内信模板的内容 + * @param params 站内信内容的参数 + * @return 格式化后的内容 + */ + String formatNotifyTemplateContent(String content, Map params); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notify/NotifyTemplateServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notify/NotifyTemplateServiceImpl.java new file mode 100644 index 0000000..6a5edb2 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notify/NotifyTemplateServiceImpl.java @@ -0,0 +1,138 @@ +package com.win.module.system.service.notify; + +import cn.hutool.core.util.ReUtil; +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.notify.vo.template.NotifyTemplateCreateReqVO; +import com.win.module.system.controller.notify.vo.template.NotifyTemplatePageReqVO; +import com.win.module.system.controller.notify.vo.template.NotifyTemplateUpdateReqVO; +import com.win.module.system.convert.notify.NotifyTemplateConvert; +import com.win.module.system.dal.dataobject.notify.NotifyTemplateDO; +import com.win.module.system.dal.mysql.notify.NotifyTemplateMapper; +import com.win.module.system.dal.redis.RedisKeyConstants; +import com.google.common.annotations.VisibleForTesting; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.system.enums.ErrorCodeConstants.NOTIFY_TEMPLATE_CODE_DUPLICATE; +import static com.win.module.system.enums.ErrorCodeConstants.NOTIFY_TEMPLATE_NOT_EXISTS; + +/** + * 站内信模版 Service 实现类 + * + * @author xrcoder + */ +@Service +@Validated +@Slf4j +public class NotifyTemplateServiceImpl implements NotifyTemplateService { + + /** + * 正则表达式,匹配 {} 中的变量 + */ + private static final Pattern PATTERN_PARAMS = Pattern.compile("\\{(.*?)}"); + + @Resource + private NotifyTemplateMapper notifyTemplateMapper; + + @Override + public Long createNotifyTemplate(NotifyTemplateCreateReqVO createReqVO) { + // 校验站内信编码是否重复 + validateNotifyTemplateCodeDuplicate(null, createReqVO.getCode()); + + // 插入 + NotifyTemplateDO notifyTemplate = NotifyTemplateConvert.INSTANCE.convert(createReqVO); + notifyTemplate.setParams(parseTemplateContentParams(notifyTemplate.getContent())); + notifyTemplateMapper.insert(notifyTemplate); + return notifyTemplate.getId(); + } + + @Override + @CacheEvict(cacheNames = RedisKeyConstants.NOTIFY_TEMPLATE, + allEntries = true) // allEntries 清空所有缓存,因为可能修改到 code 字段,不好清理 + public void updateNotifyTemplate(NotifyTemplateUpdateReqVO updateReqVO) { + // 校验存在 + validateNotifyTemplateExists(updateReqVO.getId()); + // 校验站内信编码是否重复 + validateNotifyTemplateCodeDuplicate(updateReqVO.getId(), updateReqVO.getCode()); + + // 更新 + NotifyTemplateDO updateObj = NotifyTemplateConvert.INSTANCE.convert(updateReqVO); + updateObj.setParams(parseTemplateContentParams(updateObj.getContent())); + notifyTemplateMapper.updateById(updateObj); + } + + @VisibleForTesting + public List parseTemplateContentParams(String content) { + return ReUtil.findAllGroup1(PATTERN_PARAMS, content); + } + + @Override + @CacheEvict(cacheNames = RedisKeyConstants.NOTIFY_TEMPLATE, + allEntries = true) // allEntries 清空所有缓存,因为 id 不是直接的缓存 code,不好清理 + public void deleteNotifyTemplate(Long id) { + // 校验存在 + validateNotifyTemplateExists(id); + // 删除 + notifyTemplateMapper.deleteById(id); + } + + private void validateNotifyTemplateExists(Long id) { + if (notifyTemplateMapper.selectById(id) == null) { + throw exception(NOTIFY_TEMPLATE_NOT_EXISTS); + } + } + + @Override + public NotifyTemplateDO getNotifyTemplate(Long id) { + return notifyTemplateMapper.selectById(id); + } + + @Override + @Cacheable(cacheNames = RedisKeyConstants.NOTIFY_TEMPLATE, key = "#code", + unless = "#result == null") + public NotifyTemplateDO getNotifyTemplateByCodeFromCache(String code) { + return notifyTemplateMapper.selectByCode(code); + } + + @Override + public PageResult getNotifyTemplatePage(NotifyTemplatePageReqVO pageReqVO) { + return notifyTemplateMapper.selectPage(pageReqVO); + } + + @VisibleForTesting + void validateNotifyTemplateCodeDuplicate(Long id, String code) { + NotifyTemplateDO template = notifyTemplateMapper.selectByCode(code); + if (template == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的字典类型 + if (id == null) { + throw exception(NOTIFY_TEMPLATE_CODE_DUPLICATE, code); + } + if (!template.getId().equals(id)) { + throw exception(NOTIFY_TEMPLATE_CODE_DUPLICATE, code); + } + } + + /** + * 格式化站内信内容 + * + * @param content 站内信模板的内容 + * @param params 站内信内容的参数 + * @return 格式化后的内容 + */ + @Override + public String formatNotifyTemplateContent(String content, Map params) { + return StrUtil.format(content, params); + } +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2ApproveService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2ApproveService.java new file mode 100644 index 0000000..3656439 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2ApproveService.java @@ -0,0 +1,49 @@ +package com.win.module.system.service.oauth2; + +import com.win.module.system.dal.dataobject.oauth2.OAuth2ApproveDO; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * OAuth2 批准 Service 接口 + * + * 从功能上,和 Spring Security OAuth 的 ApprovalStoreUserApprovalHandler 的功能,记录用户针对指定客户端的授权,减少手动确定。 + * + * @author 闻荫源码 + */ +public interface OAuth2ApproveService { + + /** + * 获得指定用户,针对指定客户端的指定授权,是否通过 + * + * 参考 ApprovalStoreUserApprovalHandler 的 checkForPreApproval 方法 + * + * @param userId 用户编号 + * @param clientId 客户端编号 + * @param requestedScopes 授权范围 + * @return 是否授权通过 + */ + boolean checkForPreApproval(Long userId, String clientId, Collection requestedScopes); + + /** + * 在用户发起批准时,基于 scopes 的选项,计算最终是否通过 + * + * @param userId 用户编号 + * @param clientId 客户端编号 + * @param requestedScopes 授权范围 + * @return 是否授权通过 + */ + boolean updateAfterApproval(Long userId, String clientId, Map requestedScopes); + + /** + * 获得用户的批准列表,排除已过期的 + * + * @param userId 用户编号 + * @param clientId 客户端编号 + * @return 是否授权通过 + */ + List getApproveList(Long userId, String clientId); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2ApproveServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2ApproveServiceImpl.java new file mode 100644 index 0000000..43d5516 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2ApproveServiceImpl.java @@ -0,0 +1,100 @@ +package com.win.module.system.service.oauth2; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Assert; +import com.win.framework.common.util.date.DateUtils; +import com.win.module.system.dal.dataobject.oauth2.OAuth2ApproveDO; +import com.win.module.system.dal.dataobject.oauth2.OAuth2ClientDO; +import com.win.module.system.dal.mysql.oauth2.OAuth2ApproveMapper; +import com.google.common.annotations.VisibleForTesting; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.util.*; + +import static com.win.framework.common.util.collection.CollectionUtils.convertSet; + +/** + * OAuth2 批准 Service 实现类 + * + * @author 闻荫源码 + */ +@Service +@Validated +public class OAuth2ApproveServiceImpl implements OAuth2ApproveService { + + /** + * 批准的过期时间,默认 30 天 + */ + private static final Integer TIMEOUT = 30 * 24 * 60 * 60; // 单位:秒 + + @Resource + private OAuth2ClientService oauth2ClientService; + + @Resource + private OAuth2ApproveMapper oauth2ApproveMapper; + + @Override + @Transactional + public boolean checkForPreApproval(Long userId, String clientId, Collection requestedScopes) { + // 第一步,基于 Client 的自动授权计算,如果 scopes 都在自动授权中,则返回 true 通过 + OAuth2ClientDO clientDO = oauth2ClientService.validOAuthClientFromCache(clientId); + Assert.notNull(clientDO, "客户端不能为空"); // 防御性编程 + if (CollUtil.containsAll(clientDO.getAutoApproveScopes(), requestedScopes)) { + // gh-877 - if all scopes are auto approved, approvals still need to be added to the approval store. + LocalDateTime expireTime = LocalDateTime.now().plusSeconds(TIMEOUT); + for (String scope : requestedScopes) { + saveApprove(userId, clientId, scope, true, expireTime); + } + return true; + } + + // 第二步,算上用户已经批准的授权。如果 scopes 都包含,则返回 true + List approveDOs = getApproveList(userId, clientId); + Set scopes = convertSet(approveDOs, OAuth2ApproveDO::getScope, + OAuth2ApproveDO::getApproved); // 只保留未过期的 + 同意的 + return CollUtil.containsAll(scopes, requestedScopes); + } + + @Override + @Transactional + public boolean updateAfterApproval(Long userId, String clientId, Map requestedScopes) { + // 如果 requestedScopes 为空,说明没有要求,则返回 true 通过 + if (CollUtil.isEmpty(requestedScopes)) { + return true; + } + + // 更新批准的信息 + boolean success = false; // 需要至少有一个同意 + LocalDateTime expireTime = LocalDateTime.now().plusSeconds(TIMEOUT); + for (Map.Entry entry : requestedScopes.entrySet()) { + if (entry.getValue()) { + success = true; + } + saveApprove(userId, clientId, entry.getKey(), entry.getValue(), expireTime); + } + return success; + } + + @Override + public List getApproveList(Long userId, String clientId) { + List approveDOs = oauth2ApproveMapper.selectListByUserIdAndClientId(userId, clientId); + approveDOs.removeIf(o -> DateUtils.isExpired(o.getExpiresTime())); + return approveDOs; + } + + @VisibleForTesting + void saveApprove(Long userId, String clientId, String scope, Boolean approved, LocalDateTime expireTime) { + // 先更新 + OAuth2ApproveDO approveDO = new OAuth2ApproveDO().setUserId(userId).setClientId(clientId).setScope(scope).setApproved(approved).setExpiresTime(expireTime); + if (oauth2ApproveMapper.update(approveDO) == 1) { + return; + } + // 失败,则说明不存在,进行更新 + oauth2ApproveMapper.insert(approveDO); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2ClientService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2ClientService.java new file mode 100644 index 0000000..1dd2da8 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2ClientService.java @@ -0,0 +1,91 @@ +package com.win.module.system.service.oauth2; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.oauth2.vo.client.OAuth2ClientCreateReqVO; +import com.win.module.system.controller.oauth2.vo.client.OAuth2ClientPageReqVO; +import com.win.module.system.controller.oauth2.vo.client.OAuth2ClientUpdateReqVO; +import com.win.module.system.dal.dataobject.oauth2.OAuth2ClientDO; + +import javax.validation.Valid; +import java.util.Collection; + +/** + * OAuth2.0 Client Service 接口 + * + * 从功能上,和 JdbcClientDetailsService 的功能,提供客户端的操作 + * + * @author 闻荫源码 + */ +public interface OAuth2ClientService { + + /** + * 创建 OAuth2 客户端 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createOAuth2Client(@Valid OAuth2ClientCreateReqVO createReqVO); + + /** + * 更新 OAuth2 客户端 + * + * @param updateReqVO 更新信息 + */ + void updateOAuth2Client(@Valid OAuth2ClientUpdateReqVO updateReqVO); + + /** + * 删除 OAuth2 客户端 + * + * @param id 编号 + */ + void deleteOAuth2Client(Long id); + + /** + * 获得 OAuth2 客户端 + * + * @param id 编号 + * @return OAuth2 客户端 + */ + OAuth2ClientDO getOAuth2Client(Long id); + + /** + * 获得 OAuth2 客户端,从缓存中 + * + * @param clientId 客户端编号 + * @return OAuth2 客户端 + */ + OAuth2ClientDO getOAuth2ClientFromCache(String clientId); + + /** + * 获得 OAuth2 客户端分页 + * + * @param pageReqVO 分页查询 + * @return OAuth2 客户端分页 + */ + PageResult getOAuth2ClientPage(OAuth2ClientPageReqVO pageReqVO); + + /** + * 从缓存中,校验客户端是否合法 + * + * @return 客户端 + */ + default OAuth2ClientDO validOAuthClientFromCache(String clientId) { + return validOAuthClientFromCache(clientId, null, null, null, null); + } + + /** + * 从缓存中,校验客户端是否合法 + * + * 非空时,进行校验 + * + * @param clientId 客户端编号 + * @param clientSecret 客户端密钥 + * @param authorizedGrantType 授权方式 + * @param scopes 授权范围 + * @param redirectUri 重定向地址 + * @return 客户端 + */ + OAuth2ClientDO validOAuthClientFromCache(String clientId, String clientSecret, String authorizedGrantType, + Collection scopes, String redirectUri); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2ClientServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2ClientServiceImpl.java new file mode 100644 index 0000000..608ee9e --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2ClientServiceImpl.java @@ -0,0 +1,154 @@ +package com.win.module.system.service.oauth2; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.spring.SpringUtil; +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.string.StrUtils; +import com.win.module.system.controller.oauth2.vo.client.OAuth2ClientCreateReqVO; +import com.win.module.system.controller.oauth2.vo.client.OAuth2ClientPageReqVO; +import com.win.module.system.controller.oauth2.vo.client.OAuth2ClientUpdateReqVO; +import com.win.module.system.convert.auth.OAuth2ClientConvert; +import com.win.module.system.dal.dataobject.oauth2.OAuth2ClientDO; +import com.win.module.system.dal.mysql.oauth2.OAuth2ClientMapper; +import com.win.module.system.dal.redis.RedisKeyConstants; +import com.google.common.annotations.VisibleForTesting; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.Collection; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.system.enums.ErrorCodeConstants.*; + +/** + * OAuth2.0 Client Service 实现类 + * + * @author 闻荫源码 + */ +@Service +@Validated +@Slf4j +public class OAuth2ClientServiceImpl implements OAuth2ClientService { + + @Resource + private OAuth2ClientMapper oauth2ClientMapper; + + @Override + public Long createOAuth2Client(OAuth2ClientCreateReqVO createReqVO) { + validateClientIdExists(null, createReqVO.getClientId()); + // 插入 + OAuth2ClientDO oauth2Client = OAuth2ClientConvert.INSTANCE.convert(createReqVO); + oauth2ClientMapper.insert(oauth2Client); + return oauth2Client.getId(); + } + + @Override + @CacheEvict(cacheNames = RedisKeyConstants.OAUTH_CLIENT, + allEntries = true) // allEntries 清空所有缓存,因为可能修改到 clientId 字段,不好清理 + public void updateOAuth2Client(OAuth2ClientUpdateReqVO updateReqVO) { + // 校验存在 + validateOAuth2ClientExists(updateReqVO.getId()); + // 校验 Client 未被占用 + validateClientIdExists(updateReqVO.getId(), updateReqVO.getClientId()); + + // 更新 + OAuth2ClientDO updateObj = OAuth2ClientConvert.INSTANCE.convert(updateReqVO); + oauth2ClientMapper.updateById(updateObj); + } + + @Override + @CacheEvict(cacheNames = RedisKeyConstants.OAUTH_CLIENT, + allEntries = true) // allEntries 清空所有缓存,因为 id 不是直接的缓存 key,不好清理 + public void deleteOAuth2Client(Long id) { + // 校验存在 + validateOAuth2ClientExists(id); + // 删除 + oauth2ClientMapper.deleteById(id); + } + + private void validateOAuth2ClientExists(Long id) { + if (oauth2ClientMapper.selectById(id) == null) { + throw exception(OAUTH2_CLIENT_NOT_EXISTS); + } + } + + @VisibleForTesting + void validateClientIdExists(Long id, String clientId) { + OAuth2ClientDO client = oauth2ClientMapper.selectByClientId(clientId); + if (client == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的客户端 + if (id == null) { + throw exception(OAUTH2_CLIENT_EXISTS); + } + if (!client.getId().equals(id)) { + throw exception(OAUTH2_CLIENT_EXISTS); + } + } + + @Override + public OAuth2ClientDO getOAuth2Client(Long id) { + return oauth2ClientMapper.selectById(id); + } + + @Override + @Cacheable(cacheNames = RedisKeyConstants.OAUTH_CLIENT, key = "#clientId", + unless = "#result == null") + public OAuth2ClientDO getOAuth2ClientFromCache(String clientId) { + return oauth2ClientMapper.selectByClientId(clientId); + } + + @Override + public PageResult getOAuth2ClientPage(OAuth2ClientPageReqVO pageReqVO) { + return oauth2ClientMapper.selectPage(pageReqVO); + } + + @Override + public OAuth2ClientDO validOAuthClientFromCache(String clientId, String clientSecret, String authorizedGrantType, + Collection scopes, String redirectUri) { + // 校验客户端存在、且开启 + OAuth2ClientDO client = getSelf().getOAuth2ClientFromCache(clientId); + if (client == null) { + throw exception(OAUTH2_CLIENT_NOT_EXISTS); + } + if (ObjectUtil.notEqual(client.getStatus(), CommonStatusEnum.ENABLE.getStatus())) { + throw exception(OAUTH2_CLIENT_DISABLE); + } + + // 校验客户端密钥 + if (StrUtil.isNotEmpty(clientSecret) && ObjectUtil.notEqual(client.getSecret(), clientSecret)) { + throw exception(OAUTH2_CLIENT_CLIENT_SECRET_ERROR); + } + // 校验授权方式 + if (StrUtil.isNotEmpty(authorizedGrantType) && !CollUtil.contains(client.getAuthorizedGrantTypes(), authorizedGrantType)) { + throw exception(OAUTH2_CLIENT_AUTHORIZED_GRANT_TYPE_NOT_EXISTS); + } + // 校验授权范围 + if (CollUtil.isNotEmpty(scopes) && !CollUtil.containsAll(client.getScopes(), scopes)) { + throw exception(OAUTH2_CLIENT_SCOPE_OVER); + } + // 校验回调地址 + if (StrUtil.isNotEmpty(redirectUri) && !StrUtils.startWithAny(redirectUri, client.getRedirectUris())) { + throw exception(OAUTH2_CLIENT_REDIRECT_URI_NOT_MATCH, redirectUri); + } + return client; + } + + /** + * 获得自身的代理对象,解决 AOP 生效问题 + * + * @return 自己 + */ + private OAuth2ClientServiceImpl getSelf() { + return SpringUtil.getBean(getClass()); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2CodeService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2CodeService.java new file mode 100644 index 0000000..4a4ab1d --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2CodeService.java @@ -0,0 +1,37 @@ +package com.win.module.system.service.oauth2; + +import com.win.module.system.dal.dataobject.oauth2.OAuth2CodeDO; + +import java.util.List; + +/** + * OAuth2.0 授权码 Service 接口 + * + * 从功能上,和 Spring Security OAuth 的 JdbcAuthorizationCodeServices 的功能,提供授权码的操作 + * + * @author 闻荫源码 + */ +public interface OAuth2CodeService { + + /** + * 创建授权码 + * + * 参考 JdbcAuthorizationCodeServices 的 createAuthorizationCode 方法 + * + * @param userId 用户编号 + * @param clientId 客户端编号 + * @param scopes 授权范围 + * @param redirectUri 重定向 URI + * @param state 状态 + * @return 授权码的信息 + */ + OAuth2CodeDO createAuthorizationCode(Long userId, String clientId, List scopes, String redirectUri, String state); + + /** + * 使用授权码 + * + * @param code 授权码 + */ + OAuth2CodeDO consumeAuthorizationCode(String code); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2CodeServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2CodeServiceImpl.java new file mode 100644 index 0000000..0de2d4d --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2CodeServiceImpl.java @@ -0,0 +1,62 @@ +package com.win.module.system.service.oauth2; + +import cn.hutool.core.util.IdUtil; +import com.win.framework.common.util.date.DateUtils; +import com.win.module.system.dal.dataobject.oauth2.OAuth2CodeDO; +import com.win.module.system.dal.mysql.oauth2.OAuth2CodeMapper; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.util.List; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.system.enums.ErrorCodeConstants.OAUTH2_CODE_EXPIRE; +import static com.win.module.system.enums.ErrorCodeConstants.OAUTH2_CODE_NOT_EXISTS; + +/** + * OAuth2.0 授权码 Service 实现类 + * + * @author 闻荫源码 + */ +@Service +@Validated +public class OAuth2CodeServiceImpl implements OAuth2CodeService { + + /** + * 授权码的过期时间,默认 5 分钟 + */ + private static final Integer TIMEOUT = 5 * 60; + + @Resource + private OAuth2CodeMapper oauth2CodeMapper; + + @Override + public OAuth2CodeDO createAuthorizationCode(Long userId, String clientId, List scopes, String redirectUri, String state) { + OAuth2CodeDO codeDO = new OAuth2CodeDO().setCode(generateCode()) + .setUserId(userId).setClientId(clientId).setScopes(scopes) + .setExpiresTime(LocalDateTime.now().plusSeconds(TIMEOUT)) + .setRedirectUri(redirectUri).setState(state); + oauth2CodeMapper.insert(codeDO); + return codeDO; + } + + @Override + public OAuth2CodeDO consumeAuthorizationCode(String code) { + OAuth2CodeDO codeDO = oauth2CodeMapper.selectByCode(code); + if (codeDO == null) { + throw exception(OAUTH2_CODE_NOT_EXISTS); + } + if (DateUtils.isExpired(codeDO.getExpiresTime())) { + throw exception(OAUTH2_CODE_EXPIRE); + } + oauth2CodeMapper.deleteById(codeDO.getId()); + return codeDO; + } + + private static String generateCode() { + return IdUtil.fastSimpleUUID(); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2GrantService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2GrantService.java new file mode 100644 index 0000000..40539cf --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2GrantService.java @@ -0,0 +1,108 @@ +package com.win.module.system.service.oauth2; + +import com.win.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; + +import java.util.List; + +/** + * OAuth2 授予 Service 接口 + * + * 从功能上,和 Spring Security OAuth 的 TokenGranter 的功能,提供访问令牌、刷新令牌的操作 + * + * 将自身的 AdminUser 用户,授权给第三方应用,采用 OAuth2.0 的协议。 + * + * 问题:为什么自身也作为一个第三方应用,也走这套流程呢? + * 回复:当然可以这么做,采用 password 模式。考虑到大多数开发者使用不到这个特性,OAuth2.0 毕竟有一定学习成本,所以暂时没有采取这种方式。 + * + * @author 闻荫源码 + */ +public interface OAuth2GrantService { + + /** + * 简化模式 + * + * 对应 Spring Security OAuth2 的 ImplicitTokenGranter 功能 + * + * @param userId 用户编号 + * @param clientId 客户端编号 + * @param scopes 授权范围 + * @return 访问令牌 + */ + OAuth2AccessTokenDO grantImplicit(Long userId, String clientId, List scopes); + + /** + * 授权码模式,第一阶段,获得 code 授权码 + * + * 对应 Spring Security OAuth2 的 AuthorizationEndpoint 的 generateCode 方法 + * + * @param userId 用户编号 + * @param clientId 客户端编号 + * @param scopes 授权范围 + * @param redirectUri 重定向 URI + * @param state 状态 + * @return 授权码 + */ + String grantAuthorizationCodeForCode(Long userId, String clientId, List scopes, String redirectUri, String state); + + /** + * 授权码模式,第二阶段,获得 accessToken 访问令牌 + * + * 对应 Spring Security OAuth2 的 AuthorizationCodeTokenGranter 功能 + * + * @param clientId 客户端编号 + * @param code 授权码 + * @param redirectUri 重定向 URI + * @param state 状态 + * @return 访问令牌 + */ + OAuth2AccessTokenDO grantAuthorizationCodeForAccessToken(String clientId, String code, + String redirectUri, String state); + + /** + * 密码模式 + * + * 对应 Spring Security OAuth2 的 ResourceOwnerPasswordTokenGranter 功能 + * + * @param username 账号 + * @param password 密码 + * @param clientId 客户端编号 + * @param scopes 授权范围 + * @return 访问令牌 + */ + OAuth2AccessTokenDO grantPassword(String username, String password, + String clientId, List scopes); + + /** + * 刷新模式 + * + * 对应 Spring Security OAuth2 的 ResourceOwnerPasswordTokenGranter 功能 + * + * @param refreshToken 刷新令牌 + * @param clientId 客户端编号 + * @return 访问令牌 + */ + OAuth2AccessTokenDO grantRefreshToken(String refreshToken, String clientId); + + /** + * 客户端模式 + * + * 对应 Spring Security OAuth2 的 ClientCredentialsTokenGranter 功能 + * + * @param clientId 客户端编号 + * @param scopes 授权范围 + * @return 访问令牌 + */ + OAuth2AccessTokenDO grantClientCredentials(String clientId, List scopes); + + /** + * 移除访问令牌 + * + * 对应 Spring Security OAuth2 的 ConsumerTokenServices 的 revokeToken 方法 + * + * @param accessToken 访问令牌 + * @param clientId 客户端编号 + * @return 是否移除到 + */ + boolean revokeToken(String clientId, String accessToken); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2GrantServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2GrantServiceImpl.java new file mode 100644 index 0000000..43364ec --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2GrantServiceImpl.java @@ -0,0 +1,98 @@ +package com.win.module.system.service.oauth2; + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.win.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; +import com.win.module.system.dal.dataobject.oauth2.OAuth2CodeDO; +import com.win.module.system.dal.dataobject.user.AdminUserDO; +import com.win.module.system.enums.ErrorCodeConstants; +import com.win.module.system.service.auth.AdminAuthService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; + +/** + * OAuth2 授予 Service 实现类 + * + * @author 闻荫源码 + */ +@Service +public class OAuth2GrantServiceImpl implements OAuth2GrantService { + + @Resource + private OAuth2TokenService oauth2TokenService; + @Resource + private OAuth2CodeService oauth2CodeService; + @Resource + private AdminAuthService adminAuthService; + + @Override + public OAuth2AccessTokenDO grantImplicit(Long userId, String clientId, List scopes) { + return oauth2TokenService.createAccessToken(userId, clientId, scopes); + } + + @Override + public String grantAuthorizationCodeForCode(Long userId, String clientId, List scopes, String redirectUri, String state) { + return oauth2CodeService.createAuthorizationCode(userId, clientId, scopes, redirectUri, state).getCode(); + } + + @Override + public OAuth2AccessTokenDO grantAuthorizationCodeForAccessToken(String clientId, String code, + String redirectUri, String state) { + OAuth2CodeDO codeDO = oauth2CodeService.consumeAuthorizationCode(code); + Assert.notNull(codeDO, "授权码不能为空"); // 防御性编程 + // 校验 clientId 是否匹配 + if (!StrUtil.equals(clientId, codeDO.getClientId())) { + throw exception(ErrorCodeConstants.OAUTH2_GRANT_CLIENT_ID_MISMATCH); + } + // 校验 redirectUri 是否匹配 + if (!StrUtil.equals(redirectUri, codeDO.getRedirectUri())) { + throw exception(ErrorCodeConstants.OAUTH2_GRANT_REDIRECT_URI_MISMATCH); + } + // 校验 state 是否匹配 + state = StrUtil.nullToDefault(state, ""); // 数据库 state 为 null 时,会设置为 "" 空串 + if (!StrUtil.equals(state, codeDO.getState())) { + throw exception(ErrorCodeConstants.OAUTH2_GRANT_STATE_MISMATCH); + } + + // 创建访问令牌 + return oauth2TokenService.createAccessToken(codeDO.getUserId(), codeDO.getClientId(), codeDO.getScopes()); + } + + @Override + public OAuth2AccessTokenDO grantPassword(String username, String password, String clientId, List scopes) { + // 使用账号 + 密码进行登录 + AdminUserDO user = adminAuthService.authenticate(username, password); + Assert.notNull(user, "用户不能为空!"); // 防御性编程 + + // 创建访问令牌 + return oauth2TokenService.createAccessToken(user.getId(), clientId, scopes); + } + + @Override + public OAuth2AccessTokenDO grantRefreshToken(String refreshToken, String clientId) { + return oauth2TokenService.refreshAccessToken(refreshToken, clientId); + } + + @Override + public OAuth2AccessTokenDO grantClientCredentials(String clientId, List scopes) { + // TODO 芋艿:项目中使用 OAuth2 解决的是三方应用的授权,内部的 SSO 等问题,所以暂时不考虑 client_credentials 这个场景 + throw new UnsupportedOperationException("暂时不支持 client_credentials 授权模式"); + } + + @Override + public boolean revokeToken(String clientId, String accessToken) { + // 先查询,保证 clientId 时匹配的 + OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.getAccessToken(accessToken); + if (accessTokenDO == null || ObjectUtil.notEqual(clientId, accessTokenDO.getClientId())) { + return false; + } + // 再删除 + return oauth2TokenService.removeAccessToken(accessToken) != null; + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2TokenService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2TokenService.java new file mode 100644 index 0000000..e3172ac --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2TokenService.java @@ -0,0 +1,79 @@ +package com.win.module.system.service.oauth2; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.oauth2.vo.token.OAuth2AccessTokenPageReqVO; +import com.win.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; + +import java.util.List; + +/** + * OAuth2.0 Token Service 接口 + * + * 从功能上,和 Spring Security OAuth 的 DefaultTokenServices + JdbcTokenStore 的功能,提供访问令牌、刷新令牌的操作 + * + * @author 闻荫源码 + */ +public interface OAuth2TokenService { + + /** + * 创建访问令牌 + * 注意:该流程中,会包含创建刷新令牌的创建 + * + * 参考 DefaultTokenServices 的 createAccessToken 方法 + * + * @param userId 用户编号 + * @param clientId 客户端编号 + * @param scopes 授权范围 + * @return 访问令牌的信息 + */ + OAuth2AccessTokenDO createAccessToken(Long userId, String clientId, List scopes); + + /** + * 刷新访问令牌 + * + * 参考 DefaultTokenServices 的 refreshAccessToken 方法 + * + * @param refreshToken 刷新令牌 + * @param clientId 客户端编号 + * @return 访问令牌的信息 + */ + OAuth2AccessTokenDO refreshAccessToken(String refreshToken, String clientId); + + /** + * 获得访问令牌 + * + * 参考 DefaultTokenServices 的 getAccessToken 方法 + * + * @param accessToken 访问令牌 + * @return 访问令牌的信息 + */ + OAuth2AccessTokenDO getAccessToken(String accessToken); + + /** + * 校验访问令牌 + * + * @param accessToken 访问令牌 + * @return 访问令牌的信息 + */ + OAuth2AccessTokenDO checkAccessToken(String accessToken); + + /** + * 移除访问令牌 + * 注意:该流程中,会移除相关的刷新令牌 + * + * 参考 DefaultTokenServices 的 revokeToken 方法 + * + * @param accessToken 刷新令牌 + * @return 访问令牌的信息 + */ + OAuth2AccessTokenDO removeAccessToken(String accessToken); + + /** + * 获得访问令牌分页 + * + * @param reqVO 请求 + * @return 访问令牌分页 + */ + PageResult getAccessTokenPage(OAuth2AccessTokenPageReqVO reqVO); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2TokenServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2TokenServiceImpl.java new file mode 100644 index 0000000..be5a34a --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2TokenServiceImpl.java @@ -0,0 +1,164 @@ +package com.win.module.system.service.oauth2; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import com.win.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.date.DateUtils; +import com.win.framework.tenant.core.context.TenantContextHolder; +import com.win.module.system.controller.oauth2.vo.token.OAuth2AccessTokenPageReqVO; +import com.win.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; +import com.win.module.system.dal.dataobject.oauth2.OAuth2ClientDO; +import com.win.module.system.dal.dataobject.oauth2.OAuth2RefreshTokenDO; +import com.win.module.system.dal.mysql.oauth2.OAuth2AccessTokenMapper; +import com.win.module.system.dal.mysql.oauth2.OAuth2RefreshTokenMapper; +import com.win.module.system.dal.redis.oauth2.OAuth2AccessTokenRedisDAO; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.util.List; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception0; +import static com.win.framework.common.util.collection.CollectionUtils.convertSet; + +/** + * OAuth2.0 Token Service 实现类 + * + * @author 闻荫源码 + */ +@Service +public class OAuth2TokenServiceImpl implements OAuth2TokenService { + + @Resource + private OAuth2AccessTokenMapper oauth2AccessTokenMapper; + @Resource + private OAuth2RefreshTokenMapper oauth2RefreshTokenMapper; + + @Resource + private OAuth2AccessTokenRedisDAO oauth2AccessTokenRedisDAO; + + @Resource + private OAuth2ClientService oauth2ClientService; + + @Override + @Transactional + public OAuth2AccessTokenDO createAccessToken(Long userId, String clientId, List scopes) { + OAuth2ClientDO clientDO = oauth2ClientService.validOAuthClientFromCache(clientId); + // 创建刷新令牌 + OAuth2RefreshTokenDO refreshTokenDO = createOAuth2RefreshToken(userId, clientDO, scopes); + // 创建访问令牌 + return createOAuth2AccessToken(refreshTokenDO, clientDO); + } + + @Override + public OAuth2AccessTokenDO refreshAccessToken(String refreshToken, String clientId) { + // 查询访问令牌 + OAuth2RefreshTokenDO refreshTokenDO = oauth2RefreshTokenMapper.selectByRefreshToken(refreshToken); + if (refreshTokenDO == null) { + throw exception0(GlobalErrorCodeConstants.BAD_REQUEST.getCode(), "无效的刷新令牌"); + } + + // 校验 Client 匹配 + OAuth2ClientDO clientDO = oauth2ClientService.validOAuthClientFromCache(clientId); + if (ObjectUtil.notEqual(clientId, refreshTokenDO.getClientId())) { + throw exception0(GlobalErrorCodeConstants.BAD_REQUEST.getCode(), "刷新令牌的客户端编号不正确"); + } + + // 移除相关的访问令牌 + List accessTokenDOs = oauth2AccessTokenMapper.selectListByRefreshToken(refreshToken); + if (CollUtil.isNotEmpty(accessTokenDOs)) { + oauth2AccessTokenMapper.deleteBatchIds(convertSet(accessTokenDOs, OAuth2AccessTokenDO::getId)); + oauth2AccessTokenRedisDAO.deleteList(convertSet(accessTokenDOs, OAuth2AccessTokenDO::getAccessToken)); + } + + // 已过期的情况下,删除刷新令牌 + if (DateUtils.isExpired(refreshTokenDO.getExpiresTime())) { + oauth2RefreshTokenMapper.deleteById(refreshTokenDO.getId()); + throw exception0(GlobalErrorCodeConstants.UNAUTHORIZED.getCode(), "刷新令牌已过期"); + } + + // 创建访问令牌 + return createOAuth2AccessToken(refreshTokenDO, clientDO); + } + + @Override + public OAuth2AccessTokenDO getAccessToken(String accessToken) { + // 优先从 Redis 中获取 + OAuth2AccessTokenDO accessTokenDO = oauth2AccessTokenRedisDAO.get(accessToken); + if (accessTokenDO != null) { + return accessTokenDO; + } + + // 获取不到,从 MySQL 中获取 + accessTokenDO = oauth2AccessTokenMapper.selectByAccessToken(accessToken); + // 如果在 MySQL 存在,则往 Redis 中写入 + if (accessTokenDO != null && !DateUtils.isExpired(accessTokenDO.getExpiresTime())) { + oauth2AccessTokenRedisDAO.set(accessTokenDO); + } + return accessTokenDO; + } + + @Override + public OAuth2AccessTokenDO checkAccessToken(String accessToken) { + OAuth2AccessTokenDO accessTokenDO = getAccessToken(accessToken); + if (accessTokenDO == null) { + throw exception0(GlobalErrorCodeConstants.UNAUTHORIZED.getCode(), "访问令牌不存在"); + } + if (DateUtils.isExpired(accessTokenDO.getExpiresTime())) { + throw exception0(GlobalErrorCodeConstants.UNAUTHORIZED.getCode(), "访问令牌已过期"); + } + return accessTokenDO; + } + + @Override + public OAuth2AccessTokenDO removeAccessToken(String accessToken) { + // 删除访问令牌 + OAuth2AccessTokenDO accessTokenDO = oauth2AccessTokenMapper.selectByAccessToken(accessToken); + if (accessTokenDO == null) { + return null; + } + oauth2AccessTokenMapper.deleteById(accessTokenDO.getId()); + oauth2AccessTokenRedisDAO.delete(accessToken); + // 删除刷新令牌 + oauth2RefreshTokenMapper.deleteByRefreshToken(accessTokenDO.getRefreshToken()); + return accessTokenDO; + } + + @Override + public PageResult getAccessTokenPage(OAuth2AccessTokenPageReqVO reqVO) { + return oauth2AccessTokenMapper.selectPage(reqVO); + } + + private OAuth2AccessTokenDO createOAuth2AccessToken(OAuth2RefreshTokenDO refreshTokenDO, OAuth2ClientDO clientDO) { + OAuth2AccessTokenDO accessTokenDO = new OAuth2AccessTokenDO().setAccessToken(generateAccessToken()) + .setUserId(refreshTokenDO.getUserId()) + .setClientId(clientDO.getClientId()).setScopes(refreshTokenDO.getScopes()) + .setRefreshToken(refreshTokenDO.getRefreshToken()) + .setExpiresTime(LocalDateTime.now().plusSeconds(clientDO.getAccessTokenValiditySeconds())); + accessTokenDO.setTenantId(TenantContextHolder.getTenantId()); // 手动设置租户编号,避免缓存到 Redis 的时候,无对应的租户编号 + oauth2AccessTokenMapper.insert(accessTokenDO); + // 记录到 Redis 中 + oauth2AccessTokenRedisDAO.set(accessTokenDO); + return accessTokenDO; + } + + private OAuth2RefreshTokenDO createOAuth2RefreshToken(Long userId, OAuth2ClientDO clientDO, List scopes) { + OAuth2RefreshTokenDO refreshToken = new OAuth2RefreshTokenDO().setRefreshToken(generateRefreshToken()) + .setUserId(userId).setClientId(clientDO.getClientId()).setScopes(scopes) + .setExpiresTime(LocalDateTime.now().plusSeconds(clientDO.getRefreshTokenValiditySeconds())); + oauth2RefreshTokenMapper.insert(refreshToken); + return refreshToken; + } + + private static String generateAccessToken() { + return IdUtil.fastSimpleUUID(); + } + + private static String generateRefreshToken() { + return IdUtil.fastSimpleUUID(); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/MenuService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/MenuService.java new file mode 100644 index 0000000..365de80 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/MenuService.java @@ -0,0 +1,88 @@ +package com.win.module.system.service.permission; + +import com.win.module.system.controller.permission.vo.menu.MenuCreateReqVO; +import com.win.module.system.controller.permission.vo.menu.MenuListReqVO; +import com.win.module.system.controller.permission.vo.menu.MenuUpdateReqVO; +import com.win.module.system.dal.dataobject.permission.MenuDO; + +import java.util.Collection; +import java.util.List; + +/** + * 菜单 Service 接口 + * + * @author 闻荫源码 + */ +public interface MenuService { + + /** + * 创建菜单 + * + * @param reqVO 菜单信息 + * @return 创建出来的菜单编号 + */ + Long createMenu(MenuCreateReqVO reqVO); + + /** + * 更新菜单 + * + * @param reqVO 菜单信息 + */ + void updateMenu(MenuUpdateReqVO reqVO); + + /** + * 删除菜单 + * + * @param id 菜单编号 + */ + void deleteMenu(Long id); + + /** + * 获得所有菜单列表 + * + * @return 菜单列表 + */ + List getMenuList(); + + /** + * 基于租户,筛选菜单列表 + * 注意,如果是系统租户,返回的还是全菜单 + * + * @param reqVO 筛选条件请求 VO + * @return 菜单列表 + */ + List getMenuListByTenant(MenuListReqVO reqVO); + + /** + * 筛选菜单列表 + * + * @param reqVO 筛选条件请求 VO + * @return 菜单列表 + */ + List getMenuList(MenuListReqVO reqVO); + + /** + * 获得权限对应的菜单编号数组 + * + * @param permission 权限标识 + * @return 数组 + */ + List getMenuIdListByPermissionFromCache(String permission); + + /** + * 获得菜单 + * + * @param id 菜单编号 + * @return 菜单 + */ + MenuDO getMenu(Long id); + + /** + * 获得菜单数组 + * + * @param ids 菜单编号数组 + * @return 菜单数组 + */ + List getMenuList(Collection ids); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/MenuServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/MenuServiceImpl.java new file mode 100644 index 0000000..9b47054 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/MenuServiceImpl.java @@ -0,0 +1,209 @@ +package com.win.module.system.service.permission; + +import cn.hutool.core.collection.CollUtil; +import com.win.module.system.controller.permission.vo.menu.MenuCreateReqVO; +import com.win.module.system.controller.permission.vo.menu.MenuListReqVO; +import com.win.module.system.controller.permission.vo.menu.MenuUpdateReqVO; +import com.win.module.system.convert.permission.MenuConvert; +import com.win.module.system.dal.dataobject.permission.MenuDO; +import com.win.module.system.dal.mysql.permission.MenuMapper; +import com.win.module.system.dal.redis.RedisKeyConstants; +import com.win.module.system.enums.permission.MenuTypeEnum; +import com.win.module.system.service.tenant.TenantService; +import com.google.common.annotations.VisibleForTesting; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.List; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.framework.common.util.collection.CollectionUtils.convertList; +import static com.win.module.system.dal.dataobject.permission.MenuDO.ID_ROOT; +import static com.win.module.system.enums.ErrorCodeConstants.*; + +/** + * 菜单 Service 实现 + * + * @author 闻荫源码 + */ +@Service +@Slf4j +public class MenuServiceImpl implements MenuService { + + @Resource + private MenuMapper menuMapper; + @Resource + private PermissionService permissionService; + @Resource + @Lazy // 延迟,避免循环依赖报错 + private TenantService tenantService; + + @Override + @CacheEvict(value = RedisKeyConstants.PERMISSION_MENU_ID_LIST, key = "#reqVO.permission", + condition = "#reqVO.permission != null") + public Long createMenu(MenuCreateReqVO reqVO) { + // 校验父菜单存在 + validateParentMenu(reqVO.getParentId(), null); + // 校验菜单(自己) + validateMenu(reqVO.getParentId(), reqVO.getName(), null); + + // 插入数据库 + MenuDO menu = MenuConvert.INSTANCE.convert(reqVO); + initMenuProperty(menu); + menuMapper.insert(menu); + // 返回 + return menu.getId(); + } + + @Override + @CacheEvict(value = RedisKeyConstants.PERMISSION_MENU_ID_LIST, + allEntries = true) // allEntries 清空所有缓存,因为 permission 如果变更,涉及到新老两个 permission。直接清理,简单有效 + public void updateMenu(MenuUpdateReqVO reqVO) { + // 校验更新的菜单是否存在 + if (menuMapper.selectById(reqVO.getId()) == null) { + throw exception(MENU_NOT_EXISTS); + } + // 校验父菜单存在 + validateParentMenu(reqVO.getParentId(), reqVO.getId()); + // 校验菜单(自己) + validateMenu(reqVO.getParentId(), reqVO.getName(), reqVO.getId()); + + // 更新到数据库 + MenuDO updateObject = MenuConvert.INSTANCE.convert(reqVO); + initMenuProperty(updateObject); + menuMapper.updateById(updateObject); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @CacheEvict(value = RedisKeyConstants.PERMISSION_MENU_ID_LIST, + allEntries = true) // allEntries 清空所有缓存,因为此时不知道 id 对应的 permission 是多少。直接清理,简单有效 + public void deleteMenu(Long id) { + // 校验是否还有子菜单 + if (menuMapper.selectCountByParentId(id) > 0) { + throw exception(MENU_EXISTS_CHILDREN); + } + // 校验删除的菜单是否存在 + if (menuMapper.selectById(id) == null) { + throw exception(MENU_NOT_EXISTS); + } + // 标记删除 + menuMapper.deleteById(id); + // 删除授予给角色的权限 + permissionService.processMenuDeleted(id); + } + + @Override + public List getMenuList() { + return menuMapper.selectList(); + } + + @Override + public List getMenuListByTenant(MenuListReqVO reqVO) { + List menus = getMenuList(reqVO); + // 开启多租户的情况下,需要过滤掉未开通的菜单 + tenantService.handleTenantMenu(menuIds -> menus.removeIf(menu -> !CollUtil.contains(menuIds, menu.getId()))); + return menus; + } + + @Override + public List getMenuList(MenuListReqVO reqVO) { + return menuMapper.selectList(reqVO); + } + + @Override + @Cacheable(value = RedisKeyConstants.PERMISSION_MENU_ID_LIST, key = "#permission") + public List getMenuIdListByPermissionFromCache(String permission) { + List menus = menuMapper.selectListByPermission(permission); + return convertList(menus, MenuDO::getId); + } + + @Override + public MenuDO getMenu(Long id) { + return menuMapper.selectById(id); + } + + @Override + public List getMenuList(Collection ids) { + return menuMapper.selectBatchIds(ids); + } + + /** + * 校验父菜单是否合法 + *

+ * 1. 不能设置自己为父菜单 + * 2. 父菜单不存在 + * 3. 父菜单必须是 {@link MenuTypeEnum#MENU} 菜单类型 + * + * @param parentId 父菜单编号 + * @param childId 当前菜单编号 + */ + @VisibleForTesting + void validateParentMenu(Long parentId, Long childId) { + if (parentId == null || ID_ROOT.equals(parentId)) { + return; + } + // 不能设置自己为父菜单 + if (parentId.equals(childId)) { + throw exception(MENU_PARENT_ERROR); + } + MenuDO menu = menuMapper.selectById(parentId); + // 父菜单不存在 + if (menu == null) { + throw exception(MENU_PARENT_NOT_EXISTS); + } + // 父菜单必须是目录或者菜单类型 + if (!MenuTypeEnum.DIR.getType().equals(menu.getType()) + && !MenuTypeEnum.MENU.getType().equals(menu.getType())) { + throw exception(MENU_PARENT_NOT_DIR_OR_MENU); + } + } + + /** + * 校验菜单是否合法 + *

+ * 1. 校验相同父菜单编号下,是否存在相同的菜单名 + * + * @param name 菜单名字 + * @param parentId 父菜单编号 + * @param id 菜单编号 + */ + @VisibleForTesting + void validateMenu(Long parentId, String name, Long id) { + MenuDO menu = menuMapper.selectByParentIdAndName(parentId, name); + if (menu == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的菜单 + if (id == null) { + throw exception(MENU_NAME_DUPLICATE); + } + if (!menu.getId().equals(id)) { + throw exception(MENU_NAME_DUPLICATE); + } + } + + /** + * 初始化菜单的通用属性。 + *

+ * 例如说,只有目录或者菜单类型的菜单,才设置 icon + * + * @param menu 菜单 + */ + private void initMenuProperty(MenuDO menu) { + // 菜单为按钮类型时,无需 component、icon、path 属性,进行置空 + if (MenuTypeEnum.BUTTON.getType().equals(menu.getType())) { + menu.setComponent(""); + menu.setComponentName(""); + menu.setIcon(""); + menu.setPath(""); + } + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/PermissionService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/PermissionService.java new file mode 100644 index 0000000..c683a59 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/PermissionService.java @@ -0,0 +1,146 @@ +package com.win.module.system.service.permission; + +import com.win.module.system.api.permission.dto.DeptDataPermissionRespDTO; + +import java.util.Collection; +import java.util.Set; + +import static java.util.Collections.singleton; + +/** + * 权限 Service 接口 + *

+ * 提供用户-角色、角色-菜单、角色-部门的关联权限处理 + * + * @author 闻荫源码 + */ +public interface PermissionService { + + /** + * 判断是否有权限,任一一个即可 + * + * @param userId 用户编号 + * @param permissions 权限 + * @return 是否 + */ + boolean hasAnyPermissions(Long userId, String... permissions); + + /** + * 判断是否有角色,任一一个即可 + * + * @param roles 角色数组 + * @return 是否 + */ + boolean hasAnyRoles(Long userId, String... roles); + + // ========== 角色-菜单的相关方法 ========== + + /** + * 设置角色菜单 + * + * @param roleId 角色编号 + * @param menuIds 菜单编号集合 + */ + void assignRoleMenu(Long roleId, Set menuIds); + + /** + * 处理角色删除时,删除关联授权数据 + * + * @param roleId 角色编号 + */ + void processRoleDeleted(Long roleId); + + /** + * 处理菜单删除时,删除关联授权数据 + * + * @param menuId 菜单编号 + */ + void processMenuDeleted(Long menuId); + + /** + * 获得角色拥有的菜单编号集合 + * + * @param roleId 角色编号 + * @return 菜单编号集合 + */ + default Set getRoleMenuListByRoleId(Long roleId) { + return getRoleMenuListByRoleId(singleton(roleId)); + } + + /** + * 获得角色们拥有的菜单编号集合 + * + * @param roleIds 角色编号数组 + * @return 菜单编号集合 + */ + Set getRoleMenuListByRoleId(Collection roleIds); + + /** + * 获得拥有指定菜单的角色编号数组,从缓存中获取 + * + * @param menuId 菜单编号 + * @return 角色编号数组 + */ + Set getMenuRoleIdListByMenuIdFromCache(Long menuId); + + // ========== 用户-角色的相关方法 ========== + + /** + * 设置用户角色 + * + * @param userId 角色编号 + * @param roleIds 角色编号集合 + */ + void assignUserRole(Long userId, Set roleIds); + + /** + * 处理用户删除时,删除关联授权数据 + * + * @param userId 用户编号 + */ + void processUserDeleted(Long userId); + + /** + * 获得拥有多个角色的用户编号集合 + * + * @param roleIds 角色编号集合 + * @return 用户编号集合 + */ + Set getUserRoleIdListByRoleId(Collection roleIds); + + /** + * 获得用户拥有的角色编号集合 + * + * @param userId 用户编号 + * @return 角色编号集合 + */ + Set getUserRoleIdListByUserId(Long userId); + + /** + * 获得用户拥有的角色编号集合,从缓存中获取 + * + * @param userId 用户编号 + * @return 角色编号集合 + */ + Set getUserRoleIdListByUserIdFromCache(Long userId); + + // ========== 用户-部门的相关方法 ========== + + /** + * 设置角色的数据权限 + * + * @param roleId 角色编号 + * @param dataScope 数据范围 + * @param dataScopeDeptIds 部门编号数组 + */ + void assignRoleDataScope(Long roleId, Integer dataScope, Set dataScopeDeptIds); + + /** + * 获得登陆用户的部门数据权限 + * + * @param userId 用户编号 + * @return 部门数据权限 + */ + DeptDataPermissionRespDTO getDeptDataPermission(Long userId); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/PermissionServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/PermissionServiceImpl.java new file mode 100644 index 0000000..aad386f --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/PermissionServiceImpl.java @@ -0,0 +1,335 @@ +package com.win.module.system.service.permission; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.extra.spring.SpringUtil; +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.util.collection.CollectionUtils; +import com.win.framework.datapermission.core.annotation.DataPermission; +import com.win.module.system.api.permission.dto.DeptDataPermissionRespDTO; +import com.win.module.system.dal.dataobject.permission.MenuDO; +import com.win.module.system.dal.dataobject.permission.RoleDO; +import com.win.module.system.dal.dataobject.permission.RoleMenuDO; +import com.win.module.system.dal.dataobject.permission.UserRoleDO; +import com.win.module.system.dal.mysql.permission.RoleMenuMapper; +import com.win.module.system.dal.mysql.permission.UserRoleMapper; +import com.win.module.system.dal.redis.RedisKeyConstants; +import com.win.module.system.enums.permission.DataScopeEnum; +import com.win.module.system.service.dept.DeptService; +import com.win.module.system.service.user.AdminUserService; +import com.baomidou.dynamic.datasource.annotation.DSTransactional; +import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Suppliers; +import com.google.common.collect.Sets; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.cache.annotation.Caching; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.*; +import java.util.function.Supplier; + +import static com.win.framework.common.util.collection.CollectionUtils.convertSet; +import static com.win.framework.common.util.json.JsonUtils.toJsonString; + +/** + * 权限 Service 实现类 + * + * @author 闻荫源码 + */ +@Service +@Slf4j +public class PermissionServiceImpl implements PermissionService { + + @Resource + private RoleMenuMapper roleMenuMapper; + @Resource + private UserRoleMapper userRoleMapper; + + @Resource + private RoleService roleService; + @Resource + private MenuService menuService; + @Resource + private DeptService deptService; + @Resource + private AdminUserService userService; + + @Override + public boolean hasAnyPermissions(Long userId, String... permissions) { + // 如果为空,说明已经有权限 + if (ArrayUtil.isEmpty(permissions)) { + return true; + } + + // 获得当前登录的角色。如果为空,说明没有权限 + List roles = getEnableUserRoleListByUserIdFromCache(userId); + if (CollUtil.isEmpty(roles)) { + return false; + } + + // 情况一:遍历判断每个权限,如果有一满足,说明有权限 + for (String permission : permissions) { + if (hasAnyPermission(roles, permission)) { + return true; + } + } + + // 情况二:如果是超管,也说明有权限 + return roleService.hasAnySuperAdmin(convertSet(roles, RoleDO::getId)); + } + + /** + * 判断指定角色,是否拥有该 permission 权限 + * + * @param roles 指定角色数组 + * @param permission 权限标识 + * @return 是否拥有 + */ + private boolean hasAnyPermission(List roles, String permission) { + List menuIds = menuService.getMenuIdListByPermissionFromCache(permission); + // 采用严格模式,如果权限找不到对应的 Menu 的话,也认为没有权限 + if (CollUtil.isEmpty(menuIds)) { + return false; + } + + // 判断是否有权限 + Set roleIds = convertSet(roles, RoleDO::getId); + for (Long menuId : menuIds) { + // 获得拥有该菜单的角色编号集合 + Set menuRoleIds = getSelf().getMenuRoleIdListByMenuIdFromCache(menuId); + // 如果有交集,说明有权限 + if (CollUtil.containsAny(menuRoleIds, roleIds)) { + return true; + } + } + return false; + } + + @Override + public boolean hasAnyRoles(Long userId, String... roles) { + // 如果为空,说明已经有权限 + if (ArrayUtil.isEmpty(roles)) { + return true; + } + + // 获得当前登录的角色。如果为空,说明没有权限 + List roleList = getEnableUserRoleListByUserIdFromCache(userId); + if (CollUtil.isEmpty(roleList)) { + return false; + } + + // 判断是否有角色 + Set userRoles = convertSet(roleList, RoleDO::getCode); + return CollUtil.containsAny(userRoles, Sets.newHashSet(roles)); + } + + // ========== 角色-菜单的相关方法 ========== + + @Override + @DSTransactional // 多数据源,使用 @DSTransactional 保证本地事务,以及数据源的切换 + @CacheEvict(value = RedisKeyConstants.MENU_ROLE_ID_LIST, + allEntries = true) // allEntries 清空所有缓存,主要一次更新涉及到的 menuIds 较多,反倒批量会更快 + public void assignRoleMenu(Long roleId, Set menuIds) { + // 获得角色拥有菜单编号 + Set dbMenuIds = convertSet(roleMenuMapper.selectListByRoleId(roleId), RoleMenuDO::getMenuId); + // 计算新增和删除的菜单编号 + Collection createMenuIds = CollUtil.subtract(menuIds, dbMenuIds); + Collection deleteMenuIds = CollUtil.subtract(dbMenuIds, menuIds); + // 执行新增和删除。对于已经授权的菜单,不用做任何处理 + if (CollUtil.isNotEmpty(createMenuIds)) { + roleMenuMapper.insertBatch(CollectionUtils.convertList(createMenuIds, menuId -> { + RoleMenuDO entity = new RoleMenuDO(); + entity.setRoleId(roleId); + entity.setMenuId(menuId); + return entity; + })); + } + if (CollUtil.isNotEmpty(deleteMenuIds)) { + roleMenuMapper.deleteListByRoleIdAndMenuIds(roleId, deleteMenuIds); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + @Caching(evict = { + @CacheEvict(value = RedisKeyConstants.MENU_ROLE_ID_LIST, + allEntries = true), // allEntries 清空所有缓存,此处无法方便获得 roleId 对应的 menu 缓存们 + @CacheEvict(value = RedisKeyConstants.USER_ROLE_ID_LIST, + allEntries = true) // allEntries 清空所有缓存,此处无法方便获得 roleId 对应的 user 缓存们 + }) + public void processRoleDeleted(Long roleId) { + // 标记删除 UserRole + userRoleMapper.deleteListByRoleId(roleId); + // 标记删除 RoleMenu + roleMenuMapper.deleteListByRoleId(roleId); + } + + @Override + @CacheEvict(value = RedisKeyConstants.MENU_ROLE_ID_LIST, key = "#menuId") + public void processMenuDeleted(Long menuId) { + roleMenuMapper.deleteListByMenuId(menuId); + } + + @Override + public Set getRoleMenuListByRoleId(Collection roleIds) { + if (CollUtil.isEmpty(roleIds)) { + return Collections.emptySet(); + } + + // 如果是管理员的情况下,获取全部菜单编号 + if (roleService.hasAnySuperAdmin(roleIds)) { + return convertSet(menuService.getMenuList(), MenuDO::getId); + } + // 如果是非管理员的情况下,获得拥有的菜单编号 + return convertSet(roleMenuMapper.selectListByRoleId(roleIds), RoleMenuDO::getMenuId); + } + + @Override + @Cacheable(value = RedisKeyConstants.MENU_ROLE_ID_LIST, key = "#menuId") + public Set getMenuRoleIdListByMenuIdFromCache(Long menuId) { + return convertSet(roleMenuMapper.selectListByMenuId(menuId), RoleMenuDO::getRoleId); + } + + // ========== 用户-角色的相关方法 ========== + + @Override + @DSTransactional // 多数据源,使用 @DSTransactional 保证本地事务,以及数据源的切换 + @CacheEvict(value = RedisKeyConstants.USER_ROLE_ID_LIST, key = "#userId") + public void assignUserRole(Long userId, Set roleIds) { + // 获得角色拥有角色编号 + Set dbRoleIds = convertSet(userRoleMapper.selectListByUserId(userId), + UserRoleDO::getRoleId); + // 计算新增和删除的角色编号 + Collection createRoleIds = CollUtil.subtract(roleIds, dbRoleIds); + Collection deleteMenuIds = CollUtil.subtract(dbRoleIds, roleIds); + // 执行新增和删除。对于已经授权的角色,不用做任何处理 + if (!CollectionUtil.isEmpty(createRoleIds)) { + userRoleMapper.insertBatch(CollectionUtils.convertList(createRoleIds, roleId -> { + UserRoleDO entity = new UserRoleDO(); + entity.setUserId(userId); + entity.setRoleId(roleId); + return entity; + })); + } + if (!CollectionUtil.isEmpty(deleteMenuIds)) { + userRoleMapper.deleteListByUserIdAndRoleIdIds(userId, deleteMenuIds); + } + } + + @Override + @CacheEvict(value = RedisKeyConstants.USER_ROLE_ID_LIST, key = "#userId") + public void processUserDeleted(Long userId) { + userRoleMapper.deleteListByUserId(userId); + } + + @Override + public Set getUserRoleIdListByUserId(Long userId) { + return convertSet(userRoleMapper.selectListByUserId(userId), UserRoleDO::getRoleId); + } + + @Override + @Cacheable(value = RedisKeyConstants.USER_ROLE_ID_LIST, key = "#userId") + public Set getUserRoleIdListByUserIdFromCache(Long userId) { + return getUserRoleIdListByUserId(userId); + } + + @Override + public Set getUserRoleIdListByRoleId(Collection roleIds) { + return convertSet(userRoleMapper.selectListByRoleIds(roleIds), UserRoleDO::getUserId); + } + + /** + * 获得用户拥有的角色,并且这些角色是开启状态的 + * + * @param userId 用户编号 + * @return 用户拥有的角色 + */ + @VisibleForTesting + List getEnableUserRoleListByUserIdFromCache(Long userId) { + // 获得用户拥有的角色编号 + Set roleIds = getSelf().getUserRoleIdListByUserIdFromCache(userId); + // 获得角色数组,并移除被禁用的 + List roles = roleService.getRoleListFromCache(roleIds); + roles.removeIf(role -> !CommonStatusEnum.ENABLE.getStatus().equals(role.getStatus())); + return roles; + } + + // ========== 用户-部门的相关方法 ========== + + @Override + public void assignRoleDataScope(Long roleId, Integer dataScope, Set dataScopeDeptIds) { + roleService.updateRoleDataScope(roleId, dataScope, dataScopeDeptIds); + } + + @Override + @DataPermission(enable = false) // 关闭数据权限,不然就会出现递归获取数据权限的问题 + public DeptDataPermissionRespDTO getDeptDataPermission(Long userId) { + // 获得用户的角色 + List roles = getEnableUserRoleListByUserIdFromCache(userId); + + // 如果角色为空,则只能查看自己 + DeptDataPermissionRespDTO result = new DeptDataPermissionRespDTO(); + if (CollUtil.isEmpty(roles)) { + result.setSelf(true); + return result; + } + + // 获得用户的部门编号的缓存,通过 Guava 的 Suppliers 惰性求值,即有且仅有第一次发起 DB 的查询 + Supplier userDeptId = Suppliers.memoize(() -> userService.getUser(userId).getDeptId()); + // 遍历每个角色,计算 + for (RoleDO role : roles) { + // 为空时,跳过 + if (role.getDataScope() == null) { + continue; + } + // 情况一,ALL + if (Objects.equals(role.getDataScope(), DataScopeEnum.ALL.getScope())) { + result.setAll(true); + continue; + } + // 情况二,DEPT_CUSTOM + if (Objects.equals(role.getDataScope(), DataScopeEnum.DEPT_CUSTOM.getScope())) { + CollUtil.addAll(result.getDeptIds(), role.getDataScopeDeptIds()); + // 自定义可见部门时,保证可以看到自己所在的部门。否则,一些场景下可能会有问题。 + // 例如说,登录时,基于 t_user 的 username 查询会可能被 dept_id 过滤掉 + CollUtil.addAll(result.getDeptIds(), userDeptId.get()); + continue; + } + // 情况三,DEPT_ONLY + if (Objects.equals(role.getDataScope(), DataScopeEnum.DEPT_ONLY.getScope())) { + CollectionUtils.addIfNotNull(result.getDeptIds(), userDeptId.get()); + continue; + } + // 情况四,DEPT_DEPT_AND_CHILD + if (Objects.equals(role.getDataScope(), DataScopeEnum.DEPT_AND_CHILD.getScope())) { + CollUtil.addAll(result.getDeptIds(), deptService.getChildDeptIdListFromCache(userDeptId.get())); + // 添加本身部门编号 + CollUtil.addAll(result.getDeptIds(), userDeptId.get()); + continue; + } + // 情况五,SELF + if (Objects.equals(role.getDataScope(), DataScopeEnum.SELF.getScope())) { + result.setSelf(true); + continue; + } + // 未知情况,error log 即可 + log.error("[getDeptDataPermission][LoginUser({}) role({}) 无法处理]", userId, toJsonString(result)); + } + return result; + } + + /** + * 获得自身的代理对象,解决 AOP 生效问题 + * + * @return 自己 + */ + private PermissionServiceImpl getSelf() { + return SpringUtil.getBean(getClass()); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/RoleService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/RoleService.java new file mode 100644 index 0000000..b9c2b22 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/RoleService.java @@ -0,0 +1,142 @@ +package com.win.module.system.service.permission; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.permission.vo.role.RoleCreateReqVO; +import com.win.module.system.controller.permission.vo.role.RoleExportReqVO; +import com.win.module.system.controller.permission.vo.role.RolePageReqVO; +import com.win.module.system.controller.permission.vo.role.RoleUpdateReqVO; +import com.win.module.system.dal.dataobject.permission.RoleDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; +import java.util.Set; + +/** + * 角色 Service 接口 + * + * @author 闻荫源码 + */ +public interface RoleService { + + /** + * 创建角色 + * + * @param reqVO 创建角色信息 + * @param type 角色类型 + * @return 角色编号 + */ + Long createRole(@Valid RoleCreateReqVO reqVO, Integer type); + + /** + * 更新角色 + * + * @param reqVO 更新角色信息 + */ + void updateRole(@Valid RoleUpdateReqVO reqVO); + + /** + * 删除角色 + * + * @param id 角色编号 + */ + void deleteRole(Long id); + + /** + * 更新角色状态 + * + * @param id 角色编号 + * @param status 状态 + */ + void updateRoleStatus(Long id, Integer status); + + /** + * 设置角色的数据权限 + * + * @param id 角色编号 + * @param dataScope 数据范围 + * @param dataScopeDeptIds 部门编号数组 + */ + void updateRoleDataScope(Long id, Integer dataScope, Set dataScopeDeptIds); + + /** + * 获得角色 + * + * @param id 角色编号 + * @return 角色 + */ + RoleDO getRole(Long id); + + /** + * 获得角色,从缓存中 + * + * @param id 角色编号 + * @return 角色 + */ + RoleDO getRoleFromCache(Long id); + + /** + * 获得角色列表 + * + * @param ids 角色编号数组 + * @return 角色列表 + */ + List getRoleList(Collection ids); + + /** + * 获得角色数组,从缓存中 + * + * @param ids 角色编号数组 + * @return 角色数组 + */ + List getRoleListFromCache(Collection ids); + + /** + * 获得角色列表 + * + * @param statuses 筛选的状态 + * @return 角色列表 + */ + List getRoleListByStatus(Collection statuses); + + /** + * 获得所有角色列表 + * + * @return 角色列表 + */ + List getRoleList(); + + /** + * 获得角色分页 + * + * @param reqVO 角色分页查询 + * @return 角色分页结果 + */ + PageResult getRolePage(RolePageReqVO reqVO); + + /** + * 获得角色列表 + * + * @param reqVO 列表查询 + * @return 角色列表 + */ + List getRoleList(RoleExportReqVO reqVO); + + /** + * 判断角色编号数组中,是否有管理员 + * + * @param ids 角色编号数组 + * @return 是否有管理员 + */ + boolean hasAnySuperAdmin(Collection ids); + + /** + * 校验角色们是否有效。如下情况,视为无效: + * 1. 角色编号不存在 + * 2. 角色被禁用 + * + * @param ids 角色编号数组 + */ + void validateRoleList(Collection ids); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/RoleServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/RoleServiceImpl.java new file mode 100644 index 0000000..c62f44c --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/RoleServiceImpl.java @@ -0,0 +1,257 @@ +package com.win.module.system.service.permission; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.extra.spring.SpringUtil; +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.permission.vo.role.RoleCreateReqVO; +import com.win.module.system.controller.permission.vo.role.RoleExportReqVO; +import com.win.module.system.controller.permission.vo.role.RolePageReqVO; +import com.win.module.system.controller.permission.vo.role.RoleUpdateReqVO; +import com.win.module.system.convert.permission.RoleConvert; +import com.win.module.system.dal.dataobject.permission.RoleDO; +import com.win.module.system.dal.mysql.permission.RoleMapper; +import com.win.module.system.dal.redis.RedisKeyConstants; +import com.win.module.system.enums.permission.DataScopeEnum; +import com.win.module.system.enums.permission.RoleCodeEnum; +import com.win.module.system.enums.permission.RoleTypeEnum; +import com.google.common.annotations.VisibleForTesting; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; + +import javax.annotation.Resource; +import java.util.*; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.framework.common.util.collection.CollectionUtils.convertList; +import static com.win.framework.common.util.collection.CollectionUtils.convertMap; +import static com.win.module.system.enums.ErrorCodeConstants.*; + +/** + * 角色 Service 实现类 + * + * @author 闻荫源码 + */ +@Service +@Slf4j +public class RoleServiceImpl implements RoleService { + + @Resource + private PermissionService permissionService; + + @Resource + private RoleMapper roleMapper; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createRole(RoleCreateReqVO reqVO, Integer type) { + // 校验角色 + validateRoleDuplicate(reqVO.getName(), reqVO.getCode(), null); + // 插入到数据库 + RoleDO role = RoleConvert.INSTANCE.convert(reqVO); + role.setType(ObjectUtil.defaultIfNull(type, RoleTypeEnum.CUSTOM.getType())); + role.setStatus(CommonStatusEnum.ENABLE.getStatus()); + role.setDataScope(DataScopeEnum.ALL.getScope()); // 默认可查看所有数据。原因是,可能一些项目不需要项目权限 + roleMapper.insert(role); + // 返回 + return role.getId(); + } + + @Override + @CacheEvict(value = RedisKeyConstants.ROLE, key = "#reqVO.id") + public void updateRole(RoleUpdateReqVO reqVO) { + // 校验是否可以更新 + validateRoleForUpdate(reqVO.getId()); + // 校验角色的唯一字段是否重复 + validateRoleDuplicate(reqVO.getName(), reqVO.getCode(), reqVO.getId()); + + // 更新到数据库 + RoleDO updateObj = RoleConvert.INSTANCE.convert(reqVO); + roleMapper.updateById(updateObj); + } + + @Override + @CacheEvict(value = RedisKeyConstants.ROLE, key = "#id") + public void updateRoleStatus(Long id, Integer status) { + // 校验是否可以更新 + validateRoleForUpdate(id); + + // 更新状态 + RoleDO updateObj = new RoleDO().setId(id).setStatus(status); + roleMapper.updateById(updateObj); + } + + @Override + @CacheEvict(value = RedisKeyConstants.ROLE, key = "#id") + public void updateRoleDataScope(Long id, Integer dataScope, Set dataScopeDeptIds) { + // 校验是否可以更新 + validateRoleForUpdate(id); + + // 更新数据范围 + RoleDO updateObject = new RoleDO(); + updateObject.setId(id); + updateObject.setDataScope(dataScope); + updateObject.setDataScopeDeptIds(dataScopeDeptIds); + roleMapper.updateById(updateObject); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @CacheEvict(value = RedisKeyConstants.ROLE, key = "#id") + public void deleteRole(Long id) { + // 校验是否可以更新 + validateRoleForUpdate(id); + // 标记删除 + roleMapper.deleteById(id); + // 删除相关数据 + permissionService.processRoleDeleted(id); + } + + /** + * 校验角色的唯一字段是否重复 + * + * 1. 是否存在相同名字的角色 + * 2. 是否存在相同编码的角色 + * + * @param name 角色名字 + * @param code 角色额编码 + * @param id 角色编号 + */ + @VisibleForTesting + void validateRoleDuplicate(String name, String code, Long id) { + // 0. 超级管理员,不允许创建 + if (RoleCodeEnum.isSuperAdmin(code)) { + throw exception(ROLE_ADMIN_CODE_ERROR, code); + } + // 1. 该 name 名字被其它角色所使用 + RoleDO role = roleMapper.selectByName(name); + if (role != null && !role.getId().equals(id)) { + throw exception(ROLE_NAME_DUPLICATE, name); + } + // 2. 是否存在相同编码的角色 + if (!StringUtils.hasText(code)) { + return; + } + // 该 code 编码被其它角色所使用 + role = roleMapper.selectByCode(code); + if (role != null && !role.getId().equals(id)) { + throw exception(ROLE_CODE_DUPLICATE, code); + } + } + + /** + * 校验角色是否可以被更新 + * + * @param id 角色编号 + */ + @VisibleForTesting + void validateRoleForUpdate(Long id) { + RoleDO roleDO = roleMapper.selectById(id); + if (roleDO == null) { + throw exception(ROLE_NOT_EXISTS); + } + // 内置角色,不允许删除 + if (RoleTypeEnum.SYSTEM.getType().equals(roleDO.getType())) { + throw exception(ROLE_CAN_NOT_UPDATE_SYSTEM_TYPE_ROLE); + } + } + + @Override + public RoleDO getRole(Long id) { + return roleMapper.selectById(id); + } + + @Override + @Cacheable(value = RedisKeyConstants.ROLE, key = "#id", + unless = "#result == null") + public RoleDO getRoleFromCache(Long id) { + return roleMapper.selectById(id); + } + + + @Override + public List getRoleListByStatus(Collection statuses) { + return roleMapper.selectListByStatus(statuses); + } + + @Override + public List getRoleList() { + return roleMapper.selectList(); + } + + @Override + public List getRoleList(Collection ids) { + if (CollectionUtil.isEmpty(ids)) { + return Collections.emptyList(); + } + return roleMapper.selectBatchIds(ids); + } + + @Override + public List getRoleListFromCache(Collection ids) { + if (CollectionUtil.isEmpty(ids)) { + return Collections.emptyList(); + } + // 这里采用 for 循环从缓存中获取,主要考虑 Spring CacheManager 无法批量操作的问题 + RoleServiceImpl self = getSelf(); + return convertList(ids, self::getRoleFromCache); + } + + @Override + public PageResult getRolePage(RolePageReqVO reqVO) { + return roleMapper.selectPage(reqVO); + } + + @Override + public List getRoleList(RoleExportReqVO reqVO) { + return roleMapper.selectList(reqVO); + } + + @Override + public boolean hasAnySuperAdmin(Collection ids) { + if (CollectionUtil.isEmpty(ids)) { + return false; + } + RoleServiceImpl self = getSelf(); + return ids.stream().anyMatch(id -> { + RoleDO role = self.getRoleFromCache(id); + return role != null && RoleCodeEnum.isSuperAdmin(role.getCode()); + }); + } + + @Override + public void validateRoleList(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return; + } + // 获得角色信息 + List roles = roleMapper.selectBatchIds(ids); + Map roleMap = convertMap(roles, RoleDO::getId); + // 校验 + ids.forEach(id -> { + RoleDO role = roleMap.get(id); + if (role == null) { + throw exception(ROLE_NOT_EXISTS); + } + if (!CommonStatusEnum.ENABLE.getStatus().equals(role.getStatus())) { + throw exception(ROLE_IS_DISABLE, role.getName()); + } + }); + } + + /** + * 获得自身的代理对象,解决 AOP 生效问题 + * + * @return 自己 + */ + private RoleServiceImpl getSelf() { + return SpringUtil.getBean(getClass()); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/bo/RoleCreateReqBO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/bo/RoleCreateReqBO.java new file mode 100644 index 0000000..6a2d0a8 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/bo/RoleCreateReqBO.java @@ -0,0 +1,49 @@ +package com.win.module.system.service.permission.bo; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +/** + * 角色创建 Request BO + * + * @author 闻荫源码 + */ +@Data +public class RoleCreateReqBO { + + /** + * 租户编号 + */ + @NotNull(message = "租户编号不能为空") + private Long tenantId; + + /** + * 角色名称 + */ + @NotBlank(message = "角色名称不能为空") + @Size(max = 30, message = "角色名称长度不能超过30个字符") + private String name; + + /** + * 角色标志 + */ + @NotBlank(message = "角色标志不能为空") + @Size(max = 100, message = "角色标志长度不能超过100个字符") + private String code; + + /** + * 显示顺序 + */ + @NotNull(message = "显示顺序不能为空") + private Integer sort; + + /** + * 角色类型 + */ + @NotNull(message = "角色类型不能为空") + private Integer type; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sensitiveword/SensitiveWordService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sensitiveword/SensitiveWordService.java new file mode 100644 index 0000000..0654748 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sensitiveword/SensitiveWordService.java @@ -0,0 +1,99 @@ +package com.win.module.system.service.sensitiveword; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.sensitiveword.vo.SensitiveWordCreateReqVO; +import com.win.module.system.controller.sensitiveword.vo.SensitiveWordExportReqVO; +import com.win.module.system.controller.sensitiveword.vo.SensitiveWordPageReqVO; +import com.win.module.system.controller.sensitiveword.vo.SensitiveWordUpdateReqVO; +import com.win.module.system.dal.dataobject.sensitiveword.SensitiveWordDO; + +import javax.validation.Valid; +import java.util.List; +import java.util.Set; + +/** + * 敏感词 Service 接口 + * + * @author 永不言败 + */ +public interface SensitiveWordService { + + /** + * 创建敏感词 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createSensitiveWord(@Valid SensitiveWordCreateReqVO createReqVO); + + /** + * 更新敏感词 + * + * @param updateReqVO 更新信息 + */ + void updateSensitiveWord(@Valid SensitiveWordUpdateReqVO updateReqVO); + + /** + * 删除敏感词 + * + * @param id 编号 + */ + void deleteSensitiveWord(Long id); + + /** + * 获得敏感词 + * + * @param id 编号 + * @return 敏感词 + */ + SensitiveWordDO getSensitiveWord(Long id); + + /** + * 获得敏感词列表 + * + * @return 敏感词列表 + */ + List getSensitiveWordList(); + + /** + * 获得敏感词分页 + * + * @param pageReqVO 分页查询 + * @return 敏感词分页 + */ + PageResult getSensitiveWordPage(SensitiveWordPageReqVO pageReqVO); + + /** + * 获得敏感词列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 敏感词列表 + */ + List getSensitiveWordList(SensitiveWordExportReqVO exportReqVO); + + /** + * 获得所有敏感词的标签数组 + * + * @return 标签数组 + */ + Set getSensitiveWordTagSet(); + + /** + * 获得文本所包含的不合法的敏感词数组 + * + * @param text 文本 + * @param tags 标签数组 + * @return 不合法的敏感词数组 + */ + List validateText(String text, List tags); + + /** + * 判断文本是否包含敏感词 + * + * @param text 文本 + * @param tags 表述数组 + * @return 是否包含 + */ + boolean isTextValid(String text, List tags); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sensitiveword/SensitiveWordServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sensitiveword/SensitiveWordServiceImpl.java new file mode 100644 index 0000000..e9c71be --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sensitiveword/SensitiveWordServiceImpl.java @@ -0,0 +1,268 @@ +package com.win.module.system.service.sensitiveword; + +import cn.hutool.core.collection.CollUtil; +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.collection.CollectionUtils; +import com.win.module.system.controller.sensitiveword.vo.SensitiveWordCreateReqVO; +import com.win.module.system.controller.sensitiveword.vo.SensitiveWordExportReqVO; +import com.win.module.system.controller.sensitiveword.vo.SensitiveWordPageReqVO; +import com.win.module.system.controller.sensitiveword.vo.SensitiveWordUpdateReqVO; +import com.win.module.system.convert.sensitiveword.SensitiveWordConvert; +import com.win.module.system.dal.dataobject.sensitiveword.SensitiveWordDO; +import com.win.module.system.dal.mysql.sensitiveword.SensitiveWordMapper; +import com.win.module.system.util.collection.SimpleTrie; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; +import org.springframework.util.Assert; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.util.*; +import java.util.concurrent.TimeUnit; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.framework.common.util.collection.CollectionUtils.filterList; +import static com.win.framework.common.util.collection.CollectionUtils.getMaxValue; +import static com.win.module.system.enums.ErrorCodeConstants.SENSITIVE_WORD_EXISTS; +import static com.win.module.system.enums.ErrorCodeConstants.SENSITIVE_WORD_NOT_EXISTS; + +/** + * 敏感词 Service 实现类 + * + * @author 永不言败 + */ +@Service +@Slf4j +@Validated +public class SensitiveWordServiceImpl implements SensitiveWordService { + + /** + * 是否开启敏感词功能 + */ + private static final Boolean ENABLED = false; + + /** + * 敏感词列表缓存 + */ + @Getter + private volatile List sensitiveWordCache = Collections.emptyList(); + /** + * 敏感词标签缓存 + * key:敏感词编号 {@link SensitiveWordDO#getId()} + *

+ * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 + */ + @Getter + private volatile Set sensitiveWordTagsCache = Collections.emptySet(); + + @Resource + private SensitiveWordMapper sensitiveWordMapper; + + /** + * 默认的敏感词的字典树,包含所有敏感词 + */ + @Getter + private volatile SimpleTrie defaultSensitiveWordTrie = new SimpleTrie(Collections.emptySet()); + /** + * 标签与敏感词的字段数的映射 + */ + @Getter + private volatile Map tagSensitiveWordTries = Collections.emptyMap(); + + /** + * 初始化缓存 + */ + @PostConstruct + public void initLocalCache() { + if (!ENABLED) { + return; + } + + // 第一步:查询数据 + List sensitiveWords = sensitiveWordMapper.selectList(); + log.info("[initLocalCache][缓存敏感词,数量为:{}]", sensitiveWords.size()); + + // 第二步:构建缓存 + // 写入 sensitiveWordTagsCache 缓存 + Set tags = new HashSet<>(); + sensitiveWords.forEach(word -> tags.addAll(word.getTags())); + sensitiveWordTagsCache = tags; + sensitiveWordCache = sensitiveWords; + // 写入 defaultSensitiveWordTrie、tagSensitiveWordTries 缓存 + initSensitiveWordTrie(sensitiveWords); + } + + private void initSensitiveWordTrie(List wordDOs) { + // 过滤禁用的敏感词 + wordDOs = filterList(wordDOs, word -> word.getStatus().equals(CommonStatusEnum.ENABLE.getStatus())); + + // 初始化默认的 defaultSensitiveWordTrie + this.defaultSensitiveWordTrie = new SimpleTrie(CollectionUtils.convertList(wordDOs, SensitiveWordDO::getName)); + + // 初始化 tagSensitiveWordTries + Multimap tagWords = HashMultimap.create(); + for (SensitiveWordDO word : wordDOs) { + if (CollUtil.isEmpty(word.getTags())) { + continue; + } + word.getTags().forEach(tag -> tagWords.put(tag, word.getName())); + } + // 添加到 tagSensitiveWordTries 中 + Map tagSensitiveWordTries = new HashMap<>(); + tagWords.asMap().forEach((tag, words) -> tagSensitiveWordTries.put(tag, new SimpleTrie(words))); + this.tagSensitiveWordTries = tagSensitiveWordTries; + } + + /** + * 通过定时任务轮询,刷新缓存 + * + * 目的:多节点部署时,通过轮询”通知“所有节点,进行刷新 + */ + @Scheduled(initialDelay = 60, fixedRate = 60, timeUnit = TimeUnit.SECONDS) + public void refreshLocalCache() { + // 情况一:如果缓存里没有数据,则直接刷新缓存 + if (CollUtil.isEmpty(sensitiveWordCache)) { + initLocalCache(); + return; + } + + // 情况二,如果缓存里数据,则通过 updateTime 判断是否有数据变更,有变更则刷新缓存 + LocalDateTime maxTime = getMaxValue(sensitiveWordCache, SensitiveWordDO::getUpdateTime); + if (sensitiveWordMapper.selectCountByUpdateTimeGt(maxTime) > 0) { + initLocalCache(); + } + } + + @Override + public Long createSensitiveWord(SensitiveWordCreateReqVO createReqVO) { + // 校验唯一性 + validateSensitiveWordNameUnique(null, createReqVO.getName()); + + // 插入 + SensitiveWordDO sensitiveWord = SensitiveWordConvert.INSTANCE.convert(createReqVO); + sensitiveWordMapper.insert(sensitiveWord); + + // 刷新缓存 + initLocalCache(); + return sensitiveWord.getId(); + } + + @Override + public void updateSensitiveWord(SensitiveWordUpdateReqVO updateReqVO) { + // 校验唯一性 + validateSensitiveWordExists(updateReqVO.getId()); + validateSensitiveWordNameUnique(updateReqVO.getId(), updateReqVO.getName()); + + // 更新 + SensitiveWordDO updateObj = SensitiveWordConvert.INSTANCE.convert(updateReqVO); + sensitiveWordMapper.updateById(updateObj); + + // 刷新缓存 + initLocalCache(); + } + + @Override + public void deleteSensitiveWord(Long id) { + // 校验存在 + validateSensitiveWordExists(id); + // 删除 + sensitiveWordMapper.deleteById(id); + + // 刷新缓存 + initLocalCache(); + } + + private void validateSensitiveWordNameUnique(Long id, String name) { + SensitiveWordDO word = sensitiveWordMapper.selectByName(name); + if (word == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的敏感词 + if (id == null) { + throw exception(SENSITIVE_WORD_EXISTS); + } + if (!word.getId().equals(id)) { + throw exception(SENSITIVE_WORD_EXISTS); + } + } + + private void validateSensitiveWordExists(Long id) { + if (sensitiveWordMapper.selectById(id) == null) { + throw exception(SENSITIVE_WORD_NOT_EXISTS); + } + } + + @Override + public SensitiveWordDO getSensitiveWord(Long id) { + return sensitiveWordMapper.selectById(id); + } + + @Override + public List getSensitiveWordList() { + return sensitiveWordMapper.selectList(); + } + + @Override + public PageResult getSensitiveWordPage(SensitiveWordPageReqVO pageReqVO) { + return sensitiveWordMapper.selectPage(pageReqVO); + } + + @Override + public List getSensitiveWordList(SensitiveWordExportReqVO exportReqVO) { + return sensitiveWordMapper.selectList(exportReqVO); + } + + @Override + public Set getSensitiveWordTagSet() { + return sensitiveWordTagsCache; + } + + @Override + public List validateText(String text, List tags) { + Assert.isTrue(ENABLED, "敏感词功能未开启,请将 ENABLED 设置为 true"); + + // 无标签时,默认所有 + if (CollUtil.isEmpty(tags)) { + return defaultSensitiveWordTrie.validate(text); + } + // 有标签的情况 + Set result = new HashSet<>(); + tags.forEach(tag -> { + SimpleTrie trie = tagSensitiveWordTries.get(tag); + if (trie == null) { + return; + } + result.addAll(trie.validate(text)); + }); + return new ArrayList<>(result); + } + + @Override + public boolean isTextValid(String text, List tags) { + Assert.isTrue(ENABLED, "敏感词功能未开启,请将 ENABLED 设置为 true"); + + // 无标签时,默认所有 + if (CollUtil.isEmpty(tags)) { + return defaultSensitiveWordTrie.isValid(text); + } + // 有标签的情况 + for (String tag : tags) { + SimpleTrie trie = tagSensitiveWordTries.get(tag); + if (trie == null) { + continue; + } + if (!trie.isValid(text)) { + return false; + } + } + return true; + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/serialnumber/SerialNumberService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/serialnumber/SerialNumberService.java new file mode 100644 index 0000000..0ae7009 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/serialnumber/SerialNumberService.java @@ -0,0 +1,83 @@ +package com.win.module.system.service.serialnumber; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.serialnumber.vo.SerialNumberCreateReqVO; +import com.win.module.system.controller.serialnumber.vo.SerialNumberExportReqVO; +import com.win.module.system.controller.serialnumber.vo.SerialNumberPageReqVO; +import com.win.module.system.controller.serialnumber.vo.SerialNumberUpdateReqVO; +import com.win.module.system.dal.dataobject.serialnumber.SerialNumberDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 流水号规则 Service 接口 + * + * @author 超级管理员 + */ +public interface SerialNumberService { + + /** + * 创建流水号规则 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createSerialNumber(@Valid SerialNumberCreateReqVO createReqVO); + + /** + * 更新流水号规则 + * + * @param updateReqVO 更新信息 + */ + void updateSerialNumber(@Valid SerialNumberUpdateReqVO updateReqVO); + + /** + * 删除流水号规则 + * + * @param id 编号 + */ + void deleteSerialNumber(Long id); + + /** + * 获得流水号规则 + * + * @param id 编号 + * @return 流水号规则 + */ + SerialNumberDO getSerialNumber(Long id); + + /** + * 获得流水号规则列表 + * + * @param ids 编号 + * @return 流水号规则列表 + */ + List getSerialNumberList(Collection ids); + + /** + * 获得流水号规则分页 + * + * @param pageReqVO 分页查询 + * @return 流水号规则分页 + */ + PageResult getSerialNumberPage(SerialNumberPageReqVO pageReqVO); + + /** + * 获得流水号规则列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 流水号规则列表 + */ + List getSerialNumberList(SerialNumberExportReqVO exportReqVO); + + /** + * 根据编码规则生成编码 + * + * @param ruleCode + * @return + */ + String generateCode(String ruleCode); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/serialnumber/SerialNumberServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/serialnumber/SerialNumberServiceImpl.java new file mode 100644 index 0000000..2963d90 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/serialnumber/SerialNumberServiceImpl.java @@ -0,0 +1,141 @@ +package com.win.module.system.service.serialnumber; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.redis.util.RedisCache; +import com.win.module.system.controller.serialnumber.vo.SerialNumberCreateReqVO; +import com.win.module.system.controller.serialnumber.vo.SerialNumberExportReqVO; +import com.win.module.system.controller.serialnumber.vo.SerialNumberPageReqVO; +import com.win.module.system.controller.serialnumber.vo.SerialNumberUpdateReqVO; +import com.win.module.system.convert.serialnumber.SerialNumberConvert; +import com.win.module.system.dal.dataobject.serialnumber.SerialNumberDO; +import com.win.module.system.dal.mysql.serialnumber.SerialNumberMapper; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.Collection; +import java.util.List; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.system.enums.ErrorCodeConstants.*; + +/** + * 流水号规则 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class SerialNumberServiceImpl implements SerialNumberService { + + @Resource + private RedisCache redisCache; + @Resource + private SerialNumberMapper serialNumberMapper; + + @Override + public Long createSerialNumber(SerialNumberCreateReqVO createReqVO) { + // 校验存在 + validateSerialNumberNotExists(createReqVO.getRuleCode()); + // 插入 + SerialNumberDO serialNumber = SerialNumberConvert.INSTANCE.convert(createReqVO); + serialNumberMapper.insert(serialNumber); + // 返回 + return serialNumber.getId(); + } + + @Override + public void updateSerialNumber(SerialNumberUpdateReqVO updateReqVO) { + // 校验存在 + validateSerialNumberExists(updateReqVO.getId()); + // 更新 + SerialNumberDO updateObj = SerialNumberConvert.INSTANCE.convert(updateReqVO); + serialNumberMapper.updateById(updateObj); + } + + @Override + public void deleteSerialNumber(Long id) { + // 校验存在 + validateSerialNumberExists(id); + // 删除 + serialNumberMapper.deleteById(id); + } + + private void validateSerialNumberExists(Long id) { + if (serialNumberMapper.selectById(id) == null) { + throw exception(SERIAL_NUMBER_NOT_EXISTS); + } + } + + private void validateSerialNumberNotExists(String ruleCode) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("rule_code", ruleCode); + if (serialNumberMapper.selectCount(queryWrapper) != 0) { + throw exception(SERIAL_NUMBER_EXISTS); + } + } + + @Override + public SerialNumberDO getSerialNumber(Long id) { + return serialNumberMapper.selectById(id); + } + + @Override + public List getSerialNumberList(Collection ids) { + return serialNumberMapper.selectBatchIds(ids); + } + + @Override + public PageResult getSerialNumberPage(SerialNumberPageReqVO pageReqVO) { + return serialNumberMapper.selectPage(pageReqVO); + } + + @Override + public List getSerialNumberList(SerialNumberExportReqVO exportReqVO) { + return serialNumberMapper.selectList(exportReqVO); + } + + @Override + public synchronized String generateCode(String ruleCode) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("rule_code", ruleCode); + SerialNumberDO encodedRule = serialNumberMapper.selectOne(queryWrapper); + String pattern = ""; + if(encodedRule == null) { + throw exception(SERIAL_NUMBER_NOT_EXISTS); + } + if(encodedRule.getPattern() != null && !encodedRule.getPattern().equals("")) { + LocalDate currentDate = LocalDate.now(); + pattern = currentDate.format(DateTimeFormatter.ofPattern(encodedRule.getPattern().replace("m", "M"))); + } + long millMinutes = 0; + if(encodedRule.getPattern().toLowerCase().indexOf("d") > 0) { //包含日 + LocalDateTime midnight = LocalDateTime.now().plusDays(1).withHour(0).withMinute(0).withSecond(0).withNano(1); + millMinutes = ChronoUnit.MINUTES.between(LocalDateTime.now(), midnight); + } else if(encodedRule.getPattern().toLowerCase().indexOf("m") > 0) { //包含月 + LocalDateTime midnight = LocalDateTime.now().plusMonths(1).plusDays(1).withHour(0).withMinute(0).withSecond(0).withNano(1); + millMinutes = ChronoUnit.MONTHS.between(LocalDateTime.now(), midnight); + } else if(encodedRule.getPattern().toLowerCase().indexOf("y") > 0) { + LocalDateTime midnight = LocalDateTime.now().plusYears(1).plusMonths(1).plusDays(1).withHour(0).withMinute(0).withSecond(0).withNano(1); + millMinutes = ChronoUnit.YEARS.between(LocalDateTime.now(), midnight); + } + StringBuilder code = new StringBuilder(); + Long increment = redisCache.incr(encodedRule.getRuleCode() + pattern, millMinutes); + code.append(encodedRule.getPrefix()); + code.append(pattern); + code.append(encodedRule.getSeparator()); + String incrementStr = increment.toString(); + if (incrementStr.length() <= encodedRule.getLength()) { + code.append(String.format("%0" + encodedRule.getLength() + "d", increment)); + } else { + throw exception(SERIAL_NUMBER_NOT_ENOUGH); + } + return code.toString(); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsChannelService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsChannelService.java new file mode 100644 index 0000000..a0bd2e1 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsChannelService.java @@ -0,0 +1,82 @@ +package com.win.module.system.service.sms; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.sms.core.client.SmsClient; +import com.win.module.system.controller.sms.vo.channel.SmsChannelCreateReqVO; +import com.win.module.system.controller.sms.vo.channel.SmsChannelPageReqVO; +import com.win.module.system.controller.sms.vo.channel.SmsChannelUpdateReqVO; +import com.win.module.system.dal.dataobject.sms.SmsChannelDO; + +import javax.validation.Valid; +import java.util.List; + +/** + * 短信渠道 Service 接口 + * + * @author zzf + * @since 2021/1/25 9:24 + */ +public interface SmsChannelService { + + /** + * 创建短信渠道 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createSmsChannel(@Valid SmsChannelCreateReqVO createReqVO); + + /** + * 更新短信渠道 + * + * @param updateReqVO 更新信息 + */ + void updateSmsChannel(@Valid SmsChannelUpdateReqVO updateReqVO); + + /** + * 删除短信渠道 + * + * @param id 编号 + */ + void deleteSmsChannel(Long id); + + /** + * 获得短信渠道 + * + * @param id 编号 + * @return 短信渠道 + */ + SmsChannelDO getSmsChannel(Long id); + + /** + * 获得所有短信渠道列表 + * + * @return 短信渠道列表 + */ + List getSmsChannelList(); + + /** + * 获得短信渠道分页 + * + * @param pageReqVO 分页查询 + * @return 短信渠道分页 + */ + PageResult getSmsChannelPage(SmsChannelPageReqVO pageReqVO); + + /** + * 获得短信客户端 + * + * @param id 编号 + * @return 短信客户端 + */ + SmsClient getSmsClient(Long id); + + /** + * 获得短信客户端 + * + * @param code 编码 + * @return 短信客户端 + */ + SmsClient getSmsClient(String code); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsChannelServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsChannelServiceImpl.java new file mode 100644 index 0000000..cd07eec --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsChannelServiceImpl.java @@ -0,0 +1,167 @@ +package com.win.module.system.service.sms; + +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.sms.core.client.SmsClient; +import com.win.framework.sms.core.client.SmsClientFactory; +import com.win.framework.sms.core.property.SmsChannelProperties; +import com.win.module.system.controller.sms.vo.channel.SmsChannelCreateReqVO; +import com.win.module.system.controller.sms.vo.channel.SmsChannelPageReqVO; +import com.win.module.system.controller.sms.vo.channel.SmsChannelUpdateReqVO; +import com.win.module.system.convert.sms.SmsChannelConvert; +import com.win.module.system.dal.dataobject.sms.SmsChannelDO; +import com.win.module.system.dal.mysql.sms.SmsChannelMapper; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.time.Duration; +import java.util.List; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.framework.common.util.cache.CacheUtils.buildAsyncReloadingCache; +import static com.win.module.system.enums.ErrorCodeConstants.SMS_CHANNEL_HAS_CHILDREN; +import static com.win.module.system.enums.ErrorCodeConstants.SMS_CHANNEL_NOT_EXISTS; + +/** + * 短信渠道 Service 实现类 + * + * @author zzf + */ +@Service +@Slf4j +public class SmsChannelServiceImpl implements SmsChannelService { + + /** + * {@link SmsClient} 缓存,通过它异步刷新 smsClientFactory + */ + @Getter + private final LoadingCache idClientCache = buildAsyncReloadingCache(Duration.ofSeconds(10L), + new CacheLoader() { + + @Override + public SmsClient load(Long id) { + // 查询,然后尝试刷新 + SmsChannelDO channel = smsChannelMapper.selectById(id); + if (channel != null) { + SmsChannelProperties properties = SmsChannelConvert.INSTANCE.convert02(channel); + smsClientFactory.createOrUpdateSmsClient(properties); + } + return smsClientFactory.getSmsClient(id); + } + + }); + + /** + * {@link SmsClient} 缓存,通过它异步刷新 smsClientFactory + */ + @Getter + private final LoadingCache codeClientCache = buildAsyncReloadingCache(Duration.ofSeconds(60L), + new CacheLoader() { + + @Override + public SmsClient load(String code) { + // 查询,然后尝试刷新 + SmsChannelDO channel = smsChannelMapper.selectByCode(code); + if (channel != null) { + SmsChannelProperties properties = SmsChannelConvert.INSTANCE.convert02(channel); + smsClientFactory.createOrUpdateSmsClient(properties); + } + return smsClientFactory.getSmsClient(code); + } + + }); + + @Resource + private SmsClientFactory smsClientFactory; + + @Resource + private SmsChannelMapper smsChannelMapper; + + @Resource + private SmsTemplateService smsTemplateService; + + @Override + public Long createSmsChannel(SmsChannelCreateReqVO createReqVO) { + SmsChannelDO channel = SmsChannelConvert.INSTANCE.convert(createReqVO); + smsChannelMapper.insert(channel); + return channel.getId(); + } + + @Override + public void updateSmsChannel(SmsChannelUpdateReqVO updateReqVO) { + // 校验存在 + SmsChannelDO channel = validateSmsChannelExists(updateReqVO.getId()); + // 更新 + SmsChannelDO updateObj = SmsChannelConvert.INSTANCE.convert(updateReqVO); + smsChannelMapper.updateById(updateObj); + + // 清空缓存 + clearCache(updateReqVO.getId(), channel.getCode()); + } + + @Override + public void deleteSmsChannel(Long id) { + // 校验存在 + SmsChannelDO channel = validateSmsChannelExists(id); + // 校验是否有在使用该账号的模版 + if (smsTemplateService.countByChannelId(id) > 0) { + throw exception(SMS_CHANNEL_HAS_CHILDREN); + } + // 删除 + smsChannelMapper.deleteById(id); + + // 清空缓存 + clearCache(id, channel.getCode()); + } + + /** + * 清空指定渠道编号的缓存 + * + * @param id 渠道编号 + * @param code 渠道编码 + */ + private void clearCache(Long id, String code) { + idClientCache.invalidate(id); + if (StrUtil.isNotEmpty(code)) { + codeClientCache.invalidate(code); + } + } + + private SmsChannelDO validateSmsChannelExists(Long id) { + SmsChannelDO channel = smsChannelMapper.selectById(id); + if (channel == null) { + throw exception(SMS_CHANNEL_NOT_EXISTS); + } + return channel; + } + + @Override + public SmsChannelDO getSmsChannel(Long id) { + return smsChannelMapper.selectById(id); + } + + @Override + public List getSmsChannelList() { + return smsChannelMapper.selectList(); + } + + @Override + public PageResult getSmsChannelPage(SmsChannelPageReqVO pageReqVO) { + return smsChannelMapper.selectPage(pageReqVO); + } + + @Override + public SmsClient getSmsClient(Long id) { + return idClientCache.getUnchecked(id); + } + + @Override + public SmsClient getSmsClient(String code) { + return codeClientCache.getUnchecked(code); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsCodeService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsCodeService.java new file mode 100644 index 0000000..2d5d180 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsCodeService.java @@ -0,0 +1,40 @@ +package com.win.module.system.service.sms; + +import com.win.framework.common.exception.ServiceException; +import com.win.module.system.api.sms.dto.code.SmsCodeValidateReqDTO; +import com.win.module.system.api.sms.dto.code.SmsCodeSendReqDTO; +import com.win.module.system.api.sms.dto.code.SmsCodeUseReqDTO; + +import javax.validation.Valid; + +/** + * 短信验证码 Service 接口 + * + * @author 闻荫源码 + */ +public interface SmsCodeService { + + /** + * 创建短信验证码,并进行发送 + * + * @param reqDTO 发送请求 + */ + void sendSmsCode(@Valid SmsCodeSendReqDTO reqDTO); + + /** + * 验证短信验证码,并进行使用 + * 如果正确,则将验证码标记成已使用 + * 如果错误,则抛出 {@link ServiceException} 异常 + * + * @param reqDTO 使用请求 + */ + void useSmsCode(@Valid SmsCodeUseReqDTO reqDTO); + + /** + * 检查验证码是否有效 + * + * @param reqDTO 校验请求 + */ + void validateSmsCode(@Valid SmsCodeValidateReqDTO reqDTO); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsCodeServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsCodeServiceImpl.java new file mode 100644 index 0000000..5ee86aa --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsCodeServiceImpl.java @@ -0,0 +1,110 @@ +package com.win.module.system.service.sms; + +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.map.MapUtil; +import com.win.module.system.api.sms.dto.code.SmsCodeSendReqDTO; +import com.win.module.system.api.sms.dto.code.SmsCodeUseReqDTO; +import com.win.module.system.api.sms.dto.code.SmsCodeValidateReqDTO; +import com.win.module.system.dal.dataobject.sms.SmsCodeDO; +import com.win.module.system.dal.mysql.sms.SmsCodeMapper; +import com.win.module.system.enums.sms.SmsSceneEnum; +import com.win.module.system.framework.sms.SmsCodeProperties; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.time.LocalDateTime; + +import static cn.hutool.core.util.RandomUtil.randomInt; +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.framework.common.util.date.DateUtils.isToday; +import static com.win.module.system.enums.ErrorCodeConstants.*; + +/** + * 短信验证码 Service 实现类 + * + * @author 闻荫源码 + */ +@Service +@Validated +public class SmsCodeServiceImpl implements SmsCodeService { + + @Resource + private SmsCodeProperties smsCodeProperties; + + @Resource + private SmsCodeMapper smsCodeMapper; + + @Resource + private SmsSendService smsSendService; + + @Override + public void sendSmsCode(SmsCodeSendReqDTO reqDTO) { + SmsSceneEnum sceneEnum = SmsSceneEnum.getCodeByScene(reqDTO.getScene()); + Assert.notNull(sceneEnum, "验证码场景({}) 查找不到配置", reqDTO.getScene()); + // 创建验证码 + String code = createSmsCode(reqDTO.getMobile(), reqDTO.getScene(), reqDTO.getCreateIp()); + // 发送验证码 + smsSendService.sendSingleSms(reqDTO.getMobile(), null, sceneEnum.getTemplateCode(), MapUtil.of("code", code)); + } + + private String createSmsCode(String mobile, Integer scene, String ip) { + // 校验是否可以发送验证码,不用筛选场景 + SmsCodeDO lastSmsCode = smsCodeMapper.selectLastByMobile(mobile, null, null); + if (lastSmsCode != null) { + if (LocalDateTimeUtil.between(lastSmsCode.getCreateTime(), LocalDateTime.now()).toMillis() + < smsCodeProperties.getSendFrequency().toMillis()) { // 发送过于频繁 + throw exception(SMS_CODE_SEND_TOO_FAST); + } + if (isToday(lastSmsCode.getCreateTime()) && // 必须是今天,才能计算超过当天的上限 + lastSmsCode.getTodayIndex() >= smsCodeProperties.getSendMaximumQuantityPerDay()) { // 超过当天发送的上限。 + throw exception(SMS_CODE_EXCEED_SEND_MAXIMUM_QUANTITY_PER_DAY); + } + // TODO 芋艿:提升,每个 IP 每天可发送数量 + // TODO 芋艿:提升,每个 IP 每小时可发送数量 + } + + // 创建验证码记录 + String code = String.valueOf(randomInt(smsCodeProperties.getBeginCode(), smsCodeProperties.getEndCode() + 1)); + SmsCodeDO newSmsCode = SmsCodeDO.builder().mobile(mobile).code(code).scene(scene) + .todayIndex(lastSmsCode != null && isToday(lastSmsCode.getCreateTime()) ? lastSmsCode.getTodayIndex() + 1 : 1) + .createIp(ip).used(false).build(); + smsCodeMapper.insert(newSmsCode); + return code; + } + + @Override + public void useSmsCode(SmsCodeUseReqDTO reqDTO) { + // 检测验证码是否有效 + SmsCodeDO lastSmsCode = validateSmsCode0(reqDTO.getMobile(), reqDTO.getCode(), reqDTO.getScene()); + // 使用验证码 + smsCodeMapper.updateById(SmsCodeDO.builder().id(lastSmsCode.getId()) + .used(true).usedTime(LocalDateTime.now()).usedIp(reqDTO.getUsedIp()).build()); + } + + @Override + public void validateSmsCode(SmsCodeValidateReqDTO reqDTO) { + validateSmsCode0(reqDTO.getMobile(), reqDTO.getCode(), reqDTO.getScene()); + } + + private SmsCodeDO validateSmsCode0(String mobile, String code, Integer scene) { + // 校验验证码 + SmsCodeDO lastSmsCode = smsCodeMapper.selectLastByMobile(mobile, code, scene); + // 若验证码不存在,抛出异常 + if (lastSmsCode == null) { + throw exception(SMS_CODE_NOT_FOUND); + } + // 超过时间 + if (LocalDateTimeUtil.between(lastSmsCode.getCreateTime(), LocalDateTime.now()).toMillis() + >= smsCodeProperties.getExpireTimes().toMillis()) { // 验证码已过期 + throw exception(SMS_CODE_EXPIRED); + } + // 判断验证码是否已被使用 + if (Boolean.TRUE.equals(lastSmsCode.getUsed())) { + throw exception(SMS_CODE_USED); + } + return lastSmsCode; + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsLogService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsLogService.java new file mode 100644 index 0000000..2d449f6 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsLogService.java @@ -0,0 +1,75 @@ +package com.win.module.system.service.sms; + +import com.win.module.system.controller.sms.vo.log.SmsLogExportReqVO; +import com.win.module.system.controller.sms.vo.log.SmsLogPageReqVO; +import com.win.module.system.dal.dataobject.sms.SmsLogDO; +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.dal.dataobject.sms.SmsTemplateDO; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; + +/** + * 短信日志 Service 接口 + * + * @author zzf + * @date 13:48 2021/3/2 + */ +public interface SmsLogService { + + /** + * 创建短信日志 + * + * @param mobile 手机号 + * @param userId 用户编号 + * @param isSend 是否发送 + * @param template 短信模板 + * @param templateContent 短信内容 + * @param templateParams 短信参数 + * @return 发送日志编号 + */ + Long createSmsLog(String mobile, Long userId, Boolean isSend, SmsTemplateDO template, String templateContent, Map templateParams); + + /** + * 更新日志的发送结果 + * + * @param id 日志编号 + * @param sendCode 发送结果的编码 + * @param sendMsg 发送结果的提示 + * @param apiSendCode 短信 API 发送结果的编码 + * @param apiSendMsg 短信 API 发送失败的提示 + * @param apiRequestId 短信 API 发送返回的唯一请求 ID + * @param apiSerialNo 短信 API 发送返回的序号 + */ + void updateSmsSendResult(Long id, Integer sendCode, String sendMsg, + String apiSendCode, String apiSendMsg, String apiRequestId, String apiSerialNo); + + /** + * 更新日志的接收结果 + * + * @param id 日志编号 + * @param success 是否接收成功 + * @param receiveTime 用户接收时间 + * @param apiReceiveCode API 接收结果的编码 + * @param apiReceiveMsg API 接收结果的说明 + */ + void updateSmsReceiveResult(Long id, Boolean success, LocalDateTime receiveTime, String apiReceiveCode, String apiReceiveMsg); + + /** + * 获得短信日志分页 + * + * @param pageReqVO 分页查询 + * @return 短信日志分页 + */ + PageResult getSmsLogPage(SmsLogPageReqVO pageReqVO); + + /** + * 获得短信日志列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 短信日志列表 + */ + List getSmsLogList(SmsLogExportReqVO exportReqVO); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsLogServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsLogServiceImpl.java new file mode 100644 index 0000000..dddc6cf --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsLogServiceImpl.java @@ -0,0 +1,88 @@ +package com.win.module.system.service.sms; + +import com.win.framework.common.pojo.CommonResult; +import com.win.module.system.controller.sms.vo.log.SmsLogExportReqVO; +import com.win.module.system.controller.sms.vo.log.SmsLogPageReqVO; +import com.win.module.system.dal.dataobject.sms.SmsLogDO; +import com.win.module.system.dal.dataobject.sms.SmsTemplateDO; +import com.win.module.system.dal.mysql.sms.SmsLogMapper; +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.enums.sms.SmsReceiveStatusEnum; +import com.win.module.system.enums.sms.SmsSendStatusEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * 短信日志 Service 实现类 + * + * @author zzf + */ +@Slf4j +@Service +public class SmsLogServiceImpl implements SmsLogService { + + @Resource + private SmsLogMapper smsLogMapper; + + @Override + public Long createSmsLog(String mobile, Long userId, Boolean isSend, + SmsTemplateDO template, String templateContent, Map templateParams) { + SmsLogDO.SmsLogDOBuilder logBuilder = SmsLogDO.builder(); + // 根据是否要发送,设置状态 + logBuilder.sendStatus(Objects.equals(isSend, true) ? SmsSendStatusEnum.INIT.getStatus() + : SmsSendStatusEnum.IGNORE.getStatus()); + // 设置手机相关字段 + logBuilder.mobile(mobile).userId(userId); + // 设置模板相关字段 + logBuilder.templateId(template.getId()).templateCode(template.getCode()).templateType(template.getType()); + logBuilder.templateContent(templateContent).templateParams(templateParams) + .apiTemplateId(template.getApiTemplateId()); + // 设置渠道相关字段 + logBuilder.channelId(template.getChannelId()).channelCode(template.getChannelCode()); + // 设置接收相关字段 + logBuilder.receiveStatus(SmsReceiveStatusEnum.INIT.getStatus()); + + // 插入数据库 + SmsLogDO logDO = logBuilder.build(); + smsLogMapper.insert(logDO); + return logDO.getId(); + } + + @Override + public void updateSmsSendResult(Long id, Integer sendCode, String sendMsg, + String apiSendCode, String apiSendMsg, + String apiRequestId, String apiSerialNo) { + SmsSendStatusEnum sendStatus = CommonResult.isSuccess(sendCode) ? + SmsSendStatusEnum.SUCCESS : SmsSendStatusEnum.FAILURE; + smsLogMapper.updateById(SmsLogDO.builder().id(id).sendStatus(sendStatus.getStatus()) + .sendTime(LocalDateTime.now()).sendCode(sendCode).sendMsg(sendMsg) + .apiSendCode(apiSendCode).apiSendMsg(apiSendMsg) + .apiRequestId(apiRequestId).apiSerialNo(apiSerialNo).build()); + } + + @Override + public void updateSmsReceiveResult(Long id, Boolean success, LocalDateTime receiveTime, + String apiReceiveCode, String apiReceiveMsg) { + SmsReceiveStatusEnum receiveStatus = Objects.equals(success, true) ? + SmsReceiveStatusEnum.SUCCESS : SmsReceiveStatusEnum.FAILURE; + smsLogMapper.updateById(SmsLogDO.builder().id(id).receiveStatus(receiveStatus.getStatus()) + .receiveTime(receiveTime).apiReceiveCode(apiReceiveCode).apiReceiveMsg(apiReceiveMsg).build()); + } + + @Override + public PageResult getSmsLogPage(SmsLogPageReqVO pageReqVO) { + return smsLogMapper.selectPage(pageReqVO); + } + + @Override + public List getSmsLogList(SmsLogExportReqVO exportReqVO) { + return smsLogMapper.selectList(exportReqVO); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsSendService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsSendService.java new file mode 100644 index 0000000..9a4b4e6 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsSendService.java @@ -0,0 +1,61 @@ +package com.win.module.system.service.sms; + +import com.win.module.system.mq.message.sms.SmsSendMessage; + +import java.util.List; +import java.util.Map; + +/** + * 短信发送 Service 接口 + * + * @author 闻荫源码 + */ +public interface SmsSendService { + + /** + * 发送单条短信给管理后台的用户 + * + * 在 mobile 为空时,使用 userId 加载对应管理员的手机号 + * + * @param mobile 手机号 + * @param userId 用户编号 + * @param templateCode 短信模板编号 + * @param templateParams 短信模板参数 + * @return 发送日志编号 + */ + Long sendSingleSmsToAdmin(String mobile, Long userId, + String templateCode, Map templateParams); + + /** + * 发送单条短信给用户 + * + * @param mobile 手机号 + * @param userId 用户编号 + * @param templateCode 短信模板编号 + * @param templateParams 短信模板参数 + * @return 发送日志编号 + */ + Long sendSingleSms(String mobile, Long userId, String templateCode, Map templateParams); + + default void sendBatchSms(List mobiles, List userIds, String templateCode, Map templateParams) { + throw new UnsupportedOperationException("暂时不支持该操作,感兴趣可以实现该功能哟!"); + } + + /** + * 执行真正的短信发送 + * 注意,该方法仅仅提供给 MQ Consumer 使用 + * + * @param message 短信 + */ + void doSendSms(SmsSendMessage message); + + /** + * 接收短信的接收结果 + * + * @param channelCode 渠道编码 + * @param text 结果内容 + * @throws Throwable 处理失败时,抛出异常 + */ + void receiveSmsStatus(String channelCode, String text) throws Throwable; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsSendServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsSendServiceImpl.java new file mode 100644 index 0000000..c446a2b --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsSendServiceImpl.java @@ -0,0 +1,168 @@ +package com.win.module.system.service.sms; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.StrUtil; +import com.google.common.annotations.VisibleForTesting; +import com.win.framework.common.core.KeyValue; +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.datapermission.core.annotation.DataPermission; +import com.win.framework.sms.core.client.SmsClient; +import com.win.framework.sms.core.client.SmsCommonResult; +import com.win.framework.sms.core.client.dto.SmsReceiveRespDTO; +import com.win.framework.sms.core.client.dto.SmsSendRespDTO; +import com.win.module.system.dal.dataobject.sms.SmsChannelDO; +import com.win.module.system.dal.dataobject.sms.SmsTemplateDO; +import com.win.module.system.dal.dataobject.user.AdminUserDO; +import com.win.module.system.mq.message.sms.SmsSendMessage; +import com.win.module.system.mq.producer.sms.SmsProducer; +import com.win.module.system.service.user.AdminUserService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.system.enums.ErrorCodeConstants.*; + +/** + * 短信发送 Service 发送的实现 + * + * @author 闻荫源码 + */ +@Service +public class SmsSendServiceImpl implements SmsSendService { + + @Resource + private AdminUserService adminUserService; + @Resource + private SmsChannelService smsChannelService; + @Resource + private SmsTemplateService smsTemplateService; + @Resource + private SmsLogService smsLogService; + + @Resource + private SmsProducer smsProducer; + + @Override + @DataPermission(enable = false) // 发送短信时,无需考虑数据权限 + public Long sendSingleSmsToAdmin(String mobile, Long userId, String templateCode, Map templateParams) { + // 如果 mobile 为空,则加载用户编号对应的手机号 + if (StrUtil.isEmpty(mobile)) { + AdminUserDO user = adminUserService.getUser(userId); + if (user != null) { + mobile = user.getMobile(); + } + } + // 执行发送 + return sendSingleSms(mobile, userId, templateCode, templateParams); + } + + @Override + public Long sendSingleSms(String mobile, Long userId, String templateCode, Map templateParams) { + // 校验短信模板是否合法 + SmsTemplateDO template = validateSmsTemplate(templateCode); + // 校验短信渠道是否合法 + SmsChannelDO smsChannel = validateSmsChannel(template.getChannelId()); + + // 校验手机号码是否存在 + mobile = validateMobile(mobile); + // 构建有序的模板参数。为什么放在这个位置,是提前保证模板参数的正确性,而不是到了插入发送日志 + List> newTemplateParams = buildTemplateParams(template, templateParams); + + // 创建发送日志。如果模板被禁用,则不发送短信,只记录日志 + Boolean isSend = CommonStatusEnum.ENABLE.getStatus().equals(template.getStatus()) + && CommonStatusEnum.ENABLE.getStatus().equals(smsChannel.getStatus()); + String content = smsTemplateService.formatSmsTemplateContent(template.getContent(), templateParams); + Long sendLogId = smsLogService.createSmsLog(mobile, userId, isSend, template, content, templateParams); + + // 发送 MQ 消息,异步执行发送短信 + if (isSend) { + smsProducer.sendMessage(sendLogId, mobile, template.getChannelId(), + template.getApiTemplateId(), newTemplateParams); + } + return sendLogId; + } + + @VisibleForTesting + SmsChannelDO validateSmsChannel(Long channelId) { + // 获得短信模板。考虑到效率,从缓存中获取 + SmsChannelDO channelDO = smsChannelService.getSmsChannel(channelId); + // 短信模板不存在 + if (channelDO == null) { + throw exception(SMS_CHANNEL_NOT_EXISTS); + } + return channelDO; + } + + @VisibleForTesting + SmsTemplateDO validateSmsTemplate(String templateCode) { + // 获得短信模板。考虑到效率,从缓存中获取 + SmsTemplateDO template = smsTemplateService.getSmsTemplateByCodeFromCache(templateCode); + // 短信模板不存在 + if (template == null) { + throw exception(SMS_SEND_TEMPLATE_NOT_EXISTS); + } + return template; + } + + /** + * 将参数模板,处理成有序的 KeyValue 数组 + *

+ * 原因是,部分短信平台并不是使用 key 作为参数,而是数组下标,例如说 腾讯云 + * + * @param template 短信模板 + * @param templateParams 原始参数 + * @return 处理后的参数 + */ + @VisibleForTesting + List> buildTemplateParams(SmsTemplateDO template, Map templateParams) { + return template.getParams().stream().map(key -> { + Object value = templateParams.get(key); + if (value == null) { + throw exception(SMS_SEND_MOBILE_TEMPLATE_PARAM_MISS, key); + } + return new KeyValue<>(key, value); + }).collect(Collectors.toList()); + } + + @VisibleForTesting + public String validateMobile(String mobile) { + if (StrUtil.isEmpty(mobile)) { + throw exception(SMS_SEND_MOBILE_NOT_EXISTS); + } + return mobile; + } + + @Override + public void doSendSms(SmsSendMessage message) { + // 获得渠道对应的 SmsClient 客户端 + SmsClient smsClient = smsChannelService.getSmsClient(message.getChannelId()); + Assert.notNull(smsClient, "短信客户端({}) 不存在", message.getChannelId()); + // 发送短信 + SmsCommonResult sendResult = smsClient.sendSms(message.getLogId(), message.getMobile(), + message.getApiTemplateId(), message.getTemplateParams()); + smsLogService.updateSmsSendResult(message.getLogId(), sendResult.getCode(), sendResult.getMsg(), + sendResult.getApiCode(), sendResult.getApiMsg(), sendResult.getApiRequestId(), + sendResult.getData() != null ? sendResult.getData().getSerialNo() : null); + } + + @Override + public void receiveSmsStatus(String channelCode, String text) throws Throwable { + // 获得渠道对应的 SmsClient 客户端 + SmsClient smsClient = smsChannelService.getSmsClient(channelCode); + Assert.notNull(smsClient, "短信客户端({}) 不存在", channelCode); + // 解析内容 + List receiveResults = smsClient.parseSmsReceiveStatus(text); + if (CollUtil.isEmpty(receiveResults)) { + return; + } + // 更新短信日志的接收结果. 因为量一般不大,所以先使用 for 循环更新 + receiveResults.forEach(result -> smsLogService.updateSmsReceiveResult(result.getLogId(), + result.getSuccess(), result.getReceiveTime(), result.getErrorCode(), result.getErrorMsg())); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsTemplateService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsTemplateService.java new file mode 100644 index 0000000..eeb9d6b --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsTemplateService.java @@ -0,0 +1,94 @@ +package com.win.module.system.service.sms; + +import com.win.module.system.controller.sms.vo.template.SmsTemplateCreateReqVO; +import com.win.module.system.controller.sms.vo.template.SmsTemplateExportReqVO; +import com.win.module.system.controller.sms.vo.template.SmsTemplatePageReqVO; +import com.win.module.system.controller.sms.vo.template.SmsTemplateUpdateReqVO; +import com.win.module.system.dal.dataobject.sms.SmsTemplateDO; +import com.win.framework.common.pojo.PageResult; + +import javax.validation.Valid; +import java.util.List; +import java.util.Map; + +/** + * 短信模板 Service 接口 + * + * @author zzf + * @since 2021/1/25 9:24 + */ +public interface SmsTemplateService { + + /** + * 创建短信模板 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createSmsTemplate(@Valid SmsTemplateCreateReqVO createReqVO); + + /** + * 更新短信模板 + * + * @param updateReqVO 更新信息 + */ + void updateSmsTemplate(@Valid SmsTemplateUpdateReqVO updateReqVO); + + /** + * 删除短信模板 + * + * @param id 编号 + */ + void deleteSmsTemplate(Long id); + + /** + * 获得短信模板 + * + * @param id 编号 + * @return 短信模板 + */ + SmsTemplateDO getSmsTemplate(Long id); + + /** + * 获得短信模板,从缓存中 + * + * @param code 模板编码 + * @return 短信模板 + */ + SmsTemplateDO getSmsTemplateByCodeFromCache(String code); + + /** + * 获得短信模板分页 + * + * @param pageReqVO 分页查询 + * @return 短信模板分页 + */ + PageResult getSmsTemplatePage(SmsTemplatePageReqVO pageReqVO); + + /** + * 获得短信模板列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 短信模板分页 + */ + List getSmsTemplateList(SmsTemplateExportReqVO exportReqVO); + + /** + * 获得指定短信渠道下的短信模板数量 + * + * @param channelId 短信渠道编号 + * @return 数量 + */ + Long countByChannelId(Long channelId); + + + /** + * 格式化短信内容 + * + * @param content 短信模板的内容 + * @param params 内容的参数 + * @return 格式化后的内容 + */ + String formatSmsTemplateContent(String content, Map params); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsTemplateServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsTemplateServiceImpl.java new file mode 100644 index 0000000..300d6ca --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsTemplateServiceImpl.java @@ -0,0 +1,194 @@ +package com.win.module.system.service.sms; + +import cn.hutool.core.util.ReUtil; +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.sms.core.client.SmsClient; +import com.win.framework.sms.core.client.SmsClientFactory; +import com.win.framework.sms.core.client.SmsCommonResult; +import com.win.framework.sms.core.client.dto.SmsTemplateRespDTO; +import com.win.module.system.controller.sms.vo.template.SmsTemplateCreateReqVO; +import com.win.module.system.controller.sms.vo.template.SmsTemplateExportReqVO; +import com.win.module.system.controller.sms.vo.template.SmsTemplatePageReqVO; +import com.win.module.system.controller.sms.vo.template.SmsTemplateUpdateReqVO; +import com.win.module.system.convert.sms.SmsTemplateConvert; +import com.win.module.system.dal.dataobject.sms.SmsChannelDO; +import com.win.module.system.dal.dataobject.sms.SmsTemplateDO; +import com.win.module.system.dal.mysql.sms.SmsTemplateMapper; +import com.win.module.system.dal.redis.RedisKeyConstants; +import com.google.common.annotations.VisibleForTesting; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.util.Assert; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.regex.Pattern; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.system.enums.ErrorCodeConstants.*; + +/** + * 短信模板 Service 实现类 + * + * @author zzf + * @since 2021/1/25 9:25 + */ +@Service +@Slf4j +public class SmsTemplateServiceImpl implements SmsTemplateService { + + /** + * 正则表达式,匹配 {} 中的变量 + */ + private static final Pattern PATTERN_PARAMS = Pattern.compile("\\{(.*?)}"); + + @Resource + private SmsTemplateMapper smsTemplateMapper; + + @Resource + private SmsChannelService smsChannelService; + + @Resource + private SmsClientFactory smsClientFactory; + + @Override + public Long createSmsTemplate(SmsTemplateCreateReqVO createReqVO) { + // 校验短信渠道 + SmsChannelDO channelDO = validateSmsChannel(createReqVO.getChannelId()); + // 校验短信编码是否重复 + validateSmsTemplateCodeDuplicate(null, createReqVO.getCode()); + // 校验短信模板 + validateApiTemplate(createReqVO.getChannelId(), createReqVO.getApiTemplateId()); + + // 插入 + SmsTemplateDO template = SmsTemplateConvert.INSTANCE.convert(createReqVO); + template.setParams(parseTemplateContentParams(template.getContent())); + template.setChannelCode(channelDO.getCode()); + smsTemplateMapper.insert(template); + // 返回 + return template.getId(); + } + + @Override + @CacheEvict(cacheNames = RedisKeyConstants.SMS_TEMPLATE, + allEntries = true) // allEntries 清空所有缓存,因为可能修改到 code 字段,不好清理 + public void updateSmsTemplate(SmsTemplateUpdateReqVO updateReqVO) { + // 校验存在 + validateSmsTemplateExists(updateReqVO.getId()); + // 校验短信渠道 + SmsChannelDO channelDO = validateSmsChannel(updateReqVO.getChannelId()); + // 校验短信编码是否重复 + validateSmsTemplateCodeDuplicate(updateReqVO.getId(), updateReqVO.getCode()); + // 校验短信模板 + validateApiTemplate(updateReqVO.getChannelId(), updateReqVO.getApiTemplateId()); + + // 更新 + SmsTemplateDO updateObj = SmsTemplateConvert.INSTANCE.convert(updateReqVO); + updateObj.setParams(parseTemplateContentParams(updateObj.getContent())); + updateObj.setChannelCode(channelDO.getCode()); + smsTemplateMapper.updateById(updateObj); + } + + @Override + @CacheEvict(cacheNames = RedisKeyConstants.SMS_TEMPLATE, + allEntries = true) // allEntries 清空所有缓存,因为 id 不是直接的缓存 code,不好清理 + public void deleteSmsTemplate(Long id) { + // 校验存在 + validateSmsTemplateExists(id); + // 更新 + smsTemplateMapper.deleteById(id); + } + + private void validateSmsTemplateExists(Long id) { + if (smsTemplateMapper.selectById(id) == null) { + throw exception(SMS_TEMPLATE_NOT_EXISTS); + } + } + + @Override + public SmsTemplateDO getSmsTemplate(Long id) { + return smsTemplateMapper.selectById(id); + } + + @Override + @Cacheable(cacheNames = RedisKeyConstants.SMS_TEMPLATE, key = "#code", + unless = "#result == null") + public SmsTemplateDO getSmsTemplateByCodeFromCache(String code) { + return smsTemplateMapper.selectByCode(code); + } + + @Override + public PageResult getSmsTemplatePage(SmsTemplatePageReqVO pageReqVO) { + return smsTemplateMapper.selectPage(pageReqVO); + } + + @Override + public List getSmsTemplateList(SmsTemplateExportReqVO exportReqVO) { + return smsTemplateMapper.selectList(exportReqVO); + } + + @Override + public Long countByChannelId(Long channelId) { + return smsTemplateMapper.selectCountByChannelId(channelId); + } + + @VisibleForTesting + public SmsChannelDO validateSmsChannel(Long channelId) { + SmsChannelDO channelDO = smsChannelService.getSmsChannel(channelId); + if (channelDO == null) { + throw exception(SMS_CHANNEL_NOT_EXISTS); + } + if (!Objects.equals(channelDO.getStatus(), CommonStatusEnum.ENABLE.getStatus())) { + throw exception(SMS_CHANNEL_DISABLE); + } + return channelDO; + } + + @VisibleForTesting + public void validateSmsTemplateCodeDuplicate(Long id, String code) { + SmsTemplateDO template = smsTemplateMapper.selectByCode(code); + if (template == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的字典类型 + if (id == null) { + throw exception(SMS_TEMPLATE_CODE_DUPLICATE, code); + } + if (!template.getId().equals(id)) { + throw exception(SMS_TEMPLATE_CODE_DUPLICATE, code); + } + } + + /** + * 校验 API 短信平台的模板是否有效 + * + * @param channelId 渠道编号 + * @param apiTemplateId API 模板编号 + */ + @VisibleForTesting + void validateApiTemplate(Long channelId, String apiTemplateId) { + // 获得短信模板 + SmsClient smsClient = smsClientFactory.getSmsClient(channelId); + Assert.notNull(smsClient, String.format("短信客户端(%d) 不存在", channelId)); + SmsCommonResult templateResult = smsClient.getSmsTemplate(apiTemplateId); + // 校验短信模板是否正确 + templateResult.checkError(); + } + + @Override + public String formatSmsTemplateContent(String content, Map params) { + return StrUtil.format(content, params); + } + + @VisibleForTesting + List parseTemplateContentParams(String content) { + return ReUtil.findAllGroup1(PATTERN_PARAMS, content); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/tenant/TenantPackageService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/tenant/TenantPackageService.java new file mode 100644 index 0000000..e286590 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/tenant/TenantPackageService.java @@ -0,0 +1,73 @@ +package com.win.module.system.service.tenant; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.tenant.vo.packages.TenantPackageCreateReqVO; +import com.win.module.system.controller.tenant.vo.packages.TenantPackagePageReqVO; +import com.win.module.system.controller.tenant.vo.packages.TenantPackageUpdateReqVO; +import com.win.module.system.dal.dataobject.tenant.TenantPackageDO; + +import javax.validation.Valid; +import java.util.List; + +/** + * 租户套餐 Service 接口 + * + * @author 闻荫源码 + */ +public interface TenantPackageService { + + /** + * 创建租户套餐 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createTenantPackage(@Valid TenantPackageCreateReqVO createReqVO); + + /** + * 更新租户套餐 + * + * @param updateReqVO 更新信息 + */ + void updateTenantPackage(@Valid TenantPackageUpdateReqVO updateReqVO); + + /** + * 删除租户套餐 + * + * @param id 编号 + */ + void deleteTenantPackage(Long id); + + /** + * 获得租户套餐 + * + * @param id 编号 + * @return 租户套餐 + */ + TenantPackageDO getTenantPackage(Long id); + + /** + * 获得租户套餐分页 + * + * @param pageReqVO 分页查询 + * @return 租户套餐分页 + */ + PageResult getTenantPackagePage(TenantPackagePageReqVO pageReqVO); + + /** + * 校验租户套餐 + * + * @param id 编号 + * @return 租户套餐 + */ + TenantPackageDO validTenantPackage(Long id); + + /** + * 获得指定状态的租户套餐列表 + * + * @param status 状态 + * @return 租户套餐 + */ + List getTenantPackageListByStatus(Integer status); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/tenant/TenantPackageServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/tenant/TenantPackageServiceImpl.java new file mode 100644 index 0000000..222c89e --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/tenant/TenantPackageServiceImpl.java @@ -0,0 +1,115 @@ +package com.win.module.system.service.tenant; + +import cn.hutool.core.collection.CollUtil; +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.tenant.vo.packages.TenantPackageCreateReqVO; +import com.win.module.system.controller.tenant.vo.packages.TenantPackagePageReqVO; +import com.win.module.system.controller.tenant.vo.packages.TenantPackageUpdateReqVO; +import com.win.module.system.convert.tenant.TenantPackageConvert; +import com.win.module.system.dal.dataobject.tenant.TenantDO; +import com.win.module.system.dal.dataobject.tenant.TenantPackageDO; +import com.win.module.system.dal.mysql.tenant.TenantPackageMapper; +import com.baomidou.dynamic.datasource.annotation.DSTransactional; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.system.enums.ErrorCodeConstants.*; + +/** + * 租户套餐 Service 实现类 + * + * @author 闻荫源码 + */ +@Service +@Validated +public class TenantPackageServiceImpl implements TenantPackageService { + + @Resource + private TenantPackageMapper tenantPackageMapper; + + @Resource + @Lazy // 避免循环依赖的报错 + private TenantService tenantService; + + @Override + public Long createTenantPackage(TenantPackageCreateReqVO createReqVO) { + // 插入 + TenantPackageDO tenantPackage = TenantPackageConvert.INSTANCE.convert(createReqVO); + tenantPackageMapper.insert(tenantPackage); + // 返回 + return tenantPackage.getId(); + } + + @Override + @DSTransactional // 多数据源,使用 @DSTransactional 保证本地事务,以及数据源的切换 + public void updateTenantPackage(TenantPackageUpdateReqVO updateReqVO) { + // 校验存在 + TenantPackageDO tenantPackage = validateTenantPackageExists(updateReqVO.getId()); + // 更新 + TenantPackageDO updateObj = TenantPackageConvert.INSTANCE.convert(updateReqVO); + tenantPackageMapper.updateById(updateObj); + // 如果菜单发生变化,则修改每个租户的菜单 + if (!CollUtil.isEqualList(tenantPackage.getMenuIds(), updateReqVO.getMenuIds())) { + List tenants = tenantService.getTenantListByPackageId(tenantPackage.getId()); + tenants.forEach(tenant -> tenantService.updateTenantRoleMenu(tenant.getId(), updateReqVO.getMenuIds())); + } + } + + @Override + public void deleteTenantPackage(Long id) { + // 校验存在 + validateTenantPackageExists(id); + // 校验正在使用 + validateTenantUsed(id); + // 删除 + tenantPackageMapper.deleteById(id); + } + + private TenantPackageDO validateTenantPackageExists(Long id) { + TenantPackageDO tenantPackage = tenantPackageMapper.selectById(id); + if (tenantPackage == null) { + throw exception(TENANT_PACKAGE_NOT_EXISTS); + } + return tenantPackage; + } + + private void validateTenantUsed(Long id) { + if (tenantService.getTenantCountByPackageId(id) > 0) { + throw exception(TENANT_PACKAGE_USED); + } + } + + @Override + public TenantPackageDO getTenantPackage(Long id) { + return tenantPackageMapper.selectById(id); + } + + @Override + public PageResult getTenantPackagePage(TenantPackagePageReqVO pageReqVO) { + return tenantPackageMapper.selectPage(pageReqVO); + } + + @Override + public TenantPackageDO validTenantPackage(Long id) { + TenantPackageDO tenantPackage = tenantPackageMapper.selectById(id); + if (tenantPackage == null) { + throw exception(TENANT_PACKAGE_NOT_EXISTS); + } + if (tenantPackage.getStatus().equals(CommonStatusEnum.DISABLE.getStatus())) { + throw exception(TENANT_PACKAGE_DISABLE, tenantPackage.getName()); + } + return tenantPackage; + } + + @Override + public List getTenantPackageListByStatus(Integer status) { + return tenantPackageMapper.selectListByStatus(status); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/tenant/TenantService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/tenant/TenantService.java new file mode 100644 index 0000000..de4966a --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/tenant/TenantService.java @@ -0,0 +1,131 @@ +package com.win.module.system.service.tenant; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.tenant.core.context.TenantContextHolder; +import com.win.module.system.controller.tenant.vo.tenant.TenantCreateReqVO; +import com.win.module.system.controller.tenant.vo.tenant.TenantExportReqVO; +import com.win.module.system.controller.tenant.vo.tenant.TenantPageReqVO; +import com.win.module.system.controller.tenant.vo.tenant.TenantUpdateReqVO; +import com.win.module.system.dal.dataobject.tenant.TenantDO; +import com.win.module.system.service.tenant.handler.TenantInfoHandler; +import com.win.module.system.service.tenant.handler.TenantMenuHandler; + +import javax.validation.Valid; +import java.util.List; +import java.util.Set; + +/** + * 租户 Service 接口 + * + * @author 闻荫源码 + */ +public interface TenantService { + + /** + * 创建租户 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createTenant(@Valid TenantCreateReqVO createReqVO); + + /** + * 更新租户 + * + * @param updateReqVO 更新信息 + */ + void updateTenant(@Valid TenantUpdateReqVO updateReqVO); + + /** + * 更新租户的角色菜单 + * + * @param tenantId 租户编号 + * @param menuIds 菜单编号数组 + */ + void updateTenantRoleMenu(Long tenantId, Set menuIds); + + /** + * 删除租户 + * + * @param id 编号 + */ + void deleteTenant(Long id); + + /** + * 获得租户 + * + * @param id 编号 + * @return 租户 + */ + TenantDO getTenant(Long id); + + /** + * 获得租户分页 + * + * @param pageReqVO 分页查询 + * @return 租户分页 + */ + PageResult getTenantPage(TenantPageReqVO pageReqVO); + + /** + * 获得租户列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 租户列表 + */ + List getTenantList(TenantExportReqVO exportReqVO); + + /** + * 获得名字对应的租户 + * + * @param name 组户名 + * @return 租户 + */ + TenantDO getTenantByName(String name); + + /** + * 获得使用指定套餐的租户数量 + * + * @param packageId 租户套餐编号 + * @return 租户数量 + */ + Long getTenantCountByPackageId(Long packageId); + + /** + * 获得使用指定套餐的租户数组 + * + * @param packageId 租户套餐编号 + * @return 租户数组 + */ + List getTenantListByPackageId(Long packageId); + + /** + * 进行租户的信息处理逻辑 + * 其中,租户编号从 {@link TenantContextHolder} 上下文中获取 + * + * @param handler 处理器 + */ + void handleTenantInfo(TenantInfoHandler handler); + + /** + * 进行租户的菜单处理逻辑 + * 其中,租户编号从 {@link TenantContextHolder} 上下文中获取 + * + * @param handler 处理器 + */ + void handleTenantMenu(TenantMenuHandler handler); + + /** + * 获得所有租户 + * + * @return 租户编号数组 + */ + List getTenantIdList(); + + /** + * 校验租户是否合法 + * + * @param id 租户编号 + */ + void validTenant(Long id); +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/tenant/TenantServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/tenant/TenantServiceImpl.java new file mode 100644 index 0000000..c11b631 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/tenant/TenantServiceImpl.java @@ -0,0 +1,285 @@ +package com.win.module.system.service.tenant; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ObjectUtil; +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.collection.CollectionUtils; +import com.win.framework.common.util.date.DateUtils; +import com.win.framework.tenant.config.TenantProperties; +import com.win.framework.tenant.core.context.TenantContextHolder; +import com.win.framework.tenant.core.util.TenantUtils; +import com.win.module.system.controller.permission.vo.role.RoleCreateReqVO; +import com.win.module.system.controller.tenant.vo.tenant.TenantCreateReqVO; +import com.win.module.system.controller.tenant.vo.tenant.TenantExportReqVO; +import com.win.module.system.controller.tenant.vo.tenant.TenantPageReqVO; +import com.win.module.system.controller.tenant.vo.tenant.TenantUpdateReqVO; +import com.win.module.system.convert.tenant.TenantConvert; +import com.win.module.system.dal.dataobject.permission.MenuDO; +import com.win.module.system.dal.dataobject.permission.RoleDO; +import com.win.module.system.dal.dataobject.tenant.TenantDO; +import com.win.module.system.dal.dataobject.tenant.TenantPackageDO; +import com.win.module.system.dal.mysql.tenant.TenantMapper; +import com.win.module.system.enums.permission.RoleCodeEnum; +import com.win.module.system.enums.permission.RoleTypeEnum; +import com.win.module.system.service.permission.MenuService; +import com.win.module.system.service.permission.PermissionService; +import com.win.module.system.service.permission.RoleService; +import com.win.module.system.service.tenant.handler.TenantInfoHandler; +import com.win.module.system.service.tenant.handler.TenantMenuHandler; +import com.win.module.system.service.user.AdminUserService; +import com.baomidou.dynamic.datasource.annotation.DSTransactional; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Objects; +import java.util.Set; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.system.enums.ErrorCodeConstants.*; +import static java.util.Collections.singleton; + +/** + * 租户 Service 实现类 + * + * @author 闻荫源码 + */ +@Service +@Validated +@Slf4j +public class TenantServiceImpl implements TenantService { + + @SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection") + @Autowired(required = false) // 由于 win.tenant.enable 配置项,可以关闭多租户的功能,所以这里只能不强制注入 + private TenantProperties tenantProperties; + + @Resource + private TenantMapper tenantMapper; + + @Resource + private TenantPackageService tenantPackageService; + @Resource + @Lazy // 延迟,避免循环依赖报错 + private AdminUserService userService; + @Resource + private RoleService roleService; + @Resource + private MenuService menuService; + @Resource + private PermissionService permissionService; + + @Override + public List getTenantIdList() { + List tenants = tenantMapper.selectList(); + return CollectionUtils.convertList(tenants, TenantDO::getId); + } + + @Override + public void validTenant(Long id) { + TenantDO tenant = getTenant(id); + if (tenant == null) { + throw exception(TENANT_NOT_EXISTS); + } + if (tenant.getStatus().equals(CommonStatusEnum.DISABLE.getStatus())) { + throw exception(TENANT_DISABLE, tenant.getName()); + } + if (DateUtils.isExpired(tenant.getExpireTime())) { + throw exception(TENANT_EXPIRE, tenant.getName()); + } + } + + @Override + @DSTransactional // 多数据源,使用 @DSTransactional 保证本地事务,以及数据源的切换 + public Long createTenant(TenantCreateReqVO createReqVO) { + // 校验租户名称是否重复 + validTenantNameDuplicate(createReqVO.getName(), null); + // 校验套餐被禁用 + TenantPackageDO tenantPackage = tenantPackageService.validTenantPackage(createReqVO.getPackageId()); + + // 创建租户 + TenantDO tenant = TenantConvert.INSTANCE.convert(createReqVO); + tenantMapper.insert(tenant); + + TenantUtils.execute(tenant.getId(), () -> { + // 创建角色 + Long roleId = createRole(tenantPackage); + // 创建用户,并分配角色 + Long userId = createUser(roleId, createReqVO); + // 修改租户的管理员 + tenantMapper.updateById(new TenantDO().setId(tenant.getId()).setContactUserId(userId)); + }); + return tenant.getId(); + } + + private Long createUser(Long roleId, TenantCreateReqVO createReqVO) { + // 创建用户 + Long userId = userService.createUser(TenantConvert.INSTANCE.convert02(createReqVO)); + // 分配角色 + permissionService.assignUserRole(userId, singleton(roleId)); + return userId; + } + + private Long createRole(TenantPackageDO tenantPackage) { + // 创建角色 + RoleCreateReqVO reqVO = new RoleCreateReqVO(); + reqVO.setName(RoleCodeEnum.TENANT_ADMIN.getName()).setCode(RoleCodeEnum.TENANT_ADMIN.getCode()) + .setSort(0).setRemark("系统自动生成"); + Long roleId = roleService.createRole(reqVO, RoleTypeEnum.SYSTEM.getType()); + // 分配权限 + permissionService.assignRoleMenu(roleId, tenantPackage.getMenuIds()); + return roleId; + } + + @Override + @DSTransactional + public void updateTenant(TenantUpdateReqVO updateReqVO) { + // 校验存在 + TenantDO tenant = validateUpdateTenant(updateReqVO.getId()); + // 校验租户名称是否重复 + validTenantNameDuplicate(updateReqVO.getName(), updateReqVO.getId()); + // 校验套餐被禁用 + TenantPackageDO tenantPackage = tenantPackageService.validTenantPackage(updateReqVO.getPackageId()); + + // 更新租户 + TenantDO updateObj = TenantConvert.INSTANCE.convert(updateReqVO); + tenantMapper.updateById(updateObj); + // 如果套餐发生变化,则修改其角色的权限 + if (ObjectUtil.notEqual(tenant.getPackageId(), updateReqVO.getPackageId())) { + updateTenantRoleMenu(tenant.getId(), tenantPackage.getMenuIds()); + } + } + + private void validTenantNameDuplicate(String name, Long id) { + TenantDO tenant = tenantMapper.selectByName(name); + if (tenant == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同名字的租户 + if (id == null) { + throw exception(TENANT_NAME_DUPLICATE, name); + } + if (!tenant.getId().equals(id)) { + throw exception(TENANT_NAME_DUPLICATE, name); + } + } + + @Override + @DSTransactional + public void updateTenantRoleMenu(Long tenantId, Set menuIds) { + TenantUtils.execute(tenantId, () -> { + // 获得所有角色 + List roles = roleService.getRoleList(); + roles.forEach(role -> Assert.isTrue(tenantId.equals(role.getTenantId()), "角色({}/{}) 租户不匹配", + role.getId(), role.getTenantId(), tenantId)); // 兜底校验 + // 重新分配每个角色的权限 + roles.forEach(role -> { + // 如果是租户管理员,重新分配其权限为租户套餐的权限 + if (Objects.equals(role.getCode(), RoleCodeEnum.TENANT_ADMIN.getCode())) { + permissionService.assignRoleMenu(role.getId(), menuIds); + log.info("[updateTenantRoleMenu][租户管理员({}/{}) 的权限修改为({})]", role.getId(), role.getTenantId(), menuIds); + return; + } + // 如果是其他角色,则去掉超过套餐的权限 + Set roleMenuIds = permissionService.getRoleMenuListByRoleId(role.getId()); + roleMenuIds = CollUtil.intersectionDistinct(roleMenuIds, menuIds); + permissionService.assignRoleMenu(role.getId(), roleMenuIds); + log.info("[updateTenantRoleMenu][角色({}/{}) 的权限修改为({})]", role.getId(), role.getTenantId(), roleMenuIds); + }); + }); + } + + @Override + public void deleteTenant(Long id) { + // 校验存在 + validateUpdateTenant(id); + // 删除 + tenantMapper.deleteById(id); + } + + private TenantDO validateUpdateTenant(Long id) { + TenantDO tenant = tenantMapper.selectById(id); + if (tenant == null) { + throw exception(TENANT_NOT_EXISTS); + } + // 内置租户,不允许删除 + if (isSystemTenant(tenant)) { + throw exception(TENANT_CAN_NOT_UPDATE_SYSTEM); + } + return tenant; + } + + @Override + public TenantDO getTenant(Long id) { + return tenantMapper.selectById(id); + } + + @Override + public PageResult getTenantPage(TenantPageReqVO pageReqVO) { + return tenantMapper.selectPage(pageReqVO); + } + + @Override + public List getTenantList(TenantExportReqVO exportReqVO) { + return tenantMapper.selectList(exportReqVO); + } + + @Override + public TenantDO getTenantByName(String name) { + return tenantMapper.selectByName(name); + } + + @Override + public Long getTenantCountByPackageId(Long packageId) { + return tenantMapper.selectCountByPackageId(packageId); + } + + @Override + public List getTenantListByPackageId(Long packageId) { + return tenantMapper.selectListByPackageId(packageId); + } + + @Override + public void handleTenantInfo(TenantInfoHandler handler) { + // 如果禁用,则不执行逻辑 + if (isTenantDisable()) { + return; + } + // 获得租户 + TenantDO tenant = getTenant(TenantContextHolder.getRequiredTenantId()); + // 执行处理器 + handler.handle(tenant); + } + + @Override + public void handleTenantMenu(TenantMenuHandler handler) { + // 如果禁用,则不执行逻辑 + if (isTenantDisable()) { + return; + } + // 获得租户,然后获得菜单 + TenantDO tenant = getTenant(TenantContextHolder.getRequiredTenantId()); + Set menuIds; + if (isSystemTenant(tenant)) { // 系统租户,菜单是全量的 + menuIds = CollectionUtils.convertSet(menuService.getMenuList(), MenuDO::getId); + } else { + menuIds = tenantPackageService.getTenantPackage(tenant.getPackageId()).getMenuIds(); + } + // 执行处理器 + handler.handle(menuIds); + } + + private static boolean isSystemTenant(TenantDO tenant) { + return Objects.equals(tenant.getPackageId(), TenantDO.PACKAGE_ID_SYSTEM); + } + + private boolean isTenantDisable() { + return tenantProperties == null || Boolean.FALSE.equals(tenantProperties.getEnable()); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/tenant/handler/TenantInfoHandler.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/tenant/handler/TenantInfoHandler.java new file mode 100644 index 0000000..42f553e --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/tenant/handler/TenantInfoHandler.java @@ -0,0 +1,21 @@ +package com.win.module.system.service.tenant.handler; + +import com.win.module.system.dal.dataobject.tenant.TenantDO; + +/** + * 租户信息处理 + * 目的:尽量减少租户逻辑耦合到系统中 + * + * @author 闻荫源码 + */ +public interface TenantInfoHandler { + + /** + * 基于传入的租户信息,进行相关逻辑的执行 + * 例如说,创建用户时,超过最大账户配额 + * + * @param tenant 租户信息 + */ + void handle(TenantDO tenant); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/tenant/handler/TenantMenuHandler.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/tenant/handler/TenantMenuHandler.java new file mode 100644 index 0000000..55a1c02 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/tenant/handler/TenantMenuHandler.java @@ -0,0 +1,21 @@ +package com.win.module.system.service.tenant.handler; + +import java.util.Set; + +/** + * 租户菜单处理 + * 目的:尽量减少租户逻辑耦合到系统中 + * + * @author 闻荫源码 + */ +public interface TenantMenuHandler { + + /** + * 基于传入的租户菜单【全】列表,进行相关逻辑的执行 + * 例如说,返回可分配菜单的时候,可以移除多余的 + * + * @param menuIds 菜单列表 + */ + void handle(Set menuIds); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/user/AdminUserService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/user/AdminUserService.java new file mode 100644 index 0000000..27ea56e --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/user/AdminUserService.java @@ -0,0 +1,213 @@ +package com.win.module.system.service.user; + +import cn.hutool.core.collection.CollUtil; +import com.win.framework.common.util.collection.CollectionUtils; +import com.win.module.system.controller.user.vo.profile.UserProfileUpdatePasswordReqVO; +import com.win.module.system.controller.user.vo.profile.UserProfileUpdateReqVO; +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.user.vo.user.*; +import com.win.module.system.dal.dataobject.user.AdminUserDO; + +import javax.validation.Valid; +import java.io.InputStream; +import java.util.*; + +/** + * 后台用户 Service 接口 + * + * @author 闻荫源码 + */ +public interface AdminUserService { + + /** + * 创建用户 + * + * @param reqVO 用户信息 + * @return 用户编号 + */ + Long createUser(@Valid UserCreateReqVO reqVO); + + /** + * 修改用户 + * + * @param reqVO 用户信息 + */ + void updateUser(@Valid UserUpdateReqVO reqVO); + + /** + * 更新用户的最后登陆信息 + * + * @param id 用户编号 + * @param loginIp 登陆 IP + */ + void updateUserLogin(Long id, String loginIp); + + /** + * 修改用户个人信息 + * + * @param id 用户编号 + * @param reqVO 用户个人信息 + */ + void updateUserProfile(Long id, @Valid UserProfileUpdateReqVO reqVO); + + /** + * 修改用户个人密码 + * + * @param id 用户编号 + * @param reqVO 更新用户个人密码 + */ + void updateUserPassword(Long id, @Valid UserProfileUpdatePasswordReqVO reqVO); + + /** + * 更新用户头像 + * + * @param id 用户 id + * @param avatarFile 头像文件 + */ + String updateUserAvatar(Long id, InputStream avatarFile) throws Exception; + + /** + * 修改密码 + * + * @param id 用户编号 + * @param password 密码 + */ + void updateUserPassword(Long id, String password); + + /** + * 修改状态 + * + * @param id 用户编号 + * @param status 状态 + */ + void updateUserStatus(Long id, Integer status); + + /** + * 删除用户 + * + * @param id 用户编号 + */ + void deleteUser(Long id); + + /** + * 通过用户名查询用户 + * + * @param username 用户名 + * @return 用户对象信息 + */ + AdminUserDO getUserByUsername(String username); + + /** + * 通过手机号获取用户 + * + * @param mobile 手机号 + * @return 用户对象信息 + */ + AdminUserDO getUserByMobile(String mobile); + + /** + * 获得用户分页列表 + * + * @param reqVO 分页条件 + * @return 分页列表 + */ + PageResult getUserPage(UserPageReqVO reqVO); + + /** + * 通过用户 ID 查询用户 + * + * @param id 用户ID + * @return 用户对象信息 + */ + AdminUserDO getUser(Long id); + + /** + * 获得指定部门的用户数组 + * + * @param deptIds 部门数组 + * @return 用户数组 + */ + List getUserListByDeptIds(Collection deptIds); + + /** + * 获得指定岗位的用户数组 + * + * @param postIds 岗位数组 + * @return 用户数组 + */ + List getUserListByPostIds(Collection postIds); + + /** + * 获得用户列表 + * + * @param ids 用户编号数组 + * @return 用户列表 + */ + List getUserList(Collection ids); + + /** + * 校验用户们是否有效。如下情况,视为无效: + * 1. 用户编号不存在 + * 2. 用户被禁用 + * + * @param ids 用户编号数组 + */ + void validateUserList(Collection ids); + + /** + * 获得用户 Map + * + * @param ids 用户编号数组 + * @return 用户 Map + */ + default Map getUserMap(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return new HashMap<>(); + } + return CollectionUtils.convertMap(getUserList(ids), AdminUserDO::getId); + } + + /** + * 获得用户列表 + * + * @param reqVO 列表请求 + * @return 用户列表 + */ + List getUserList(UserExportReqVO reqVO); + + /** + * 获得用户列表,基于昵称模糊匹配 + * + * @param nickname 昵称 + * @return 用户列表 + */ + List getUserListByNickname(String nickname); + + /** + * 批量导入用户 + * + * @param importUsers 导入用户列表 + * @param mode 模式 + * @param updatePart 是否部分更新 + * @return 导入结果 + */ + List importUserList(List importUsers, Integer mode, boolean updatePart); + + /** + * 获得指定状态的用户们 + * + * @param status 状态 + * @return 用户们 + */ + List getUserListByStatus(Integer status); + + /** + * 判断密码是否匹配 + * + * @param rawPassword 未加密的密码 + * @param encodedPassword 加密后的密码 + * @return 是否匹配 + */ + boolean isPasswordMatch(String rawPassword, String encodedPassword); + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/user/AdminUserServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/user/AdminUserServiceImpl.java new file mode 100644 index 0000000..0acd7f2 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/user/AdminUserServiceImpl.java @@ -0,0 +1,452 @@ +package com.win.module.system.service.user; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.StrUtil; +import com.google.common.annotations.VisibleForTesting; +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.exception.ServiceException; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.util.collection.CollectionUtils; +import com.win.framework.datapermission.core.util.DataPermissionUtils; +import com.win.module.infra.api.file.FileApi; +import com.win.module.system.controller.user.vo.profile.UserProfileUpdatePasswordReqVO; +import com.win.module.system.controller.user.vo.profile.UserProfileUpdateReqVO; +import com.win.module.system.controller.user.vo.user.*; +import com.win.module.system.convert.user.UserConvert; +import com.win.module.system.dal.dataobject.dept.DeptDO; +import com.win.module.system.dal.dataobject.dept.UserPostDO; +import com.win.module.system.dal.dataobject.user.AdminUserDO; +import com.win.module.system.dal.mysql.dept.UserPostMapper; +import com.win.module.system.dal.mysql.user.AdminUserMapper; +import com.win.module.system.service.dept.DeptService; +import com.win.module.system.service.dept.PostService; +import com.win.module.system.service.permission.PermissionService; +import com.win.module.system.service.tenant.TenantService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Lazy; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.interceptor.TransactionAspectSupport; + +import javax.annotation.Resource; +import java.io.InputStream; +import java.time.LocalDateTime; +import java.util.*; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.framework.common.util.collection.CollectionUtils.convertList; +import static com.win.framework.common.util.collection.CollectionUtils.convertSet; +import static com.win.module.system.enums.ErrorCodeConstants.*; + +/** + * 后台用户 Service 实现类 + * + * @author 闻荫源码 + */ +@Service("adminUserService") +@Slf4j +public class AdminUserServiceImpl implements AdminUserService { + + @Value("${sys.user.init-password:winyuanma}") + private String userInitPassword; + + @Resource + private AdminUserMapper userMapper; + + @Resource + private DeptService deptService; + @Resource + private PostService postService; + @Resource + private PermissionService permissionService; + @Resource + private PasswordEncoder passwordEncoder; + @Resource + @Lazy // 延迟,避免循环依赖报错 + private TenantService tenantService; + + @Resource + private UserPostMapper userPostMapper; + + @Resource + private FileApi fileApi; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createUser(UserCreateReqVO reqVO) { + // 校验账户配合 + tenantService.handleTenantInfo(tenant -> { + long count = userMapper.selectCount(); + if (count >= tenant.getAccountCount()) { + throw exception(USER_COUNT_MAX, tenant.getAccountCount()); + } + }); + // 校验正确性 + validateUserForCreateOrUpdate(null, reqVO.getUsername(), reqVO.getMobile(), reqVO.getEmail(), + reqVO.getDeptId(), reqVO.getPostIds()); + // 插入用户 + AdminUserDO user = UserConvert.INSTANCE.convert(reqVO); + user.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 默认开启 + user.setPassword(encodePassword(reqVO.getPassword())); // 加密密码 + userMapper.insert(user); + // 插入关联岗位 + if (CollectionUtil.isNotEmpty(user.getPostIds())) { + userPostMapper.insertBatch(convertList(user.getPostIds(), + postId -> new UserPostDO().setUserId(user.getId()).setPostId(postId))); + } + return user.getId(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateUser(UserUpdateReqVO reqVO) { + // 校验正确性 + validateUserForCreateOrUpdate(reqVO.getId(), reqVO.getUsername(), reqVO.getMobile(), reqVO.getEmail(), + reqVO.getDeptId(), reqVO.getPostIds()); + // 更新用户 + AdminUserDO updateObj = UserConvert.INSTANCE.convert(reqVO); + userMapper.updateById(updateObj); + // 更新岗位 + updateUserPost(reqVO, updateObj); + } + + private void updateUserPost(UserUpdateReqVO reqVO, AdminUserDO updateObj) { + Long userId = reqVO.getId(); + Set dbPostIds = convertSet(userPostMapper.selectListByUserId(userId), UserPostDO::getPostId); + // 计算新增和删除的岗位编号 + Set postIds = updateObj.getPostIds(); + Collection createPostIds = CollUtil.subtract(postIds, dbPostIds); + Collection deletePostIds = CollUtil.subtract(dbPostIds, postIds); + // 执行新增和删除。对于已经授权的菜单,不用做任何处理 + if (!CollectionUtil.isEmpty(createPostIds)) { + userPostMapper.insertBatch(convertList(createPostIds, + postId -> new UserPostDO().setUserId(userId).setPostId(postId))); + } + if (!CollectionUtil.isEmpty(deletePostIds)) { + userPostMapper.deleteByUserIdAndPostId(userId, deletePostIds); + } + } + + @Override + public void updateUserLogin(Long id, String loginIp) { + userMapper.updateById(new AdminUserDO().setId(id).setLoginIp(loginIp).setLoginDate(LocalDateTime.now())); + } + + @Override + public void updateUserProfile(Long id, UserProfileUpdateReqVO reqVO) { + // 校验正确性 + validateUserExists(id); + validateEmailUnique(id, reqVO.getEmail()); + validateMobileUnique(id, reqVO.getMobile()); + // 执行更新 + userMapper.updateById(UserConvert.INSTANCE.convert(reqVO).setId(id)); + } + + @Override + public void updateUserPassword(Long id, UserProfileUpdatePasswordReqVO reqVO) { + // 校验旧密码密码 + validateOldPassword(id, reqVO.getOldPassword()); + // 执行更新 + AdminUserDO updateObj = new AdminUserDO().setId(id); + updateObj.setPassword(encodePassword(reqVO.getNewPassword())); // 加密密码 + userMapper.updateById(updateObj); + } + + @Override + public String updateUserAvatar(Long id, InputStream avatarFile) throws Exception { + validateUserExists(id); + // 存储文件 + String avatar = fileApi.createFile(IoUtil.readBytes(avatarFile), "systemUsers", id); + // 更新路径 + AdminUserDO sysUserDO = new AdminUserDO(); + sysUserDO.setId(id); + sysUserDO.setAvatar(avatar); + userMapper.updateById(sysUserDO); + return avatar; + } + + @Override + public void updateUserPassword(Long id, String password) { + // 校验用户存在 + validateUserExists(id); + // 更新密码 + AdminUserDO updateObj = new AdminUserDO(); + updateObj.setId(id); + updateObj.setPassword(encodePassword(password)); // 加密密码 + userMapper.updateById(updateObj); + } + + @Override + public void updateUserStatus(Long id, Integer status) { + // 校验用户存在 + validateUserExists(id); + // 更新状态 + AdminUserDO updateObj = new AdminUserDO(); + updateObj.setId(id); + updateObj.setStatus(status); + userMapper.updateById(updateObj); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteUser(Long id) { + // 校验用户存在 + validateUserExists(id); + // 删除用户 + userMapper.deleteById(id); + // 删除用户关联数据 + permissionService.processUserDeleted(id); + // 删除用户岗位 + userPostMapper.deleteByUserId(id); + } + + @Override + public AdminUserDO getUserByUsername(String username) { + return userMapper.selectByUsername(username); + } + + @Override + public AdminUserDO getUserByMobile(String mobile) { + return userMapper.selectByMobile(mobile); + } + + @Override + public PageResult getUserPage(UserPageReqVO reqVO) { + return userMapper.selectPage(reqVO, getDeptCondition(reqVO.getDeptId())); + } + + @Override + public AdminUserDO getUser(Long id) { + return userMapper.selectById(id); + } + + @Override + public List getUserListByDeptIds(Collection deptIds) { + if (CollUtil.isEmpty(deptIds)) { + return Collections.emptyList(); + } + return userMapper.selectListByDeptIds(deptIds); + } + + @Override + public List getUserListByPostIds(Collection postIds) { + if (CollUtil.isEmpty(postIds)) { + return Collections.emptyList(); + } + Set userIds = convertSet(userPostMapper.selectListByPostIds(postIds), UserPostDO::getUserId); + if (CollUtil.isEmpty(userIds)) { + return Collections.emptyList(); + } + return userMapper.selectBatchIds(userIds); + } + + @Override + public List getUserList(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return Collections.emptyList(); + } + return userMapper.selectBatchIds(ids); + } + + @Override + public void validateUserList(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return; + } + // 获得岗位信息 + List users = userMapper.selectBatchIds(ids); + Map userMap = CollectionUtils.convertMap(users, AdminUserDO::getId); + // 校验 + ids.forEach(id -> { + AdminUserDO user = userMap.get(id); + if (user == null) { + throw exception(USER_NOT_EXISTS); + } + if (!CommonStatusEnum.ENABLE.getStatus().equals(user.getStatus())) { + throw exception(USER_IS_DISABLE, user.getNickname()); + } + }); + } + + @Override + public List getUserList(UserExportReqVO reqVO) { + return userMapper.selectList(reqVO, getDeptCondition(reqVO.getDeptId())); + } + + @Override + public List getUserListByNickname(String nickname) { + return userMapper.selectListByNickname(nickname); + } + + /** + * 获得部门条件:查询指定部门的子部门编号们,包括自身 + * @param deptId 部门编号 + * @return 部门编号集合 + */ + private Set getDeptCondition(Long deptId) { + if (deptId == null) { + return Collections.emptySet(); + } + Set deptIds = convertSet(deptService.getChildDeptList(deptId), DeptDO::getId); + deptIds.add(deptId); // 包括自身 + return deptIds; + } + + private void validateUserForCreateOrUpdate(Long id, String username, String mobile, String email, + Long deptId, Set postIds) { + // 关闭数据权限,避免因为没有数据权限,查询不到数据,进而导致唯一校验不正确 + DataPermissionUtils.executeIgnore(() -> { + // 校验用户存在 + validateUserExists(id); + // 校验用户名唯一 + validateUsernameUnique(id, username); + // 校验手机号唯一 + validateMobileUnique(id, mobile); + // 校验邮箱唯一 + validateEmailUnique(id, email); + // 校验部门处于开启状态 + deptService.validateDeptList(CollectionUtils.singleton(deptId)); + // 校验岗位处于开启状态 + postService.validatePostList(postIds); + }); + } + + @VisibleForTesting + void validateUserExists(Long id) { + if (id == null) { + return; + } + AdminUserDO user = userMapper.selectById(id); + if (user == null) { + throw exception(USER_NOT_EXISTS); + } + } + + @VisibleForTesting + void validateUsernameUnique(Long id, String username) { + if (StrUtil.isBlank(username)) { + return; + } + AdminUserDO user = userMapper.selectByUsername(username); + if (user == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的用户 + if (id == null) { + throw exception(USER_USERNAME_EXISTS); + } + if (!user.getId().equals(id)) { + throw exception(USER_USERNAME_EXISTS); + } + } + + @VisibleForTesting + void validateEmailUnique(Long id, String email) { + if (StrUtil.isBlank(email)) { + return; + } + AdminUserDO user = userMapper.selectByEmail(email); + if (user == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的用户 + if (id == null) { + throw exception(USER_EMAIL_EXISTS); + } + if (!user.getId().equals(id)) { + throw exception(USER_EMAIL_EXISTS); + } + } + + @VisibleForTesting + void validateMobileUnique(Long id, String mobile) { + if (StrUtil.isBlank(mobile)) { + return; + } + AdminUserDO user = userMapper.selectByMobile(mobile); + if (user == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的用户 + if (id == null) { + throw exception(USER_MOBILE_EXISTS); + } + if (!user.getId().equals(id)) { + throw exception(USER_MOBILE_EXISTS); + } + } + + /** + * 校验旧密码 + * @param id 用户 id + * @param oldPassword 旧密码 + */ + @VisibleForTesting + void validateOldPassword(Long id, String oldPassword) { + AdminUserDO user = userMapper.selectById(id); + if (user == null) { + throw exception(USER_NOT_EXISTS); + } + if (!isPasswordMatch(oldPassword, user.getPassword())) { + throw exception(USER_PASSWORD_FAILED); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) // 添加事务,异常则回滚所有导入 + public List importUserList(List importUsers, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(importUsers)) { + throw exception(USER_IMPORT_LIST_IS_EMPTY); + } + List errorList = new ArrayList<>(); + importUsers.forEach(importUser -> { + // 校验,判断是否有不符合的原因 + try { + validateUserForCreateOrUpdate(null, null, importUser.getMobile(), importUser.getEmail(), importUser.getDeptId(), null); + } catch (ServiceException ex) { + errorList.add(importUser); + return; + } + // 判断如果不存在,在进行插入 + AdminUserDO existUser = userMapper.selectByUsername(importUser.getUsername()); + //不存在并非覆盖类型 + if (existUser == null && mode != 3) { + userMapper.insert(UserConvert.INSTANCE.convert(importUser).setPassword(encodePassword(userInitPassword)).setPostIds(new HashSet<>())); // 设置默认密码及空岗位编号数组 + } else if (existUser != null && mode != 2) {// 如果存在,判断是否允许更新 + AdminUserDO updateUser = UserConvert.INSTANCE.convert(importUser); + updateUser.setId(existUser.getId()); + userMapper.updateById(updateUser); + } + }); + //错误不为空并非部分更新,手工回滚 + if(!errorList.isEmpty() && !updatePart) { + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + } + return errorList; + } + + @Override + public List getUserListByStatus(Integer status) { + return userMapper.selectListByStatus(status); + } + + @Override + public boolean isPasswordMatch(String rawPassword, String encodedPassword) { + return passwordEncoder.matches(rawPassword, encodedPassword); + } + + /** + * 对密码进行加密 + * + * @param password 密码 + * @return 加密后的密码 + */ + private String encodePassword(String password) { + return passwordEncoder.encode(password); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/util/collection/SimpleTrie.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/util/collection/SimpleTrie.java new file mode 100644 index 0000000..6e572ea --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/util/collection/SimpleTrie.java @@ -0,0 +1,145 @@ +package com.win.module.system.util.collection; + +import cn.hutool.core.collection.CollUtil; + +import java.util.*; + +/** + * 基于前缀树,实现敏感词的校验 + *

+ * 相比 Apache Common 提供的 PatriciaTrie 来说,性能可能会更加好一些。 + * + * @author 闻荫源码 + */ +@SuppressWarnings("unchecked") +public class SimpleTrie { + + /** + * 一个敏感词结束后对应的 key + */ + private static final Character CHARACTER_END = '\0'; + + /** + * 使用敏感词,构建的前缀树 + */ + private final Map children; + + /** + * 基于字符串,构建前缀树 + * + * @param strs 字符串数组 + */ + public SimpleTrie(Collection strs) { + children = new HashMap<>(); + // 构建树 + CollUtil.sort(strs, String::compareTo); // 排序,优先使用较短的前缀 + for (String str : strs) { + Map child = children; + // 遍历每个字符 + for (Character c : str.toCharArray()) { + // 如果已经到达结束,就没必要在添加更长的敏感词。 + // 例如说,有两个敏感词是:吃饭啊、吃饭。输入一句话是 “我要吃饭啊”,则只要匹配到 “吃饭” 这个敏感词即可。 + if (child.containsKey(CHARACTER_END)) { + break; + } + if (!child.containsKey(c)) { + child.put(c, new HashMap<>()); + } + child = (Map) child.get(c); + } + // 结束 + child.put(CHARACTER_END, null); + } + } + + /** + * 验证文本是否合法,即不包含敏感词 + * + * @param text 文本 + * @return 是否 ok + */ + public boolean isValid(String text) { + // 遍历 text,使用每一个 [i, n) 段的字符串,使用 children 前缀树匹配,是否包含敏感词 + for (int i = 0; i < text.length() - 1; i++) { + Map child = (Map) children.get(text.charAt(i)); + if (child == null) { + continue; + } + boolean ok = recursion(text, i + 1, child); + if (!ok) { + return false; + } + } + return true; + } + + /** + * 验证文本从指定位置开始,是否包含某个敏感词 + * + * @param text 文本 + * @param index 开始位置 + * @param child 节点(当前遍历到的) + * @return 是否包含 + */ + private boolean recursion(String text, int index, Map child) { + if (index == text.length()) { + return true; + } + child = (Map) child.get(text.charAt(index)); + return child == null || !child.containsKey(CHARACTER_END) && recursion(text, ++index, child); + } + + /** + * 获得文本所包含的不合法的敏感词 + * + * 注意,才当即最短匹配原则。例如说:当敏感词存在 “煞笔”,“煞笔二货 ”时,只会返回 “煞笔”。 + * + * @param text 文本 + * @return 匹配的敏感词 + */ + public List validate(String text) { + Set results = new HashSet<>(); + for (int i = 0; i < text.length() - 1; i++) { + Character c = text.charAt(i); + Map child = (Map) children.get(c); + if (child == null) { + continue; + } + StringBuilder result = new StringBuilder().append(c); + boolean ok = recursionWithResult(text, i + 1, child, result); + if (!ok) { + results.add(result.toString()); + } + } + return new ArrayList<>(results); + } + + /** + * 返回文本从 index 开始的敏感词,并使用 StringBuilder 参数进行返回 + * + * 逻辑和 {@link #recursion(String, int, Map)} 是一致,只是多了 result 返回结果 + * + * @param text 文本 + * @param index 开始未知 + * @param child 节点(当前遍历到的) + * @param result 返回敏感词 + * @return 是否有敏感词 + */ + @SuppressWarnings("unchecked") + private static boolean recursionWithResult(String text, int index, Map child, StringBuilder result) { + if (index == text.length()) { + return true; + } + Character c = text.charAt(index); + child = (Map) child.get(c); + if (child == null) { + return true; + } + if (child.containsKey(CHARACTER_END)) { + result.append(c); + return false; + } + return recursionWithResult(text, ++index, child, result.append(c)); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/util/oauth2/OAuth2Utils.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/util/oauth2/OAuth2Utils.java new file mode 100644 index 0000000..749b11b --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/util/oauth2/OAuth2Utils.java @@ -0,0 +1,103 @@ +package com.win.module.system.util.oauth2; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.util.http.HttpUtils; +import com.win.framework.security.core.util.SecurityFrameworkUtils; + +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * OAuth2 相关的工具类 + * + * @author 闻荫源码 + */ +public class OAuth2Utils { + + /** + * 构建授权码模式下,重定向的 URI + * + * copy from Spring Security OAuth2 的 AuthorizationEndpoint 类的 getSuccessfulRedirect 方法 + * + * @param redirectUri 重定向 URI + * @param authorizationCode 授权码 + * @param state 状态 + * @return 授权码模式下的重定向 URI + */ + public static String buildAuthorizationCodeRedirectUri(String redirectUri, String authorizationCode, String state) { + Map query = new LinkedHashMap<>(); + query.put("code", authorizationCode); + if (state != null) { + query.put("state", state); + } + return HttpUtils.append(redirectUri, query, null, false); + } + + /** + * 构建简化模式下,重定向的 URI + * + * copy from Spring Security OAuth2 的 AuthorizationEndpoint 类的 appendAccessToken 方法 + * + * @param redirectUri 重定向 URI + * @param accessToken 访问令牌 + * @param state 状态 + * @param expireTime 过期时间 + * @param scopes 授权范围 + * @param additionalInformation 附加信息 + * @return 简化授权模式下的重定向 URI + */ + public static String buildImplicitRedirectUri(String redirectUri, String accessToken, String state, LocalDateTime expireTime, + Collection scopes, Map additionalInformation) { + Map vars = new LinkedHashMap(); + Map keys = new HashMap(); + vars.put("access_token", accessToken); + vars.put("token_type", SecurityFrameworkUtils.AUTHORIZATION_BEARER.toLowerCase()); + if (state != null) { + vars.put("state", state); + } + if (expireTime != null) { + vars.put("expires_in", getExpiresIn(expireTime)); + } + if (CollUtil.isNotEmpty(scopes)) { + vars.put("scope", buildScopeStr(scopes)); + } + if (CollUtil.isNotEmpty(additionalInformation)) { + for (String key : additionalInformation.keySet()) { + Object value = additionalInformation.get(key); + if (value != null) { + keys.put("extra_" + key, key); + vars.put("extra_" + key, value); + } + } + } + // Do not include the refresh token (even if there is one) + return HttpUtils.append(redirectUri, vars, keys, true); + } + + public static String buildUnsuccessfulRedirect(String redirectUri, String responseType, String state, + String error, String description) { + Map query = new LinkedHashMap(); + query.put("error", error); + query.put("error_description", description); + if (state != null) { + query.put("state", state); + } + return HttpUtils.append(redirectUri, query, null, !responseType.contains("code")); + } + + public static long getExpiresIn(LocalDateTime expireTime) { + return LocalDateTimeUtil.between(LocalDateTime.now(), expireTime, ChronoUnit.SECONDS); + } + + public static String buildScopeStr(Collection scopes) { + return CollUtil.join(scopes, " "); + } + + public static List buildScopes(String scope) { + return StrUtil.split(scope, ' '); + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/util/package-info.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/util/package-info.java new file mode 100644 index 0000000..e40187a --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/util/package-info.java @@ -0,0 +1,4 @@ +/** + * 每个模块的 util 包,放专属当前模块的 Utils 工具类 + */ +package com.win.module.system.util; diff --git a/win-module-system/win-module-system-biz/src/main/resources/i18n/system.properties b/win-module-system/win-module-system-biz/src/main/resources/i18n/system.properties new file mode 100644 index 0000000..6882c29 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/resources/i18n/system.properties @@ -0,0 +1 @@ +#\u6B64\u6587\u4EF6\u4E0D\u9700\u8981\u586B\u5199 \ No newline at end of file diff --git a/win-module-system/win-module-system-biz/src/main/resources/i18n/system_en_US.properties b/win-module-system/win-module-system-biz/src/main/resources/i18n/system_en_US.properties new file mode 100644 index 0000000..e69de29 diff --git a/win-module-system/win-module-system-biz/src/main/resources/i18n/system_zh_CN.properties b/win-module-system/win-module-system-biz/src/main/resources/i18n/system_zh_CN.properties new file mode 100644 index 0000000..e69de29 diff --git a/win-module-system/win-module-system-biz/src/test/resources/application-unit-test.yaml b/win-module-system/win-module-system-biz/src/test/resources/application-unit-test.yaml new file mode 100644 index 0000000..f61ada0 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/test/resources/application-unit-test.yaml @@ -0,0 +1,55 @@ +spring: + main: + lazy-initialization: true # 开启懒加载,加快速度 + banner-mode: off # 单元测试,禁用 Banner + +--- #################### 数据库相关配置 #################### + +spring: + # 数据源配置项 + datasource: + name: ruoyi-vue-pro + url: jdbc:h2:mem:testdb;MODE=MYSQL;DATABASE_TO_UPPER=false;NON_KEYWORDS=value; # MODE 使用 MySQL 模式;DATABASE_TO_UPPER 配置表和字段使用小写 + driver-class-name: org.h2.Driver + username: sa + password: + druid: + async-init: true # 单元测试,异步初始化 Druid 连接池,提升启动速度 + initial-size: 1 # 单元测试,配置为 1,提升启动速度 + sql: + init: + schema-locations: classpath:/sql/create_tables.sql + + # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 + redis: + host: 127.0.0.1 # 地址 + port: 16379 # 端口(单元测试,使用 16379 端口) + database: 0 # 数据库索引 + + +mybatis: + lazy-initialization: true # 单元测试,设置 MyBatis Mapper 延迟加载,加速每个单元测试 + +--- #################### 定时任务相关配置 #################### + +--- #################### 配置中心相关配置 #################### + +--- #################### 服务保障相关配置 #################### + +# Lock4j 配置项(单元测试,禁用 Lock4j) + +# Resilience4j 配置项 + +--- #################### 监控相关配置 #################### + +--- #################### 闻荫相关配置 #################### + +# 闻荫配置项,设置当前项目所有自定义的配置 +win: + info: + base-package: com.win.module + captcha: + timeout: 5m + width: 160 + height: 60 + enable: true diff --git a/win-module-system/win-module-system-biz/src/test/resources/logback.xml b/win-module-system/win-module-system-biz/src/test/resources/logback.xml new file mode 100644 index 0000000..daf756b --- /dev/null +++ b/win-module-system/win-module-system-biz/src/test/resources/logback.xml @@ -0,0 +1,4 @@ + + + + diff --git a/win-module-system/win-module-system-biz/src/test/resources/sql/clean.sql b/win-module-system/win-module-system-biz/src/test/resources/sql/clean.sql new file mode 100644 index 0000000..785e5ea --- /dev/null +++ b/win-module-system/win-module-system-biz/src/test/resources/sql/clean.sql @@ -0,0 +1,34 @@ +DELETE FROM "system_dept"; +DELETE FROM "system_dict_data"; +DELETE FROM "system_role"; +DELETE FROM "system_role_menu"; +DELETE FROM "system_menu"; +DELETE FROM "system_user_role"; +DELETE FROM "system_dict_type"; +DELETE FROM "system_user_session"; +DELETE FROM "system_post"; +DELETE FROM "system_user_post"; +DELETE FROM "system_notice"; +DELETE FROM "system_login_log"; +DELETE FROM "system_operate_log"; +DELETE FROM "system_users"; +DELETE FROM "system_sms_channel"; +DELETE FROM "system_sms_template"; +DELETE FROM "system_sms_log"; +DELETE FROM "system_sms_code"; +DELETE FROM "system_error_code"; +DELETE FROM "system_social_user"; +DELETE FROM "system_social_user_bind"; +DELETE FROM "system_tenant"; +DELETE FROM "system_tenant_package"; +DELETE FROM "system_sensitive_word"; +DELETE FROM "system_oauth2_client"; +DELETE FROM "system_oauth2_approve"; +DELETE FROM "system_oauth2_access_token"; +DELETE FROM "system_oauth2_refresh_token"; +DELETE FROM "system_oauth2_code"; +DELETE FROM "system_mail_account"; +DELETE FROM "system_mail_template"; +DELETE FROM "system_mail_log"; +DELETE FROM "system_notify_template"; +DELETE FROM "system_notify_message"; diff --git a/win-module-system/win-module-system-biz/src/test/resources/sql/create_tables.sql b/win-module-system/win-module-system-biz/src/test/resources/sql/create_tables.sql new file mode 100644 index 0000000..0be9110 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/test/resources/sql/create_tables.sql @@ -0,0 +1,630 @@ +CREATE TABLE IF NOT EXISTS "system_dept" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(30) NOT NULL DEFAULT '', + "parent_id" bigint NOT NULL DEFAULT '0', + "sort" int NOT NULL DEFAULT '0', + "leader_user_id" bigint DEFAULT NULL, + "phone" varchar(11) DEFAULT NULL, + "email" varchar(50) DEFAULT NULL, + "status" tinyint NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint not null default '0', + PRIMARY KEY ("id") +) COMMENT '部门表'; + +CREATE TABLE IF NOT EXISTS "system_dict_data" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "sort" int NOT NULL DEFAULT '0', + "label" varchar(100) NOT NULL DEFAULT '', + "value" varchar(100) NOT NULL DEFAULT '', + "dict_type" varchar(100) NOT NULL DEFAULT '', + "status" tinyint NOT NULL DEFAULT '0', + "color_type" varchar(100) NOT NULL DEFAULT '', + "css_class" varchar(100) NOT NULL DEFAULT '', + "remark" varchar(500) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '字典数据表'; + +CREATE TABLE IF NOT EXISTS "system_role" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(30) NOT NULL, + "code" varchar(100) NOT NULL, + "sort" int NOT NULL, + "data_scope" tinyint NOT NULL DEFAULT '1', + "data_scope_dept_ids" varchar(500) NOT NULL DEFAULT '', + "status" tinyint NOT NULL, + "type" tinyint NOT NULL, + "remark" varchar(500) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint not null default '0', + PRIMARY KEY ("id") +) COMMENT '角色信息表'; + +CREATE TABLE IF NOT EXISTS "system_role_menu" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "role_id" bigint NOT NULL, + "menu_id" bigint NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint not null default '0', + PRIMARY KEY ("id") +) COMMENT '角色和菜单关联表'; + +CREATE TABLE IF NOT EXISTS "system_menu" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(50) NOT NULL, + "permission" varchar(100) NOT NULL DEFAULT '', + "type" tinyint NOT NULL, + "sort" int NOT NULL DEFAULT '0', + "parent_id" bigint NOT NULL DEFAULT '0', + "path" varchar(200) DEFAULT '', + "icon" varchar(100) DEFAULT '#', + "component" varchar(255) DEFAULT NULL, + "component_name" varchar(255) DEFAULT NULL, + "status" tinyint NOT NULL DEFAULT '0', + "visible" bit NOT NULL DEFAULT TRUE, + "keep_alive" bit NOT NULL DEFAULT TRUE, + "always_show" bit NOT NULL DEFAULT TRUE, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '菜单权限表'; + +CREATE TABLE IF NOT EXISTS "system_user_role" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "user_id" bigint NOT NULL, + "role_id" bigint NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp DEFAULT NULL, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp DEFAULT NULL, + "deleted" bit DEFAULT FALSE, + "tenant_id" bigint not null default '0', + PRIMARY KEY ("id") +) COMMENT '用户和角色关联表'; + +CREATE TABLE IF NOT EXISTS "system_dict_type" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(100) NOT NULL DEFAULT '', + "type" varchar(100) NOT NULL DEFAULT '', + "status" tinyint NOT NULL DEFAULT '0', + "remark" varchar(500) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "deleted_time" timestamp NOT NULL, + PRIMARY KEY ("id") +) COMMENT '字典类型表'; + +CREATE TABLE IF NOT EXISTS `system_user_session` ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + `token` varchar(32) NOT NULL, + `user_id` bigint DEFAULT NULL, + "user_type" tinyint NOT NULL, + `username` varchar(50) NOT NULL DEFAULT '', + `user_ip` varchar(50) DEFAULT NULL, + `user_agent` varchar(512) DEFAULT NULL, + `session_timeout` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updater` varchar(64) DEFAULT '' , + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint not null default '0', + PRIMARY KEY (`id`) +) COMMENT '用户在线 Session'; + +CREATE TABLE IF NOT EXISTS "system_post" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "code" varchar(64) NOT NULL, + "name" varchar(50) NOT NULL, + "sort" integer NOT NULL, + "status" tinyint NOT NULL, + "remark" varchar(500) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint not null default '0', + PRIMARY KEY ("id") +) COMMENT '岗位信息表'; + +CREATE TABLE IF NOT EXISTS `system_user_post`( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "user_id" bigint DEFAULT NULL, + "post_id" bigint DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint not null default '0', + PRIMARY KEY (`id`) +) COMMENT ='用户岗位表'; + +CREATE TABLE IF NOT EXISTS "system_notice" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "title" varchar(50) NOT NULL COMMENT '公告标题', + "content" text NOT NULL COMMENT '公告内容', + "type" tinyint NOT NULL COMMENT '公告类型(1通知 2公告)', + "status" tinyint NOT NULL DEFAULT '0' COMMENT '公告状态(0正常 1关闭)', + "creator" varchar(64) DEFAULT '' COMMENT '创建者', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + "updater" varchar(64) DEFAULT '' COMMENT '更新者', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + "deleted" bit NOT NULL DEFAULT 0 COMMENT '是否删除', + "tenant_id" bigint not null default '0', + PRIMARY KEY("id") +) COMMENT '通知公告表'; + +CREATE TABLE IF NOT EXISTS `system_login_log` ( + `id` bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY, + `log_type` bigint(4) NOT NULL, + "user_id" bigint not null default '0', + "user_type" tinyint NOT NULL, + `trace_id` varchar(64) NOT NULL DEFAULT '', + `username` varchar(50) NOT NULL DEFAULT '', + `result` tinyint(4) NOT NULL, + `user_ip` varchar(50) NOT NULL, + `user_agent` varchar(512) NOT NULL, + `creator` varchar(64) DEFAULT '', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updater` varchar(64) DEFAULT '', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `deleted` bit(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) COMMENT ='系统访问记录'; + +CREATE TABLE IF NOT EXISTS `system_operate_log` ( + `id` bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY, + `trace_id` varchar(64) NOT NULL DEFAULT '', + `user_id` bigint(20) NOT NULL, + "user_type" tinyint not null default '0', + `module` varchar(50) NOT NULL, + `name` varchar(50) NOT NULL, + `type` bigint(4) NOT NULL DEFAULT '0', + `content` varchar(2000) NOT NULL DEFAULT '', + `exts` varchar(512) NOT NULL DEFAULT '', + `request_method` varchar(16) DEFAULT '', + `request_url` varchar(255) DEFAULT '', + `user_ip` varchar(50) DEFAULT NULL, + `user_agent` varchar(200) DEFAULT NULL, + `java_method` varchar(512) NOT NULL DEFAULT '', + `java_method_args` varchar(8000) DEFAULT '', + `start_time` datetime NOT NULL, + `duration` int(11) NOT NULL, + `result_code` int(11) NOT NULL DEFAULT '0', + `result_msg` varchar(512) DEFAULT '', + `result_data` varchar(4000) DEFAULT '', + `creator` varchar(64) DEFAULT '', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updater` varchar(64) DEFAULT '', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `deleted` bit(1) NOT NULL DEFAULT '0', + "tenant_id" bigint not null default '0', + PRIMARY KEY (`id`) +) COMMENT ='操作日志记录'; + +CREATE TABLE IF NOT EXISTS "system_users" ( + "id" bigint not null GENERATED BY DEFAULT AS IDENTITY, + "username" varchar(30) not null, + "password" varchar(100) not null default '', + "nickname" varchar(30) not null, + "remark" varchar(500) default null, + "dept_id" bigint default null, + "post_ids" varchar(255) default null, + "email" varchar(50) default '', + "mobile" varchar(11) default '', + "sex" tinyint default '0', + "avatar" varchar(100) default '', + "status" tinyint not null default '0', + "login_ip" varchar(50) default '', + "login_date" timestamp default null, + "creator" varchar(64) default '', + "create_time" timestamp not null default current_timestamp, + "updater" varchar(64) default '', + "update_time" timestamp not null default current_timestamp, + "deleted" bit not null default false, + "tenant_id" bigint not null default '0', + primary key ("id") +) comment '用户信息表'; + +CREATE TABLE IF NOT EXISTS "system_sms_channel" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "signature" varchar(10) NOT NULL, + "code" varchar(63) NOT NULL, + "status" tinyint NOT NULL, + "remark" varchar(255) DEFAULT NULL, + "api_key" varchar(63) NOT NULL, + "api_secret" varchar(63) DEFAULT NULL, + "callback_url" varchar(255) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '短信渠道'; + +CREATE TABLE IF NOT EXISTS "system_sms_template" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "type" tinyint NOT NULL, + "status" tinyint NOT NULL, + "code" varchar(63) NOT NULL, + "name" varchar(63) NOT NULL, + "content" varchar(255) NOT NULL, + "params" varchar(255) NOT NULL, + "remark" varchar(255) DEFAULT NULL, + "api_template_id" varchar(63) NOT NULL, + "channel_id" bigint NOT NULL, + "channel_code" varchar(63) NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '短信模板'; + +CREATE TABLE IF NOT EXISTS "system_sms_log" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "channel_id" bigint NOT NULL, + "channel_code" varchar(63) NOT NULL, + "template_id" bigint NOT NULL, + "template_code" varchar(63) NOT NULL, + "template_type" tinyint NOT NULL, + "template_content" varchar(255) NOT NULL, + "template_params" varchar(255) NOT NULL, + "api_template_id" varchar(63) NOT NULL, + "mobile" varchar(11) NOT NULL, + "user_id" bigint DEFAULT '0', + "user_type" tinyint DEFAULT '0', + "send_status" tinyint NOT NULL DEFAULT '0', + "send_time" timestamp DEFAULT NULL, + "send_code" int DEFAULT NULL, + "send_msg" varchar(255) DEFAULT NULL, + "api_send_code" varchar(63) DEFAULT NULL, + "api_send_msg" varchar(255) DEFAULT NULL, + "api_request_id" varchar(255) DEFAULT NULL, + "api_serial_no" varchar(255) DEFAULT NULL, + "receive_status" tinyint NOT NULL DEFAULT '0', + "receive_time" timestamp DEFAULT NULL, + "api_receive_code" varchar(63) DEFAULT NULL, + "api_receive_msg" varchar(255) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '短信日志'; + +CREATE TABLE IF NOT EXISTS "system_sms_code" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "mobile" varchar(11) NOT NULL, + "code" varchar(11) NOT NULL, + "scene" bigint NOT NULL, + "create_ip" varchar NOT NULL, + "today_index" int NOT NULL, + "used" bit NOT NULL DEFAULT FALSE, + "used_time" timestamp DEFAULT NULL, + "used_ip" varchar NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '短信日志'; + +CREATE TABLE IF NOT EXISTS "system_error_code" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "type" tinyint NOT NULL DEFAULT '0', + "application_name" varchar(50) NOT NULL, + "code" int NOT NULL DEFAULT '0', + "message" varchar(512) NOT NULL DEFAULT '', + "memo" varchar(512) DEFAULT '', + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '错误码表'; + +CREATE TABLE IF NOT EXISTS "system_social_user" ( + "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "type" tinyint NOT NULL, + "openid" varchar(64) NOT NULL, + "token" varchar(256) DEFAULT NULL, + "raw_token_info" varchar(1024) NOT NULL, + "nickname" varchar(32) NOT NULL, + "avatar" varchar(255) DEFAULT NULL, + "raw_user_info" varchar(1024) NOT NULL, + "code" varchar(64) NOT NULL, + "state" varchar(64), + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '社交用户'; + +CREATE TABLE IF NOT EXISTS "system_social_user_bind" ( + "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "user_id" bigint NOT NULL, + "user_type" tinyint NOT NULL, + "social_type" tinyint NOT NULL, + "social_user_id" number NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '社交用户的绑定'; + +CREATE TABLE IF NOT EXISTS "system_tenant" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(63) NOT NULL, + "contact_user_id" bigint NOT NULL DEFAULT '0', + "contact_name" varchar(255) NOT NULL, + "contact_mobile" varchar(255), + "status" tinyint NOT NULL, + "domain" varchar(63) DEFAULT '', + "package_id" bigint NOT NULL, + "expire_time" timestamp NOT NULL, + "account_count" int NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '租户'; + +CREATE TABLE IF NOT EXISTS "system_tenant_package" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(30) NOT NULL, + "status" tinyint NOT NULL, + "remark" varchar(256), + "menu_ids" varchar(2048) NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '租户套餐表'; + +CREATE TABLE IF NOT EXISTS "system_sensitive_word" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(255) NOT NULL, + "tags" varchar(1024) NOT NULL, + "status" bit NOT NULL DEFAULT FALSE, + "description" varchar(512), + "creator" varchar(64) DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '系统敏感词'; + +CREATE TABLE IF NOT EXISTS "system_oauth2_client" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "client_id" varchar NOT NULL, + "secret" varchar NOT NULL, + "name" varchar NOT NULL, + "logo" varchar NOT NULL, + "description" varchar, + "status" int NOT NULL, + "access_token_validity_seconds" int NOT NULL, + "refresh_token_validity_seconds" int NOT NULL, + "redirect_uris" varchar NOT NULL, + "authorized_grant_types" varchar NOT NULL, + "scopes" varchar NOT NULL DEFAULT '', + "auto_approve_scopes" varchar NOT NULL DEFAULT '', + "authorities" varchar NOT NULL DEFAULT '', + "resource_ids" varchar NOT NULL DEFAULT '', + "additional_information" varchar NOT NULL DEFAULT '', + "creator" varchar DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT 'OAuth2 客户端表'; + +CREATE TABLE IF NOT EXISTS "system_oauth2_approve" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "user_id" bigint NOT NULL, + "user_type" tinyint NOT NULL, + "client_id" varchar NOT NULL, + "scope" varchar NOT NULL, + "approved" bit NOT NULL DEFAULT FALSE, + "expires_time" datetime NOT NULL, + "creator" varchar DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT 'OAuth2 批准表'; + +CREATE TABLE IF NOT EXISTS "system_oauth2_access_token" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "user_id" bigint NOT NULL, + "user_type" tinyint NOT NULL, + "access_token" varchar NOT NULL, + "refresh_token" varchar NOT NULL, + "client_id" varchar NOT NULL, + "scopes" varchar NOT NULL, + "approved" bit NOT NULL DEFAULT FALSE, + "expires_time" datetime NOT NULL, + "creator" varchar DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint NOT NULL, + PRIMARY KEY ("id") +) COMMENT 'OAuth2 访问令牌'; + +CREATE TABLE IF NOT EXISTS "system_oauth2_refresh_token" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "user_id" bigint NOT NULL, + "user_type" tinyint NOT NULL, + "refresh_token" varchar NOT NULL, + "client_id" varchar NOT NULL, + "scopes" varchar NOT NULL, + "approved" bit NOT NULL DEFAULT FALSE, + "expires_time" datetime NOT NULL, + "creator" varchar DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT 'OAuth2 刷新令牌'; + +CREATE TABLE IF NOT EXISTS "system_oauth2_code" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "user_id" bigint NOT NULL, + "user_type" tinyint NOT NULL, + "code" varchar NOT NULL, + "client_id" varchar NOT NULL, + "scopes" varchar NOT NULL, + "expires_time" datetime NOT NULL, + "redirect_uri" varchar NOT NULL, + "state" varchar NOT NULL, + "creator" varchar DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT 'OAuth2 刷新令牌'; + +CREATE TABLE IF NOT EXISTS "system_mail_account" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "mail" varchar NOT NULL, + "username" varchar NOT NULL, + "password" varchar NOT NULL, + "host" varchar NOT NULL, + "port" int NOT NULL, + "ssl_enable" bit NOT NULL, + "creator" varchar DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '邮箱账号表'; + +CREATE TABLE IF NOT EXISTS "system_mail_template" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar NOT NULL, + "code" varchar NOT NULL, + "account_id" bigint NOT NULL, + "nickname" varchar, + "title" varchar NOT NULL, + "content" varchar NOT NULL, + "params" varchar NOT NULL, + "status" varchar NOT NULL, + "remark" varchar, + "creator" varchar DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '邮件模版表'; + +CREATE TABLE IF NOT EXISTS "system_mail_log" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "user_id" bigint, + "user_type" varchar, + "to_mail" varchar NOT NULL, + "account_id" bigint NOT NULL, + "from_mail" varchar NOT NULL, + "template_id" bigint NOT NULL, + "template_code" varchar NOT NULL, + "template_nickname" varchar, + "template_title" varchar NOT NULL, + "template_content" varchar NOT NULL, + "template_params" varchar NOT NULL, + "send_status" varchar NOT NULL, + "send_time" datetime, + "send_message_id" varchar, + "send_exception" varchar, + "creator" varchar DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '邮件日志表'; + +-- 将该建表 SQL 语句,添加到 win-module-system-biz 模块的 test/resources/sql/create_tables.sql 文件里 +CREATE TABLE IF NOT EXISTS "system_notify_template" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar NOT NULL, + "code" varchar NOT NULL, + "nickname" varchar NOT NULL, + "content" varchar NOT NULL, + "type" varchar NOT NULL, + "params" varchar, + "status" varchar NOT NULL, + "remark" varchar, + "creator" varchar DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '站内信模板表'; + +CREATE TABLE IF NOT EXISTS "system_notify_message" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "user_id" bigint NOT NULL, + "user_type" varchar NOT NULL, + "template_id" bigint NOT NULL, + "template_code" varchar NOT NULL, + "template_nickname" varchar NOT NULL, + "template_content" varchar NOT NULL, + "template_type" int NOT NULL, + "template_params" varchar NOT NULL, + "read_status" bit NOT NULL, + "read_time" varchar, + "creator" varchar DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint not null default '0', + PRIMARY KEY ("id") +) COMMENT '站内信消息表'; diff --git a/win-server/Dockerfile b/win-server/Dockerfile new file mode 100644 index 0000000..3283b15 --- /dev/null +++ b/win-server/Dockerfile @@ -0,0 +1,23 @@ +## AdoptOpenJDK 停止发布 OpenJDK 二进制,而 Eclipse Temurin 是它的延伸,提供更好的稳定性 +## 感谢复旦核博士的建议!灰子哥,牛皮! +FROM eclipse-temurin:8-jre + +## 创建目录,并使用它作为工作目录 +RUN mkdir -p /win-server +WORKDIR /win-server +## 将后端项目的 Jar 文件,复制到镜像中 +COPY ./target/win-server.jar app.jar + +## 设置 TZ 时区 +ENV TZ=Asia/Shanghai +## 设置 JAVA_OPTS 环境变量,可通过 docker run -e "JAVA_OPTS=" 进行覆盖 +ENV JAVA_OPTS="-Xms512m -Xmx512m -Djava.security.egd=file:/dev/./urandom" + +## 应用参数 +ENV ARGS="" + +## 暴露后端项目的 48080 端口 +EXPOSE 48080 + +## 启动后端项目 +CMD java ${JAVA_OPTS} -jar app.jar $ARGS diff --git a/win-server/pom.xml b/win-server/pom.xml new file mode 100644 index 0000000..d7835af --- /dev/null +++ b/win-server/pom.xml @@ -0,0 +1,101 @@ + + + + com.win + win + ${revision} + + 4.0.0 + + win-server + jar + + ${project.artifactId} + + 后端 Server 的主项目,通过引入需要 win-module-xxx 的依赖, + 从而实现提供 RESTful API 给 win-ui-admin、win-ui-user 等前端项目。 + 本质上来说,它就是个空壳(容器)! + + https://github.com/YunaiV/ruoyi-vue-pro + + + + + org.ssssssss + magic-api-spring-boot-starter + + + + com.win + win-module-system-biz + ${revision} + + + + com.win + win-module-infra-biz + ${revision} + + + + com.win + win-spring-boot-starter-biz-error-code + + + + + com.win + win-module-report-biz + ${revision} + + + + + com.win + win-module-bpm-biz + ${revision} + + + + + org.springframework.boot + spring-boot-configuration-processor + true + + + + com.win + win-spring-boot-starter-banner + + + + + com.win + win-spring-boot-starter-protection + + + + + + + ${project.artifactId} + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring.boot.version} + + + + repackage + + + + + + + + diff --git a/win-server/src/main/java/com/win/server/WinServerApplication.java b/win-server/src/main/java/com/win/server/WinServerApplication.java new file mode 100644 index 0000000..00d22c0 --- /dev/null +++ b/win-server/src/main/java/com/win/server/WinServerApplication.java @@ -0,0 +1,25 @@ +package com.win.server; + +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; + +/** + * 项目的启动类 + * + * @author 闻荫源码 + */ +@SuppressWarnings("SpringComponentScan") // 忽略 IDEA 无法识别 ${win.info.base-package} +@SpringBootApplication( + scanBasePackages = {"${win.info.base-package}.server", "${win.info.base-package}.module"}, + exclude = {DataSourceAutoConfiguration.class, DruidDataSourceAutoConfigure.class} +) +public class WinServerApplication { + + public static void main(String[] args) { + SpringApplication.run(WinServerApplication.class, args); + // new SpringApplicationBuilder(WinServerApplication.class).applicationStartup(new BufferingApplicationStartup(20480)).run(args); + } + +} diff --git a/win-server/src/main/java/com/win/server/controller/DefaultController.java b/win-server/src/main/java/com/win/server/controller/DefaultController.java new file mode 100644 index 0000000..de63a9e --- /dev/null +++ b/win-server/src/main/java/com/win/server/controller/DefaultController.java @@ -0,0 +1,30 @@ +package com.win.server.controller; + +import com.win.framework.common.pojo.CommonResult; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import static com.win.framework.common.exception.enums.GlobalErrorCodeConstants.NOT_IMPLEMENTED; + +/** + * 默认 Controller,解决部分 module 未开启时的 404 提示。 + * 例如说,/bpm/** 路径,工作流 + * + * @author 闻荫源码 + */ +@RestController +public class DefaultController { + + @RequestMapping("/admin-api/bpm/**") + public CommonResult bpm404() { + return CommonResult.error(NOT_IMPLEMENTED.getCode(), + "[工作流模块 win-module-bpm - 已禁用][参考 https://doc.iocoder.cn/bpm/ 开启]"); + } + + @RequestMapping(value = {"/admin-api/report/**"}) + public CommonResult report404() { + return CommonResult.error(NOT_IMPLEMENTED.getCode(), + "[报表模块 win-module-report - 已禁用][参考 https://doc.iocoder.cn/report/ 开启]"); + } + +} diff --git a/win-server/src/main/resources/application-dev.yaml b/win-server/src/main/resources/application-dev.yaml new file mode 100644 index 0000000..811b34c --- /dev/null +++ b/win-server/src/main/resources/application-dev.yaml @@ -0,0 +1,198 @@ +server: + port: 12080 + +--- #################### 数据库相关配置 #################### + +spring: + # 数据源配置项 + autoconfigure: + exclude: + - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure # 排除 Druid 的自动配置,使用 dynamic-datasource-spring-boot-starter 配置多数据源 + - org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration # 排除积木报表带来的 MongoDB 的自动配置 + shardingsphere: + mode: + type: Memory + # 属性配置 + props: + sql.show: true + ## 数据源配置 + datasource: + names: master,slave0,slave1 + # 主数据源 + master: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://dev.ccwin-in.com:23113/win_in?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: win_in + password: Microdoft@2023 + # 读数据源 + slave0: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://dev.ccwin-in.com:23113/win_in?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: win_in + password: Microdoft@2023 + # 读数据源 + slave1: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://dev.ccwin-in.com:23113/win_in?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: win_in + password: Microdoft@2023 + # 读写分离类型,如: Static,Dynamic + rules: + readwrite-splitting: + data-sources: + myds: + type: Static + props: + write-data-source-name: master + read-data-source-names: slave0,slave1 + load-balancer-name: alg_round + load-balancers: + alg_round: + type: ROUND_ROBIN + sharding: + # 表策略配置 + tables: + # t_user 是逻辑表 + infra_trends: + # 配置数据节点,这里是按月分表 + actualDataNodes: master.infra_trends_$->{2023}${(10..12).collect{t->t.toString().padLeft(2,'0')}},master.infra_trends_$->{2024..2030}${(1..12).collect{t->t.toString().padLeft(2,'0')}} + tableStrategy: + # 使用标准分片策略 + standard: + # 配置分片字段 + shardingColumn: create_time + # 分片算法名称,不支持大写字母和下划线,否则启动就会报错 + shardingAlgorithmName: time-sharding-altorithm + # 分片算法配置 + shardingAlgorithms: + # 分片算法名称,不支持大写字母和下划线,否则启动就会报错 + time-sharding-altorithm: + # 类型:自定义策略 + type: CLASS_BASED + props: + # 分片策略 + strategy: standard + # 分片算法类 + algorithmClassName: com.win.framework.datasource.sharding.TimeShardingAlgorithm + # 不创建此数据源,用于生成代码 + datasource: + dynamic: + strict: true + primary: master + datasource: + master: + type: ${spring.shardingsphere.datasource.master.type} + driver-class-name: ${spring.shardingsphere.datasource.master.driverClassName} + url: ${spring.shardingsphere.datasource.master.url} + username: ${spring.shardingsphere.datasource.master.username} + password: ${spring.shardingsphere.datasource.master.password} + + # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 + redis: +# host: dev.ccwin-in.com # 地址 +# port: 23114 # 端口 +# database: 6 # 数据库索引 + host: 127.0.0.1 # 地址 + port: 6379 # 端口 + database: 0 # 数据库索引 + password: 123456 +# password: dev # 密码,建议生产环境开启 + +--- #################### 定时任务相关配置 #################### + +# Quartz 配置项,对应 QuartzProperties 配置类 +spring: + quartz: + auto-startup: true # 测试环境,需要开启 Job + scheduler-name: schedulerName # Scheduler 名字。默认为 schedulerName + job-store-type: jdbc # Job 存储器类型。默认为 memory 表示内存,可选 jdbc 使用数据库。 + wait-for-jobs-to-complete-on-shutdown: true # 应用关闭时,是否等待定时任务执行完成。默认为 false ,建议设置为 true + properties: # 添加 Quartz Scheduler 附加属性,更多可以看 http://www.quartz-scheduler.org/documentation/2.4.0-SNAPSHOT/configuration.html 文档 + org: + quartz: + # Scheduler 相关配置 + scheduler: + instanceName: schedulerName + instanceId: AUTO # 自动生成 instance ID + # JobStore 相关配置 + jobStore: + # JobStore 实现类。可见博客:https://blog.csdn.net/weixin_42458219/article/details/122247162 + class: org.springframework.scheduling.quartz.LocalDataSourceJobStore + isClustered: true # 是集群模式 + clusterCheckinInterval: 15000 # 集群检查频率,单位:毫秒。默认为 15000,即 15 秒 + misfireThreshold: 60000 # misfire 阀值,单位:毫秒。 + # 线程池相关配置 + threadPool: + threadCount: 25 # 线程池大小。默认为 10 。 + threadPriority: 5 # 线程优先级 + class: org.quartz.simpl.SimpleThreadPool # 线程池类型 + jdbc: # 使用 JDBC 的 JobStore 的时候,JDBC 的配置 + initialize-schema: NEVER # 是否自动使用 SQL 初始化 Quartz 表结构。这里设置成 never ,我们手动创建表结构。 + +--- #################### 服务保障相关配置 #################### + +# Lock4j 配置项 +lock4j: + acquire-timeout: 3000 # 获取分布式锁超时时间,默认为 3000 毫秒 + expire: 30000 # 分布式锁的超时时间,默认为 30 毫秒 + +# Resilience4j 配置项 +resilience4j: + ratelimiter: + instances: + backendA: + limit-for-period: 1 # 每个周期内,允许的请求数。默认为 50 + limit-refresh-period: 60s # 每个周期的时长,单位:微秒。默认为 500 + timeout-duration: 1s # 被限流时,阻塞等待的时长,单位:微秒。默认为 5s + register-health-indicator: true # 是否注册到健康监测 + +--- #################### 监控相关配置 #################### + +# Actuator 监控端点的配置项 +management: + endpoint: + health: + show-details: ALWAYS + endpoints: + enable-by-default: true + web: + base-path: /actuator # Actuator 提供的 API 接口的根目录。默认为 /actuator + exposure: + include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。 + +# Spring Boot Admin 配置项 +spring: + boot: + admin: + # Spring Boot Admin Client 客户端的相关配置 + client: + url: http://127.0.0.1:${server.port}/${spring.boot.admin.context-path} # 设置 Spring Boot Admin Server 地址 + instance: + service-host-type: IP # 注册实例时,优先使用 IP [IP, HOST_NAME, CANONICAL_HOST_NAME] + # Spring Boot Admin Server 服务端的相关配置 + context-path: /admin # 配置 Spring + +# 日志文件配置 +logging: + file: + path: logs + level: + com.win: debug + org.springframework: warn + +--- #################### 闻荫相关配置 #################### + +# 闻荫配置项,设置当前项目所有自定义的配置 +win: + xss: + enable: false + exclude-urls: # 如下两个 url,仅仅是为了演示,去掉配置也没关系 + - ${spring.boot.admin.context-path}/** # 不处理 Spring Boot Admin 的请求 + - ${management.endpoints.web.base-path}/** # 不处理 Actuator 的请求 + demo: false # 开启演示模式 + security: + mock-enable: true # 是否开启 Token 的模拟机制 + mock-secret: test # Token 模拟机制的 Token 前缀 diff --git a/win-server/src/main/resources/application-druid.yml b/win-server/src/main/resources/application-druid.yml new file mode 100644 index 0000000..d6479cc --- /dev/null +++ b/win-server/src/main/resources/application-druid.yml @@ -0,0 +1,47 @@ +# 数据源配置 +spring: + datasource: + druid: + # 初始连接数 + initialSize: 20 + # 最小连接池数量 + minIdle: 20 + # 最大连接池数量 + maxActive: 200 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: false + url-pattern: /* # 过滤所有url + exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*" # 排除一些不必要的url + session-stat-enable: true # 开启session统计功能 + session-stat-max-count: 1000 # session的最大个数,默认100 + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: win + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true \ No newline at end of file diff --git a/win-server/src/main/resources/application-prod.yaml b/win-server/src/main/resources/application-prod.yaml new file mode 100644 index 0000000..1eac7ae --- /dev/null +++ b/win-server/src/main/resources/application-prod.yaml @@ -0,0 +1,182 @@ +server: + port: 12080 + +--- #################### 数据库相关配置 #################### + +spring: + # 数据源配置项 + autoconfigure: + exclude: + - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure # 排除 Druid 的自动配置,使用 dynamic-datasource-spring-boot-starter 配置多数据源 + - org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration # 排除积木报表带来的 MongoDB 的自动配置 + shardingsphere: + mode: + type: Memory + # 属性配置 + props: + sql.show: true + ## 数据源配置 + datasource: + names: master,slave0,slave1 + # 主数据源 + master: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://dev.ccwin-in.com:23113/sfms?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: learun + password: Microdoft@2021 + # 读数据源 + slave0: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://dev.ccwin-in.com:23113/sfms?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: learun + password: Microdoft@2021 + # 读数据源 + slave1: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://dev.ccwin-in.com:23113/sfms?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: learun + password: Microdoft@2021 + # 读写分离类型,如: Static,Dynamic + rules: + readwrite-splitting: + data-sources: + myds: + type: Static + props: + write-data-source-name: master + read-data-source-names: slave0,slave1 + load-balancer-name: alg_round + load-balancers: + alg_round: + type: ROUND_ROBIN + sharding: + # 表策略配置 + tables: + # t_user 是逻辑表 + infra_trends: + # 配置数据节点,这里是按月分表 + actualDataNodes: master.infra_trends_$->{2023}${(10..12).collect{t->t.toString().padLeft(2,'0')}},master.infra_trends_$->{2024..2030}${(1..12).collect{t->t.toString().padLeft(2,'0')}} + tableStrategy: + # 使用标准分片策略 + standard: + # 配置分片字段 + shardingColumn: create_time + # 分片算法名称,不支持大写字母和下划线,否则启动就会报错 + shardingAlgorithmName: time-sharding-altorithm + datasource: + dynamic: + strict: true + primary: master + datasource: + master: + type: ${spring.shardingsphere.datasource.master.type} + driver-class-name: ${spring.shardingsphere.datasource.master.driverClassName} + url: ${spring.shardingsphere.datasource.master.url} + username: ${spring.shardingsphere.datasource.master.username} + password: ${spring.shardingsphere.datasource.master.password} + + # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 + redis: + host: dev.ccwin-in.com # 地址 + port: 23114 # 端口 + database: 6 # 数据库索引 +# password: dev # 密码,建议生产环境开启 + +--- #################### 定时任务相关配置 #################### + +# Quartz 配置项,对应 QuartzProperties 配置类 +spring: + quartz: + auto-startup: true # 测试环境,需要开启 Job + scheduler-name: schedulerName # Scheduler 名字。默认为 schedulerName + job-store-type: jdbc # Job 存储器类型。默认为 memory 表示内存,可选 jdbc 使用数据库。 + wait-for-jobs-to-complete-on-shutdown: true # 应用关闭时,是否等待定时任务执行完成。默认为 false ,建议设置为 true + properties: # 添加 Quartz Scheduler 附加属性,更多可以看 http://www.quartz-scheduler.org/documentation/2.4.0-SNAPSHOT/configuration.html 文档 + org: + quartz: + # Scheduler 相关配置 + scheduler: + instanceName: schedulerName + instanceId: AUTO # 自动生成 instance ID + # JobStore 相关配置 + jobStore: + # JobStore 实现类。可见博客:https://blog.csdn.net/weixin_42458219/article/details/122247162 + class: org.springframework.scheduling.quartz.LocalDataSourceJobStore + isClustered: true # 是集群模式 + clusterCheckinInterval: 15000 # 集群检查频率,单位:毫秒。默认为 15000,即 15 秒 + misfireThreshold: 60000 # misfire 阀值,单位:毫秒。 + # 线程池相关配置 + threadPool: + threadCount: 25 # 线程池大小。默认为 10 。 + threadPriority: 5 # 线程优先级 + class: org.quartz.simpl.SimpleThreadPool # 线程池类型 + jdbc: # 使用 JDBC 的 JobStore 的时候,JDBC 的配置 + initialize-schema: NEVER # 是否自动使用 SQL 初始化 Quartz 表结构。这里设置成 never ,我们手动创建表结构。 + +--- #################### 服务保障相关配置 #################### + +# Lock4j 配置项 +lock4j: + acquire-timeout: 3000 # 获取分布式锁超时时间,默认为 3000 毫秒 + expire: 30000 # 分布式锁的超时时间,默认为 30 毫秒 + +# Resilience4j 配置项 +resilience4j: + ratelimiter: + instances: + backendA: + limit-for-period: 1 # 每个周期内,允许的请求数。默认为 50 + limit-refresh-period: 60s # 每个周期的时长,单位:微秒。默认为 500 + timeout-duration: 1s # 被限流时,阻塞等待的时长,单位:微秒。默认为 5s + register-health-indicator: true # 是否注册到健康监测 + +--- #################### 监控相关配置 #################### + +# Actuator 监控端点的配置项 +management: + endpoint: + health: + show-details: ALWAYS + endpoints: + enable-by-default: true + web: + base-path: /actuator # Actuator 提供的 API 接口的根目录。默认为 /actuator + exposure: + include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。 + +# Spring Boot Admin 配置项 +spring: + boot: + admin: + # Spring Boot Admin Client 客户端的相关配置 + client: + url: http://127.0.0.1:${server.port}/${spring.boot.admin.context-path} # 设置 Spring Boot Admin Server 地址 + instance: + service-host-type: IP # 注册实例时,优先使用 IP [IP, HOST_NAME, CANONICAL_HOST_NAME] + # Spring Boot Admin Server 服务端的相关配置 + context-path: /admin # 配置 Spring + +# 日志文件配置 +logging: + file: + path: logs + level: + com.win: warn + org.springframework: warn + +--- #################### 闻荫相关配置 #################### + +# 闻荫配置项,设置当前项目所有自定义的配置 +win: + xss: + enable: false + exclude-urls: # 如下两个 url,仅仅是为了演示,去掉配置也没关系 + - ${spring.boot.admin.context-path}/** # 不处理 Spring Boot Admin 的请求 + - ${management.endpoints.web.base-path}/** # 不处理 Actuator 的请求 + demo: false # 开启演示模式 + security: + mock-enable: false # 是否开启 Token 的模拟机制 + mock-secret: test # Token 模拟机制的 Token 前缀 \ No newline at end of file diff --git a/win-server/src/main/resources/application-test.yaml b/win-server/src/main/resources/application-test.yaml new file mode 100644 index 0000000..485af7d --- /dev/null +++ b/win-server/src/main/resources/application-test.yaml @@ -0,0 +1,181 @@ +server: + port: 25110 + +--- #################### 数据库相关配置 #################### + +spring: + # 数据源配置项 + autoconfigure: + exclude: + - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure # 排除 Druid 的自动配置,使用 dynamic-datasource-spring-boot-starter 配置多数据源 + - org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration # 排除积木报表带来的 MongoDB 的自动配置 + shardingsphere: + mode: + type: Memory + # 属性配置 + props: + sql.show: true + ## 数据源配置 + datasource: + names: master,slave0,slave1 + # 主数据源 + master: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://dev.ccwin-in.com:23113/sfms?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: learun + password: Microdoft@2021 + # 读数据源 + slave0: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://dev.ccwin-in.com:23113/sfms?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: learun + password: Microdoft@2021 + # 读数据源 + slave1: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://dev.ccwin-in.com:23113/sfms?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: learun + password: Microdoft@2021 + # 读写分离类型,如: Static,Dynamic + rules: + readwrite-splitting: + data-sources: + myds: + type: Static + props: + write-data-source-name: master + read-data-source-names: slave0,slave1 + load-balancer-name: alg_round + load-balancers: + alg_round: + type: ROUND_ROBIN + sharding: + # 表策略配置 + tables: + # t_user 是逻辑表 + infra_trends: + # 配置数据节点,这里是按月分表 + actualDataNodes: master.infra_trends_$->{2023}${(10..12).collect{t->t.toString().padLeft(2,'0')}},master.infra_trends_$->{2024..2030}${(1..12).collect{t->t.toString().padLeft(2,'0')}} + tableStrategy: + # 使用标准分片策略 + standard: + # 配置分片字段 + shardingColumn: create_time + # 分片算法名称,不支持大写字母和下划线,否则启动就会报错 + shardingAlgorithmName: time-sharding-altorithm + datasource: + dynamic: + strict: true + primary: master + datasource: + master: + type: ${spring.shardingsphere.datasource.master.type} + driver-class-name: ${spring.shardingsphere.datasource.master.driverClassName} + url: ${spring.shardingsphere.datasource.master.url} + username: ${spring.shardingsphere.datasource.master.username} + password: ${spring.shardingsphere.datasource.master.password} + + # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 + redis: + host: dev.ccwin-in.com # 地址 + port: 23114 # 端口 + database: 6 # 数据库索引 +# password: dev # 密码,建议生产环境开启 + +--- #################### 定时任务相关配置 #################### + +# Quartz 配置项,对应 QuartzProperties 配置类 +spring: + quartz: + auto-startup: true # 测试环境,需要开启 Job + scheduler-name: schedulerName # Scheduler 名字。默认为 schedulerName + job-store-type: jdbc # Job 存储器类型。默认为 memory 表示内存,可选 jdbc 使用数据库。 + wait-for-jobs-to-complete-on-shutdown: true # 应用关闭时,是否等待定时任务执行完成。默认为 false ,建议设置为 true + properties: # 添加 Quartz Scheduler 附加属性,更多可以看 http://www.quartz-scheduler.org/documentation/2.4.0-SNAPSHOT/configuration.html 文档 + org: + quartz: + # Scheduler 相关配置 + scheduler: + instanceName: schedulerName + instanceId: AUTO # 自动生成 instance ID + # JobStore 相关配置 + jobStore: + # JobStore 实现类。可见博客:https://blog.csdn.net/weixin_42458219/article/details/122247162 + class: org.springframework.scheduling.quartz.LocalDataSourceJobStore + isClustered: true # 是集群模式 + clusterCheckinInterval: 15000 # 集群检查频率,单位:毫秒。默认为 15000,即 15 秒 + misfireThreshold: 60000 # misfire 阀值,单位:毫秒。 + # 线程池相关配置 + threadPool: + threadCount: 25 # 线程池大小。默认为 10 。 + threadPriority: 5 # 线程优先级 + class: org.quartz.simpl.SimpleThreadPool # 线程池类型 + jdbc: # 使用 JDBC 的 JobStore 的时候,JDBC 的配置 + initialize-schema: NEVER # 是否自动使用 SQL 初始化 Quartz 表结构。这里设置成 never ,我们手动创建表结构。 + +--- #################### 服务保障相关配置 #################### + +# Lock4j 配置项 +lock4j: + acquire-timeout: 3000 # 获取分布式锁超时时间,默认为 3000 毫秒 + expire: 30000 # 分布式锁的超时时间,默认为 30 毫秒 + +# Resilience4j 配置项 +resilience4j: + ratelimiter: + instances: + backendA: + limit-for-period: 1 # 每个周期内,允许的请求数。默认为 50 + limit-refresh-period: 60s # 每个周期的时长,单位:微秒。默认为 500 + timeout-duration: 1s # 被限流时,阻塞等待的时长,单位:微秒。默认为 5s + register-health-indicator: true # 是否注册到健康监测 + +--- #################### 监控相关配置 #################### + +# Actuator 监控端点的配置项 +management: + endpoint: + health: + show-details: ALWAYS + endpoints: + enable-by-default: true + web: + base-path: /actuator # Actuator 提供的 API 接口的根目录。默认为 /actuator + exposure: + include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。 + +# Spring Boot Admin 配置项 +spring: + boot: + admin: + # Spring Boot Admin Client 客户端的相关配置 + client: + url: http://127.0.0.1:${server.port}/${spring.boot.admin.context-path} # 设置 Spring Boot Admin Server 地址 + instance: + service-host-type: IP # 注册实例时,优先使用 IP [IP, HOST_NAME, CANONICAL_HOST_NAME] + # Spring Boot Admin Server 服务端的相关配置 + context-path: /admin # 配置 Spring + +# 日志文件配置 +logging: + file: + path: logs + level: + com.win: info + org.springframework: warn + +--- #################### 闻荫相关配置 #################### +# 闻荫配置项,设置当前项目所有自定义的配置 +win: + xss: + enable: false + exclude-urls: # 如下两个 url,仅仅是为了演示,去掉配置也没关系 + - ${spring.boot.admin.context-path}/** # 不处理 Spring Boot Admin 的请求 + - ${management.endpoints.web.base-path}/** # 不处理 Actuator 的请求 + demo: false # 开启演示模式 + security: + mock-enable: false # 是否开启 Token 的模拟机制 + mock-secret: test # Token 模拟机制的 Token 前缀 \ No newline at end of file diff --git a/win-server/src/main/resources/application.yaml b/win-server/src/main/resources/application.yaml new file mode 100644 index 0000000..d89f0b2 --- /dev/null +++ b/win-server/src/main/resources/application.yaml @@ -0,0 +1,261 @@ +spring: + application: + name: win-server + # i18 message 配置,对应 MessageSourceProperties 配置类 + messages: + basename: i18n/bpm,i18n/infra,i18n/mes,i18n/report,i18n/scp,i18n/system,i18n/wms # 文件路径基础名 + encoding: UTF-8 + + profiles: + include: druid + active: dev + + main: + allow-circular-references: true # 允许循环依赖,因为项目是三层架构,无法避免这个情况。 + allow-bean-definition-overriding: true + # Servlet 配置 + servlet: + # 文件上传相关配置项 + multipart: + max-file-size: 16MB # 单个文件大小 + max-request-size: 32MB # 设置总上传的文件大小 + mvc: + pathmatch: + matching-strategy: ANT_PATH_MATCHER # 解决 SpringFox 与 SpringBoot 2.6.x 不兼容的问题,参见 SpringFoxHandlerProviderBeanPostProcessor 类 +# throw-exception-if-no-handler-found: true # 404 错误时抛出异常,方便统一处理 +# static-path-pattern: /static/** # 静态资源路径; 注意:如果不配置,则 throw-exception-if-no-handler-found 不生效!!! TODO 芋艿:不能配置,会导致 swagger 不生效 + + # Jackson 配置项 + jackson: + serialization: + write-dates-as-timestamps: true # 设置 Date 的格式,使用时间戳 + write-date-timestamps-as-nanoseconds: false # 设置不使用 nanoseconds 的格式。例如说 1611460870.401,而是直接 1611460870401 + write-durations-as-timestamps: true # 设置 Duration 的格式,使用时间戳 + fail-on-empty-beans: false # 允许序列化无属性的 Bean + + # Cache 配置项 + cache: + type: REDIS + redis: + time-to-live: 1h # 设置过期时间为 1 小时 + +--- #################### 接口文档配置 #################### + +springdoc: + api-docs: + enabled: true + path: /v3/api-docs + swagger-ui: + enabled: true + path: /swagger-ui + default-flat-param-object: true # 参见 https://doc.xiaominfo.com/docs/faq/v4/knife4j-parameterobject-flat-param 文档 + +knife4j: + enable: true + setting: + language: zh_cn + +# 工作流 Flowable 配置 +flowable: + # 1. false: 默认值,Flowable 启动时,对比数据库表中保存的版本,如果不匹配。将抛出异常 + # 2. true: 启动时会对数据库中所有表进行更新操作,如果表存在,不做处理,反之,自动创建表 + # 3. create_drop: 启动时自动创建表,关闭时自动删除表 + # 4. drop_create: 启动时,删除旧表,再创建新表 + database-schema-update: false # 设置为 false,可通过 https://github.com/flowable/flowable-sql 初始化 + db-history-used: true # flowable6 默认 true 生成信息表,无需手动设置 + check-process-definitions: false # 设置为 false,禁用 /resources/processes 自动部署 BPMN XML 流程 + history-level: full # full:保存历史数据的最高级别,可保存全部流程相关细节,包括流程流转各节点参数 + +# MyBatis Plus 的配置项 +mybatis-plus: + configuration: + map-underscore-to-camel-case: true # 虽然默认为 true ,但是还是显示去指定下。 + logImpl: org.apache.ibatis.logging.slf4j.Slf4jImpl + # 开启缓存 + cache-enabled: true + global-config: + db-config: + id-type: NONE # “智能”模式,基于 IdTypeEnvironmentPostProcessor + 数据源的类型,自动适配成 AUTO、INPUT 模式。 +# id-type: AUTO # 自增 ID,适合 MySQL 等直接自增的数据库 +# id-type: INPUT # 用户输入 ID,适合 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库 +# id-type: ASSIGN_ID # 分配 ID,默认使用雪花算法。注意,Oracle、PostgreSQL、Kingbase、DB2、H2 数据库时,需要去除实体类上的 @KeySequence 注解 + logic-delete-value: 1 # 逻辑已删除值(默认为 1) + logic-not-delete-value: 0 # 逻辑未删除值(默认为 0) + banner: false # 关闭控制台的 Banner 打印 + type-aliases-package: ${win.info.base-package}.module.*.dal.dataobject + encryptor: + password: XDV71a+xqStEA3WH # 加解密的秘钥,可使用 https://www.imaegoo.com/2020/aes-key-generator/ 网站生成 + +mybatis-plus-join: + banner: false # 关闭控制台的 Banner 打印 + +# Spring Data Redis 配置 +spring: + data: + redis: + repositories: + enabled: false # 项目未使用到 Spring Data Redis 的 Repository,所以直接禁用,保证启动速度 + +--- #################### 闻荫相关配置 #################### +win: + info: + version: 1.0.0 + base-package: com.win + web: + admin-ui: + url: http://dev.ccwin-in.com:25100/ # Admin 管理后台 UI 的地址 + profile: /opt/profile/ + websocket: + enable: true # websocket的开关 + path: /websocket/message # 路径 + maxOnlineCount: 0 # 最大连接人数 + sessionMap: true # 保存sessionMap + swagger: + title: 闻荫快速开发平台 + description: 提供管理后台、用户 App 的所有功能 + version: ${win.info.version} + url: ${win.web.admin-ui.url} + email: xingyu4j@vip.qq.com + license: MIT + license-url: https://gitee.com/zhijiantianya/ruoyi-vue-pro/blob/master/LICENSE + captcha: + enable: true # 验证码的开关,默认为 true + captchaType: math # 验证码类型 math 数组计算 char 字符验证 + captchaExpiration: 2 # 验证码有效期分众 + codegen: + base-package: ${win.info.base-package} + db-schemas: ${spring.datasource.dynamic.datasource.master.name} + front-type: 10 # 前端模版的类型,参见 CodegenFrontTypeEnum 枚举类 + error-code: # 错误码相关配置项 + constants-class-list: + - com.win.module.bpm.enums.ErrorCodeConstants + - com.win.module.infra.enums.ErrorCodeConstants + - com.win.module.system.enums.ErrorCodeConstants + - com.win.module.system.wms.ErrorCodeConstants + - com.win.module.system.scp.ErrorCodeConstants + - com.win.module.system.mes.ErrorCodeConstants + mq: + redis: + pubsub: + enable: false # 是否开启 Redis pubsub 广播消费,默认为 true。这里设置成 false,可以按需开启 + stream: + enable: false # 是否开启 Redis stream 集群消费,默认为 true。这里设置成 false,可以按需开启 + tenant: # 多租户相关配置项 + enable: true + ignore-urls: + - /admin-api/system/tenant/get-id-by-name # 基于名字获取租户,不许带租户编号 + - /admin-api/system/captcha/captchaImage # 校验图片验证码,和租户无关 + - /admin-api/infra/file/*/get/** # 获取图片,和租户无关 + - /magic/web/* # magic-api 和租户无关 + - /magic-api/* # magic-api 和租户无关 + ignore-tables: + - system_tenant + - system_tenant_package + - system_dict_data + - system_dict_type + - system_error_code + - system_menu + - system_sms_channel + - system_sms_template + - system_sms_log + - system_sensitive_word + - system_oauth2_client + - system_mail_account + - system_mail_template + - system_mail_log + - system_notify_template + - infra_codegen_column + - infra_codegen_table + - infra_test_demo + - infra_config + - infra_file_config + - infra_file + - infra_file_content + - infra_job + - infra_job_log + - infra_job_log + - infra_data_source_config + - jimu_dict + - jimu_dict_item + - jimu_report + - jimu_report_data_source + - jimu_report_db + - jimu_report_db_field + - jimu_report_db_param + - jimu_report_link + - jimu_report_map + - jimu_report_share + - rep_demo_dxtj + - rep_demo_employee + - rep_demo_gongsi + - rep_demo_jianpiao + - tmp_report_data_1 + - tmp_report_data_income + - tmp_report_data_income + - system_serial_number + sms-code: # 短信验证码相关的配置项 + expire-times: 10m + send-frequency: 1m + send-maximum-quantity-per-day: 10 + begin-code: 9999 # 这里配置 9999 的原因是,测试方便。 + end-code: 9999 # 这里配置 9999 的原因是,测试方便。 + security: + permit-all-urls: # 排除权限校验url + - /admin-ui/** # /resources/admin-ui 目录下的静态资源 + +debug: false + +#积木报表配置 +minidao : + base-package: org.jeecg.modules.jmreport.desreport.dao* + db-type: mysql + +# magic-api配置 +magic-api: + #配置web页面入口 + web: /magic/web + resource: #配置存储方式 + type: database # 配置存储在数据库中 + tableName: magic_api_file # 数据库中的表名 + # datasource: master #指定数据源(单数据源时无需配置,多数据源时默认使用主数据源,如果存在其他数据源中需要指定。) + prefix: /magic-api # key前缀 + readonly: false # 是否是只读模式 + # security: # 安全配置 + # username: admin # 登录用的用户名 + # password: 123456 # 登录用的密码 + prefix: /magic-api + editor-config: classpath:./magic-editor-config.js #编辑器配置 + date-pattern: # 配置请求参数支持的日期格式 + - yyyy-MM-dd + - yyyy-MM-dd HH:mm:ss + - yyyyMMddHHmmss + - yyyyMMdd + response: |- #配置JSON格式,格式为magic-script中的表达式 + { + code: code, + msg: message, + data, + timestamp, + requestTime, + executeTime, + } + response-code: + success: 0 #执行成功的code值 + invalid: 10400 #参数验证未通过的code值 + exception: 10500 #执行出现异常的code值 + backup: #备份相关配置 + enable: true #是否启用 + max-history: -1 #备份保留天数,-1为永久保留 + table-name: magic_api_backup #使用数据库存储备份时的表名 + crud: # CRUD相关配置 + logic-delete-column: delete_mark #逻辑删除列 + logic-delete-value: 1 #逻辑删除值 + page: + size: size # 页大小的参数名称 + page: limit # 页码的参数名称 + default-page: 1 # 未传页码时的默认首页 + default-size: 10 # 未传页大小时的默认页大小 + debug: + timeout: 60 # 断点超时时间,默认60s + throw-exception: true # 执行出错时,异常将抛出处理 + auto-import-module: db,http,log,request,response,env,magic #自动导入模块 \ No newline at end of file diff --git a/win-server/src/main/resources/logback-spring.xml b/win-server/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..ebc0d29 --- /dev/null +++ b/win-server/src/main/resources/logback-spring.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + debug + + + ${CONSOLE_LOG_PATTERN} + + UTF-8 + + + + + + ${log.path}/sys-info.log + + + + ${log.path}/sys-info.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + INFO + + ACCEPT + + DENY + + + + + ${log.path}/sys-error.log + + + + ${log.path}/sys-error.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + ERROR + + ACCEPT + + DENY + + + + + + ${log.path}/sys-user.log + + + ${log.path}/sys-user.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/win-server/src/main/resources/magic-editor-config.js b/win-server/src/main/resources/magic-editor-config.js new file mode 100644 index 0000000..5346abf --- /dev/null +++ b/win-server/src/main/resources/magic-editor-config.js @@ -0,0 +1,22 @@ +var MAGIC_EDITOR_CONFIG = { + title: 'Learun Admin Web IDE', + header: { + skin: true, // 屏蔽皮肤按钮 + document: false, // 屏蔽文档按钮 + repo: false, // 屏蔽gitee和github + qqGroup: false // 屏蔽加入QQ群 + }, + // 其它配置参考本页中其它配置项 + request: { + beforeSend: function (config) { + console.log('请求设置', localStorage["ACCESS_TOKEN"]); + config.headers.Authorization = "Bearer " + "9f953a2e801245d081a08353c79d2c27"; + config.headers['Tenant-Id'] = "1"; + return config; + }, + onError: function (err) { + // console.log('请求出错'); + return Promise.reject(err) + } + }, +} \ No newline at end of file diff --git a/win-server/src/test/java/com/win/ProjectReactor.java b/win-server/src/test/java/com/win/ProjectReactor.java new file mode 100644 index 0000000..19c9c8d --- /dev/null +++ b/win-server/src/test/java/com/win/ProjectReactor.java @@ -0,0 +1,146 @@ +package com.win; + +import cn.hutool.core.io.FileTypeUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.util.collection.SetUtils; +import lombok.extern.slf4j.Slf4j; + +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.util.Collection; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.stream.Collectors; + +import static java.io.File.separator; + +/** + * 项目修改器,一键替换 Maven 的 groupId、artifactId,项目的 package 等 + *

+ * 通过修改 groupIdNew、artifactIdNew、projectBaseDirNew 三个变量 + * + * @author 闻荫源码 + */ +@Slf4j +public class ProjectReactor { + + private static final String GROUP_ID = "com.win"; + private static final String ARTIFACT_ID = "win"; + private static final String PACKAGE_NAME = "com.win"; + private static final String TITLE = "闻荫管理系统"; + + /** + * 白名单文件,不进行重写,避免出问题 + */ + private static final Set WHITE_FILE_TYPES = SetUtils.asSet("gif", "jpg", "svg", "png", // 图片 + "eot", "woff2", "ttf", "woff"); // 字体 + + public static void main(String[] args) { + long start = System.currentTimeMillis(); + String projectBaseDir = getProjectBaseDir(); + log.info("[main][原项目路劲改地址 ({})]", projectBaseDir); + + // ========== 配置,需要你手动修改 ========== + String groupIdNew = "com.win"; + String artifactIdNew = "win"; + String packageNameNew = "com.win"; + String titleNew = "闻荫管理系统"; + String projectBaseDirNew = projectBaseDir + "-new"; // 一键改名后,“新”项目所在的目录 + log.info("[main][检测新项目目录 ({})是否存在]", projectBaseDirNew); + if (FileUtil.exist(projectBaseDirNew)) { + log.error("[main][新项目目录检测 ({})已存在,请更改新的目录!程序退出]", projectBaseDirNew); + return; + } + // 如果新目录中存在 PACKAGE_NAME,ARTIFACT_ID 等关键字,路径会被替换,导致生成的文件不在预期目录 + if (StrUtil.containsAny(projectBaseDirNew, PACKAGE_NAME, ARTIFACT_ID, StrUtil.upperFirst(ARTIFACT_ID))) { + log.error("[main][新项目目录 `projectBaseDirNew` 检测 ({}) 存在冲突名称「{}」或者「{}」,请更改新的目录!程序退出]", + projectBaseDirNew, PACKAGE_NAME, ARTIFACT_ID); + return; + } + log.info("[main][完成新项目目录检测,新项目路径地址 ({})]", projectBaseDirNew); + // 获得需要复制的文件 + log.info("[main][开始获得需要重写的文件,预计需要 10-20 秒]"); + Collection files = listFiles(projectBaseDir); + log.info("[main][需要重写的文件数量:{},预计需要 15-30 秒]", files.size()); + // 写入文件 + files.forEach(file -> { + // 如果是白名单的文件类型,不进行重写,直接拷贝 + String fileType = getFileType(file); + if (WHITE_FILE_TYPES.contains(fileType)) { + copyFile(file, projectBaseDir, projectBaseDirNew, packageNameNew, artifactIdNew); + return; + } + // 如果非白名单的文件类型,重写内容,在生成文件 + String content = replaceFileContent(file, groupIdNew, artifactIdNew, packageNameNew, titleNew); + writeFile(file, content, projectBaseDir, projectBaseDirNew, packageNameNew, artifactIdNew); + }); + log.info("[main][重写完成]共耗时:{} 秒", (System.currentTimeMillis() - start) / 1000); + } + + private static String getProjectBaseDir() { + String baseDir = System.getProperty("user.dir"); + if (StrUtil.isEmpty(baseDir)) { + throw new NullPointerException("项目基础路径不存在"); + } + return baseDir; + } + + private static Collection listFiles(String projectBaseDir) { + Collection files = FileUtil.loopFiles(projectBaseDir); + // 移除 IDEA、Git 自身的文件、Node 编译出来的文件 + files = files.stream() + .filter(file -> !file.getPath().contains(separator + "target" + separator) + && !file.getPath().contains(separator + "node_modules" + separator) + && !file.getPath().contains(separator + ".idea" + separator) + && !file.getPath().contains(separator + ".git" + separator) + && !file.getPath().contains(separator + "dist" + separator) + && !file.getPath().contains(".iml") + && !file.getPath().contains(".html.gz")) + .collect(Collectors.toList()); + return files; + } + + private static String replaceFileContent(File file, String groupIdNew, + String artifactIdNew, String packageNameNew, + String titleNew) { + String content = FileUtil.readString(file, StandardCharsets.UTF_8); + // 如果是白名单的文件类型,不进行重写 + String fileType = getFileType(file); + if (WHITE_FILE_TYPES.contains(fileType)) { + return content; + } + // 执行文件内容都重写 + return content.replaceAll(GROUP_ID, groupIdNew) + .replaceAll(PACKAGE_NAME, packageNameNew) + .replaceAll(ARTIFACT_ID, artifactIdNew) // 必须放在最后替换,因为 ARTIFACT_ID 太短! + .replaceAll(StrUtil.upperFirst(ARTIFACT_ID), StrUtil.upperFirst(artifactIdNew)) + .replaceAll(TITLE, titleNew); + } + + private static void writeFile(File file, String fileContent, String projectBaseDir, + String projectBaseDirNew, String packageNameNew, String artifactIdNew) { + String newPath = buildNewFilePath(file, projectBaseDir, projectBaseDirNew, packageNameNew, artifactIdNew); + FileUtil.writeUtf8String(fileContent, newPath); + } + + private static void copyFile(File file, String projectBaseDir, + String projectBaseDirNew, String packageNameNew, String artifactIdNew) { + String newPath = buildNewFilePath(file, projectBaseDir, projectBaseDirNew, packageNameNew, artifactIdNew); + FileUtil.copyFile(file, new File(newPath)); + } + + private static String buildNewFilePath(File file, String projectBaseDir, + String projectBaseDirNew, String packageNameNew, String artifactIdNew) { + return file.getPath().replace(projectBaseDir, projectBaseDirNew) // 新目录 + .replace(PACKAGE_NAME.replaceAll("\\.", Matcher.quoteReplacement(separator)), + packageNameNew.replaceAll("\\.", Matcher.quoteReplacement(separator))) + .replace(ARTIFACT_ID, artifactIdNew) // + .replaceAll(StrUtil.upperFirst(ARTIFACT_ID), StrUtil.upperFirst(artifactIdNew)); + } + + private static String getFileType(File file) { + return file.length() > 0 ? FileTypeUtil.getType(file) : ""; + } + +}