From 80cb2bdbc257a4490feb159b83377012733cc83b Mon Sep 17 00:00:00 2001 From: "daikun1@bosssoft.com.cn" Date: Thu, 2 Nov 2023 16:03:51 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E5=B7=A5=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitattributes | 1 + .gitignore | 53 + Docker-HOWTO.md | 49 + Jenkinsfile | 60 + LICENSE | 20 + README.md | 340 + docker-compose.yml | 84 + docker.env | 25 + http-client.env.json | 20 + lombok.config | 4 + pom.xml | 141 + sql/db2/README.md | 3 + sql/dm/README.md | 3 + sql/dm/ruoyi-vue-pro-dm8.sql | 5798 ++++++++ sql/mysql/brokerage.sql | 221 + sql/mysql/go-view.sql | 47 + sql/mysql/jimureport.mysql5.7.create.sql | 1635 ++ sql/mysql/optional/mall_trade_log.sql | 3 + sql/mysql/pay_wallet.sql | 43 + sql/mysql/ruoyi-vue-pro.sql | 3049 ++++ sql/oracle/ruoyi-vue-pro.sql | 6231 ++++++++ sql/postgresql/ruoyi-vue-pro.sql | 8358 +++++++++++ sql/sqlserver/ruoyi-vue-pro.sql | 12399 ++++++++++++++++ win-dependencies/pom.xml | 673 + win-framework/pom.xml | 51 + win-framework/win-common/pom.xml | 144 + .../common/core/IntArrayValuable.java | 15 + .../win/framework/common/core/KeyValue.java | 20 + .../common/enums/CommonStatusEnum.java | 56 + .../framework/common/enums/DocumentEnum.java | 21 + .../common/enums/WebFilterOrderEnum.java | 34 + .../framework/common/exception/ErrorCode.java | 32 + .../common/exception/ServerException.java | 60 + .../common/exception/ServiceException.java | 60 + .../enums/GlobalErrorCodeConstants.java | 40 + .../enums/ServiceErrorCodeRange.java | 43 + .../exception/util/ServiceExceptionUtil.java | 128 + .../framework/common/pojo/CommonResult.java | 112 + .../common/pojo/CustomConditions.java | 32 + .../win/framework/common/pojo/PageParam.java | 64 + .../win/framework/common/pojo/PageResult.java | 41 + .../common/util/cache/CacheUtils.java | 25 + .../common/util/collection/ArrayUtils.java | 58 + .../util/collection/CollectionUtils.java | 247 + .../common/util/collection/MapUtils.java | 66 + .../common/util/collection/SetUtils.java | 19 + .../framework/common/util/date/DateUtils.java | 180 + .../common/util/date/LocalDateTimeUtils.java | 80 + .../framework/common/util/http/HttpUtils.java | 126 + .../common/util/i18n/MessageUtil.java | 26 + .../framework/common/util/io/FileUtils.java | 84 + .../win/framework/common/util/io/IoUtils.java | 28 + .../framework/common/util/json/JsonUtils.java | 157 + .../common/util/monitor/TracerUtils.java | 30 + .../common/util/number/MoneyUtils.java | 50 + .../common/util/number/NumberUtils.java | 16 + .../common/util/object/ObjectUtils.java | 63 + .../common/util/object/PageUtils.java | 16 + .../common/util/servlet/ServletUtils.java | 110 + .../common/util/spring/SpringAopUtils.java | 46 + .../util/spring/SpringExpressionUtils.java | 133 + .../common/util/string/StrUtils.java | 53 + .../util/validation/ValidationUtils.java | 55 + .../framework/common/validation/InEnum.java | 35 + .../validation/InEnumCollectionValidator.java | 42 + .../common/validation/InEnumValidator.java | 44 + .../framework/common/validation/Mobile.java | 28 + .../common/validation/MobileValidator.java | 25 + .../common/validation/package-info.java | 4 + .../win-spring-boot-starter-banner/pom.xml | 30 + .../config/WinBannerAutoConfiguration.java | 20 + .../banner/core/BannerApplicationRunner.java | 41 + .../win/framework/banner/package-info.java | 6 + ...ot.autoconfigure.AutoConfiguration.imports | 1 + .../src/main/resources/banner.txt | 17 + .../pom.xml | 52 + .../WinDataPermissionAutoConfiguration.java | 44 + ...inDeptDataPermissionAutoConfiguration.java | 34 + .../core/annotation/DataPermission.java | 35 + .../aop/DataPermissionAnnotationAdvisor.java | 36 + .../DataPermissionAnnotationInterceptor.java | 72 + .../core/aop/DataPermissionContextHolder.java | 72 + .../db/DataPermissionDatabaseInterceptor.java | 641 + .../core/rule/DataPermissionRule.java | 36 + .../core/rule/DataPermissionRuleFactory.java | 28 + .../rule/DataPermissionRuleFactoryImpl.java | 62 + .../rule/dept/DeptDataPermissionRule.java | 199 + .../DeptDataPermissionRuleCustomizer.java | 20 + .../core/rule/dept/package-info.java | 6 + .../core/util/DataPermissionUtils.java | 43 + .../datapermission/package-info.java | 4 + ...ot.autoconfigure.AutoConfiguration.imports | 2 + .../win-spring-boot-starter-biz-dict/pom.xml | 50 + .../dict/config/WinDictAutoConfiguration.java | 18 + .../win/framework/dict/core/package-info.java | 4 + .../dict/core/util/DictFrameworkUtils.java | 94 + .../com/win/framework/dict/package-info.java | 6 + ...ot.autoconfigure.AutoConfiguration.imports | 1 + .../pom.xml | 49 + .../errorcode/config/ErrorCodeProperties.java | 30 + .../config/WinErrorCodeConfiguration.java | 39 + .../generator/ErrorCodeAutoGenerator.java | 15 + .../generator/ErrorCodeAutoGeneratorImpl.java | 104 + .../core/loader/ErrorCodeLoader.java | 24 + .../core/loader/ErrorCodeLoaderImpl.java | 73 + .../win/framework/errorcode/package-info.java | 10 + ...ot.autoconfigure.AutoConfiguration.imports | 1 + .../win-spring-boot-starter-biz-ip/pom.xml | 54 + .../java/com/win/framework/ip/core/Area.java | 55 + .../framework/ip/core/enums/AreaTypeEnum.java | 39 + .../framework/ip/core/utils/AreaUtils.java | 119 + .../win/framework/ip/core/utils/IPUtils.java | 87 + .../com/win/framework/ip/package-info.java | 11 + .../src/main/resources/area.csv | 3608 +++++ .../src/main/resources/ip2region.xdb | Bin 0 -> 6428681 bytes .../pom.xml | 51 + .../WinOperateLogAutoConfiguration.java | 23 + .../core/annotations/OperateLog.java | 57 + .../operatelog/core/aop/OperateLogAspect.java | 367 + .../core/enums/OperateTypeEnum.java | 55 + .../operatelog/core/package-info.java | 1 + .../operatelog/core/service/OperateLog.java | 106 + .../service/OperateLogFrameworkService.java | 17 + .../OperateLogFrameworkServiceImpl.java | 28 + .../operatelog/core/util/OperateLogUtils.java | 21 + .../framework/operatelog/package-info.java | 6 + ...ot.autoconfigure.AutoConfiguration.imports | 1 + .../win-spring-boot-starter-biz-sms/pom.xml | 82 + .../sms/config/WinSmsAutoConfiguration.java | 21 + .../framework/sms/core/client/SmsClient.java | 54 + .../sms/core/client/SmsClientFactory.java | 36 + .../sms/core/client/SmsCodeMapping.java | 17 + .../sms/core/client/SmsCommonResult.java | 68 + .../core/client/dto/SmsReceiveRespDTO.java | 48 + .../sms/core/client/dto/SmsSendRespDTO.java | 18 + .../core/client/dto/SmsTemplateRespDTO.java | 33 + .../core/client/impl/AbstractSmsClient.java | 127 + .../client/impl/SmsClientFactoryImpl.java | 90 + .../client/impl/aliyun/AliyunSmsClient.java | 212 + .../impl/aliyun/AliyunSmsCodeMapping.java | 42 + .../impl/debug/DebugDingTalkCodeMapping.java | 22 + .../impl/debug/DebugDingTalkSmsClient.java | 96 + .../tencent/TencentSmsChannelProperties.java | 41 + .../client/impl/tencent/TencentSmsClient.java | 302 + .../impl/tencent/TencentSmsCodeMapping.java | 50 + .../sms/core/enums/SmsChannelEnum.java | 36 + .../enums/SmsFrameworkErrorCodeConstants.java | 50 + .../enums/SmsTemplateAuditStatusEnum.java | 21 + .../core/property/SmsChannelProperties.java | 52 + ...ot.autoconfigure.AutoConfiguration.imports | 1 + .../pom.xml | 67 + .../tenant/config/TenantProperties.java | 42 + .../config/WinTenantAutoConfiguration.java | 117 + .../tenant/core/aop/TenantIgnore.java | 18 + .../tenant/core/aop/TenantIgnoreAspect.java | 35 + .../core/context/TenantContextHolder.java | 68 + .../tenant/core/db/TenantBaseDO.java | 21 + .../core/db/TenantDatabaseInterceptor.java | 43 + .../framework/tenant/core/job/TenantJob.java | 14 + .../tenant/core/job/TenantJobAspect.java | 56 + .../mq/TenantRedisMessageInterceptor.java | 42 + .../core/redis/TenantRedisCacheManager.java | 38 + .../security/TenantSecurityWebFilter.java | 117 + .../core/service/TenantFrameworkService.java | 26 + .../service/TenantFrameworkServiceImpl.java | 73 + .../tenant/core/util/TenantUtils.java | 93 + .../core/web/TenantContextWebFilter.java | 37 + .../win/framework/tenant/package-info.java | 17 + ...ot.autoconfigure.AutoConfiguration.imports | 1 + .../win-spring-boot-starter-captcha/pom.xml | 40 + .../captcha/config/CaptchaProperties.java | 24 + .../captcha/config/KaptchaTextCreator.java | 56 + .../config/WinCaptchaConfiguration.java | 77 + .../enums/CaptchaRedisKeyConstants.java | 15 + .../win/framework/captcha/package-info.java | 7 + ...ot.autoconfigure.AutoConfiguration.imports | 2 + .../pom.xml | 38 + .../core/base/annotation/DesensitizeBy.java | 32 + .../base/handler/DesensitizationHandler.java | 21 + .../StringDesensitizeSerializer.java | 92 + .../desensitize/core/package-info.java | 4 + .../regex/annotation/EmailDesensitize.java | 36 + .../regex/annotation/RegexDesensitize.java | 38 + .../AbstractRegexDesensitizationHandler.java | 38 + .../DefaultRegexDesensitizationHandler.java | 21 + .../handler/EmailDesensitizationHandler.java | 22 + .../annotation/BankCardDesensitize.java | 40 + .../annotation/CarLicenseDesensitize.java | 40 + .../annotation/ChineseNameDesensitize.java | 40 + .../annotation/FixedPhoneDesensitize.java | 40 + .../slider/annotation/IdCardDesensitize.java | 40 + .../slider/annotation/MobileDesensitize.java | 40 + .../annotation/PasswordDesensitize.java | 42 + .../slider/annotation/SliderDesensitize.java | 43 + .../AbstractSliderDesensitizationHandler.java | 78 + .../handler/BankCardDesensitization.java | 27 + .../handler/CarLicenseDesensitization.java | 25 + .../handler/ChineseNameDesensitization.java | 27 + .../DefaultDesensitizationHandler.java | 25 + .../handler/FixedPhoneDesensitization.java | 25 + .../slider/handler/IdCardDesensitization.java | 25 + .../slider/handler/MobileDesensitization.java | 26 + .../handler/PasswordDesensitization.java | 25 + .../win-spring-boot-starter-excel/pom.xml | 55 + .../excel/core/annotations/DictFormat.java | 22 + .../excel/core/annotations/OnlyOne.java | 15 + .../excel/core/annotations/SubObject.java | 15 + .../core/convert/CommonStatusConverter.java | 34 + .../excel/core/convert/DictConvert.java | 72 + .../excel/core/convert/JsonConvert.java | 34 + .../excel/core/convert/MoneyConvert.java | 39 + .../core/handler/CustomSheetWriteHandler.java | 52 + .../excel/core/util/ConvertUtil.java | 191 + .../framework/excel/core/util/ExcelUtils.java | 158 + .../com/win/framework/excel/package-info.java | 4 + .../win-spring-boot-starter-file/pom.xml | 83 + .../file/config/WinFileAutoConfiguration.java | 21 + .../file/core/client/AbstractFileClient.java | 69 + .../file/core/client/FileClient.java | 43 + .../file/core/client/FileClientConfig.java | 16 + .../file/core/client/FileClientFactory.java | 22 + .../core/client/FileClientFactoryImpl.java | 56 + .../file/core/client/db/DBFileClient.java | 48 + .../core/client/db/DBFileClientConfig.java | 24 + .../client/db/DBFileContentFrameworkDAO.java | 36 + .../file/core/client/ftp/FtpFileClient.java | 77 + .../core/client/ftp/FtpFileClientConfig.java | 59 + .../core/client/local/LocalFileClient.java | 52 + .../client/local/LocalFileClientConfig.java | 30 + .../file/core/client/s3/S3FileClient.java | 120 + .../core/client/s3/S3FileClientConfig.java | 77 + .../file/core/client/sftp/SftpFileClient.java | 61 + .../client/sftp/SftpFileClientConfig.java | 52 + .../file/core/enums/FileStorageEnum.java | 55 + .../file/core/utils/FileTypeUtils.java | 48 + ...ot.autoconfigure.AutoConfiguration.imports | 1 + .../src/test/resources/file/erweima.jpg | Bin 0 -> 18385 bytes .../win-spring-boot-starter-flowable/pom.xml | 37 + .../config/WinFlowableConfiguration.java | 43 + .../framework/flowable/core/package-info.java | 1 + .../flowable/core/util/FlowableUtils.java | 82 + .../flowable/core/web/FlowableWebFilter.java | 35 + .../win/framework/flowable/package-info.java | 1 + ...ot.autoconfigure.AutoConfiguration.imports | 1 + .../win-spring-boot-starter-job/pom.xml | 41 + .../config/WinAsyncAutoConfiguration.java | 36 + .../config/WinQuartzAutoConfiguration.java | 29 + .../quartz/core/enums/JobDataKeyEnum.java | 14 + .../quartz/core/handler/JobHandler.java | 19 + .../core/handler/JobHandlerInvoker.java | 114 + .../core/scheduler/SchedulerManager.java | 146 + .../core/service/JobLogFrameworkService.java | 44 + .../framework/quartz/core/util/CronUtils.java | 56 + .../win/framework/quartz/package-info.java | 7 + ...ot.autoconfigure.AutoConfiguration.imports | 2 + .../win-spring-boot-starter-monitor/pom.xml | 73 + .../tracer/config/TracerProperties.java | 14 + .../config/WinMetricsAutoConfiguration.java | 27 + .../config/WinTracerAutoConfiguration.java | 55 + .../tracer/core/annotation/BizTrace.java | 42 + .../tracer/core/aop/BizTraceAspect.java | 77 + .../tracer/core/filter/TraceFilter.java | 33 + .../core/util/TracerFrameworkUtils.java | 46 + .../win/framework/tracer/package-info.java | 6 + ...ot.autoconfigure.AutoConfiguration.imports | 2 + .../win-spring-boot-starter-mq/pom.xml | 26 + .../mq/config/WinMQAutoConfiguration.java | 170 + .../framework/mq/core/RedisMQTemplate.java | 87 + .../interceptor/RedisMessageInterceptor.java | 26 + .../mq/core/message/AbstractRedisMessage.java | 29 + .../core/pubsub/AbstractChannelMessage.java | 21 + .../AbstractChannelMessageListener.java | 103 + .../mq/core/stream/AbstractStreamMessage.java | 21 + .../stream/AbstractStreamMessageListener.java | 115 + .../mq/job/RedisPendingMessageResendJob.java | 100 + .../com/win/framework/mq/package-info.java | 6 + ...efaultStreamMessageListenerContainerX.java | 62 + ...ot.autoconfigure.AutoConfiguration.imports | 1 + .../win-spring-boot-starter-mybatis/pom.xml | 78 + .../WinDataSourceAutoConfiguration.java | 114 + .../datasource/core/enums/DataSourceEnum.java | 22 + .../core/filter/DruidAdRemoveFilter.java | 38 + .../enums/ShardingTableCacheEnum.java | 62 + .../sharding/TimeShardingAlgorithm.java | 144 + .../utils/ShardingAlgorithmTool.java | 247 + .../utils/ShardingTablesLoadRunner.java | 24 + .../IdTypeEnvironmentPostProcessor.java | 108 + .../config/WinMybatisAutoConfiguration.java | 63 + .../mybatis/core/dataobject/BaseDO.java | 50 + .../mybatis/core/enums/SqlConstants.java | 21 + .../core/handler/DefaultDBFieldHandler.java | 62 + .../mybatis/core/mapper/BaseMapperX.java | 135 + .../core/query/LambdaQueryWrapperX.java | 135 + .../mybatis/core/query/QueryWrapperX.java | 166 + .../mybatis/core/type/EncryptTypeHandler.java | 75 + .../core/type/IntegerListTypeHandler.java | 56 + .../core/type/JsonLongSetTypeHandler.java | 31 + .../core/type/LongListTypeHandler.java | 57 + .../core/type/StringListTypeHandler.java | 58 + .../mybatis/core/util/JdbcUtils.java | 42 + .../mybatis/core/util/MyBatisUtils.java | 81 + .../mybatis/core/util/QueryWrapperUtils.java | 86 + .../main/resources/META-INF/spring.factories | 3 + ...ot.autoconfigure.AutoConfiguration.imports | 3 + .../pom.xml | 39 + .../config/WinIdempotentConfiguration.java | 40 + .../core/annotation/Idempotent.java | 46 + .../idempotent/core/aop/IdempotentAspect.java | 56 + .../keyresolver/IdempotentKeyResolver.java | 22 + .../impl/DefaultIdempotentKeyResolver.java | 25 + .../impl/ExpressionIdempotentKeyResolver.java | 63 + .../core/redis/IdempotentRedisDAO.java | 36 + .../framework/idempotent/package-info.java | 12 + .../lock4j/config/WinLock4jConfiguration.java | 18 + .../core/DefaultLockFailureStrategy.java | 21 + .../lock4j/core/Lock4jRedisKeyConstants.java | 19 + .../win/framework/lock4j/package-info.java | 4 + .../framework/resilience4j/package-info.java | 9 + ...ot.autoconfigure.AutoConfiguration.imports | 2 + .../win-spring-boot-starter-redis/pom.xml | 41 + .../config/WinCacheAutoConfiguration.java | 76 + .../redis/config/WinCacheProperties.java | 27 + .../config/WinRedisAutoConfiguration.java | 44 + .../redis/core/TimeoutRedisCacheManager.java | 83 + .../win/framework/redis/util/RedisCache.java | 258 + ...ot.autoconfigure.AutoConfiguration.imports | 3 + .../win-spring-boot-starter-security/pom.xml | 61 + .../config/AuthorizeRequestsCustomizer.java | 32 + .../security/config/SecurityProperties.java | 44 + .../config/WinSecurityAutoConfiguration.java | 102 + .../WinWebSecurityConfigurerAdapter.java | 184 + .../framework/security/core/LoginUser.java | 52 + .../core/annotations/PreAuthenticated.java | 17 + .../core/aop/PreAuthenticatedAspect.java | 25 + ...eadLocalSecurityContextHolderStrategy.java | 48 + .../filter/TokenAuthenticationFilter.java | 104 + .../core/handler/AccessDeniedHandlerImpl.java | 43 + .../handler/AuthenticationEntryPointImpl.java | 35 + .../service/SecurityFrameworkService.java | 59 + .../service/SecurityFrameworkServiceImpl.java | 57 + .../core/util/SecurityFrameworkUtils.java | 108 + .../win/framework/security/package-info.java | 7 + ...ot.autoconfigure.AutoConfiguration.imports | 2 + .../win-spring-boot-starter-test/pom.xml | 60 + .../test/config/RedisTestConfiguration.java | 35 + .../SqlInitializationTestConfiguration.java | 52 + .../test/core/ut/BaseDbAndRedisUnitTest.java | 50 + .../test/core/ut/BaseDbUnitTest.java | 43 + .../test/core/ut/BaseMockitoUnitTest.java | 13 + .../test/core/ut/BaseRedisUnitTest.java | 32 + .../framework/test/core/ut/package-info.java | 4 + .../framework/test/core/util/AssertUtils.java | 101 + .../framework/test/core/util/RandomUtils.java | 140 + .../com/win/framework/test/package-info.java | 4 + .../win-spring-boot-starter-web/pom.xml | 66 + .../config/WinApiLogAutoConfiguration.java | 52 + .../core/filter/ApiAccessLogFilter.java | 109 + .../apilog/core/service/ApiAccessLog.java | 81 + .../service/ApiAccessLogFrameworkService.java | 17 + .../ApiAccessLogFrameworkServiceImpl.java | 28 + .../apilog/core/service/ApiErrorLog.java | 103 + .../service/ApiErrorLogFrameworkService.java | 17 + .../ApiErrorLogFrameworkServiceImpl.java | 28 + .../win/framework/apilog/package-info.java | 8 + .../config/WinJacksonAutoConfiguration.java | 42 + .../databind/LocalDateTimeDeserializer.java | 25 + .../databind/LocalDateTimeSerializer.java | 24 + .../core/databind/NumberSerializer.java | 37 + .../framework/jackson/core/package-info.java | 1 + .../swagger/config/SwaggerProperties.java | 60 + .../config/WinSwaggerAutoConfiguration.java | 155 + .../win/framework/swagger/package-info.java | 6 + .../framework/web/config/WebProperties.java | 67 + .../web/config/WinWebAutoConfiguration.java | 169 + .../win/framework/web/constant/Constant.java | 10 + .../web/core/filter/ApiRequestFilter.java | 26 + .../core/filter/CacheRequestBodyFilter.java | 31 + .../core/filter/CacheRequestBodyWrapper.java | 68 + .../framework/web/core/filter/DemoFilter.java | 35 + .../web/core/filter/MyI18nInterceptor.java | 44 + .../core/handler/GlobalExceptionHandler.java | 324 + .../handler/GlobalResponseBodyHandler.java | 45 + .../web/core/util/WebFrameworkUtils.java | 85 + .../com/win/framework/web/package-info.java | 4 + .../xss/config/WinXssAutoConfiguration.java | 61 + .../framework/xss/config/XssProperties.java | 29 + .../xss/core/clean/JsoupXssCleaner.java | 64 + .../framework/xss/core/clean/XssCleaner.java | 16 + .../framework/xss/core/filter/XssFilter.java | 52 + .../xss/core/filter/XssRequestWrapper.java | 92 + .../core/json/XssStringJsonDeserializer.java | 59 + .../com/win/framework/xss/package-info.java | 6 + ...ot.autoconfigure.AutoConfiguration.imports | 5 + .../win-spring-boot-starter-websocket/pom.xml | 37 + .../config/WebSocketHandlerConfig.java | 14 + .../websocket/config/WebSocketProperties.java | 29 + .../config/WinWebSocketAutoConfiguration.java | 34 + .../core/UserHandshakeInterceptor.java | 24 + .../websocket/core/WebSocketKeyDefine.java | 9 + .../websocket/core/WebSocketMessageDO.java | 24 + .../core/WebSocketSessionHandler.java | 36 + .../websocket/core/WebSocketUtils.java | 31 + .../core/WinWebSocketHandlerDecorator.java | 49 + .../win/framework/websocket/package-info.java | 1 + ...ot.autoconfigure.AutoConfiguration.imports | 1 + win-module-bpm/pom.xml | 27 + win-module-bpm/win-module-bpm-api/pom.xml | 33 + .../com/win/module/bpm/api/package-info.java | 4 + .../bpm/api/task/BpmProcessInstanceApi.java | 23 + .../dto/BpmProcessInstanceCreateReqDTO.java | 33 + .../module/bpm/enums/DictTypeConstants.java | 13 + .../module/bpm/enums/ErrorCodeConstants.java | 64 + .../definition/BpmModelFormTypeEnum.java | 21 + .../definition/BpmTaskAssignRuleTypeEnum.java | 33 + .../definition/BpmTaskRuleScriptEnum.java | 30 + .../bpm/enums/message/BpmMessageEnum.java | 26 + .../BpmProcessInstanceDeleteReasonEnum.java | 58 + .../task/BpmProcessInstanceResultEnum.java | 48 + .../task/BpmProcessInstanceStatusEnum.java | 27 + win-module-bpm/win-module-bpm-biz/pom.xml | 72 + .../com/win/module/bpm/api/package-info.java | 4 + .../api/task/BpmProcessInstanceApiImpl.java | 28 + .../definition/BpmFormController.java | 79 + .../definition/BpmModelController.java | 96 + .../BpmProcessDefinitionController.java | 59 + .../BpmTaskAssignRuleController.java | 58 + .../definition/BpmUserGroupController.java | 85 + .../definition/vo/form/BpmFormBaseVO.java | 24 + .../vo/form/BpmFormCreateReqVO.java | 22 + .../definition/vo/form/BpmFormPageReqVO.java | 18 + .../definition/vo/form/BpmFormRespVO.java | 31 + .../vo/form/BpmFormSimpleRespVO.java | 16 + .../vo/form/BpmFormUpdateReqVO.java | 25 + .../vo/group/BpmUserGroupBaseVO.java | 32 + .../vo/group/BpmUserGroupCreateReqVO.java | 11 + .../vo/group/BpmUserGroupPageReqVO.java | 29 + .../vo/group/BpmUserGroupRespVO.java | 20 + .../vo/group/BpmUserGroupSimpleRespVO.java | 20 + .../vo/group/BpmUserGroupUpdateReqVO.java | 17 + .../vo/model/BpmModeImportReqVO.java | 21 + .../definition/vo/model/BpmModelBaseVO.java | 40 + .../vo/model/BpmModelCreateReqVO.java | 25 + .../vo/model/BpmModelPageItemRespVO.java | 48 + .../vo/model/BpmModelPageReqVO.java | 25 + .../definition/vo/model/BpmModelRespVO.java | 25 + .../vo/model/BpmModelUpdateReqVO.java | 39 + .../vo/model/BpmModelUpdateStateReqVO.java | 20 + .../BpmProcessDefinitionListReqVO.java | 18 + .../BpmProcessDefinitionPageItemRespVO.java | 22 + .../BpmProcessDefinitionPageReqVO.java | 18 + .../process/BpmProcessDefinitionRespVO.java | 48 + .../vo/rule/BpmTaskAssignRuleBaseVO.java | 24 + .../vo/rule/BpmTaskAssignRuleCreateReqVO.java | 24 + .../vo/rule/BpmTaskAssignRuleRespVO.java | 28 + .../vo/rule/BpmTaskAssignRuleUpdateReqVO.java | 20 + .../controller/oa/BpmOALeaveController.http | 12 + .../controller/oa/BpmOALeaveController.java | 63 + .../bpm/controller/oa/package-info.java | 5 + .../controller/oa/vo/BpmOALeaveBaseVO.java | 33 + .../oa/vo/BpmOALeaveCreateReqVO.java | 20 + .../controller/oa/vo/BpmOALeavePageReqVO.java | 29 + .../controller/oa/vo/BpmOALeaveRespVO.java | 32 + .../task/BpmActivityController.java | 39 + .../task/BpmProcessInstanceController.java | 59 + .../controller/task/BpmTaskController.java | 77 + .../task/vo/activity/BpmActivityRespVO.java | 25 + .../BpmProcessInstanceCancelReqVO.java | 20 + .../BpmProcessInstanceCreateReqVO.java | 20 + .../BpmProcessInstanceMyPageReqVO.java | 39 + .../BpmProcessInstancePageItemRespVO.java | 54 + .../vo/instance/BpmProcessInstanceRespVO.java | 94 + .../task/vo/task/BpmTaskApproveReqVO.java | 20 + .../vo/task/BpmTaskDonePageItemRespVO.java | 26 + .../task/vo/task/BpmTaskDonePageReqVO.java | 31 + .../task/vo/task/BpmTaskRejectReqVO.java | 20 + .../task/vo/task/BpmTaskRespVO.java | 37 + .../vo/task/BpmTaskTodoPageItemRespVO.java | 53 + .../task/vo/task/BpmTaskTodoPageReqVO.java | 28 + .../vo/task/BpmTaskUpdateAssigneeReqVO.java | 21 + .../convert/definition/BpmFormConvert.java | 34 + .../convert/definition/BpmModelConvert.java | 141 + .../BpmProcessDefinitionConvert.java | 83 + .../definition/BpmTaskAssignRuleConvert.java | 40 + .../definition/BpmUserGroupConvert.java | 38 + .../convert/message/BpmMessageConvert.java | 21 + .../bpm/convert/oa/BpmOALeaveConvert.java | 30 + .../win/module/bpm/convert/package-info.java | 6 + .../bpm/convert/task/BpmActivityConvert.java | 30 + .../task/BpmProcessInstanceConvert.java | 115 + .../bpm/convert/task/BpmTaskConvert.java | 141 + .../module/bpm/convert/task/package-info.java | 1 + .../dal/dataobject/definition/BpmFormDO.java | 57 + .../definition/BpmProcessDefinitionExtDO.java | 90 + .../definition/BpmTaskAssignRuleDO.java | 83 + .../definition/BpmTaskMessageRuleDO.java | 5 + .../dataobject/definition/BpmUserGroupDO.java | 52 + .../bpm/dal/dataobject/oa/BpmOALeaveDO.java | 73 + .../task/BpmProcessInstanceExtDO.java | 90 + .../bpm/dal/dataobject/task/BpmTaskExtDO.java | 85 + .../dal/mysql/definition/BpmFormMapper.java | 25 + .../BpmProcessDefinitionExtMapper.java | 22 + .../definition/BpmTaskAssignRuleMapper.java | 37 + .../mysql/definition/BpmUserGroupMapper.java | 32 + .../bpm/dal/mysql/oa/BpmOALeaveMapper.java | 29 + .../task/BpmProcessInstanceExtMapper.java | 34 + .../bpm/dal/mysql/task/BpmTaskExtMapper.java | 26 + .../bpm/config/BpmCommonConfiguration.java | 19 + .../bpm/config/BpmSecurityConfiguration.java | 28 + .../event/BpmProcessInstanceResultEvent.java | 44 + ...BpmProcessInstanceResultEventListener.java | 34 + ...pmProcessInstanceResultEventPublisher.java | 24 + .../bpm/core/event/package-info.java | 6 + .../bpm/framework/bpm/core/package-info.java | 4 + .../bpm/framework/bpm/package-info.java | 6 + .../config/BpmFlowableConfiguration.java | 46 + .../behavior/BpmActivityBehaviorFactory.java | 44 + .../BpmParallelMultiInstanceBehavior.java | 58 + .../behavior/BpmUserTaskActivityBehavior.java | 66 + .../behavior/script/BpmTaskAssignScript.java | 34 + .../BpmTaskAssignLeaderAbstractScript.java | 70 + .../impl/BpmTaskAssignLeaderX1Script.java | 27 + .../impl/BpmTaskAssignLeaderX2Script.java | 27 + .../impl/BpmTaskAssignStartUserScript.java | 40 + .../BpmProcessInstanceEventListener.java | 53 + .../core/listener/BpmTaskEventListener.java | 82 + .../module/bpm/framework/package-info.java | 6 + .../web/config/BpmWebConfiguration.java | 24 + .../bpm/framework/web/package-info.java | 4 + .../java/com/win/module/bpm/package-info.java | 12 + .../service/definition/BpmFormService.java | 99 + .../definition/BpmFormServiceImpl.java | 132 + .../service/definition/BpmModelService.java | 77 + .../definition/BpmModelServiceImpl.java | 287 + .../BpmProcessDefinitionService.java | 159 + .../BpmProcessDefinitionServiceImpl.java | 286 + .../definition/BpmTaskAssignRuleService.java | 97 + .../BpmTaskAssignRuleServiceImpl.java | 344 + .../definition/BpmUserGroupService.java | 82 + .../definition/BpmUserGroupServiceImpl.java | 111 + .../definition/dto/BpmFormFieldRespDTO.java | 25 + .../dto/BpmModelMetaInfoRespDTO.java | 39 + .../dto/BpmProcessDefinitionCreateReqDTO.java | 104 + .../service/message/BpmMessageService.java | 39 + .../message/BpmMessageServiceImpl.java | 68 + ...eSendWhenProcessInstanceApproveReqDTO.java | 27 + ...geSendWhenProcessInstanceRejectReqDTO.java | 33 + .../BpmMessageSendWhenTaskCreatedReqDTO.java | 46 + .../bpm/service/oa/BpmOALeaveService.java | 53 + .../bpm/service/oa/BpmOALeaveServiceImpl.java | 88 + .../oa/listener/BpmOALeaveResultListener.java | 32 + .../bpm/service/task/BpmActivityService.java | 31 + .../service/task/BpmActivityServiceImpl.java | 40 + .../task/BpmProcessInstanceService.java | 147 + .../task/BpmProcessInstanceServiceImpl.java | 1 + .../bpm/service/task/BpmTaskService.java | 130 + .../bpm/service/task/BpmTaskServiceImpl.java | 318 + .../module/bpm/service/task/package-info.java | 1 + .../src/main/resources/i18n/bpm.properties | 1 + .../main/resources/i18n/bpm_en_US.properties | 0 .../main/resources/i18n/bpm_zh_CN.properties | 0 .../test/resources/application-unit-test.yaml | 44 + .../src/test/resources/logback.xml | 4 + .../src/test/resources/sql/clean.sql | 2 + .../src/test/resources/sql/create_tables.sql | 28 + win-module-infra/pom.xml | 25 + win-module-infra/win-module-infra-api/pom.xml | 33 + .../win/module/infra/api/file/FileApi.java | 47 + .../infra/api/logger/ApiAccessLogApi.java | 21 + .../infra/api/logger/ApiErrorLogApi.java | 21 + .../logger/dto/ApiAccessLogCreateReqDTO.java | 81 + .../logger/dto/ApiErrorLogCreateReqDTO.java | 103 + .../module/infra/api/trends/TrendsApi.java | 15 + .../api/trends/dto/TrendsCreateReqDTO.java | 24 + .../module/infra/enums/DictTypeConstants.java | 20 + .../infra/enums/ErrorCodeConstants.java | 57 + .../module/infra/enums/TrendsTypeEnum.java | 48 + win-module-infra/win-module-infra-biz/pom.xml | 121 + .../module/infra/api/file/FileApiImpl.java | 26 + .../infra/api/logger/ApiAccessLogApiImpl.java | 33 + .../infra/api/logger/ApiErrorLogApiImpl.java | 33 + .../infra/api/trends/TrendsApiImpl.java | 33 + .../controller/codegen/CodegenController.java | 141 + .../codegen/vo/CodegenCreateListReqVO.java | 21 + .../codegen/vo/CodegenDetailRespVO.java | 20 + .../codegen/vo/CodegenPreviewRespVO.java | 16 + .../codegen/vo/CodegenUpdateReqVO.java | 59 + .../vo/column/CodegenColumnBaseVO.java | 85 + .../vo/column/CodegenColumnRespVO.java | 22 + .../codegen/vo/table/CodegenTableBaseVO.java | 61 + .../vo/table/CodegenTablePageReqVO.java | 33 + .../codegen/vo/table/CodegenTableRespVO.java | 28 + .../codegen/vo/table/DatabaseTableRespVO.java | 16 + .../controller/config/ConfigController.java | 105 + .../controller/config/vo/ConfigBaseVO.java | 40 + .../config/vo/ConfigCreateReqVO.java | 20 + .../controller/config/vo/ConfigExcelVO.java | 46 + .../config/vo/ConfigExportReqVO.java | 28 + .../controller/config/vo/ConfigPageReqVO.java | 33 + .../controller/config/vo/ConfigRespVO.java | 30 + .../config/vo/ConfigUpdateReqVO.java | 20 + .../db/DataSourceConfigController.java | 73 + .../controller/db/DatabaseDocController.java | 154 + .../db/vo/DataSourceConfigBaseVO.java | 25 + .../db/vo/DataSourceConfigCreateReqVO.java | 17 + .../db/vo/DataSourceConfigRespVO.java | 20 + .../db/vo/DataSourceConfigUpdateReqVO.java | 21 + .../controller/file/FileConfigController.http | 45 + .../controller/file/FileConfigController.java | 89 + .../infra/controller/file/FileController.java | 115 + .../file/vo/config/FileConfigBaseVO.java | 22 + .../file/vo/config/FileConfigCreateReqVO.java | 25 + .../file/vo/config/FileConfigPageReqVO.java | 30 + .../file/vo/config/FileConfigRespVO.java | 35 + .../file/vo/config/FileConfigUpdateReqVO.java | 25 + .../file/vo/file/FileListReqVO.java | 18 + .../file/vo/file/FilePageReqVO.java | 36 + .../controller/file/vo/file/FileRespVO.java | 51 + .../file/vo/file/FileUploadReqVO.java | 28 + .../infra/controller/job/JobController.java | 145 + .../controller/job/JobLogController.java | 81 + .../controller/job/vo/job/JobBaseVO.java | 37 + .../controller/job/vo/job/JobCreateReqVO.java | 20 + .../controller/job/vo/job/JobExcelVO.java | 56 + .../controller/job/vo/job/JobExportReqVO.java | 19 + .../controller/job/vo/job/JobPageReqVO.java | 24 + .../controller/job/vo/job/JobRespVO.java | 30 + .../controller/job/vo/job/JobUpdateReqVO.java | 20 + .../controller/job/vo/log/JobLogBaseVO.java | 53 + .../controller/job/vo/log/JobLogExcelVO.java | 53 + .../job/vo/log/JobLogExportReqVO.java | 32 + .../job/vo/log/JobLogPageReqVO.java | 37 + .../controller/job/vo/log/JobLogRespVO.java | 22 + .../logger/ApiAccessLogController.java | 60 + .../logger/ApiErrorLogController.java | 74 + .../vo/apiaccesslog/ApiAccessLogBaseVO.java | 71 + .../vo/apiaccesslog/ApiAccessLogExcelVO.java | 58 + .../apiaccesslog/ApiAccessLogExportReqVO.java | 34 + .../apiaccesslog/ApiAccessLogPageReqVO.java | 39 + .../vo/apiaccesslog/ApiAccessLogRespVO.java | 22 + .../vo/apierrorlog/ApiErrorLogBaseVO.java | 91 + .../vo/apierrorlog/ApiErrorLogExcelVO.java | 86 + .../apierrorlog/ApiErrorLogExportReqVO.java | 31 + .../vo/apierrorlog/ApiErrorLogPageReqVO.java | 36 + .../vo/apierrorlog/ApiErrorLogRespVO.java | 28 + .../controller/redis/RedisController.http | 4 + .../controller/redis/RedisController.java | 86 + .../controller/redis/vo/RedisGetReqVo.java | 22 + .../redis/vo/RedisMonitorRespVO.java | 43 + .../controller/redis/vo/RedisUpdateReqVo.java | 26 + .../controller/remark/RemarkController.java | 69 + .../controller/remark/vo/RemarkBaseVO.java | 30 + .../remark/vo/RemarkCreateReqVO.java | 12 + .../controller/remark/vo/RemarkListReqVO.java | 27 + .../controller/remark/vo/RemarkRespVO.java | 25 + .../controller/test/TestDemoController.http | 19 + .../controller/test/TestDemoController.java | 97 + .../controller/test/vo/TestDemoBaseVO.java | 32 + .../test/vo/TestDemoCreateReqVO.java | 11 + .../controller/test/vo/TestDemoExcelVO.java | 38 + .../test/vo/TestDemoExportReqVO.java | 33 + .../controller/test/vo/TestDemoPageReqVO.java | 36 + .../controller/test/vo/TestDemoRespVO.java | 19 + .../test/vo/TestDemoUpdateReqVO.java | 16 + .../controller/trends/TrendsController.java | 92 + .../controller/trends/vo/TrendsBaseVO.java | 30 + .../trends/vo/TrendsCreateReqVO.java | 12 + .../controller/trends/vo/TrendsExcelVO.java | 31 + .../trends/vo/TrendsExportReqVO.java | 28 + .../controller/trends/vo/TrendsPageReqVO.java | 33 + .../controller/trends/vo/TrendsRespVO.java | 25 + .../trends/vo/TrendsUpdateReqVO.java | 18 + .../infra/convert/codegen/CodegenConvert.java | 93 + .../infra/convert/config/ConfigConvert.java | 33 + .../convert/db/DataSourceConfigConvert.java | 30 + .../infra/convert/file/FileConfigConvert.java | 36 + .../infra/convert/file/FileConvert.java | 22 + .../module/infra/convert/job/JobConvert.java | 36 + .../infra/convert/job/JobLogConvert.java | 30 + .../convert/logger/ApiAccessLogConvert.java | 38 + .../convert/logger/ApiErrorLogConvert.java | 36 + .../infra/convert/redis/RedisConvert.java | 29 + .../infra/convert/remark/RemarkConvert.java | 30 + .../infra/convert/test/TestDemoConvert.java | 36 + .../infra/convert/trends/TrendsConvert.java | 44 + .../dataobject/codegen/CodegenColumnDO.java | 142 + .../dataobject/codegen/CodegenTableDO.java | 119 + .../infra/dal/dataobject/config/ConfigDO.java | 64 + .../dal/dataobject/db/DataSourceConfigDO.java | 48 + .../dal/dataobject/file/FileConfigDO.java | 58 + .../dal/dataobject/file/FileContentDO.java | 47 + .../infra/dal/dataobject/file/FileDO.java | 62 + .../infra/dal/dataobject/job/JobDO.java | 74 + .../infra/dal/dataobject/job/JobLogDO.java | 82 + .../dal/dataobject/logger/ApiAccessLogDO.java | 102 + .../dal/dataobject/logger/ApiErrorLogDO.java | 149 + .../infra/dal/dataobject/remark/RemarkDO.java | 51 + .../infra/dal/dataobject/test/TestDemoDO.java | 50 + .../infra/dal/dataobject/trends/TrendsDO.java | 55 + .../mysql/codegen/CodegenColumnMapper.java | 24 + .../dal/mysql/codegen/CodegenTableMapper.java | 32 + .../infra/dal/mysql/config/ConfigMapper.java | 36 + .../dal/mysql/db/DataSourceConfigMapper.java | 14 + .../dal/mysql/file/FileConfigMapper.java | 25 + .../dal/mysql/file/FileContentDAOImpl.java | 46 + .../dal/mysql/file/FileContentMapper.java | 9 + .../infra/dal/mysql/file/FileMapper.java | 36 + .../infra/dal/mysql/job/JobLogMapper.java | 43 + .../module/infra/dal/mysql/job/JobMapper.java | 41 + .../dal/mysql/logger/ApiAccessLogMapper.java | 45 + .../dal/mysql/logger/ApiErrorLogMapper.java | 43 + .../infra/dal/mysql/remark/RemarkMapper.java | 27 + .../infra/dal/mysql/test/TestDemoMapper.java | 45 + .../infra/dal/mysql/trends/TrendsMapper.java | 39 + .../codegen/CodegenColumnHtmlTypeEnum.java | 29 + .../CodegenColumnListConditionEnum.java | 27 + .../enums/codegen/CodegenFrontTypeEnum.java | 26 + .../infra/enums/codegen/CodegenSceneEnum.java | 41 + .../codegen/CodegenTemplateTypeEnum.java | 24 + .../infra/enums/config/ConfigTypeEnum.java | 21 + .../infra/enums/job/JobLogStatusEnum.java | 24 + .../module/infra/enums/job/JobStatusEnum.java | 42 + .../logger/ApiErrorLogProcessStatusEnum.java | 28 + .../win/module/infra/enums/package-info.java | 4 + .../codegen/config/CodegenConfiguration.java | 9 + .../codegen/config/CodegenProperties.java | 37 + .../infra/framework/codegen/package-info.java | 4 + .../config/AdminServerConfiguration.java | 9 + .../infra/framework/monitor/package-info.java | 4 + .../module/infra/framework/package-info.java | 6 + .../config/SecurityConfiguration.java | 52 + .../framework/security/core/package-info.java | 4 + .../web/config/InfraWebConfiguration.java | 24 + .../infra/framework/web/package-info.java | 4 + .../consumer/logger/ApiAccessLogConsumer.java | 32 + .../consumer/logger/ApiErrorLogConsumer.java | 32 + .../mq/consumer/trends/TrendsConsumer.java | 32 + .../message/logger/ApiAccessLogMessage.java | 89 + .../mq/message/logger/ApiErrorLogMessage.java | 110 + .../mq/message/trends/TrendsMessage.java | 37 + .../producer/logger/ApiAccessLogProducer.java | 26 + .../producer/logger/ApiErrorLogProducer.java | 26 + .../mq/producer/trends/TrendsProducer.java | 26 + .../infra/service/codegen/CodegenService.java | 94 + .../service/codegen/CodegenServiceImpl.java | 253 + .../service/codegen/inner/CodegenBuilder.java | 213 + .../service/codegen/inner/CodegenEngine.java | 303 + .../infra/service/config/ConfigService.java | 75 + .../service/config/ConfigServiceImpl.java | 123 + .../service/db/DataSourceConfigService.java | 54 + .../db/DataSourceConfigServiceImpl.java | 107 + .../service/db/DatabaseTableService.java | 33 + .../service/db/DatabaseTableServiceImpl.java | 69 + .../infra/service/file/FileConfigService.java | 87 + .../service/file/FileConfigServiceImpl.java | 190 + .../infra/service/file/FileService.java | 59 + .../infra/service/file/FileServiceImpl.java | 126 + .../infra/service/job/JobLogService.java | 51 + .../infra/service/job/JobLogServiceImpl.java | 73 + .../module/infra/service/job/JobService.java | 91 + .../infra/service/job/JobServiceImpl.java | 173 + .../service/logger/ApiAccessLogService.java | 41 + .../logger/ApiAccessLogServiceImpl.java | 44 + .../service/logger/ApiErrorLogService.java | 50 + .../logger/ApiErrorLogServiceImpl.java | 65 + .../infra/service/remark/RemarkService.java | 41 + .../service/remark/RemarkServiceImpl.java | 57 + .../infra/service/test/TestDemoService.java | 75 + .../service/test/TestDemoServiceImpl.java | 91 + .../infra/service/trends/TrendsService.java | 59 + .../service/trends/TrendsServiceImpl.java | 55 + .../infra/websocket/SemaphoreUtils.java | 45 + .../infra/websocket/WebSocketConfig.java | 16 + .../infra/websocket/WebSocketServer.java | 86 + .../infra/websocket/WebSocketUsers.java | 178 + .../codegen/java/controller/controller.vm | 146 + .../codegen/java/controller/vo/_column.vm | 13 + .../codegen/java/controller/vo/baseVO.vm | 39 + .../codegen/java/controller/vo/createReqVO.vm | 30 + .../codegen/java/controller/vo/excelVO.vm | 45 + .../codegen/java/controller/vo/exportReqVO.vm | 39 + .../codegen/java/controller/vo/pageReqVO.vm | 41 + .../codegen/java/controller/vo/respVO.vm | 25 + .../codegen/java/controller/vo/updateReqVO.vm | 30 + .../resources/codegen/java/convert/convert.vm | 34 + .../src/main/resources/codegen/java/dal/do.vm | 46 + .../main/resources/codegen/java/dal/mapper.vm | 66 + .../resources/codegen/java/dal/mapper.xml.vm | 12 + .../resources/codegen/java/enums/errorcode.vm | 5 + .../resources/codegen/java/service/service.vm | 79 + .../codegen/java/service/serviceImpl.vm | 106 + .../codegen/java/test/serviceTest.vm | 165 + .../src/main/resources/codegen/sql/h2.vm | 35 + .../src/main/resources/codegen/sql/sql.vm | 28 + .../main/resources/codegen/vue/api/api.js.vm | 55 + .../resources/codegen/vue/views/index.vue.vm | 369 + .../main/resources/codegen/vue3/api/api.ts.vm | 57 + .../resources/codegen/vue3/views/data.ts.vm | 138 + .../resources/codegen/vue3/views/index.vue.vm | 231 + .../resources/codegen/vue3_back/api/api.ts.vm | 46 + .../codegen/vue3_back/views/form.vue.vm | 241 + .../codegen/vue3_back/views/index.vue.vm | 287 + .../codegen/vue3_schema/api/api.ts.vm | 46 + .../codegen/vue3_schema/views/data.ts.vm | 129 + .../codegen/vue3_schema/views/form.vue.vm | 65 + .../codegen/vue3_schema/views/index.vue.vm | 84 + .../resources/codegen/vue3_vben/api/api.ts.vm | 32 + .../codegen/vue3_vben/views/data.ts.vm | 226 + .../codegen/vue3_vben/views/form.vue.vm | 58 + .../codegen/vue3_vben/views/index.vue.vm | 92 + .../src/main/resources/file/erweima.jpg | Bin 0 -> 18385 bytes .../src/main/resources/i18n/infra.properties | 1 + .../resources/i18n/infra_en_US.properties | 0 .../resources/i18n/infra_zh_CN.properties | 0 .../test/resources/application-unit-test.yaml | 50 + .../src/test/resources/logback.xml | 4 + .../src/test/resources/sql/clean.sql | 10 + .../src/test/resources/sql/create_tables.sql | 172 + win-module-report/pom.xml | 23 + .../win-module-report-api/pom.xml | 26 + .../win/module/report/api/package-info.java | 4 + .../report/enums/ErrorCodeConstants.java | 15 + .../win-module-report-biz/pom.xml | 78 + .../controller/ajreport/package-info.java | 1 + .../goview/GoViewDataController.java | 66 + .../goview/GoViewProjectController.java | 76 + .../vo/data/GoViewDataGetBySqlReqVO.java | 16 + .../goview/vo/data/GoViewDataRespVO.java | 19 + .../vo/project/GoViewProjectCreateReqVO.java | 15 + .../vo/project/GoViewProjectRespVO.java | 36 + .../vo/project/GoViewProjectUpdateReqVO.java | 34 + .../report/convert/ajreport/package-info.java | 4 + .../convert/goview/GoViewProjectConvert.java | 24 + .../dal/dataobject/ajreport/package-info.java | 4 + .../dataobject/goview/GoViewProjectDO.java | 57 + .../dal/mysql/ajreport/package-info.java | 4 + .../dal/mysql/goview/GoViewProjectMapper.java | 19 + .../config/JmReportConfiguration.java | 26 + .../service/JmReportTokenServiceImpl.java | 130 + .../jmreport/core/web/package-info.java | 4 + .../module/report/framework/package-info.java | 6 + .../config/SecurityConfiguration.java | 28 + .../framework/security/core/package-info.java | 4 + .../framework/ureport/package-info.java | 7 + .../com/win/module/report/package-info.java | 9 + .../report/service/ajreport/package-info.java | 4 + .../service/goview/GoViewDataService.java | 20 + .../service/goview/GoViewDataServiceImpl.java | 55 + .../service/goview/GoViewProjectService.java | 57 + .../goview/GoViewProjectServiceImpl.java | 74 + .../src/main/resources/i18n/report.properties | 1 + .../resources/i18n/report_en_US.properties | 0 .../resources/i18n/report_zh_CN.properties | 0 .../test/resources/application-unit-test.yaml | 55 + .../src/test/resources/logback.xml | 4 + .../src/test/resources/sql/clean.sql | 1 + .../src/test/resources/sql/create_tables.sql | 14 + win-module-system/pom.xml | 24 + .../win-module-system-api/pom.xml | 34 + .../win/module/system/api/dept/DeptApi.java | 54 + .../win/module/system/api/dept/PostApi.java | 21 + .../system/api/dept/dto/DeptRespDTO.java | 37 + .../module/system/api/dict/DictDataApi.java | 59 + .../system/api/dict/dto/DictDataRespDTO.java | 33 + .../system/api/errorcode/ErrorCodeApi.java | 35 + .../dto/ErrorCodeAutoGenerateReqDTO.java | 34 + .../api/errorcode/dto/ErrorCodeRespDTO.java | 28 + .../module/system/api/logger/LoginLogApi.java | 21 + .../system/api/logger/OperateLogApi.java | 21 + .../api/logger/dto/LoginLogCreateReqDTO.java | 57 + .../logger/dto/OperateLogCreateReqDTO.java | 117 + .../module/system/api/mail/MailSendApi.java | 24 + .../mail/dto/MailSendSingleToUserReqDTO.java | 37 + .../api/notify/NotifyMessageSendApi.java | 30 + .../dto/NotifySendSingleToUserReqDTO.java | 33 + .../api/notify/dto/NotifyTemplateReqDTO.java | 34 + .../system/api/oauth2/OAuth2TokenApi.java | 49 + .../dto/OAuth2AccessTokenCheckRespDTO.java | 29 + .../dto/OAuth2AccessTokenCreateReqDTO.java | 32 + .../oauth2/dto/OAuth2AccessTokenRespDTO.java | 35 + .../system/api/permission/PermissionApi.java | 49 + .../module/system/api/permission/RoleApi.java | 21 + .../dto/DeptDataPermissionRespDTO.java | 35 + .../api/sensitiveword/SensitiveWordApi.java | 30 + .../api/serialnumber/SerialNumberApi.java | 13 + .../win/module/system/api/sms/SmsCodeApi.java | 40 + .../win/module/system/api/sms/SmsSendApi.java | 24 + .../api/sms/dto/code/SmsCodeSendReqDTO.java | 37 + .../api/sms/dto/code/SmsCodeUseReqDTO.java | 42 + .../sms/dto/code/SmsCodeValidateReqDTO.java | 37 + .../dto/send/SmsSendSingleToUserReqDTO.java | 36 + .../module/system/api/tenant/TenantApi.java | 26 + .../module/system/api/user/AdminUserApi.java | 69 + .../system/api/user/dto/AdminUserRespDTO.java | 47 + .../system/enums/DictTypeConstants.java | 29 + .../system/enums/ErrorCodeConstants.java | 168 + .../module/system/enums/common/SexEnum.java | 27 + .../module/system/enums/dept/DeptIdEnum.java | 20 + .../enums/errorcode/ErrorCodeTypeEnum.java | 39 + .../system/enums/logger/LoginLogTypeEnum.java | 27 + .../system/enums/logger/LoginResultEnum.java | 26 + .../system/enums/mail/MailSendStatusEnum.java | 24 + .../system/enums/notice/NoticeTypeEnum.java | 23 + .../enums/notify/NotifyTemplateTypeEnum.java | 26 + .../enums/oauth2/OAuth2ClientConstants.java | 12 + .../enums/oauth2/OAuth2GrantTypeEnum.java | 29 + .../enums/permission/DataScopeEnum.java | 30 + .../system/enums/permission/MenuTypeEnum.java | 25 + .../system/enums/permission/RoleCodeEnum.java | 31 + .../system/enums/permission/RoleTypeEnum.java | 21 + .../enums/serialNumber/RuleCodeEnum.java | 150 + .../enums/sms/SmsReceiveStatusEnum.java | 23 + .../module/system/enums/sms/SmsSceneEnum.java | 51 + .../system/enums/sms/SmsSendStatusEnum.java | 24 + .../system/enums/sms/SmsTemplateTypeEnum.java | 25 + .../win-module-system-biz/pom.xml | 116 + .../module/system/api/dept/DeptApiImpl.java | 41 + .../module/system/api/dept/PostApiImpl.java | 25 + .../system/api/dict/DictDataApiImpl.java | 58 + .../api/errorcode/ErrorCodeApiImpl.java | 33 + .../system/api/logger/LoginLogApiImpl.java | 27 + .../system/api/logger/OperateLogApiImpl.java | 27 + .../system/api/mail/MailSendApiImpl.java | 28 + .../api/notify/NotifyMessageSendApiImpl.java | 32 + .../system/api/oauth2/OAuth2TokenApiImpl.java | 47 + .../api/permission/PermissionApiImpl.java | 42 + .../system/api/permission/RoleApiImpl.java | 24 + .../sensitiveword/SensitiveWordApiImpl.java | 29 + .../api/serialnumber/SerialNumberApiImpl.java | 18 + .../module/system/api/sms/SmsCodeApiImpl.java | 39 + .../module/system/api/sms/SmsSendApiImpl.java | 28 + .../system/api/tenant/TenantApiImpl.java | 30 + .../system/api/user/AdminUserApiImpl.java | 53 + .../controller/auth/AuthController.http | 33 + .../controller/auth/AuthController.java | 113 + .../controller/auth/vo/AuthLoginReqVO.java | 46 + .../controller/auth/vo/AuthLoginRespVO.java | 30 + .../controller/auth/vo/AuthMenuRespVO.java | 53 + .../auth/vo/AuthPermissionInfoRespVO.java | 93 + .../controller/auth/vo/AuthSmsLoginReqVO.java | 28 + .../controller/auth/vo/AuthSmsSendReqVO.java | 32 + .../controller/captcha/CaptchaController.java | 87 + .../controller/dept/DeptController.java | 86 + .../controller/dept/PostController.java | 99 + .../controller/dept/vo/dept/DeptBaseVO.java | 47 + .../dept/vo/dept/DeptCreateReqVO.java | 12 + .../dept/vo/dept/DeptListReqVO.java | 16 + .../controller/dept/vo/dept/DeptRespVO.java | 23 + .../dept/vo/dept/DeptSimpleRespVO.java | 23 + .../dept/vo/dept/DeptUpdateReqVO.java | 18 + .../controller/dept/vo/post/PostBaseVO.java | 36 + .../dept/vo/post/PostCreateReqVO.java | 11 + .../controller/dept/vo/post/PostExcelVO.java | 31 + .../dept/vo/post/PostExportReqVO.java | 19 + .../dept/vo/post/PostListReqVO.java | 18 + .../dept/vo/post/PostPageReqVO.java | 22 + .../controller/dept/vo/post/PostRespVO.java | 20 + .../dept/vo/post/PostSimpleRespVO.java | 20 + .../dept/vo/post/PostUpdateReqVO.java | 18 + .../controller/dict/DictDataController.http | 4 + .../controller/dict/DictDataController.java | 95 + .../controller/dict/DictTypeController.java | 95 + .../dict/vo/data/DictDataBaseVO.java | 49 + .../dict/vo/data/DictDataCreateReqVO.java | 12 + .../dict/vo/data/DictDataExcelVO.java | 34 + .../dict/vo/data/DictDataExportReqVO.java | 23 + .../dict/vo/data/DictDataPageReqVO.java | 26 + .../dict/vo/data/DictDataRespVO.java | 24 + .../dict/vo/data/DictDataSimpleRespVO.java | 25 + .../dict/vo/data/DictDataUpdateReqVO.java | 18 + .../dict/vo/type/DictTypeBaseVO.java | 29 + .../dict/vo/type/DictTypeCreateReqVO.java | 20 + .../dict/vo/type/DictTypeExcelVO.java | 28 + .../dict/vo/type/DictTypeExportReqVO.java | 28 + .../dict/vo/type/DictTypePageReqVO.java | 33 + .../dict/vo/type/DictTypeRespVO.java | 27 + .../dict/vo/type/DictTypeSimpleRespVO.java | 23 + .../dict/vo/type/DictTypeUpdateReqVO.java | 18 + .../errorcode/ErrorCodeController.http | 13 + .../errorcode/ErrorCodeController.java | 89 + .../errorcode/vo/ErrorCodeBaseVO.java | 30 + .../errorcode/vo/ErrorCodeCreateReqVO.java | 14 + .../errorcode/vo/ErrorCodeExcelVO.java | 40 + .../errorcode/vo/ErrorCodeExportReqVO.java | 31 + .../errorcode/vo/ErrorCodePageReqVO.java | 36 + .../errorcode/vo/ErrorCodeRespVO.java | 25 + .../errorcode/vo/ErrorCodeUpdateReqVO.java | 20 + .../system/controller/ip/AreaController.http | 5 + .../system/controller/ip/AreaController.java | 72 + .../controller/ip/vo/AreaNodeRespVO.java | 23 + .../ip/vo/AreaNodeSimpleRespVO.java | 19 + .../controller/logger/LoginLogController.java | 59 + .../logger/OperateLogController.http | 4 + .../logger/OperateLogController.java | 85 + .../logger/vo/loginlog/LoginLogBaseVO.java | 42 + .../logger/vo/loginlog/LoginLogExcelVO.java | 40 + .../vo/loginlog/LoginLogExportReqVO.java | 28 + .../logger/vo/loginlog/LoginLogPageReqVO.java | 31 + .../logger/vo/loginlog/LoginLogRespVO.java | 25 + .../vo/operatelog/OperateLogBaseVO.java | 85 + .../vo/operatelog/OperateLogExcelVO.java | 42 + .../vo/operatelog/OperateLogExportReqVO.java | 31 + .../vo/operatelog/OperateLogPageReqVO.java | 32 + .../vo/operatelog/OperateLogRespVO.java | 20 + .../mail/MailAccountController.java | 78 + .../controller/mail/MailLogController.java | 49 + .../mail/MailTemplateController.http | 14 + .../mail/MailTemplateController.java | 89 + .../mail/vo/account/MailAccountBaseVO.java | 41 + .../vo/account/MailAccountCreateReqVO.java | 14 + .../mail/vo/account/MailAccountPageReqVO.java | 21 + .../mail/vo/account/MailAccountRespVO.java | 24 + .../vo/account/MailAccountSimpleRespVO.java | 16 + .../vo/account/MailAccountUpdateReqVO.java | 20 + .../controller/mail/vo/log/MailLogBaseVO.java | 72 + .../mail/vo/log/MailLogPageReqVO.java | 39 + .../controller/mail/vo/log/MailLogRespVO.java | 19 + .../mail/vo/template/MailTemplateBaseVO.java | 46 + .../vo/template/MailTemplateCreateReqVO.java | 14 + .../vo/template/MailTemplatePageReqVO.java | 36 + .../mail/vo/template/MailTemplateRespVO.java | 26 + .../vo/template/MailTemplateSendReqVO.java | 25 + .../vo/template/MailTemplateSimpleRespVO.java | 16 + .../vo/template/MailTemplateUpdateReqVO.java | 20 + .../controller/notice/NoticeController.java | 72 + .../controller/notice/vo/NoticeBaseVO.java | 32 + .../notice/vo/NoticeCreateReqVO.java | 11 + .../controller/notice/vo/NoticePageReqVO.java | 19 + .../controller/notice/vo/NoticeRespVO.java | 20 + .../notice/vo/NoticeUpdateReqVO.java | 18 + .../notify/NotifyMessageController.java | 94 + .../notify/NotifyTemplateController.java | 83 + .../vo/message/NotifyMessageBaseVO.java | 56 + .../vo/message/NotifyMessageMyPageReqVO.java | 27 + .../vo/message/NotifyMessagePageReqVO.java | 33 + .../vo/message/NotifyMessageRespVO.java | 22 + .../vo/template/NotifyTemplateBaseVO.java | 46 + .../template/NotifyTemplateCreateReqVO.java | 11 + .../vo/template/NotifyTemplatePageReqVO.java | 33 + .../vo/template/NotifyTemplateRespVO.java | 24 + .../vo/template/NotifyTemplateSendReqVO.java | 24 + .../template/NotifyTemplateUpdateReqVO.java | 17 + .../oauth2/OAuth2ClientController.http | 23 + .../oauth2/OAuth2ClientController.java | 74 + .../oauth2/OAuth2OpenController.http | 54 + .../oauth2/OAuth2OpenController.java | 296 + .../oauth2/OAuth2TokenController.java | 50 + .../oauth2/OAuth2UserController.http | 14 + .../oauth2/OAuth2UserController.java | 80 + .../oauth2/vo/client/OAuth2ClientBaseVO.java | 82 + .../vo/client/OAuth2ClientCreateReqVO.java | 12 + .../vo/client/OAuth2ClientPageReqVO.java | 19 + .../oauth2/vo/client/OAuth2ClientRespVO.java | 22 + .../vo/client/OAuth2ClientUpdateReqVO.java | 20 + .../vo/open/OAuth2OpenAccessTokenRespVO.java | 34 + .../open/OAuth2OpenAuthorizeInfoRespVO.java | 38 + .../vo/open/OAuth2OpenCheckTokenRespVO.java | 37 + .../vo/token/OAuth2AccessTokenPageReqVO.java | 19 + .../vo/token/OAuth2AccessTokenRespVO.java | 37 + .../oauth2/vo/user/OAuth2UserInfoRespVO.java | 70 + .../oauth2/vo/user/OAuth2UserUpdateReqVO.java | 34 + .../controller/permission/MenuController.http | 4 + .../controller/permission/MenuController.java | 87 + .../permission/PermissionController.java | 82 + .../controller/permission/RoleController.http | 42 + .../controller/permission/RoleController.java | 106 + .../permission/vo/menu/MenuBaseVO.java | 65 + .../permission/vo/menu/MenuCreateReqVO.java | 10 + .../permission/vo/menu/MenuListReqVO.java | 16 + .../permission/vo/menu/MenuRespVO.java | 27 + .../permission/vo/menu/MenuSimpleRespVO.java | 28 + .../permission/vo/menu/MenuUpdateReqVO.java | 17 + .../PermissionAssignRoleDataScopeReqVO.java | 26 + .../PermissionAssignRoleMenuReqVO.java | 21 + .../PermissionAssignUserRoleReqVO.java | 21 + .../permission/vo/role/RoleBaseVO.java | 34 + .../permission/vo/role/RoleCreateReqVO.java | 12 + .../permission/vo/role/RoleExcelVO.java | 34 + .../permission/vo/role/RoleExportReqVO.java | 28 + .../permission/vo/role/RolePageReqVO.java | 31 + .../permission/vo/role/RoleRespVO.java | 37 + .../permission/vo/role/RoleSimpleRespVO.java | 20 + .../permission/vo/role/RoleUpdateReqVO.java | 18 + .../vo/role/RoleUpdateStatusReqVO.java | 23 + .../SensitiveWordController.http | 4 + .../SensitiveWordController.java | 104 + .../sensitiveword/vo/SensitiveWordBaseVO.java | 31 + .../vo/SensitiveWordCreateReqVO.java | 14 + .../vo/SensitiveWordExcelVO.java | 40 + .../vo/SensitiveWordExportReqVO.java | 28 + .../vo/SensitiveWordPageReqVO.java | 33 + .../sensitiveword/vo/SensitiveWordRespVO.java | 22 + .../vo/SensitiveWordUpdateReqVO.java | 20 + .../serialnumber/SerialNumberController.java | 99 + .../serialnumber/vo/SerialNumberBaseVO.java | 44 + .../vo/SerialNumberCreateReqVO.java | 12 + .../serialnumber/vo/SerialNumberExcelVO.java | 43 + .../vo/SerialNumberExportReqVO.java | 18 + .../vo/SerialNumberPageReqVO.java | 20 + .../serialnumber/vo/SerialNumberRespVO.java | 15 + .../vo/SerialNumberUpdateReqVO.java | 18 + .../controller/sms/SmsCallbackController.java | 48 + .../controller/sms/SmsChannelController.java | 80 + .../controller/sms/SmsLogController.java | 60 + .../controller/sms/SmsTemplateController.http | 14 + .../controller/sms/SmsTemplateController.java | 98 + .../sms/vo/channel/SmsChannelBaseVO.java | 37 + .../sms/vo/channel/SmsChannelCreateReqVO.java | 20 + .../sms/vo/channel/SmsChannelPageReqVO.java | 30 + .../sms/vo/channel/SmsChannelRespVO.java | 25 + .../vo/channel/SmsChannelSimpleRespVO.java | 23 + .../sms/vo/channel/SmsChannelUpdateReqVO.java | 20 + .../controller/sms/vo/log/SmsLogExcelVO.java | 96 + .../sms/vo/log/SmsLogExportReqVO.java | 38 + .../sms/vo/log/SmsLogPageReqVO.java | 43 + .../controller/sms/vo/log/SmsLogRespVO.java | 85 + .../sms/vo/template/SmsTemplateBaseVO.java | 45 + .../vo/template/SmsTemplateCreateReqVO.java | 13 + .../sms/vo/template/SmsTemplateExcelVO.java | 55 + .../vo/template/SmsTemplateExportReqVO.java | 37 + .../sms/vo/template/SmsTemplatePageReqVO.java | 42 + .../sms/vo/template/SmsTemplateRespVO.java | 29 + .../sms/vo/template/SmsTemplateSendReqVO.java | 24 + .../vo/template/SmsTemplateUpdateReqVO.java | 20 + .../controller/tenant/TenantController.http | 21 + .../controller/tenant/TenantController.java | 98 + .../tenant/TenantPackageController.java | 81 + .../vo/packages/TenantPackageBaseVO.java | 31 + .../vo/packages/TenantPackageCreateReqVO.java | 14 + .../vo/packages/TenantPackagePageReqVO.java | 32 + .../vo/packages/TenantPackageRespVO.java | 22 + .../packages/TenantPackageSimpleRespVO.java | 20 + .../vo/packages/TenantPackageUpdateReqVO.java | 17 + .../tenant/vo/tenant/TenantBaseVO.java | 46 + .../tenant/vo/tenant/TenantCreateReqVO.java | 29 + .../tenant/vo/tenant/TenantExcelVO.java | 39 + .../tenant/vo/tenant/TenantExportReqVO.java | 31 + .../tenant/vo/tenant/TenantPageReqVO.java | 36 + .../tenant/vo/tenant/TenantRespVO.java | 20 + .../tenant/vo/tenant/TenantUpdateReqVO.java | 17 + .../controller/user/UserController.http | 4 + .../controller/user/UserController.java | 207 + .../user/UserProfileController.http | 4 + .../user/UserProfileController.java | 100 + .../user/vo/profile/UserProfileRespVO.java | 103 + .../UserProfileUpdatePasswordReqVO.java | 23 + .../vo/profile/UserProfileUpdateReqVO.java | 31 + .../controller/user/vo/user/UserBaseVO.java | 54 + .../user/vo/user/UserCreateReqVO.java | 20 + .../controller/user/vo/user/UserExcelVO.java | 53 + .../user/vo/user/UserExportReqVO.java | 35 + .../user/vo/user/UserImportExcelVO.java | 46 + .../user/vo/user/UserPageItemRespVO.java | 33 + .../user/vo/user/UserPageReqVO.java | 38 + .../controller/user/vo/user/UserRespVO.java | 31 + .../user/vo/user/UserSimpleRespVO.java | 20 + .../user/vo/user/UserUpdatePasswordReqVO.java | 23 + .../user/vo/user/UserUpdateReqVO.java | 18 + .../user/vo/user/UserUpdateStatusReqVO.java | 23 + .../system/convert/auth/AuthConvert.java | 75 + .../convert/auth/OAuth2ClientConvert.java | 33 + .../convert/auth/OAuth2TokenConvert.java | 22 + .../system/convert/dept/DeptConvert.java | 33 + .../system/convert/dept/PostConvert.java | 28 + .../system/convert/dict/DictDataConvert.java | 31 + .../system/convert/dict/DictTypeConvert.java | 28 + .../convert/errorcode/ErrorCodeConvert.java | 42 + .../module/system/convert/ip/AreaConvert.java | 30 + .../convert/logger/LoginLogConvert.java | 24 + .../convert/logger/OperateLogConvert.java | 41 + .../convert/mail/MailAccountConvert.java | 35 + .../system/convert/mail/MailLogConvert.java | 18 + .../convert/mail/MailTemplateConvert.java | 29 + .../system/convert/notice/NoticeConvert.java | 24 + .../convert/notify/NotifyMessageConvert.java | 27 + .../convert/notify/NotifyTemplateConvert.java | 35 + .../convert/oauth2/OAuth2OpenConvert.java | 55 + .../convert/oauth2/OAuth2UserConvert.java | 25 + .../module/system/convert/package-info.java | 6 + .../convert/permission/MenuConvert.java | 28 + .../convert/permission/RoleConvert.java | 28 + .../sensitiveword/SensitiveWordConvert.java | 36 + .../serialnumber/SerialNumberConvert.java | 37 + .../system/convert/sms/SmsChannelConvert.java | 39 + .../system/convert/sms/SmsLogConvert.java | 30 + .../convert/sms/SmsTemplateConvert.java | 31 + .../system/convert/tenant/TenantConvert.java | 45 + .../convert/tenant/TenantPackageConvert.java | 36 + .../system/convert/user/UserConvert.java | 52 + .../system/dal/dataobject/dept/DeptDO.java | 64 + .../system/dal/dataobject/dept/PostDO.java | 50 + .../dal/dataobject/dept/UserPostDO.java | 40 + .../dal/dataobject/dict/DictDataDO.java | 65 + .../dal/dataobject/dict/DictTypeDO.java | 57 + .../dal/dataobject/errorcode/ErrorCodeDO.java | 52 + .../dal/dataobject/logger/LoginLogDO.java | 65 + .../dal/dataobject/logger/OperateLogDO.java | 137 + .../dal/dataobject/mail/MailAccountDO.java | 53 + .../system/dal/dataobject/mail/MailLogDO.java | 114 + .../dal/dataobject/mail/MailTemplateDO.java | 71 + .../dal/dataobject/notice/NoticeDO.java | 47 + .../dataobject/notify/NotifyMessageDO.java | 92 + .../dataobject/notify/NotifyTemplateDO.java | 72 + .../oauth2/OAuth2AccessTokenDO.java | 62 + .../dataobject/oauth2/OAuth2ApproveDO.java | 56 + .../dal/dataobject/oauth2/OAuth2ClientDO.java | 107 + .../dal/dataobject/oauth2/OAuth2CodeDO.java | 61 + .../oauth2/OAuth2RefreshTokenDO.java | 56 + .../dal/dataobject/permission/MenuDO.java | 107 + .../dal/dataobject/permission/RoleDO.java | 78 + .../dal/dataobject/permission/RoleMenuDO.java | 35 + .../dal/dataobject/permission/UserRoleDO.java | 35 + .../sensitiveword/SensitiveWordDO.java | 58 + .../serialnumber/SerialNumberDO.java | 60 + .../dal/dataobject/sms/SmsChannelDO.java | 62 + .../system/dal/dataobject/sms/SmsCodeDO.java | 65 + .../system/dal/dataobject/sms/SmsLogDO.java | 168 + .../dal/dataobject/sms/SmsTemplateDO.java | 91 + .../dal/dataobject/tenant/TenantDO.java | 82 + .../dataobject/tenant/TenantPackageDO.java | 52 + .../dal/dataobject/user/AdminUserDO.java | 96 + .../system/dal/mysql/dept/DeptMapper.java | 33 + .../system/dal/mysql/dept/PostMapper.java | 46 + .../system/dal/mysql/dept/UserPostMapper.java | 32 + .../system/dal/mysql/dict/DictDataMapper.java | 51 + .../system/dal/mysql/dict/DictTypeMapper.java | 48 + .../dal/mysql/errorcode/ErrorCodeMapper.java | 51 + .../dal/mysql/logger/LoginLogMapper.java | 45 + .../dal/mysql/logger/OperateLogMapper.java | 48 + .../dal/mysql/mail/MailAccountMapper.java | 19 + .../system/dal/mysql/mail/MailLogMapper.java | 24 + .../dal/mysql/mail/MailTemplateMapper.java | 30 + .../system/dal/mysql/notice/NoticeMapper.java | 20 + .../dal/mysql/notify/NotifyMessageMapper.java | 64 + .../mysql/notify/NotifyTemplateMapper.java | 26 + .../mysql/oauth2/OAuth2AccessTokenMapper.java | 32 + .../dal/mysql/oauth2/OAuth2ApproveMapper.java | 26 + .../dal/mysql/oauth2/OAuth2ClientMapper.java | 30 + .../dal/mysql/oauth2/OAuth2CodeMapper.java | 14 + .../oauth2/OAuth2RefreshTokenMapper.java | 20 + .../module/system/dal/mysql/package-info.java | 9 + .../dal/mysql/permission/MenuMapper.java | 31 + .../dal/mysql/permission/RoleMapper.java | 48 + .../dal/mysql/permission/RoleMenuMapper.java | 40 + .../dal/mysql/permission/UserRoleMapper.java | 36 + .../sensitiveword/SensitiveWordMapper.java | 48 + .../serialnumber/SerialNumberMapper.java | 35 + .../dal/mysql/sms/SmsChannelMapper.java | 25 + .../system/dal/mysql/sms/SmsCodeMapper.java | 28 + .../system/dal/mysql/sms/SmsLogMapper.java | 40 + .../dal/mysql/sms/SmsTemplateMapper.java | 48 + .../system/dal/mysql/tenant/TenantMapper.java | 53 + .../dal/mysql/tenant/TenantPackageMapper.java | 32 + .../dal/mysql/user/AdminUserMapper.java | 60 + .../system/dal/redis/RedisKeyConstants.java | 101 + .../oauth2/OAuth2AccessTokenRedisDAO.java | 59 + .../config/DataPermissionConfiguration.java | 28 + .../datapermission/package-info.java | 4 + .../module/system/framework/package-info.java | 6 + .../framework/sms/SmsCodeConfiguration.java | 9 + .../framework/sms/SmsCodeProperties.java | 41 + .../web/config/SystemWebConfiguration.java | 24 + .../system/framework/web/package-info.java | 4 + .../com/win/module/system/job/DemoJob.java | 27 + .../win/module/system/job/package-info.java | 1 + .../mq/consumer/mail/MailSendConsumer.java | 30 + .../mq/consumer/sms/SmsSendConsumer.java | 29 + .../mq/message/mail/MailSendMessage.java | 55 + .../system/mq/message/sms/SmsSendMessage.java | 50 + .../system/mq/producer/mail/MailProducer.java | 41 + .../system/mq/producer/sms/SmsProducer.java | 41 + .../system/service/auth/AdminAuthService.java | 51 + .../service/auth/AdminAuthServiceImpl.java | 181 + .../system/service/dept/DeptService.java | 104 + .../system/service/dept/DeptServiceImpl.java | 205 + .../system/service/dept/PostService.java | 98 + .../system/service/dept/PostServiceImpl.java | 151 + .../system/service/dict/DictDataService.java | 110 + .../service/dict/DictDataServiceImpl.java | 209 + .../system/service/dict/DictTypeService.java | 80 + .../service/dict/DictTypeServiceImpl.java | 150 + .../service/errorcode/ErrorCodeService.java | 87 + .../errorcode/ErrorCodeServiceImpl.java | 174 + .../service/logger/LoginLogService.java | 40 + .../service/logger/LoginLogServiceImpl.java | 42 + .../service/logger/OperateLogService.java | 41 + .../service/logger/OperateLogServiceImpl.java | 75 + .../service/mail/MailAccountService.java | 73 + .../service/mail/MailAccountServiceImpl.java | 101 + .../system/service/mail/MailLogService.java | 60 + .../service/mail/MailLogServiceImpl.java | 78 + .../system/service/mail/MailSendService.java | 46 + .../service/mail/MailSendServiceImpl.java | 151 + .../service/mail/MailTemplateService.java | 91 + .../service/mail/MailTemplateServiceImpl.java | 139 + .../system/service/notice/NoticeService.java | 52 + .../service/notice/NoticeServiceImpl.java | 74 + .../service/notify/NotifyMessageService.java | 90 + .../notify/NotifyMessageServiceImpl.java | 74 + .../service/notify/NotifySendService.java | 52 + .../service/notify/NotifySendServiceImpl.java | 85 + .../service/notify/NotifyTemplateService.java | 74 + .../notify/NotifyTemplateServiceImpl.java | 138 + .../service/oauth2/OAuth2ApproveService.java | 49 + .../oauth2/OAuth2ApproveServiceImpl.java | 100 + .../service/oauth2/OAuth2ClientService.java | 91 + .../oauth2/OAuth2ClientServiceImpl.java | 154 + .../service/oauth2/OAuth2CodeService.java | 37 + .../service/oauth2/OAuth2CodeServiceImpl.java | 62 + .../service/oauth2/OAuth2GrantService.java | 108 + .../oauth2/OAuth2GrantServiceImpl.java | 98 + .../service/oauth2/OAuth2TokenService.java | 79 + .../oauth2/OAuth2TokenServiceImpl.java | 164 + .../service/permission/MenuService.java | 88 + .../service/permission/MenuServiceImpl.java | 209 + .../service/permission/PermissionService.java | 146 + .../permission/PermissionServiceImpl.java | 335 + .../service/permission/RoleService.java | 142 + .../service/permission/RoleServiceImpl.java | 257 + .../permission/bo/RoleCreateReqBO.java | 49 + .../sensitiveword/SensitiveWordService.java | 99 + .../SensitiveWordServiceImpl.java | 268 + .../serialnumber/SerialNumberService.java | 83 + .../serialnumber/SerialNumberServiceImpl.java | 141 + .../system/service/sms/SmsChannelService.java | 82 + .../service/sms/SmsChannelServiceImpl.java | 167 + .../system/service/sms/SmsCodeService.java | 40 + .../service/sms/SmsCodeServiceImpl.java | 110 + .../system/service/sms/SmsLogService.java | 75 + .../system/service/sms/SmsLogServiceImpl.java | 88 + .../system/service/sms/SmsSendService.java | 61 + .../service/sms/SmsSendServiceImpl.java | 168 + .../service/sms/SmsTemplateService.java | 94 + .../service/sms/SmsTemplateServiceImpl.java | 194 + .../service/tenant/TenantPackageService.java | 73 + .../tenant/TenantPackageServiceImpl.java | 115 + .../system/service/tenant/TenantService.java | 131 + .../service/tenant/TenantServiceImpl.java | 285 + .../tenant/handler/TenantInfoHandler.java | 21 + .../tenant/handler/TenantMenuHandler.java | 21 + .../system/service/user/AdminUserService.java | 213 + .../service/user/AdminUserServiceImpl.java | 452 + .../system/util/collection/SimpleTrie.java | 145 + .../system/util/oauth2/OAuth2Utils.java | 103 + .../win/module/system/util/package-info.java | 4 + .../src/main/resources/i18n/system.properties | 1 + .../resources/i18n/system_en_US.properties | 0 .../resources/i18n/system_zh_CN.properties | 0 .../test/resources/application-unit-test.yaml | 55 + .../src/test/resources/logback.xml | 4 + .../src/test/resources/sql/clean.sql | 34 + .../src/test/resources/sql/create_tables.sql | 630 + win-server/Dockerfile | 23 + win-server/pom.xml | 101 + .../com/win/server/WinServerApplication.java | 25 + .../server/controller/DefaultController.java | 30 + .../src/main/resources/application-dev.yaml | 198 + .../src/main/resources/application-druid.yml | 47 + .../src/main/resources/application-prod.yaml | 182 + .../src/main/resources/application-test.yaml | 181 + .../src/main/resources/application.yaml | 261 + .../src/main/resources/logback-spring.xml | 108 + .../src/main/resources/magic-editor-config.js | 22 + .../src/test/java/com/win/ProjectReactor.java | 146 + 1363 files changed, 112730 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 Docker-HOWTO.md create mode 100644 Jenkinsfile create mode 100644 LICENSE create mode 100644 README.md create mode 100644 docker-compose.yml create mode 100644 docker.env create mode 100644 http-client.env.json create mode 100644 lombok.config create mode 100644 pom.xml create mode 100644 sql/db2/README.md create mode 100644 sql/dm/README.md create mode 100644 sql/dm/ruoyi-vue-pro-dm8.sql create mode 100644 sql/mysql/brokerage.sql create mode 100644 sql/mysql/go-view.sql create mode 100644 sql/mysql/jimureport.mysql5.7.create.sql create mode 100644 sql/mysql/optional/mall_trade_log.sql create mode 100644 sql/mysql/pay_wallet.sql create mode 100644 sql/mysql/ruoyi-vue-pro.sql create mode 100644 sql/oracle/ruoyi-vue-pro.sql create mode 100644 sql/postgresql/ruoyi-vue-pro.sql create mode 100644 sql/sqlserver/ruoyi-vue-pro.sql create mode 100644 win-dependencies/pom.xml create mode 100644 win-framework/pom.xml create mode 100644 win-framework/win-common/pom.xml create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/core/IntArrayValuable.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/core/KeyValue.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/enums/CommonStatusEnum.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/enums/DocumentEnum.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/enums/WebFilterOrderEnum.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/exception/ErrorCode.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/exception/ServerException.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/exception/ServiceException.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/exception/enums/GlobalErrorCodeConstants.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/exception/enums/ServiceErrorCodeRange.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/exception/util/ServiceExceptionUtil.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/pojo/CommonResult.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/pojo/CustomConditions.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/pojo/PageParam.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/pojo/PageResult.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/util/cache/CacheUtils.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/util/collection/ArrayUtils.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/util/collection/CollectionUtils.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/util/collection/MapUtils.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/util/collection/SetUtils.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/util/date/DateUtils.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/util/date/LocalDateTimeUtils.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/util/http/HttpUtils.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/util/i18n/MessageUtil.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/util/io/FileUtils.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/util/io/IoUtils.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/util/json/JsonUtils.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/util/monitor/TracerUtils.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/util/number/MoneyUtils.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/util/number/NumberUtils.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/util/object/ObjectUtils.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/util/object/PageUtils.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/util/servlet/ServletUtils.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/util/spring/SpringAopUtils.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/util/spring/SpringExpressionUtils.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/util/string/StrUtils.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/util/validation/ValidationUtils.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/validation/InEnum.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/validation/InEnumCollectionValidator.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/validation/InEnumValidator.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/validation/Mobile.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/validation/MobileValidator.java create mode 100644 win-framework/win-common/src/main/java/com/win/framework/common/validation/package-info.java create mode 100644 win-framework/win-spring-boot-starter-banner/pom.xml create mode 100644 win-framework/win-spring-boot-starter-banner/src/main/java/com/win/framework/banner/config/WinBannerAutoConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-banner/src/main/java/com/win/framework/banner/core/BannerApplicationRunner.java create mode 100644 win-framework/win-spring-boot-starter-banner/src/main/java/com/win/framework/banner/package-info.java create mode 100644 win-framework/win-spring-boot-starter-banner/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 win-framework/win-spring-boot-starter-banner/src/main/resources/banner.txt create mode 100644 win-framework/win-spring-boot-starter-biz-data-permission/pom.xml create mode 100644 win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/config/WinDataPermissionAutoConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/config/WinDeptDataPermissionAutoConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/annotation/DataPermission.java create mode 100644 win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/aop/DataPermissionAnnotationAdvisor.java create mode 100644 win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/aop/DataPermissionAnnotationInterceptor.java create mode 100644 win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/aop/DataPermissionContextHolder.java create mode 100644 win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/db/DataPermissionDatabaseInterceptor.java create mode 100644 win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/rule/DataPermissionRule.java create mode 100644 win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/rule/DataPermissionRuleFactory.java create mode 100644 win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/rule/DataPermissionRuleFactoryImpl.java create mode 100644 win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/rule/dept/DeptDataPermissionRule.java create mode 100644 win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/rule/dept/DeptDataPermissionRuleCustomizer.java create mode 100644 win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/rule/dept/package-info.java create mode 100644 win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/core/util/DataPermissionUtils.java create mode 100644 win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/package-info.java create mode 100644 win-framework/win-spring-boot-starter-biz-data-permission/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 win-framework/win-spring-boot-starter-biz-dict/pom.xml create mode 100644 win-framework/win-spring-boot-starter-biz-dict/src/main/java/com/win/framework/dict/config/WinDictAutoConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-biz-dict/src/main/java/com/win/framework/dict/core/package-info.java create mode 100644 win-framework/win-spring-boot-starter-biz-dict/src/main/java/com/win/framework/dict/core/util/DictFrameworkUtils.java create mode 100644 win-framework/win-spring-boot-starter-biz-dict/src/main/java/com/win/framework/dict/package-info.java create mode 100644 win-framework/win-spring-boot-starter-biz-dict/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 win-framework/win-spring-boot-starter-biz-error-code/pom.xml create mode 100644 win-framework/win-spring-boot-starter-biz-error-code/src/main/java/com/win/framework/errorcode/config/ErrorCodeProperties.java create mode 100644 win-framework/win-spring-boot-starter-biz-error-code/src/main/java/com/win/framework/errorcode/config/WinErrorCodeConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-biz-error-code/src/main/java/com/win/framework/errorcode/core/generator/ErrorCodeAutoGenerator.java create mode 100644 win-framework/win-spring-boot-starter-biz-error-code/src/main/java/com/win/framework/errorcode/core/generator/ErrorCodeAutoGeneratorImpl.java create mode 100644 win-framework/win-spring-boot-starter-biz-error-code/src/main/java/com/win/framework/errorcode/core/loader/ErrorCodeLoader.java create mode 100644 win-framework/win-spring-boot-starter-biz-error-code/src/main/java/com/win/framework/errorcode/core/loader/ErrorCodeLoaderImpl.java create mode 100644 win-framework/win-spring-boot-starter-biz-error-code/src/main/java/com/win/framework/errorcode/package-info.java create mode 100644 win-framework/win-spring-boot-starter-biz-error-code/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 win-framework/win-spring-boot-starter-biz-ip/pom.xml create mode 100644 win-framework/win-spring-boot-starter-biz-ip/src/main/java/com/win/framework/ip/core/Area.java create mode 100644 win-framework/win-spring-boot-starter-biz-ip/src/main/java/com/win/framework/ip/core/enums/AreaTypeEnum.java create mode 100644 win-framework/win-spring-boot-starter-biz-ip/src/main/java/com/win/framework/ip/core/utils/AreaUtils.java create mode 100644 win-framework/win-spring-boot-starter-biz-ip/src/main/java/com/win/framework/ip/core/utils/IPUtils.java create mode 100644 win-framework/win-spring-boot-starter-biz-ip/src/main/java/com/win/framework/ip/package-info.java create mode 100644 win-framework/win-spring-boot-starter-biz-ip/src/main/resources/area.csv create mode 100644 win-framework/win-spring-boot-starter-biz-ip/src/main/resources/ip2region.xdb create mode 100644 win-framework/win-spring-boot-starter-biz-operatelog/pom.xml create mode 100644 win-framework/win-spring-boot-starter-biz-operatelog/src/main/java/com/win/framework/operatelog/config/WinOperateLogAutoConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-biz-operatelog/src/main/java/com/win/framework/operatelog/core/annotations/OperateLog.java create mode 100644 win-framework/win-spring-boot-starter-biz-operatelog/src/main/java/com/win/framework/operatelog/core/aop/OperateLogAspect.java create mode 100644 win-framework/win-spring-boot-starter-biz-operatelog/src/main/java/com/win/framework/operatelog/core/enums/OperateTypeEnum.java create mode 100644 win-framework/win-spring-boot-starter-biz-operatelog/src/main/java/com/win/framework/operatelog/core/package-info.java create mode 100644 win-framework/win-spring-boot-starter-biz-operatelog/src/main/java/com/win/framework/operatelog/core/service/OperateLog.java create mode 100644 win-framework/win-spring-boot-starter-biz-operatelog/src/main/java/com/win/framework/operatelog/core/service/OperateLogFrameworkService.java create mode 100644 win-framework/win-spring-boot-starter-biz-operatelog/src/main/java/com/win/framework/operatelog/core/service/OperateLogFrameworkServiceImpl.java create mode 100644 win-framework/win-spring-boot-starter-biz-operatelog/src/main/java/com/win/framework/operatelog/core/util/OperateLogUtils.java create mode 100644 win-framework/win-spring-boot-starter-biz-operatelog/src/main/java/com/win/framework/operatelog/package-info.java create mode 100644 win-framework/win-spring-boot-starter-biz-operatelog/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 win-framework/win-spring-boot-starter-biz-sms/pom.xml create mode 100644 win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/config/WinSmsAutoConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/SmsClient.java create mode 100644 win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/SmsClientFactory.java create mode 100644 win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/SmsCodeMapping.java create mode 100644 win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/SmsCommonResult.java create mode 100644 win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/dto/SmsReceiveRespDTO.java create mode 100644 win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/dto/SmsSendRespDTO.java create mode 100644 win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/dto/SmsTemplateRespDTO.java create mode 100644 win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/impl/AbstractSmsClient.java create mode 100644 win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/impl/SmsClientFactoryImpl.java create mode 100644 win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/impl/aliyun/AliyunSmsClient.java create mode 100644 win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/impl/aliyun/AliyunSmsCodeMapping.java create mode 100644 win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/impl/debug/DebugDingTalkCodeMapping.java create mode 100644 win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/impl/debug/DebugDingTalkSmsClient.java create mode 100644 win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/impl/tencent/TencentSmsChannelProperties.java create mode 100644 win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/impl/tencent/TencentSmsClient.java create mode 100644 win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/client/impl/tencent/TencentSmsCodeMapping.java create mode 100644 win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/enums/SmsChannelEnum.java create mode 100644 win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/enums/SmsFrameworkErrorCodeConstants.java create mode 100644 win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/enums/SmsTemplateAuditStatusEnum.java create mode 100644 win-framework/win-spring-boot-starter-biz-sms/src/main/java/com/win/framework/sms/core/property/SmsChannelProperties.java create mode 100644 win-framework/win-spring-boot-starter-biz-sms/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 win-framework/win-spring-boot-starter-biz-tenant/pom.xml create mode 100644 win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/config/TenantProperties.java create mode 100644 win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/config/WinTenantAutoConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/aop/TenantIgnore.java create mode 100644 win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/aop/TenantIgnoreAspect.java create mode 100644 win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/context/TenantContextHolder.java create mode 100644 win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/db/TenantBaseDO.java create mode 100644 win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/db/TenantDatabaseInterceptor.java create mode 100644 win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/job/TenantJob.java create mode 100644 win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/job/TenantJobAspect.java create mode 100644 win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/mq/TenantRedisMessageInterceptor.java create mode 100644 win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/redis/TenantRedisCacheManager.java create mode 100644 win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/security/TenantSecurityWebFilter.java create mode 100644 win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/service/TenantFrameworkService.java create mode 100644 win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/service/TenantFrameworkServiceImpl.java create mode 100644 win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/util/TenantUtils.java create mode 100644 win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/core/web/TenantContextWebFilter.java create mode 100644 win-framework/win-spring-boot-starter-biz-tenant/src/main/java/com/win/framework/tenant/package-info.java create mode 100644 win-framework/win-spring-boot-starter-biz-tenant/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 win-framework/win-spring-boot-starter-captcha/pom.xml create mode 100644 win-framework/win-spring-boot-starter-captcha/src/main/java/com/win/framework/captcha/config/CaptchaProperties.java create mode 100644 win-framework/win-spring-boot-starter-captcha/src/main/java/com/win/framework/captcha/config/KaptchaTextCreator.java create mode 100644 win-framework/win-spring-boot-starter-captcha/src/main/java/com/win/framework/captcha/config/WinCaptchaConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-captcha/src/main/java/com/win/framework/captcha/enums/CaptchaRedisKeyConstants.java create mode 100644 win-framework/win-spring-boot-starter-captcha/src/main/java/com/win/framework/captcha/package-info.java create mode 100644 win-framework/win-spring-boot-starter-captcha/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 win-framework/win-spring-boot-starter-desensitize/pom.xml create mode 100644 win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/base/annotation/DesensitizeBy.java create mode 100644 win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/base/handler/DesensitizationHandler.java create mode 100644 win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/base/serializer/StringDesensitizeSerializer.java create mode 100644 win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/package-info.java create mode 100644 win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/regex/annotation/EmailDesensitize.java create mode 100644 win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/regex/annotation/RegexDesensitize.java create mode 100644 win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/regex/handler/AbstractRegexDesensitizationHandler.java create mode 100644 win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/regex/handler/DefaultRegexDesensitizationHandler.java create mode 100644 win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/regex/handler/EmailDesensitizationHandler.java create mode 100644 win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/annotation/BankCardDesensitize.java create mode 100644 win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/annotation/CarLicenseDesensitize.java create mode 100644 win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/annotation/ChineseNameDesensitize.java create mode 100644 win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/annotation/FixedPhoneDesensitize.java create mode 100644 win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/annotation/IdCardDesensitize.java create mode 100644 win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/annotation/MobileDesensitize.java create mode 100644 win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/annotation/PasswordDesensitize.java create mode 100644 win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/annotation/SliderDesensitize.java create mode 100644 win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/handler/AbstractSliderDesensitizationHandler.java create mode 100644 win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/handler/BankCardDesensitization.java create mode 100644 win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/handler/CarLicenseDesensitization.java create mode 100644 win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/handler/ChineseNameDesensitization.java create mode 100644 win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/handler/DefaultDesensitizationHandler.java create mode 100644 win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/handler/FixedPhoneDesensitization.java create mode 100644 win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/handler/IdCardDesensitization.java create mode 100644 win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/handler/MobileDesensitization.java create mode 100644 win-framework/win-spring-boot-starter-desensitize/src/main/java/com/win/framework/desensitize/core/slider/handler/PasswordDesensitization.java create mode 100644 win-framework/win-spring-boot-starter-excel/pom.xml create mode 100644 win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/annotations/DictFormat.java create mode 100644 win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/annotations/OnlyOne.java create mode 100644 win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/annotations/SubObject.java create mode 100644 win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/convert/CommonStatusConverter.java create mode 100644 win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/convert/DictConvert.java create mode 100644 win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/convert/JsonConvert.java create mode 100644 win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/convert/MoneyConvert.java create mode 100644 win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/handler/CustomSheetWriteHandler.java create mode 100644 win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/util/ConvertUtil.java create mode 100644 win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/util/ExcelUtils.java create mode 100644 win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/package-info.java create mode 100644 win-framework/win-spring-boot-starter-file/pom.xml create mode 100644 win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/config/WinFileAutoConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/AbstractFileClient.java create mode 100644 win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/FileClient.java create mode 100644 win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/FileClientConfig.java create mode 100644 win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/FileClientFactory.java create mode 100644 win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/FileClientFactoryImpl.java create mode 100644 win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/db/DBFileClient.java create mode 100644 win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/db/DBFileClientConfig.java create mode 100644 win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/db/DBFileContentFrameworkDAO.java create mode 100644 win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/ftp/FtpFileClient.java create mode 100644 win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/ftp/FtpFileClientConfig.java create mode 100644 win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/local/LocalFileClient.java create mode 100644 win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/local/LocalFileClientConfig.java create mode 100644 win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/s3/S3FileClient.java create mode 100644 win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/s3/S3FileClientConfig.java create mode 100644 win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/sftp/SftpFileClient.java create mode 100644 win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/client/sftp/SftpFileClientConfig.java create mode 100644 win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/enums/FileStorageEnum.java create mode 100644 win-framework/win-spring-boot-starter-file/src/main/java/com/win/framework/file/core/utils/FileTypeUtils.java create mode 100644 win-framework/win-spring-boot-starter-file/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 win-framework/win-spring-boot-starter-file/src/test/resources/file/erweima.jpg create mode 100644 win-framework/win-spring-boot-starter-flowable/pom.xml create mode 100644 win-framework/win-spring-boot-starter-flowable/src/main/java/com/win/framework/flowable/config/WinFlowableConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-flowable/src/main/java/com/win/framework/flowable/core/package-info.java create mode 100644 win-framework/win-spring-boot-starter-flowable/src/main/java/com/win/framework/flowable/core/util/FlowableUtils.java create mode 100644 win-framework/win-spring-boot-starter-flowable/src/main/java/com/win/framework/flowable/core/web/FlowableWebFilter.java create mode 100644 win-framework/win-spring-boot-starter-flowable/src/main/java/com/win/framework/flowable/package-info.java create mode 100644 win-framework/win-spring-boot-starter-flowable/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 win-framework/win-spring-boot-starter-job/pom.xml create mode 100644 win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/config/WinAsyncAutoConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/config/WinQuartzAutoConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/core/enums/JobDataKeyEnum.java create mode 100644 win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/core/handler/JobHandler.java create mode 100644 win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/core/handler/JobHandlerInvoker.java create mode 100644 win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/core/scheduler/SchedulerManager.java create mode 100644 win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/core/service/JobLogFrameworkService.java create mode 100644 win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/core/util/CronUtils.java create mode 100644 win-framework/win-spring-boot-starter-job/src/main/java/com/win/framework/quartz/package-info.java create mode 100644 win-framework/win-spring-boot-starter-job/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 win-framework/win-spring-boot-starter-monitor/pom.xml create mode 100644 win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/config/TracerProperties.java create mode 100644 win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/config/WinMetricsAutoConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/config/WinTracerAutoConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/core/annotation/BizTrace.java create mode 100644 win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/core/aop/BizTraceAspect.java create mode 100644 win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/core/filter/TraceFilter.java create mode 100644 win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/core/util/TracerFrameworkUtils.java create mode 100644 win-framework/win-spring-boot-starter-monitor/src/main/java/com/win/framework/tracer/package-info.java create mode 100644 win-framework/win-spring-boot-starter-monitor/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 win-framework/win-spring-boot-starter-mq/pom.xml create mode 100644 win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/config/WinMQAutoConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/core/RedisMQTemplate.java create mode 100644 win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/core/interceptor/RedisMessageInterceptor.java create mode 100644 win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/core/message/AbstractRedisMessage.java create mode 100644 win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/core/pubsub/AbstractChannelMessage.java create mode 100644 win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/core/pubsub/AbstractChannelMessageListener.java create mode 100644 win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/core/stream/AbstractStreamMessage.java create mode 100644 win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/core/stream/AbstractStreamMessageListener.java create mode 100644 win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/job/RedisPendingMessageResendJob.java create mode 100644 win-framework/win-spring-boot-starter-mq/src/main/java/com/win/framework/mq/package-info.java create mode 100644 win-framework/win-spring-boot-starter-mq/src/main/java/org/springframework/data/redis/stream/DefaultStreamMessageListenerContainerX.java create mode 100644 win-framework/win-spring-boot-starter-mq/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 win-framework/win-spring-boot-starter-mybatis/pom.xml create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/config/WinDataSourceAutoConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/core/enums/DataSourceEnum.java create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/core/filter/DruidAdRemoveFilter.java create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/enums/ShardingTableCacheEnum.java create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/sharding/TimeShardingAlgorithm.java create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/utils/ShardingAlgorithmTool.java create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/utils/ShardingTablesLoadRunner.java create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/config/IdTypeEnvironmentPostProcessor.java create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/config/WinMybatisAutoConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/dataobject/BaseDO.java create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/enums/SqlConstants.java create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/handler/DefaultDBFieldHandler.java create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/mapper/BaseMapperX.java create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/query/LambdaQueryWrapperX.java create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/query/QueryWrapperX.java create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/type/EncryptTypeHandler.java create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/type/IntegerListTypeHandler.java create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/type/JsonLongSetTypeHandler.java create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/type/LongListTypeHandler.java create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/type/StringListTypeHandler.java create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/util/JdbcUtils.java create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/util/MyBatisUtils.java create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/util/QueryWrapperUtils.java create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/resources/META-INF/spring.factories create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 win-framework/win-spring-boot-starter-protection/pom.xml create mode 100644 win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/config/WinIdempotentConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/annotation/Idempotent.java create mode 100644 win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/aop/IdempotentAspect.java create mode 100644 win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/keyresolver/IdempotentKeyResolver.java create mode 100644 win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/keyresolver/impl/DefaultIdempotentKeyResolver.java create mode 100644 win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/keyresolver/impl/ExpressionIdempotentKeyResolver.java create mode 100644 win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/core/redis/IdempotentRedisDAO.java create mode 100644 win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/idempotent/package-info.java create mode 100644 win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/lock4j/config/WinLock4jConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/lock4j/core/DefaultLockFailureStrategy.java create mode 100644 win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/lock4j/core/Lock4jRedisKeyConstants.java create mode 100644 win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/lock4j/package-info.java create mode 100644 win-framework/win-spring-boot-starter-protection/src/main/java/com/win/framework/resilience4j/package-info.java create mode 100644 win-framework/win-spring-boot-starter-protection/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 win-framework/win-spring-boot-starter-redis/pom.xml create mode 100644 win-framework/win-spring-boot-starter-redis/src/main/java/com/win/framework/redis/config/WinCacheAutoConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-redis/src/main/java/com/win/framework/redis/config/WinCacheProperties.java create mode 100644 win-framework/win-spring-boot-starter-redis/src/main/java/com/win/framework/redis/config/WinRedisAutoConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-redis/src/main/java/com/win/framework/redis/core/TimeoutRedisCacheManager.java create mode 100644 win-framework/win-spring-boot-starter-redis/src/main/java/com/win/framework/redis/util/RedisCache.java create mode 100644 win-framework/win-spring-boot-starter-redis/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 win-framework/win-spring-boot-starter-security/pom.xml create mode 100644 win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/config/AuthorizeRequestsCustomizer.java create mode 100644 win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/config/SecurityProperties.java create mode 100644 win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/config/WinSecurityAutoConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/config/WinWebSecurityConfigurerAdapter.java create mode 100644 win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/LoginUser.java create mode 100644 win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/annotations/PreAuthenticated.java create mode 100644 win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/aop/PreAuthenticatedAspect.java create mode 100644 win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/context/TransmittableThreadLocalSecurityContextHolderStrategy.java create mode 100644 win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/filter/TokenAuthenticationFilter.java create mode 100644 win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/handler/AccessDeniedHandlerImpl.java create mode 100644 win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/handler/AuthenticationEntryPointImpl.java create mode 100644 win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/service/SecurityFrameworkService.java create mode 100644 win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/service/SecurityFrameworkServiceImpl.java create mode 100644 win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/core/util/SecurityFrameworkUtils.java create mode 100644 win-framework/win-spring-boot-starter-security/src/main/java/com/win/framework/security/package-info.java create mode 100644 win-framework/win-spring-boot-starter-security/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 win-framework/win-spring-boot-starter-test/pom.xml create mode 100644 win-framework/win-spring-boot-starter-test/src/main/java/com/win/framework/test/config/RedisTestConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-test/src/main/java/com/win/framework/test/config/SqlInitializationTestConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-test/src/main/java/com/win/framework/test/core/ut/BaseDbAndRedisUnitTest.java create mode 100644 win-framework/win-spring-boot-starter-test/src/main/java/com/win/framework/test/core/ut/BaseDbUnitTest.java create mode 100644 win-framework/win-spring-boot-starter-test/src/main/java/com/win/framework/test/core/ut/BaseMockitoUnitTest.java create mode 100644 win-framework/win-spring-boot-starter-test/src/main/java/com/win/framework/test/core/ut/BaseRedisUnitTest.java create mode 100644 win-framework/win-spring-boot-starter-test/src/main/java/com/win/framework/test/core/ut/package-info.java create mode 100644 win-framework/win-spring-boot-starter-test/src/main/java/com/win/framework/test/core/util/AssertUtils.java create mode 100644 win-framework/win-spring-boot-starter-test/src/main/java/com/win/framework/test/core/util/RandomUtils.java create mode 100644 win-framework/win-spring-boot-starter-test/src/main/java/com/win/framework/test/package-info.java create mode 100644 win-framework/win-spring-boot-starter-web/pom.xml create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/config/WinApiLogAutoConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/core/filter/ApiAccessLogFilter.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/core/service/ApiAccessLog.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/core/service/ApiAccessLogFrameworkService.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/core/service/ApiAccessLogFrameworkServiceImpl.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/core/service/ApiErrorLog.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/core/service/ApiErrorLogFrameworkService.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/core/service/ApiErrorLogFrameworkServiceImpl.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/apilog/package-info.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/jackson/config/WinJacksonAutoConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/jackson/core/databind/LocalDateTimeDeserializer.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/jackson/core/databind/LocalDateTimeSerializer.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/jackson/core/databind/NumberSerializer.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/jackson/core/package-info.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/swagger/config/SwaggerProperties.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/swagger/config/WinSwaggerAutoConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/swagger/package-info.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/config/WebProperties.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/config/WinWebAutoConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/constant/Constant.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/filter/ApiRequestFilter.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/filter/CacheRequestBodyFilter.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/filter/CacheRequestBodyWrapper.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/filter/DemoFilter.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/filter/MyI18nInterceptor.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/handler/GlobalExceptionHandler.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/handler/GlobalResponseBodyHandler.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/util/WebFrameworkUtils.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/package-info.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/config/WinXssAutoConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/config/XssProperties.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/core/clean/JsoupXssCleaner.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/core/clean/XssCleaner.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/core/filter/XssFilter.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/core/filter/XssRequestWrapper.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/core/json/XssStringJsonDeserializer.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/xss/package-info.java create mode 100644 win-framework/win-spring-boot-starter-web/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 win-framework/win-spring-boot-starter-websocket/pom.xml create mode 100644 win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/config/WebSocketHandlerConfig.java create mode 100644 win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/config/WebSocketProperties.java create mode 100644 win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/config/WinWebSocketAutoConfiguration.java create mode 100644 win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/UserHandshakeInterceptor.java create mode 100644 win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/WebSocketKeyDefine.java create mode 100644 win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/WebSocketMessageDO.java create mode 100644 win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/WebSocketSessionHandler.java create mode 100644 win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/WebSocketUtils.java create mode 100644 win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/core/WinWebSocketHandlerDecorator.java create mode 100644 win-framework/win-spring-boot-starter-websocket/src/main/java/com/win/framework/websocket/package-info.java create mode 100644 win-framework/win-spring-boot-starter-websocket/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 win-module-bpm/pom.xml create mode 100644 win-module-bpm/win-module-bpm-api/pom.xml create mode 100644 win-module-bpm/win-module-bpm-api/src/main/java/com/win/module/bpm/api/package-info.java create mode 100644 win-module-bpm/win-module-bpm-api/src/main/java/com/win/module/bpm/api/task/BpmProcessInstanceApi.java create mode 100644 win-module-bpm/win-module-bpm-api/src/main/java/com/win/module/bpm/api/task/dto/BpmProcessInstanceCreateReqDTO.java create mode 100644 win-module-bpm/win-module-bpm-api/src/main/java/com/win/module/bpm/enums/DictTypeConstants.java create mode 100644 win-module-bpm/win-module-bpm-api/src/main/java/com/win/module/bpm/enums/ErrorCodeConstants.java create mode 100644 win-module-bpm/win-module-bpm-api/src/main/java/com/win/module/bpm/enums/definition/BpmModelFormTypeEnum.java create mode 100644 win-module-bpm/win-module-bpm-api/src/main/java/com/win/module/bpm/enums/definition/BpmTaskAssignRuleTypeEnum.java create mode 100644 win-module-bpm/win-module-bpm-api/src/main/java/com/win/module/bpm/enums/definition/BpmTaskRuleScriptEnum.java create mode 100644 win-module-bpm/win-module-bpm-api/src/main/java/com/win/module/bpm/enums/message/BpmMessageEnum.java create mode 100644 win-module-bpm/win-module-bpm-api/src/main/java/com/win/module/bpm/enums/task/BpmProcessInstanceDeleteReasonEnum.java create mode 100644 win-module-bpm/win-module-bpm-api/src/main/java/com/win/module/bpm/enums/task/BpmProcessInstanceResultEnum.java create mode 100644 win-module-bpm/win-module-bpm-api/src/main/java/com/win/module/bpm/enums/task/BpmProcessInstanceStatusEnum.java create mode 100644 win-module-bpm/win-module-bpm-biz/pom.xml create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/api/package-info.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/api/task/BpmProcessInstanceApiImpl.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/BpmFormController.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/BpmModelController.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/BpmProcessDefinitionController.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/BpmTaskAssignRuleController.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/BpmUserGroupController.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/form/BpmFormBaseVO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/form/BpmFormCreateReqVO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/form/BpmFormPageReqVO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/form/BpmFormRespVO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/form/BpmFormSimpleRespVO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/form/BpmFormUpdateReqVO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/group/BpmUserGroupBaseVO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/group/BpmUserGroupCreateReqVO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/group/BpmUserGroupPageReqVO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/group/BpmUserGroupRespVO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/group/BpmUserGroupSimpleRespVO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/group/BpmUserGroupUpdateReqVO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/model/BpmModeImportReqVO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/model/BpmModelBaseVO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/model/BpmModelCreateReqVO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/model/BpmModelPageItemRespVO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/model/BpmModelPageReqVO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/model/BpmModelRespVO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/model/BpmModelUpdateReqVO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/model/BpmModelUpdateStateReqVO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/process/BpmProcessDefinitionListReqVO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/process/BpmProcessDefinitionPageItemRespVO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/process/BpmProcessDefinitionPageReqVO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/process/BpmProcessDefinitionRespVO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/rule/BpmTaskAssignRuleBaseVO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/rule/BpmTaskAssignRuleCreateReqVO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/rule/BpmTaskAssignRuleRespVO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/definition/vo/rule/BpmTaskAssignRuleUpdateReqVO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/oa/BpmOALeaveController.http create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/oa/BpmOALeaveController.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/oa/package-info.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/oa/vo/BpmOALeaveBaseVO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/oa/vo/BpmOALeaveCreateReqVO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/oa/vo/BpmOALeavePageReqVO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/oa/vo/BpmOALeaveRespVO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/BpmActivityController.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/BpmProcessInstanceController.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/BpmTaskController.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/activity/BpmActivityRespVO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/instance/BpmProcessInstanceCancelReqVO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/instance/BpmProcessInstanceCreateReqVO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/instance/BpmProcessInstanceMyPageReqVO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/instance/BpmProcessInstancePageItemRespVO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/instance/BpmProcessInstanceRespVO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/task/BpmTaskApproveReqVO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/task/BpmTaskDonePageItemRespVO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/task/BpmTaskDonePageReqVO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/task/BpmTaskRejectReqVO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/task/BpmTaskRespVO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/task/BpmTaskTodoPageItemRespVO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/task/BpmTaskTodoPageReqVO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/controller/task/vo/task/BpmTaskUpdateAssigneeReqVO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/convert/definition/BpmFormConvert.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/convert/definition/BpmModelConvert.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/convert/definition/BpmProcessDefinitionConvert.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/convert/definition/BpmTaskAssignRuleConvert.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/convert/definition/BpmUserGroupConvert.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/convert/message/BpmMessageConvert.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/convert/oa/BpmOALeaveConvert.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/convert/package-info.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/convert/task/BpmActivityConvert.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/convert/task/BpmProcessInstanceConvert.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/convert/task/BpmTaskConvert.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/convert/task/package-info.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/dataobject/definition/BpmFormDO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/dataobject/definition/BpmProcessDefinitionExtDO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/dataobject/definition/BpmTaskAssignRuleDO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/dataobject/definition/BpmTaskMessageRuleDO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/dataobject/definition/BpmUserGroupDO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/dataobject/oa/BpmOALeaveDO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/dataobject/task/BpmProcessInstanceExtDO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/dataobject/task/BpmTaskExtDO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/mysql/definition/BpmFormMapper.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/mysql/definition/BpmProcessDefinitionExtMapper.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/mysql/definition/BpmTaskAssignRuleMapper.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/mysql/definition/BpmUserGroupMapper.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/mysql/oa/BpmOALeaveMapper.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/mysql/task/BpmProcessInstanceExtMapper.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/dal/mysql/task/BpmTaskExtMapper.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/bpm/config/BpmCommonConfiguration.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/bpm/config/BpmSecurityConfiguration.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/bpm/core/event/BpmProcessInstanceResultEvent.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/bpm/core/event/BpmProcessInstanceResultEventListener.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/bpm/core/event/BpmProcessInstanceResultEventPublisher.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/bpm/core/event/package-info.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/bpm/core/package-info.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/bpm/package-info.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/flowable/config/BpmFlowableConfiguration.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/flowable/core/behavior/BpmActivityBehaviorFactory.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/flowable/core/behavior/BpmParallelMultiInstanceBehavior.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/flowable/core/behavior/BpmUserTaskActivityBehavior.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/flowable/core/behavior/script/BpmTaskAssignScript.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/flowable/core/behavior/script/impl/BpmTaskAssignLeaderAbstractScript.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/flowable/core/behavior/script/impl/BpmTaskAssignLeaderX1Script.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/flowable/core/behavior/script/impl/BpmTaskAssignLeaderX2Script.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/flowable/core/behavior/script/impl/BpmTaskAssignStartUserScript.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/flowable/core/listener/BpmProcessInstanceEventListener.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/flowable/core/listener/BpmTaskEventListener.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/package-info.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/web/config/BpmWebConfiguration.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/framework/web/package-info.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/package-info.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/BpmFormService.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/BpmFormServiceImpl.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/BpmModelService.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/BpmModelServiceImpl.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/BpmProcessDefinitionService.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/BpmProcessDefinitionServiceImpl.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/BpmTaskAssignRuleService.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/BpmTaskAssignRuleServiceImpl.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/BpmUserGroupService.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/BpmUserGroupServiceImpl.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/dto/BpmFormFieldRespDTO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/dto/BpmModelMetaInfoRespDTO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/definition/dto/BpmProcessDefinitionCreateReqDTO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/message/BpmMessageService.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/message/BpmMessageServiceImpl.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceApproveReqDTO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceRejectReqDTO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/message/dto/BpmMessageSendWhenTaskCreatedReqDTO.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/oa/BpmOALeaveService.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/oa/BpmOALeaveServiceImpl.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/oa/listener/BpmOALeaveResultListener.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/task/BpmActivityService.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/task/BpmActivityServiceImpl.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/task/BpmProcessInstanceService.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/task/BpmProcessInstanceServiceImpl.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/task/BpmTaskService.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/task/BpmTaskServiceImpl.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/java/com/win/module/bpm/service/task/package-info.java create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/resources/i18n/bpm.properties create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/resources/i18n/bpm_en_US.properties create mode 100644 win-module-bpm/win-module-bpm-biz/src/main/resources/i18n/bpm_zh_CN.properties create mode 100644 win-module-bpm/win-module-bpm-biz/src/test/resources/application-unit-test.yaml create mode 100644 win-module-bpm/win-module-bpm-biz/src/test/resources/logback.xml create mode 100644 win-module-bpm/win-module-bpm-biz/src/test/resources/sql/clean.sql create mode 100644 win-module-bpm/win-module-bpm-biz/src/test/resources/sql/create_tables.sql create mode 100644 win-module-infra/pom.xml create mode 100644 win-module-infra/win-module-infra-api/pom.xml create mode 100644 win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/file/FileApi.java create mode 100644 win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/logger/ApiAccessLogApi.java create mode 100644 win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/logger/ApiErrorLogApi.java create mode 100644 win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/logger/dto/ApiAccessLogCreateReqDTO.java create mode 100644 win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/logger/dto/ApiErrorLogCreateReqDTO.java create mode 100644 win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/trends/TrendsApi.java create mode 100644 win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/trends/dto/TrendsCreateReqDTO.java create mode 100644 win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/enums/DictTypeConstants.java create mode 100644 win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/enums/ErrorCodeConstants.java create mode 100644 win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/enums/TrendsTypeEnum.java create mode 100644 win-module-infra/win-module-infra-biz/pom.xml create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/api/file/FileApiImpl.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/api/logger/ApiAccessLogApiImpl.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/api/logger/ApiErrorLogApiImpl.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/api/trends/TrendsApiImpl.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/codegen/CodegenController.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/codegen/vo/CodegenCreateListReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/codegen/vo/CodegenDetailRespVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/codegen/vo/CodegenPreviewRespVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/codegen/vo/CodegenUpdateReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/codegen/vo/column/CodegenColumnBaseVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/codegen/vo/column/CodegenColumnRespVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/codegen/vo/table/CodegenTableBaseVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/codegen/vo/table/CodegenTablePageReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/codegen/vo/table/CodegenTableRespVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/codegen/vo/table/DatabaseTableRespVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/config/ConfigController.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/config/vo/ConfigBaseVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/config/vo/ConfigCreateReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/config/vo/ConfigExcelVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/config/vo/ConfigExportReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/config/vo/ConfigPageReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/config/vo/ConfigRespVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/config/vo/ConfigUpdateReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/db/DataSourceConfigController.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/db/DatabaseDocController.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/db/vo/DataSourceConfigBaseVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/db/vo/DataSourceConfigCreateReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/db/vo/DataSourceConfigRespVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/db/vo/DataSourceConfigUpdateReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/file/FileConfigController.http create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/file/FileConfigController.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/file/FileController.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/file/vo/config/FileConfigBaseVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/file/vo/config/FileConfigCreateReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/file/vo/config/FileConfigPageReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/file/vo/config/FileConfigRespVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/file/vo/config/FileConfigUpdateReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/file/vo/file/FileListReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/file/vo/file/FilePageReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/file/vo/file/FileRespVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/file/vo/file/FileUploadReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/JobController.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/JobLogController.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/vo/job/JobBaseVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/vo/job/JobCreateReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/vo/job/JobExcelVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/vo/job/JobExportReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/vo/job/JobPageReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/vo/job/JobRespVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/vo/job/JobUpdateReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/vo/log/JobLogBaseVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/vo/log/JobLogExcelVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/vo/log/JobLogExportReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/vo/log/JobLogPageReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/job/vo/log/JobLogRespVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/logger/ApiAccessLogController.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/logger/ApiErrorLogController.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/logger/vo/apiaccesslog/ApiAccessLogBaseVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/logger/vo/apiaccesslog/ApiAccessLogExcelVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/logger/vo/apiaccesslog/ApiAccessLogExportReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/logger/vo/apiaccesslog/ApiAccessLogPageReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/logger/vo/apiaccesslog/ApiAccessLogRespVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/logger/vo/apierrorlog/ApiErrorLogBaseVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/logger/vo/apierrorlog/ApiErrorLogExcelVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/logger/vo/apierrorlog/ApiErrorLogExportReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/logger/vo/apierrorlog/ApiErrorLogPageReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/logger/vo/apierrorlog/ApiErrorLogRespVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/redis/RedisController.http create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/redis/RedisController.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/redis/vo/RedisGetReqVo.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/redis/vo/RedisMonitorRespVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/redis/vo/RedisUpdateReqVo.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/remark/RemarkController.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/remark/vo/RemarkBaseVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/remark/vo/RemarkCreateReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/remark/vo/RemarkListReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/remark/vo/RemarkRespVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/test/TestDemoController.http create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/test/TestDemoController.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/test/vo/TestDemoBaseVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/test/vo/TestDemoCreateReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/test/vo/TestDemoExcelVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/test/vo/TestDemoExportReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/test/vo/TestDemoPageReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/test/vo/TestDemoRespVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/test/vo/TestDemoUpdateReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/trends/TrendsController.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/trends/vo/TrendsBaseVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/trends/vo/TrendsCreateReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/trends/vo/TrendsExcelVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/trends/vo/TrendsExportReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/trends/vo/TrendsPageReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/trends/vo/TrendsRespVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/trends/vo/TrendsUpdateReqVO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/codegen/CodegenConvert.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/config/ConfigConvert.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/db/DataSourceConfigConvert.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/file/FileConfigConvert.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/file/FileConvert.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/job/JobConvert.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/job/JobLogConvert.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/logger/ApiAccessLogConvert.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/logger/ApiErrorLogConvert.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/redis/RedisConvert.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/remark/RemarkConvert.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/test/TestDemoConvert.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/trends/TrendsConvert.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/codegen/CodegenColumnDO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/codegen/CodegenTableDO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/config/ConfigDO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/db/DataSourceConfigDO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/file/FileConfigDO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/file/FileContentDO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/file/FileDO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/job/JobDO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/job/JobLogDO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/logger/ApiAccessLogDO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/logger/ApiErrorLogDO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/remark/RemarkDO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/test/TestDemoDO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/dataobject/trends/TrendsDO.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/codegen/CodegenColumnMapper.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/codegen/CodegenTableMapper.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/config/ConfigMapper.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/db/DataSourceConfigMapper.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/file/FileConfigMapper.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/file/FileContentDAOImpl.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/file/FileContentMapper.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/file/FileMapper.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/job/JobLogMapper.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/job/JobMapper.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/logger/ApiAccessLogMapper.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/logger/ApiErrorLogMapper.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/remark/RemarkMapper.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/test/TestDemoMapper.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/dal/mysql/trends/TrendsMapper.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/codegen/CodegenColumnHtmlTypeEnum.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/codegen/CodegenColumnListConditionEnum.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/codegen/CodegenFrontTypeEnum.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/codegen/CodegenSceneEnum.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/codegen/CodegenTemplateTypeEnum.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/config/ConfigTypeEnum.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/job/JobLogStatusEnum.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/job/JobStatusEnum.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/logger/ApiErrorLogProcessStatusEnum.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/enums/package-info.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/codegen/config/CodegenConfiguration.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/codegen/config/CodegenProperties.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/codegen/package-info.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/monitor/config/AdminServerConfiguration.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/monitor/package-info.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/package-info.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/security/config/SecurityConfiguration.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/security/core/package-info.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/web/config/InfraWebConfiguration.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/framework/web/package-info.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/mq/consumer/logger/ApiAccessLogConsumer.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/mq/consumer/logger/ApiErrorLogConsumer.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/mq/consumer/trends/TrendsConsumer.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/mq/message/logger/ApiAccessLogMessage.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/mq/message/logger/ApiErrorLogMessage.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/mq/message/trends/TrendsMessage.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/mq/producer/logger/ApiAccessLogProducer.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/mq/producer/logger/ApiErrorLogProducer.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/mq/producer/trends/TrendsProducer.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/codegen/CodegenService.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/codegen/CodegenServiceImpl.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/codegen/inner/CodegenBuilder.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/codegen/inner/CodegenEngine.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/config/ConfigService.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/config/ConfigServiceImpl.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/db/DataSourceConfigService.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/db/DataSourceConfigServiceImpl.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/db/DatabaseTableService.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/db/DatabaseTableServiceImpl.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/file/FileConfigService.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/file/FileConfigServiceImpl.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/file/FileService.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/file/FileServiceImpl.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/job/JobLogService.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/job/JobLogServiceImpl.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/job/JobService.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/job/JobServiceImpl.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/logger/ApiAccessLogService.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/logger/ApiAccessLogServiceImpl.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/logger/ApiErrorLogService.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/logger/ApiErrorLogServiceImpl.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/remark/RemarkService.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/remark/RemarkServiceImpl.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/test/TestDemoService.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/test/TestDemoServiceImpl.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/trends/TrendsService.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/trends/TrendsServiceImpl.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/websocket/SemaphoreUtils.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/websocket/WebSocketConfig.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/websocket/WebSocketServer.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/websocket/WebSocketUsers.java create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/controller.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/vo/_column.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/vo/baseVO.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/vo/createReqVO.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/vo/excelVO.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/vo/exportReqVO.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/vo/pageReqVO.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/vo/respVO.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/vo/updateReqVO.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/convert/convert.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/dal/do.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/dal/mapper.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/dal/mapper.xml.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/enums/errorcode.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/service/service.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/service/serviceImpl.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/test/serviceTest.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/sql/h2.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/sql/sql.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue/api/api.js.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue/views/index.vue.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3/api/api.ts.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3/views/data.ts.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3/views/index.vue.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_back/api/api.ts.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_back/views/form.vue.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_back/views/index.vue.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_schema/api/api.ts.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_schema/views/data.ts.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_schema/views/form.vue.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_schema/views/index.vue.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_vben/api/api.ts.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_vben/views/data.ts.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_vben/views/form.vue.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3_vben/views/index.vue.vm create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/file/erweima.jpg create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/i18n/infra.properties create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/i18n/infra_en_US.properties create mode 100644 win-module-infra/win-module-infra-biz/src/main/resources/i18n/infra_zh_CN.properties create mode 100644 win-module-infra/win-module-infra-biz/src/test/resources/application-unit-test.yaml create mode 100644 win-module-infra/win-module-infra-biz/src/test/resources/logback.xml create mode 100644 win-module-infra/win-module-infra-biz/src/test/resources/sql/clean.sql create mode 100644 win-module-infra/win-module-infra-biz/src/test/resources/sql/create_tables.sql create mode 100644 win-module-report/pom.xml create mode 100644 win-module-report/win-module-report-api/pom.xml create mode 100644 win-module-report/win-module-report-api/src/main/java/com/win/module/report/api/package-info.java create mode 100644 win-module-report/win-module-report-api/src/main/java/com/win/module/report/enums/ErrorCodeConstants.java create mode 100644 win-module-report/win-module-report-biz/pom.xml create mode 100644 win-module-report/win-module-report-biz/src/main/java/com/win/module/report/controller/ajreport/package-info.java create mode 100644 win-module-report/win-module-report-biz/src/main/java/com/win/module/report/controller/goview/GoViewDataController.java create mode 100644 win-module-report/win-module-report-biz/src/main/java/com/win/module/report/controller/goview/GoViewProjectController.java create mode 100644 win-module-report/win-module-report-biz/src/main/java/com/win/module/report/controller/goview/vo/data/GoViewDataGetBySqlReqVO.java create mode 100644 win-module-report/win-module-report-biz/src/main/java/com/win/module/report/controller/goview/vo/data/GoViewDataRespVO.java create mode 100644 win-module-report/win-module-report-biz/src/main/java/com/win/module/report/controller/goview/vo/project/GoViewProjectCreateReqVO.java create mode 100644 win-module-report/win-module-report-biz/src/main/java/com/win/module/report/controller/goview/vo/project/GoViewProjectRespVO.java create mode 100644 win-module-report/win-module-report-biz/src/main/java/com/win/module/report/controller/goview/vo/project/GoViewProjectUpdateReqVO.java create mode 100644 win-module-report/win-module-report-biz/src/main/java/com/win/module/report/convert/ajreport/package-info.java create mode 100644 win-module-report/win-module-report-biz/src/main/java/com/win/module/report/convert/goview/GoViewProjectConvert.java create mode 100644 win-module-report/win-module-report-biz/src/main/java/com/win/module/report/dal/dataobject/ajreport/package-info.java create mode 100644 win-module-report/win-module-report-biz/src/main/java/com/win/module/report/dal/dataobject/goview/GoViewProjectDO.java create mode 100644 win-module-report/win-module-report-biz/src/main/java/com/win/module/report/dal/mysql/ajreport/package-info.java create mode 100644 win-module-report/win-module-report-biz/src/main/java/com/win/module/report/dal/mysql/goview/GoViewProjectMapper.java create mode 100644 win-module-report/win-module-report-biz/src/main/java/com/win/module/report/framework/jmreport/config/JmReportConfiguration.java create mode 100644 win-module-report/win-module-report-biz/src/main/java/com/win/module/report/framework/jmreport/core/service/JmReportTokenServiceImpl.java create mode 100644 win-module-report/win-module-report-biz/src/main/java/com/win/module/report/framework/jmreport/core/web/package-info.java create mode 100644 win-module-report/win-module-report-biz/src/main/java/com/win/module/report/framework/package-info.java create mode 100644 win-module-report/win-module-report-biz/src/main/java/com/win/module/report/framework/security/config/SecurityConfiguration.java create mode 100644 win-module-report/win-module-report-biz/src/main/java/com/win/module/report/framework/security/core/package-info.java create mode 100644 win-module-report/win-module-report-biz/src/main/java/com/win/module/report/framework/ureport/package-info.java create mode 100644 win-module-report/win-module-report-biz/src/main/java/com/win/module/report/package-info.java create mode 100644 win-module-report/win-module-report-biz/src/main/java/com/win/module/report/service/ajreport/package-info.java create mode 100644 win-module-report/win-module-report-biz/src/main/java/com/win/module/report/service/goview/GoViewDataService.java create mode 100644 win-module-report/win-module-report-biz/src/main/java/com/win/module/report/service/goview/GoViewDataServiceImpl.java create mode 100644 win-module-report/win-module-report-biz/src/main/java/com/win/module/report/service/goview/GoViewProjectService.java create mode 100644 win-module-report/win-module-report-biz/src/main/java/com/win/module/report/service/goview/GoViewProjectServiceImpl.java create mode 100644 win-module-report/win-module-report-biz/src/main/resources/i18n/report.properties create mode 100644 win-module-report/win-module-report-biz/src/main/resources/i18n/report_en_US.properties create mode 100644 win-module-report/win-module-report-biz/src/main/resources/i18n/report_zh_CN.properties create mode 100644 win-module-report/win-module-report-biz/src/test/resources/application-unit-test.yaml create mode 100644 win-module-report/win-module-report-biz/src/test/resources/logback.xml create mode 100644 win-module-report/win-module-report-biz/src/test/resources/sql/clean.sql create mode 100644 win-module-report/win-module-report-biz/src/test/resources/sql/create_tables.sql create mode 100644 win-module-system/pom.xml create mode 100644 win-module-system/win-module-system-api/pom.xml create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/dept/DeptApi.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/dept/PostApi.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/dept/dto/DeptRespDTO.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/dict/DictDataApi.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/dict/dto/DictDataRespDTO.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/errorcode/ErrorCodeApi.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/errorcode/dto/ErrorCodeAutoGenerateReqDTO.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/errorcode/dto/ErrorCodeRespDTO.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/logger/LoginLogApi.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/logger/OperateLogApi.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/logger/dto/LoginLogCreateReqDTO.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/logger/dto/OperateLogCreateReqDTO.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/mail/MailSendApi.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/mail/dto/MailSendSingleToUserReqDTO.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/notify/NotifyMessageSendApi.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/notify/dto/NotifySendSingleToUserReqDTO.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/notify/dto/NotifyTemplateReqDTO.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/oauth2/OAuth2TokenApi.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/oauth2/dto/OAuth2AccessTokenCheckRespDTO.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/oauth2/dto/OAuth2AccessTokenCreateReqDTO.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/oauth2/dto/OAuth2AccessTokenRespDTO.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/permission/PermissionApi.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/permission/RoleApi.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/permission/dto/DeptDataPermissionRespDTO.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sensitiveword/SensitiveWordApi.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/serialnumber/SerialNumberApi.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sms/SmsCodeApi.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sms/SmsSendApi.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sms/dto/code/SmsCodeSendReqDTO.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sms/dto/code/SmsCodeUseReqDTO.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sms/dto/code/SmsCodeValidateReqDTO.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/sms/dto/send/SmsSendSingleToUserReqDTO.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/tenant/TenantApi.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/user/AdminUserApi.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/user/dto/AdminUserRespDTO.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/DictTypeConstants.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/ErrorCodeConstants.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/common/SexEnum.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/dept/DeptIdEnum.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/errorcode/ErrorCodeTypeEnum.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/logger/LoginLogTypeEnum.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/logger/LoginResultEnum.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/mail/MailSendStatusEnum.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/notice/NoticeTypeEnum.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/notify/NotifyTemplateTypeEnum.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/oauth2/OAuth2ClientConstants.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/oauth2/OAuth2GrantTypeEnum.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/permission/DataScopeEnum.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/permission/MenuTypeEnum.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/permission/RoleCodeEnum.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/permission/RoleTypeEnum.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/serialNumber/RuleCodeEnum.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/sms/SmsReceiveStatusEnum.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/sms/SmsSceneEnum.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/sms/SmsSendStatusEnum.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/sms/SmsTemplateTypeEnum.java create mode 100644 win-module-system/win-module-system-biz/pom.xml create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/dept/DeptApiImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/dept/PostApiImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/dict/DictDataApiImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/errorcode/ErrorCodeApiImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/logger/LoginLogApiImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/logger/OperateLogApiImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/mail/MailSendApiImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/notify/NotifyMessageSendApiImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/oauth2/OAuth2TokenApiImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/permission/PermissionApiImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/permission/RoleApiImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/sensitiveword/SensitiveWordApiImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/serialnumber/SerialNumberApiImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/sms/SmsCodeApiImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/sms/SmsSendApiImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/tenant/TenantApiImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/user/AdminUserApiImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/auth/AuthController.http create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/auth/AuthController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/auth/vo/AuthLoginReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/auth/vo/AuthLoginRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/auth/vo/AuthMenuRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/auth/vo/AuthPermissionInfoRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/auth/vo/AuthSmsLoginReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/auth/vo/AuthSmsSendReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/captcha/CaptchaController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/DeptController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/PostController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/dept/DeptBaseVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/dept/DeptCreateReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/dept/DeptListReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/dept/DeptRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/dept/DeptSimpleRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/dept/DeptUpdateReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/post/PostBaseVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/post/PostCreateReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/post/PostExcelVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/post/PostExportReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/post/PostListReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/post/PostPageReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/post/PostRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/post/PostSimpleRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/post/PostUpdateReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/DictDataController.http create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/DictDataController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/DictTypeController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/data/DictDataBaseVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/data/DictDataCreateReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/data/DictDataExcelVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/data/DictDataExportReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/data/DictDataPageReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/data/DictDataRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/data/DictDataSimpleRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/data/DictDataUpdateReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/type/DictTypeBaseVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/type/DictTypeCreateReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/type/DictTypeExcelVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/type/DictTypeExportReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/type/DictTypePageReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/type/DictTypeRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/type/DictTypeSimpleRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/vo/type/DictTypeUpdateReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/errorcode/ErrorCodeController.http create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/errorcode/ErrorCodeController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/errorcode/vo/ErrorCodeBaseVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/errorcode/vo/ErrorCodeCreateReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/errorcode/vo/ErrorCodeExcelVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/errorcode/vo/ErrorCodeExportReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/errorcode/vo/ErrorCodePageReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/errorcode/vo/ErrorCodeRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/errorcode/vo/ErrorCodeUpdateReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/ip/AreaController.http create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/ip/AreaController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/ip/vo/AreaNodeRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/ip/vo/AreaNodeSimpleRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/LoginLogController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/OperateLogController.http create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/OperateLogController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/vo/loginlog/LoginLogBaseVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/vo/loginlog/LoginLogExcelVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/vo/loginlog/LoginLogExportReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/vo/loginlog/LoginLogPageReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/vo/loginlog/LoginLogRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/vo/operatelog/OperateLogBaseVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/vo/operatelog/OperateLogExcelVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/vo/operatelog/OperateLogExportReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/vo/operatelog/OperateLogPageReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/logger/vo/operatelog/OperateLogRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/MailAccountController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/MailLogController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/MailTemplateController.http create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/MailTemplateController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/account/MailAccountBaseVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/account/MailAccountCreateReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/account/MailAccountPageReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/account/MailAccountRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/account/MailAccountSimpleRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/account/MailAccountUpdateReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/log/MailLogBaseVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/log/MailLogPageReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/log/MailLogRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/template/MailTemplateBaseVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/template/MailTemplateCreateReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/template/MailTemplatePageReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/template/MailTemplateRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/template/MailTemplateSendReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/template/MailTemplateSimpleRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/mail/vo/template/MailTemplateUpdateReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notice/NoticeController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notice/vo/NoticeBaseVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notice/vo/NoticeCreateReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notice/vo/NoticePageReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notice/vo/NoticeRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notice/vo/NoticeUpdateReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notify/NotifyMessageController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notify/NotifyTemplateController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notify/vo/message/NotifyMessageBaseVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notify/vo/message/NotifyMessageMyPageReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notify/vo/message/NotifyMessagePageReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notify/vo/message/NotifyMessageRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notify/vo/template/NotifyTemplateBaseVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notify/vo/template/NotifyTemplateCreateReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notify/vo/template/NotifyTemplatePageReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notify/vo/template/NotifyTemplateRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notify/vo/template/NotifyTemplateSendReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/notify/vo/template/NotifyTemplateUpdateReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/OAuth2ClientController.http create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/OAuth2ClientController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/OAuth2OpenController.http create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/OAuth2OpenController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/OAuth2TokenController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/OAuth2UserController.http create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/OAuth2UserController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/vo/client/OAuth2ClientBaseVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/vo/client/OAuth2ClientCreateReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/vo/client/OAuth2ClientPageReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/vo/client/OAuth2ClientRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/vo/client/OAuth2ClientUpdateReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/vo/open/OAuth2OpenAccessTokenRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/vo/open/OAuth2OpenAuthorizeInfoRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/vo/open/OAuth2OpenCheckTokenRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/vo/token/OAuth2AccessTokenPageReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/vo/token/OAuth2AccessTokenRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/vo/user/OAuth2UserInfoRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/oauth2/vo/user/OAuth2UserUpdateReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/MenuController.http create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/MenuController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/PermissionController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/RoleController.http create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/RoleController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/menu/MenuBaseVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/menu/MenuCreateReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/menu/MenuListReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/menu/MenuRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/menu/MenuSimpleRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/menu/MenuUpdateReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/permission/PermissionAssignRoleDataScopeReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/permission/PermissionAssignRoleMenuReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/permission/PermissionAssignUserRoleReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/role/RoleBaseVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/role/RoleCreateReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/role/RoleExcelVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/role/RoleExportReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/role/RolePageReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/role/RoleRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/role/RoleSimpleRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/role/RoleUpdateReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/vo/role/RoleUpdateStatusReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sensitiveword/SensitiveWordController.http create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sensitiveword/SensitiveWordController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sensitiveword/vo/SensitiveWordBaseVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sensitiveword/vo/SensitiveWordCreateReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sensitiveword/vo/SensitiveWordExcelVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sensitiveword/vo/SensitiveWordExportReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sensitiveword/vo/SensitiveWordPageReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sensitiveword/vo/SensitiveWordRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sensitiveword/vo/SensitiveWordUpdateReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/serialnumber/SerialNumberController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/serialnumber/vo/SerialNumberBaseVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/serialnumber/vo/SerialNumberCreateReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/serialnumber/vo/SerialNumberExcelVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/serialnumber/vo/SerialNumberExportReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/serialnumber/vo/SerialNumberPageReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/serialnumber/vo/SerialNumberRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/serialnumber/vo/SerialNumberUpdateReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/SmsCallbackController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/SmsChannelController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/SmsLogController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/SmsTemplateController.http create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/SmsTemplateController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/channel/SmsChannelBaseVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/channel/SmsChannelCreateReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/channel/SmsChannelPageReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/channel/SmsChannelRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/channel/SmsChannelSimpleRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/channel/SmsChannelUpdateReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/log/SmsLogExcelVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/log/SmsLogExportReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/log/SmsLogPageReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/log/SmsLogRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/template/SmsTemplateBaseVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/template/SmsTemplateCreateReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/template/SmsTemplateExcelVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/template/SmsTemplateExportReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/template/SmsTemplatePageReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/template/SmsTemplateRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/template/SmsTemplateSendReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sms/vo/template/SmsTemplateUpdateReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/TenantController.http create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/TenantController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/TenantPackageController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/packages/TenantPackageBaseVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/packages/TenantPackageCreateReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/packages/TenantPackagePageReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/packages/TenantPackageRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/packages/TenantPackageSimpleRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/packages/TenantPackageUpdateReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/tenant/TenantBaseVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/tenant/TenantCreateReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/tenant/TenantExcelVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/tenant/TenantExportReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/tenant/TenantPageReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/tenant/TenantRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/tenant/vo/tenant/TenantUpdateReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/UserController.http create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/UserController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/UserProfileController.http create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/UserProfileController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/profile/UserProfileRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/profile/UserProfileUpdatePasswordReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/profile/UserProfileUpdateReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/user/UserBaseVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/user/UserCreateReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/user/UserExcelVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/user/UserExportReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/user/UserImportExcelVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/user/UserPageItemRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/user/UserPageReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/user/UserRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/user/UserSimpleRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/user/UserUpdatePasswordReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/user/UserUpdateReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/vo/user/UserUpdateStatusReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/auth/AuthConvert.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/auth/OAuth2ClientConvert.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/auth/OAuth2TokenConvert.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/dept/DeptConvert.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/dept/PostConvert.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/dict/DictDataConvert.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/dict/DictTypeConvert.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/errorcode/ErrorCodeConvert.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/ip/AreaConvert.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/logger/LoginLogConvert.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/logger/OperateLogConvert.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/mail/MailAccountConvert.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/mail/MailLogConvert.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/mail/MailTemplateConvert.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/notice/NoticeConvert.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/notify/NotifyMessageConvert.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/notify/NotifyTemplateConvert.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/oauth2/OAuth2OpenConvert.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/oauth2/OAuth2UserConvert.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/package-info.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/permission/MenuConvert.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/permission/RoleConvert.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/sensitiveword/SensitiveWordConvert.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/serialnumber/SerialNumberConvert.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/sms/SmsChannelConvert.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/sms/SmsLogConvert.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/sms/SmsTemplateConvert.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/tenant/TenantConvert.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/tenant/TenantPackageConvert.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/user/UserConvert.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/dept/DeptDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/dept/PostDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/dept/UserPostDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/dict/DictDataDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/dict/DictTypeDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/errorcode/ErrorCodeDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/logger/LoginLogDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/logger/OperateLogDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/mail/MailAccountDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/mail/MailLogDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/mail/MailTemplateDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/notice/NoticeDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/notify/NotifyMessageDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/notify/NotifyTemplateDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/oauth2/OAuth2AccessTokenDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/oauth2/OAuth2ApproveDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/oauth2/OAuth2ClientDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/oauth2/OAuth2CodeDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/oauth2/OAuth2RefreshTokenDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/permission/MenuDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/permission/RoleDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/permission/RoleMenuDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/permission/UserRoleDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/sensitiveword/SensitiveWordDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/serialnumber/SerialNumberDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/sms/SmsChannelDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/sms/SmsCodeDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/sms/SmsLogDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/sms/SmsTemplateDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/tenant/TenantDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/tenant/TenantPackageDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/user/AdminUserDO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/dept/DeptMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/dept/PostMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/dept/UserPostMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/dict/DictDataMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/dict/DictTypeMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/errorcode/ErrorCodeMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/logger/LoginLogMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/logger/OperateLogMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/mail/MailAccountMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/mail/MailLogMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/mail/MailTemplateMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/notice/NoticeMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/notify/NotifyMessageMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/notify/NotifyTemplateMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/oauth2/OAuth2AccessTokenMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/oauth2/OAuth2ApproveMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/oauth2/OAuth2ClientMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/oauth2/OAuth2CodeMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/oauth2/OAuth2RefreshTokenMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/package-info.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/permission/MenuMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/permission/RoleMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/permission/RoleMenuMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/permission/UserRoleMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/sensitiveword/SensitiveWordMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/serialnumber/SerialNumberMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/sms/SmsChannelMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/sms/SmsCodeMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/sms/SmsLogMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/sms/SmsTemplateMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/tenant/TenantMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/tenant/TenantPackageMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/user/AdminUserMapper.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/redis/RedisKeyConstants.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/redis/oauth2/OAuth2AccessTokenRedisDAO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/datapermission/config/DataPermissionConfiguration.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/datapermission/package-info.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/package-info.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/SmsCodeConfiguration.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/sms/SmsCodeProperties.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/web/config/SystemWebConfiguration.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/framework/web/package-info.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/job/DemoJob.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/job/package-info.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/mq/consumer/mail/MailSendConsumer.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/mq/consumer/sms/SmsSendConsumer.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/mq/message/mail/MailSendMessage.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/mq/message/sms/SmsSendMessage.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/mq/producer/mail/MailProducer.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/mq/producer/sms/SmsProducer.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/auth/AdminAuthService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/auth/AdminAuthServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dept/DeptService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dept/DeptServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dept/PostService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dept/PostServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dict/DictDataService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dict/DictDataServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dict/DictTypeService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dict/DictTypeServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/errorcode/ErrorCodeService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/errorcode/ErrorCodeServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/logger/LoginLogService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/logger/LoginLogServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/logger/OperateLogService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/logger/OperateLogServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailAccountService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailAccountServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailLogService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailLogServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailSendService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailSendServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailTemplateService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/mail/MailTemplateServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notice/NoticeService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notice/NoticeServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notify/NotifyMessageService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notify/NotifyMessageServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notify/NotifySendService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notify/NotifySendServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notify/NotifyTemplateService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/notify/NotifyTemplateServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2ApproveService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2ApproveServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2ClientService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2ClientServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2CodeService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2CodeServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2GrantService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2GrantServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2TokenService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/oauth2/OAuth2TokenServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/MenuService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/MenuServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/PermissionService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/PermissionServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/RoleService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/RoleServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/bo/RoleCreateReqBO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sensitiveword/SensitiveWordService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sensitiveword/SensitiveWordServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/serialnumber/SerialNumberService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/serialnumber/SerialNumberServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsChannelService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsChannelServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsCodeService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsCodeServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsLogService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsLogServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsSendService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsSendServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsTemplateService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sms/SmsTemplateServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/tenant/TenantPackageService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/tenant/TenantPackageServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/tenant/TenantService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/tenant/TenantServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/tenant/handler/TenantInfoHandler.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/tenant/handler/TenantMenuHandler.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/user/AdminUserService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/user/AdminUserServiceImpl.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/util/collection/SimpleTrie.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/util/oauth2/OAuth2Utils.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/util/package-info.java create mode 100644 win-module-system/win-module-system-biz/src/main/resources/i18n/system.properties create mode 100644 win-module-system/win-module-system-biz/src/main/resources/i18n/system_en_US.properties create mode 100644 win-module-system/win-module-system-biz/src/main/resources/i18n/system_zh_CN.properties create mode 100644 win-module-system/win-module-system-biz/src/test/resources/application-unit-test.yaml create mode 100644 win-module-system/win-module-system-biz/src/test/resources/logback.xml create mode 100644 win-module-system/win-module-system-biz/src/test/resources/sql/clean.sql create mode 100644 win-module-system/win-module-system-biz/src/test/resources/sql/create_tables.sql create mode 100644 win-server/Dockerfile create mode 100644 win-server/pom.xml create mode 100644 win-server/src/main/java/com/win/server/WinServerApplication.java create mode 100644 win-server/src/main/java/com/win/server/controller/DefaultController.java create mode 100644 win-server/src/main/resources/application-dev.yaml create mode 100644 win-server/src/main/resources/application-druid.yml create mode 100644 win-server/src/main/resources/application-prod.yaml create mode 100644 win-server/src/main/resources/application-test.yaml create mode 100644 win-server/src/main/resources/application.yaml create mode 100644 win-server/src/main/resources/logback-spring.xml create mode 100644 win-server/src/main/resources/magic-editor-config.js create mode 100644 win-server/src/test/java/com/win/ProjectReactor.java 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 0000000000000000000000000000000000000000..25522736d3f97c8b375be159b0690dbafbcd9bb8 GIT binary patch literal 6428681 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

!Q+^rEg29Zw~)D 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 z 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

Dc2j6^=a}EBx}~!XpKJ6^@kR9uJ}o_juCB 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

eqredQ<&<>7FQ2KV7_EqC9yR;fW)*U`iG~ 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

>^Tvkj0pC;Q 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%0A_ahXALW^U3!i5T&8zL! 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

`B`F70zyuC|5(c0fY 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 z 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 + + + 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 0000000000000000000000000000000000000000..1447283cdf1b49b51c1204a160e01cb789e957a8 GIT binary patch literal 18385 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 pEwzL`>i*8R__Kv1*C}gmHZq>QI%40h(qzO + + + 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 0000000000000000000000000000000000000000..1447283cdf1b49b51c1204a160e01cb789e957a8 GIT binary patch literal 18385 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 pEwzL`>i*8R__Kv1*C}gmHZq>QI%40h(qzO + + + 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) : ""; + } + +}

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